2024-07-21 17:16:11 +08:00

369 lines
15 KiB
Diff

From e588ad066e470f910d44877bf506b2ecae1cbc59 Mon Sep 17 00:00:00 2001
From: Andy CrossGate Yan <GeForce8800Ultra@gmail.com>
Date: Tue, 11 Oct 2022 10:29:36 +0000
Subject: [PATCH 3/9] TrebleSettings: IMS
Change-Id: Id7a12e150d4a3dc988f8ce1a888ad88443fa0ea4
---
Android.bp | 1 +
res/values/strings.xml | 9 +
res/xml/treble_settings.xml | 13 ++
.../InstallImsApkPreferenceController.java | 203 ++++++++++++++++++
...VolteAvailabilityPreferenceController.java | 59 +++++
.../settings/treble/TrebleSettings.java | 2 +
6 files changed, 287 insertions(+)
create mode 100644 src/com/android/settings/treble/InstallImsApkPreferenceController.java
create mode 100644 src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
diff --git a/Android.bp b/Android.bp
index b5018960056..d545aecda9e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -117,6 +117,7 @@ android_library {
"org.lineageos.platform.internal",
"LineagePreferenceLib",
"vendor.lineage.fastcharge-V1.0-java",
+ "android.hidl.manager-V1.0-java",
],
plugins: ["androidx.room_room-compiler-plugin"],
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 366194bf500..ff534fe0152 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7353,6 +7353,8 @@
<string name="treble_settings_category_name_audio">Audio</string>
<!-- Display category name [CHAR LIMIT=none] -->
<string name="treble_settings_category_name_display">Display</string>
+ <!-- IMS category name [CHAR LIMIT=none] -->
+ <string name="treble_settings_category_name_ims">IMS</string>
<!-- Treble settings screen, use alternative audio policy title -->
<string name="use_alternative_audio_policy_title">Use alternative audio policy</string>
@@ -7362,6 +7364,13 @@
<string name="screen_resolution_refresh_rate_title">Screen resolution &amp; refresh rate</string>
<!-- Treble settings screen, use alternative backlight scale title -->
<string name="use_alternative_backlight_scale_title">Use alternative backlight scale</string>
+ <!-- Treble settings screen, install IMS APK title -->
+ <string name="install_ims_apk_title">Install IMS APK</string>
+ <!-- Treble settings screen, install IMS APK toasts -->
+ <string name="install_ims_apk_toast_downloading">Downloading IMS APK...</string>
+ <string name="install_ims_apk_toast_completed">IMS APK installed. Reboot required.</string>
+ <!-- Treble settings screen, override VoLTE availability title -->
+ <string name="override_volte_availability_title">Override VoLTE availability</string>
<!-- Title for setting tile leading to network and Internet settings [CHAR LIMIT=40]-->
<string name="network_dashboard_title">Network &amp; internet</string>
diff --git a/res/xml/treble_settings.xml b/res/xml/treble_settings.xml
index 336137c95f1..09e6bc5d006 100644
--- a/res/xml/treble_settings.xml
+++ b/res/xml/treble_settings.xml
@@ -32,4 +32,17 @@
</PreferenceCategory>
+ <PreferenceCategory
+ android:title="@string/treble_settings_category_name_ims">
+
+ <Preference
+ android:key="install_ims_apk"
+ android:title="@string/install_ims_apk_title" />
+
+ <SwitchPreference
+ android:key="override_volte_availability"
+ android:title="@string/override_volte_availability_title" />
+
+ </PreferenceCategory>
+
</PreferenceScreen>
diff --git a/src/com/android/settings/treble/InstallImsApkPreferenceController.java b/src/com/android/settings/treble/InstallImsApkPreferenceController.java
new file mode 100644
index 00000000000..e86884e86cd
--- /dev/null
+++ b/src/com/android/settings/treble/InstallImsApkPreferenceController.java
@@ -0,0 +1,203 @@
+package com.android.settings.treble;
+
+import android.app.DownloadManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageInstaller;
+import android.database.Cursor;
+import android.hidl.manager.V1_0.IServiceManager;
+import android.net.Uri;
+import android.os.Environment;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.SystemProperties;
+import android.util.Log;
+import android.widget.Toast;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class InstallImsApkPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceClickListener {
+
+ private static final String TAG = "TrebleSettings";
+ private static final String INSTALL_IMS_APK_KEY = "install_ims_apk";
+ private static final String[] IMS_SLOTS = {
+ "imsrild1", "imsrild2", "imsrild3",
+ "slot1", "slot2", "slot3",
+ "imsSlot1", "imsSlot2",
+ "mtkSlot1", "mtkSlot2",
+ "imsradio0", "imsradio1"
+ };
+ private static final String RO_PRODUCT_VENDOR_BRAND_PROPERTY = "ro.product.vendor.brand";
+
+ private Preference mPreference;
+ private String mImsType = "none";
+ private String mImsApkUrl = "";
+
+ public InstallImsApkPreferenceController(Context context) {
+ super(context, INSTALL_IMS_APK_KEY);
+
+ mImsType = getImsType();
+ Log.d(TAG, "IMS type = " + mImsType);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return INSTALL_IMS_APK_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mPreference = screen.findPreference(getPreferenceKey());
+
+ if (mImsType.equals("none")) {
+ mPreference.setEnabled(false);
+ } else {
+ mPreference.setOnPreferenceClickListener(this);
+ String summary = "IMS type: ";
+ switch (mImsType) {
+ case "qcom":
+ summary += "Qualcomm";
+ break;
+ case "mtk_p":
+ summary += "MediaTek P";
+ break;
+ case "mtk_q":
+ summary += "MediaTek Q";
+ break;
+ case "mtk_r+":
+ summary += "MediaTek R+";
+ break;
+ default:
+ break;
+ }
+ mPreference.setSummary(summary);
+ }
+
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public boolean onPreferenceClick(Preference preference) {
+ switch (mImsType) {
+ case "qcom":
+ mImsApkUrl = "https://treble.phh.me/ims-caf-u-resigned.apk";
+ break;
+ case "mtk_p":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-p-resigned.apk";
+ break;
+ case "mtk_q":
+ mImsApkUrl = "https://treble.phh.me/stable/ims-mtk-q-resigned.apk";
+ break;
+ case "mtk_r+":
+ mImsApkUrl = "https://treble.phh.me/ims-mtk-u-resigned.apk";
+ break;
+ default:
+ break;
+ }
+
+ Context context = preference.getContext();
+ DownloadManager dm = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
+ DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mImsApkUrl));
+ request.setTitle("IMS APK");
+ request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
+ request.setDestinationInExternalFilesDir(context, Environment.DIRECTORY_DOWNLOADS, "ims.apk");
+ long id = dm.enqueue(request);
+ Toast.makeText(context, context.getString(R.string.install_ims_apk_toast_downloading), Toast.LENGTH_LONG).show();
+
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1L) != id) {
+ return;
+ }
+ Cursor cursor = dm.query(new DownloadManager.Query().setFilterById(id));
+ if (!cursor.moveToFirst()) {
+ return;
+ }
+ Uri localUri = Uri.parse(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));
+ String path = localUri.getPath();
+ if (path == null) {
+ return;
+ }
+ long fileSize = 0;
+ File file = new File(path);
+ if (file.isFile()) {
+ fileSize = file.length();
+ } else {
+ return;
+ }
+
+ try (InputStream in = new FileInputStream(path)) {
+ PackageInstaller pi = context.getPackageManager().getPackageInstaller();
+ int sessionId = pi.createSession(new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL));
+ PackageInstaller.Session session = pi.openSession(sessionId);
+ try (OutputStream out = session.openWrite(TAG, 0, fileSize)) {
+ byte[] buffer = new byte[512 * 1024];
+ while (in.available() > 0) {
+ int l = in.read(buffer);
+ out.write(buffer, 0, l);
+ }
+ session.fsync(out);
+ }
+ String action = TAG + "_" + sessionId;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, sessionId,
+ new Intent(action), PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
+ context.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Toast.makeText(context, context.getString(R.string.install_ims_apk_toast_completed), Toast.LENGTH_LONG).show();
+ }
+ }, new IntentFilter(action));
+ session.commit(pendingIntent.getIntentSender());
+ context.unregisterReceiver(this);
+ } catch (IOException ex) {
+ Log.d(TAG, "IOException while installing IMS APK");
+ }
+ }
+ }, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
+
+ return false;
+ }
+
+ protected static String getImsType() {
+ try {
+ IServiceManager hidlManager = IServiceManager.getService();
+ for (String slot: IMS_SLOTS) {
+ if (hidlManager.get("vendor.qti.hardware.radio.ims@1.0::IImsRadio", slot) != null
+ || ServiceManager.getService("vendor.qti.hardware.radio.ims.IImsRadio/" + slot) != null) {
+ return "qcom";
+ } else if (hidlManager.get("vendor.mediatek.hardware.radio@3.0::IRadio", slot) != null) {
+ return "mtk_p";
+ } else if (hidlManager.get("vendor.mediatek.hardware.mtkradioex@1.0::IMtkRadioEx", slot) != null) {
+ return "mtk_q";
+ } else if (hidlManager.get("vendor.mediatek.hardware.mtkradioex@2.0::IMtkRadioEx", slot) != null
+ || hidlManager.get("vendor.mediatek.hardware.mtkradioex@3.0::IMtkRadioEx", slot) != null
+ || ServiceManager.getService("vendor.mediatek.hardware.mtkradioex.ims.IMtkRadioExIms/" + slot) != null) {
+ return "mtk_r+";
+ }
+ }
+ } catch (RemoteException ex) {}
+
+ return "none";
+ }
+
+}
diff --git a/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java b/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
new file mode 100644
index 00000000000..1ab12d3ca0e
--- /dev/null
+++ b/src/com/android/settings/treble/OverrideVolteAvailabilityPreferenceController.java
@@ -0,0 +1,59 @@
+package com.android.settings.treble;
+
+import android.content.Context;
+import android.os.SystemProperties;
+
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+import androidx.preference.SwitchPreference;
+
+import com.android.settings.core.BasePreferenceController;
+
+public class OverrideVolteAvailabilityPreferenceController extends BasePreferenceController
+ implements Preference.OnPreferenceChangeListener {
+
+ private static final String OVERRIDE_VOLTE_AVAILABILITY_KEY = "override_volte_availability";
+ private static final String[] IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES = {
+ "persist.dbg.volte_avail_ovr",
+ "persist.dbg.wfc_avail_ovr",
+ "persist.dbg.allow_ims_off"
+ };
+
+ private SwitchPreference mSwitchPreference;
+
+ public OverrideVolteAvailabilityPreferenceController(Context context) {
+ super(context, OVERRIDE_VOLTE_AVAILABILITY_KEY);
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ return AVAILABLE;
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return OVERRIDE_VOLTE_AVAILABILITY_KEY;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ mSwitchPreference = screen.findPreference(getPreferenceKey());
+ super.displayPreference(screen);
+ }
+
+ @Override
+ public void updateState(Preference preference) {
+ boolean checked = SystemProperties.getBoolean(IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES[0], false);
+ mSwitchPreference.setChecked(checked);
+ }
+
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ for (String prop: IMSMANAGER_DEBUG_OVERRIDE_PROPERTIES) {
+ SystemProperties.set(prop, ((boolean) newValue) ? "1" : "0");
+ }
+ mSwitchPreference.setChecked((boolean) newValue);
+ return true;
+ }
+
+}
diff --git a/src/com/android/settings/treble/TrebleSettings.java b/src/com/android/settings/treble/TrebleSettings.java
index 5c1611c0534..50e3eda8c68 100644
--- a/src/com/android/settings/treble/TrebleSettings.java
+++ b/src/com/android/settings/treble/TrebleSettings.java
@@ -36,6 +36,8 @@ public class TrebleSettings extends DashboardFragment {
controllers.add(new DisableSoundvolumeEffectPreferenceController(context));
controllers.add(new ScreenResolutionRefreshRatePreferenceController(context));
controllers.add(new UseAlternativeBacklightScalePreferenceController(context));
+ controllers.add(new InstallImsApkPreferenceController(context));
+ controllers.add(new OverrideVolteAvailabilityPreferenceController(context));
return controllers;
}
--
2.34.1