Merge "Remove ids from SystemUI Flagging System." into main
diff --git a/core/java/android/content/res/Element.java b/core/java/android/content/res/Element.java
index 0438ecc..e931fe8 100644
--- a/core/java/android/content/res/Element.java
+++ b/core/java/android/content/res/Element.java
@@ -42,6 +42,8 @@
public static final int MAX_ATTR_LEN_PATH = 4000;
public static final int MAX_ATTR_LEN_DATA_VALUE = 4000;
+ private static final String BAD_COMPONENT_NAME_CHARS = ";,[](){}:?-%^*|/\\";
+
private static final String TAG = "PackageParsing";
protected static final String TAG_ACTION = "action";
protected static final String TAG_ACTIVITY = "activity";
@@ -790,33 +792,13 @@
}
void validateComponentName(CharSequence name) {
- int i = 0;
- if (name.charAt(0) == '.') {
- i = 1;
- }
boolean isStart = true;
- for (; i < name.length(); i++) {
- if (name.charAt(i) == '.') {
- if (isStart) {
- break;
- }
- isStart = true;
- } else {
- if (isStart) {
- if (Character.isJavaIdentifierStart(name.charAt(i))) {
- isStart = false;
- } else {
- break;
- }
- } else if (!Character.isJavaIdentifierPart(name.charAt(i))) {
- break;
- }
+ for (int i = 0; i < name.length(); i++) {
+ if (BAD_COMPONENT_NAME_CHARS.indexOf(name.charAt(i)) >= 0) {
+ Slog.e(TAG, name + " is not a valid Java class name");
+ throw new SecurityException(name + " is not a valid Java class name");
}
}
- if ((i < name.length()) || (name.charAt(name.length() - 1) == '.')) {
- Slog.e(TAG, name + " is not a valid Java class name");
- throw new SecurityException(name + " is not a valid Java class name");
- }
}
void validateStrAttr(String attrName, String attrValue) {
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt
index e2ff7b0..a370ebf 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/enterprise/RestrictionsProvider.kt
@@ -22,7 +22,6 @@
import android.os.UserManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
-import androidx.lifecycle.compose.ExperimentalLifecycleComposeApi
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.RestrictedLockUtils
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin
@@ -90,7 +89,6 @@
emit(getRestrictedMode())
}.flowOn(Dispatchers.IO)
- @OptIn(ExperimentalLifecycleComposeApi::class)
@Composable
override fun restrictedModeState() =
restrictedMode.collectAsStateWithLifecycle(initialValue = null)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
index 5c72731..e763797 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java
@@ -99,6 +99,7 @@
import com.android.systemui.statusbar.notification.collection.notifcollection.RankingUpdatedEvent;
import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProvider;
import com.android.systemui.util.Assert;
+import com.android.systemui.util.NamedListenerSet;
import com.android.systemui.util.time.SystemClock;
import java.io.PrintWriter;
@@ -161,7 +162,8 @@
private final HashMap<String, FutureDismissal> mFutureDismissals = new HashMap<>();
@Nullable private CollectionReadyForBuildListener mBuildListener;
- private final List<NotifCollectionListener> mNotifCollectionListeners = new ArrayList<>();
+ private final NamedListenerSet<NotifCollectionListener>
+ mNotifCollectionListeners = new NamedListenerSet<>();
private final List<NotifLifetimeExtender> mLifetimeExtenders = new ArrayList<>();
private final List<NotifDismissInterceptor> mDismissInterceptors = new ArrayList<>();
@@ -236,7 +238,7 @@
/** @see NotifPipeline#addCollectionListener(NotifCollectionListener) */
void addCollectionListener(NotifCollectionListener listener) {
Assert.isMainThread();
- mNotifCollectionListeners.add(listener);
+ mNotifCollectionListeners.addIfAbsent(listener);
}
/** @see NotifPipeline#removeCollectionListener(NotifCollectionListener) */
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt
index d95d593..5acc50a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifLiveDataStoreImpl.kt
@@ -21,7 +21,6 @@
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.util.Assert
import com.android.systemui.util.ListenerSet
-import com.android.systemui.util.isNotEmpty
import com.android.systemui.util.traceSection
import java.util.Collections.unmodifiableList
import java.util.concurrent.Executor
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
index 0205523..240ae0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/ShadeListBuilder.java
@@ -69,6 +69,7 @@
import com.android.systemui.statusbar.notification.collection.notifcollection.CollectionReadyForBuildListener;
import com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt;
import com.android.systemui.util.Assert;
+import com.android.systemui.util.NamedListenerSet;
import com.android.systemui.util.time.SystemClock;
import java.io.PrintWriter;
@@ -121,14 +122,14 @@
private final List<NotifSection> mNotifSections = new ArrayList<>();
private NotifStabilityManager mNotifStabilityManager;
- private final List<OnBeforeTransformGroupsListener> mOnBeforeTransformGroupsListeners =
- new ArrayList<>();
- private final List<OnBeforeSortListener> mOnBeforeSortListeners =
- new ArrayList<>();
- private final List<OnBeforeFinalizeFilterListener> mOnBeforeFinalizeFilterListeners =
- new ArrayList<>();
- private final List<OnBeforeRenderListListener> mOnBeforeRenderListListeners =
- new ArrayList<>();
+ private final NamedListenerSet<OnBeforeTransformGroupsListener>
+ mOnBeforeTransformGroupsListeners = new NamedListenerSet<>();
+ private final NamedListenerSet<OnBeforeSortListener>
+ mOnBeforeSortListeners = new NamedListenerSet<>();
+ private final NamedListenerSet<OnBeforeFinalizeFilterListener>
+ mOnBeforeFinalizeFilterListeners = new NamedListenerSet<>();
+ private final NamedListenerSet<OnBeforeRenderListListener>
+ mOnBeforeRenderListListeners = new NamedListenerSet<>();
@Nullable private OnRenderListListener mOnRenderListListener;
private List<ListEntry> mReadOnlyNotifList = Collections.unmodifiableList(mNotifList);
@@ -184,28 +185,28 @@
Assert.isMainThread();
mPipelineState.requireState(STATE_IDLE);
- mOnBeforeTransformGroupsListeners.add(listener);
+ mOnBeforeTransformGroupsListeners.addIfAbsent(listener);
}
void addOnBeforeSortListener(OnBeforeSortListener listener) {
Assert.isMainThread();
mPipelineState.requireState(STATE_IDLE);
- mOnBeforeSortListeners.add(listener);
+ mOnBeforeSortListeners.addIfAbsent(listener);
}
void addOnBeforeFinalizeFilterListener(OnBeforeFinalizeFilterListener listener) {
Assert.isMainThread();
mPipelineState.requireState(STATE_IDLE);
- mOnBeforeFinalizeFilterListeners.add(listener);
+ mOnBeforeFinalizeFilterListeners.addIfAbsent(listener);
}
void addOnBeforeRenderListListener(OnBeforeRenderListListener listener) {
Assert.isMainThread();
mPipelineState.requireState(STATE_IDLE);
- mOnBeforeRenderListListeners.add(listener);
+ mOnBeforeRenderListListeners.addIfAbsent(listener);
}
void addPreRenderInvalidator(Invalidator invalidator) {
@@ -496,7 +497,9 @@
mTempSectionMembers.add(entry);
}
}
+ Trace.beginSection(section.getLabel());
section.getSectioner().onEntriesUpdated(mTempSectionMembers);
+ Trace.endSection();
mTempSectionMembers.clear();
}
Trace.endSection();
@@ -1430,33 +1433,33 @@
private void dispatchOnBeforeTransformGroups(List<ListEntry> entries) {
Trace.beginSection("ShadeListBuilder.dispatchOnBeforeTransformGroups");
- for (int i = 0; i < mOnBeforeTransformGroupsListeners.size(); i++) {
- mOnBeforeTransformGroupsListeners.get(i).onBeforeTransformGroups(entries);
- }
+ mOnBeforeTransformGroupsListeners.forEachTraced(listener -> {
+ listener.onBeforeTransformGroups(entries);
+ });
Trace.endSection();
}
private void dispatchOnBeforeSort(List<ListEntry> entries) {
Trace.beginSection("ShadeListBuilder.dispatchOnBeforeSort");
- for (int i = 0; i < mOnBeforeSortListeners.size(); i++) {
- mOnBeforeSortListeners.get(i).onBeforeSort(entries);
- }
+ mOnBeforeSortListeners.forEachTraced(listener -> {
+ listener.onBeforeSort(entries);
+ });
Trace.endSection();
}
private void dispatchOnBeforeFinalizeFilter(List<ListEntry> entries) {
Trace.beginSection("ShadeListBuilder.dispatchOnBeforeFinalizeFilter");
- for (int i = 0; i < mOnBeforeFinalizeFilterListeners.size(); i++) {
- mOnBeforeFinalizeFilterListeners.get(i).onBeforeFinalizeFilter(entries);
- }
+ mOnBeforeFinalizeFilterListeners.forEachTraced(listener -> {
+ listener.onBeforeFinalizeFilter(entries);
+ });
Trace.endSection();
}
private void dispatchOnBeforeRenderList(List<ListEntry> entries) {
Trace.beginSection("ShadeListBuilder.dispatchOnBeforeRenderList");
- for (int i = 0; i < mOnBeforeRenderListListeners.size(); i++) {
- mOnBeforeRenderListListeners.get(i).onBeforeRenderList(entries);
- }
+ mOnBeforeRenderListListeners.forEachTraced(listener -> {
+ listener.onBeforeRenderList(entries);
+ });
Trace.endSection();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
index 6500ff7..73decfc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java
@@ -23,6 +23,7 @@
import android.annotation.IntDef;
import android.os.RemoteException;
+import android.os.Trace;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -342,11 +343,13 @@
private void inflateEntry(NotificationEntry entry,
NotifUiAdjustment newAdjustment,
String reason) {
+ Trace.beginSection("PrepCoord.inflateEntry");
abortInflation(entry, reason);
mInflationAdjustments.put(entry, newAdjustment);
mInflatingNotifs.add(entry);
NotifInflater.Params params = getInflaterParams(newAdjustment, reason);
mNotifInflater.inflateViews(entry, params, this::onInflationFinished);
+ Trace.endSection();
}
private void rebind(NotificationEntry entry,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifEvent.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifEvent.kt
index e20f0e5..e06e2d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifEvent.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/notifcollection/NotifEvent.kt
@@ -22,6 +22,8 @@
import android.service.notification.StatusBarNotification
import com.android.systemui.statusbar.notification.collection.NotifCollection
import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.util.NamedListenerSet
+import com.android.systemui.util.traceSection
/**
* Set of classes that represent the various events that [NotifCollection] can dispatch to
@@ -30,10 +32,10 @@
* These events build up in a queue and are periodically emitted in chunks by the collection.
*/
-sealed class NotifEvent {
- fun dispatchTo(listeners: List<NotifCollectionListener>) {
- for (i in listeners.indices) {
- dispatchToListener(listeners[i])
+sealed class NotifEvent(private val traceName: String) {
+ fun dispatchTo(listeners: NamedListenerSet<NotifCollectionListener>) {
+ traceSection(traceName) {
+ listeners.forEachTraced(::dispatchToListener)
}
}
@@ -43,7 +45,7 @@
data class BindEntryEvent(
val entry: NotificationEntry,
val sbn: StatusBarNotification
-) : NotifEvent() {
+) : NotifEvent("onEntryBind") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryBind(entry, sbn)
}
@@ -51,7 +53,7 @@
data class InitEntryEvent(
val entry: NotificationEntry
-) : NotifEvent() {
+) : NotifEvent("onEntryInit") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryInit(entry)
}
@@ -59,7 +61,7 @@
data class EntryAddedEvent(
val entry: NotificationEntry
-) : NotifEvent() {
+) : NotifEvent("onEntryAdded") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryAdded(entry)
}
@@ -68,7 +70,7 @@
data class EntryUpdatedEvent(
val entry: NotificationEntry,
val fromSystem: Boolean
-) : NotifEvent() {
+) : NotifEvent(if (fromSystem) "onEntryUpdated" else "onEntryUpdated fromSystem=true") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryUpdated(entry, fromSystem)
}
@@ -77,7 +79,7 @@
data class EntryRemovedEvent(
val entry: NotificationEntry,
val reason: Int
-) : NotifEvent() {
+) : NotifEvent("onEntryRemoved ${cancellationReasonDebugString(reason)}") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryRemoved(entry, reason)
}
@@ -85,7 +87,7 @@
data class CleanUpEntryEvent(
val entry: NotificationEntry
-) : NotifEvent() {
+) : NotifEvent("onEntryCleanUp") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onEntryCleanUp(entry)
}
@@ -93,13 +95,13 @@
data class RankingUpdatedEvent(
val rankingMap: RankingMap
-) : NotifEvent() {
+) : NotifEvent("onRankingUpdate") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onRankingUpdate(rankingMap)
}
}
-class RankingAppliedEvent() : NotifEvent() {
+class RankingAppliedEvent : NotifEvent("onRankingApplied") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onRankingApplied()
}
@@ -110,7 +112,7 @@
val user: UserHandle,
val channel: NotificationChannel,
val modificationType: Int
-) : NotifEvent() {
+) : NotifEvent("onNotificationChannelModified") {
override fun dispatchToListener(listener: NotifCollectionListener) {
listener.onNotificationChannelModified(pkgName, user, channel, modificationType)
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/DebugModeFilterProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/DebugModeFilterProvider.kt
index fd5bae1..c873e6a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/DebugModeFilterProvider.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/DebugModeFilterProvider.kt
@@ -26,7 +26,6 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.util.Assert
import com.android.systemui.util.ListenerSet
-import com.android.systemui.util.isNotEmpty
import java.io.PrintWriter
import javax.inject.Inject
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
index d896541..9d95342 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt
@@ -33,6 +33,7 @@
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
+import com.android.systemui.util.traceSection
import javax.inject.Inject
/**
@@ -95,7 +96,7 @@
* @throws InflationException Exception if required icons are not valid or specified
*/
@Throws(InflationException::class)
- fun createIcons(entry: NotificationEntry) {
+ fun createIcons(entry: NotificationEntry) = traceSection("IconManager.createIcons") {
// Construct the status bar icon view.
val sbIcon = iconBuilder.createIconView(entry)
sbIcon.scaleType = ImageView.ScaleType.CENTER_INSIDE
@@ -143,9 +144,9 @@
* @throws InflationException Exception if required icons are not valid or specified
*/
@Throws(InflationException::class)
- fun updateIcons(entry: NotificationEntry) {
+ fun updateIcons(entry: NotificationEntry) = traceSection("IconManager.updateIcons") {
if (!entry.icons.areIconsAvailable) {
- return
+ return@traceSection
}
entry.icons.smallIconDescriptor = null
entry.icons.peopleAvatarDescriptor = null
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
index a4e8c2e..80f5d19 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowController.java
@@ -21,12 +21,16 @@
import static com.android.systemui.statusbar.StatusBarState.KEYGUARD;
import static com.android.systemui.statusbar.notification.NotificationUtils.logKey;
+import android.net.Uri;
+import android.os.UserHandle;
+import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.statusbar.IStatusBarService;
@@ -71,6 +75,10 @@
@NotificationRowScope
public class ExpandableNotificationRowController implements NotifViewController {
private static final String TAG = "NotifRowController";
+
+ static final Uri BUBBLES_SETTING_URI =
+ Settings.Secure.getUriFor(Settings.Secure.NOTIFICATION_BUBBLES);
+ private static final String BUBBLES_SETTING_ENABLED_VALUE = "1";
private final ExpandableNotificationRow mView;
private final NotificationListContainer mListContainer;
private final RemoteInputViewSubcomponent.Factory mRemoteInputViewSubcomponentFactory;
@@ -104,6 +112,23 @@
private final ExpandableNotificationRowDragController mDragController;
private final NotificationDismissibilityProvider mDismissibilityProvider;
private final IStatusBarService mStatusBarService;
+
+ private final NotificationSettingsController mSettingsController;
+
+ @VisibleForTesting
+ final NotificationSettingsController.Listener mSettingsListener =
+ new NotificationSettingsController.Listener() {
+ @Override
+ public void onSettingChanged(Uri setting, int userId, String value) {
+ if (BUBBLES_SETTING_URI.equals(setting)) {
+ final int viewUserId = mView.getEntry().getSbn().getUserId();
+ if (viewUserId == UserHandle.USER_ALL || viewUserId == userId) {
+ mView.getPrivateLayout().setBubblesEnabledForUser(
+ BUBBLES_SETTING_ENABLED_VALUE.equals(value));
+ }
+ }
+ }
+ };
private final ExpandableNotificationRow.ExpandableNotificationRowLogger mLoggerCallback =
new ExpandableNotificationRow.ExpandableNotificationRowLogger() {
@Override
@@ -201,6 +226,7 @@
FeatureFlags featureFlags,
PeopleNotificationIdentifier peopleNotificationIdentifier,
Optional<BubblesManager> bubblesManagerOptional,
+ NotificationSettingsController settingsController,
ExpandableNotificationRowDragController dragController,
NotificationDismissibilityProvider dismissibilityProvider,
IStatusBarService statusBarService) {
@@ -229,6 +255,7 @@
mFeatureFlags = featureFlags;
mPeopleNotificationIdentifier = peopleNotificationIdentifier;
mBubblesManagerOptional = bubblesManagerOptional;
+ mSettingsController = settingsController;
mDragController = dragController;
mMetricsLogger = metricsLogger;
mChildrenContainerLogger = childrenContainerLogger;
@@ -298,12 +325,14 @@
NotificationMenuRowPlugin.class, false /* Allow multiple */);
mView.setOnKeyguard(mStatusBarStateController.getState() == KEYGUARD);
mStatusBarStateController.addCallback(mStatusBarStateListener);
+ mSettingsController.addCallback(BUBBLES_SETTING_URI, mSettingsListener);
}
@Override
public void onViewDetachedFromWindow(View v) {
mPluginManager.removePluginListener(mView);
mStatusBarStateController.removeCallback(mStatusBarStateListener);
+ mSettingsController.removeCallback(BUBBLES_SETTING_URI, mSettingsListener);
}
});
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 0322573..065828b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -41,6 +41,8 @@
import android.widget.ImageView;
import android.widget.LinearLayout;
+import androidx.annotation.MainThread;
+
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.R;
@@ -65,7 +67,6 @@
import com.android.systemui.statusbar.policy.SmartReplyView;
import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent;
import com.android.systemui.util.Compile;
-import com.android.systemui.wmshell.BubblesManager;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -134,6 +135,7 @@
private PeopleNotificationIdentifier mPeopleIdentifier;
private RemoteInputViewSubcomponent.Factory mRemoteInputSubcomponentFactory;
private IStatusBarService mStatusBarService;
+ private boolean mBubblesEnabledForUser;
/**
* List of listeners for when content views become inactive (i.e. not the showing view).
@@ -1440,12 +1442,20 @@
}
}
+ @MainThread
+ public void setBubblesEnabledForUser(boolean enabled) {
+ mBubblesEnabledForUser = enabled;
+
+ applyBubbleAction(mExpandedChild, mNotificationEntry);
+ applyBubbleAction(mHeadsUpChild, mNotificationEntry);
+ }
+
@VisibleForTesting
boolean shouldShowBubbleButton(NotificationEntry entry) {
boolean isPersonWithShortcut =
mPeopleIdentifier.getPeopleNotificationType(entry)
>= PeopleNotificationIdentifier.TYPE_FULL_PERSON;
- return BubblesManager.areBubblesEnabled(mContext, entry.getSbn().getUser())
+ return mBubblesEnabledForUser
&& isPersonWithShortcut
&& entry.getBubbleMetadata() != null;
}
@@ -2079,6 +2089,7 @@
pw.print("null");
}
pw.println();
+ pw.println("mBubblesEnabledForUser: " + mBubblesEnabledForUser);
pw.print("RemoteInputViews { ");
pw.print(" visibleType: " + mVisibleType);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSettingsController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSettingsController.java
new file mode 100644
index 0000000..51e4537
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationSettingsController.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.notification.row;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.systemui.Dumpable;
+import com.android.systemui.dagger.SysUISingleton;
+import com.android.systemui.dagger.qualifiers.Background;
+import com.android.systemui.dagger.qualifiers.Main;
+import com.android.systemui.dump.DumpManager;
+import com.android.systemui.settings.UserTracker;
+import com.android.systemui.util.settings.SecureSettings;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import javax.inject.Inject;
+
+/**
+ * Centralized controller for listening to Secure Settings changes and informing in-process
+ * listeners, on a background thread.
+ */
+@SysUISingleton
+public class NotificationSettingsController implements Dumpable {
+
+ private final static String TAG = "NotificationSettingsController";
+ private final UserTracker mUserTracker;
+ private final UserTracker.Callback mCurrentUserTrackerCallback;
+ private final Handler mMainHandler;
+ private final Handler mBackgroundHandler;
+ private final ContentObserver mContentObserver;
+ private final SecureSettings mSecureSettings;
+ private final HashMap<Uri, ArrayList<Listener>> mListeners = new HashMap<>();
+
+ @Inject
+ public NotificationSettingsController(UserTracker userTracker,
+ @Main Handler mainHandler,
+ @Background Handler backgroundHandler,
+ SecureSettings secureSettings,
+ DumpManager dumpManager) {
+ mUserTracker = userTracker;
+ mMainHandler = mainHandler;
+ mBackgroundHandler = backgroundHandler;
+ mSecureSettings = secureSettings;
+ mContentObserver = new ContentObserver(mBackgroundHandler) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ super.onChange(selfChange, uri);
+ synchronized (mListeners) {
+ if (mListeners.containsKey(uri)) {
+ int userId = mUserTracker.getUserId();
+ String value = getCurrentSettingValue(uri, userId);
+ for (Listener listener : mListeners.get(uri)) {
+ mMainHandler.post(() -> listener.onSettingChanged(uri, userId, value));
+ }
+ }
+ }
+ }
+ };
+
+ mCurrentUserTrackerCallback = new UserTracker.Callback() {
+ @Override
+ public void onUserChanged(int newUser, Context userContext) {
+ synchronized (mListeners) {
+ if (mListeners.size() > 0) {
+ mSecureSettings.unregisterContentObserver(mContentObserver);
+ for (Uri uri : mListeners.keySet()) {
+ mSecureSettings.registerContentObserverForUser(
+ uri, false, mContentObserver, newUser);
+ }
+ }
+ }
+ }
+ };
+ mUserTracker.addCallback(
+ mCurrentUserTrackerCallback, new HandlerExecutor(mBackgroundHandler));
+
+ dumpManager.registerNormalDumpable(TAG, this);
+ }
+
+ /**
+ * Register a callback whenever the given secure settings changes.
+ *
+ * On registration, will trigger the listener on the main thread with the current value of
+ * the setting.
+ */
+ @Main
+ public void addCallback(@NonNull Uri uri, @NonNull Listener listener) {
+ if (uri == null || listener == null) {
+ return;
+ }
+ synchronized (mListeners) {
+ ArrayList<Listener> currentListeners = mListeners.get(uri);
+ if (currentListeners == null) {
+ currentListeners = new ArrayList<>();
+ }
+ if (!currentListeners.contains(listener)) {
+ currentListeners.add(listener);
+ }
+ mListeners.put(uri, currentListeners);
+ if (currentListeners.size() == 1) {
+ mSecureSettings.registerContentObserverForUser(
+ uri, false, mContentObserver, mUserTracker.getUserId());
+ }
+ }
+ mBackgroundHandler.post(() -> {
+ int userId = mUserTracker.getUserId();
+ String value = getCurrentSettingValue(uri, userId);
+ mMainHandler.post(() -> listener.onSettingChanged(uri, userId, value));
+ });
+
+ }
+
+ public void removeCallback(Uri uri, Listener listener) {
+ synchronized (mListeners) {
+ ArrayList<Listener> currentListeners = mListeners.get(uri);
+
+ if (currentListeners != null) {
+ currentListeners.remove(listener);
+ }
+ if (currentListeners == null || currentListeners.size() == 0) {
+ mListeners.remove(uri);
+ }
+
+ if (mListeners.size() == 0) {
+ mSecureSettings.unregisterContentObserver(mContentObserver);
+ }
+ }
+ }
+
+ @Override
+ public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
+ synchronized (mListeners) {
+ pw.println("Settings Uri Listener List:");
+ for (Uri uri : mListeners.keySet()) {
+ pw.println(" Uri=" + uri);
+ for (Listener listener : mListeners.get(uri)) {
+ pw.println(" Listener=" + listener.getClass().getName());
+ }
+ }
+ }
+ }
+
+ private String getCurrentSettingValue(Uri uri, int userId) {
+ final String setting = uri == null ? null : uri.getLastPathSegment();
+ return mSecureSettings.getStringForUser(setting, userId);
+ }
+
+ /**
+ * Listener invoked whenever settings are changed.
+ */
+ public interface Listener {
+ @MainThread
+ void onSettingChanged(@NonNull Uri setting, int userId, @Nullable String value);
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/util/IListenerSet.kt b/packages/SystemUI/src/com/android/systemui/util/IListenerSet.kt
new file mode 100644
index 0000000..b0230b8
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/IListenerSet.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util
+
+/**
+ * A collection of listeners, observers, callbacks, etc.
+ *
+ * This container is optimized for infrequent mutation and frequent iteration, with thread safety
+ * and reentrant-safety guarantees as well. Specifically, to ensure that
+ * [ConcurrentModificationException] is never thrown, this iterator will not reflect changes made to
+ * the set after the iterator is constructed.
+ */
+interface IListenerSet<E : Any> : Set<E> {
+ /**
+ * A thread-safe, reentrant-safe method to add a listener. Does nothing if the listener is
+ * already in the set.
+ */
+ fun addIfAbsent(element: E): Boolean
+
+ /** A thread-safe, reentrant-safe method to remove a listener. */
+ fun remove(element: E): Boolean
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt b/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt
index a47e614..f8e0b3d 100644
--- a/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt
+++ b/packages/SystemUI/src/com/android/systemui/util/ListenerSet.kt
@@ -29,20 +29,12 @@
class ListenerSet<E : Any>
/** Private constructor takes the internal list so that we can use auto-delegation */
private constructor(private val listeners: CopyOnWriteArrayList<E>) :
- Collection<E> by listeners, Set<E> {
+ Collection<E> by listeners, IListenerSet<E> {
/** Create a new instance */
constructor() : this(CopyOnWriteArrayList())
- /**
- * A thread-safe, reentrant-safe method to add a listener. Does nothing if the listener is
- * already in the set.
- */
- fun addIfAbsent(element: E): Boolean = listeners.addIfAbsent(element)
+ override fun addIfAbsent(element: E): Boolean = listeners.addIfAbsent(element)
- /** A thread-safe, reentrant-safe method to remove a listener. */
- fun remove(element: E): Boolean = listeners.remove(element)
+ override fun remove(element: E): Boolean = listeners.remove(element)
}
-
-/** Extension to match Collection which is implemented to only be (easily) accessible in kotlin */
-fun <T : Any> ListenerSet<T>.isNotEmpty(): Boolean = !isEmpty()
diff --git a/packages/SystemUI/src/com/android/systemui/util/NamedListenerSet.kt b/packages/SystemUI/src/com/android/systemui/util/NamedListenerSet.kt
new file mode 100644
index 0000000..c90b57e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/NamedListenerSet.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util
+
+import java.util.concurrent.CopyOnWriteArrayList
+import java.util.function.Consumer
+
+/**
+ * A collection of listeners, observers, callbacks, etc.
+ *
+ * This container is optimized for infrequent mutation and frequent iteration, with thread safety
+ * and reentrant-safety guarantees as well. Specifically, to ensure that
+ * [ConcurrentModificationException] is never thrown, this iterator will not reflect changes made to
+ * the set after the iterator is constructed.
+ *
+ * This class provides all the abilities of [ListenerSet], except that each listener has a name
+ * calculated at runtime which can be used for time-efficient tracing of listener invocations.
+ */
+class NamedListenerSet<E : Any>(
+ private val getName: (E) -> String = { it.javaClass.name },
+) : IListenerSet<E> {
+ private val listeners = CopyOnWriteArrayList<NamedListener>()
+
+ override val size: Int
+ get() = listeners.size
+
+ override fun isEmpty() = listeners.isEmpty()
+
+ override fun iterator(): Iterator<E> = iterator {
+ listeners.iterator().forEach { yield(it.listener) }
+ }
+
+ override fun containsAll(elements: Collection<E>) =
+ listeners.count { it.listener in elements } == elements.size
+
+ override fun contains(element: E) = listeners.firstOrNull { it.listener == element } != null
+
+ override fun addIfAbsent(element: E): Boolean = listeners.addIfAbsent(NamedListener(element))
+
+ override fun remove(element: E): Boolean = listeners.removeIf { it.listener == element }
+
+ /** A wrapper for the listener with an associated name. */
+ inner class NamedListener(val listener: E) {
+ val name: String = getName(listener)
+
+ override fun hashCode(): Int {
+ return listener.hashCode()
+ }
+
+ override fun equals(other: Any?): Boolean =
+ when {
+ other === null -> false
+ other === this -> true
+ other !is NamedListenerSet<*>.NamedListener -> false
+ listener == other.listener -> true
+ else -> false
+ }
+ }
+
+ /** Iterate the listeners in the set, providing the name for each one as well. */
+ inline fun forEachNamed(block: (String, E) -> Unit) =
+ namedIterator().forEach { element -> block(element.name, element.listener) }
+
+ /**
+ * Iterate the listeners in the set, wrapping each call to the block with [traceSection] using
+ * the listener name.
+ */
+ inline fun forEachTraced(block: (E) -> Unit) = forEachNamed { name, listener ->
+ traceSection(name) { block(listener) }
+ }
+
+ /**
+ * Iterate the listeners in the set, wrapping each call to the block with [traceSection] using
+ * the listener name.
+ */
+ fun forEachTraced(consumer: Consumer<E>) = forEachNamed { name, listener ->
+ traceSection(name) { consumer.accept(listener) }
+ }
+
+ /** Iterate over the [NamedListener]s currently in the set. */
+ fun namedIterator(): Iterator<NamedListener> = listeners.iterator()
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt
index 764005b8..0cc0b98 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowControllerTest.kt
@@ -17,6 +17,10 @@
package com.android.systemui.statusbar.notification.row
+import android.app.Notification
+import android.net.Uri
+import android.os.UserHandle
+import android.os.UserHandle.USER_ALL
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper
import androidx.test.filters.SmallTest
@@ -29,13 +33,17 @@
import com.android.systemui.plugins.FalsingManager
import com.android.systemui.plugins.PluginManager
import com.android.systemui.plugins.statusbar.StatusBarStateController
+import com.android.systemui.statusbar.SbnBuilder
import com.android.systemui.statusbar.SmartReplyController
+import com.android.systemui.statusbar.notification.collection.NotificationEntry
+import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder
import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProvider
import com.android.systemui.statusbar.notification.collection.render.FakeNodeController
import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager
import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager
import com.android.systemui.statusbar.notification.logging.NotificationLogger
import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRowController.BUBBLES_SETTING_URI
import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer
import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainerLogger
import com.android.systemui.statusbar.notification.stack.NotificationListContainer
@@ -46,9 +54,9 @@
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.withArgCaptor
import com.android.systemui.util.time.SystemClock
import com.android.systemui.wmshell.BubblesManager
-import java.util.Optional
import junit.framework.Assert
import org.junit.After
import org.junit.Before
@@ -56,9 +64,11 @@
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.mock
import org.mockito.Mockito.never
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
+import java.util.Optional
@SmallTest
@RunWith(AndroidTestingRunner::class)
@@ -94,10 +104,10 @@
private val featureFlags: FeatureFlags = mock()
private val peopleNotificationIdentifier: PeopleNotificationIdentifier = mock()
private val bubblesManager: BubblesManager = mock()
+ private val settingsController: NotificationSettingsController = mock()
private val dragController: ExpandableNotificationRowDragController = mock()
private val dismissibilityProvider: NotificationDismissibilityProvider = mock()
private val statusBarService: IStatusBarService = mock()
-
private lateinit var controller: ExpandableNotificationRowController
@Before
@@ -134,11 +144,16 @@
featureFlags,
peopleNotificationIdentifier,
Optional.of(bubblesManager),
+ settingsController,
dragController,
dismissibilityProvider,
statusBarService
)
whenever(view.childrenContainer).thenReturn(childrenContainer)
+
+ val notification = Notification.Builder(mContext).build()
+ val sbn = SbnBuilder().setNotification(notification).build()
+ whenever(view.entry).thenReturn(NotificationEntryBuilder().setSbn(sbn).build())
}
@After
@@ -206,4 +221,74 @@
verify(view).removeChildNotification(eq(childView))
verify(listContainer).notifyGroupChildRemoved(eq(childView), eq(childrenContainer))
}
+
+ @Test
+ fun registerSettingsListener_forBubbles() {
+ controller.init(mock(NotificationEntry::class.java))
+ val viewStateObserver = withArgCaptor {
+ verify(view).addOnAttachStateChangeListener(capture());
+ }
+ viewStateObserver.onViewAttachedToWindow(view);
+ verify(settingsController).addCallback(any(), any());
+ }
+
+ @Test
+ fun unregisterSettingsListener_forBubbles() {
+ controller.init(mock(NotificationEntry::class.java))
+ val viewStateObserver = withArgCaptor {
+ verify(view).addOnAttachStateChangeListener(capture());
+ }
+ viewStateObserver.onViewDetachedFromWindow(view);
+ verify(settingsController).removeCallback(any(), any());
+ }
+
+ @Test
+ fun settingsListener_invalidUri() {
+ controller.mSettingsListener.onSettingChanged(Uri.EMPTY, view.entry.sbn.userId, "1")
+
+ verify(view, never()).getPrivateLayout()
+ }
+
+ @Test
+ fun settingsListener_invalidUserId() {
+ controller.mSettingsListener.onSettingChanged(BUBBLES_SETTING_URI, -1000, "1")
+ controller.mSettingsListener.onSettingChanged(BUBBLES_SETTING_URI, -1000, null)
+
+ verify(view, never()).getPrivateLayout()
+ }
+
+ @Test
+ fun settingsListener_validUserId() {
+ val childView: NotificationContentView = mock()
+ whenever(view.privateLayout).thenReturn(childView)
+
+ controller.mSettingsListener.onSettingChanged(
+ BUBBLES_SETTING_URI, view.entry.sbn.userId, "1")
+ verify(childView).setBubblesEnabledForUser(true)
+
+ controller.mSettingsListener.onSettingChanged(
+ BUBBLES_SETTING_URI, view.entry.sbn.userId, "9")
+ verify(childView).setBubblesEnabledForUser(false)
+ }
+
+ @Test
+ fun settingsListener_userAll() {
+ val childView: NotificationContentView = mock()
+ whenever(view.privateLayout).thenReturn(childView)
+
+ val notification = Notification.Builder(mContext).build()
+ val sbn = SbnBuilder().setNotification(notification)
+ .setUser(UserHandle.of(USER_ALL))
+ .build()
+ whenever(view.entry).thenReturn(NotificationEntryBuilder()
+ .setSbn(sbn)
+ .setUser(UserHandle.of(USER_ALL))
+ .build())
+
+ controller.mSettingsListener.onSettingChanged(BUBBLES_SETTING_URI, 9, "1")
+ verify(childView).setBubblesEnabledForUser(true)
+
+ controller.mSettingsListener.onSettingChanged(BUBBLES_SETTING_URI, 1, "0")
+ verify(childView).setBubblesEnabledForUser(false)
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt
index 0b90ebe..c4baa69 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentViewTest.kt
@@ -250,6 +250,9 @@
.thenReturn(actionListMarginTarget)
view.setContainingNotification(mockContainingNotification)
+ // Given: controller says bubbles are enabled for the user
+ view.setBubblesEnabledForUser(true);
+
// When: call NotificationContentView.setExpandedChild() to set the expandedChild
view.expandedChild = mockExpandedChild
@@ -305,6 +308,12 @@
// NotificationEntry, which should show bubble button
view.onNotificationUpdated(createMockNotificationEntry(true))
+ // Then: no bubble yet
+ assertEquals(notificationContentMargin, getMarginBottom(actionListMarginTarget))
+
+ // Given: controller says bubbles are enabled for the user
+ view.setBubblesEnabledForUser(true);
+
// Then: bottom margin of actionListMarginTarget should not change, still be 20
assertEquals(0, getMarginBottom(actionListMarginTarget))
}
@@ -405,7 +414,6 @@
val userMock: UserHandle = mock()
whenever(this.sbn).thenReturn(sbnMock)
whenever(sbnMock.user).thenReturn(userMock)
- doReturn(showButton).whenever(view).shouldShowBubbleButton(this)
}
private fun createLinearLayoutWithBottomMargin(bottomMargin: Int): LinearLayout {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
new file mode 100644
index 0000000..614995b
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt
@@ -0,0 +1,248 @@
+/*
+ * Copyright (c) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package com.android.systemui.statusbar.notification.row
+
+import android.app.ActivityManager
+import android.database.ContentObserver
+import android.net.Uri
+import android.os.Handler
+import android.provider.Settings.Secure
+import android.testing.AndroidTestingRunner
+import android.testing.TestableLooper
+import androidx.test.filters.SmallTest
+import com.android.systemui.SysuiTestCase
+import com.android.systemui.dump.DumpManager
+import com.android.systemui.settings.UserTracker
+import com.android.systemui.statusbar.notification.row.NotificationSettingsController.Listener
+import com.android.systemui.util.mockito.any
+import com.android.systemui.util.mockito.capture
+import com.android.systemui.util.mockito.eq
+import com.android.systemui.util.mockito.mock
+import com.android.systemui.util.mockito.whenever
+import com.android.systemui.util.settings.SecureSettings
+import org.junit.After
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.ArgumentCaptor
+import org.mockito.ArgumentMatchers
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
+import org.mockito.Captor
+import org.mockito.Mock
+import org.mockito.Mockito
+import org.mockito.Mockito.anyBoolean
+import org.mockito.Mockito.never
+import org.mockito.Mockito.verify
+import org.mockito.MockitoAnnotations
+
+@SmallTest
+@RunWith(AndroidTestingRunner::class)
+@TestableLooper.RunWithLooper
+class NotificationSettingsControllerTest : SysuiTestCase() {
+
+ val setting1: String = Secure.NOTIFICATION_BUBBLES
+ val setting2: String = Secure.ACCESSIBILITY_ENABLED
+ val settingUri1: Uri = Secure.getUriFor(setting1)
+ val settingUri2: Uri = Secure.getUriFor(setting2)
+
+ @Mock
+ private lateinit var userTracker: UserTracker
+ private lateinit var mainHandler: Handler
+ private lateinit var backgroundHandler: Handler
+ private lateinit var testableLooper: TestableLooper
+ @Mock
+ private lateinit var secureSettings: SecureSettings
+ @Mock
+ private lateinit var dumpManager: DumpManager
+
+ @Captor
+ private lateinit var userTrackerCallbackCaptor: ArgumentCaptor<UserTracker.Callback>
+ @Captor
+ private lateinit var settingsObserverCaptor: ArgumentCaptor<ContentObserver>
+
+ private lateinit var controller: NotificationSettingsController
+
+ @Before
+ fun setUp() {
+ MockitoAnnotations.initMocks(this)
+ testableLooper = TestableLooper.get(this)
+ mainHandler = Handler(testableLooper.looper)
+ backgroundHandler = Handler(testableLooper.looper)
+ allowTestableLooperAsMainThread()
+ controller =
+ NotificationSettingsController(
+ userTracker,
+ mainHandler,
+ backgroundHandler,
+ secureSettings,
+ dumpManager
+ )
+ }
+
+ @After
+ fun tearDown() {
+ disallowTestableLooperAsMainThread()
+ }
+
+ @Test
+ fun creationRegistersCallbacks() {
+ verify(userTracker).addCallback(any(), any())
+ verify(dumpManager).registerNormalDumpable(anyString(), eq(controller))
+ }
+ @Test
+ fun updateContentObserverRegistration_onUserChange_noSettingsListeners() {
+ verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
+ val userCallback = userTrackerCallbackCaptor.value
+ val userId = 9
+
+ // When: User is changed
+ userCallback.onUserChanged(userId, context)
+
+ // Validate: Nothing to do, since we aren't monitoring settings
+ verify(secureSettings, never()).unregisterContentObserver(any())
+ verify(secureSettings, never()).registerContentObserverForUser(
+ any(Uri::class.java), anyBoolean(), any(), anyInt())
+ }
+ @Test
+ fun updateContentObserverRegistration_onUserChange_withSettingsListeners() {
+ // When: someone is listening to a setting
+ controller.addCallback(settingUri1,
+ Mockito.mock(Listener::class.java))
+
+ verify(userTracker).addCallback(capture(userTrackerCallbackCaptor), any())
+ val userCallback = userTrackerCallbackCaptor.value
+ val userId = 9
+
+ // Then: User is changed
+ userCallback.onUserChanged(userId, context)
+
+ // Validate: The tracker is unregistered and re-registered with the new user
+ verify(secureSettings).unregisterContentObserver(any())
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri1), eq(false), any(), eq(userId))
+ }
+
+ @Test
+ fun addCallback_onlyFirstForUriRegistersObserver() {
+ controller.addCallback(settingUri1,
+ Mockito.mock(Listener::class.java))
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))
+
+ controller.addCallback(settingUri1,
+ Mockito.mock(Listener::class.java))
+ verify(secureSettings).registerContentObserverForUser(
+ any(Uri::class.java), anyBoolean(), any(), anyInt())
+ }
+
+ @Test
+ fun addCallback_secondUriRegistersObserver() {
+ controller.addCallback(settingUri1,
+ Mockito.mock(Listener::class.java))
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))
+
+ controller.addCallback(settingUri2,
+ Mockito.mock(Listener::class.java))
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri2), eq(false), any(), eq(ActivityManager.getCurrentUser()))
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri1), anyBoolean(), any(), anyInt())
+ }
+
+ @Test
+ fun removeCallback_lastUnregistersObserver() {
+ val listenerSetting1 : Listener = mock()
+ val listenerSetting2 : Listener = mock()
+ controller.addCallback(settingUri1, listenerSetting1)
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri1), eq(false), any(), eq(ActivityManager.getCurrentUser()))
+
+ controller.addCallback(settingUri2, listenerSetting2)
+ verify(secureSettings).registerContentObserverForUser(
+ eq(settingUri2), anyBoolean(), any(), anyInt())
+
+ controller.removeCallback(settingUri2, listenerSetting2)
+ verify(secureSettings, never()).unregisterContentObserver(any())
+
+ controller.removeCallback(settingUri1, listenerSetting1)
+ verify(secureSettings).unregisterContentObserver(any())
+ }
+
+ @Test
+ fun addCallback_updatesCurrentValue() {
+ whenever(secureSettings.getStringForUser(
+ setting1, ActivityManager.getCurrentUser())).thenReturn("9")
+ whenever(secureSettings.getStringForUser(
+ setting2, ActivityManager.getCurrentUser())).thenReturn("5")
+
+ val listenerSetting1a : Listener = mock()
+ val listenerSetting1b : Listener = mock()
+ val listenerSetting2 : Listener = mock()
+
+ controller.addCallback(settingUri1, listenerSetting1a)
+ controller.addCallback(settingUri1, listenerSetting1b)
+ controller.addCallback(settingUri2, listenerSetting2)
+
+ testableLooper.processAllMessages()
+
+ verify(listenerSetting1a).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ verify(listenerSetting1b).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ verify(listenerSetting2).onSettingChanged(
+ settingUri2, ActivityManager.getCurrentUser(), "5")
+ }
+
+ @Test
+ fun removeCallback_noMoreUpdates() {
+ whenever(secureSettings.getStringForUser(
+ setting1, ActivityManager.getCurrentUser())).thenReturn("9")
+
+ val listenerSetting1a : Listener = mock()
+ val listenerSetting1b : Listener = mock()
+
+ // First, register
+ controller.addCallback(settingUri1, listenerSetting1a)
+ controller.addCallback(settingUri1, listenerSetting1b)
+ testableLooper.processAllMessages()
+
+ verify(secureSettings).registerContentObserverForUser(
+ any(Uri::class.java), anyBoolean(), capture(settingsObserverCaptor), anyInt())
+ verify(listenerSetting1a).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ verify(listenerSetting1b).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ Mockito.clearInvocations(listenerSetting1b)
+ Mockito.clearInvocations(listenerSetting1a)
+
+ // Remove one of them
+ controller.removeCallback(settingUri1, listenerSetting1a)
+
+ // On update, only remaining listener should get the callback
+ settingsObserverCaptor.value.onChange(false, settingUri1)
+ testableLooper.processAllMessages()
+
+ verify(listenerSetting1a, never()).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ verify(listenerSetting1b).onSettingChanged(
+ settingUri1, ActivityManager.getCurrentUser(), "9")
+ }
+
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/ListenerSetTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/ListenerSetTest.kt
index 2662da2..1404a4f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/ListenerSetTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/ListenerSetTest.kt
@@ -16,43 +16,128 @@
package com.android.systemui.util
-import android.test.suitebuilder.annotation.SmallTest
-import androidx.test.runner.AndroidJUnit4
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
-class ListenerSetTest : SysuiTestCase() {
+open class ListenerSetTest : SysuiTestCase() {
- var runnableSet: ListenerSet<Runnable> = ListenerSet()
+ private val runnableSet: IListenerSet<Runnable> = makeRunnableListenerSet()
- @Before
- fun setup() {
- runnableSet = ListenerSet()
- }
+ open fun makeRunnableListenerSet(): IListenerSet<Runnable> = ListenerSet()
@Test
fun addIfAbsent_doesNotDoubleAdd() {
// setup & preconditions
val runnable1 = Runnable { }
val runnable2 = Runnable { }
- assertThat(runnableSet.toList()).isEmpty()
+ assertThat(runnableSet).isEmpty()
// Test that an element can be added
assertThat(runnableSet.addIfAbsent(runnable1)).isTrue()
- assertThat(runnableSet.toList()).containsExactly(runnable1)
+ assertThat(runnableSet).containsExactly(runnable1)
// Test that a second element can be added
assertThat(runnableSet.addIfAbsent(runnable2)).isTrue()
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
// Test that re-adding the first element does nothing and returns false
assertThat(runnableSet.addIfAbsent(runnable1)).isFalse()
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
+ }
+
+ @Test
+ fun isEmpty_changes() {
+ val runnable = Runnable { }
+ assertThat(runnableSet).isEmpty()
+ assertThat(runnableSet.isEmpty()).isTrue()
+ assertThat(runnableSet.isNotEmpty()).isFalse()
+
+ assertThat(runnableSet.addIfAbsent(runnable)).isTrue()
+ assertThat(runnableSet).isNotEmpty()
+ assertThat(runnableSet.isEmpty()).isFalse()
+ assertThat(runnableSet.isNotEmpty()).isTrue()
+
+ assertThat(runnableSet.remove(runnable)).isTrue()
+ assertThat(runnableSet).isEmpty()
+ assertThat(runnableSet.isEmpty()).isTrue()
+ assertThat(runnableSet.isNotEmpty()).isFalse()
+ }
+
+ @Test
+ fun size_changes() {
+ assertThat(runnableSet).isEmpty()
+ assertThat(runnableSet.size).isEqualTo(0)
+
+ assertThat(runnableSet.addIfAbsent(Runnable { })).isTrue()
+ assertThat(runnableSet.size).isEqualTo(1)
+
+ assertThat(runnableSet.addIfAbsent(Runnable { })).isTrue()
+ assertThat(runnableSet.size).isEqualTo(2)
+ }
+
+ @Test
+ fun contains_worksAsExpected() {
+ val runnable1 = Runnable { }
+ val runnable2 = Runnable { }
+ assertThat(runnableSet).isEmpty()
+ assertThat(runnable1 in runnableSet).isFalse()
+ assertThat(runnable2 in runnableSet).isFalse()
+ assertThat(runnableSet).doesNotContain(runnable1)
+ assertThat(runnableSet).doesNotContain(runnable2)
+
+ assertThat(runnableSet.addIfAbsent(runnable1)).isTrue()
+ assertThat(runnable1 in runnableSet).isTrue()
+ assertThat(runnable2 in runnableSet).isFalse()
+ assertThat(runnableSet).contains(runnable1)
+ assertThat(runnableSet).doesNotContain(runnable2)
+
+ assertThat(runnableSet.addIfAbsent(runnable2)).isTrue()
+ assertThat(runnable1 in runnableSet).isTrue()
+ assertThat(runnable2 in runnableSet).isTrue()
+ assertThat(runnableSet).contains(runnable1)
+ assertThat(runnableSet).contains(runnable2)
+
+ assertThat(runnableSet.remove(runnable1)).isTrue()
+ assertThat(runnable1 in runnableSet).isFalse()
+ assertThat(runnable2 in runnableSet).isTrue()
+ assertThat(runnableSet).doesNotContain(runnable1)
+ assertThat(runnableSet).contains(runnable2)
+ }
+
+ @Test
+ fun containsAll_worksAsExpected() {
+ val runnable1 = Runnable { }
+ val runnable2 = Runnable { }
+
+ assertThat(runnableSet).isEmpty()
+ assertThat(runnableSet.containsAll(listOf())).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1))).isFalse()
+ assertThat(runnableSet.containsAll(listOf(runnable2))).isFalse()
+ assertThat(runnableSet.containsAll(listOf(runnable1, runnable2))).isFalse()
+
+ assertThat(runnableSet.addIfAbsent(runnable1)).isTrue()
+ assertThat(runnableSet.containsAll(listOf())).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1))).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable2))).isFalse()
+ assertThat(runnableSet.containsAll(listOf(runnable1, runnable2))).isFalse()
+
+ assertThat(runnableSet.addIfAbsent(runnable2)).isTrue()
+ assertThat(runnableSet.containsAll(listOf())).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1))).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable2))).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1, runnable2))).isTrue()
+
+ assertThat(runnableSet.remove(runnable1)).isTrue()
+ assertThat(runnableSet.containsAll(listOf())).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1))).isFalse()
+ assertThat(runnableSet.containsAll(listOf(runnable2))).isTrue()
+ assertThat(runnableSet.containsAll(listOf(runnable1, runnable2))).isFalse()
}
@Test
@@ -60,22 +145,22 @@
// setup and preconditions
val runnable1 = Runnable { }
val runnable2 = Runnable { }
- assertThat(runnableSet.toList()).isEmpty()
+ assertThat(runnableSet).isEmpty()
runnableSet.addIfAbsent(runnable1)
runnableSet.addIfAbsent(runnable2)
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
// Test that removing the first runnable only removes that one runnable
assertThat(runnableSet.remove(runnable1)).isTrue()
- assertThat(runnableSet.toList()).containsExactly(runnable2)
+ assertThat(runnableSet).containsExactly(runnable2)
// Test that removing a non-present runnable does not error
assertThat(runnableSet.remove(runnable1)).isFalse()
- assertThat(runnableSet.toList()).containsExactly(runnable2)
+ assertThat(runnableSet).containsExactly(runnable2)
// Test that removing the other runnable succeeds
assertThat(runnableSet.remove(runnable2)).isTrue()
- assertThat(runnableSet.toList()).isEmpty()
+ assertThat(runnableSet).isEmpty()
}
@Test
@@ -92,17 +177,17 @@
val runnable2 = Runnable {
runnablesCalled.add(2)
}
- assertThat(runnableSet.toList()).isEmpty()
+ assertThat(runnableSet).isEmpty()
runnableSet.addIfAbsent(runnable1)
runnableSet.addIfAbsent(runnable2)
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
// Test that both runnables are called and 1 was removed
for (runnable in runnableSet) {
runnable.run()
}
assertThat(runnablesCalled).containsExactly(1, 2)
- assertThat(runnableSet.toList()).containsExactly(runnable2)
+ assertThat(runnableSet).containsExactly(runnable2)
}
@Test
@@ -120,16 +205,16 @@
val runnable2 = Runnable {
runnablesCalled.add(2)
}
- assertThat(runnableSet.toList()).isEmpty()
+ assertThat(runnableSet).isEmpty()
runnableSet.addIfAbsent(runnable1)
runnableSet.addIfAbsent(runnable2)
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
// Test that both original runnables are called and 99 was added but not called
for (runnable in runnableSet) {
runnable.run()
}
assertThat(runnablesCalled).containsExactly(1, 2)
- assertThat(runnableSet.toList()).containsExactly(runnable1, runnable2, runnable99)
+ assertThat(runnableSet).containsExactly(runnable1, runnable2, runnable99)
}
}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/NamedListenerSetTest.kt b/packages/SystemUI/tests/src/com/android/systemui/util/NamedListenerSetTest.kt
new file mode 100644
index 0000000..c89e317
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/NamedListenerSetTest.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.util
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class NamedListenerSetTest : ListenerSetTest() {
+ override fun makeRunnableListenerSet(): IListenerSet<Runnable> = NamedListenerSet()
+
+ private val runnableSet = NamedListenerSet(NamedRunnable::name)
+
+ class NamedRunnable(val name: String, private val block: () -> Unit = {}) : Runnable {
+ override fun run() = block()
+ }
+
+ @Test
+ fun addIfAbsent_addsMultipleWithSameName_onlyIfInstanceIsAbsent() {
+ // setup & preconditions
+ val runnable1 = NamedRunnable("A")
+ val runnable2 = NamedRunnable("A")
+ assertThat(runnableSet).isEmpty()
+
+ // Test that an element can be added
+ assertThat(runnableSet.addIfAbsent(runnable1)).isTrue()
+ assertThat(runnableSet).containsExactly(runnable1)
+
+ // Test that a second element can be added, even with the same name
+ assertThat(runnableSet.addIfAbsent(runnable2)).isTrue()
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
+
+ // Test that re-adding the first element does nothing and returns false
+ assertThat(runnableSet.addIfAbsent(runnable1)).isFalse()
+ assertThat(runnableSet).containsExactly(runnable1, runnable2)
+ }
+
+ @Test
+ fun forEachNamed_includesCorrectNames() {
+ val runnable1 = NamedRunnable("A")
+ val runnable2 = NamedRunnable("X")
+ val runnable3 = NamedRunnable("X")
+ assertThat(runnableSet).isEmpty()
+
+ assertThat(runnableSet.addIfAbsent(runnable1)).isTrue()
+ assertThat(runnableSet.toNamedPairs())
+ .containsExactly(
+ "A" to runnable1,
+ )
+
+ assertThat(runnableSet.addIfAbsent(runnable2)).isTrue()
+ assertThat(runnableSet.toNamedPairs())
+ .containsExactly(
+ "A" to runnable1,
+ "X" to runnable2,
+ )
+
+ assertThat(runnableSet.addIfAbsent(runnable3)).isTrue()
+ assertThat(runnableSet.toNamedPairs())
+ .containsExactly(
+ "A" to runnable1,
+ "X" to runnable2,
+ "X" to runnable3,
+ )
+
+ assertThat(runnableSet.remove(runnable1)).isTrue()
+ assertThat(runnableSet.toNamedPairs())
+ .containsExactly(
+ "X" to runnable2,
+ "X" to runnable3,
+ )
+
+ assertThat(runnableSet.remove(runnable2)).isTrue()
+ assertThat(runnableSet.toNamedPairs())
+ .containsExactly(
+ "X" to runnable3,
+ )
+ }
+
+ /**
+ * This private method uses [NamedListenerSet.forEachNamed] to produce a list of pairs in order
+ * to validate that method.
+ */
+ private fun <T : Any> NamedListenerSet<T>.toNamedPairs() =
+ sequence { forEachNamed { name, listener -> yield(name to listener) } }.toList()
+}
diff --git a/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java b/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java
index 9ad4628..2e0274b 100644
--- a/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java
+++ b/services/core/java/com/android/server/inputmethod/ImeVisibilityStateComputer.java
@@ -23,6 +23,7 @@
import static android.server.inputmethod.InputMethodManagerServiceProto.SHOW_FORCED;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;
+import static android.view.MotionEvent.TOOL_TYPE_UNKNOWN;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE;
import static android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED;
@@ -44,6 +45,7 @@
import android.util.Printer;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import android.view.MotionEvent;
import android.view.WindowManager;
import android.view.inputmethod.ImeTracker;
import android.view.inputmethod.InputMethod;
@@ -351,7 +353,8 @@
void setWindowState(IBinder windowToken, @NonNull ImeTargetWindowState newState) {
final ImeTargetWindowState state = mRequestWindowStateMap.get(windowToken);
- if (state != null && newState.hasEditorFocused()) {
+ if (state != null && newState.hasEditorFocused()
+ && newState.mToolType != MotionEvent.TOOL_TYPE_STYLUS) {
// Inherit the last requested IME visible state when the target window is still
// focused with an editor.
newState.setRequestedImeVisible(state.mRequestedImeVisible);
@@ -652,14 +655,23 @@
* A class that represents the current state of the IME target window.
*/
static class ImeTargetWindowState {
+
ImeTargetWindowState(@SoftInputModeFlags int softInputModeState, int windowFlags,
boolean imeFocusChanged, boolean hasFocusedEditor,
boolean isStartInputByGainFocus) {
+ this(softInputModeState, windowFlags, imeFocusChanged, hasFocusedEditor,
+ isStartInputByGainFocus, TOOL_TYPE_UNKNOWN);
+ }
+
+ ImeTargetWindowState(@SoftInputModeFlags int softInputModeState, int windowFlags,
+ boolean imeFocusChanged, boolean hasFocusedEditor,
+ boolean isStartInputByGainFocus, @MotionEvent.ToolType int toolType) {
mSoftInputModeState = softInputModeState;
mWindowFlags = windowFlags;
mImeFocusChanged = imeFocusChanged;
mHasFocusedEditor = hasFocusedEditor;
mIsStartInputByGainFocus = isStartInputByGainFocus;
+ mToolType = toolType;
}
/**
@@ -670,6 +682,11 @@
private final int mWindowFlags;
/**
+ * {@link MotionEvent#getToolType(int)} that was used to click editor.
+ */
+ private final int mToolType;
+
+ /**
* {@code true} means the IME focus changed from the previous window, {@code false}
* otherwise.
*/
@@ -718,6 +735,10 @@
return mWindowFlags;
}
+ int getToolType() {
+ return mToolType;
+ }
+
private void setImeDisplayId(int imeDisplayId) {
mImeDisplayId = imeDisplayId;
}
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
index 1d222e5..20c7029 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodBindingController.java
@@ -40,6 +40,7 @@
import android.view.WindowManager;
import android.view.inputmethod.InputMethod;
import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -295,7 +296,12 @@
}
if (DEBUG) Slog.v(TAG, "Initiating attach with token: " + mCurToken);
final InputMethodInfo info = mMethodMap.get(mSelectedMethodId);
+ boolean supportsStylusHwChanged =
+ mSupportsStylusHw != info.supportsStylusHandwriting();
mSupportsStylusHw = info.supportsStylusHandwriting();
+ if (supportsStylusHwChanged) {
+ InputMethodManager.invalidateLocalStylusHandwritingAvailabilityCaches();
+ }
mService.initializeImeLocked(mCurMethod, mCurToken);
mService.scheduleNotifyImeUidToAudioService(mCurMethodUid);
mService.reRequestCurrentClientSessionLocked();
diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
index 4ce7e24..2fc4829 100644
--- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java
@@ -2315,8 +2315,6 @@
mCurClient = null;
ImeTracker.forLogging().onFailed(mCurStatsToken, ImeTracker.PHASE_SERVER_WAIT_IME);
mCurStatsToken = null;
- InputMethodManager.invalidateLocalStylusHandwritingAvailabilityCaches();
-
mMenuController.hideInputMethodMenuLocked();
}
}
@@ -3794,11 +3792,14 @@
final boolean isTextEditor = (startInputFlags & StartInputFlags.IS_TEXT_EDITOR) != 0;
final boolean startInputByWinGainedFocus =
(startInputFlags & StartInputFlags.WINDOW_GAINED_FOCUS) != 0;
+ final int toolType = editorInfo != null
+ ? editorInfo.getInitialToolType() : MotionEvent.TOOL_TYPE_UNKNOWN;
// Init the focused window state (e.g. whether the editor has focused or IME focus has
// changed from another window).
- final ImeTargetWindowState windowState = new ImeTargetWindowState(softInputMode,
- windowFlags, !sameWindowFocused, isTextEditor, startInputByWinGainedFocus);
+ final ImeTargetWindowState windowState = new ImeTargetWindowState(
+ softInputMode, windowFlags, !sameWindowFocused, isTextEditor,
+ startInputByWinGainedFocus, toolType);
mVisibilityStateComputer.setWindowState(windowToken, windowState);
if (sameWindowFocused && isTextEditor) {
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 1b52725..dd3604e 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -1519,6 +1519,7 @@
ai.privateFlags = ps.getPrivateFlags();
pi.applicationInfo = PackageInfoUtils.generateDelegateApplicationInfo(
ai, flags, state, userId);
+ pi.signingInfo = ps.getSigningInfo();
if (DEBUG_PACKAGE_INFO) {
Log.v(TAG, "ps.pkg is n/a for ["
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index a5a4594..b5ec136 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -470,7 +470,6 @@
// We need to set it back to 'installed' so the uninstall
// broadcasts will be sent correctly.
if (DEBUG_REMOVE) Slog.d(TAG, "Not installed by other users, full delete");
- ps.setPkg(null);
ps.setInstalled(true, userId);
mPm.mSettings.writeKernelMappingLPr(ps);
clearPackageStateAndReturn = false;
diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java
index 6b8765e..dee31ec 100644
--- a/services/core/java/com/android/server/pm/PackageSetting.java
+++ b/services/core/java/com/android/server/pm/PackageSetting.java
@@ -20,6 +20,7 @@
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
@@ -80,9 +81,38 @@
* @hide
*/
@DataClass(genGetters = true, genConstructor = false, genSetters = false, genBuilder = false)
-@DataClass.Suppress({"getSnapshot", })
+@DataClass.Suppress({"getSnapshot", "getBooleans"})
public class PackageSetting extends SettingBase implements PackageStateInternal {
+ // Use a bitset to store boolean data to save memory
+ private static class Booleans {
+ @IntDef({
+ INSTALL_PERMISSION_FIXED,
+ DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
+ UPDATE_AVAILABLE,
+ FORCE_QUERYABLE_OVERRIDE
+ })
+ public @interface Flags {
+ }
+ private static final int INSTALL_PERMISSION_FIXED = 1;
+ private static final int DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1 << 1;
+ private static final int UPDATE_AVAILABLE = 1 << 2;
+ private static final int FORCE_QUERYABLE_OVERRIDE = 1 << 3;
+ }
+ private int mBooleans;
+
+ private void setBoolean(@Booleans.Flags int flag, boolean value) {
+ if (value) {
+ mBooleans |= flag;
+ } else {
+ mBooleans &= ~flag;
+ }
+ }
+
+ private boolean getBoolean(@Booleans.Flags int flag) {
+ return (mBooleans & flag) != 0;
+ }
+
/**
* The shared user ID lets us link this object to {@link SharedUserSetting}.
*/
@@ -160,8 +190,6 @@
@NonNull
private PackageSignatures signatures;
- private boolean installPermissionsFixed;
-
@NonNull
private PackageKeySetData keySetData = new PackageKeySetData();
@@ -176,17 +204,9 @@
@Nullable
private String volumeUuid;
- /** @see PackageState#isDefaultToDeviceProtectedStorage() */
- private boolean defaultToDeviceProtectedStorage;
-
/** @see PackageState#getCategoryOverride() */
private int categoryOverride = ApplicationInfo.CATEGORY_UNDEFINED;
- /** @see PackageState#isUpdateAvailable() */
- private boolean updateAvailable;
-
- private boolean forceQueryableOverride;
-
@NonNull
private final PackageStateUnserialized pkgState = new PackageStateUnserialized(this);
@@ -262,7 +282,8 @@
this.mRealName = realPkgName;
}
- PackageSetting(@NonNull PackageSetting original, boolean sealedSnapshot) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public PackageSetting(@NonNull PackageSetting original, boolean sealedSnapshot) {
super(original);
copyPackageSetting(original, sealedSnapshot);
if (sealedSnapshot) {
@@ -366,7 +387,7 @@
}
public PackageSetting setForceQueryableOverride(boolean forceQueryableOverride) {
- this.forceQueryableOverride = forceQueryableOverride;
+ setBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE, forceQueryableOverride);
onChanged();
return this;
}
@@ -492,7 +513,7 @@
public PackageSetting setDefaultToDeviceProtectedStorage(
boolean defaultToDeviceProtectedStorage) {
- this.defaultToDeviceProtectedStorage = defaultToDeviceProtectedStorage;
+ setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE, defaultToDeviceProtectedStorage);
onChanged();
return this;
}
@@ -503,7 +524,7 @@
}
public PackageSetting setUpdateAvailable(boolean updateAvailable) {
- this.updateAvailable = updateAvailable;
+ setBoolean(Booleans.UPDATE_AVAILABLE, updateAvailable);
onChanged();
return this;
}
@@ -595,7 +616,7 @@
}
public PackageSetting setInstallPermissionsFixed(boolean installPermissionsFixed) {
- this.installPermissionsFixed = installPermissionsFixed;
+ setBoolean(Booleans.INSTALL_PERMISSION_FIXED, installPermissionsFixed);
return this;
}
@@ -645,6 +666,7 @@
public void copyPackageSetting(PackageSetting other, boolean sealedSnapshot) {
super.copySettingBase(other);
+ mBooleans = other.mBooleans;
mSharedUserAppId = other.mSharedUserAppId;
mLoadingProgress = other.mLoadingProgress;
mLoadingCompletedTime = other.mLoadingCompletedTime;
@@ -662,14 +684,10 @@
lastUpdateTime = other.lastUpdateTime;
versionCode = other.versionCode;
signatures = other.signatures;
- installPermissionsFixed = other.installPermissionsFixed;
keySetData = new PackageKeySetData(other.keySetData);
installSource = other.installSource;
volumeUuid = other.volumeUuid;
- defaultToDeviceProtectedStorage = other.defaultToDeviceProtectedStorage;
categoryOverride = other.categoryOverride;
- updateAvailable = other.updateAvailable;
- forceQueryableOverride = other.forceQueryableOverride;
mDomainSetId = other.mDomainSetId;
mAppMetadataFilePath = other.mAppMetadataFilePath;
@@ -1293,7 +1311,7 @@
@NonNull
@Override
public List<SharedLibrary> getSharedLibraryDependencies() {
- return (List<SharedLibrary>) (List<?>) pkgState.getUsesLibraryInfos();
+ return Collections.unmodifiableList(pkgState.getUsesLibraryInfos());
}
@NonNull
@@ -1305,7 +1323,7 @@
@NonNull
@Override
public List<String> getUsesLibraryFiles() {
- return pkgState.getUsesLibraryFiles();
+ return Collections.unmodifiableList(pkgState.getUsesLibraryFiles());
}
@NonNull
@@ -1485,6 +1503,32 @@
return getAndroidPackage() != null && getAndroidPackage().isApex();
}
+ @Override
+ public boolean isForceQueryableOverride() {
+ return getBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE);
+ }
+
+ /**
+ * @see PackageState#isUpdateAvailable()
+ */
+ @Override
+ public boolean isUpdateAvailable() {
+ return getBoolean(Booleans.UPDATE_AVAILABLE);
+ }
+
+ @Override
+ public boolean isInstallPermissionsFixed() {
+ return getBoolean(Booleans.INSTALL_PERMISSION_FIXED);
+ }
+
+ /**
+ * @see PackageState#isDefaultToDeviceProtectedStorage()
+ */
+ @Override
+ public boolean isDefaultToDeviceProtectedStorage() {
+ return getBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE);
+ }
+
// Code below generated by codegen v1.0.23.
@@ -1587,11 +1631,6 @@
}
@DataClass.Generated.Member
- public boolean isInstallPermissionsFixed() {
- return installPermissionsFixed;
- }
-
- @DataClass.Generated.Member
public @NonNull PackageKeySetData getKeySetData() {
return keySetData;
}
@@ -1610,14 +1649,6 @@
}
/**
- * @see PackageState#isDefaultToDeviceProtectedStorage()
- */
- @DataClass.Generated.Member
- public boolean isDefaultToDeviceProtectedStorage() {
- return defaultToDeviceProtectedStorage;
- }
-
- /**
* @see PackageState#getCategoryOverride()
*/
@DataClass.Generated.Member
@@ -1625,19 +1656,6 @@
return categoryOverride;
}
- /**
- * @see PackageState#isUpdateAvailable()
- */
- @DataClass.Generated.Member
- public boolean isUpdateAvailable() {
- return updateAvailable;
- }
-
- @DataClass.Generated.Member
- public boolean isForceQueryableOverride() {
- return forceQueryableOverride;
- }
-
@DataClass.Generated.Member
public @NonNull PackageStateUnserialized getPkgState() {
return pkgState;
@@ -1654,10 +1672,10 @@
}
@DataClass.Generated(
- time = 1691106047978L,
+ time = 1691185420362L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/PackageSetting.java",
- inputSignatures = "private int mSharedUserAppId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackageInternal pkg\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate long mLoadingCompletedTime\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate boolean installPermissionsFixed\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate boolean defaultToDeviceProtectedStorage\nprivate int categoryOverride\nprivate boolean updateAvailable\nprivate boolean forceQueryableOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate @android.annotation.Nullable java.lang.String mAppMetadataFilePath\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackage(java.lang.String,int)\npublic com.android.server.pm.PackageSetting setUpdateOwnerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic com.android.server.pm.PackageSetting setDefaultToDeviceProtectedStorage(boolean)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic void setSharedUserAppId(int)\npublic @java.lang.Override int getSharedUserAppId()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting,boolean)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long,int,com.android.server.pm.pkg.ArchiveState)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponents(int)\n com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\nprivate static void writeArchiveState(android.util.proto.ProtoOutputStream,com.android.server.pm.pkg.ArchiveState)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isIncremental()\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic com.android.server.pm.PackageSetting setLoadingCompletedTime(long)\npublic com.android.server.pm.PackageSetting setAppMetadataFilePath(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackage getAndroidPackage()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<com.android.server.pm.pkg.SharedLibrary> getSharedLibraryDependencies()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryInfo(android.content.pm.SharedLibraryInfo)\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryFile(java.lang.String)\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getApexModuleName()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic com.android.server.pm.PackageSetting setApexModuleName(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbi()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbi()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getSeInfo()\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbiLegacy()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbiLegacy()\npublic @android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy @java.lang.Override int getHiddenApiEnforcementPolicy()\npublic @java.lang.Override boolean isApex()\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)")
+ inputSignatures = "private int mBooleans\nprivate int mSharedUserAppId\nprivate @android.annotation.Nullable java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mimeGroups\nprivate @java.lang.Deprecated @android.annotation.Nullable java.util.Set<java.lang.String> mOldCodePaths\nprivate @android.annotation.Nullable java.lang.String[] usesSdkLibraries\nprivate @android.annotation.Nullable long[] usesSdkLibrariesVersionsMajor\nprivate @android.annotation.Nullable java.lang.String[] usesStaticLibraries\nprivate @android.annotation.Nullable long[] usesStaticLibrariesVersions\nprivate @android.annotation.Nullable @java.lang.Deprecated java.lang.String legacyNativeLibraryPath\nprivate @android.annotation.NonNull java.lang.String mName\nprivate @android.annotation.Nullable java.lang.String mRealName\nprivate int mAppId\nprivate @android.annotation.Nullable com.android.server.pm.parsing.pkg.AndroidPackageInternal pkg\nprivate @android.annotation.NonNull java.io.File mPath\nprivate @android.annotation.NonNull java.lang.String mPathString\nprivate float mLoadingProgress\nprivate long mLoadingCompletedTime\nprivate @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate long mLastModifiedTime\nprivate long lastUpdateTime\nprivate long versionCode\nprivate @android.annotation.NonNull com.android.server.pm.PackageSignatures signatures\nprivate @android.annotation.NonNull com.android.server.pm.PackageKeySetData keySetData\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserStateImpl> mUserStates\nprivate @android.annotation.NonNull com.android.server.pm.InstallSource installSource\nprivate @android.annotation.Nullable java.lang.String volumeUuid\nprivate int categoryOverride\nprivate final @android.annotation.NonNull com.android.server.pm.pkg.PackageStateUnserialized pkgState\nprivate @android.annotation.NonNull java.util.UUID mDomainSetId\nprivate @android.annotation.Nullable java.lang.String mAppMetadataFilePath\nprivate final @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.PackageSetting> makeCache()\npublic com.android.server.pm.PackageSetting snapshot()\npublic void dumpDebug(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\npublic com.android.server.pm.PackageSetting setAppId(int)\npublic com.android.server.pm.PackageSetting setCpuAbiOverride(java.lang.String)\npublic com.android.server.pm.PackageSetting setFirstInstallTimeFromReplaced(com.android.server.pm.pkg.PackageStateInternal,int[])\npublic com.android.server.pm.PackageSetting setFirstInstallTime(long,int)\npublic com.android.server.pm.PackageSetting setForceQueryableOverride(boolean)\npublic com.android.server.pm.PackageSetting setInstallerPackage(java.lang.String,int)\npublic com.android.server.pm.PackageSetting setUpdateOwnerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setInstallSource(com.android.server.pm.InstallSource)\n com.android.server.pm.PackageSetting removeInstallerPackage(java.lang.String)\npublic com.android.server.pm.PackageSetting setIsOrphaned(boolean)\npublic com.android.server.pm.PackageSetting setKeySetData(com.android.server.pm.PackageKeySetData)\npublic com.android.server.pm.PackageSetting setLastModifiedTime(long)\npublic com.android.server.pm.PackageSetting setLastUpdateTime(long)\npublic com.android.server.pm.PackageSetting setLongVersionCode(long)\npublic boolean setMimeGroup(java.lang.String,android.util.ArraySet<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPkg(com.android.server.pm.pkg.AndroidPackage)\npublic com.android.server.pm.PackageSetting setPkgStateLibraryFiles(java.util.Collection<java.lang.String>)\npublic com.android.server.pm.PackageSetting setPrimaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSecondaryCpuAbi(java.lang.String)\npublic com.android.server.pm.PackageSetting setSignatures(com.android.server.pm.PackageSignatures)\npublic com.android.server.pm.PackageSetting setVolumeUuid(java.lang.String)\npublic com.android.server.pm.PackageSetting setDefaultToDeviceProtectedStorage(boolean)\npublic @java.lang.Override boolean isExternalStorage()\npublic com.android.server.pm.PackageSetting setUpdateAvailable(boolean)\npublic void setSharedUserAppId(int)\npublic @java.lang.Override int getSharedUserAppId()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override java.lang.String toString()\nprotected void copyMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic void updateFrom(com.android.server.pm.PackageSetting)\n com.android.server.pm.PackageSetting updateMimeGroups(java.util.Set<java.lang.String>)\npublic @java.lang.Deprecated @java.lang.Override com.android.server.pm.permission.LegacyPermissionState getLegacyPermissionState()\npublic com.android.server.pm.PackageSetting setInstallPermissionsFixed(boolean)\npublic boolean isPrivileged()\npublic boolean isOem()\npublic boolean isVendor()\npublic boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic boolean isSystemExt()\npublic boolean isOdm()\npublic boolean isSystem()\npublic android.content.pm.SigningDetails getSigningDetails()\npublic com.android.server.pm.PackageSetting setSigningDetails(android.content.pm.SigningDetails)\npublic void copyPackageSetting(com.android.server.pm.PackageSetting,boolean)\n @com.android.internal.annotations.VisibleForTesting com.android.server.pm.pkg.PackageUserStateImpl modifyUserState(int)\npublic com.android.server.pm.pkg.PackageUserStateImpl getOrCreateUserState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateInternal readUserState(int)\n void setEnabled(int,int,java.lang.String)\n int getEnabled(int)\n void setInstalled(boolean,int)\n boolean getInstalled(int)\n int getInstallReason(int)\n void setInstallReason(int,int)\n int getUninstallReason(int)\n void setUninstallReason(int,int)\n @android.annotation.NonNull android.content.pm.overlay.OverlayPaths getOverlayPaths(int)\n boolean setOverlayPathsForLibrary(java.lang.String,android.content.pm.overlay.OverlayPaths,int)\n boolean isAnyInstalled(int[])\n int[] queryInstalledUsers(int[],boolean)\n long getCeDataInode(int)\n void setCeDataInode(long,int)\n boolean getStopped(int)\n void setStopped(boolean,int)\n boolean getNotLaunched(int)\n void setNotLaunched(boolean,int)\n boolean getHidden(int)\n void setHidden(boolean,int)\n int getDistractionFlags(int)\n void setDistractionFlags(int,int)\npublic boolean getInstantApp(int)\n void setInstantApp(boolean,int)\n boolean getVirtualPreload(int)\n void setVirtualPreload(boolean,int)\n void setUserState(int,long,int,boolean,boolean,boolean,boolean,int,android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>,boolean,boolean,java.lang.String,android.util.ArraySet<java.lang.String>,android.util.ArraySet<java.lang.String>,int,int,java.lang.String,java.lang.String,long,int,com.android.server.pm.pkg.ArchiveState)\n void setUserState(int,com.android.server.pm.pkg.PackageUserStateInternal)\n com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponents(int)\n com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponents(int)\n void setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setEnabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n void setDisabledComponentsCopy(com.android.server.utils.WatchedArraySet<java.lang.String>,int)\n com.android.server.pm.pkg.PackageUserStateImpl modifyUserStateComponents(int,boolean,boolean)\n void addDisabledComponent(java.lang.String,int)\n void addEnabledComponent(java.lang.String,int)\n boolean enableComponentLPw(java.lang.String,int)\n boolean disableComponentLPw(java.lang.String,int)\n boolean restoreComponentLPw(java.lang.String,int)\n int getCurrentEnabledStateLPr(java.lang.String,int)\n void removeUser(int)\npublic int[] getNotInstalledUserIds()\n void writePackageUserPermissionsProto(android.util.proto.ProtoOutputStream,long,java.util.List<android.content.pm.UserInfo>,com.android.server.pm.permission.LegacyPermissionDataProvider)\nprotected void writeUsersInfoToProto(android.util.proto.ProtoOutputStream,long)\nprivate static void writeArchiveState(android.util.proto.ProtoOutputStream,com.android.server.pm.pkg.ArchiveState)\n com.android.server.pm.PackageSetting setPath(java.io.File)\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideNonLocalizedLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer,int)\npublic void resetOverrideComponentLabelIcon(int)\npublic @android.annotation.Nullable java.lang.String getSplashScreenTheme(int)\npublic boolean isIncremental()\npublic boolean isLoading()\npublic com.android.server.pm.PackageSetting setLoadingProgress(float)\npublic com.android.server.pm.PackageSetting setLoadingCompletedTime(long)\npublic com.android.server.pm.PackageSetting setAppMetadataFilePath(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override long getVersionCode()\npublic @android.annotation.Nullable @java.lang.Override java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getMimeGroups()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String getPackageName()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.pm.pkg.AndroidPackage getAndroidPackage()\npublic @android.annotation.NonNull android.content.pm.SigningInfo getSigningInfo()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesSdkLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesSdkLibrariesVersionsMajor()\npublic @android.annotation.NonNull @java.lang.Override java.lang.String[] getUsesStaticLibraries()\npublic @android.annotation.NonNull @java.lang.Override long[] getUsesStaticLibrariesVersions()\npublic @android.annotation.NonNull @java.lang.Override java.util.List<com.android.server.pm.pkg.SharedLibrary> getSharedLibraryDependencies()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryInfo(android.content.pm.SharedLibraryInfo)\npublic @android.annotation.NonNull @java.lang.Override java.util.List<java.lang.String> getUsesLibraryFiles()\npublic @android.annotation.NonNull com.android.server.pm.PackageSetting addUsesLibraryFile(java.lang.String)\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @android.annotation.NonNull @java.lang.Override long[] getLastPackageUsageTime()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getApexModuleName()\npublic com.android.server.pm.PackageSetting setDomainSetId(java.util.UUID)\npublic com.android.server.pm.PackageSetting setCategoryOverride(int)\npublic com.android.server.pm.PackageSetting setLegacyNativeLibraryPath(java.lang.String)\npublic com.android.server.pm.PackageSetting setMimeGroups(java.util.Map<java.lang.String,java.util.Set<java.lang.String>>)\npublic com.android.server.pm.PackageSetting setOldCodePaths(java.util.Set<java.lang.String>)\npublic com.android.server.pm.PackageSetting setUsesSdkLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesSdkLibrariesVersionsMajor(long[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibraries(java.lang.String[])\npublic com.android.server.pm.PackageSetting setUsesStaticLibrariesVersions(long[])\npublic com.android.server.pm.PackageSetting setApexModuleName(java.lang.String)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageStateUnserialized getTransientState()\npublic @android.annotation.NonNull android.util.SparseArray<? extends PackageUserStateInternal> getUserStates()\npublic com.android.server.pm.PackageSetting addMimeTypes(java.lang.String,java.util.Set<java.lang.String>)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbi()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbi()\npublic @android.annotation.Nullable @java.lang.Override java.lang.String getSeInfo()\npublic @android.annotation.Nullable java.lang.String getPrimaryCpuAbiLegacy()\npublic @android.annotation.Nullable java.lang.String getSecondaryCpuAbiLegacy()\npublic @android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy @java.lang.Override int getHiddenApiEnforcementPolicy()\npublic @java.lang.Override boolean isApex()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isDefaultToDeviceProtectedStorage()\nclass PackageSetting extends com.android.server.pm.SettingBase implements [com.android.server.pm.pkg.PackageStateInternal]\nprivate static final int INSTALL_PERMISSION_FIXED\nprivate static final int DEFAULT_TO_DEVICE_PROTECTED_STORAGE\nprivate static final int UPDATE_AVAILABLE\nprivate static final int FORCE_QUERYABLE_OVERRIDE\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genGetters=true, genConstructor=false, genSetters=false, genBuilder=false)")
@Deprecated
private void __metadata() {}
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index 59314a2..6d3b26c 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -135,6 +135,7 @@
cacher.cleanCachedResult(codePath);
}
+ // Used for system apps only
public void removePackage(AndroidPackage pkg, boolean chatty) {
synchronized (mPm.mInstallLock) {
removePackageLI(pkg, chatty);
@@ -284,6 +285,13 @@
}
removePackageLI(deletedPs.getPackageName(), (flags & PackageManager.DELETE_CHATTY) != 0);
+ if (!deletedPs.isSystem()) {
+ // A non-system app's AndroidPackage object has been removed from the service.
+ // Explicitly nullify the corresponding app's PackageSetting's pkg object to
+ // prevent any future usage of it, in case the PackageSetting object will remain because
+ // of DELETE_KEEP_DATA.
+ deletedPs.setPkg(null);
+ }
if ((flags & PackageManager.DELETE_KEEP_DATA) == 0) {
final AndroidPackage resolvedPkg;
diff --git a/services/core/java/com/android/server/pm/pkg/PackageState.java b/services/core/java/com/android/server/pm/pkg/PackageState.java
index 492e0ce..3f347e4 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageState.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageState.java
@@ -59,11 +59,6 @@
public interface PackageState {
/*
- * Until immutability or read-only caching is enabled, {@link PackageSetting} cannot be
- * returned directly, so {@link PackageStateImpl} is used to temporarily copy the data.
- * This is a relatively expensive operation since it has to create an object for every package,
- * but it's much lighter than the alternative of generating {@link PackageInfo} objects.
- * <p>
* TODO: Documentation
* TODO: Currently missing, should be exposed as API?
* - keySetData
diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java
deleted file mode 100644
index 4060271..0000000
--- a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java
+++ /dev/null
@@ -1,770 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm.pkg;
-
-import android.annotation.IntDef;
-import android.annotation.LongDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.content.pm.SigningInfo;
-import android.content.pm.overlay.OverlayPaths;
-import android.os.UserHandle;
-import android.util.ArraySet;
-import android.util.SparseArray;
-
-import com.android.internal.util.DataClass;
-import com.android.server.pm.PackageManagerService;
-import com.android.server.pm.PackageSetting;
-import com.android.server.pm.Settings;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Consumer;
-
-/**
- * Because a {@link PackageSetting} cannot be returned from {@link Settings} without holding the
- * {@link PackageManagerService#mLock}, this class serves as a memory snapshot of the state of a
- * single package, for use with {@link PackageManagerInternal#getPackageState(String)} and {@link
- * PackageManagerInternal#forEachPackageState(boolean, Consumer)}.
- *
- * @hide
- */
-@DataClass(genConstructor = false)
-@DataClass.Suppress({"mUserStates"})
-public class PackageStateImpl implements PackageState {
-
- public static PackageState copy(@NonNull PackageStateInternal pkgSetting) {
- return new PackageStateImpl(pkgSetting, pkgSetting.getPkg());
- }
-
- private static class Booleans {
- @LongDef({
- SYSTEM,
- EXTERNAL_STORAGE,
- PRIVILEGED,
- OEM,
- VENDOR,
- PRODUCT,
- SYSTEM_EXT,
- REQUIRED_FOR_SYSTEM_USER,
- ODM,
- FORCE_QUERYABLE_OVERRIDE,
- HIDDEN_UNTIL_INSTALLED,
- INSTALL_PERMISSIONS_FIXED,
- UPDATE_AVAILABLE,
- UPDATED_SYSTEM_APP,
- APK_IN_UPDATED_APEX,
- DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
- })
- public @interface Flags {
- }
-
- private static final long SYSTEM = 1;
- private static final long EXTERNAL_STORAGE = 1 << 1;
- private static final long PRIVILEGED = 1 << 2;
- private static final long OEM = 1 << 3;
- private static final long VENDOR = 1 << 4;
- private static final long PRODUCT = 1 << 5;
- private static final long SYSTEM_EXT = 1 << 6;
- private static final long REQUIRED_FOR_SYSTEM_USER = 1 << 7;
- private static final long ODM = 1 << 8;
- private static final long FORCE_QUERYABLE_OVERRIDE = 1 << 9;
- private static final long HIDDEN_UNTIL_INSTALLED = 1 << 10;
- private static final long INSTALL_PERMISSIONS_FIXED = 1 << 11;
- private static final long UPDATE_AVAILABLE = 1 << 12;
- private static final long UPDATED_SYSTEM_APP = 1 << 13;
- private static final long APK_IN_UPDATED_APEX = 1 << 14;
- private static final long DEFAULT_TO_DEVICE_PROTECTED_STORAGE = 1L << 15;
- }
-
- private long mBooleans;
-
- private void setBoolean(@Booleans.Flags long flag, boolean value) {
- if (value) {
- mBooleans |= flag;
- } else {
- mBooleans &= ~flag;
- }
- }
-
- private boolean getBoolean(@Booleans.Flags long flag) {
- return (mBooleans & flag) != 0;
- }
-
- @Nullable
- private final AndroidPackage mAndroidPackage;
-
- @NonNull
- private final String mPackageName;
- @Nullable
- private final String mVolumeUuid;
- private final int mAppId;
- private final int mCategoryOverride;
- @Nullable
- private final String mCpuAbiOverride;
- @ApplicationInfo.HiddenApiEnforcementPolicy
- private final int mHiddenApiEnforcementPolicy;
- private final long mLastModifiedTime;
- private final long mLastUpdateTime;
- private final long mLongVersionCode;
- @NonNull
- private final Map<String, Set<String>> mMimeGroups;
- @NonNull
- private final File mPath;
- @Nullable
- private final String mPrimaryCpuAbi;
- @Nullable
- private final String mSecondaryCpuAbi;
- @Nullable
- private final String mSeInfo;
- private final boolean mHasSharedUser;
- private final int mSharedUserAppId;
- @NonNull
- private final String[] mUsesSdkLibraries;
- @NonNull
- private final long[] mUsesSdkLibrariesVersionsMajor;
- @NonNull
- private final String[] mUsesStaticLibraries;
- @NonNull
- private final long[] mUsesStaticLibrariesVersions;
- @NonNull
- private final List<SharedLibrary> mSharedLibraryDependencies;
- @NonNull
- private final List<String> mUsesLibraryFiles;
- @NonNull
- private final long[] mLastPackageUsageTime;
- @NonNull
- private final SigningInfo mSigningInfo;
- @NonNull
- private final SparseArray<PackageUserState> mUserStates;
- @Nullable
- private final String mApexModuleName;
-
- private PackageStateImpl(@NonNull PackageState pkgState, @Nullable AndroidPackage pkg) {
- mAndroidPackage = pkg;
-
- setBoolean(Booleans.SYSTEM, pkgState.isSystem());
- setBoolean(Booleans.EXTERNAL_STORAGE, pkgState.isExternalStorage());
- setBoolean(Booleans.PRIVILEGED, pkgState.isPrivileged());
- setBoolean(Booleans.OEM, pkgState.isOem());
- setBoolean(Booleans.VENDOR, pkgState.isVendor());
- setBoolean(Booleans.PRODUCT, pkgState.isProduct());
- setBoolean(Booleans.SYSTEM_EXT, pkgState.isSystemExt());
- setBoolean(Booleans.REQUIRED_FOR_SYSTEM_USER, pkgState.isRequiredForSystemUser());
- setBoolean(Booleans.ODM, pkgState.isOdm());
-
- mPackageName = pkgState.getPackageName();
- mVolumeUuid = pkgState.getVolumeUuid();
- setBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE,
- pkgState.isDefaultToDeviceProtectedStorage());
- mAppId = pkgState.getAppId();
- mCategoryOverride = pkgState.getCategoryOverride();
- mCpuAbiOverride = pkgState.getCpuAbiOverride();
- mHiddenApiEnforcementPolicy = pkgState.getHiddenApiEnforcementPolicy();
- mLastModifiedTime = pkgState.getLastModifiedTime();
- mLastUpdateTime = pkgState.getLastUpdateTime();
- mLongVersionCode = pkgState.getVersionCode();
- mMimeGroups = Collections.unmodifiableMap(pkgState.getMimeGroups());
- mPath = pkgState.getPath();
- mPrimaryCpuAbi = pkgState.getPrimaryCpuAbi();
- mSecondaryCpuAbi = pkgState.getSecondaryCpuAbi();
- mSeInfo = pkgState.getSeInfo();
- mHasSharedUser = pkgState.hasSharedUser();
- mSharedUserAppId = pkgState.getSharedUserAppId();
- mUsesSdkLibraries = pkgState.getUsesSdkLibraries();
- mUsesSdkLibrariesVersionsMajor = pkgState.getUsesSdkLibrariesVersionsMajor();
- mUsesStaticLibraries = pkgState.getUsesStaticLibraries();
- mUsesStaticLibrariesVersions = pkgState.getUsesStaticLibrariesVersions();
- mSharedLibraryDependencies =
- Collections.unmodifiableList(pkgState.getSharedLibraryDependencies());
- mUsesLibraryFiles = Collections.unmodifiableList(pkgState.getUsesLibraryFiles());
- setBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE, pkgState.isForceQueryableOverride());
- setBoolean(Booleans.HIDDEN_UNTIL_INSTALLED, pkgState.isHiddenUntilInstalled());
- setBoolean(Booleans.INSTALL_PERMISSIONS_FIXED, pkgState.isInstallPermissionsFixed());
- setBoolean(Booleans.UPDATE_AVAILABLE, pkgState.isUpdateAvailable());
- mLastPackageUsageTime = pkgState.getLastPackageUsageTime();
- setBoolean(Booleans.UPDATED_SYSTEM_APP, pkgState.isUpdatedSystemApp());
- setBoolean(Booleans.APK_IN_UPDATED_APEX, pkgState.isApkInUpdatedApex());
- mSigningInfo = pkgState.getSigningInfo();
-
- SparseArray<? extends PackageUserState> userStates = pkgState.getUserStates();
- int userStatesSize = userStates.size();
- mUserStates = new SparseArray<>(userStatesSize);
- for (int index = 0; index < userStatesSize; index++) {
- mUserStates.put(userStates.keyAt(index),
- UserStateImpl.copy(userStates.valueAt(index)));
- }
-
- mApexModuleName = pkgState.getApexModuleName();
- }
-
- @NonNull
- @Override
- public PackageUserState getStateForUser(@NonNull UserHandle user) {
- PackageUserState userState = getUserStates().get(user.getIdentifier());
- return userState == null ? PackageUserState.DEFAULT : userState;
- }
-
- @Override
- public boolean isExternalStorage() {
- return getBoolean(Booleans.EXTERNAL_STORAGE);
- }
-
- @Override
- public boolean isForceQueryableOverride() {
- return getBoolean(Booleans.FORCE_QUERYABLE_OVERRIDE);
- }
-
- @Override
- public boolean isHiddenUntilInstalled() {
- return getBoolean(Booleans.HIDDEN_UNTIL_INSTALLED);
- }
-
- @Override
- public boolean isInstallPermissionsFixed() {
- return getBoolean(Booleans.INSTALL_PERMISSIONS_FIXED);
- }
-
- @Override
- public boolean isOdm() {
- return getBoolean(Booleans.ODM);
- }
-
- @Override
- public boolean isOem() {
- return getBoolean(Booleans.OEM);
- }
-
- @Override
- public boolean isPrivileged() {
- return getBoolean(Booleans.PRIVILEGED);
- }
-
- @Override
- public boolean isProduct() {
- return getBoolean(Booleans.PRODUCT);
- }
-
- @Override
- public boolean isRequiredForSystemUser() {
- return getBoolean(Booleans.REQUIRED_FOR_SYSTEM_USER);
- }
-
- @Override
- public boolean isSystem() {
- return getBoolean(Booleans.SYSTEM);
- }
-
- @Override
- public boolean isSystemExt() {
- return getBoolean(Booleans.SYSTEM_EXT);
- }
-
- @Override
- public boolean isUpdateAvailable() {
- return getBoolean(Booleans.UPDATE_AVAILABLE);
- }
-
- @Override
- public boolean isUpdatedSystemApp() {
- return getBoolean(Booleans.UPDATED_SYSTEM_APP);
- }
-
- @Override
- public boolean isApkInUpdatedApex() {
- return getBoolean(Booleans.APK_IN_UPDATED_APEX);
- }
-
- @Override
- public boolean isVendor() {
- return getBoolean(Booleans.VENDOR);
- }
-
- @Override
- public long getVersionCode() {
- return mLongVersionCode;
- }
-
- @Override
- public boolean hasSharedUser() {
- return mHasSharedUser;
- }
-
- @Override
- public boolean isApex() {
- return getAndroidPackage() != null && getAndroidPackage().isApex();
- }
-
- @Override
- public boolean isDefaultToDeviceProtectedStorage() {
- return getBoolean(Booleans.DEFAULT_TO_DEVICE_PROTECTED_STORAGE);
- }
-
- /**
- * @hide
- */
- @DataClass(genConstructor = false)
- public static class UserStateImpl implements PackageUserState {
-
- public static PackageUserState copy(@NonNull PackageUserState state) {
- return new UserStateImpl(state);
- }
-
- private static class Booleans {
- @IntDef({
- HIDDEN,
- INSTALLED,
- INSTANT_APP,
- NOT_LAUNCHED,
- STOPPED,
- SUSPENDED,
- VIRTUAL_PRELOAD,
- })
- public @interface Flags {
- }
-
- private static final int HIDDEN = 1;
- private static final int INSTALLED = 1 << 1;
- private static final int INSTANT_APP = 1 << 2;
- private static final int NOT_LAUNCHED = 1 << 3;
- private static final int STOPPED = 1 << 4;
- private static final int SUSPENDED = 1 << 5;
- private static final int VIRTUAL_PRELOAD = 1 << 6;
- }
-
- private int mBooleans;
-
- private void setBoolean(@Booleans.Flags int flag, boolean value) {
- if (value) {
- mBooleans |= flag;
- } else {
- mBooleans &= ~flag;
- }
- }
-
- private boolean getBoolean(@Booleans.Flags int flag) {
- return (mBooleans & flag) != 0;
- }
-
- private final long mCeDataInode;
- @NonNull
- private final ArraySet<String> mDisabledComponents;
- @PackageManager.DistractionRestriction
- private final int mDistractionFlags;
- @NonNull
- private final ArraySet<String> mEnabledComponents;
- private final int mEnabledState;
- @Nullable
- private final String mHarmfulAppWarning;
- @PackageManager.InstallReason
- private final int mInstallReason;
- @Nullable
- private final String mLastDisableAppCaller;
- @NonNull
- private final OverlayPaths mOverlayPaths;
- @NonNull
- private final Map<String, OverlayPaths> mSharedLibraryOverlayPaths;
- @PackageManager.UninstallReason
- private final int mUninstallReason;
- @Nullable
- private final String mSplashScreenTheme;
- @PackageManager.UserMinAspectRatio
- private final int mMinAspectRatio;
- private final long mFirstInstallTimeMillis;
- @Nullable
- private final ArchiveState mArchiveState;
-
- private UserStateImpl(@NonNull PackageUserState userState) {
- mCeDataInode = userState.getCeDataInode();
- mDisabledComponents = userState.getDisabledComponents();
- mDistractionFlags = userState.getDistractionFlags();
- mEnabledComponents = userState.getEnabledComponents();
- mEnabledState = userState.getEnabledState();
- mHarmfulAppWarning = userState.getHarmfulAppWarning();
- mInstallReason = userState.getInstallReason();
- mLastDisableAppCaller = userState.getLastDisableAppCaller();
- mOverlayPaths = userState.getOverlayPaths();
- mSharedLibraryOverlayPaths = userState.getSharedLibraryOverlayPaths();
- mUninstallReason = userState.getUninstallReason();
- mSplashScreenTheme = userState.getSplashScreenTheme();
- mMinAspectRatio = userState.getMinAspectRatio();
- setBoolean(Booleans.HIDDEN, userState.isHidden());
- setBoolean(Booleans.INSTALLED, userState.isInstalled());
- setBoolean(Booleans.INSTANT_APP, userState.isInstantApp());
- setBoolean(Booleans.NOT_LAUNCHED, userState.isNotLaunched());
- setBoolean(Booleans.STOPPED, userState.isStopped());
- setBoolean(Booleans.SUSPENDED, userState.isSuspended());
- setBoolean(Booleans.VIRTUAL_PRELOAD, userState.isVirtualPreload());
- mFirstInstallTimeMillis = userState.getFirstInstallTimeMillis();
- mArchiveState = userState.getArchiveState();
- }
-
- @Override
- public boolean isHidden() {
- return getBoolean(Booleans.HIDDEN);
- }
-
- @Override
- public boolean isInstalled() {
- return getBoolean(Booleans.INSTALLED);
- }
-
- @Override
- public boolean isInstantApp() {
- return getBoolean(Booleans.INSTANT_APP);
- }
-
- @Override
- public boolean isNotLaunched() {
- return getBoolean(Booleans.NOT_LAUNCHED);
- }
-
- @Override
- public boolean isStopped() {
- return getBoolean(Booleans.STOPPED);
- }
-
- @Override
- public boolean isSuspended() {
- return getBoolean(Booleans.SUSPENDED);
- }
-
- @Override
- public boolean isVirtualPreload() {
- return getBoolean(Booleans.VIRTUAL_PRELOAD);
- }
-
- @Override
- public boolean isComponentEnabled(String componentName) {
- return mEnabledComponents.contains(componentName);
- }
-
- @Override
- public boolean isComponentDisabled(String componentName) {
- return mDisabledComponents.contains(componentName);
- }
-
- @Override
- public OverlayPaths getAllOverlayPaths() {
- if (mOverlayPaths == null && mSharedLibraryOverlayPaths == null) {
- return null;
- }
- final OverlayPaths.Builder newPaths = new OverlayPaths.Builder();
- newPaths.addAll(mOverlayPaths);
- if (mSharedLibraryOverlayPaths != null) {
- for (final OverlayPaths libOverlayPaths : mSharedLibraryOverlayPaths.values()) {
- newPaths.addAll(libOverlayPaths);
- }
- }
- return newPaths.build();
- }
-
-
-
- // Code below generated by codegen v1.0.23.
- //
- // DO NOT MODIFY!
- // CHECKSTYLE:OFF Generated code
- //
- // To regenerate run:
- // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java
- //
- // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
- // Settings > Editor > Code Style > Formatter Control
- //@formatter:off
-
-
- @DataClass.Generated.Member
- public int getBooleans() {
- return mBooleans;
- }
-
- @DataClass.Generated.Member
- public long getCeDataInode() {
- return mCeDataInode;
- }
-
- @DataClass.Generated.Member
- public @NonNull ArraySet<String> getDisabledComponents() {
- return mDisabledComponents;
- }
-
- @DataClass.Generated.Member
- public @PackageManager.DistractionRestriction int getDistractionFlags() {
- return mDistractionFlags;
- }
-
- @DataClass.Generated.Member
- public @NonNull ArraySet<String> getEnabledComponents() {
- return mEnabledComponents;
- }
-
- @DataClass.Generated.Member
- public int getEnabledState() {
- return mEnabledState;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getHarmfulAppWarning() {
- return mHarmfulAppWarning;
- }
-
- @DataClass.Generated.Member
- public @PackageManager.InstallReason int getInstallReason() {
- return mInstallReason;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getLastDisableAppCaller() {
- return mLastDisableAppCaller;
- }
-
- @DataClass.Generated.Member
- public @NonNull OverlayPaths getOverlayPaths() {
- return mOverlayPaths;
- }
-
- @DataClass.Generated.Member
- public @NonNull Map<String,OverlayPaths> getSharedLibraryOverlayPaths() {
- return mSharedLibraryOverlayPaths;
- }
-
- @DataClass.Generated.Member
- public @PackageManager.UninstallReason int getUninstallReason() {
- return mUninstallReason;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getSplashScreenTheme() {
- return mSplashScreenTheme;
- }
-
- @DataClass.Generated.Member
- public @PackageManager.UserMinAspectRatio int getMinAspectRatio() {
- return mMinAspectRatio;
- }
-
- @DataClass.Generated.Member
- public long getFirstInstallTimeMillis() {
- return mFirstInstallTimeMillis;
- }
-
- @DataClass.Generated.Member
- public @Nullable ArchiveState getArchiveState() {
- return mArchiveState;
- }
-
- @DataClass.Generated.Member
- public @NonNull UserStateImpl setBooleans( int value) {
- mBooleans = value;
- return this;
- }
-
- @DataClass.Generated(
- time = 1691182986740L,
- codegenVersion = "1.0.23",
- sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java",
- inputSignatures = "private int mBooleans\nprivate final long mCeDataInode\nprivate final @android.annotation.NonNull android.util.ArraySet<java.lang.String> mDisabledComponents\nprivate final @android.content.pm.PackageManager.DistractionRestriction int mDistractionFlags\nprivate final @android.annotation.NonNull android.util.ArraySet<java.lang.String> mEnabledComponents\nprivate final int mEnabledState\nprivate final @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate final @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate final @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate final @android.annotation.NonNull android.content.pm.overlay.OverlayPaths mOverlayPaths\nprivate final @android.annotation.NonNull java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate final @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate final @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate final @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate final long mFirstInstallTimeMillis\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\npublic static com.android.server.pm.pkg.PackageUserState copy(com.android.server.pm.pkg.PackageUserState)\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isSuspended()\npublic @java.lang.Override boolean isVirtualPreload()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\nclass UserStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageUserState]\nprivate static final int HIDDEN\nprivate static final int INSTALLED\nprivate static final int INSTANT_APP\nprivate static final int NOT_LAUNCHED\nprivate static final int STOPPED\nprivate static final int SUSPENDED\nprivate static final int VIRTUAL_PRELOAD\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)")
- @Deprecated
- private void __metadata() {}
-
-
- //@formatter:on
- // End of generated code
-
- }
-
-
-
- // Code below generated by codegen v1.0.23.
- //
- // DO NOT MODIFY!
- // CHECKSTYLE:OFF Generated code
- //
- // To regenerate run:
- // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java
- //
- // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
- // Settings > Editor > Code Style > Formatter Control
- //@formatter:off
-
-
- @DataClass.Generated.Member
- public long getBooleans() {
- return mBooleans;
- }
-
- @DataClass.Generated.Member
- public @Nullable AndroidPackage getAndroidPackage() {
- return mAndroidPackage;
- }
-
- @DataClass.Generated.Member
- public @NonNull String getPackageName() {
- return mPackageName;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getVolumeUuid() {
- return mVolumeUuid;
- }
-
- @DataClass.Generated.Member
- public int getAppId() {
- return mAppId;
- }
-
- @DataClass.Generated.Member
- public int getCategoryOverride() {
- return mCategoryOverride;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getCpuAbiOverride() {
- return mCpuAbiOverride;
- }
-
- @DataClass.Generated.Member
- public @ApplicationInfo.HiddenApiEnforcementPolicy int getHiddenApiEnforcementPolicy() {
- return mHiddenApiEnforcementPolicy;
- }
-
- @DataClass.Generated.Member
- public long getLastModifiedTime() {
- return mLastModifiedTime;
- }
-
- @DataClass.Generated.Member
- public long getLastUpdateTime() {
- return mLastUpdateTime;
- }
-
- @DataClass.Generated.Member
- public long getLongVersionCode() {
- return mLongVersionCode;
- }
-
- @DataClass.Generated.Member
- public @NonNull Map<String,Set<String>> getMimeGroups() {
- return mMimeGroups;
- }
-
- @DataClass.Generated.Member
- public @NonNull File getPath() {
- return mPath;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getPrimaryCpuAbi() {
- return mPrimaryCpuAbi;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getSecondaryCpuAbi() {
- return mSecondaryCpuAbi;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getSeInfo() {
- return mSeInfo;
- }
-
- @DataClass.Generated.Member
- public boolean isHasSharedUser() {
- return mHasSharedUser;
- }
-
- @DataClass.Generated.Member
- public int getSharedUserAppId() {
- return mSharedUserAppId;
- }
-
- @DataClass.Generated.Member
- public @NonNull String[] getUsesSdkLibraries() {
- return mUsesSdkLibraries;
- }
-
- @DataClass.Generated.Member
- public @NonNull long[] getUsesSdkLibrariesVersionsMajor() {
- return mUsesSdkLibrariesVersionsMajor;
- }
-
- @DataClass.Generated.Member
- public @NonNull String[] getUsesStaticLibraries() {
- return mUsesStaticLibraries;
- }
-
- @DataClass.Generated.Member
- public @NonNull long[] getUsesStaticLibrariesVersions() {
- return mUsesStaticLibrariesVersions;
- }
-
- @DataClass.Generated.Member
- public @NonNull List<SharedLibrary> getSharedLibraryDependencies() {
- return mSharedLibraryDependencies;
- }
-
- @DataClass.Generated.Member
- public @NonNull List<String> getUsesLibraryFiles() {
- return mUsesLibraryFiles;
- }
-
- @DataClass.Generated.Member
- public @NonNull long[] getLastPackageUsageTime() {
- return mLastPackageUsageTime;
- }
-
- @DataClass.Generated.Member
- public @NonNull SigningInfo getSigningInfo() {
- return mSigningInfo;
- }
-
- @DataClass.Generated.Member
- public @NonNull SparseArray<PackageUserState> getUserStates() {
- return mUserStates;
- }
-
- @DataClass.Generated.Member
- public @Nullable String getApexModuleName() {
- return mApexModuleName;
- }
-
- @DataClass.Generated.Member
- public @NonNull PackageStateImpl setBooleans( long value) {
- mBooleans = value;
- return this;
- }
-
- @DataClass.Generated(
- time = 1691182986772L,
- codegenVersion = "1.0.23",
- sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java",
- inputSignatures = "private long mBooleans\nprivate final @android.annotation.Nullable com.android.server.pm.pkg.AndroidPackage mAndroidPackage\nprivate final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.Nullable java.lang.String mVolumeUuid\nprivate final int mAppId\nprivate final int mCategoryOverride\nprivate final @android.annotation.Nullable java.lang.String mCpuAbiOverride\nprivate final @android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy int mHiddenApiEnforcementPolicy\nprivate final long mLastModifiedTime\nprivate final long mLastUpdateTime\nprivate final long mLongVersionCode\nprivate final @android.annotation.NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>> mMimeGroups\nprivate final @android.annotation.NonNull java.io.File mPath\nprivate final @android.annotation.Nullable java.lang.String mPrimaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSecondaryCpuAbi\nprivate final @android.annotation.Nullable java.lang.String mSeInfo\nprivate final boolean mHasSharedUser\nprivate final int mSharedUserAppId\nprivate final @android.annotation.NonNull java.lang.String[] mUsesSdkLibraries\nprivate final @android.annotation.NonNull long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.NonNull java.lang.String[] mUsesStaticLibraries\nprivate final @android.annotation.NonNull long[] mUsesStaticLibrariesVersions\nprivate final @android.annotation.NonNull java.util.List<com.android.server.pm.pkg.SharedLibrary> mSharedLibraryDependencies\nprivate final @android.annotation.NonNull java.util.List<java.lang.String> mUsesLibraryFiles\nprivate final @android.annotation.NonNull long[] mLastPackageUsageTime\nprivate final @android.annotation.NonNull android.content.pm.SigningInfo mSigningInfo\nprivate final @android.annotation.NonNull android.util.SparseArray<com.android.server.pm.pkg.PackageUserState> mUserStates\nprivate final @android.annotation.Nullable java.lang.String mApexModuleName\npublic static com.android.server.pm.pkg.PackageState copy(com.android.server.pm.pkg.PackageStateInternal)\nprivate void setBoolean(long,boolean)\nprivate boolean getBoolean(long)\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserState getStateForUser(android.os.UserHandle)\npublic @java.lang.Override boolean isExternalStorage()\npublic @java.lang.Override boolean isForceQueryableOverride()\npublic @java.lang.Override boolean isHiddenUntilInstalled()\npublic @java.lang.Override boolean isInstallPermissionsFixed()\npublic @java.lang.Override boolean isOdm()\npublic @java.lang.Override boolean isOem()\npublic @java.lang.Override boolean isPrivileged()\npublic @java.lang.Override boolean isProduct()\npublic @java.lang.Override boolean isRequiredForSystemUser()\npublic @java.lang.Override boolean isSystem()\npublic @java.lang.Override boolean isSystemExt()\npublic @java.lang.Override boolean isUpdateAvailable()\npublic @java.lang.Override boolean isUpdatedSystemApp()\npublic @java.lang.Override boolean isApkInUpdatedApex()\npublic @java.lang.Override boolean isVendor()\npublic @java.lang.Override long getVersionCode()\npublic @java.lang.Override boolean hasSharedUser()\npublic @java.lang.Override boolean isApex()\npublic @java.lang.Override boolean isDefaultToDeviceProtectedStorage()\nclass PackageStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageState]\nprivate static final long SYSTEM\nprivate static final long EXTERNAL_STORAGE\nprivate static final long PRIVILEGED\nprivate static final long OEM\nprivate static final long VENDOR\nprivate static final long PRODUCT\nprivate static final long SYSTEM_EXT\nprivate static final long REQUIRED_FOR_SYSTEM_USER\nprivate static final long ODM\nprivate static final long FORCE_QUERYABLE_OVERRIDE\nprivate static final long HIDDEN_UNTIL_INSTALLED\nprivate static final long INSTALL_PERMISSIONS_FIXED\nprivate static final long UPDATE_AVAILABLE\nprivate static final long UPDATED_SYSTEM_APP\nprivate static final long APK_IN_UPDATED_APEX\nprivate static final long DEFAULT_TO_DEVICE_PROTECTED_STORAGE\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false)")
- @Deprecated
- private void __metadata() {}
-
-
- //@formatter:on
- // End of generated code
-
-}
diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
index 6ac7c34..d8c8af6 100644
--- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
+++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
@@ -17,6 +17,7 @@
package com.android.server.pm.pkg;
import android.annotation.CurrentTimeMillisLong;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
@@ -45,9 +46,44 @@
/** @hide */
@DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true)
@DataClass.Suppress({"mOverlayPathsLock", "mOverlayPaths", "mSharedLibraryOverlayPathsLock",
- "mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths", "getWatchable"})
+ "mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths", "getWatchable",
+ "getBooleans"
+})
public class PackageUserStateImpl extends WatchableImpl implements PackageUserStateInternal,
Snappable {
+ // Use a bitset to store boolean data to save memory
+ private static class Booleans {
+ @IntDef({
+ INSTALLED,
+ STOPPED,
+ NOT_LAUNCHED,
+ HIDDEN,
+ INSTANT_APP,
+ VIRTUAL_PRELOADED,
+ })
+ public @interface Flags {
+ }
+ private static final int INSTALLED = 1;
+ private static final int STOPPED = 1 << 1;
+ private static final int NOT_LAUNCHED = 1 << 2;
+ // Is the app restricted by owner / admin
+ private static final int HIDDEN = 1 << 3;
+ private static final int INSTANT_APP = 1 << 4;
+ private static final int VIRTUAL_PRELOADED = 1 << 5;
+ }
+ private int mBooleans;
+
+ private void setBoolean(@Booleans.Flags int flag, boolean value) {
+ if (value) {
+ mBooleans |= flag;
+ } else {
+ mBooleans &= ~flag;
+ }
+ }
+
+ private boolean getBoolean(@Booleans.Flags int flag) {
+ return (mBooleans & flag) != 0;
+ }
@Nullable
protected WatchedArraySet<String> mDisabledComponentsWatched;
@@ -55,13 +91,7 @@
protected WatchedArraySet<String> mEnabledComponentsWatched;
private long mCeDataInode;
- private boolean mInstalled = true;
- private boolean mStopped;
- private boolean mNotLaunched;
- private boolean mHidden; // Is the app restricted by owner / admin
private int mDistractionFlags;
- private boolean mInstantApp;
- private boolean mVirtualPreload;
@PackageManager.EnabledState
private int mEnabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@PackageManager.InstallReason
@@ -122,15 +152,18 @@
super();
mWatchable = null;
mSnapshot = makeCache();
+ setBoolean(Booleans.INSTALLED, true);
}
public PackageUserStateImpl(@NonNull Watchable watchable) {
mWatchable = watchable;
mSnapshot = makeCache();
+ setBoolean(Booleans.INSTALLED, true);
}
public PackageUserStateImpl(@NonNull Watchable watchable, PackageUserStateImpl other) {
mWatchable = watchable;
+ mBooleans = other.mBooleans;
mDisabledComponentsWatched = other.mDisabledComponentsWatched == null
? null : other.mDisabledComponentsWatched.snapshot();
mEnabledComponentsWatched = other.mEnabledComponentsWatched == null
@@ -139,13 +172,7 @@
mSharedLibraryOverlayPaths = other.mSharedLibraryOverlayPaths == null
? null : other.mSharedLibraryOverlayPaths.snapshot();
mCeDataInode = other.mCeDataInode;
- mInstalled = other.mInstalled;
- mStopped = other.mStopped;
- mNotLaunched = other.mNotLaunched;
- mHidden = other.mHidden;
mDistractionFlags = other.mDistractionFlags;
- mInstantApp = other.mInstantApp;
- mVirtualPreload = other.mVirtualPreload;
mEnabledState = other.mEnabledState;
mInstallReason = other.mInstallReason;
mUninstallReason = other.mUninstallReason;
@@ -418,25 +445,25 @@
}
public @NonNull PackageUserStateImpl setInstalled(boolean value) {
- mInstalled = value;
+ setBoolean(Booleans.INSTALLED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setStopped(boolean value) {
- mStopped = value;
+ setBoolean(Booleans.STOPPED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setNotLaunched(boolean value) {
- mNotLaunched = value;
+ setBoolean(Booleans.NOT_LAUNCHED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setHidden(boolean value) {
- mHidden = value;
+ setBoolean(Booleans.HIDDEN, value);
onChanged();
return this;
}
@@ -448,13 +475,13 @@
}
public @NonNull PackageUserStateImpl setInstantApp(boolean value) {
- mInstantApp = value;
+ setBoolean(Booleans.INSTANT_APP, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setVirtualPreload(boolean value) {
- mVirtualPreload = value;
+ setBoolean(Booleans.VIRTUAL_PRELOADED, value);
onChanged();
return this;
}
@@ -613,6 +640,38 @@
}
+ @Override
+ public boolean isInstalled() {
+ return getBoolean(Booleans.INSTALLED);
+ }
+
+ @Override
+ public boolean isStopped() {
+ return getBoolean(Booleans.STOPPED);
+ }
+
+ @Override
+ public boolean isNotLaunched() {
+ return getBoolean(Booleans.NOT_LAUNCHED);
+ }
+
+ @Override
+ public boolean isHidden() {
+ return getBoolean(Booleans.HIDDEN);
+ }
+
+ @Override
+ public boolean isInstantApp() {
+ return getBoolean(Booleans.INSTANT_APP);
+ }
+
+ @Override
+ public boolean isVirtualPreload() {
+ return getBoolean(Booleans.VIRTUAL_PRELOADED);
+ }
+
+
+
// Code below generated by codegen v1.0.23.
//
@@ -643,41 +702,11 @@
}
@DataClass.Generated.Member
- public boolean isInstalled() {
- return mInstalled;
- }
-
- @DataClass.Generated.Member
- public boolean isStopped() {
- return mStopped;
- }
-
- @DataClass.Generated.Member
- public boolean isNotLaunched() {
- return mNotLaunched;
- }
-
- @DataClass.Generated.Member
- public boolean isHidden() {
- return mHidden;
- }
-
- @DataClass.Generated.Member
public int getDistractionFlags() {
return mDistractionFlags;
}
@DataClass.Generated.Member
- public boolean isInstantApp() {
- return mInstantApp;
- }
-
- @DataClass.Generated.Member
- public boolean isVirtualPreload() {
- return mVirtualPreload;
- }
-
- @DataClass.Generated.Member
public @PackageManager.EnabledState int getEnabledState() {
return mEnabledState;
}
@@ -746,6 +775,12 @@
}
@DataClass.Generated.Member
+ public @NonNull PackageUserStateImpl setBooleans( int value) {
+ mBooleans = value;
+ return this;
+ }
+
+ @DataClass.Generated.Member
public @NonNull PackageUserStateImpl setDisabledComponentsWatched(@NonNull WatchedArraySet<String> value) {
mDisabledComponentsWatched = value;
return this;
@@ -791,16 +826,11 @@
PackageUserStateImpl that = (PackageUserStateImpl) o;
//noinspection PointlessBooleanExpression
return true
+ && mBooleans == that.mBooleans
&& Objects.equals(mDisabledComponentsWatched, that.mDisabledComponentsWatched)
&& Objects.equals(mEnabledComponentsWatched, that.mEnabledComponentsWatched)
&& mCeDataInode == that.mCeDataInode
- && mInstalled == that.mInstalled
- && mStopped == that.mStopped
- && mNotLaunched == that.mNotLaunched
- && mHidden == that.mHidden
&& mDistractionFlags == that.mDistractionFlags
- && mInstantApp == that.mInstantApp
- && mVirtualPreload == that.mVirtualPreload
&& mEnabledState == that.mEnabledState
&& mInstallReason == that.mInstallReason
&& mUninstallReason == that.mUninstallReason
@@ -825,16 +855,11 @@
// int fieldNameHashCode() { ... }
int _hash = 1;
+ _hash = 31 * _hash + mBooleans;
_hash = 31 * _hash + Objects.hashCode(mDisabledComponentsWatched);
_hash = 31 * _hash + Objects.hashCode(mEnabledComponentsWatched);
_hash = 31 * _hash + Long.hashCode(mCeDataInode);
- _hash = 31 * _hash + Boolean.hashCode(mInstalled);
- _hash = 31 * _hash + Boolean.hashCode(mStopped);
- _hash = 31 * _hash + Boolean.hashCode(mNotLaunched);
- _hash = 31 * _hash + Boolean.hashCode(mHidden);
_hash = 31 * _hash + mDistractionFlags;
- _hash = 31 * _hash + Boolean.hashCode(mInstantApp);
- _hash = 31 * _hash + Boolean.hashCode(mVirtualPreload);
_hash = 31 * _hash + mEnabledState;
_hash = 31 * _hash + mInstallReason;
_hash = 31 * _hash + mUninstallReason;
@@ -854,10 +879,10 @@
}
@DataClass.Generated(
- time = 1689171513404L,
+ time = 1691186062924L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java",
- inputSignatures = "protected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setArchiveState(com.android.server.pm.pkg.ArchiveState)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
+ inputSignatures = "private int mBooleans\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate int mDistractionFlags\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setArchiveState(com.android.server.pm.pkg.ArchiveState)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isVirtualPreload()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\nprivate static final int INSTALLED\nprivate static final int STOPPED\nprivate static final int NOT_LAUNCHED\nprivate static final int HIDDEN\nprivate static final int INSTANT_APP\nprivate static final int VIRTUAL_PRELOADED\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
@Deprecated
private void __metadata() {}
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java
index dc92376..74dc853 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerTests.java
@@ -966,9 +966,11 @@
}
private static void assertUninstalled(ApplicationInfo info) throws Exception {
- File nativeLibraryFile = new File(info.nativeLibraryDir);
- assertFalse("Native library directory " + info.nativeLibraryDir
- + " should be erased", nativeLibraryFile.exists());
+ if (info.nativeLibraryDir != null) {
+ File nativeLibraryFile = new File(info.nativeLibraryDir);
+ assertFalse("Native library directory " + info.nativeLibraryDir
+ + " should be erased", nativeLibraryFile.exists());
+ }
}
public void deleteFromRawResource(int iFlags, int dFlags) throws Exception {
@@ -2883,14 +2885,15 @@
break;
}
}
- assertNotNull("activities should not be null", packageInfo.activities);
- assertNotNull("configPreferences should not be null", packageInfo.configPreferences);
- assertNotNull("instrumentation should not be null", packageInfo.instrumentation);
- assertNotNull("permissions should not be null", packageInfo.permissions);
- assertNotNull("providers should not be null", packageInfo.providers);
- assertNotNull("receivers should not be null", packageInfo.receivers);
- assertNotNull("services should not be null", packageInfo.services);
- assertNotNull("signatures should not be null", packageInfo.signatures);
+ assertNotNull("applicationInfo should not be null", packageInfo.applicationInfo);
+ assertNull("activities should be null", packageInfo.activities);
+ assertNull("configPreferences should be null", packageInfo.configPreferences);
+ assertNull("instrumentation should be null", packageInfo.instrumentation);
+ assertNull("permissions should be null", packageInfo.permissions);
+ assertNull("providers should be null", packageInfo.providers);
+ assertNull("receivers should be null", packageInfo.receivers);
+ assertNull("services should be null", packageInfo.services);
+ assertNotNull("signingInfo should not be null", packageInfo.signingInfo);
} finally {
cleanUpInstall(ip);
}
diff --git a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
index 5a733c7..d217d63 100644
--- a/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
+++ b/services/tests/PackageManagerServiceTests/unit/src/com/android/server/pm/test/pkg/PackageStateTest.kt
@@ -29,7 +29,6 @@
import com.android.server.pm.parsing.pkg.PackageImpl
import com.android.server.pm.pkg.AndroidPackage
import com.android.server.pm.pkg.PackageState
-import com.android.server.pm.pkg.PackageStateImpl
import com.android.server.pm.pkg.PackageUserState
import com.android.server.pm.pkg.PackageUserStateImpl
import com.android.server.pm.pkg.component.ParsedActivity
@@ -125,7 +124,7 @@
fillMissingData(packageState, pkg as PackageImpl)
- visitType(seenTypes, emptyList(), PackageStateImpl.copy(packageState),
+ visitType(seenTypes, emptyList(), PackageSetting(packageState, true),
PackageState::class.starProjectedType)
visitType(seenTypes, emptyList(), pkg, AndroidPackage::class.starProjectedType)
visitType(seenTypes, emptyList(), packageState.getUserStateOrDefault(0),
diff --git a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingValidationTest.kt b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingValidationTest.kt
index b65a53a..560a919 100644
--- a/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingValidationTest.kt
+++ b/services/tests/servicestests/src/com/android/server/pm/parsing/AndroidPackageParsingValidationTest.kt
@@ -518,8 +518,26 @@
}
}
- val failNames = arrayOf("com.android.TestClass:", "-TestClass", "TestClass.", ".", "..")
- for (name in failNames) {
+ val badNames = arrayOf(
+ ";",
+ ",",
+ "[",
+ "]",
+ "(",
+ ")",
+ "{",
+ "}",
+ ":",
+ "?",
+ "-",
+ "%",
+ "^",
+ "*",
+ "|",
+ "/",
+ "\\"
+ )
+ for (name in badNames) {
val xml = "<$tag $attr=\"$name\" />"
pullParser.setInput(ByteArrayInputStream(xml.toByteArray()), null)
val validator = Validator()
diff --git a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
index 1167a3e..03335c7 100644
--- a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
+++ b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp
@@ -37,7 +37,6 @@
},
data: [
":cdm_snippet",
- "requirements.txt",
],
version: {
py2: {
diff --git a/tests/CompanionDeviceMultiDeviceTests/host/cdm_transport_test.py b/tests/CompanionDeviceMultiDeviceTests/host/cdm_transport_test.py
index 9cb2d10..5516c0f 100644
--- a/tests/CompanionDeviceMultiDeviceTests/host/cdm_transport_test.py
+++ b/tests/CompanionDeviceMultiDeviceTests/host/cdm_transport_test.py
@@ -25,12 +25,4 @@
if __name__ == '__main__':
- try:
- # Take test args and remove standalone '--' from the list
- index = sys.argv.index('--')
- sys.argv = sys.argv[:1] + sys.argv[index + 1:]
- except ValueError:
- # Ignore if '--' is not in args
- pass
-
test_runner.main()
\ No newline at end of file
diff --git a/tests/CompanionDeviceMultiDeviceTests/host/requirements.txt b/tests/CompanionDeviceMultiDeviceTests/host/requirements.txt
deleted file mode 100644
index 86a11aa..0000000
--- a/tests/CompanionDeviceMultiDeviceTests/host/requirements.txt
+++ /dev/null
@@ -1 +0,0 @@
-mobly==1.12.1