upgrade android project

This commit is contained in:
Jason Wall 2024-02-29 15:21:26 +00:00 committed by Jason Wall
parent 525f7dab9b
commit 72deb4f72c
70 changed files with 14988 additions and 37415 deletions

View File

@ -4,47 +4,41 @@ stages:
- staging
- prod
build-site:
stage: build
image: node:18.14.1
variables:
NODE_OPTIONS: "--max_old_space_size=2048"
script:
- cd ./src
- make build-site
artifacts:
paths:
- ./src/dist/dynamicbible
build-android:
stage: build
image: walljm/gradle_android_node:7.5.0-jdk11-28-18
image: walljm/gradle_android:8.0.2-jdk17-33-node1
before_script:
- cd ./src/android
- bash ./install-sdk.sh
- cd ..
script:
- pwd
- node -v
- npm -v
- npm ci
- npm run-script build
- npm run-script copy
- cd android
- cd android/
- gradle signingReport
- gradle assembleRelease
- gradle bundleRelease
artifacts:
paths:
- ./src/dist
- ./src/android/app/build/outputs
test:
stage: test
image: walljm/node-chrome-headless:18.14.1
image: walljm/node-chrome-headless:21.6
variables:
NODE_OPTIONS: "--max_old_space_size=2048"
script:
- cd ./src
- make test
needs: ["build-site"]
- npm ci
- npm run-script lint
- npm run-script test-headless
needs:
- build-android
deploy-staging:
stage: staging
@ -56,7 +50,8 @@ deploy-staging:
- if: '$CI_COMMIT_BRANCH == "main"'
when: on_success
allow_failure: false
needs: ["build-site"]
needs:
- build-android
deploy-prod-site:
stage: prod
@ -68,19 +63,20 @@ deploy-prod-site:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
allow_failure: false
needs: ["build-site"]
needs:
- build-android
deploy-android:
stage: prod
image: walljm/gradle_android_node:7.5.0-jdk11-28-18
image: walljm/gradle_android:8.0.2-jdk17-33-node1
needs:
- build-android
before_script:
- cd ./src/android
- bash ./install-sdk.sh
- cd ..
script:
- pwd
- npm ci
- npm run-script build
- npm run-script copy
- cd android
- gradle publishReleaseBundle
@ -91,4 +87,3 @@ deploy-android:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
allow_failure: false
needs: ["build-android"]

View File

@ -1,15 +1,14 @@
FROM node:18.14.1-buster-slim
FROM node:21.6.2-bookworm
RUN apt-get update -qqy \
&& apt-get -qqy install \
dumb-init gnupg wget ca-certificates apt-transport-https \
ttf-wqy-zenhei \
git curl unzip build-essential ruby ruby-dev ruby-ffi gcc make \
dumb-init gnupg wget ca-certificates apt-transport-https \
ttf-wqy-zenhei \
git curl unzip build-essential ruby ruby-dev ruby-ffi gcc make \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list \
&& apt-get update -qqy \
&& apt-get -qqy install google-chrome-unstable \
&& rm /etc/apt/sources.list.d/google-chrome.list \
&& rm -rf /var/lib/apt/lists/* /var/cache/apt/*
RUN wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list
RUN apt-get update -qqy
RUN apt-get -qqy install google-chrome-unstable
RUN rm /etc/apt/sources.list.d/google-chrome.list

View File

@ -1,2 +0,0 @@
docker build -t walljm/node-chrome-headless:18.14.1 .
docker push walljm/node-chrome-headless:18.14.1

2
docker-node-chrome/build.sh Executable file
View File

@ -0,0 +1,2 @@
docker build -t walljm/node-chrome-headless:21.6 .
docker push walljm/node-chrome-headless:21.6

View File

@ -1,10 +1,5 @@
FROM gradle:7.5.0-jdk11
# install node 18
RUN curl -sL https://deb.nodesource.com/setup_18.x | bash -
RUN apt-get install -y nodejs
FROM gradle:8.0.2-jdk17-focal
# Install Git and dependencies
RUN apt-get update \
@ -12,12 +7,14 @@ RUN apt-get update \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists /var/cache/apt
RUN curl -L -o node.tar.gz "https://nodejs.org/dist/v21.6.2/node-v21.6.2-linux-x64.tar.gz" && \
tar -xzf node.tar.gz -C /usr/local --strip-components=1 && \
rm node.tar.gz && \
ln -s /usr/local/bin/node /usr/local/bin/nodejs
# Set up environment variables
ENV ANDROID_SDK_ROOT="/home/user/android-sdk-linux" \
SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip" \
GRADLE_URL="https://services.gradle.org/distributions/gradle-7.5.1-bin.zip" \
ANDROID_VERSION=28 \
ANDROID_BUILD_TOOLS_VERSION=33.0.1
SDK_URL="https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip"
# Create a non-root user
RUN useradd -m user
@ -25,19 +22,30 @@ USER user
WORKDIR /home/user
# Download Android SDK
RUN mkdir "$ANDROID_SDK_ROOT" .android \
&& cd "$ANDROID_SDK_ROOT" \
&& mkdir cmdline-tools \
&& cd cmdline-tools \
&& curl -o sdk.zip $SDK_URL \
&& unzip sdk.zip \
&& rm sdk.zip \
&& mv cmdline-tools latest \
&& cd .. \
&& yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses
RUN mkdir "$ANDROID_SDK_ROOT" .android
WORKDIR $ANDROID_SDK_ROOT
RUN pwd
RUN mkdir cmdline-tools
WORKDIR "$ANDROID_SDK_ROOT/cmdline-tools"
RUN curl -o sdk.zip $SDK_URL
RUN unzip sdk.zip
RUN rm sdk.zip
RUN mv cmdline-tools latest
WORKDIR "$ANDROID_SDK_ROOT/cmdline-tools/latest/bin"
RUN ls -laF
RUN pwd
RUN yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses
# Install Android Build Tool and Libraries
RUN $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --update
RUN $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
"platforms;android-${ANDROID_VERSION}" \
RUN $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --verbose \
"build-tools;34.0.0" \
"build-tools;30.0.3" \
"platforms;android-33" \
"platform-tools"
RUN yes | $ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager --licenses;
RUN node -v
RUN npm -v

View File

@ -1,2 +0,0 @@
docker build -t walljm/gradle_android_node:7.5.0-jdk11-28-18 .
docker push walljm/gradle_android_node:7.5.0-jdk11-28-18

2
gradle_android_node/build.sh Executable file
View File

@ -0,0 +1,2 @@
docker build -t walljm/gradle_android:8.0.2-jdk17-33-node1 .
docker push walljm/gradle_android:8.0.2-jdk17-33-node1

View File

@ -0,0 +1,10 @@
version: '3.7'
services:
android:
image: walljm/gradle_android_node:dev
build:
context: .
dockerfile: Dockerfile
init: true
volumes:
- ../src:/src

View File

@ -0,0 +1,7 @@
#!/usr/bin/env bash
set -eux
pwd
cd /src/android
gradle signingReport
gradle assembleRelease
gradle bundleReleaseBundle

View File

@ -1,18 +0,0 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For the full list of supported browsers by the Angular framework, please see:
# https://angular.io/guide/browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
last 1 Chrome version
last 1 Firefox version
last 2 Edge major versions
last 2 Safari major versions
last 2 iOS major versions
Firefox ESR
not IE 9-10 # Angular support for IE 9-10 has been deprecated and will be removed as of Angular v11. To opt-in, remove the 'not' prefix on this line.
not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line.

1
src/.gitignore vendored
View File

@ -41,6 +41,7 @@ yarn-error.log
testem.log
/typings
# System Files
.DS_Store
Thumbs.db

View File

@ -10,10 +10,11 @@ build-site:
npm run-script build
build-android:
npm run-script sync
npm run-script copy
cd android/
./gradlew assembleRelease
./gradlew bundleRelease
gradle signingReport
gradle assembleRelease
gradle bundleRelease
build: build-site build-android

View File

@ -1,11 +1,8 @@
# NPM renames .gitignore to .npmignore
# In order to prevent that, we remove the initial "."
# And the CLI then renames it
# Using Android gitignore template: https://github.com/github/gitignore/blob/master/Android.gitignore
# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
# Built application files
*.apk
*.aar
*.ap_
*.aab
@ -19,7 +16,8 @@
bin/
gen/
out/
release/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
@ -28,7 +26,7 @@ build/
# Local configuration file (sdk path, etc)
local.properties
signing.properties
walljm-play-store-key.jks
play_store_key.pfx
play-store.json
# Proguard folder generated by Eclipse
@ -64,6 +62,10 @@ captures/
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
@ -87,8 +89,16 @@ lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
# Cordova plugins for Capacitor
capacitor-cordova-android-plugins
# Copied web assets
app/src/main/assets/public
# Android SDK downloads
android-sdk/
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml

View File

@ -1,116 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<codeStyleSettings language="XML">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="11" />
<bytecodeTargetLevel target="17" />
</component>
</project>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
<remote-repository>
<option name="id" value="BintrayJCenter" />
<option name="name" value="BintrayJCenter" />
<option name="url" value="https://jcenter.bintray.com/" />
</remote-repository>
<remote-repository>
<option name="id" value="Google" />
<option name="name" value="Google" />
<option name="url" value="https://dl.google.com/dl/android/maven2/" />
</remote-repository>
<remote-repository>
<option name="id" value="MavenRepo" />
<option name="name" value="MavenRepo" />
<option name="url" value="https://repo.maven.apache.org/maven2/" />
</remote-repository>
</component>
</project>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK" />
</project>

View File

@ -1,3 +1,8 @@
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.time.temporal.ChronoUnit
apply plugin: 'com.android.application'
apply plugin: "com.github.triplet.play"
@ -8,102 +13,106 @@ def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
android {
namespace "walljm.dynamicbible"
def versionPropsFile = rootProject.file('version.properties')
namespace 'walljm.dynamicbible'
compileSdkVersion rootProject.ext.compileSdkVersion
def mVersionName = ""
def mVersionCode = ""
def versionPropsFile = rootProject.file('version.properties')
if (versionPropsFile.canRead()) {
def versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
def mVersionName = ""
def mVersionCode = ""
mVersionName = "v${versionProps['VERSION_MAJOR']}.${versionProps['VERSION_MINOR']}.${versionProps['VERSION_PATCH']}-${getPrettyDate()}"
mVersionCode = "${getDate()}"
if (versionPropsFile.canRead()) {
def versionProps = new Properties()
versionProps.load(new FileInputStream(versionPropsFile))
mVersionName = "v${versionProps['VERSION_MAJOR']}.${versionProps['VERSION_MINOR']}.${versionProps['VERSION_PATCH']}-${getPrettyDate()}"
mVersionCode = "${getDate()}"
defaultConfig {
applicationId "walljm.dynamicbible"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
versionCode mVersionCode.toInteger()
versionName "${mVersionName}"
}
} else {
throw new FileNotFoundException("Could not read version.properties!")
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['password'].replaceAll('JASON', "\\\$")
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['password'].replaceAll('JASON', "\\\$")
defaultConfig {
applicationId "walljm.dynamicbible"
compileSdk rootProject.ext.compileSdkVersion
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode mVersionCode.toInteger()
versionName "${mVersionName}"
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:!*~'
}
multiDexEnabled = true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
} else {
throw new FileNotFoundException("Could not read version.properties!")
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['password'].replaceAll('JASON', "\\\$")
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['password'].replaceAll('JASON', "\\\$")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
flatDir {
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:26.5.0')
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')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:26.5.0')
// Declare the dependency for the Firebase Authentication library
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-auth'
// Declare the dependency for the Firebase Authentication library
// When using the BoM, you don't specify versions in Firebase library dependencies
implementation 'com.google.firebase:firebase-auth'
// Also declare the dependency for the Google Play services library and specify its version
implementation 'com.google.android.gms:play-services-auth:21.0.0'
// Also declare the dependency for the Google Play services library and specify its version
implementation 'com.google.android.gms:play-services-auth:20.4.1'
}
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.warn("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(ignored) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}
play {
defaultToAppBundles.set(true)
serviceAccountCredentials = file("../play-store.json")
track.set("beta")
defaultToAppBundles.set(true)
serviceAccountCredentials = file("../play-store.json")
track.set("beta")
}
def getPrettyDate() {
return new Date().format('yyyy-MM-dd-HH-mm-ss')
static def getPrettyDate() {
return new Date().format('yyyy-MM-dd-HH-mm-ss')
}
def getDate() {
def dt1 = new Date();
def dt2 = new Date('01/01/2020');
def seconds = Math.round((dt1.getTime() - dt2.getTime()) / 1000)
return "${seconds}"
static def getDate() {
def startTime = LocalDateTime.of(2020, 1, 1, 0, 0) // this is the time all the versions are based from.
def seconds = Math.round(startTime.until(LocalDateTime.now(), ChronoUnit.SECONDS) / 1000) // seconds since the start time
return "${seconds}"
}

View File

@ -2,8 +2,8 @@
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}

View File

@ -1,15 +1,13 @@
package com.getcapacitor.myapp;
import static org.junit.Assert.*;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
@ -17,11 +15,12 @@ import static org.junit.Assert.*;
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.getcapacitor.app", appContext.getPackageName());
}
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.getcapacitor.app", appContext.getPackageName());
}
}

View File

@ -10,25 +10,18 @@
android:theme="@style/AppTheme">
<activity
android:exported="true"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
android:name="walljm.dynamicbible.MainActivity"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask">
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="@string/custom_url_scheme" />
</intent-filter>
</activity>
<provider
@ -43,7 +36,6 @@
</application>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Network API -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

View File

@ -1,9 +1,8 @@
{
"appId": "walljm.dynamicbible",
"appName": "dynamicbible",
"bundledWebRuntime": false,
"npmClient": "npm",
"webDir": "dist/dynamicbible",
"webDir": "dist/dynamicbible/browser",
"plugins": {
"SplashScreen": {
"launchShowDuration": 0

View File

@ -1,12 +0,0 @@
package walljm.dynamicbible;
import android.os.Bundle;
import com.getcapacitor.BridgeActivity;
import com.getcapacitor.Plugin;
import java.util.ArrayList;
import com.codetrixstudio.capacitor.GoogleAuth.GoogleAuth;
public class MainActivity extends BridgeActivity {
}

View File

@ -0,0 +1,5 @@
package walljm.dynamicbible;
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}

View File

@ -1 +1 @@
walljm@gmail.com
jason@walljm.com

View File

@ -1,17 +1,18 @@
package com.getcapacitor.myapp;
import org.junit.Test;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}

View File

@ -4,14 +4,11 @@ buildscript {
repositories {
google()
maven {
url "https://plugins.gradle.org/m2/"
mavenCentral()
}
}
dependencies {
classpath 'com.android.tools.build:gradle:7.4.1'
classpath 'com.google.gms:google-services:4.3.15'
classpath 'com.android.tools.build:gradle:8.0.2'
classpath 'com.google.gms:google-services:4.4.1'
classpath "com.github.triplet.gradle:play-publisher:3.8.1"
// NOTE: Do not place your application dependencies here; they belong
@ -28,7 +25,6 @@ allprojects {
}
}
task clean(type: Delete) {
delete rootProject.buildDir
tasks.register('clean', Delete) {
delete rootProject.buildDir
}

View File

@ -1,5 +1,5 @@
ext {
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.4.1'
androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1'
cordovaAndroidVersion = project.hasProperty('cordovaAndroidVersion') ? rootProject.ext.cordovaAndroidVersion : '10.1.1'
}
@ -9,17 +9,18 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.1'
classpath 'com.android.tools.build:gradle:8.0.0'
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 32
namespace "capacitor.cordova.android.plugins"
compileSdkVersion project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 33
defaultConfig {
minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 32
targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 33
versionCode 1
versionName "1.0"
}
@ -27,8 +28,8 @@ android {
abortOnError false
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}

View File

@ -1,6 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest package="capacitor.android.plugins"
xmlns:android="http://schemas.android.com/apk/res/android"
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:amazon="http://schemas.amazon.com/apk/res/android">
<application >

View File

@ -20,5 +20,3 @@ org.gradle.jvmargs=-Xmx1536m
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

Binary file not shown.

View File

@ -1,5 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

286
src/android/gradlew vendored Normal file → Executable file
View File

@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -17,78 +17,113 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@ -97,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@ -105,84 +140,105 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@ -14,7 +14,7 @@
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@ -25,10 +25,14 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@ -37,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -51,7 +55,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@ -61,38 +65,26 @@ echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal

View File

@ -2,7 +2,7 @@
# Install the signing keys
echo "Creating store key file and signing properties"
base64 -d $play_store_key > ./walljm-play-store-key.jks
base64 -d $play_store_key > ./play_store_key.pfx
cp $play_store_signing_properties ./signing.properties
cp $play_store_credential ./play-store.json

View File

@ -1,22 +1,17 @@
ext {
minSdkVersion = 22
compileSdkVersion = 32
targetSdkVersion = 32
androidxAppCompatVersion = '1.4.2'
androidxCoreVersion = '1.8.0'
androidxMaterialVersion = '1.6.1'
androidxBrowserVersion = '1.4.0'
androidxLocalbroadcastmanagerVersion = '1.0.0'
androidxExifInterfaceVersion = '1.3.3'
firebaseMessagingVersion = '23.0.5'
playServicesLocationVersion = '20.0.0'
junitVersion = '4.13.2'
androidxJunitVersion = '1.1.3'
androidxEspressoCoreVersion = '3.4.0'
cordovaAndroidVersion = '10.1.1'
androidxActivityVersion = '1.4.0'
compileSdkVersion = 34
targetSdkVersion = 34
androidxActivityVersion = '1.7.0'
androidxAppCompatVersion = '1.6.1'
androidxCoordinatorLayoutVersion = '1.2.0'
androidxFragmentVersion = '1.4.1'
coreSplashScreenVersion = '1.0.0-rc01'
androidxWebkitVersion = '1.4.0'
androidxCoreVersion = '1.10.0'
androidxFragmentVersion = '1.5.6'
coreSplashScreenVersion = '1.0.1'
androidxWebkitVersion = '1.6.1'
junitVersion = '4.13.2'
androidxJunitVersion = '1.1.5'
androidxEspressoCoreVersion = '3.5.1'
cordovaAndroidVersion = '10.1.1'
}

View File

@ -15,12 +15,13 @@
"prefix": "app",
"architect": {
"build": {
"builder": "@angular-devkit/build-angular:browser",
"builder": "@angular-devkit/build-angular:application",
"options": {
"outputPath": "dist/dynamicbible",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": "src/polyfills.ts",
"polyfills": [
"src/polyfills.ts"
],
"tsConfig": "tsconfig.app.json",
"assets": [
"src/favicon.ico",
@ -32,6 +33,11 @@
"scripts": [
"node_modules/marked/marked.min.js"
],
"stylePreprocessorOptions": {
"includePaths": [
"node_modules/"
]
},
"allowedCommonJsDependencies": [
"firebase",
"@firebase/app",
@ -40,12 +46,11 @@
"@firebase/util",
"@firebase/component"
],
"vendorChunk": true,
"extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true,
"optimization": false,
"namedChunks": true
"namedChunks": true,
"browser": "src/main.ts"
},
"configurations": {
"production": {
@ -60,8 +65,6 @@
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
@ -80,20 +83,14 @@
},
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "dynamicbible:build"
},
"options": {},
"configurations": {
"production": {
"browserTarget": "dynamicbible:build:production"
}
"production": {}
}
},
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
"browserTarget": "dynamicbible:build"
}
"options": {}
},
"test": {
"builder": "@angular-devkit/build-angular:karma",
@ -113,10 +110,11 @@
}
},
"e2e": {
"builder": "@angular-devkit/build-angular:protractor",
"builder": "@cypress/schematic:cypress",
"options": {
"protractorConfig": "e2e/protractor.conf.js",
"devServerTarget": "dynamicbible:serve"
"devServerTarget": "dynamicbible:serve",
"watch": true,
"headless": false
},
"configurations": {
"production": {
@ -136,6 +134,38 @@
"src/**/*.html"
]
}
},
"cypress-run": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "dynamicbible:serve"
},
"configurations": {
"production": {
"devServerTarget": "dynamicbible:serve:production"
}
}
},
"cypress-open": {
"builder": "@cypress/schematic:cypress",
"options": {
"watch": true,
"headless": false
}
},
"ct": {
"builder": "@cypress/schematic:cypress",
"options": {
"devServerTarget": "dynamicbible:serve",
"watch": true,
"headless": false,
"testingType": "component"
},
"configurations": {
"development": {
"devServerTarget": "dynamicbible:serve:development"
}
}
}
}
}
@ -143,8 +173,10 @@
"cli": {
"analytics": false,
"schematicCollections": [
"@cypress/schematic",
"@angular-eslint/schematics",
"@angular-eslint/schematics"
"@angular-eslint/schematics",
"@schematics/angular"
]
}
}
}

View File

@ -1,9 +1,8 @@
{
"appId": "walljm.dynamicbible",
"appName": "dynamicbible",
"bundledWebRuntime": false,
"npmClient": "npm",
"webDir": "dist/dynamicbible",
"webDir": "dist/dynamicbible/browser",
"plugins": {
"SplashScreen": {
"launchShowDuration": 0

18
src/cypress.config.ts Normal file
View File

@ -0,0 +1,18 @@
import { defineConfig } from 'cypress'
export default defineConfig({
e2e: {
'baseUrl': 'http://localhost:4200'
},
component: {
devServer: {
framework: 'angular',
bundler: 'webpack',
},
specPattern: '**/*.cy.ts'
}
})

View File

@ -0,0 +1,6 @@
describe('My First Test', () => {
it('Visits the initial project page', () => {
cy.visit('/')
cy.contains('app is running!')
})
})

View File

@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io"
}

View File

@ -0,0 +1,43 @@
// ***********************************************
// This example namespace declaration will help
// with Intellisense and code completion in your
// IDE or Text Editor.
// ***********************************************
// declare namespace Cypress {
// interface Chainable<Subject = any> {
// customCommand(param: any): typeof customCommand;
// }
// }
//
// function customCommand(param: any): void {
// console.warn(param);
// }
//
// NOTE: You can use it like so:
// Cypress.Commands.add('customCommand', customCommand);
//
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })

View File

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Components App</title>
</head>
<body>
<div data-cy-root></div>
</body>
</html>

View File

@ -0,0 +1,39 @@
// ***********************************************************
// This example support/component.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands'
// Alternatively you can use CommonJS syntax:
// require('./commands')
import { mount } from 'cypress/angular'
// Augment the Cypress namespace to include type definitions for
// your custom command.
// Alternatively, can be defined in cypress/support/component.d.ts
// with a <reference path="./component" /> at the top of your spec.
declare global {
namespace Cypress {
interface Chainable {
mount: typeof mount
}
}
}
Cypress.Commands.add('mount', mount)
// Example use:
// cy.mount(MyComponent)

View File

@ -0,0 +1,17 @@
// ***********************************************************
// This example support/e2e.ts is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// When a command from ./commands is ready to use, import with `import './commands'` syntax
// import './commands';

View File

@ -0,0 +1,8 @@
{
"extends": "../tsconfig.json",
"include": ["**/*.ts"],
"compilerOptions": {
"sourceMap": false,
"types": ["cypress"]
}
}

51004
src/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,69 +11,80 @@
"lint": "ng lint",
"e2e": "ng e2e",
"copy": "npx cap sync",
"all": "ng lint & ng test --watch=false --browsers=ChromeHeadlessNoSandbox & ng build --configuration production & npx cap sync"
"cypress:open": "cypress open",
"cypress:run": "cypress run"
},
"private": true,
"dependencies": {
"@angular/animations": "^14.2.12",
"@angular/cdk": "^14.2.7",
"@angular/common": "^14.2.12",
"@angular/compiler": "^14.2.12",
"@angular/core": "^14.2.12",
"@angular/fire": "^7.4.1",
"@angular/forms": "^14.2.12",
"@angular/material": "^14.2.7",
"@angular/platform-browser": "^14.2.12",
"@angular/platform-browser-dynamic": "^14.2.12",
"@angular/router": "^14.2.12",
"@capacitor/android": "^4.6.3",
"@capacitor/core": "^4.6.3",
"@capacitor/ios": "^4.6.3",
"@codetrix-studio/capacitor-google-auth": "^3.2.2",
"@ngx-pwa/local-storage": "^13.0.6",
"@angular/animations": "^17.2.3",
"@angular/cdk": "^17.2.1",
"@angular/common": "^17.2.3",
"@angular/compiler": "^17.2.3",
"@angular/core": "^17.2.3",
"@angular/fire": "^17.0.1",
"@angular/forms": "^17.2.3",
"@angular/material": "^17.2.1",
"@angular/platform-browser": "^17.2.3",
"@angular/platform-browser-dynamic": "^17.2.3",
"@angular/router": "^17.2.3",
"@capacitor/android": "^5.7.0",
"@capacitor/core": "^5.7.0",
"@capacitor/ios": "^5.7.0",
"@codetrix-studio/capacitor-google-auth": "^3.4.0-rc.0",
"@ngx-pwa/local-storage": "^17.0.0",
"angular2-uuid": "^1.1.1",
"component": "^1.1.0",
"firebase": "^9.17.1",
"marked": "^4.2.12",
"ngx-markdown": "^14.0.1",
"redux": "^4.2.1",
"reselect": "^4.1.7",
"rxjs": "^6.6.0",
"tslib": "^2.5.0",
"zone.js": "~0.11.4"
"firebase": "^10.8.0",
"marked": "^9.0.0",
"ngx-markdown": "^17.1.1",
"redux": "^5.0.1",
"reselect": "^5.1.0",
"rxjs": "^7.8.1",
"tslib": "^2.6.2",
"zone.js": "~0.14.4"
},
"devDependencies": {
"@angular-devkit/architect": "0.1402.10",
"@angular-devkit/build-angular": "^14.2.10",
"@angular-eslint/builder": "14.4.0",
"@angular-eslint/eslint-plugin": "14.4.0",
"@angular-eslint/eslint-plugin-template": "14.4.0",
"@angular-eslint/schematics": "14.4.0",
"@angular-eslint/template-parser": "14.4.0",
"@angular/cli": "^14.2.10",
"@angular/compiler-cli": "^14.2.12",
"@capacitor/cli": "^4.6.3",
"@types/jasmine": "~4.3.1",
"@types/jasminewd2": "~2.0.10",
"@types/marked": "^4.0.8",
"@types/node": "^12.11.1",
"@typescript-eslint/eslint-plugin": "5.43.0",
"@typescript-eslint/parser": "5.43.0",
"eslint": "^8.28.0",
"firebase-tools": "^11.23.1",
"@angular-devkit/architect": "0.1702.1",
"@angular-devkit/build-angular": "^17.2.1",
"@angular-eslint/builder": "17.2.1",
"@angular-eslint/eslint-plugin": "17.2.1",
"@angular-eslint/eslint-plugin-template": "17.2.1",
"@angular-eslint/schematics": "17.2.1",
"@angular-eslint/template-parser": "17.2.1",
"@angular/cli": "^17.2.1",
"@angular/compiler-cli": "^17.2.1",
"@capacitor/cli": "^5.7.0",
"@cypress/schematic": "^2.5.1",
"@types/jasmine": "~5.1.4",
"@types/jasminewd2": "~2.0.13",
"@types/node": "^20.11.21",
"@typescript-eslint/eslint-plugin": "7.1.0",
"@typescript-eslint/parser": "7.1.0",
"eslint": "^8.57.0",
"firebase-tools": "^13.4.0",
"fuzzy": "^0.1.3",
"inquirer": "^6.2.2",
"inquirer-autocomplete-prompt": "^1.0.1",
"jasmine-core": "~4.5.0",
"inquirer": "^9.2.15",
"inquirer-autocomplete-prompt": "^3.0.1",
"jasmine-core": "~5.1.2",
"jasmine-spec-reporter": "~7.0.0",
"karma": "~6.4.1",
"karma-chrome-launcher": "~3.1.1",
"karma": "~6.4.3",
"karma-chrome-launcher": "~3.2.0",
"karma-coverage-istanbul-reporter": "~3.0.3",
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "^2.0.0",
"open": "^8.4.2",
"protractor": "~7.0.0",
"ts-node": "~10.9.1",
"typescript": "~4.6.4"
}
}
"karma-jasmine-html-reporter": "^2.1.0",
"open": "^10.0.4",
"ts-node": "~10.9.2",
"typescript": "~5.3.3",
"cypress": "latest"
},
"browserslist": [
"last 1 Chrome version",
"last 1 Firefox version",
"last 2 Edge major versions",
"last 2 Safari major versions",
"last 2 iOS major versions",
"Firefox ESR",
"not IE 9-10 ",
"not IE 11 "
]
}

View File

@ -38,7 +38,7 @@ const routes: Routes = [
];
@NgModule({
imports: [RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload', relativeLinkResolution: 'legacy' })],
imports: [RouterModule.forRoot(routes, { onSameUrlNavigation: 'reload' })],
exports: [RouterModule],
})
export class AppRoutingModule {}

View File

@ -4,7 +4,7 @@ import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MarkdownModule } from 'ngx-markdown';
import { MARKED_OPTIONS, MarkdownModule } from 'ngx-markdown';
import { AngularFireModule } from '@angular/fire/compat';
import { FirebaseConfig } from './constants';
@ -82,8 +82,6 @@ export function markedOptionsFactory(): MarkedOptions {
gfm: true,
breaks: false,
pedantic: false,
smartLists: true,
smartypants: false,
};
}
@ -119,7 +117,7 @@ export function markedOptionsFactory(): MarkedOptions {
MarkdownModule.forRoot({
markedOptions: {
provide: MarkedOptions,
provide: MARKED_OPTIONS,
useFactory: markedOptionsFactory,
},
}),

View File

@ -1,4 +1,4 @@
import { PreloadedState, Store, createStore } from 'redux';
import { Store, createStore } from 'redux';
import { BehaviorSubject, Observable } from 'rxjs';
import { distinctUntilChanged, map } from 'rxjs/operators';
@ -18,7 +18,7 @@ class StateService<TState, TAction extends { type: string }> {
protected constructor(reducer: (state: TState, action: TAction) => TState, initialState: TState) {
this.store = createStore(
reducer,
initialState as PreloadedState<TState>, // this cast is required by Redux's typings, it should have no impact
initialState as any, // this cast is required by Redux's typings, it should have no impact
undefined // in the future, we may want to add some middleware to the Redux stores. that goes here!
);

View File

@ -33,6 +33,6 @@
overflow-y: auto;
height: calc(80vh - 195px);
}
.mat-dialog-content {
.mat-mdc-dialog-content {
padding: 0 !important;
}

View File

@ -12,8 +12,8 @@
</mat-form-field>
<mat-form-field class="note-xrefs">
<mat-label>Cross References</mat-label>
<mat-chip-list #chipList aria-label="Cross References">
<mat-chip
<mat-chip-grid #chipList aria-label="Cross References">
<mat-chip-row
*ngFor="let ref of references"
[selectable]="selectable"
[removable]="removable"
@ -21,14 +21,14 @@
>
{{ ref }}
<mat-icon matChipRemove *ngIf="removable">cancel</mat-icon>
</mat-chip>
</mat-chip-row>
<input
[matChipInputFor]="chipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
[matChipInputAddOnBlur]="addOnBlur"
(matChipInputTokenEnd)="add($event)"
/>
</mat-chip-list>
</mat-chip-grid>
</mat-form-field>
<mat-form-field class="note-content">

View File

@ -12,7 +12,7 @@
overflow: hidden;
}
.mat-form-field {
.mat-mdc-form-field {
display: block;
}

View File

@ -12,7 +12,7 @@
font-size: 1.5rem;
}
.mat-form-field {
.mat-mdc-form-field {
display: block;
}

View File

@ -13,7 +13,7 @@
overflow: hidden;
}
.mat-form-field {
.mat-mdc-form-field {
display: block;
}
@ -22,7 +22,7 @@
padding-top: 12px;
}
.mat-dialog-content {
.mat-mdc-dialog-content {
min-width: 60vw;
min-height: 20vh;
max-height: 80vh;

View File

@ -114,9 +114,8 @@
min="12"
step="2"
thumbLabel="true"
(change)="cardFontSizeChanged($event)"
[(ngModel)]="cardFontSize"
>
#ngSlider><input matSliderThumb (change)="cardFontSizeChanged({source: ngSliderThumb, parent: ngSlider, value: ngSliderThumb.value})" #ngSliderThumb="matSliderThumb" />
</mat-slider>
</div>
</mat-nav-list>

View File

@ -12,7 +12,7 @@
</mat-toolbar>
<div class="page-content">
<ng-container *ngIf="notes$ | async as notes; else nonotes">
<mat-card *ngFor="let item of notes">
<mat-card appearance="outlined" *ngFor="let item of notes">
<app-note-card [cardItem]="item" [inSearch]="false"></app-note-card>
</mat-card>
</ng-container>

View File

@ -1,3 +1,5 @@
/* TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version. */
mat-card {
max-width: 800px;
margin: 1.5rem auto;

View File

@ -6,7 +6,7 @@
</mat-toolbar>
<div class="page-content">
<ng-container *ngIf="savedPages$ | async as pages; else nopages">
<mat-card *ngFor="let page of pages">
<mat-card appearance="outlined" *ngFor="let page of pages">
<app-saved-page-card [savedPage]="page"></app-saved-page-card>
</mat-card>
</ng-container>

View File

@ -1,3 +1,5 @@
/* TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version. */
mat-card {
max-width: 800px;
margin: 1.5rem auto;

View File

@ -36,7 +36,7 @@
</mat-toolbar>
<div class="search-content">
<ng-container *ngIf="cards$ | async as cards; else nocards">
<mat-card *ngFor="let item of cards">
<mat-card appearance="outlined" *ngFor="let item of cards">
<app-passage-card
*ngIf="isPassage(item)"
[cardItem]="item"

View File

@ -1,3 +1,5 @@
/* TODO(mdc-migration): The following rule targets internal classes of card that may no longer apply for the MDC version. */
mat-card {
max-width: 800px;
margin: 1.5rem auto;

View File

@ -515,7 +515,7 @@ export class AppService extends createStateService(reducer, initialState) {
for (let j = 0; j < chapters.length; j++) {
const vss: BibleVerse[] = [];
let start: number;
let end: string | number;
let end: number;
// figure out the start verse.
if (j === 0) {
@ -999,7 +999,6 @@ export class AppService extends createStateService(reducer, initialState) {
// FindSharedSet takes an array of reference arrays, and figures out
// which references are shared by all arrays/sets, then returns a single
// array of references.
// eslint-disable-next-line @typescript-eslint/prefer-for-of
for (let j = 0; j < referenceSet.length; j++) {
const refs = referenceSet[j];
results[j] = []; // initialize inner array

View File

@ -208,7 +208,6 @@ export class StorageService extends SubscriberBase {
},
// error
() => {
// eslint-disable-next-line @typescript-eslint/quotes
this.appService.dispatchError(`Something went wrong and the Settings weren't saved. :(`);
}
);
@ -235,7 +234,6 @@ export class StorageService extends SubscriberBase {
},
// error
() => {
// eslint-disable-next-line @typescript-eslint/quotes
this.appService.dispatchError(`Something went wrong and the Page wasn't saved. :(`);
}
);
@ -262,7 +260,6 @@ export class StorageService extends SubscriberBase {
},
// error
() => {
// eslint-disable-next-line @typescript-eslint/quotes
this.appService.dispatchError(`Something went wrong and the Note wasn't saved. :(`);
}
);
@ -294,7 +291,6 @@ export class StorageService extends SubscriberBase {
},
// error
() => {
// eslint-disable-next-line @typescript-eslint/quotes
this.appService.dispatchError(`Something went wrong and the current cards weren't saved. :(`);
}
);

View File

@ -1,7 +1,5 @@
// Custom Theming for Angular Material
@use '@angular/material' as mat;
// For more information: https://material.angular.io/guide/theming
@import "@angular/material/theming";
// Plus imports for other components in your app.
@import "./styles/app.scss";

View File

@ -117,7 +117,7 @@ a {
}
.mat-h1,
.mat-headline,
.mat-headline-5,
.mat-typography h1 {
font-weight: bold !important;
font-family: var(--card-heading-font-family) !important;
@ -126,7 +126,7 @@ a {
}
.mat-h2,
.mat-title,
.mat-headline-6,
.mat-typography h2 {
font-weight: bold !important;
font-family: var(--card-heading-font-family) !important;
@ -135,7 +135,7 @@ a {
}
.mat-h3,
.mat-subheading-2,
.mat-subtitle-1,
.mat-typography h3 {
font-weight: bold !important;
font-family: var(--card-heading-font-family) !important;
@ -144,7 +144,7 @@ a {
}
.mat-h4,
.mat-subheading-1,
.mat-body-1,
.mat-typography h4 {
font-weight: bold !important;
font-family: var(--card-heading-font-family) !important;
@ -175,25 +175,26 @@ p {
// overrides
/* TODO(mdc-migration): The following rule targets internal classes of button that may no longer apply for the MDC version.*/
.mat-button-focus-overlay {
background-color: transparent !important;
}
.mat-icon-button {
.mat-mdc-icon-button {
line-height: inherit !important;
}
.mat-dialog-container {
.mat-mdc-dialog-container {
padding: 0 !important;
overflow: hidden !important;
}
.mat-dialog-content {
.mat-mdc-dialog-content {
padding: 0 12px !important;
margin: 0 !important;
}
.mat-dialog-title {
.mat-mdc-dialog-title {
margin: 0 0 2px !important;
}
.mat-dialog-actions {
.mat-mdc-dialog-actions {
margin-bottom: 0px;
justify-content: end;
}
@ -204,7 +205,7 @@ p {
max-height: 95vh !important;
}
.mat-dialog-content {
.mat-mdc-dialog-content {
max-height: 95vh !important;
}
}

View File

@ -1,5 +1,3 @@
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
import 'zone.js/testing';
import { getTestBed } from '@angular/core/testing';
import {
@ -7,19 +5,8 @@ import {
platformBrowserDynamicTesting
} from '@angular/platform-browser-dynamic/testing';
declare const require: {
context(path: string, deep?: boolean, filter?: RegExp): {
keys(): string[];
<T>(id: string): T;
};
};
// First, initialize the Angular testing environment.
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
// Then we find all the tests.
const context = require.context('./', true, /\.spec\.ts$/);
// And load the modules.
context.keys().map(context);

View File

@ -11,7 +11,8 @@
"experimentalDecorators": true,
"moduleResolution": "node",
"importHelpers": true,
"target": "es2020",
"useDefineForClassFields": false,
"target": "es2022",
"module": "ESNext",
"lib": ["es2018", "dom"]
}