diff options
| author | 2021-04-21 07:24:42 +0000 | |
|---|---|---|
| committer | 2021-04-21 07:24:42 +0000 | |
| commit | d9b11089e780c0ad5beb43280e41b495e1dbea4d (patch) | |
| tree | 61563f85ea712d9fbb29a87d04b48894563296ae | |
| parent | 1027fb5c21b9ae931feff81c29427cccb3d8d77b (diff) | |
| parent | 8b875d24465874841cd2295f4496d68f9098f93d (diff) | |
Merge "Implement Device Flag for shortcut integration with AppSearch" into sc-dev
5 files changed, 98 insertions, 17 deletions
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java index c7a36eeaa5f1..efce0a8487c7 100644 --- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java +++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java @@ -483,6 +483,12 @@ public final class SystemUiDeviceConfigFlags { public static final String HOME_BUTTON_LONG_PRESS_DURATION_MS = "home_button_long_press_duration_ms"; + /** + * (boolean) Whether shortcut integration over app search service is enabled. + */ + public static final String SHORTCUT_APPSEARCH_INTEGRATION = + "shortcut_appsearch_integration"; + private SystemUiDeviceConfigFlags() { } } diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 464477df281f..ada65860018a 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -219,10 +219,12 @@ class ShortcutPackage extends ShortcutPackageItem { getPackageName(), getPackageUserId()); } + private boolean isAppSearchEnabled() { + return mShortcutUser.mService.isAppSearchEnabled(); + } + public int getShortcutCount() { - final int[] count = new int[1]; - forEachShortcut(si -> count[0]++); - return count[0]; + return mShortcuts.size(); } @Override @@ -442,15 +444,18 @@ class ShortcutPackage extends ShortcutPackageItem { } forceReplaceShortcutInner(newShortcut); - mShortcutUser.mService.injectPostToHandler(() -> awaitInAppSearch("reportUsage", - session -> { - final AndroidFuture<Boolean> future = new AndroidFuture<>(); - session.reportUsage( - new ReportUsageRequest.Builder(getPackageName()) - .setUri(newShortcut.getId()).build(), - mShortcutUser.mExecutor, result -> future.complete(result.isSuccess())); - return future; - })); + if (isAppSearchEnabled()) { + mShortcutUser.mService.injectPostToHandler(() -> awaitInAppSearch("reportUsage", + session -> { + final AndroidFuture<Boolean> future = new AndroidFuture<>(); + session.reportUsage( + new ReportUsageRequest.Builder(getPackageName()) + .setUri(newShortcut.getId()).build(), + mShortcutUser.mExecutor, + result -> future.complete(result.isSuccess())); + return future; + })); + } return deleted; } @@ -960,7 +965,7 @@ class ShortcutPackage extends ShortcutPackageItem { * the app's Xml resource. */ int getSharingShortcutCount() { - if (getShortcutCount() == 0 || mShareTargets.isEmpty()) { + if (mShareTargets.isEmpty()) { return 0; } @@ -1700,7 +1705,7 @@ class ShortcutPackage extends ShortcutPackageItem { final int size = mShortcuts.size(); final int shareTargetSize = mShareTargets.size(); - if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0 && getShortcutCount() == 0) { + if (size == 0 && shareTargetSize == 0 && mApiCallCount == 0) { return; // nothing to write. } @@ -2254,6 +2259,9 @@ class ShortcutPackage extends ShortcutPackageItem { } void updateVisibility(String packageName, byte[] certificate, boolean visible) { + if (!isAppSearchEnabled()) { + return; + } if (visible) { mPackageIdentifiers.put(packageName, new PackageIdentifier(packageName, certificate)); } else { @@ -2287,6 +2295,14 @@ class ShortcutPackage extends ShortcutPackageItem { private void saveShortcut(@NonNull final Collection<ShortcutInfo> shortcuts) { Objects.requireNonNull(shortcuts); + if (!isAppSearchEnabled()) { + // If AppSearch isn't enabled, save it in memory and we are done. + for (ShortcutInfo si : shortcuts) { + mShortcuts.put(si.getId(), si); + } + return; + } + // Otherwise, save pinned shortcuts in memory. shortcuts.forEach(si -> { if (si.isPinned()) { mShortcuts.put(si.getId(), si); @@ -2294,12 +2310,13 @@ class ShortcutPackage extends ShortcutPackageItem { mShortcuts.remove(si.getId()); } }); + // Then proceed to app search. saveToAppSearch(shortcuts); } private void saveToAppSearch(@NonNull final Collection<ShortcutInfo> shortcuts) { Objects.requireNonNull(shortcuts); - if (shortcuts.isEmpty()) { + if (!isAppSearchEnabled() || shortcuts.isEmpty()) { // No need to invoke AppSearch when there's nothing to save. return; } @@ -2335,6 +2352,9 @@ class ShortcutPackage extends ShortcutPackageItem { * Removes shortcuts from AppSearch. */ void removeShortcuts() { + if (!isAppSearchEnabled()) { + return; + } awaitInAppSearch("Removing all shortcuts from " + getPackageName(), session -> { final AndroidFuture<Boolean> future = new AndroidFuture<>(); session.remove("", getSearchSpec(), mShortcutUser.mExecutor, result -> { @@ -2352,6 +2372,9 @@ class ShortcutPackage extends ShortcutPackageItem { private void removeShortcut(@NonNull final String id) { Objects.requireNonNull(id); mShortcuts.remove(id); + if (!isAppSearchEnabled()) { + return; + } awaitInAppSearch("Removing shortcut with id=" + id, session -> { final AndroidFuture<Boolean> future = new AndroidFuture<>(); session.remove(new RemoveByUriRequest.Builder(getPackageName()).addUris(id).build(), @@ -2381,6 +2404,16 @@ class ShortcutPackage extends ShortcutPackageItem { shortcutIds.add(id); } } + if (!isAppSearchEnabled()) { + final List<ShortcutInfo> ret = new ArrayList<>(1); + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + ShortcutInfo si = mShortcuts.valueAt(i); + if (shortcutIds.contains(si.getId())) { + ret.add(si); + } + } + return ret; + } if (ShortcutService.DEBUG_REBOOT) { Slog.d(TAG, "Getting shortcuts for user=" + mShortcutUser.getUserId() + " pkg=" + getPackageName() + " ids: [" + String.join(",", ids) + "]"); @@ -2429,6 +2462,13 @@ class ShortcutPackage extends ShortcutPackageItem { private void forEachShortcutMutateIf(@NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) { + if (!isAppSearchEnabled()) { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + ShortcutInfo si = mShortcuts.valueAt(i); + cb.apply(si); + } + return; + } if (ShortcutService.DEBUG_REBOOT) { Slog.d(TAG, "Changing shortcuts for user=" + mShortcutUser.getUserId() + " pkg=" + getPackageName()); @@ -2454,6 +2494,15 @@ class ShortcutPackage extends ShortcutPackageItem { private void forEachShortcutStopWhen( @NonNull final String query, @NonNull final Function<ShortcutInfo, Boolean> cb) { + if (!isAppSearchEnabled()) { + for (int i = mShortcuts.size() - 1; i >= 0; i--) { + final ShortcutInfo si = mShortcuts.valueAt(i); + if (cb.apply(si)) { + return; + } + } + return; + } if (ShortcutService.DEBUG_REBOOT) { Slog.d(TAG, "Iterating shortcuts for user=" + mShortcutUser.getUserId() + " pkg=" + getPackageName()); @@ -2517,6 +2566,10 @@ class ShortcutPackage extends ShortcutPackageItem { final boolean forceReset, @NonNull final String description, @NonNull final Function<AppSearchSession, CompletableFuture<T>> cb) { + if (!isAppSearchEnabled()) { + throw new IllegalStateException( + "awaitInAppSearch called when app search integration is disabled"); + } synchronized (mLock) { final StrictMode.ThreadPolicy oldPolicy = StrictMode.getThreadPolicy(); final long callingIdentity = Binder.clearCallingIdentity(); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 8d03fceacee8..ee3335fba915 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -15,6 +15,8 @@ */ package com.android.server.pm; +import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; + import android.Manifest.permission; import android.annotation.IntDef; import android.annotation.NonNull; @@ -85,6 +87,7 @@ import android.os.ShellCallback; import android.os.ShellCommand; import android.os.SystemClock; import android.os.UserHandle; +import android.provider.DeviceConfig; import android.text.TextUtils; import android.text.format.TimeMigrationUtils; import android.util.ArraySet; @@ -104,6 +107,7 @@ import android.view.IWindowManager; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.infra.AndroidFuture; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.BackgroundThread; @@ -447,6 +451,8 @@ public class ShortcutService extends IShortcutService.Stub { @GuardedBy("mLock") private final MetricsLogger mMetricsLogger = new MetricsLogger(); + private final boolean mIsAppSearchEnabled; + static class InvalidFileFormatException extends Exception { public InvalidFileFormatException(String message, Throwable cause) { super(message, cause); @@ -481,6 +487,8 @@ public class ShortcutService extends IShortcutService.Stub { mShortcutRequestPinProcessor = new ShortcutRequestPinProcessor(this, mLock); mShortcutBitmapSaver = new ShortcutBitmapSaver(this); mShortcutDumpFiles = new ShortcutDumpFiles(this); + mIsAppSearchEnabled = DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.SHORTCUT_APPSEARCH_INTEGRATION, false); if (onlyForPackageManagerApis) { return; // Don't do anything further. For unit tests only. @@ -518,6 +526,10 @@ public class ShortcutService extends IShortcutService.Stub { injectRegisterRoleHoldersListener(mOnRoleHoldersChangedListener); } + boolean isAppSearchEnabled() { + return mIsAppSearchEnabled; + } + long getStatStartTime() { return mStatLogger.getTime(); } diff --git a/services/tests/servicestests/res/xml/shortcut_5.xml b/services/tests/servicestests/res/xml/shortcut_5.xml index 9551100cefe1..17c68ee8b935 100644 --- a/services/tests/servicestests/res/xml/shortcut_5.xml +++ b/services/tests/servicestests/res/xml/shortcut_5.xml @@ -73,7 +73,7 @@ android:action="action" android:data="http://www/" android:targetPackage="abc" - android:targetClass=".xyz" + android:targetClass="abc.xyz" android:mimeType="foo/bar" > <categories android:name="cat1" /> diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java index fd3e7a8e110d..478aa415f954 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest12.java @@ -15,6 +15,8 @@ */ package com.android.server.pm; +import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; + import static com.android.server.pm.shortcutmanagertest.ShortcutManagerTestUtils.list; import android.app.PendingIntent; @@ -22,6 +24,9 @@ import android.app.appsearch.PackageIdentifier; import android.content.pm.AppSearchShortcutInfo; import android.os.RemoteException; import android.os.UserHandle; +import android.provider.DeviceConfig; + +import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import java.util.Random; @@ -33,7 +38,12 @@ import java.util.Random; public class ShortcutManagerTest12 extends BaseShortcutManagerTest { public void testUpdateShortcutVisibility_updatesShortcutSchema() { - + if (!DeviceConfig.getBoolean(NAMESPACE_SYSTEMUI, + SystemUiDeviceConfigFlags.DARK_LAUNCH_REMOTE_PREDICTION_SERVICE_ENABLED, + false)) { + // no-op if app-search integration is disabled. + return; + } final byte[] cert = new byte[20]; new Random().nextBytes(cert); |