forked from trent_larson/crowd-funder-for-time-pwa
Implement Android host-side integration for daily notification plugin by creating custom Application class and native content fetcher. Changes: - Add TimeSafariApplication.java: Custom Application class that registers NativeNotificationContentFetcher with the plugin on app startup - Add TimeSafariNativeFetcher.java: Implementation of NativeNotificationContentFetcher interface that fetches notification content from endorser API endpoint (/api/v2/report/plansLastUpdatedBetween) using JWT authentication - Update AndroidManifest.xml: Declare TimeSafariApplication as the custom Application class using android:name attribute - Add Gson dependency: Include com.google.code.gson:gson:2.10.1 in build.gradle for JSON parsing in the native fetcher This setup mirrors the test app configuration and enables the plugin's background content prefetching feature. The native fetcher will be called by the plugin 5 minutes before scheduled notification times to prefetch content for display. Author: Matthew Raymer
122 lines
4.5 KiB
Groovy
122 lines
4.5 KiB
Groovy
apply plugin: 'com.android.application'
|
|
|
|
// These are sample values to set in gradle.properties.secrets
|
|
// MY_KEYSTORE_FILE=time-safari-upload-key-pkcs12.jks
|
|
// MY_KEYSTORE_PASSWORD=...
|
|
// MY_KEY_ALIAS=time-safari-key-alias
|
|
// MY_KEY_PASSWORD=...
|
|
|
|
// Try to load from environment variables first
|
|
project.ext.MY_KEYSTORE_FILE = System.getenv('ANDROID_KEYSTORE_FILE') ?: ""
|
|
project.ext.MY_KEYSTORE_PASSWORD = System.getenv('ANDROID_KEYSTORE_PASSWORD') ?: ""
|
|
project.ext.MY_KEY_ALIAS = System.getenv('ANDROID_KEY_ALIAS') ?: ""
|
|
project.ext.MY_KEY_PASSWORD = System.getenv('ANDROID_KEY_PASSWORD') ?: ""
|
|
|
|
// If no environment variables, try to load from secrets file
|
|
if (!project.ext.MY_KEYSTORE_FILE) {
|
|
def secretsPropertiesFile = rootProject.file("app/gradle.properties.secrets")
|
|
if (secretsPropertiesFile.exists()) {
|
|
Properties secretsProperties = new Properties()
|
|
secretsProperties.load(new FileInputStream(secretsPropertiesFile))
|
|
secretsProperties.each { name, value ->
|
|
project.ext[name] = value
|
|
}
|
|
}
|
|
}
|
|
|
|
android {
|
|
namespace 'app.timesafari'
|
|
compileSdk rootProject.ext.compileSdkVersion
|
|
defaultConfig {
|
|
applicationId "app.timesafari.app"
|
|
minSdkVersion rootProject.ext.minSdkVersion
|
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
|
versionCode 47
|
|
versionName "1.1.2"
|
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
|
aaptOptions {
|
|
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
|
|
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
|
|
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
|
|
}
|
|
}
|
|
signingConfigs {
|
|
release {
|
|
if (project.ext.MY_KEYSTORE_FILE &&
|
|
project.ext.MY_KEYSTORE_PASSWORD &&
|
|
project.ext.MY_KEY_ALIAS &&
|
|
project.ext.MY_KEY_PASSWORD) {
|
|
|
|
storeFile file(project.ext.MY_KEYSTORE_FILE)
|
|
storePassword project.ext.MY_KEYSTORE_PASSWORD
|
|
keyAlias project.ext.MY_KEY_ALIAS
|
|
keyPassword project.ext.MY_KEY_PASSWORD
|
|
}
|
|
}
|
|
}
|
|
buildTypes {
|
|
release {
|
|
minifyEnabled false
|
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
// Only sign if we have the signing config
|
|
if (signingConfigs.release.storeFile != null) {
|
|
signingConfig signingConfigs.release
|
|
}
|
|
}
|
|
}
|
|
packagingOptions {
|
|
jniLibs {
|
|
pickFirsts += ['**/lib/x86_64/libbarhopper_v3.so', '**/lib/x86_64/libimage_processing_util_jni.so', '**/lib/x86_64/libsqlcipher.so']
|
|
}
|
|
}
|
|
|
|
// Configure for 16 KB page size compatibility
|
|
|
|
|
|
// Enable bundle builds (without which it doesn't work right for bundleDebug vs bundleRelease)
|
|
bundle {
|
|
language {
|
|
enableSplit = true
|
|
}
|
|
density {
|
|
enableSplit = true
|
|
}
|
|
abi {
|
|
enableSplit = true
|
|
}
|
|
}
|
|
}
|
|
|
|
repositories {
|
|
flatDir{
|
|
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation fileTree(include: ['*.jar'], dir: 'libs')
|
|
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
|
|
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
|
|
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
|
|
implementation project(':capacitor-android')
|
|
implementation project(':capacitor-community-sqlite')
|
|
implementation "androidx.biometric:biometric:1.2.0-alpha05"
|
|
// Gson for JSON parsing in native notification fetcher
|
|
implementation "com.google.code.gson:gson:2.10.1"
|
|
testImplementation "junit:junit:$junitVersion"
|
|
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
|
|
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
|
|
implementation project(':capacitor-cordova-android-plugins')
|
|
}
|
|
|
|
apply from: 'capacitor.build.gradle'
|
|
|
|
try {
|
|
def servicesJSON = file('google-services.json')
|
|
if (servicesJSON.text) {
|
|
apply plugin: 'com.google.gms.google-services'
|
|
}
|
|
} catch(Exception e) {
|
|
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
|
|
}
|