diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4670ab2..d0dd111 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,6 +19,8 @@ jobs: build: name: Build runs-on: ubuntu-latest + permissions: + contents: write steps: - name: Checkout @@ -31,7 +33,7 @@ jobs: java-version: '8' - name: Cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.gradle/caches/ @@ -42,28 +44,44 @@ jobs: run: | ./gradlew aR --no-daemon cp -f app/build/outputs/apk/release/app-release.apk docs/open/TouchSetupLogin.apk - echo "version=$(grep versionName app/build.gradle | awk '{print $2}' | tr -d \")" >> $GITHUB_ENV - echo "commit=$(echo ${{ github.sha }} | cut -c-7)" >> $GITHUB_ENV + { + echo "version=v$(grep versionName app/build.gradle | awk '{print $2}' | tr -d \")" + echo "commit=$(echo ${{ github.sha }} | cut -c-7)" + } >> $GITHUB_ENV - name: Upload APK uses: actions/upload-artifact@v4 with: - name: NovaDirectInstaller(v${{ env.version }}@${{ env.commit }}) + name: NovaDirectInstaller(${{ env.version }}@${{ env.commit }}) path: app/build/outputs/apk/release/app-release.apk - - name: Push APK + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v6 if: github.event.inputs.release == 'true' + with: + gpg_private_key: ${{ secrets.GPG_KEY }} + passphrase: ${{ secrets.GPG_PASS }} + fingerprint: ${{ vars.GPG_FINGERPRINT }} + trust_level: 5 + git_user_signingkey: true + git_commit_gpgsign: true + + - name: Push APK uses: stefanzweifel/git-auto-commit-action@v5 + if: github.event.inputs.release == 'true' with: - commit_message: v${{ env.version }} + commit_message: ${{ env.version }} + commit_user_name: ${{ vars.COMMITTER_NAME }} + commit_user_email: ${{ vars.COMMITTER_EMAIL }} + #commit_options: '-S' file_pattern: docs/open/TouchSetupLogin.apk - tagging_message: v${{ env.version }} + tagging_message: ${{ env.version }} - name: Release uses: softprops/action-gh-release@v1 if: github.event.inputs.release == 'true' with: - tag_name: v${{ env.version }} + tag_name: ${{ env.version }} draft: true prerelease: false files: app/build/outputs/apk/release/app-release.apk diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index d37199d..e7d8d7e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1 +1,2 @@ --keep class jp.co.benesse.dcha.dchaservice.IDchaService \ No newline at end of file +-keep class jp.co.benesse.dcha.dchaservice.IDchaService +-keep class jp.co.benesse.touch.setuplogin.** \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 233d47b..d94b1db 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -120,7 +120,8 @@ android:icon="@android:mipmap/sym_def_app_icon" android:label="BRPの有効化" android:launchMode="singleInstance" - android:noHistory="true"> + android:noHistory="true" + android:theme="@android:style/ThemeOverlay.Material.Dialog.Alert"> diff --git a/app/src/main/java/jp/co/benesse/touch/setuplogin/BypassActivity.java b/app/src/main/java/jp/co/benesse/touch/setuplogin/BypassActivity.java index 714fb5b..fcb7b0b 100644 --- a/app/src/main/java/jp/co/benesse/touch/setuplogin/BypassActivity.java +++ b/app/src/main/java/jp/co/benesse/touch/setuplogin/BypassActivity.java @@ -14,7 +14,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.widget.Toast; import java.io.File; import java.io.FileOutputStream; @@ -29,7 +28,6 @@ public class BypassActivity extends Activity { public void onCreate(Bundle bundle) { super.onCreate(bundle); run(this); - Toast.makeText(this, "実行しました", Toast.LENGTH_SHORT).show(); finishAndRemoveTask(); } diff --git a/app/src/main/java/jp/co/benesse/touch/setuplogin/LoginSettingActivity.java b/app/src/main/java/jp/co/benesse/touch/setuplogin/LoginSettingActivity.java index 8c734b6..2462541 100644 --- a/app/src/main/java/jp/co/benesse/touch/setuplogin/LoginSettingActivity.java +++ b/app/src/main/java/jp/co/benesse/touch/setuplogin/LoginSettingActivity.java @@ -20,8 +20,11 @@ public class LoginSettingActivity extends Activity { IDchaService mDchaService; - public void onBackPressed() { - // バックキーを無効化 + public void ofDisable(Class cls) { + getPackageManager().setComponentEnabledSetting(new ComponentName(this, cls), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); + } + public void ofEnable(Class cls) { + getPackageManager().setComponentEnabledSetting(new ComponentName(this, cls), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); } public void onCreate(Bundle savedInstanceState) { @@ -41,12 +44,12 @@ public void onCreate(Bundle savedInstanceState) { final String LAUNCHER3 = "com.android.launcher3"; final String NOVA_PACKAGE = "com.teslacoilsw.launcher"; final String LOCAL_PATH = "/storage/emulated/0/Download/"; - final String SD_PATH = "/storage/sdcard1/"; + final String SD_PATH = "/storage/sdcard1/APK/"; final String CT3 = "TAB-A03-BR3"; final String CTZ = "TAB-A05-BA1"; // SDカードのルートに NovaLauncher のAPKを置く(CT3とCTX/Zで分ける) final String NOVA6_SD_PATH = SD_PATH + "NovaLauncher_6.2.19.apk"; - final String NOVA7_SD_PATH = SD_PATH + "NovaLauncher_7.0.57.apk"; + final String NOVA7_SD_PATH = SD_PATH + "NovaLauncher_7.0.58.apk"; final String NOVA_LOCAL_PATH = LOCAL_PATH + "NovaLauncher.apk"; // Googleサービス final String[] GApps = { @@ -77,12 +80,12 @@ public void onServiceConnected(ComponentName componentName, IBinder iBinder) { // CT3 のみ直接インストール if (MODEL.equals(CT3)) { // アクティビティを無効化 - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DchaStateChanger.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DevelopmentOptions.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DeviceAdminReceiver.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); + ofDisable(DchaStateChanger.class); + ofDisable(DevelopmentOptions.class); + ofDisable(DeviceAdminReceiver.class); // 有効化 - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DchaStateChanger3.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DevelopmentOptions3.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); + ofEnable(DchaStateChanger3.class); + ofEnable(DevelopmentOptions3.class); // APKをインストール mDchaService.installApp(NOVA6_SD_PATH, INSTALL_FLAG); @@ -98,8 +101,12 @@ public void onServiceConnected(ComponentName componentName, IBinder iBinder) { // CTZ は GMS もインストール if (MODEL.equals(CTZ)) { // アクティビティを無効化 - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DchaCopyFile.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DchaInstallApp.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); + ofDisable(DchaCopyFile.class); + ofDisable(DchaInstallApp.class); + ofDisable(DevelopmentOptions.class); + // 有効化 + ofEnable(PlayUpgradeActivity.class); + ofEnable(DchaStateReceiver.class); // DchaState を 3 にする mDchaService.setSetupStatus(DIGICHALIZED); // Googleサービス @@ -117,13 +124,9 @@ public void onServiceConnected(ComponentName componentName, IBinder iBinder) { // DchaState を 0 にする if (!MODEL.equals(CTZ)) { mDchaService.setSetupStatus(UNDIGICHALIZE); - } else { - // BRP enabler - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), PlayUpgradeActivity.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), DchaStateReceiver.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); } // このアクティビティを無効化 - getPackageManager().setComponentEnabledSetting(new ComponentName(getApplicationContext(), LoginSettingActivity.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); + ofDisable(LoginSettingActivity.class); // 再起動 mDchaService.rebootPad(REBOOT_DEVICE, null); } catch (RemoteException ignored) { @@ -135,4 +138,4 @@ public void onServiceDisconnected(ComponentName componentName) { } }, BIND_ADJUST_WITH_ACTIVITY); } -} +} \ No newline at end of file diff --git a/app/src/main/java/jp/co/benesse/touch/setuplogin/PlayUpgradeActivity.java b/app/src/main/java/jp/co/benesse/touch/setuplogin/PlayUpgradeActivity.java index 7f060a2..8b52119 100644 --- a/app/src/main/java/jp/co/benesse/touch/setuplogin/PlayUpgradeActivity.java +++ b/app/src/main/java/jp/co/benesse/touch/setuplogin/PlayUpgradeActivity.java @@ -3,7 +3,9 @@ import static android.content.pm.PackageManager.*; import android.app.Activity; +import android.app.AlertDialog; import android.content.ComponentName; +import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; @@ -17,36 +19,63 @@ public class PlayUpgradeActivity extends Activity { private static final int GMS_MIN_VER = 18719037; private static final int FINSKY_MIN_VER = 82195010; + public void makeToast(String msg) { + Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); + } + + public void ofDisable(Class cls) { + getPackageManager().setComponentEnabledSetting(new ComponentName(this, cls), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); + } + public void ofEnable(Class cls) { + getPackageManager().setComponentEnabledSetting(new ComponentName(this, cls), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); + } + @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); - finishAndRemoveTask(); + Intent intent; try { final int GMS_VER = getPackageManager().getPackageInfo(GmsCore, 0).versionCode; final int FINSKY_VER = getPackageManager().getPackageInfo(Phonesky, 0).versionCode; if (GMS_VER > GMS_MIN_VER && FINSKY_VER > FINSKY_MIN_VER) { - // Enable BypassRevokePermission - getPackageManager().setComponentEnabledSetting(new ComponentName(this, BypassActivity.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(this, BypassService.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(this, DynamicReceiver.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(this, BootCompletedReceiver.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - getPackageManager().setComponentEnabledSetting(new ComponentName(this, PackageReceiver.class), COMPONENT_ENABLED_STATE_ENABLED, DONT_KILL_APP); - // Disable this Activity - getPackageManager().setComponentEnabledSetting(new ComponentName(this, getClass()), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); - // Disable DchaStateReceiver - getPackageManager().setComponentEnabledSetting(new ComponentName(this, DchaStateReceiver.class), COMPONENT_ENABLED_STATE_DISABLED, DONT_KILL_APP); - // Reboot - PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE); - pm.reboot(null); + new AlertDialog.Builder(this) + .setTitle(getApplicationInfo().loadLabel(getPackageManager()).toString()) + .setIcon(getPackageManager().getApplicationIcon(getPackageName())) + .setMessage("BypassRevokePermission を有効にすると大幅に利便性が向上します。\nただし、 Play ストアが正しく動作しなくなる可能性があります。\n\n続行しますか?") + .setPositiveButton("はい", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface d, int s) { + ofEnable(DevelopmentOptions.class); + // Enable BypassRevokePermission + ofEnable(BypassActivity.class); + ofEnable(BypassService.class); + ofEnable(DynamicReceiver.class); + ofEnable(BootCompletedReceiver.class); + ofEnable(PackageReceiver.class); + // Disable + ofDisable(DchaStateReceiver.class); + ofDisable(DchaStateReceiver.class); + // Reboot + ((PowerManager) getSystemService(POWER_SERVICE)).reboot(null); + } + }) + .setNegativeButton("いいえ", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface d, int s) { + finishAndRemoveTask(); + makeToast("キャンセルされました"); + } + }) + .show(); } else { + finishAndRemoveTask(); if (GMS_VER <= GMS_MIN_VER) { - Toast.makeText(this, "Play ストアから、「Google Play開発者サービス」を更新してください", Toast.LENGTH_LONG).show(); + makeToast("Play ストアから 「Google Play開発者サービス」 を更新してください"); // Require Google account - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + GmsCore))); + intent = new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + GmsCore)); } else { - Toast.makeText(this, "設定から[Play ストアのバージョン]をタップして、ストアを更新してください", Toast.LENGTH_LONG).show(); - startActivity(new Intent(Intent.ACTION_MAIN).setPackage(Phonesky)); + makeToast("設定から[Play ストアのバージョン]をタップして、ストアを更新してください"); + intent = new Intent(Intent.ACTION_MAIN).setPackage(Phonesky); } + startActivity(intent); } } catch (PackageManager.NameNotFoundException ignored) { } diff --git a/docs/HowTo.md b/docs/HowTo.md index 95816e5..4bc9b2f 100644 --- a/docs/HowTo.md +++ b/docs/HowTo.md @@ -4,7 +4,7 @@ > [!CAUTION] > このツールの使用に依って生じた損害については一切責任を負いません。 -また、 チャレンジパッド3の場合は、 通常は、 [**MTKClientを使用した方法**](//zenn.dev/s1204it/articles/16fce85441821f) を利用し、 どうしてもPC環境が無い時のみ利用して下さい。 +また、 チャレンジパッド3の場合は、 通常は [**MTKClientを使用した方法**](https://zenn.dev/s1204it/articles/16fce85441821f) を利用し、 どうしてもPC環境が無い時のみ利用して下さい。 ## 必要なもの @@ -17,18 +17,30 @@ ⒈ Nova Launcher のAPKをダウンロードします。 -チャレンジパッド**Neo** / **Next** :[**7.0.57**](https://teslacoilapps.com/tesladirect/download.pl?packageName=com.teslacoilsw.launcher&versionCode=70057) +チャレンジパッド**Neo** / **Next** :[**7.0.58**](https://teslacoilapps.com/tesladirect/download.pl?packageName=com.teslacoilsw.launcher&versionCode=70058) チャレンジパッド**3**:[**6.2.19**](https://teslacoilapps.com/tesladirect/download.pl?packageName=com.teslacoilsw.launcher&versionCode=62019) > [!IMPORTANT] > **※ Next の場合は Playストア を利用できます** 以下のZIPファイルをダウンロードし、5つのAPKを抽出してください。 -> - [**CTZ-GApps**.zip](//subcontent.s1204.me/android/CTZ-GApps.zip) +> - [**CTZ-GApps**.zip](https://subcontent.s1204.me/android/CTZ-GApps.zip) ⒉ 次のリンクを開き、 ファイルとして保存します。 [**test_environment_info.xml**](https://smiletablabo.github.io/NovaDirectInstaller/test_environment_info.xml) -⒊ SDカードの最上層に、 `test_environment_info.xml` と ダウンロードした APK をコピーします。 +⒊ SDカードの最上層に、 `test_environment_info.xml` をコピーし、 **APK** と言う名前のフォルダを作りダウンロードした APK をコピーします。 +``` +SDカードの最上層/ +├── APK +│   ├── GmsCore.apk +│   ├── GoogleCalendarSyncAdapter.apk +│   ├── GoogleContsctsSyncAdapter.apk +│   ├── GoogleServicesFramework.apk +│   ├── NovaLauncher_6.2.19.apk +│   ├── NovaLauncher_7.0.58.apk +│   └── Phonesky.apk +└── test_environment_info.xml +``` > [!WARNING] > ※ APKのファイル名は変えずにコピーしてください。 @@ -36,7 +48,7 @@ ⒌ ホーム画面の、 スタートボタンを押します。 -![](https://user-images.githubusercontent.com/52069677/164911100-959604e3-d1c9-4250-9b95-94fbb2b0de62.png) +[![](https://user-images.githubusercontent.com/52069677/164911100-959604e3-d1c9-4250-9b95-94fbb2b0de62.png)](#) ⒍ 「わかった」 を押します。 @@ -53,7 +65,7 @@ ⒏ 正常に続行すると以下のような画面が出ます。 -![](https://github.com/SmileTabLabo/NovaDirectInstaller/assets/52069677/daf59624-5e31-47f8-abe5-5990e8599e16) +[![](https://github.com/SmileTabLabo/NovaDirectInstaller/assets/52069677/daf59624-5e31-47f8-abe5-5990e8599e16)](#) **画面には触れずに** そのままお待ちください。 内部処理が終了後、 自動的に再起動されます。 @@ -64,12 +76,6 @@ これで簡易的な改造は完了です。 -ADB が使用可能な場合は、 以下のコマンドを必ず実行して下さい。 -``` -adb shell pm uninstall --user 0 jp.co.benesse.dcha.dchaservice -``` -このコマンドを実行しないと、 予期せぬタイミングでアプリやデータが全て削除される可能性が有ります。 - ## チャレンジパッドNext の例外について チャレンジパッドNext では **Google Playストア** が使用できます。 diff --git a/docs/README.md b/docs/README.md index c95b026..3616897 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,5 @@ # Nova Direct Installer -[**DchaState Changer**](//github.com/SmileTabLabo/DchaStateChanger)を使ってSDカードから[**Nova Launcher**](//novalauncher.com)をインストールするためのアプリです。 +[**DchaState Changer**](https://github.com/SmileTabLabo/DchaStateChanger)を使ってSDカードから[**Nova Launcher**](https://novalauncher.com)をインストールするためのアプリです。 [![Build](https://github.com/SmileTabLabo/DchaStateChanger/actions/workflows/build.yml/badge.svg?branch=main&event=push)](https://github.com/SmileTabLabo/NovaDirectInstaller/actions/workflows/build.yml)