diff options
| author | 2019-02-06 23:48:01 +0000 | |
|---|---|---|
| committer | 2019-02-06 23:48:01 +0000 | |
| commit | 36bdd7e45c815d9cdd06281ca0e9cdbcd841d9c8 (patch) | |
| tree | 95fb71a90104246c67ca93726d4901898237af0d | |
| parent | f17a698307e5370b8aa44784b3e0fe339adaf6fa (diff) | |
| parent | 567df6a4291709f5416fc6d66efc7e58148284f4 (diff) | |
Merge "Add shell cmd to disabled default Content Capture service."
4 files changed, 138 insertions, 4 deletions
diff --git a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerServiceShellCommand.java b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerServiceShellCommand.java index 2f78276bb533..39d5c9d0b777 100644 --- a/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerServiceShellCommand.java +++ b/services/contentcapture/java/com/android/server/contentcapture/ContentCaptureManagerServiceShellCommand.java @@ -77,6 +77,15 @@ public final class ContentCaptureManagerServiceShellCommand extends ShellCommand pw.println(" Temporarily (for DURATION ms) changes the service implemtation."); pw.println(" To reset, call with just the USER_ID argument."); pw.println(""); + pw.println(""); + pw.println(" set default-service-enabled USER_ID [true|false]"); + pw.println(" Enable / disable the default service for the user."); + pw.println(""); + pw.println(""); + pw.println(" get default-service-enabled USER_ID"); + pw.println(" Checks whether the default service is enabled for the user."); + pw.println(""); + pw.println(""); pw.println(" list sessions [--user USER_ID]"); pw.println(" Lists all pending sessions."); pw.println(""); @@ -91,6 +100,8 @@ public final class ContentCaptureManagerServiceShellCommand extends ShellCommand switch(what) { case "bind-instant-service-allowed": return getBindInstantService(pw); + case "default-service-enabled": + return getDefaultServiceEnabled(pw); default: pw.println("Invalid set: " + what); return -1; @@ -105,6 +116,8 @@ public final class ContentCaptureManagerServiceShellCommand extends ShellCommand return setBindInstantService(pw); case "temporary-service": return setTemporaryService(pw); + case "default-service-enabled": + return setDefaultServiceEnabled(); default: pw.println("Invalid set: " + what); return -1; @@ -149,6 +162,20 @@ public final class ContentCaptureManagerServiceShellCommand extends ShellCommand return 0; } + private int setDefaultServiceEnabled() { + final int userId = getNextIntArgRequired(); + final boolean enabled = Boolean.parseBoolean(getNextArg()); + mService.setDefaultServiceEnabled(userId, enabled); + return 0; + } + + private int getDefaultServiceEnabled(PrintWriter pw) { + final int userId = getNextIntArgRequired(); + final boolean enabled = mService.isDefaultServiceEnabled(userId); + pw.println(enabled); + return 0; + } + private int requestDestroy(PrintWriter pw) { if (!isNextArgSessions(pw)) { return -1; diff --git a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java index 532aa01f4438..2bfb31f6e74f 100644 --- a/services/core/java/com/android/server/infra/AbstractMasterSystemService.java +++ b/services/core/java/com/android/server/infra/AbstractMasterSystemService.java @@ -286,6 +286,46 @@ public abstract class AbstractMasterSystemService<M extends AbstractMasterSystem } /** + * Sets whether the default service should be used. + * + * <p>Typically used during CTS tests to make sure only the default service doesn't interfere + * with the test results. + * + * @throws SecurityException if caller is not allowed to manage this service's settings. + */ + public final void setDefaultServiceEnabled(@UserIdInt int userId, boolean enabled) { + Slog.i(mTag, "setDefaultServiceEnabled() for userId " + userId + ": " + enabled); + enforceCallingPermissionForManagement(); + + synchronized (mLock) { + final S oldService = peekServiceForUserLocked(userId); + if (oldService != null) { + oldService.removeSelfFromCacheLocked(); + } + mServiceNameResolver.setDefaultServiceEnabled(userId, enabled); + + // Must update the service on cache so its initialization code is triggered + updateCachedServiceLocked(userId); + } + } + + /** + * Checks whether the default service should be used. + * + * <p>Typically used during CTS tests to make sure only the default service doesn't interfere + * with the test results. + * + * @throws SecurityException if caller is not allowed to manage this service's settings. + */ + public final boolean isDefaultServiceEnabled(@UserIdInt int userId) { + enforceCallingPermissionForManagement(); + + synchronized (mLock) { + return mServiceNameResolver.isDefaultServiceEnabled(userId); + } + } + + /** * Gets the maximum time the service implementation can be changed. * * @throws UnsupportedOperationException if subclass doesn't override it. diff --git a/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java b/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java index 7f198acfd743..cf84e22e7dd1 100644 --- a/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java +++ b/services/core/java/com/android/server/infra/FrameworkResourcesServiceNameResolver.java @@ -27,6 +27,7 @@ import android.os.SystemClock; import android.text.TextUtils; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseBooleanArray; import android.util.TimeUtils; import com.android.internal.annotations.GuardedBy; @@ -61,6 +62,15 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR private final SparseArray<String> mTemporaryServiceNames = new SparseArray<>(); /** + * Map of default services that have been disabled by + * {@link #setDefaultServiceEnabled(int, boolean)},keyed by {@code userId}. + * + * <p>Typically used by Shell command and/or CTS tests. + */ + @GuardedBy("mLock") + private final SparseBooleanArray mDefaultServicesDisabled = new SparseBooleanArray(); + + /** * When the temporary service will expire (and reset back to the default). */ @GuardedBy("mLock") @@ -99,12 +109,18 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR final String temporaryName = mTemporaryServiceNames.get(userId); if (temporaryName != null) { // Always log it, as it should only be used on CTS or during development - Slog.w(TAG, "getComponentName(): using temporary name " + temporaryName + Slog.w(TAG, "getServiceName(): using temporary name " + temporaryName + " for user " + userId); return temporaryName; - } else { - return getDefaultServiceName(userId); } + final boolean disabled = mDefaultServicesDisabled.get(userId); + if (disabled) { + // Always log it, as it should only be used on CTS or during development + Slog.w(TAG, "getServiceName(): temporary name not set and default disabled for " + + "user " + userId); + return null; + } + return getDefaultServiceName(userId); } } @@ -158,6 +174,24 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR } @Override + public void setDefaultServiceEnabled(int userId, boolean enabled) { + synchronized (mLock) { + if (enabled) { + mDefaultServicesDisabled.removeAt(userId); + } else { + mDefaultServicesDisabled.put(userId, true); + } + } + } + + @Override + public boolean isDefaultServiceEnabled(int userId) { + synchronized (mLock) { + return mDefaultServicesDisabled.get(userId); + } + } + + @Override public String toString() { return "FrameworkResourcesServiceNamer[temps=" + mTemporaryServiceNames + "]"; } @@ -168,6 +202,7 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR synchronized (mLock) { pw.print("FrameworkResourcesServiceNamer: resId="); pw.print(mResourceId); pw.print(", numberTemps="); pw.print(mTemporaryServiceNames.size()); + pw.print(", enabledDefaults="); pw.print(mDefaultServicesDisabled.size()); } } @@ -181,7 +216,9 @@ public final class FrameworkResourcesServiceNameResolver implements ServiceNameR final long ttl = mTemporaryServiceExpiration - SystemClock.elapsedRealtime(); pw.print(" (expires in "); TimeUtils.formatDuration(ttl, pw); pw.print("), "); } - pw.print("defaultName="); pw.println(getDefaultServiceName(userId)); + pw.print("defaultName="); pw.print(getDefaultServiceName(userId)); + final boolean disabled = mDefaultServicesDisabled.get(userId); + pw.println(disabled ? " (disabled)" : " (enabled)"); } } diff --git a/services/core/java/com/android/server/infra/ServiceNameResolver.java b/services/core/java/com/android/server/infra/ServiceNameResolver.java index bc11ff302ca9..5b60413eefad 100644 --- a/services/core/java/com/android/server/infra/ServiceNameResolver.java +++ b/services/core/java/com/android/server/infra/ServiceNameResolver.java @@ -108,6 +108,36 @@ public interface ServiceNameResolver { } /** + * Sets whether the default service should be used when the temporary service is not set. + * + * <p>Typically used during CTS tests to make sure only the default service doesn't interfere + * with the test results. + * + * @param userId user handle + * @param enabled whether the default service should be used when the temporary service is not + * set + * + * @throws UnsupportedOperationException if not implemented. + */ + default void setDefaultServiceEnabled(@UserIdInt int userId, boolean enabled) { + throw new UnsupportedOperationException("changing default service not supported"); + } + + /** + * Checks whether the default service should be used when the temporary service is not set. + * + * <p>Typically used during CTS tests to make sure only the default service doesn't interfere + * with the test results. + * + * @param userId user handle + * + * @throws UnsupportedOperationException if not implemented. + */ + default boolean isDefaultServiceEnabled(@UserIdInt int userId) { + throw new UnsupportedOperationException("checking default service not supported"); + } + + /** * Dumps the generic info in just one line (without calling {@code println}. */ // TODO(b/117779333): support proto |