diff options
13 files changed, 240 insertions, 232 deletions
diff --git a/Android.bp b/Android.bp index 121decbbec50..ee3cb8fad9e7 100644 --- a/Android.bp +++ b/Android.bp @@ -234,6 +234,11 @@ java_defaults { "wifi/java", ], }, + + required: [ + // TODO: remove gps_debug when the build system propagates "required" properly. + "gps_debug.conf", + ], } // Collection of classes that are generated from non-Java files that are not listed in @@ -307,11 +312,6 @@ java_defaults { static_libs: ["framework-internal-utils"], - required: [ - // TODO: remove gps_debug when the build system propagates "required" properly. - "gps_debug.conf", - ], - dxflags: [ "--core-library", "--multi-dex", diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 13e1dfa00160..cf8df287a6db 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -564,11 +564,13 @@ static void android_os_Debug_getMemInfo(JNIEnv *env, jobject clazz, jlongArray o // Read system memory info including ZRAM. The values are stored in the vector // in the same order as MEMINFO_* enum - std::vector<uint64_t> mem(MEMINFO_COUNT); - std::vector<std::string> tags(::android::meminfo::SysMemInfo::kDefaultSysMemInfoTags); + std::vector<std::string_view> tags( + ::android::meminfo::SysMemInfo::kDefaultSysMemInfoTags.begin(), + ::android::meminfo::SysMemInfo::kDefaultSysMemInfoTags.end()); tags.insert(tags.begin() + MEMINFO_ZRAM_TOTAL, "Zram:"); + std::vector<uint64_t> mem(tags.size()); ::android::meminfo::SysMemInfo smi; - if (!smi.ReadMemInfo(tags, &mem)) { + if (!smi.ReadMemInfo(tags.size(), tags.data(), mem.data())) { jniThrowRuntimeException(env, "SysMemInfo read failed"); return; } diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 4cb2d1502610..8aa6f860aa61 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -31,6 +31,7 @@ #include <android-base/unique_fd.h> #include <algorithm> +#include <array> #include <limits> #include <memory> #include <string> @@ -630,14 +631,16 @@ static int pid_compare(const void* v1, const void* v2) static jlong android_os_Process_getFreeMemory(JNIEnv* env, jobject clazz) { - static const std::vector<std::string> memFreeTags = { + std::array<std::string_view, 2> memFreeTags = { ::android::meminfo::SysMemInfo::kMemFree, ::android::meminfo::SysMemInfo::kMemCached, }; std::vector<uint64_t> mem(memFreeTags.size()); ::android::meminfo::SysMemInfo smi; - if (!smi.ReadMemInfo(memFreeTags, &mem)) { + if (!smi.ReadMemInfo(memFreeTags.size(), + memFreeTags.data(), + mem.data())) { jniThrowRuntimeException(env, "SysMemInfo read failed to get Free Memory"); return -1L; } diff --git a/core/proto/android/stats/docsui/docsui_enums.proto b/core/proto/android/stats/docsui/docsui_enums.proto index 655b5e326019..f648912d36eb 100644 --- a/core/proto/android/stats/docsui/docsui_enums.proto +++ b/core/proto/android/stats/docsui/docsui_enums.proto @@ -184,6 +184,8 @@ enum SearchType { TYPE_CHIP_DOCS = 4; TYPE_SEARCH_HISTORY = 5; TYPE_SEARCH_STRING = 6; + TYPE_CHIP_LARGE_FILES = 7; + TYPE_CHIP_FROM_THIS_WEEK = 8; } enum SearchMode { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index 84f5a04c6c25..98db7c8fb59c 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -27,6 +27,7 @@ import android.content.SharedPreferences; import android.os.ParcelUuid; import android.os.SystemClock; import android.text.TextUtils; +import android.util.EventLog; import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -799,10 +800,9 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> == BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE || mDevice.getBluetoothClass().getDeviceClass() == BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET) { - mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED); - } else { - mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED); + EventLog.writeEvent(0x534e4554, "138529441", -1, ""); } + mDevice.setPhonebookAccessPermission(BluetoothDevice.ACCESS_REJECTED); } } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index e4a8aab9045d..b964edf7fc44 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1830,7 +1830,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return shouldListen; } - private boolean shouldListenForFace() { + /** + * If face auth is allows to scan on this exact moment. + */ + public boolean shouldListenForFace() { final boolean awakeKeyguard = mKeyguardIsVisible && mDeviceInteractive && !mGoingToSleep; final int user = getCurrentUser(); final int strongAuth = mStrongAuthTracker.getStrongAuthForUser(user); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index f91b03ed087d..a79ecd905403 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -39,6 +39,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.Region; +import android.hardware.biometrics.BiometricSourceType; import android.os.PowerManager; import android.os.SystemClock; import android.provider.DeviceConfig; @@ -62,6 +63,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.keyguard.KeyguardClockSwitch; import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.DejankUtils; import com.android.systemui.Dependency; import com.android.systemui.Interpolators; @@ -172,6 +174,25 @@ public class NotificationPanelView extends PanelView implements R.id.keyguard_hun_animator_start_tag); private static final AnimationProperties KEYGUARD_HUN_PROPERTIES = new AnimationProperties().setDuration(StackStateAnimator.ANIMATION_DURATION_STANDARD); + @VisibleForTesting + final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback = + new KeyguardUpdateMonitorCallback() { + @Override + public void onBiometricRunningStateChanged(boolean running, + BiometricSourceType biometricSourceType) { + boolean keyguardOrShadeLocked = mBarState == StatusBarState.KEYGUARD + || mBarState == StatusBarState.SHADE_LOCKED; + if (!running && mFirstBypassAttempt && keyguardOrShadeLocked && !mDozing) { + mFirstBypassAttempt = false; + animateKeyguardStatusBarIn(StackStateAnimator.ANIMATION_DURATION_STANDARD); + } + } + + @Override + public void onFinishedGoingToSleep(int why) { + mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled(); + } + }; private final InjectionInflationController mInjectionInflationController; private final PowerManager mPowerManager; @@ -392,6 +413,7 @@ public class NotificationPanelView extends PanelView implements private boolean mShowingKeyguardHeadsUp; private boolean mAllowExpandForSmallExpansion; private Runnable mExpandAfterLayoutRunnable; + private boolean mFirstBypassAttempt; private PluginManager mPluginManager; private FrameLayout mPluginFrame; @@ -427,6 +449,7 @@ public class NotificationPanelView extends PanelView implements mThemeResId = context.getThemeResId(); mKeyguardBypassController = bypassController; mUpdateMonitor = Dependency.get(KeyguardUpdateMonitor.class); + mFirstBypassAttempt = mKeyguardBypassController.getBypassEnabled(); dynamicPrivacyController.addListener(this); mBottomAreaShadeAlphaAnimator = ValueAnimator.ofFloat(1f, 0); @@ -519,6 +542,7 @@ public class NotificationPanelView extends PanelView implements Dependency.get(StatusBarStateController.class).addCallback(this); Dependency.get(ZenModeController.class).addCallback(this); Dependency.get(ConfigurationController.class).addCallback(this); + mUpdateMonitor.registerCallback(mKeyguardUpdateCallback); // Theme might have changed between inflating this view and attaching it to the window, so // force a call to onThemeChanged onThemeChanged(); @@ -531,6 +555,7 @@ public class NotificationPanelView extends PanelView implements Dependency.get(StatusBarStateController.class).removeCallback(this); Dependency.get(ZenModeController.class).removeCallback(this); Dependency.get(ConfigurationController.class).removeCallback(this); + mUpdateMonitor.removeCallback(mKeyguardUpdateCallback); } @Override @@ -2366,7 +2391,9 @@ public class NotificationPanelView extends PanelView implements * mKeyguardStatusBarAnimateAlpha; newAlpha *= 1.0f - mKeyguardHeadsUpShowingAmount; mKeyguardStatusBar.setAlpha(newAlpha); - mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing ? VISIBLE : INVISIBLE); + boolean hideForBypass = mFirstBypassAttempt && mUpdateMonitor.shouldListenForFace(); + mKeyguardStatusBar.setVisibility(newAlpha != 0f && !mDozing && !hideForBypass + ? VISIBLE : INVISIBLE); } private void updateKeyguardBottomAreaAlpha() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java index 86ab3a70c3ac..2f2449473e1b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewTest.java @@ -21,19 +21,23 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.StatusBarManager; +import android.hardware.biometrics.BiometricSourceType; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.MotionEvent; +import android.view.View; import android.view.ViewGroup; import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardStatusView; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SystemUIFactory; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.FalsingManager; @@ -51,7 +55,6 @@ import com.android.systemui.statusbar.notification.stack.NotificationRoundnessMa import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.ZenModeController; -import com.android.systemui.tuner.TunerService; import com.android.systemui.util.InjectionInflationController; import org.junit.Before; @@ -101,7 +104,11 @@ public class NotificationPanelViewTest extends SysuiTestCase { @Mock private KeyguardAffordanceHelper mAffordanceHelper; @Mock + private KeyguardUpdateMonitor mUpdateMonitor; + @Mock private FalsingManager mFalsingManager; + @Mock + private KeyguardBypassController mKeyguardBypassController; private NotificationPanelView mNotificationPanelView; @Before @@ -112,22 +119,21 @@ public class NotificationPanelViewTest extends SysuiTestCase { when(mHeadsUpCallback.getContext()).thenReturn(mContext); mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); + mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mUpdateMonitor); mDependency.injectMockDependency(ShadeController.class); mDependency.injectMockDependency(NotificationLockscreenUserManager.class); mDependency.injectMockDependency(ConfigurationController.class); mDependency.injectMockDependency(ZenModeController.class); - KeyguardBypassController bypassController = new KeyguardBypassController(mContext, - mock(TunerService.class), mStatusBarStateController, - mock(NotificationLockscreenUserManager.class)); NotificationWakeUpCoordinator coordinator = new NotificationWakeUpCoordinator(mContext, mock(HeadsUpManagerPhone.class), new StatusBarStateControllerImpl(), - bypassController); + mKeyguardBypassController); PulseExpansionHandler expansionHandler = new PulseExpansionHandler(mContext, coordinator, - bypassController, mHeadsUpManager, mock(NotificationRoundnessManager.class)); + mKeyguardBypassController, mHeadsUpManager, + mock(NotificationRoundnessManager.class)); mNotificationPanelView = new TestableNotificationPanelView(coordinator, expansionHandler, - bypassController); + mKeyguardBypassController); mNotificationPanelView.setHeadsUpManager(mHeadsUpManager); mNotificationPanelView.setBar(mPanelBar); @@ -187,6 +193,20 @@ public class NotificationPanelViewTest extends SysuiTestCase { assertThat(mNotificationPanelView.isTrackingBlocked()).isFalse(); } + @Test + public void testKeyguardStatusBarVisibility_hiddenForBypass() { + when(mUpdateMonitor.shouldListenForFace()).thenReturn(true); + mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true, + BiometricSourceType.FACE); + verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); + + when(mKeyguardBypassController.getBypassEnabled()).thenReturn(true); + mNotificationPanelView.mKeyguardUpdateCallback.onFinishedGoingToSleep(0); + mNotificationPanelView.mKeyguardUpdateCallback.onBiometricRunningStateChanged(true, + BiometricSourceType.FACE); + verify(mKeyguardStatusBar, never()).setVisibility(View.VISIBLE); + } + private class TestableNotificationPanelView extends NotificationPanelView { TestableNotificationPanelView(NotificationWakeUpCoordinator coordinator, PulseExpansionHandler expansionHandler, diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index f7e825eecc12..eb2723a2c7d5 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -79,7 +79,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import java.util.stream.Collectors; /** * Since phone process can be restarted, this class provides a centralized place @@ -849,10 +848,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } if ((events & PhoneStateListener - .LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE) != 0 - && TelephonyPermissions.checkReadPhoneStateOnAnyActiveSub( - r.context, r.callerPid, r.callerUid, r.callingPackage, - "listen_active_data_subid_change")) { + .LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE) != 0) { try { r.callback.onActiveDataSubIdChanged(mActiveDataSubId); } catch (RemoteException ex) { @@ -1829,23 +1825,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { log("notifyActiveDataSubIdChanged: activeDataSubId=" + activeDataSubId); } - // Create a copy to prevent the IPC call while checking carrier privilege under the lock. - List<Record> copiedRecords; - synchronized (mRecords) { - copiedRecords = new ArrayList<>(mRecords); - } mActiveDataSubId = activeDataSubId; - - // Filter the record that does not listen to this change or does not have the permission. - copiedRecords = copiedRecords.stream().filter(r -> r.matchPhoneStateListenerEvent( - PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE) - && TelephonyPermissions.checkReadPhoneStateOnAnyActiveSub( - mContext, r.callerPid, r.callerUid, r.callingPackage, - "notifyActiveDataSubIdChanged")).collect(Collectors.toCollection(ArrayList::new)); - synchronized (mRecords) { - for (Record r : copiedRecords) { - if (mRecords.contains(r)) { + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE)) { try { r.callback.onActiveDataSubIdChanged(activeDataSubId); } catch (RemoteException ex) { diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java index 36e872a109dd..4a62bc507d92 100644 --- a/services/core/java/com/android/server/content/ContentService.java +++ b/services/core/java/com/android/server/content/ContentService.java @@ -55,6 +55,7 @@ import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.UserHandle; import android.text.TextUtils; +import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; @@ -64,6 +65,8 @@ import android.util.SparseArray; import android.util.SparseIntArray; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BackgroundThread; import com.android.internal.os.BinderDeathDispatcher; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; @@ -89,6 +92,14 @@ public final class ContentService extends IContentService.Stub { /** Do a WTF if a single observer is registered more than this times. */ private static final int TOO_MANY_OBSERVERS_THRESHOLD = 1000; + /** + * Delay to apply to content change notifications dispatched to apps running + * in the background. This is used to help prevent stampeding when the user + * is performing CPU/RAM intensive foreground tasks, such as when capturing + * burst photos. + */ + private static final long BACKGROUND_OBSERVER_DELAY = 10 * DateUtils.SECOND_IN_MILLIS; + public static class Lifecycle extends SystemService { private ContentService mService; @@ -426,28 +437,15 @@ public final class ContentService extends IContentService.Stub { flags, userHandle, calls); } final int numCalls = calls.size(); - for (int i=0; i<numCalls; i++) { - ObserverCall oc = calls.get(i); - try { - oc.mObserver.onChange(oc.mSelfChange, uri, userHandle); - if (DEBUG) Slog.d(TAG, "Notified " + oc.mObserver + " of " + "update at " - + uri); - } catch (RemoteException ex) { - synchronized (mRootNode) { - Log.w(TAG, "Found dead observer, removing"); - IBinder binder = oc.mObserver.asBinder(); - final ArrayList<ObserverNode.ObserverEntry> list - = oc.mNode.mObservers; - int numList = list.size(); - for (int j=0; j<numList; j++) { - ObserverNode.ObserverEntry oe = list.get(j); - if (oe.observer.asBinder() == binder) { - list.remove(j); - j--; - numList--; - } - } - } + for (int i = 0; i < numCalls; i++) { + // Immediately dispatch notifications to foreground apps that + // are important to the user; all other background observers are + // delayed to avoid stampeding + final ObserverCall oc = calls.get(i); + if (oc.mProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { + oc.run(); + } else { + BackgroundThread.getHandler().postDelayed(oc, BACKGROUND_OBSERVER_DELAY); } } if ((flags&ContentResolver.NOTIFY_SYNC_TO_NETWORK) != 0) { @@ -486,23 +484,33 @@ public final class ContentService extends IContentService.Stub { UserHandle.getCallingUserId(), Build.VERSION_CODES.CUR_DEVELOPMENT, callingPackage); } - /** - * Hide this class since it is not part of api, - * but current unittest framework requires it to be public - * @hide - * - */ - public static final class ObserverCall { - final ObserverNode mNode; + /** {@hide} */ + @VisibleForTesting + public static final class ObserverCall implements Runnable { final IContentObserver mObserver; final boolean mSelfChange; - final int mObserverUserId; + final Uri mUri; + final int mUserId; + final int mProcState; - ObserverCall(ObserverNode node, IContentObserver observer, boolean selfChange, int observerUserId) { - mNode = node; + ObserverCall(IContentObserver observer, boolean selfChange, Uri uri, int userId, + int procState) { mObserver = observer; mSelfChange = selfChange; - mObserverUserId = observerUserId; + mUri = uri; + mUserId = userId; + mProcState = procState; + } + + @Override + public void run() { + try { + mObserver.onChange(mSelfChange, mUri, mUserId); + if (DEBUG) Slog.d(TAG, "Notified " + mObserver + " of update at " + mUri); + } catch (RemoteException ignored) { + // We already have a death observer that will clean up if the + // remote process dies + } } } @@ -1345,11 +1353,8 @@ public final class ContentService extends IContentService.Stub { return ContentResolver.SYNC_EXEMPTION_NONE; } - /** - * Hide this class since it is not part of api, - * but current unittest framework requires it to be public - * @hide - */ + /** {@hide} */ + @VisibleForTesting public static final class ObserverNode { private class ObserverEntry implements IBinder.DeathRecipient { public final IContentObserver observer; @@ -1546,7 +1551,7 @@ public final class ContentService extends IContentService.Stub { return false; } - private void collectMyObserversLocked(boolean leaf, IContentObserver observer, + private void collectMyObserversLocked(Uri uri, boolean leaf, IContentObserver observer, boolean observerWantsSelfNotifications, int flags, int targetUserHandle, ArrayList<ObserverCall> calls) { int N = mObservers.size(); @@ -1588,8 +1593,10 @@ public final class ContentService extends IContentService.Stub { if (DEBUG) Slog.d(TAG, "Reporting to " + entry.observer + ": leaf=" + leaf + " flags=" + Integer.toHexString(flags) + " desc=" + entry.notifyForDescendants); - calls.add(new ObserverCall(this, entry.observer, selfChange, - UserHandle.getUserId(entry.uid))); + final int procState = LocalServices.getService(ActivityManagerInternal.class) + .getUidProcessState(entry.uid); + calls.add(new ObserverCall(entry.observer, selfChange, uri, + targetUserHandle, procState)); } } } @@ -1605,14 +1612,14 @@ public final class ContentService extends IContentService.Stub { if (index >= segmentCount) { // This is the leaf node, notify all observers if (DEBUG) Slog.d(TAG, "Collecting leaf observers @ #" + index + ", node " + mName); - collectMyObserversLocked(true, observer, observerWantsSelfNotifications, + collectMyObserversLocked(uri, true, observer, observerWantsSelfNotifications, flags, targetUserHandle, calls); } else if (index < segmentCount){ segment = getUriSegment(uri, index); if (DEBUG) Slog.d(TAG, "Collecting non-leaf observers @ #" + index + " / " + segment); // Notify any observers at this level who are interested in descendants - collectMyObserversLocked(false, observer, observerWantsSelfNotifications, + collectMyObserversLocked(uri, false, observer, observerWantsSelfNotifications, flags, targetUserHandle, calls); } diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 271195b78c3e..6a3c06eb622d 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -33,13 +33,13 @@ import android.telephony.ims.ImsReasonInfo; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.IPhoneStateListener; +import dalvik.system.VMRuntime; + import java.lang.ref.WeakReference; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; -import dalvik.system.VMRuntime; - /** * A listener class for monitoring changes in specific telephony states * on the device, including service state, signal strength, message @@ -301,11 +301,6 @@ public class PhoneStateListener { * it could be the current active opportunistic subscription in use, or the * subscription user selected as default data subscription in DSDS mode. * - * Requires Permission: No permission is required to listen, but notification requires - * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} or the calling - * app has carrier privileges (see {@link TelephonyManager#hasCarrierPrivileges}) - * on any active subscription. - * * @see #onActiveDataSubscriptionIdChanged */ public static final int LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE = 0x00400000; diff --git a/tests/PackageWatchdog/Android.bp b/tests/PackageWatchdog/Android.bp index 88d92c4d94fe..0b75039cf69f 100644 --- a/tests/PackageWatchdog/Android.bp +++ b/tests/PackageWatchdog/Android.bp @@ -23,6 +23,7 @@ android_test { "androidx.test.rules", "services.core", "services.net", + "truth-prebuilt", ], libs: ["android.test.runner"], jni_libs: [ diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index 6c05bb8e8690..9a6033058c53 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -18,9 +18,8 @@ package com.android.server; import static android.service.watchdog.ExplicitHealthCheckService.PackageConfig; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static com.google.common.truth.Truth.assertThat; + import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -65,7 +64,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -// TODO: Use Truth in tests. /** * Test PackageWatchdog. */ @@ -119,13 +117,12 @@ public class PackageWatchdogTest { TestObserver observer = new TestObserver(OBSERVER_NAME_1); watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // The failed packages should be the same as the registered ones to ensure registration is // done successfully - assertEquals(1, observer.mHealthCheckFailedPackages.size()); - assertTrue(observer.mHealthCheckFailedPackages.contains(APP_A)); + assertThat(observer.mHealthCheckFailedPackages).containsExactly(APP_A); } @Test @@ -136,17 +133,14 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION); watchdog.startObservingHealth(observer2, Arrays.asList(APP_A, APP_B), SHORT_DURATION); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), - new VersionedPackage(APP_B, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), + new VersionedPackage(APP_B, VERSION_CODE))); // The failed packages should be the same as the registered ones to ensure registration is // done successfully - assertEquals(1, observer1.mHealthCheckFailedPackages.size()); - assertEquals(2, observer2.mHealthCheckFailedPackages.size()); - assertTrue(observer1.mHealthCheckFailedPackages.contains(APP_A)); - assertTrue(observer2.mHealthCheckFailedPackages.contains(APP_A)); - assertTrue(observer2.mHealthCheckFailedPackages.contains(APP_B)); + assertThat(observer1.mHealthCheckFailedPackages).containsExactly(APP_A); + assertThat(observer2.mHealthCheckFailedPackages).containsExactly(APP_A, APP_B); } @Test @@ -156,11 +150,11 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION); watchdog.unregisterHealthObserver(observer); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // We should have no failed packages to ensure unregistration is done successfully - assertEquals(0, observer.mHealthCheckFailedPackages.size()); + assertThat(observer.mHealthCheckFailedPackages).isEmpty(); } @Test @@ -172,13 +166,13 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION); watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), SHORT_DURATION); watchdog.unregisterHealthObserver(observer2); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // observer1 should receive failed packages as intended. - assertEquals(1, observer1.mHealthCheckFailedPackages.size()); + assertThat(observer1.mHealthCheckFailedPackages).containsExactly(APP_A); // observer2 should have no failed packages to ensure unregistration is done successfully - assertEquals(0, observer2.mHealthCheckFailedPackages.size()); + assertThat(observer2.mHealthCheckFailedPackages).isEmpty(); } @Test @@ -188,11 +182,11 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION); moveTimeForwardAndDispatch(SHORT_DURATION); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // We should have no failed packages for the fatal failure is raised after expiration - assertEquals(0, observer.mHealthCheckFailedPackages.size()); + assertThat(observer.mHealthCheckFailedPackages).isEmpty(); } @Test @@ -204,13 +198,13 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION); watchdog.startObservingHealth(observer2, Arrays.asList(APP_A), LONG_DURATION); moveTimeForwardAndDispatch(SHORT_DURATION); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // We should have no failed packages for the fatal failure is raised after expiration - assertEquals(0, observer1.mHealthCheckFailedPackages.size()); + assertThat(observer1.mHealthCheckFailedPackages).isEmpty(); // We should have failed packages since observer2 hasn't expired - assertEquals(1, observer2.mHealthCheckFailedPackages.size()); + assertThat(observer2.mHealthCheckFailedPackages).containsExactly(APP_A); } /** Observing already observed package extends the observation time. */ @@ -231,12 +225,11 @@ public class PackageWatchdogTest { // Then advance time such that it should have expired were it not for the second observation moveTimeForwardAndDispatch((SHORT_DURATION / 2) + 1); - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify that we receive failed packages as expected for APP_A not expired - assertEquals(1, observer.mHealthCheckFailedPackages.size()); - assertTrue(observer.mHealthCheckFailedPackages.contains(APP_A)); + assertThat(observer.mHealthCheckFailedPackages).containsExactly(APP_A); } /** @@ -257,17 +250,14 @@ public class PackageWatchdogTest { // Then resume observer1 and observer2 watchdog2.registerHealthObserver(observer1); watchdog2.registerHealthObserver(observer2); - raiseFatalFailure(watchdog2, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), - new VersionedPackage(APP_B, VERSION_CODE))); - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog2, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), + new VersionedPackage(APP_B, VERSION_CODE))); // We should receive failed packages as expected to ensure observers are persisted and // resumed correctly - assertEquals(1, observer1.mHealthCheckFailedPackages.size()); - assertEquals(2, observer2.mHealthCheckFailedPackages.size()); - assertTrue(observer1.mHealthCheckFailedPackages.contains(APP_A)); - assertTrue(observer1.mHealthCheckFailedPackages.contains(APP_A)); - assertTrue(observer2.mHealthCheckFailedPackages.contains(APP_B)); + assertThat(observer1.mHealthCheckFailedPackages).containsExactly(APP_A); + assertThat(observer2.mHealthCheckFailedPackages).containsExactly(APP_A, APP_B); } /** @@ -291,8 +281,8 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); // Verify that observers are not notified - assertEquals(0, observer1.mMitigatedPackages.size()); - assertEquals(0, observer2.mMitigatedPackages.size()); + assertThat(observer1.mHealthCheckFailedPackages).isEmpty(); + assertThat(observer2.mHealthCheckFailedPackages).isEmpty(); } /** @@ -310,14 +300,12 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer1, Arrays.asList(APP_B), SHORT_DURATION); // Then fail APP_C (not observed) above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE))); - - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_C, VERSION_CODE))); // Verify that observers are not notified - assertEquals(0, observer1.mMitigatedPackages.size()); - assertEquals(0, observer2.mMitigatedPackages.size()); + assertThat(observer1.mHealthCheckFailedPackages).isEmpty(); + assertThat(observer2.mHealthCheckFailedPackages).isEmpty(); } /** @@ -342,14 +330,11 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer, Arrays.asList(APP_A), SHORT_DURATION); // Then fail APP_A (different version) above the threshold - raiseFatalFailure(watchdog, + raiseFatalFailureAndDispatch(watchdog, Arrays.asList(new VersionedPackage(APP_A, differentVersionCode))); - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); - // Verify that observers are not notified - assertEquals(0, observer.mMitigatedPackages.size()); + assertThat(observer.mHealthCheckFailedPackages).isEmpty(); } @@ -379,13 +364,11 @@ public class PackageWatchdogTest { SHORT_DURATION); // Then fail all apps above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), - new VersionedPackage(APP_B, VERSION_CODE), - new VersionedPackage(APP_C, VERSION_CODE), - new VersionedPackage(APP_D, VERSION_CODE))); - - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE), + new VersionedPackage(APP_B, VERSION_CODE), + new VersionedPackage(APP_C, VERSION_CODE), + new VersionedPackage(APP_D, VERSION_CODE))); // Verify least impact observers are notifed of package failures List<String> observerNonePackages = observerNone.mMitigatedPackages; @@ -394,16 +377,13 @@ public class PackageWatchdogTest { List<String> observerLowPackages = observerLow.mMitigatedPackages; // APP_D failure observed by only observerNone is not caught cos its impact is none - assertEquals(0, observerNonePackages.size()); + assertThat(observerNonePackages).isEmpty(); // APP_C failure is caught by observerHigh cos it's the lowest impact observer - assertEquals(1, observerHighPackages.size()); - assertEquals(APP_C, observerHighPackages.get(0)); + assertThat(observerHighPackages).containsExactly(APP_C); // APP_B failure is caught by observerMid cos it's the lowest impact observer - assertEquals(1, observerMidPackages.size()); - assertEquals(APP_B, observerMidPackages.get(0)); + assertThat(observerMidPackages).containsExactly(APP_B); // APP_A failure is caught by observerLow cos it's the lowest impact observer - assertEquals(1, observerLowPackages.size()); - assertEquals(APP_A, observerLowPackages.get(0)); + assertThat(observerLowPackages).containsExactly(APP_A); } /** @@ -430,14 +410,12 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observerSecond, Arrays.asList(APP_A), LONG_DURATION); // Then fail APP_A above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify only observerFirst is notifed - assertEquals(1, observerFirst.mMitigatedPackages.size()); - assertEquals(APP_A, observerFirst.mMitigatedPackages.get(0)); - assertEquals(0, observerSecond.mMitigatedPackages.size()); + assertThat(observerFirst.mMitigatedPackages).containsExactly(APP_A); + assertThat(observerSecond.mMitigatedPackages).isEmpty(); // After observerFirst handles failure, next action it has is high impact observerFirst.mImpact = PackageHealthObserverImpact.USER_IMPACT_HIGH; @@ -445,14 +423,12 @@ public class PackageWatchdogTest { observerSecond.mMitigatedPackages.clear(); // Then fail APP_A again above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify only observerSecond is notifed cos it has least impact - assertEquals(1, observerSecond.mMitigatedPackages.size()); - assertEquals(APP_A, observerSecond.mMitigatedPackages.get(0)); - assertEquals(0, observerFirst.mMitigatedPackages.size()); + assertThat(observerSecond.mMitigatedPackages).containsExactly(APP_A); + assertThat(observerFirst.mMitigatedPackages).isEmpty(); // After observerSecond handles failure, it has no further actions observerSecond.mImpact = PackageHealthObserverImpact.USER_IMPACT_NONE; @@ -460,14 +436,12 @@ public class PackageWatchdogTest { observerSecond.mMitigatedPackages.clear(); // Then fail APP_A again above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify only observerFirst is notifed cos it has the only action - assertEquals(1, observerFirst.mMitigatedPackages.size()); - assertEquals(APP_A, observerFirst.mMitigatedPackages.get(0)); - assertEquals(0, observerSecond.mMitigatedPackages.size()); + assertThat(observerFirst.mMitigatedPackages).containsExactly(APP_A); + assertThat(observerSecond.mMitigatedPackages).isEmpty(); // After observerFirst handles failure, it too has no further actions observerFirst.mImpact = PackageHealthObserverImpact.USER_IMPACT_NONE; @@ -475,13 +449,12 @@ public class PackageWatchdogTest { observerSecond.mMitigatedPackages.clear(); // Then fail APP_A again above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify no observer is notified cos no actions left - assertEquals(0, observerFirst.mMitigatedPackages.size()); - assertEquals(0, observerSecond.mMitigatedPackages.size()); + assertThat(observerFirst.mMitigatedPackages).isEmpty(); + assertThat(observerSecond.mMitigatedPackages).isEmpty(); } /** @@ -500,15 +473,12 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer1, Arrays.asList(APP_A), SHORT_DURATION); // Then fail APP_A above the threshold - raiseFatalFailure(watchdog, Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); - - // Run handler so package failures are dispatched to observers - mTestLooper.dispatchAll(); + raiseFatalFailureAndDispatch(watchdog, + Arrays.asList(new VersionedPackage(APP_A, VERSION_CODE))); // Verify only one observer is notifed - assertEquals(1, observer1.mMitigatedPackages.size()); - assertEquals(APP_A, observer1.mMitigatedPackages.get(0)); - assertEquals(0, observer2.mMitigatedPackages.size()); + assertThat(observer1.mMitigatedPackages).containsExactly(APP_A); + assertThat(observer2.mMitigatedPackages).isEmpty(); } /** @@ -537,9 +507,7 @@ public class PackageWatchdogTest { // Verify we requested health checks for APP_A and APP_B List<String> requestedPackages = controller.getRequestedPackages(); - assertEquals(2, requestedPackages.size()); - assertEquals(APP_A, requestedPackages.get(0)); - assertEquals(APP_B, requestedPackages.get(1)); + assertThat(requestedPackages).containsExactly(APP_A, APP_B); // Then health check passed for APP_A (observer1 is aware) controller.setPackagePassed(APP_A); @@ -554,18 +522,16 @@ public class PackageWatchdogTest { moveTimeForwardAndDispatch(SHORT_DURATION); // Verify we cancelled all requests on expiry - assertEquals(0, controller.getRequestedPackages().size()); + assertThat(controller.getRequestedPackages()).isEmpty(); // Verify observer1 is not notified - assertEquals(0, observer1.mMitigatedPackages.size()); + assertThat(observer1.mMitigatedPackages).isEmpty(); // Verify observer2 is notifed because health checks for APP_B never passed - assertEquals(1, observer2.mMitigatedPackages.size()); - assertEquals(APP_B, observer2.mMitigatedPackages.get(0)); + assertThat(observer2.mMitigatedPackages).containsExactly(APP_B); // Verify observer3 is notifed because health checks for APP_A did not pass before expiry - assertEquals(1, observer3.mMitigatedPackages.size()); - assertEquals(APP_A, observer3.mMitigatedPackages.get(0)); + assertThat(observer3.mMitigatedPackages).containsExactly(APP_A); } /** @@ -592,9 +558,7 @@ public class PackageWatchdogTest { // Verify we requested health checks for APP_A and APP_B List<String> requestedPackages = controller.getRequestedPackages(); - assertEquals(2, requestedPackages.size()); - assertEquals(APP_A, requestedPackages.get(0)); - assertEquals(APP_B, requestedPackages.get(1)); + assertThat(requestedPackages).containsExactly(APP_A, APP_B); // Disable explicit health checks (marks APP_A and APP_B as passed) setExplicitHealthCheckEnabled(false); @@ -603,13 +567,13 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); // Verify all checks are cancelled - assertEquals(0, controller.getRequestedPackages().size()); + assertThat(controller.getRequestedPackages()).isEmpty(); // Then expire APP_A moveTimeForwardAndDispatch(SHORT_DURATION); // Verify APP_A is not failed (APP_B) is not expired yet - assertEquals(0, observer.mMitigatedPackages.size()); + assertThat(observer.mMitigatedPackages).isEmpty(); // Re-enable explicit health checks setExplicitHealthCheckEnabled(true); @@ -618,7 +582,7 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); // Verify no requests are made cos APP_A is expired and APP_B was marked as passed - assertEquals(0, controller.getRequestedPackages().size()); + assertThat(controller.getRequestedPackages()).isEmpty(); // Then set new supported packages controller.setSupportedPackages(Arrays.asList(APP_C)); @@ -630,15 +594,13 @@ public class PackageWatchdogTest { // Verify requests are only made for APP_C requestedPackages = controller.getRequestedPackages(); - assertEquals(1, requestedPackages.size()); - assertEquals(APP_C, requestedPackages.get(0)); + assertThat(requestedPackages).containsExactly(APP_C); // Then expire APP_A and APP_C moveTimeForwardAndDispatch(SHORT_DURATION); // Verify only APP_C is failed because explicit health checks was not supported for APP_A - assertEquals(1, observer.mMitigatedPackages.size()); - assertEquals(APP_C, observer.mMitigatedPackages.get(0)); + assertThat(observer.mMitigatedPackages).containsExactly(APP_C); } /** @@ -662,8 +624,7 @@ public class PackageWatchdogTest { moveTimeForwardAndDispatch(SHORT_DURATION); // Verify that health check is failed - assertEquals(1, observer.mMitigatedPackages.size()); - assertEquals(APP_A, observer.mMitigatedPackages.get(0)); + assertThat(observer.mMitigatedPackages).containsExactly(APP_A); // Then clear failed packages and start observing a random package so requests are synced // and PackageWatchdog#onSupportedPackages is called and APP_A has a chance to fail again @@ -672,7 +633,7 @@ public class PackageWatchdogTest { watchdog.startObservingHealth(observer, Arrays.asList(APP_B), LONG_DURATION); // Verify that health check failure is not notified again - assertTrue(observer.mMitigatedPackages.isEmpty()); + assertThat(observer.mMitigatedPackages).isEmpty(); } /** Tests {@link MonitoredPackage} health check state transitions. */ @@ -688,36 +649,38 @@ public class PackageWatchdogTest { // Verify transition: inactive -> active -> passed // Verify initially inactive - assertEquals(HealthCheckState.INACTIVE, m1.getHealthCheckStateLocked()); + assertThat(m1.getHealthCheckStateLocked()).isEqualTo(HealthCheckState.INACTIVE); // Verify still inactive, until we #setHealthCheckActiveLocked - assertEquals(HealthCheckState.INACTIVE, m1.handleElapsedTimeLocked(SHORT_DURATION)); + assertThat(m1.handleElapsedTimeLocked(SHORT_DURATION)).isEqualTo(HealthCheckState.INACTIVE); // Verify now active - assertEquals(HealthCheckState.ACTIVE, m1.setHealthCheckActiveLocked(SHORT_DURATION)); + assertThat(m1.setHealthCheckActiveLocked(SHORT_DURATION)).isEqualTo( + HealthCheckState.ACTIVE); // Verify now passed - assertEquals(HealthCheckState.PASSED, m1.tryPassHealthCheckLocked()); + assertThat(m1.tryPassHealthCheckLocked()).isEqualTo(HealthCheckState.PASSED); // Verify transition: inactive -> active -> failed // Verify initially inactive - assertEquals(HealthCheckState.INACTIVE, m2.getHealthCheckStateLocked()); + assertThat(m2.getHealthCheckStateLocked()).isEqualTo(HealthCheckState.INACTIVE); // Verify now active - assertEquals(HealthCheckState.ACTIVE, m2.setHealthCheckActiveLocked(SHORT_DURATION)); + assertThat(m2.setHealthCheckActiveLocked(SHORT_DURATION)).isEqualTo( + HealthCheckState.ACTIVE); // Verify now failed - assertEquals(HealthCheckState.FAILED, m2.handleElapsedTimeLocked(SHORT_DURATION)); + assertThat(m2.handleElapsedTimeLocked(SHORT_DURATION)).isEqualTo(HealthCheckState.FAILED); // Verify transition: inactive -> failed // Verify initially inactive - assertEquals(HealthCheckState.INACTIVE, m3.getHealthCheckStateLocked()); + assertThat(m3.getHealthCheckStateLocked()).isEqualTo(HealthCheckState.INACTIVE); // Verify now failed because package expired - assertEquals(HealthCheckState.FAILED, m3.handleElapsedTimeLocked(LONG_DURATION)); + assertThat(m3.handleElapsedTimeLocked(LONG_DURATION)).isEqualTo(HealthCheckState.FAILED); // Verify remains failed even when asked to pass - assertEquals(HealthCheckState.FAILED, m3.tryPassHealthCheckLocked()); + assertThat(m3.tryPassHealthCheckLocked()).isEqualTo(HealthCheckState.FAILED); // Verify transition: passed - assertEquals(HealthCheckState.PASSED, m4.getHealthCheckStateLocked()); + assertThat(m4.getHealthCheckStateLocked()).isEqualTo(HealthCheckState.PASSED); // Verify remains passed even if health check fails - assertEquals(HealthCheckState.PASSED, m4.handleElapsedTimeLocked(SHORT_DURATION)); + assertThat(m4.handleElapsedTimeLocked(SHORT_DURATION)).isEqualTo(HealthCheckState.PASSED); // Verify remains passed even if package expires - assertEquals(HealthCheckState.PASSED, m4.handleElapsedTimeLocked(LONG_DURATION)); + assertThat(m4.handleElapsedTimeLocked(LONG_DURATION)).isEqualTo(HealthCheckState.PASSED); } @Test @@ -736,8 +699,7 @@ public class PackageWatchdogTest { mTestLooper.dispatchAll(); // Verify the NetworkStack observer is notified - assertEquals(1, observer.mMitigatedPackages.size()); - assertEquals(APP_A, observer.mMitigatedPackages.get(0)); + assertThat(observer.mMitigatedPackages).containsExactly(APP_A); } private void adoptShellPermissions(String... permissions) { @@ -773,10 +735,12 @@ public class PackageWatchdogTest { } /** Trigger package failures above the threshold. */ - private void raiseFatalFailure(PackageWatchdog watchdog, List<VersionedPackage> packages) { + private void raiseFatalFailureAndDispatch(PackageWatchdog watchdog, + List<VersionedPackage> packages) { for (int i = 0; i < watchdog.getTriggerFailureCount(); i++) { watchdog.onPackageFailure(packages); } + mTestLooper.dispatchAll(); } private PackageWatchdog createWatchdog() { @@ -791,13 +755,13 @@ public class PackageWatchdogTest { new PackageWatchdog(mSpyContext, policyFile, handler, handler, controller, mConnectivityModuleConnector, mTestClock); // Verify controller is not automatically started - assertFalse(controller.mIsEnabled); + assertThat(controller.mIsEnabled).isFalse(); if (withPackagesReady) { // Only capture the NetworkStack callback for the latest registered watchdog reset(mConnectivityModuleConnector); watchdog.onPackagesReady(); // Verify controller by default is started when packages are ready - assertTrue(controller.mIsEnabled); + assertThat(controller.mIsEnabled).isTrue(); verify(mConnectivityModuleConnector).registerHealthListener( mConnectivityModuleCallbackCaptor.capture()); |