From b22a04698637e9d13892f9f87a36d4dc36884130 Mon Sep 17 00:00:00 2001 From: Adithya R Date: Fri, 9 Aug 2024 08:19:55 +0530 Subject: [PATCH] sm8350-common: parts: Automatically determine thermal profile for apps Assume an appropriate default thermal profile based on package information. --- .../settings/thermal/ThermalUtils.java | 124 +++++++++++++----- 1 file changed, 90 insertions(+), 34 deletions(-) diff --git a/parts/src/org/lineageos/settings/thermal/ThermalUtils.java b/parts/src/org/lineageos/settings/thermal/ThermalUtils.java index e8c10a2..9caae92 100644 --- a/parts/src/org/lineageos/settings/thermal/ThermalUtils.java +++ b/parts/src/org/lineageos/settings/thermal/ThermalUtils.java @@ -20,11 +20,27 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.UserHandle; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.RemoteException; +import android.os.SystemProperties; +import android.os.UserHandle; +import android.provider.MediaStore; +import android.telecom.DefaultDialerManager; +import android.view.Display; +import android.view.Surface; +import android.view.WindowManager; import androidx.preference.PreferenceManager; +import com.android.settingslib.applications.AppUtils; + import org.lineageos.settings.utils.FileUtils; +import java.util.List; +import java.util.Map; + public final class ThermalUtils { private static final String THERMAL_CONTROL = "thermal_control"; @@ -39,15 +55,17 @@ public final class ThermalUtils { protected static final int STATE_STREAMING = 7; protected static final int STATE_VIDEO = 8; - private static final String THERMAL_STATE_DEFAULT = "0"; - private static final String THERMAL_STATE_BENCHMARK = "10"; - private static final String THERMAL_STATE_BROWSER = "11"; - private static final String THERMAL_STATE_CAMERA = "12"; - private static final String THERMAL_STATE_DIALER = "8"; - private static final String THERMAL_STATE_GAMING = "9"; - private static final String THERMAL_STATE_NAVIGATION = "19"; - private static final String THERMAL_STATE_STREAMING = "14"; - private static final String THERMAL_STATE_VIDEO = "21"; + private static final Map THERMAL_STATE_MAP = Map.of( + STATE_DEFAULT, "0", + STATE_BENCHMARK, "10", + STATE_BROWSER, "11", + STATE_CAMERA, "12", + STATE_DIALER, "8", + STATE_GAMING, "13", + STATE_NAVIGATION, "19", + STATE_STREAMING, "4", + STATE_VIDEO, "21" + ); private static final String THERMAL_BENCHMARK = "thermal.benchmark="; private static final String THERMAL_BROWSER = "thermal.browser="; @@ -60,9 +78,15 @@ public final class ThermalUtils { private static final String THERMAL_SCONFIG = "/sys/class/thermal/thermal_message/sconfig"; + private static final String GMAPS_PACKAGE = "com.google.android.apps.maps"; + private static final String GMEET_PACKAGE = "com.google.android.apps.tachyon"; + + private Context mContext; + private Display mDisplay; private SharedPreferences mSharedPrefs; protected ThermalUtils(Context context) { + mContext = context; mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(context); } @@ -79,8 +103,9 @@ public final class ThermalUtils { String value = mSharedPrefs.getString(THERMAL_CONTROL, null); if (value == null || value.isEmpty()) { - value = THERMAL_BENCHMARK + ":" + THERMAL_BROWSER + ":" + THERMAL_CAMERA + ":" + THERMAL_DIALER + ":" + - THERMAL_GAMING + ":" + THERMAL_NAVIGATION + ":" + THERMAL_STREAMING + ":" + THERMAL_VIDEO; + value = THERMAL_BENCHMARK + ":" + THERMAL_BROWSER + ":" + THERMAL_CAMERA + ":" + + THERMAL_DIALER + ":" + THERMAL_GAMING + ":" + THERMAL_NAVIGATION + ":" + + THERMAL_STREAMING + ":" + THERMAL_VIDEO; writeValue(value); } return value; @@ -145,41 +170,72 @@ public final class ThermalUtils { state = STATE_STREAMING; } else if (modes[7].contains(packageName + ",")) { state = STATE_VIDEO; + } else { + // derive a default state based on package name + state = getDefaultStateForPackage(packageName); } return state; } protected void setDefaultThermalProfile() { - FileUtils.writeLine(THERMAL_SCONFIG, THERMAL_STATE_DEFAULT); + FileUtils.writeLine(THERMAL_SCONFIG, THERMAL_STATE_MAP.get(STATE_DEFAULT)); } protected void setThermalProfile(String packageName) { - String value = getValue(); - String modes[]; - String state = THERMAL_STATE_DEFAULT; + final int state = getStateForPackage(packageName); + FileUtils.writeLine(THERMAL_SCONFIG, THERMAL_STATE_MAP.get(state)); + } - if (value != null) { - modes = value.split(":"); + private int getDefaultStateForPackage(String packageName) { + switch (packageName) { + case GMAPS_PACKAGE: + return STATE_NAVIGATION; + case GMEET_PACKAGE: + return STATE_STREAMING; + } - if (modes[0].contains(packageName + ",")) { - state = THERMAL_STATE_BENCHMARK; - } else if (modes[1].contains(packageName + ",")) { - state = THERMAL_STATE_BROWSER; - } else if (modes[2].contains(packageName + ",")) { - state = THERMAL_STATE_CAMERA; - } else if (modes[3].contains(packageName + ",")) { - state = THERMAL_STATE_DIALER; - } else if (modes[4].contains(packageName + ",")) { - state = THERMAL_STATE_GAMING; - } else if (modes[5].contains(packageName + ",")) { - state = THERMAL_STATE_NAVIGATION; - } else if (modes[6].contains(packageName + ",")) { - state = THERMAL_STATE_STREAMING; - } else if (modes[7].contains(packageName + ",")) { - state = THERMAL_STATE_VIDEO; + final PackageManager pm = mContext.getPackageManager(); + final ApplicationInfo appInfo; + try { + appInfo = pm.getApplicationInfo(packageName, /* flags */ 0); + } catch (PackageManager.NameNotFoundException e) { + return STATE_DEFAULT; + } + + switch (appInfo.category) { + case ApplicationInfo.CATEGORY_GAME: + return STATE_GAMING; + case ApplicationInfo.CATEGORY_VIDEO: + return STATE_VIDEO; + case ApplicationInfo.CATEGORY_MAPS: + return STATE_NAVIGATION; + } + + if (AppUtils.isBrowserApp(mContext, packageName, UserHandle.myUserId())) { + return STATE_BROWSER; + } else if (DefaultDialerManager.getDefaultDialerApplication(mContext).equals(packageName)) { + return STATE_DIALER; + } else if (isCameraApp(packageName)) { + return STATE_CAMERA; + } else { + return STATE_DEFAULT; + } + // TODO: STATE_BENCHMARK, STATE_STREAMING + } + + private boolean isCameraApp(String packageName) { + final Intent cameraIntent = + new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) + .setPackage(packageName); + + final List list = mContext.getPackageManager().queryIntentActivitiesAsUser( + cameraIntent, PackageManager.MATCH_ALL, UserHandle.myUserId()); + for (ResolveInfo info : list) { + if (info.activityInfo != null) { + return true; } } - FileUtils.writeLine(THERMAL_SCONFIG, state); + return false; } }