mirror of
https://github.com/standardnotes/mobile.git
synced 2026-01-01 20:38:10 -05:00
* feat: files popover (initial commit) * chore: fixes after updating deps * refactor: get rid of extra types * feat: filter files list * feat: rename file * fix: sodium jsi package * chore: update deps * chore: upgrade deps * fix: sodium jsi types * feat: download files * refactor: use screens navigation instead of modals so that next popups are not hidden behind already opened ones * chore: version bump * refactor: navigate to new screen for renaming files * refactor: when downloading the file, append content chunks to it instead of overwriting the whole file * feat: add Share dialog on iOS and separate "Share" and "Download" options on Android * fix: small fixes * feat: show toast notifications on file-related actions * feat: show toast notifications on file-related actions, cleanup unneeded files after share * feat: store downloaded files in "Downloads" folder on Android * feat: show success message on ios after sharing the file * fix: use `Aes` from React Native, remove unused dependency * fix: restore "@standardnotes/react-native-aes" module * feat: add feature flag to show files on dev only * chore: fix lint error * fix: performance optimization * fix: call file protection methods from mutator service * fix: remove event listener correctly after RN version update * feat: download files on android to "Download" folder * fix: remove event listener correctly after RN version update * feat: check the storage permissions on Android on downloading files * fix: don't trigger download if there is another download in progress * style: wrap long file names, remove unneeded styles * style: make file list scrollable, wrap long file names, remove unneeded styles * fix: correctly delete attached file, better wording * refactor: move files related logic to separate service * fix: make the last item in files list reachable on scrolling * fix: show toast notification after attaching/detaching file to a note * feat: show lock icon next to protected files * feat: show lock icon ONLY next to protected files * feat: make search bar from notes list reusable and consume in files list as well * feat: show filtered files count on screen title * refactor: better name for `SearchBar` component * fix: remove hardcoded bottom padding from files list * chore: upgrade dependencies * feat: show files in a separate section on sidebar refactor: move file-related actions to a custom hook * refactor: add types for toast * feat: hide toast notification when pressing it * chore: upgrade deps * feat: show lock icon for protected files in Files section * feat: better look for "Attached"/"All files" tabs switcher * fix: decrease tab switcher height a bit smaller * chore: fix lint errors * feat: show "Export" instead of "Download" on iOS file actions * feat: show different titles for file screen opener link depending on attached files count * fix: show files list in note sidebar with correct vertical distance * fix: optimize file protection toggling * chore: cleanup console logs * fix: remove commented parts * fix: remove not implemented and commented parts * style: more distance between lock and filetype icons * fix: changes based on reviews * fix: remove android-related unneeded configs * chore: upgrade dependencies Co-authored-by: Mo <mo@standardnotes.com>
265 lines
10 KiB
Groovy
265 lines
10 KiB
Groovy
apply plugin: "com.android.application"
|
|
|
|
import com.android.build.OutputFile
|
|
|
|
/**
|
|
* The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
|
|
* and bundleReleaseJsAndAssets).
|
|
* These basically call `react-native bundle` with the correct arguments during the Android build
|
|
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
|
|
* bundle directly from the development server. Below you can see all the possible configurations
|
|
* and their defaults. If you decide to add a configuration block, make sure to add it before the
|
|
* `apply from: "../../node_modules/react-native/react.gradle"` line.
|
|
*
|
|
* project.ext.react = [
|
|
* // the name of the generated asset file containing your JS bundle
|
|
* bundleAssetName: "index.android.bundle",
|
|
*
|
|
* // the entry file for bundle generation. If none specified and
|
|
* // "index.android.js" exists, it will be used. Otherwise "index.js" is
|
|
* // default. Can be overridden with ENTRY_FILE environment variable.
|
|
* entryFile: "index.android.js",
|
|
*
|
|
* // https://reactnative.dev/docs/performance#enable-the-ram-format
|
|
* bundleCommand: "ram-bundle",
|
|
*
|
|
* // whether to bundle JS and assets in debug mode
|
|
* bundleInDebug: false,
|
|
*
|
|
* // whether to bundle JS and assets in release mode
|
|
* bundleInRelease: true,
|
|
*
|
|
* // whether to bundle JS and assets in another build variant (if configured).
|
|
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
|
|
* // The configuration property can be in the following formats
|
|
* // 'bundleIn${productFlavor}${buildType}'
|
|
* // 'bundleIn${buildType}'
|
|
* // bundleInFreeDebug: true,
|
|
* // bundleInPaidRelease: true,
|
|
* // bundleInBeta: true,
|
|
*
|
|
* // whether to disable dev mode in custom build variants (by default only disabled in release)
|
|
* // for example: to disable dev mode in the staging build type (if configured)
|
|
* devDisabledInStaging: true,
|
|
* // The configuration property can be in the following formats
|
|
* // 'devDisabledIn${productFlavor}${buildType}'
|
|
* // 'devDisabledIn${buildType}'
|
|
*
|
|
* // the root of your project, i.e. where "package.json" lives
|
|
* root: "../../",
|
|
*
|
|
* // where to put the JS bundle asset in debug mode
|
|
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
|
|
*
|
|
* // where to put the JS bundle asset in release mode
|
|
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
|
|
*
|
|
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
* // require('./image.png')), in debug mode
|
|
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
|
|
*
|
|
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
* // require('./image.png')), in release mode
|
|
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
|
|
*
|
|
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
|
|
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
|
|
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
|
|
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
|
|
* // for example, you might want to remove it from here.
|
|
* inputExcludes: ["android/**", "ios/**"],
|
|
*
|
|
* // override which node gets called and with what additional arguments
|
|
* nodeExecutableAndArgs: ["node"],
|
|
*
|
|
* // supply additional arguments to the packager
|
|
* extraPackagerArgs: []
|
|
* ]
|
|
*/
|
|
|
|
project.ext.react = [
|
|
enableHermes: true, // clean and rebuild if changing
|
|
]
|
|
|
|
apply from: "../../node_modules/react-native/react.gradle"
|
|
|
|
project.ext.vectoricons = [
|
|
iconFontNames: [ 'Ionicons.ttf' ] // Name of the font files you want to copy
|
|
]
|
|
|
|
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
|
|
|
|
/**
|
|
* Set this to true to create two separate APKs instead of one:
|
|
* - An APK that only works on ARM devices
|
|
* - An APK that only works on x86 devices
|
|
* The advantage is the size of the APK is reduced by about 4MB.
|
|
* Upload all the APKs to the Play Store and people will download
|
|
* the correct one based on the CPU architecture of their device.
|
|
*/
|
|
def enableSeparateBuildPerCPUArchitecture = false
|
|
|
|
/**
|
|
* Run Proguard to shrink the Java bytecode in release builds.
|
|
*/
|
|
def enableProguardInReleaseBuilds = false
|
|
|
|
/**
|
|
* The preferred build flavor of JavaScriptCore.
|
|
*
|
|
* For example, to use the international variant, you can use:
|
|
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
|
*
|
|
* The international variant includes ICU i18n library and necessary data
|
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
|
* give correct results when using with locales other than en-US. Note that
|
|
* this variant is about 6MiB larger per architecture than default.
|
|
*/
|
|
def jscFlavor = 'org.webkit:android-jsc:+'
|
|
|
|
/**
|
|
* Whether to enable the Hermes VM.
|
|
*
|
|
* This should be set on project.ext.react and that value will be read here. If it is not set
|
|
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
|
|
* and the benefits of using Hermes will therefore be sharply reduced.
|
|
*/
|
|
def enableHermes = project.ext.react.get("enableHermes", false);
|
|
|
|
/**
|
|
* Architectures to build native code for in debug.
|
|
*/
|
|
def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures")
|
|
|
|
def appVersionCode = project.hasProperty('versionCode') ? Integer.valueOf(project.property('versionCode')) : 1
|
|
def appVersionName = project.hasProperty('versionName') ? project.property('versionName') : "1.0"
|
|
|
|
android {
|
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
|
ndkVersion '21.4.7075529'
|
|
flavorDimensions "default"
|
|
|
|
defaultConfig {
|
|
applicationId "com.standardnotes"
|
|
minSdkVersion rootProject.ext.minSdkVersion
|
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
|
|
|
versionCode appVersionCode
|
|
versionName appVersionName
|
|
|
|
multiDexEnabled true
|
|
|
|
ndk {
|
|
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
|
}
|
|
|
|
testBuildType System.getProperty('testBuildType', 'debug') // detox: This will later be used to control the test apk build type
|
|
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
|
}
|
|
|
|
signingConfigs {
|
|
debug {
|
|
storeFile file('debug.keystore')
|
|
storePassword 'android'
|
|
keyAlias 'androiddebugkey'
|
|
keyPassword 'android'
|
|
}
|
|
release {
|
|
storeFile file('keystore.keystore')
|
|
keyAlias System.getenv("ANDROID_KEYSTORE_ALIAS")
|
|
keyPassword System.getenv("ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD")
|
|
storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD")
|
|
}
|
|
}
|
|
|
|
splits {
|
|
abi {
|
|
reset()
|
|
enable enableSeparateBuildPerCPUArchitecture
|
|
universalApk false // If true, also generate a universal APK
|
|
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
|
|
}
|
|
}
|
|
productFlavors {
|
|
dev {
|
|
applicationIdSuffix ".dev"
|
|
}
|
|
prod {
|
|
getIsDefault().set(true)
|
|
}
|
|
}
|
|
buildTypes {
|
|
debug {
|
|
signingConfig signingConfigs.debug
|
|
if (nativeArchitectures) {
|
|
ndk {
|
|
abiFilters nativeArchitectures.split(',')
|
|
}
|
|
}
|
|
}
|
|
release {
|
|
minifyEnabled enableProguardInReleaseBuilds
|
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
productFlavors.dev.signingConfig System.getenv('DETOX_CI') ? signingConfigs.debug : signingConfigs.release
|
|
productFlavors.prod.signingConfig System.getenv('DETOX_CI') ? signingConfigs.debug : signingConfigs.release
|
|
proguardFile "${rootProject.projectDir}/../node_modules/detox/android/detox/proguard-rules-app.pro"
|
|
}
|
|
}
|
|
|
|
// applicationVariants are e.g. debug, release
|
|
applicationVariants.all { variant ->
|
|
variant.outputs.each { output ->
|
|
// For each separate APK per architecture, set a unique version code as described here:
|
|
// https://developer.android.com/studio/build/configure-apk-splits.html
|
|
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
|
|
def abi = output.getFilter(OutputFile.ABI)
|
|
if (abi != null) { // null for the universal-debug, universal-release variants
|
|
output.versionCodeOverride =
|
|
versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
//noinspection GradleDynamicVersion
|
|
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
|
|
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
|
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
|
implementation 'de.undercouch:gradle-download-task:5.0.2'
|
|
|
|
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
|
|
exclude group:'com.facebook.fbjni'
|
|
}
|
|
|
|
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
|
|
exclude group:'com.facebook.flipper'
|
|
exclude group:'com.squareup.okhttp3', module:'okhttp'
|
|
}
|
|
|
|
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
|
|
exclude group:'com.facebook.flipper'
|
|
}
|
|
|
|
androidTestImplementation('com.wix:detox:+')
|
|
|
|
if (enableHermes) {
|
|
def hermesPath = "../../node_modules/hermes-engine/android/";
|
|
debugImplementation files(hermesPath + "hermes-debug.aar")
|
|
releaseImplementation files(hermesPath + "hermes-release.aar")
|
|
} else {
|
|
implementation jscFlavor
|
|
}
|
|
}
|
|
|
|
// Run this once to be able to run the application with BUCK
|
|
// puts all compile dependencies into folder libs for BUCK to use
|
|
task copyDownloadableDepsToLibs(type: Copy) {
|
|
from configurations.implementation
|
|
into 'libs'
|
|
}
|
|
|
|
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|