diff --git a/metadata/net.cozic.joplin.yml b/metadata/net.cozic.joplin.yml
index 6cc82e6356..ab0cb6849b 100644
--- a/metadata/net.cozic.joplin.yml
+++ b/metadata/net.cozic.joplin.yml
@@ -13,121 +13,36 @@ RepoType: git
Repo: https://github.com/laurent22/joplin.git
Builds:
- - versionName: 2.7.2
- versionCode: 2097667
- disable: com/google/android/gms/vision
- commit: android-v2.7.2
+ - versionName: 2.10.8
+ versionCode: 2097684
+ commit: 405c528ef00dee550dbf1586505c27bbff2d69e8
subdir: packages/app-mobile/android/app
sudo:
- sysctl fs.inotify.max_user_watches=524288
- apt-get update
- - apt-get install -y --no-install-recommends g++ build-essential libexpat1-dev
- gtk-doc-tools gobject-introspection libtiff5-dev libjpeg62-turbo-dev libpng-dev
- librsvg2-dev libexif-dev libgif-dev libpoppler-glib-dev liblcms2-dev libpango1.0-dev
- - curl -Lo node.tar.xz https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz
- - echo "0570b9354959f651b814e56a4ce98d4a067bf2385b9a0e6be075739bc65b0fae node.tar.xz"
+ - apt-get install -y automake build-essential gobject-introspection gtk-doc-tools
+ libexif-dev libexpat1-dev libgif-dev liblcms2-dev libpango1.0-dev libpng-dev
+ libpoppler-glib-dev librsvg2-dev libtiff5-dev libtool python-is-python3
+ - curl -Lo node.tar.gz https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.gz
+ - echo "2c69e7b040c208b61ebf9735c63d2e5bcabfed32ef05a9b8dd5823489ea50d6b node.tar.gz"
| sha256sum -c -
- - tar xJf node.tar.xz
- - cp -a node-v16.14.0-linux-x64/. /usr/local/
+ - tar xzf node.tar.gz --strip-components=1 -C /usr/local/
- corepack enable
- gradle:
- - yes
- srclibs:
- - react-native-sharp@v0.26.3
- - libvips@v8.10.0
- rm:
- - packages/tools/PortableAppsLauncher/
- - packages/app-cli
- - packages/plugin-repo-cli
- - packages/app-desktop
- - packages/app-clipper
- - packages/server
- prebuild:
- - sed -i -e '\!ACCESS_NETWORK_STATE!a' -e 's!xmlns:android!xmlns:tools="http://schemas.android.com/tools"
- xmlns:android!' src/main/AndroidManifest.xml
- - pushd ../../../..
- - find -name "package-lock.json" -delete
- - yarn install
- - sed -i -e '13,15d' packages/app-mobile/node_modules/react-native-rsa-native/android/build.gradle
- - sed -i -e '10,12d' packages/app-mobile/node_modules/react-native-rsa-native/android/bin/build.gradle
- - rm -rf packages/app-mobile/node_modules/sharp/vendor/lib/*
- - rm -rf packages/tools/node_modules/sharp/vendor/lib/*
- - rm packages/app-mobile/node_modules/sharp/build/Release/sharp.node
- - rm packages/app-mobile/node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node
- - rm packages/lib/node_modules/sharp/build/Release/sharp.node
- - rm packages/lib/node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node
- - rm packages/tools/node_modules/sharp/build/Release/sharp.node
- - rm packages/tools/node_modules/sqlite3/lib/binding/napi-v3-linux-x64/node_sqlite3.node
- scanignore:
- - packages/app-mobile/android/build.gradle
- - packages/app-mobile/node_modules/joplin-rn-alarm-notification/android/build.gradle
- - packages/app-mobile/node_modules/@react-native-community/netinfo/android/build.gradle
- - packages/app-mobile/node_modules/react-native-get-random-values/android/build.gradle
- - packages/app-mobile/node_modules/react-native-securerandom/android/build.gradle
- - packages/app-mobile/node_modules/react-native-vector-icons/android/build.gradle
- - packages/app-mobile/node_modules/react-native-image-picker/android/build.gradle
- - packages/app-mobile/node_modules/react-native-rsa-native/android/build.gradle
- - packages/app-mobile/node_modules/react-native-webview/android/build.gradle
- - packages/app-mobile/node_modules/react-native-camera/android/build.gradle
- - packages/app-mobile/node_modules/react-native-share/android/build.gradle
- - packages/app-mobile/node_modules/react-native/android
- - packages/app-mobile/node_modules/jsc-android
- - packages/app-mobile/node_modules/hermes-engine
- - packages/app-mobile/node_modules/react-native/ReactAndroid/build.gradle
- - packages/app-mobile/node_modules/react-native-rsa-native/android/bin/build.gradle
- scandelete:
- - packages/fork-htmlparser2/node_modules
- - packages/generator-joplin/node_modules
- - packages/app-mobile/node_modules
- - packages/renderer/node_modules
- - packages/tools/node_modules
- - packages/lib/node_modules
- - node_modules
- - .yarn/cache/
- - .yarn/install-state.gz
- build:
- - pushd $$libvips$$
- - mkdir build
- - ./autogen.sh --prefix=$$libvips$$/build/
- - make -j$(nproc)
- - make install
- - popd
- - pushd $$react-native-sharp$$
- - export PKG_CONFIG_PATH=$$libvips$$/build/lib/pkgconfig/
- - npm install --build-from-source
- - popd
-
- - versionName: 2.8.1
- versionCode: 2097668
- disable: com/google/android/gms/vision
- commit: 2af051a6ec26e197484d64b75b4609f1e8fb0146
- subdir: packages/app-mobile/android/app
- sudo:
- - sysctl fs.inotify.max_user_watches=524288
- - apt-get update
- - apt-get install -y --no-install-recommends g++ build-essential libexpat1-dev
- gtk-doc-tools gobject-introspection libtiff5-dev libjpeg62-turbo-dev libpng-dev
- librsvg2-dev libexif-dev libgif-dev libpoppler-glib-dev liblcms2-dev libpango1.0-dev
- - curl -Lo node.tar.xz https://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz
- - echo "0570b9354959f651b814e56a4ce98d4a067bf2385b9a0e6be075739bc65b0fae node.tar.xz"
- | sha256sum -c -
- - tar xJf node.tar.xz --strip-components=1 -C /usr/local/
- - corepack enable
- - pushd build/srclib/cpython
- - ./configure
- - make -j`nproc`
- - make altinstall
- - popd
init:
- pushd ../../../..
- - PYTHON=python3.9 YARN_ENABLE_IMMUTABLE_INSTALLS=false yarn install
+ - yarn --version
+ - YARN_ENABLE_IMMUTABLE_INSTALLS=false BUILD_SEQUENCIAL=1 yarn install
+ - yarn remove --all react-native-camera
+ - rm packages/app-mobile/components/CameraView.js
+ - rm packages/app-mobile/components/screens/Note.js
+ patch:
+ - remove-camera.patch
+ - 0001-android-remove-legacy-support.patch
gradle:
- yes
srclibs:
- react-native-sharp@v0.26.3
- libvips@v8.10.0
- - cpython@v3.9.6
rm:
- packages/tools/PortableAppsLauncher/
- packages/app-cli
@@ -135,36 +50,45 @@ Builds:
- packages/app-desktop
- packages/app-clipper
- packages/server
+ - packages/app-mobile/components/CameraView.tsx
prebuild:
+ - pushd ../../../..
+ - yarn --version
+ - YARN_ENABLE_IMMUTABLE_INSTALLS=false BUILD_SEQUENCIAL=1 yarn install
+ - sed -i '/android.permission.CAMERA/d' packages/app-mobile/android/app/src/main/AndroidManifest.xml
+ - popd
- sed -i -e '\!ACCESS_NETWORK_STATE!a' -e 's!xmlns:android!xmlns:tools="http://schemas.android.com/tools"
xmlns:android!' src/main/AndroidManifest.xml
- - cd ../../../../packages/app-mobile/node_modules/react-native-rsa-native/android
+ - sed -i '/:react-native-camera/{N;N;d}' build.gradle
+ - pushd ../../../../packages/app-mobile/node_modules/react-native-rsa-native/android
- sed -i -e 's|maven.fabric.io/public|jitpack.io|' build.gradle bin/build.gradle
+ - popd
scanignore:
- packages/app-mobile/android/build.gradle
- - packages/app-mobile/node_modules/joplin-rn-alarm-notification/android/build.gradle
- packages/app-mobile/node_modules/@react-native-community/netinfo/android/build.gradle
- packages/app-mobile/node_modules/react-native-get-random-values/android/build.gradle
- packages/app-mobile/node_modules/react-native-securerandom/android/build.gradle
- packages/app-mobile/node_modules/react-native-vector-icons/android/build.gradle
- - packages/app-mobile/node_modules/react-native-image-picker/android/build.gradle
- packages/app-mobile/node_modules/react-native-rsa-native/android/build.gradle
- packages/app-mobile/node_modules/react-native-webview/android/build.gradle
- - packages/app-mobile/node_modules/react-native-camera/android/build.gradle
- packages/app-mobile/node_modules/react-native-share/android/build.gradle
- packages/app-mobile/node_modules/react-native/android
+ - packages/app-mobile/node_modules/react-native/sdks/hermesc/linux64-bin/hermesc
- packages/app-mobile/node_modules/jsc-android
- - packages/app-mobile/node_modules/hermes-engine
- packages/app-mobile/node_modules/react-native/ReactAndroid/build.gradle
- packages/app-mobile/node_modules/react-native-rsa-native/android/bin/build.gradle
+ - packages/app-mobile/node_modules/react-native-document-picker/android/build.gradle
+ - packages/app-mobile/node_modules/react-native-safe-area-context/android/build.gradle
+ - packages/app-mobile/node_modules/@react-native-community/datetimepicker/android/build.gradle
+ - packages/react-native-alarm-notification/android/build.gradle
+ - packages/react-native-saf-x/android/build.gradle
scandelete:
- - packages/fork-htmlparser2/node_modules
- - packages/generator-joplin/node_modules
- packages/app-mobile/node_modules
- - packages/renderer/node_modules
- packages/tools/node_modules
- packages/lib/node_modules
+ - packages/react-native-alarm-notification/node_modules
+ - packages/react-native-saf-x/node_modules
- node_modules
- .yarn/cache/
- .yarn/install-state.gz
diff --git a/metadata/net.cozic.joplin/0001-android-remove-legacy-support.patch b/metadata/net.cozic.joplin/0001-android-remove-legacy-support.patch
new file mode 100644
index 0000000000..0251d14238
--- /dev/null
+++ b/metadata/net.cozic.joplin/0001-android-remove-legacy-support.patch
@@ -0,0 +1,188 @@
+From 3510f6846192014800e89a51fd64ecb68199a6ef Mon Sep 17 00:00:00 2001
+From: Tobias Mueller
+Date: Fri, 24 Feb 2023 12:55:01 +0100
+Subject: [PATCH] android: remove legacy support
+
+This depends on non-free software.
+That, in turn, prevents other software, which depends on r-n-f-s
+to become non-free.
+---
+ android/build.gradle | 6 -
+ .../ReactNativeFingerprintScannerModule.java | 109 ------------------
+ 2 files changed, 115 deletions(-)
+
+diff --git a/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/build.gradle b/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/build.gradle
+index eaf3829..d25f678 100644
+--- a/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/build.gradle
++++ b/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/build.gradle
+@@ -44,10 +44,4 @@ dependencies {
+ implementation 'com.facebook.react:react-native:+'
+ // androidx:biometric now supports fingerprint back to Android v23
+ implementation "androidx.biometric:biometric:1.0.1"
+-
+- // retain fingerprintScanner lib for compat with Android v16-23 device-specific drivers (Samsung & MeiZu)
+- // 1.2.3 is the minimum version compatible with androidx.
+- // See https://github.com/uccmawei/FingerprintIdentify/issues/74
+- // (translation https://translate.google.com/translate?sl=zh-CN&tl=en&u=https://github.com/uccmawei/FingerprintIdentify/issues/74)
+- implementation "com.wei.android.lib:fingerprintidentify:${safeExtGet("fingerprintidentify", "1.2.6")}"
+ }
+diff --git a/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/src/main/java/com/hieuvp/fingerprint/ReactNativeFingerprintScannerModule.java b/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/src/main/java/com/hieuvp/fingerprint/ReactNativeFingerprintScannerModule.java
+index fd3a6f6..81673e2 100644
+--- a/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/src/main/java/com/hieuvp/fingerprint/ReactNativeFingerprintScannerModule.java
++++ b/packages/app-mobile/node_modules/react-native-fingerprint-scanner/android/src/main/java/com/hieuvp/fingerprint/ReactNativeFingerprintScannerModule.java
+@@ -20,13 +20,6 @@ import com.facebook.react.bridge.ReactMethod;
+ import com.facebook.react.module.annotations.ReactModule;
+ import com.facebook.react.bridge.UiThreadUtil;
+
+-// for Samsung/MeiZu compat, Android v16-23
+-import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
+-import com.wei.android.lib.fingerprintidentify.FingerprintIdentify;
+-import com.wei.android.lib.fingerprintidentify.base.BaseFingerprint.ExceptionListener;
+-import com.wei.android.lib.fingerprintidentify.base.BaseFingerprint.IdentifyListener;
+-
+-
+ @ReactModule(name="ReactNativeFingerprintScanner")
+ public class ReactNativeFingerprintScannerModule
+ extends ReactContextBaseJavaModule
+@@ -39,9 +32,6 @@ public class ReactNativeFingerprintScannerModule
+ private final ReactApplicationContext mReactContext;
+ private BiometricPrompt biometricPrompt;
+
+- // for Samsung/MeiZu compat, Android v16-23
+- private FingerprintIdentify mFingerprintIdentify;
+-
+ public ReactNativeFingerprintScannerModule(ReactApplicationContext reactContext) {
+ super(reactContext);
+ mReactContext = reactContext;
+@@ -194,10 +184,6 @@ public class ReactNativeFingerprintScannerModule
+
+ @ReactMethod
+ public void authenticate(String title, String subtitle, String description, String cancelButton, final Promise promise) {
+- if (requiresLegacyAuthentication()) {
+- legacyAuthenticate(promise);
+- }
+- else {
+ final String errorName = getSensorError();
+ if (errorName != null) {
+ promise.reject(errorName, TYPE_BIOMETRICS);
+@@ -206,16 +192,10 @@ public class ReactNativeFingerprintScannerModule
+ }
+
+ biometricAuthenticate(title, subtitle, description, cancelButton, promise);
+- }
+ }
+
+ @ReactMethod
+ public void release() {
+- if (requiresLegacyAuthentication()) {
+- getFingerprintIdentify().cancelIdentify();
+- mFingerprintIdentify = null;
+- }
+-
+ // consistent across legacy and current API
+ if (biometricPrompt != null) {
+ biometricPrompt.cancelAuthentication(); // if release called from eg React
+@@ -226,16 +206,6 @@ public class ReactNativeFingerprintScannerModule
+
+ @ReactMethod
+ public void isSensorAvailable(final Promise promise) {
+- if (requiresLegacyAuthentication()) {
+- String errorMessage = legacyGetErrorMessage();
+- if (errorMessage != null) {
+- promise.reject(errorMessage, TYPE_FINGERPRINT_LEGACY);
+- } else {
+- promise.resolve(TYPE_FINGERPRINT_LEGACY);
+- }
+- return;
+- }
+-
+ // current API
+ String errorName = getSensorError();
+ if (errorName != null) {
+@@ -244,83 +214,4 @@ public class ReactNativeFingerprintScannerModule
+ promise.resolve(TYPE_BIOMETRICS);
+ }
+ }
+-
+-
+- // for Samsung/MeiZu compat, Android v16-23
+- private FingerprintIdentify getFingerprintIdentify() {
+- if (mFingerprintIdentify != null) {
+- return mFingerprintIdentify;
+- }
+- mReactContext.addLifecycleEventListener(this);
+- mFingerprintIdentify = new FingerprintIdentify(mReactContext);
+- mFingerprintIdentify.setSupportAndroidL(true);
+- mFingerprintIdentify.setExceptionListener(
+- new ExceptionListener() {
+- @Override
+- public void onCatchException(Throwable exception) {
+- mReactContext.removeLifecycleEventListener(ReactNativeFingerprintScannerModule.this);
+- }
+- }
+- );
+- mFingerprintIdentify.init();
+- return mFingerprintIdentify;
+- }
+-
+- private String legacyGetErrorMessage() {
+- if (!getFingerprintIdentify().isHardwareEnable()) {
+- return "FingerprintScannerNotSupported";
+- } else if (!getFingerprintIdentify().isRegisteredFingerprint()) {
+- return "FingerprintScannerNotEnrolled";
+- } else if (!getFingerprintIdentify().isFingerprintEnable()) {
+- return "FingerprintScannerNotAvailable";
+- }
+-
+- return null;
+- }
+-
+-
+- private void legacyAuthenticate(final Promise promise) {
+- final String errorMessage = legacyGetErrorMessage();
+- if (errorMessage != null) {
+- promise.reject(errorMessage, TYPE_FINGERPRINT_LEGACY);
+- ReactNativeFingerprintScannerModule.this.release();
+- return;
+- }
+-
+- getFingerprintIdentify().resumeIdentify();
+- getFingerprintIdentify().startIdentify(MAX_AVAILABLE_TIMES, new IdentifyListener() {
+- @Override
+- public void onSucceed() {
+- promise.resolve(true);
+- }
+-
+- @Override
+- public void onNotMatch(int availableTimes) {
+- if (availableTimes <= 0) {
+- mReactContext.getJSModule(RCTDeviceEventEmitter.class)
+- .emit("FINGERPRINT_SCANNER_AUTHENTICATION", "DeviceLocked");
+-
+- } else {
+- mReactContext.getJSModule(RCTDeviceEventEmitter.class)
+- .emit("FINGERPRINT_SCANNER_AUTHENTICATION", "AuthenticationNotMatch");
+- }
+- }
+-
+- @Override
+- public void onFailed(boolean isDeviceLocked) {
+- if(isDeviceLocked){
+- promise.reject("AuthenticationFailed", "DeviceLocked");
+- } else {
+- promise.reject("AuthenticationFailed", TYPE_FINGERPRINT_LEGACY);
+- }
+- ReactNativeFingerprintScannerModule.this.release();
+- }
+-
+- @Override
+- public void onStartFailedByDeviceLocked() {
+- // the first start failed because the device was locked temporarily
+- promise.reject("AuthenticationFailed", "DeviceLocked");
+- }
+- });
+- }
+ }
+--
+2.25.1
+
diff --git a/metadata/net.cozic.joplin/remove-camera.patch b/metadata/net.cozic.joplin/remove-camera.patch
new file mode 100644
index 0000000000..735292a0f9
--- /dev/null
+++ b/metadata/net.cozic.joplin/remove-camera.patch
@@ -0,0 +1,44 @@
+From 2433d6303e8097f528bd6f458585aa418df54dd8 Mon Sep 17 00:00:00 2001
+From: Tobias Mueller
+Date: Tue, 31 Jan 2023 11:49:01 +0100
+Subject: [PATCH] remove any links to CameraView
+
+---
+ packages/app-mobile/components/screens/Note.tsx | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+diff --git a/packages/app-mobile/components/screens/Note.tsx b/packages/app-mobile/components/screens/Note.tsx
+index 8552bd5e63e..b2bdf556198 100644
+--- a/packages/app-mobile/components/screens/Note.tsx
++++ b/packages/app-mobile/components/screens/Note.tsx
+@@ -41,7 +41,6 @@ const shared = require('@joplin/lib/components/shared/note-screen-shared.js');
+ import { ImagePickerResponse, launchImageLibrary } from 'react-native-image-picker';
+ import SelectDateTimeDialog from '../SelectDateTimeDialog';
+ import ShareExtension from '../../utils/ShareExtension.js';
+-import CameraView from '../CameraView';
+ import { NoteEntity } from '@joplin/lib/services/database/types';
+ import Logger from '@joplin/lib/Logger';
+ const urlUtils = require('@joplin/lib/urlUtils');
+@@ -867,7 +866,7 @@ class NoteScreenComponent extends BaseScreenComponent {
+ // Disabled on Android because it doesn't work due to permission issues, but enabled on iOS
+ // because that's only way to browse photos from the camera roll.
+ if (Platform.OS === 'ios') buttons.push({ text: _('Attach photo'), id: 'attachPhoto' });
+- buttons.push({ text: _('Take photo'), id: 'takePhoto' });
++ // buttons.push({ text: _('Take photo'), id: 'takePhoto' });
+
+ const buttonId = await dialogs.pop(this, _('Choose an option'), buttons);
+
+@@ -1051,10 +1050,6 @@ class NoteScreenComponent extends BaseScreenComponent {
+ const note: NoteEntity = this.state.note;
+ const isTodo = !!Number(note.is_todo);
+
+- if (this.state.showCamera) {
+- return ;
+- }
+-
+ // Currently keyword highlighting is supported only when FTS is available.
+ const keywords = this.props.searchQuery && !!this.props.ftsEnabled ? this.props.highlightedWords : emptyArray;
+
+--
+2.25.1
+