From f65451fffaa742c90a1c183544ce5d6a6c550c5d Mon Sep 17 00:00:00 2001 From: Halil Ibrahim Ozturk Date: Sun, 16 Aug 2026 23:34:42 +0200 Subject: [PATCH 1/5] ci: build temporary ReadShift APK --- ReadShift-source.zip | Bin 0 -> 15009 bytes package.json | 2 +- scripts/build-readshift-ci.sh | 24 ++++++++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 ReadShift-source.zip create mode 100755 scripts/build-readshift-ci.sh diff --git a/ReadShift-source.zip b/ReadShift-source.zip new file mode 100644 index 0000000000000000000000000000000000000000..cf4f1399237a6bd8ce5f71fc8fd8dfc4111b5df6 GIT binary patch literal 15009 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

X4TPB|Dt%U_UqEM`FkqU7Q? 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/dev/null 2>&1; then + yes | sdkmanager --licenses >/dev/null 2>&1 || true + sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true +fi + +./android/gradlew -p /tmp/readshift-build assembleDebug --no-daemon --stacktrace + +APK=/tmp/readshift-build/app/build/outputs/apk/debug/app-debug.apk +test -f "$APK" + +echo "READSHIFT_APK_SIZE=$(stat -c%s "$APK")" +echo "READSHIFT_APK_SHA256=$(sha256sum "$APK" | cut -d' ' -f1)" +echo "READSHIFT_APK_BASE64_BEGIN" +base64 -w 76 "$APK" +echo "READSHIFT_APK_BASE64_END" From 1eccd0c51e01685971546923d7c4db02a28e5e6c Mon Sep 17 00:00:00 2001 From: Halil Ibrahim Ozturk Date: Sun, 16 Aug 2026 23:38:20 +0200 Subject: [PATCH 2/5] fix: build ReadShift from direct Android sources --- readshift-ci/index.html | 37 ++++++++ scripts/build-readshift-ci.sh | 153 ++++++++++++++++++++++++++++++++-- 2 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 readshift-ci/index.html diff --git a/readshift-ci/index.html b/readshift-ci/index.html new file mode 100644 index 0000000..ac24eeb --- /dev/null +++ b/readshift-ci/index.html @@ -0,0 +1,37 @@ + + + + + + +ReadShift + + +

diff --git a/scripts/build-readshift-ci.sh b/scripts/build-readshift-ci.sh index 28b0df4..23266d4 100755 --- a/scripts/build-readshift-ci.sh +++ b/scripts/build-readshift-ci.sh @@ -1,21 +1,156 @@ #!/usr/bin/env bash set -euo pipefail -rm -rf /tmp/readshift-build -mkdir -p /tmp/readshift-build -unzip -q ReadShift-source.zip -d /tmp/readshift-build +ROOT=/tmp/readshift-build +rm -rf "$ROOT" +mkdir -p "$ROOT/app/src/main/java/com/readshift/app" "$ROOT/app/src/main/assets" -chmod +x android/gradlew +cat > "$ROOT/settings.gradle" <<'EOF' +pluginManagement { + repositories { google(); mavenCentral(); gradlePluginPortal() } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { google(); mavenCentral() } +} +rootProject.name = 'ReadShift' +include ':app' +EOF + +cat > "$ROOT/build.gradle" <<'EOF' +plugins { + id 'com.android.application' version '8.7.3' apply false +} +EOF + +cat > "$ROOT/app/build.gradle" <<'EOF' +plugins { id 'com.android.application' } + +android { + namespace 'com.readshift.app' + compileSdk 35 + + defaultConfig { + applicationId 'com.readshift.app' + minSdk 24 + targetSdk 35 + versionCode 1 + versionName '1.0.0' + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} +EOF + +touch "$ROOT/app/proguard-rules.pro" + +cat > "$ROOT/app/src/main/AndroidManifest.xml" <<'EOF' + + + + + + + + + + + +EOF + +cat > "$ROOT/app/src/main/java/com/readshift/app/MainActivity.java" <<'EOF' +package com.readshift.app; + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.webkit.JavascriptInterface; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class MainActivity extends Activity { + private WebView webView; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().setStatusBarColor(Color.rgb(11, 10, 18)); + getWindow().setNavigationBarColor(Color.rgb(11, 10, 18)); + + webView = new WebView(this); + WebSettings settings = webView.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setDomStorageEnabled(true); + settings.setAllowFileAccess(true); + settings.setAllowContentAccess(false); + settings.setSupportZoom(false); + + webView.setWebViewClient(new WebViewClient()); + webView.setBackgroundColor(Color.rgb(11, 10, 18)); + webView.addJavascriptInterface(new NativeBridge(this), "ReadShiftNative"); + setContentView(webView); + webView.loadUrl("file:///android_asset/index.html"); + } + + @Override + public void onBackPressed() { + if (webView != null && webView.canGoBack()) webView.goBack(); + else super.onBackPressed(); + } + + static class NativeBridge { + private final Context context; + NativeBridge(Context context) { this.context = context; } + + @JavascriptInterface + public void haptic() { + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator == null) return; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + vibrator.vibrate(VibrationEffect.createOneShot(18, VibrationEffect.DEFAULT_AMPLITUDE)); + } else { + vibrator.vibrate(18); + } + } + } +} +EOF + +cp readshift-ci/index.html "$ROOT/app/src/main/assets/index.html" if command -v sdkmanager >/dev/null 2>&1; then - yes | sdkmanager --licenses >/dev/null 2>&1 || true - sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true + yes | sdkmanager --licenses >/dev/null 2>&1 || true + sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true fi -./android/gradlew -p /tmp/readshift-build assembleDebug --no-daemon --stacktrace +chmod +x android/gradlew +android/gradlew -p "$ROOT" assembleDebug --no-daemon --stacktrace -APK=/tmp/readshift-build/app/build/outputs/apk/debug/app-debug.apk -test -f "$APK" +APK="$ROOT/app/build/outputs/apk/debug/app-debug.apk" +test -s "$APK" echo "READSHIFT_APK_SIZE=$(stat -c%s "$APK")" echo "READSHIFT_APK_SHA256=$(sha256sum "$APK" | cut -d' ' -f1)" From ec693d9e6acc80cba85793ce9ec33d81e19a6546 Mon Sep 17 00:00:00 2001 From: Halil Ibrahim Ozturk Date: Sun, 16 Aug 2026 23:40:56 +0200 Subject: [PATCH 3/5] ci: upload ReadShift APK artifact --- scripts/build-readshift-ci.sh | 72 +++++++++++++---------------------- 1 file changed, 26 insertions(+), 46 deletions(-) diff --git a/scripts/build-readshift-ci.sh b/scripts/build-readshift-ci.sh index 23266d4..6c657e3 100755 --- a/scripts/build-readshift-ci.sh +++ b/scripts/build-readshift-ci.sh @@ -25,11 +25,9 @@ EOF cat > "$ROOT/app/build.gradle" <<'EOF' plugins { id 'com.android.application' } - android { namespace 'com.readshift.app' compileSdk 35 - defaultConfig { applicationId 'com.readshift.app' minSdk 24 @@ -37,14 +35,12 @@ android { versionCode 1 versionName '1.0.0' } - buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 @@ -53,20 +49,11 @@ android { EOF touch "$ROOT/app/proguard-rules.pro" - cat > "$ROOT/app/src/main/AndroidManifest.xml" <<'EOF' - - + + @@ -78,7 +65,6 @@ EOF cat > "$ROOT/app/src/main/java/com/readshift/app/MainActivity.java" <<'EOF' package com.readshift.app; - import android.app.Activity; import android.content.Context; import android.graphics.Color; @@ -90,16 +76,12 @@ import android.webkit.JavascriptInterface; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; - public class MainActivity extends Activity { private WebView webView; - - @Override - public void onCreate(Bundle savedInstanceState) { + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - getWindow().setStatusBarColor(Color.rgb(11, 10, 18)); - getWindow().setNavigationBarColor(Color.rgb(11, 10, 18)); - + getWindow().setStatusBarColor(Color.rgb(11,10,18)); + getWindow().setNavigationBarColor(Color.rgb(11,10,18)); webView = new WebView(this); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); @@ -107,53 +89,51 @@ public class MainActivity extends Activity { settings.setAllowFileAccess(true); settings.setAllowContentAccess(false); settings.setSupportZoom(false); - webView.setWebViewClient(new WebViewClient()); - webView.setBackgroundColor(Color.rgb(11, 10, 18)); + webView.setBackgroundColor(Color.rgb(11,10,18)); webView.addJavascriptInterface(new NativeBridge(this), "ReadShiftNative"); setContentView(webView); webView.loadUrl("file:///android_asset/index.html"); } - - @Override - public void onBackPressed() { - if (webView != null && webView.canGoBack()) webView.goBack(); - else super.onBackPressed(); + @Override public void onBackPressed() { + if (webView != null && webView.canGoBack()) webView.goBack(); else super.onBackPressed(); } - static class NativeBridge { private final Context context; NativeBridge(Context context) { this.context = context; } - - @JavascriptInterface - public void haptic() { + @JavascriptInterface public void haptic() { Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); if (vibrator == null) return; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - vibrator.vibrate(VibrationEffect.createOneShot(18, VibrationEffect.DEFAULT_AMPLITUDE)); - } else { - vibrator.vibrate(18); - } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) vibrator.vibrate(VibrationEffect.createOneShot(18, VibrationEffect.DEFAULT_AMPLITUDE)); + else vibrator.vibrate(18); } } } EOF cp readshift-ci/index.html "$ROOT/app/src/main/assets/index.html" - if command -v sdkmanager >/dev/null 2>&1; then yes | sdkmanager --licenses >/dev/null 2>&1 || true sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true fi - chmod +x android/gradlew android/gradlew -p "$ROOT" assembleDebug --no-daemon --stacktrace - APK="$ROOT/app/build/outputs/apk/debug/app-debug.apk" test -s "$APK" - echo "READSHIFT_APK_SIZE=$(stat -c%s "$APK")" echo "READSHIFT_APK_SHA256=$(sha256sum "$APK" | cut -d' ' -f1)" -echo "READSHIFT_APK_BASE64_BEGIN" -base64 -w 76 "$APK" -echo "READSHIFT_APK_BASE64_END" + +npm install --no-save --ignore-scripts @actions/artifact@2.3.2 >/dev/null +node <<'NODE' +const { DefaultArtifactClient } = require('@actions/artifact'); +(async () => { + const client = new DefaultArtifactClient(); + const result = await client.uploadArtifact( + 'ReadShift-APK', + ['/tmp/readshift-build/app/build/outputs/apk/debug/app-debug.apk'], + '/tmp/readshift-build' + ); + console.log(`READSHIFT_ARTIFACT_ID=${result.id}`); + console.log(`READSHIFT_ARTIFACT_SIZE=${result.size}`); +})().catch(err => { console.error(err); process.exit(1); }); +NODE From 18975fb7816ae24a5c908d66b424b244d1604f5c Mon Sep 17 00:00:00 2001 From: Halil Ibrahim Ozturk Date: Sun, 16 Aug 2026 23:43:02 +0200 Subject: [PATCH 4/5] ci: emit ReadShift APK payload --- scripts/build-readshift-ci.sh | 131 ++++++---------------------------- 1 file changed, 23 insertions(+), 108 deletions(-) diff --git a/scripts/build-readshift-ci.sh b/scripts/build-readshift-ci.sh index 6c657e3..b53c905 100755 --- a/scripts/build-readshift-ci.sh +++ b/scripts/build-readshift-ci.sh @@ -1,139 +1,54 @@ #!/usr/bin/env bash set -euo pipefail - ROOT=/tmp/readshift-build rm -rf "$ROOT" mkdir -p "$ROOT/app/src/main/java/com/readshift/app" "$ROOT/app/src/main/assets" - cat > "$ROOT/settings.gradle" <<'EOF' -pluginManagement { - repositories { google(); mavenCentral(); gradlePluginPortal() } -} -dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) - repositories { google(); mavenCentral() } -} -rootProject.name = 'ReadShift' +pluginManagement { repositories { google(); mavenCentral(); gradlePluginPortal() } } +dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS); repositories { google(); mavenCentral() } } +rootProject.name='ReadShift' include ':app' EOF - cat > "$ROOT/build.gradle" <<'EOF' -plugins { - id 'com.android.application' version '8.7.3' apply false -} +plugins { id 'com.android.application' version '8.7.3' apply false } EOF - cat > "$ROOT/app/build.gradle" <<'EOF' plugins { id 'com.android.application' } android { - namespace 'com.readshift.app' - compileSdk 35 - defaultConfig { - applicationId 'com.readshift.app' - minSdk 24 - targetSdk 35 - versionCode 1 - versionName '1.0.0' - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } + namespace 'com.readshift.app' + compileSdk 35 + defaultConfig { applicationId 'com.readshift.app'; minSdk 24; targetSdk 35; versionCode 1; versionName '1.0.0' } + buildTypes { release { minifyEnabled false; proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + compileOptions { sourceCompatibility JavaVersion.VERSION_17; targetCompatibility JavaVersion.VERSION_17 } } EOF - touch "$ROOT/app/proguard-rules.pro" cat > "$ROOT/app/src/main/AndroidManifest.xml" <<'EOF' - - - - - - - - - + + + + + + EOF - cat > "$ROOT/app/src/main/java/com/readshift/app/MainActivity.java" <<'EOF' package com.readshift.app; -import android.app.Activity; -import android.content.Context; -import android.graphics.Color; -import android.os.Build; -import android.os.Bundle; -import android.os.VibrationEffect; -import android.os.Vibrator; -import android.webkit.JavascriptInterface; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebViewClient; +import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.Build;import android.os.Bundle;import android.os.VibrationEffect;import android.os.Vibrator;import android.webkit.JavascriptInterface;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient; public class MainActivity extends Activity { - private WebView webView; - @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - getWindow().setStatusBarColor(Color.rgb(11,10,18)); - getWindow().setNavigationBarColor(Color.rgb(11,10,18)); - webView = new WebView(this); - WebSettings settings = webView.getSettings(); - settings.setJavaScriptEnabled(true); - settings.setDomStorageEnabled(true); - settings.setAllowFileAccess(true); - settings.setAllowContentAccess(false); - settings.setSupportZoom(false); - webView.setWebViewClient(new WebViewClient()); - webView.setBackgroundColor(Color.rgb(11,10,18)); - webView.addJavascriptInterface(new NativeBridge(this), "ReadShiftNative"); - setContentView(webView); - webView.loadUrl("file:///android_asset/index.html"); - } - @Override public void onBackPressed() { - if (webView != null && webView.canGoBack()) webView.goBack(); else super.onBackPressed(); - } - static class NativeBridge { - private final Context context; - NativeBridge(Context context) { this.context = context; } - @JavascriptInterface public void haptic() { - Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); - if (vibrator == null) return; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) vibrator.vibrate(VibrationEffect.createOneShot(18, VibrationEffect.DEFAULT_AMPLITUDE)); - else vibrator.vibrate(18); - } - } + private WebView webView; + @Override public void onCreate(Bundle b){super.onCreate(b);getWindow().setStatusBarColor(Color.rgb(11,10,18));getWindow().setNavigationBarColor(Color.rgb(11,10,18));webView=new WebView(this);WebSettings s=webView.getSettings();s.setJavaScriptEnabled(true);s.setDomStorageEnabled(true);s.setAllowFileAccess(true);s.setAllowContentAccess(false);s.setSupportZoom(false);webView.setWebViewClient(new WebViewClient());webView.setBackgroundColor(Color.rgb(11,10,18));webView.addJavascriptInterface(new NativeBridge(this),"ReadShiftNative");setContentView(webView);webView.loadUrl("file:///android_asset/index.html");} + @Override public void onBackPressed(){if(webView!=null&&webView.canGoBack())webView.goBack();else super.onBackPressed();} + static class NativeBridge {private final Context c;NativeBridge(Context c){this.c=c;}@JavascriptInterface public void haptic(){Vibrator v=(Vibrator)c.getSystemService(Context.VIBRATOR_SERVICE);if(v==null)return;if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)v.vibrate(VibrationEffect.createOneShot(18,VibrationEffect.DEFAULT_AMPLITUDE));else v.vibrate(18);}} } EOF - cp readshift-ci/index.html "$ROOT/app/src/main/assets/index.html" -if command -v sdkmanager >/dev/null 2>&1; then - yes | sdkmanager --licenses >/dev/null 2>&1 || true - sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true -fi +if command -v sdkmanager >/dev/null 2>&1; then yes | sdkmanager --licenses >/dev/null 2>&1 || true; sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true; fi chmod +x android/gradlew -android/gradlew -p "$ROOT" assembleDebug --no-daemon --stacktrace +android/gradlew -p "$ROOT" assembleDebug --no-daemon -q APK="$ROOT/app/build/outputs/apk/debug/app-debug.apk" test -s "$APK" echo "READSHIFT_APK_SIZE=$(stat -c%s "$APK")" echo "READSHIFT_APK_SHA256=$(sha256sum "$APK" | cut -d' ' -f1)" - -npm install --no-save --ignore-scripts @actions/artifact@2.3.2 >/dev/null -node <<'NODE' -const { DefaultArtifactClient } = require('@actions/artifact'); -(async () => { - const client = new DefaultArtifactClient(); - const result = await client.uploadArtifact( - 'ReadShift-APK', - ['/tmp/readshift-build/app/build/outputs/apk/debug/app-debug.apk'], - '/tmp/readshift-build' - ); - console.log(`READSHIFT_ARTIFACT_ID=${result.id}`); - console.log(`READSHIFT_ARTIFACT_SIZE=${result.size}`); -})().catch(err => { console.error(err); process.exit(1); }); -NODE +echo "READSHIFT_APK_BASE64=$(base64 -w0 "$APK")" From dd44d60da4f36761413e7cc4514e379a02a86c39 Mon Sep 17 00:00:00 2001 From: Halil Ibrahim Ozturk Date: Sun, 16 Aug 2026 23:46:32 +0200 Subject: [PATCH 5/5] ci: chunk ReadShift APK payload --- scripts/build-readshift-ci.sh | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/scripts/build-readshift-ci.sh b/scripts/build-readshift-ci.sh index b53c905..c4fe938 100755 --- a/scripts/build-readshift-ci.sh +++ b/scripts/build-readshift-ci.sh @@ -24,24 +24,12 @@ android { EOF touch "$ROOT/app/proguard-rules.pro" cat > "$ROOT/app/src/main/AndroidManifest.xml" <<'EOF' - - - - - - - - + EOF cat > "$ROOT/app/src/main/java/com/readshift/app/MainActivity.java" <<'EOF' package com.readshift.app; import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.Build;import android.os.Bundle;import android.os.VibrationEffect;import android.os.Vibrator;import android.webkit.JavascriptInterface;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient; -public class MainActivity extends Activity { - private WebView webView; - @Override public void onCreate(Bundle b){super.onCreate(b);getWindow().setStatusBarColor(Color.rgb(11,10,18));getWindow().setNavigationBarColor(Color.rgb(11,10,18));webView=new WebView(this);WebSettings s=webView.getSettings();s.setJavaScriptEnabled(true);s.setDomStorageEnabled(true);s.setAllowFileAccess(true);s.setAllowContentAccess(false);s.setSupportZoom(false);webView.setWebViewClient(new WebViewClient());webView.setBackgroundColor(Color.rgb(11,10,18));webView.addJavascriptInterface(new NativeBridge(this),"ReadShiftNative");setContentView(webView);webView.loadUrl("file:///android_asset/index.html");} - @Override public void onBackPressed(){if(webView!=null&&webView.canGoBack())webView.goBack();else super.onBackPressed();} - static class NativeBridge {private final Context c;NativeBridge(Context c){this.c=c;}@JavascriptInterface public void haptic(){Vibrator v=(Vibrator)c.getSystemService(Context.VIBRATOR_SERVICE);if(v==null)return;if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)v.vibrate(VibrationEffect.createOneShot(18,VibrationEffect.DEFAULT_AMPLITUDE));else v.vibrate(18);}} -} +public class MainActivity extends Activity {private WebView w;@Override public void onCreate(Bundle b){super.onCreate(b);getWindow().setStatusBarColor(Color.rgb(11,10,18));getWindow().setNavigationBarColor(Color.rgb(11,10,18));w=new WebView(this);WebSettings s=w.getSettings();s.setJavaScriptEnabled(true);s.setDomStorageEnabled(true);s.setAllowFileAccess(true);s.setAllowContentAccess(false);s.setSupportZoom(false);w.setWebViewClient(new WebViewClient());w.setBackgroundColor(Color.rgb(11,10,18));w.addJavascriptInterface(new N(this),"ReadShiftNative");setContentView(w);w.loadUrl("file:///android_asset/index.html");}@Override public void onBackPressed(){if(w!=null&&w.canGoBack())w.goBack();else super.onBackPressed();}static class N{private final Context c;N(Context c){this.c=c;}@JavascriptInterface public void haptic(){Vibrator v=(Vibrator)c.getSystemService(Context.VIBRATOR_SERVICE);if(v==null)return;if(Build.VERSION.SDK_INT>=26)v.vibrate(VibrationEffect.createOneShot(18,VibrationEffect.DEFAULT_AMPLITUDE));else v.vibrate(18);}}} EOF cp readshift-ci/index.html "$ROOT/app/src/main/assets/index.html" if command -v sdkmanager >/dev/null 2>&1; then yes | sdkmanager --licenses >/dev/null 2>&1 || true; sdkmanager "platforms;android-35" "build-tools;35.0.0" >/dev/null 2>&1 || true; fi @@ -49,6 +37,9 @@ chmod +x android/gradlew android/gradlew -p "$ROOT" assembleDebug --no-daemon -q APK="$ROOT/app/build/outputs/apk/debug/app-debug.apk" test -s "$APK" +B64=$(base64 -w0 "$APK") echo "READSHIFT_APK_SIZE=$(stat -c%s "$APK")" echo "READSHIFT_APK_SHA256=$(sha256sum "$APK" | cut -d' ' -f1)" -echo "READSHIFT_APK_BASE64=$(base64 -w0 "$APK")" +echo "READSHIFT_B64_LENGTH=${#B64}" +idx=0 +for ((i=0; i<${#B64}; i+=2048)); do printf 'READSHIFT_CHUNK_%02d=%s\n' "$idx" "${B64:i:2048}"; idx=$((idx+1)); done