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 +