Merge "Always allow startForeground(SHORT_SERVICE) on running short FGS" into udc-dev

This commit is contained in:
Makoto Onuki
2023-02-23 16:08:45 +00:00
committed by Android (Google) Code Review

View File

@@ -2059,6 +2059,9 @@ public final class ActiveServices {
foregroundServiceType == FOREGROUND_SERVICE_TYPE_SHORT_SERVICE;
final boolean isOldTypeShortFgsAndTimedOut = r.shouldTriggerShortFgsTimeout();
// If true, we skip the BFSL check.
boolean bypassBfslCheck = false;
if (r.isForeground && (isOldTypeShortFgs || isNewTypeShortFgs)) {
if (DEBUG_SHORT_SERVICE) {
Slog.i(TAG_SERVICE, String.format(
@@ -2089,9 +2092,6 @@ public final class ActiveServices {
if (isNewTypeShortFgs) {
// Only in this case, we extend the SHORT_SERVICE time out.
extendShortServiceTimeout = true;
if (DEBUG_SHORT_SERVICE) {
Slog.i(TAG_SERVICE, "Extending SHORT_SERVICE time out: " + r);
}
} else {
// FGS type is changing from SHORT_SERVICE to another type when
// an app is allowed to start FGS, so this will succeed.
@@ -2099,8 +2099,20 @@ public final class ActiveServices {
// maybeUpdateShortFgsTrackingLocked().
}
} else {
// We catch this case later, in the
// "if (r.mAllowStartForeground == REASON_DENIED...)" block below.
if (isNewTypeShortFgs) {
// startForeground(SHORT_SERVICE) is called on an already running
// SHORT_SERVICE FGS, when BFSL is not allowed.
// In this case, the call should succeed
// (== ForegroundServiceStartNotAllowedException shouldn't be
// thrown), but the short service timeout shouldn't extend
// (== extendShortServiceTimeout should be false).
// We still do everything else -- e.g. we still need to update
// the notification.
bypassBfslCheck = true;
} else {
// We catch this case later, in the
// "if (r.mAllowStartForeground == REASON_DENIED...)" block below.
}
}
} else if (r.mStartForegroundCount == 0) {
@@ -2155,23 +2167,25 @@ public final class ActiveServices {
+ "location/camera/microphone access: service "
+ r.shortInstanceName);
}
logFgsBackgroundStart(r);
if (r.mAllowStartForeground == REASON_DENIED
&& isBgFgsRestrictionEnabledForService) {
final String msg = "Service.startForeground() not allowed due to "
+ "mAllowStartForeground false: service "
+ r.shortInstanceName
+ (isOldTypeShortFgs ? " (Called on SHORT_SERVICE)" : "");
Slog.w(TAG, msg);
showFgsBgRestrictedNotificationLocked(r);
updateServiceForegroundLocked(psr, true);
ignoreForeground = true;
logFGSStateChangeLocked(r,
FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED,
0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN);
if (CompatChanges.isChangeEnabled(FGS_START_EXCEPTION_CHANGE_ID,
r.appInfo.uid)) {
throw new ForegroundServiceStartNotAllowedException(msg);
if (!bypassBfslCheck) {
logFgsBackgroundStart(r);
if (r.mAllowStartForeground == REASON_DENIED
&& isBgFgsRestrictionEnabledForService) {
final String msg = "Service.startForeground() not allowed due to "
+ "mAllowStartForeground false: service "
+ r.shortInstanceName
+ (isOldTypeShortFgs ? " (Called on SHORT_SERVICE)" : "");
Slog.w(TAG, msg);
showFgsBgRestrictedNotificationLocked(r);
updateServiceForegroundLocked(psr, true);
ignoreForeground = true;
logFGSStateChangeLocked(r,
FOREGROUND_SERVICE_STATE_CHANGED__STATE__DENIED,
0, FGS_STOP_REASON_UNKNOWN, FGS_TYPE_POLICY_CHECK_UNKNOWN);
if (CompatChanges.isChangeEnabled(FGS_START_EXCEPTION_CHANGE_ID,
r.appInfo.uid)) {
throw new ForegroundServiceStartNotAllowedException(msg);
}
}
}
@@ -3114,11 +3128,17 @@ public final class ActiveServices {
unscheduleShortFgsTimeoutLocked(sr);
return;
}
if (DEBUG_SHORT_SERVICE) {
Slog.i(TAG_SERVICE, "Short FGS started: " + sr);
}
if (extendTimeout || !sr.hasShortFgsInfo()) {
final boolean isAlreadyShortFgs = sr.hasShortFgsInfo();
if (extendTimeout || !isAlreadyShortFgs) {
if (DEBUG_SHORT_SERVICE) {
if (isAlreadyShortFgs) {
Slog.i(TAG_SERVICE, "Extending SHORT_SERVICE time out: " + sr);
} else {
Slog.i(TAG_SERVICE, "Short FGS started: " + sr);
}
}
sr.setShortFgsInfo(SystemClock.uptimeMillis());
// We'll restart the timeout.
@@ -3128,6 +3148,10 @@ public final class ActiveServices {
ActivityManagerService.SERVICE_SHORT_FGS_TIMEOUT_MSG, sr);
mAm.mHandler.sendMessageAtTime(msg, sr.getShortFgsInfo().getTimeoutTime());
} else {
if (DEBUG_SHORT_SERVICE) {
Slog.w(TAG_SERVICE, "NOT extending SHORT_SERVICE time out: " + sr);
}
// We only (potentially) update the start command, start count, but not the timeout
// time.
// In this case, we keep the existing timeout running.