sm8350-common: parts: Automatically determine thermal profile for apps

Assume an appropriate default thermal profile based on package information.
This commit is contained in:
Adithya R 2024-08-09 08:19:55 +05:30 committed by DigiGoon
parent 3be4f1b6fa
commit c9cbc16b47

View file

@ -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<Integer, String> 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<ResolveInfo> 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;
}
}