diff options
| -rw-r--r-- | services/core/java/com/android/server/am/OomAdjuster.java | 31 | ||||
| -rw-r--r-- | services/core/java/com/android/server/appop/AppOpsService.java | 14 |
2 files changed, 33 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index e9d64913a354..3bd7d5c0d075 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -17,8 +17,8 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL; -import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_ALL_IMPLICIT; +import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_CAMERA; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_LOCATION; import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE; @@ -36,9 +36,7 @@ import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; import static android.app.ActivityManager.PROCESS_STATE_SERVICE; import static android.app.ActivityManager.PROCESS_STATE_TOP; import static android.app.ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND; -import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA; import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION; -import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE; import static android.os.Process.SCHED_OTHER; import static android.os.Process.THREAD_GROUP_BACKGROUND; import static android.os.Process.THREAD_GROUP_DEFAULT; @@ -78,7 +76,6 @@ import android.compat.annotation.Disabled; import android.compat.annotation.EnabledAfter; import android.content.Context; import android.content.pm.ServiceInfo; -import android.os.Build; import android.os.Debug; import android.os.Handler; import android.os.IBinder; @@ -151,6 +148,9 @@ public final class OomAdjuster { @Disabled static final long CAMERA_MICROPHONE_CAPABILITY_CHANGE_ID = 136219221L; + //TODO: remove this when development is done. + private static final int TEMP_PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1 << 31; + /** * For some direct access we need to power manager. */ @@ -1477,13 +1477,24 @@ public final class OomAdjuster { } } - if (s.isForeground && s.mAllowWhileInUsePermissionInFgs) { + if (s.isForeground) { final int fgsType = s.foregroundServiceType; - capabilityFromFGS |= - (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) - != 0 ? PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0; - capabilityFromFGS |= PROCESS_CAPABILITY_FOREGROUND_CAMERA - | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; + if (s.mAllowWhileInUsePermissionInFgs) { + capabilityFromFGS |= + (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) + != 0 ? PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0; + } else { + //The FGS has the location capability, but due to FGS BG start restriction it + //lost the capability, use temp location capability to mark this case. + //TODO: remove this block when development is done. + capabilityFromFGS |= + (fgsType & FOREGROUND_SERVICE_TYPE_LOCATION) + != 0 ? TEMP_PROCESS_CAPABILITY_FOREGROUND_LOCATION : 0; + } + if (s.mAllowWhileInUsePermissionInFgs) { + capabilityFromFGS |= PROCESS_CAPABILITY_FOREGROUND_CAMERA + | PROCESS_CAPABILITY_FOREGROUND_MICROPHONE; + } } ArrayMap<IBinder, ArrayList<ConnectionRecord>> serviceConnections = s.getConnections(); diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 62596de7b9a6..1d714a2c99c7 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -213,6 +213,9 @@ public class AppOpsService extends IAppOpsService.Stub { private static final int MAX_UNFORWARED_OPS = 10; private static final int MAX_UNUSED_POOLED_OBJECTS = 3; + //TODO: remove this when development is done. + private static final int TEMP_PROCESS_CAPABILITY_FOREGROUND_LOCATION = 1 << 31; + Context mContext; final AtomicFile mFile; final Handler mHandler; @@ -480,8 +483,15 @@ public class AppOpsService extends IAppOpsService.Stub { case AppOpsManager.OP_MONITOR_HIGH_POWER_LOCATION: if ((capability & PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0) { return AppOpsManager.MODE_ALLOWED; - } else { + } else if ((capability + & TEMP_PROCESS_CAPABILITY_FOREGROUND_LOCATION) != 0) { + // The FGS has the location capability, but due to FGS BG start + // restriction it lost the capability, use temp location capability + // to mark this case. + // TODO change to MODE_IGNORED when enforcing the feature. maybeShowWhileInUseDebugToast(op, mode); + return AppOpsManager.MODE_ALLOWED; + } else { return AppOpsManager.MODE_IGNORED; } case OP_CAMERA: @@ -586,7 +596,7 @@ public class AppOpsService extends IAppOpsService.Stub { return; } final long now = System.currentTimeMillis(); - if (lastTimeShowDebugToast == 0 || now - lastTimeShowDebugToast > 600000) { + if (lastTimeShowDebugToast == 0 || now - lastTimeShowDebugToast > 3600000) { lastTimeShowDebugToast = now; mHandler.sendMessage(PooledLambda.obtainMessage( ActivityManagerInternal::showWhileInUseDebugToast, |