diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml index 2dd8cd576de..761a724f79b 100644 --- a/res/layout/choose_lock_pattern_common.xml +++ b/res/layout/choose_lock_pattern_common.xml @@ -36,6 +36,16 @@ android:paddingLeft="0dp" android:paddingRight="0dp"> + + Set a work PIN Set a pattern + + For added security, set a pattern to unlock the device Set a work pattern @@ -9421,12 +9423,12 @@ - ~%d notification per day - ~%,d notifications per day + About %d notification per day + About %,d notifications per day - ~%d notification per week - ~%,d notifications per week + About %d notification per week + About %,d notifications per week Never diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java index a2b6182a715..5456f0ac694 100644 --- a/src/com/android/settings/accounts/AccountDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountDashboardFragment.java @@ -26,7 +26,6 @@ import android.os.UserHandle; import android.os.UserManager; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.autofill.PasswordsPreferenceController; import com.android.settings.applications.defaultapps.DefaultAutofillPreferenceController; import com.android.settings.applications.defaultapps.DefaultWorkAutofillPreferenceController; @@ -96,7 +95,7 @@ public class AccountDashboardFragment extends DashboardFragment { } private static void buildAccountPreferenceControllers( - Context context, SettingsPreferenceFragment parent, String[] authorities, + Context context, DashboardFragment parent, String[] authorities, List controllers) { final AccountPreferenceController accountPrefController = new AccountPreferenceController(context, parent, authorities, diff --git a/src/com/android/settings/accounts/AccountPersonalDashboardFragment.java b/src/com/android/settings/accounts/AccountPersonalDashboardFragment.java index 9ad12067233..4661c6416e7 100644 --- a/src/com/android/settings/accounts/AccountPersonalDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountPersonalDashboardFragment.java @@ -24,7 +24,6 @@ import android.app.settings.SettingsEnums; import android.content.Context; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.autofill.PasswordsPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; @@ -78,7 +77,7 @@ public class AccountPersonalDashboardFragment extends DashboardFragment { } private static void buildAccountPreferenceControllers( - Context context, SettingsPreferenceFragment parent, String[] authorities, + Context context, DashboardFragment parent, String[] authorities, List controllers) { final AccountPreferenceController accountPrefController = new AccountPreferenceController(context, parent, authorities, diff --git a/src/com/android/settings/accounts/AccountPreferenceController.java b/src/com/android/settings/accounts/AccountPreferenceController.java index 145898869fb..8c717f03e77 100644 --- a/src/com/android/settings/accounts/AccountPreferenceController.java +++ b/src/com/android/settings/accounts/AccountPreferenceController.java @@ -58,10 +58,10 @@ import androidx.preference.PreferenceScreen; import com.android.settings.AccessiblePreferenceCategory; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.Utils; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.SubSettingLauncher; +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.RestrictedPreference; @@ -101,7 +101,7 @@ public class AccountPreferenceController extends AbstractPreferenceController private Preference mProfileNotAvailablePreference; private String[] mAuthorities; private int mAuthoritiesCount = 0; - private SettingsPreferenceFragment mFragment; + private DashboardFragment mFragment; private int mAccountProfileOrder = ORDER_ACCOUNT_PROFILES; private AccountRestrictionHelper mHelper; private MetricsFeatureProvider mMetricsFeatureProvider; @@ -145,13 +145,13 @@ public class AccountPreferenceController extends AbstractPreferenceController public ArrayMap accountPreferences = new ArrayMap<>(); } - public AccountPreferenceController(Context context, SettingsPreferenceFragment parent, + public AccountPreferenceController(Context context, DashboardFragment parent, String[] authorities, @ProfileSelectFragment.ProfileType int type) { this(context, parent, authorities, new AccountRestrictionHelper(context), type); } @VisibleForTesting - AccountPreferenceController(Context context, SettingsPreferenceFragment parent, + AccountPreferenceController(Context context, DashboardFragment parent, String[] authorities, AccountRestrictionHelper helper, @ProfileSelectFragment.ProfileType int type) { super(context); @@ -314,6 +314,9 @@ public class AccountPreferenceController extends AbstractPreferenceController for (int i = 0; i < profilesCount; i++) { updateAccountTypes(mProfiles.valueAt(i)); } + + // Refresh for the auto-sync preferences + mFragment.forceUpdatePreferences(); } private void updateProfileUi(final UserInfo userInfo) { @@ -409,7 +412,6 @@ public class AccountPreferenceController extends AbstractPreferenceController return preference; } - private Preference newManagedProfileSettings() { Preference preference = new Preference(mFragment.getPreferenceManager().getContext()); preference.setKey(PREF_KEY_WORK_PROFILE_SETTING); diff --git a/src/com/android/settings/accounts/AccountWorkProfileDashboardFragment.java b/src/com/android/settings/accounts/AccountWorkProfileDashboardFragment.java index 1fdd3f6c428..f64e0416163 100644 --- a/src/com/android/settings/accounts/AccountWorkProfileDashboardFragment.java +++ b/src/com/android/settings/accounts/AccountWorkProfileDashboardFragment.java @@ -24,7 +24,6 @@ import android.app.settings.SettingsEnums; import android.content.Context; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.autofill.PasswordsPreferenceController; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; @@ -78,7 +77,7 @@ public class AccountWorkProfileDashboardFragment extends DashboardFragment { } private static void buildAccountPreferenceControllers( - Context context, SettingsPreferenceFragment parent, String[] authorities, + Context context, DashboardFragment parent, String[] authorities, List controllers) { final AccountPreferenceController accountPrefController = new AccountPreferenceController(context, parent, authorities, diff --git a/src/com/android/settings/dashboard/DashboardFragment.java b/src/com/android/settings/dashboard/DashboardFragment.java index fb0a09d47a7..9d1ed7c6bea 100644 --- a/src/com/android/settings/dashboard/DashboardFragment.java +++ b/src/com/android/settings/dashboard/DashboardFragment.java @@ -415,6 +415,30 @@ public abstract class DashboardFragment extends SettingsPreferenceFragment updatePreferenceVisibility(mPreferenceControllers); } + /** + * Force update all the preferences in this fragment. + */ + public void forceUpdatePreferences() { + final PreferenceScreen screen = getPreferenceScreen(); + if (screen == null || mPreferenceControllers == null) { + return; + } + for (List controllerList : mPreferenceControllers.values()) { + for (AbstractPreferenceController controller : controllerList) { + final String key = controller.getPreferenceKey(); + final Preference preference = findPreference(key); + if (preference == null) { + continue; + } + final boolean available = controller.isAvailable(); + if (available) { + controller.updateState(preference); + } + preference.setVisible(available); + } + } + } + @VisibleForTesting void updatePreferenceVisibility( Map> preferenceControllers) { diff --git a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java index 611ee24baaa..54935ecf4de 100644 --- a/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java +++ b/src/com/android/settings/deviceinfo/storage/StorageAsyncLoader.java @@ -85,13 +85,15 @@ public class StorageAsyncLoader for (UserInfo info : infos) { final StorageResult result = getAppsAndGamesSize(info.id); - + final Bundle media = new Bundle(); + media.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, MediaColumns.VOLUME_NAME + + "= '" + MediaStore.VOLUME_EXTERNAL_PRIMARY + "'"); result.imagesSize = getFilesSize(info.id, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - null /* queryArgs */); + media /* queryArgs */); result.videosSize = getFilesSize(info.id, MediaStore.Video.Media.EXTERNAL_CONTENT_URI, - null /* queryArgs */); + media /* queryArgs */); result.audioSize = getFilesSize(info.id, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, - null /* queryArgs */); + media /* queryArgs */); final Bundle documentsAndOtherQueryArgs = new Bundle(); documentsAndOtherQueryArgs.putString(ContentResolver.QUERY_ARG_SQL_SELECTION, @@ -100,13 +102,14 @@ public class StorageAsyncLoader + " AND " + FileColumns.MEDIA_TYPE + "!=" + FileColumns.MEDIA_TYPE_AUDIO + " AND " + FileColumns.MIME_TYPE + " IS NOT NULL"); result.documentsAndOtherSize = getFilesSize(info.id, - MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL), + MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY), documentsAndOtherQueryArgs); final Bundle trashQueryArgs = new Bundle(); trashQueryArgs.putInt(MediaStore.QUERY_ARG_MATCH_TRASHED, MediaStore.MATCH_ONLY); result.trashSize = getFilesSize(info.id, - MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL), trashQueryArgs); + MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY), + trashQueryArgs); results.put(info.id, result); } diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java index dc80b84b06e..d5491018ba9 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerV2.java @@ -347,6 +347,7 @@ public class BatteryChartPreferenceControllerV2 extends AbstractPreferenceContro trapezoidIndex, mBatteryIndexedMap.size(), isForce)); mTrapezoidIndex = trapezoidIndex; + mBatteryChartView.setSelectedIndex(mTrapezoidIndex); mHandler.post(() -> { final long start = System.currentTimeMillis(); removeAndCacheAllPrefs(); diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java index 5db5d52c6d9..15a3ca6f69f 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2.java @@ -110,9 +110,11 @@ public class BatteryChartViewV2 extends AppCompatImageView implements View.OnCli @VisibleForTesting Paint mTrapezoidCurvePaint = null; - private TrapezoidSlot[] mTrapezoidSlots; + @VisibleForTesting + TrapezoidSlot[] mTrapezoidSlots; // Records the location to calculate selected index. - private float mTouchUpEventX = Float.MIN_VALUE; + @VisibleForTesting + float mTouchUpEventX = Float.MIN_VALUE; private BatteryChartViewV2.OnSelectListener mOnSelectListener; public BatteryChartViewV2(Context context) { @@ -161,10 +163,6 @@ public class BatteryChartViewV2 extends AppCompatImageView implements View.OnCli if (mSelectedIndex != index) { mSelectedIndex = index; invalidate(); - // Callbacks to the listener if we have. - if (mOnSelectListener != null) { - mOnSelectListener.onSelect(mSelectedIndex); - } } } @@ -301,11 +299,9 @@ public class BatteryChartViewV2 extends AppCompatImageView implements View.OnCli || !isValidToDraw(trapezoidIndex)) { return; } - // Selects all if users click the same trapezoid item two times. - if (trapezoidIndex == mSelectedIndex) { - setSelectedIndex(SELECTED_INDEX_ALL); - } else { - setSelectedIndex(trapezoidIndex); + if (mOnSelectListener != null) { + mOnSelectListener.onSelect( + trapezoidIndex == mSelectedIndex ? SELECTED_INDEX_ALL : trapezoidIndex); } view.performHapticFeedback(HapticFeedbackConstants.CONTEXT_CLICK); } @@ -614,7 +610,8 @@ public class BatteryChartViewV2 extends AppCompatImageView implements View.OnCli } // A container class for each trapezoid left and right location. - private static final class TrapezoidSlot { + @VisibleForTesting + static final class TrapezoidSlot { public float mLeft; public float mRight; diff --git a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java index fb571734331..9ac1b87112b 100644 --- a/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java +++ b/src/com/android/settings/users/AutoSyncWorkDataPreferenceController.java @@ -22,7 +22,8 @@ import androidx.preference.PreferenceFragmentCompat; import com.android.settings.Utils; -public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPreferenceController { +/** An account sync data preference controller for work */ +public class AutoSyncWorkDataPreferenceController extends AutoSyncDataPreferenceController { private static final String KEY_AUTO_SYNC_WORK_ACCOUNT = "auto_sync_work_account_data"; @@ -38,6 +39,7 @@ public class AutoSyncWorkDataPreferenceController extends AutoSyncPersonalDataPr @Override public boolean isAvailable() { + mUserHandle = Utils.getManagedProfileWithDisabled(mUserManager); return mUserHandle != null && !mUserManager.isManagedProfile() && !mUserManager.isLinkedUser() && mUserManager.getProfiles(UserHandle.myUserId()).size() > 1; } diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java index 8a46c9d18c5..e3e77e86000 100644 --- a/src/com/android/settings/wifi/WifiDialogActivity.java +++ b/src/com/android/settings/wifi/WifiDialogActivity.java @@ -19,6 +19,7 @@ package com.android.settings.wifi; import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.os.UserManager.DISALLOW_CONFIG_WIFI; +import android.app.KeyguardManager; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; @@ -51,6 +52,7 @@ import com.android.wifitrackerlib.WifiEntry; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.util.ThemeHelper; +import java.lang.ref.WeakReference; import java.time.Clock; import java.time.ZoneOffset; @@ -96,10 +98,12 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog // Interval between initiating NetworkDetailsTracker scans. private static final long SCAN_INTERVAL_MILLIS = 10_000; - private WifiDialog mDialog; + @VisibleForTesting + WifiDialog mDialog; private AccessPoint mAccessPoint; - private WifiDialog2 mDialog2; + @VisibleForTesting + WifiDialog2 mDialog2; // The received intent supports a key of WifiTrackerLib or SettingsLib. private boolean mIsWifiTrackerLib; @@ -108,6 +112,7 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog private NetworkDetailsTracker mNetworkDetailsTracker; private HandlerThread mWorkerThread; private WifiManager mWifiManager; + private LockScreenMonitor mLockScreenMonitor; @Override protected void onCreate(Bundle savedInstanceState) { @@ -184,6 +189,10 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog mDialog.setOnDismissListener(this); } } + + if (mDialog2 != null || mDialog != null) { + mLockScreenMonitor = new LockScreenMonitor(this); + } } @VisibleForTesting @@ -221,6 +230,10 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog } } + if (mLockScreenMonitor != null) { + mLockScreenMonitor.release(); + mLockScreenMonitor = null; + } super.onDestroy(); } @@ -411,4 +424,45 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog } return false; } + + void dismissDialog() { + if (mDialog != null) { + mDialog.dismiss(); + mDialog = null; + } + if (mDialog2 != null) { + mDialog2.dismiss(); + mDialog2 = null; + } + } + + @VisibleForTesting + static final class LockScreenMonitor implements KeyguardManager.KeyguardLockedStateListener { + private final WeakReference mWifiDialogActivity; + private KeyguardManager mKeyguardManager; + + LockScreenMonitor(WifiDialogActivity activity) { + mWifiDialogActivity = new WeakReference<>(activity); + mKeyguardManager = activity.getSystemService(KeyguardManager.class); + mKeyguardManager.addKeyguardLockedStateListener(activity.getMainExecutor(), this); + } + + void release() { + if (mKeyguardManager == null) return; + mKeyguardManager.removeKeyguardLockedStateListener(this); + mKeyguardManager = null; + } + + @Override + public void onKeyguardLockedStateChanged(boolean isKeyguardLocked) { + if (!isKeyguardLocked) return; + WifiDialogActivity activity = mWifiDialogActivity.get(); + if (activity == null) return; + activity.dismissDialog(); + + Log.e(TAG, "Dismiss Wi-Fi dialog to prevent leaking user data on lock screen!"); + EventLog.writeEvent(0x534e4554, "231583603", -1 /* UID */, + "Leak Wi-Fi dialog on lock screen"); + } + } } diff --git a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java index b22b1562be2..89e00e12c7d 100644 --- a/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accounts/AccountPreferenceControllerTest.java @@ -45,7 +45,7 @@ import androidx.preference.PreferenceScreen; import com.android.settings.AccessiblePreferenceCategory; import com.android.settings.R; -import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.profileselector.ProfileSelectFragment; import com.android.settings.testutils.shadow.ShadowAccountManager; import com.android.settings.testutils.shadow.ShadowContentResolver; @@ -77,7 +77,7 @@ public class AccountPreferenceControllerTest { @Mock(answer = RETURNS_DEEP_STUBS) private UserManager mUserManager; @Mock(answer = RETURNS_DEEP_STUBS) - private SettingsPreferenceFragment mFragment; + private DashboardFragment mFragment; @Mock(answer = RETURNS_DEEP_STUBS) private AccountManager mAccountManager; @Mock(answer = RETURNS_DEEP_STUBS) diff --git a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java index 894a6c557df..fd6689a50a1 100644 --- a/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java +++ b/tests/robotests/src/com/android/settings/dashboard/DashboardFragmentTest.java @@ -297,6 +297,14 @@ public class DashboardFragmentTest { mTestFragment.updatePreferenceVisibility(prefControllers); } + @Test + public void forceUpdatePreferences_prefKeyNull_shouldNotCrash() { + mTestFragment.addPreferenceController(new TestPreferenceController(mContext)); + + // Should not crash + mTestFragment.forceUpdatePreferences(); + } + @Test public void checkUiBlocker_noUiBlocker_controllerIsNull() { mTestFragment.mBlockerController = null; diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java index 2879cf6989f..34ba2ebeeb2 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartViewV2Test.java @@ -26,6 +26,7 @@ import static org.mockito.Mockito.when; import android.accessibilityservice.AccessibilityServiceInfo; import android.content.Context; import android.os.LocaleList; +import android.view.View; import android.view.accessibility.AccessibilityManager; import com.android.settings.fuelgauge.PowerUsageFeatureProvider; @@ -55,6 +56,8 @@ public final class BatteryChartViewV2Test { private AccessibilityServiceInfo mMockAccessibilityServiceInfo; @Mock private AccessibilityManager mMockAccessibilityManager; + @Mock + private View mMockView; @Before public void setUp() { @@ -74,13 +77,13 @@ public final class BatteryChartViewV2Test { } @Test - public void testIsAccessibilityEnabled_disable_returnFalse() { + public void isAccessibilityEnabled_disable_returnFalse() { doReturn(false).when(mMockAccessibilityManager).isEnabled(); assertThat(BatteryChartViewV2.isAccessibilityEnabled(mContext)).isFalse(); } @Test - public void testIsAccessibilityEnabled_emptyInfo_returnFalse() { + public void isAccessibilityEnabled_emptyInfo_returnFalse() { doReturn(true).when(mMockAccessibilityManager).isEnabled(); doReturn(new ArrayList()) .when(mMockAccessibilityManager) @@ -90,45 +93,41 @@ public final class BatteryChartViewV2Test { } @Test - public void testIsAccessibilityEnabled_validServiceId_returnTrue() { + public void isAccessibilityEnabled_validServiceId_returnTrue() { doReturn(true).when(mMockAccessibilityManager).isEnabled(); assertThat(BatteryChartViewV2.isAccessibilityEnabled(mContext)).isTrue(); } @Test - public void testSetSelectedIndex_invokesCallback() { + public void onClick_invokesCallback() { + mBatteryChartView.setLevels(new int[] {90, 80, 70, 60}); + for (int i = 0; i < mBatteryChartView.mTrapezoidSlots.length; i++) { + mBatteryChartView.mTrapezoidSlots[i] = new BatteryChartViewV2.TrapezoidSlot(); + mBatteryChartView.mTrapezoidSlots[i].mLeft = i; + mBatteryChartView.mTrapezoidSlots[i].mRight = i + 0.5f; + } + mBatteryChartView.mSelectedIndex = 2; final int[] selectedIndex = new int[1]; - final int expectedIndex = 2; - mBatteryChartView.mSelectedIndex = 1; mBatteryChartView.setOnSelectListener( trapezoidIndex -> { selectedIndex[0] = trapezoidIndex; }); - mBatteryChartView.setSelectedIndex(expectedIndex); + // Verify onClick() a different index 1. + mBatteryChartView.mTouchUpEventX = 1; + selectedIndex[0] = Integer.MIN_VALUE; + mBatteryChartView.onClick(mMockView); + assertThat(selectedIndex[0]).isEqualTo(1); - assertThat(mBatteryChartView.mSelectedIndex) - .isEqualTo(expectedIndex); - assertThat(selectedIndex[0]).isEqualTo(expectedIndex); + // Verify onClick() the same index 2. + mBatteryChartView.mTouchUpEventX = 2; + selectedIndex[0] = Integer.MIN_VALUE; + mBatteryChartView.onClick(mMockView); + assertThat(selectedIndex[0]).isEqualTo(BatteryChartViewV2.SELECTED_INDEX_ALL); } @Test - public void testSetSelectedIndex_sameIndex_notInvokesCallback() { - final int[] selectedIndex = new int[1]; - final int expectedIndex = 1; - mBatteryChartView.mSelectedIndex = expectedIndex; - mBatteryChartView.setOnSelectListener( - trapezoidIndex -> { - selectedIndex[0] = trapezoidIndex; - }); - - mBatteryChartView.setSelectedIndex(expectedIndex); - - assertThat(selectedIndex[0]).isNotEqualTo(expectedIndex); - } - - @Test - public void testClickable_isChartGraphSlotsEnabledIsFalse_notClickable() { + public void clickable_isChartGraphSlotsEnabledIsFalse_notClickable() { mBatteryChartView.setClickableForce(true); when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext)) .thenReturn(false); @@ -139,7 +138,7 @@ public final class BatteryChartViewV2Test { } @Test - public void testClickable_accessibilityIsDisabled_clickable() { + public void clickable_accessibilityIsDisabled_clickable() { mBatteryChartView.setClickableForce(true); when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext)) .thenReturn(true); @@ -151,7 +150,7 @@ public final class BatteryChartViewV2Test { } @Test - public void testClickable_accessibilityIsEnabledWithoutValidId_clickable() { + public void clickable_accessibilityIsEnabledWithoutValidId_clickable() { mBatteryChartView.setClickableForce(true); when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext)) .thenReturn(true); @@ -166,7 +165,7 @@ public final class BatteryChartViewV2Test { } @Test - public void testClickable_accessibilityIsEnabledWithValidId_notClickable() { + public void clickable_accessibilityIsEnabledWithValidId_notClickable() { mBatteryChartView.setClickableForce(true); when(mPowerUsageFeatureProvider.isChartGraphSlotsEnabled(mContext)) .thenReturn(true); @@ -178,7 +177,7 @@ public final class BatteryChartViewV2Test { } @Test - public void testClickable_restoreFromNonClickableState() { + public void clickable_restoreFromNonClickableState() { final int[] levels = new int[13]; for (int index = 0; index < levels.length; index++) { levels[index] = index + 1; @@ -200,14 +199,14 @@ public final class BatteryChartViewV2Test { } @Test - public void testOnAttachedToWindow_addAccessibilityStateChangeListener() { + public void onAttachedToWindow_addAccessibilityStateChangeListener() { mBatteryChartView.onAttachedToWindow(); verify(mMockAccessibilityManager) .addAccessibilityStateChangeListener(mBatteryChartView); } @Test - public void testOnDetachedFromWindow_removeAccessibilityStateChangeListener() { + public void onDetachedFromWindow_removeAccessibilityStateChangeListener() { mBatteryChartView.onAttachedToWindow(); mBatteryChartView.mHandler.postDelayed( mBatteryChartView.mUpdateClickableStateRun, 1000); @@ -222,7 +221,7 @@ public final class BatteryChartViewV2Test { } @Test - public void testOnAccessibilityStateChanged_postUpdateStateRunnable() { + public void onAccessibilityStateChanged_postUpdateStateRunnable() { mBatteryChartView.mHandler = spy(mBatteryChartView.mHandler); mBatteryChartView.onAccessibilityStateChanged(/*enabled=*/ true); diff --git a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java index 28b7ecbf09b..c9cc02e9afb 100644 --- a/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java +++ b/tests/robotests/src/com/android/settings/wifi/WifiDialogActivityTest.java @@ -33,6 +33,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.KeyguardManager; import android.content.Intent; import android.content.pm.PackageManager; import android.net.wifi.WifiConfiguration; @@ -46,7 +47,6 @@ import com.android.wifitrackerlib.WifiEntry; import com.google.android.setupcompat.util.WizardManagerHelper; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -82,6 +82,8 @@ public class WifiDialogActivityTest { Intent mResultData; @Mock WifiConfigController mController; + @Mock + KeyguardManager mKeyguardManager; WifiDialogActivity mActivity; @@ -99,6 +101,7 @@ public class WifiDialogActivityTest { mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); + when(mActivity.getSystemService(KeyguardManager.class)).thenReturn(mKeyguardManager); } @Test @@ -294,4 +297,35 @@ public class WifiDialogActivityTest { assertThat(result).isTrue(); } + + @Test + public void dismissDialog_hasDialog_dialogDismiss() { + mActivity.mDialog = mWifiDialog; + mActivity.mDialog2 = mWifiDialog2; + + mActivity.dismissDialog(); + + verify(mWifiDialog).dismiss(); + verify(mWifiDialog2).dismiss(); + } + + @Test + public void onKeyguardLockedStateChanged_keyguardIsNotLocked_doNotDismissDialog() { + WifiDialogActivity.LockScreenMonitor lockScreenMonitor = + new WifiDialogActivity.LockScreenMonitor(mActivity); + + lockScreenMonitor.onKeyguardLockedStateChanged(false /* isKeyguardLocked */); + + verify(mActivity, never()).dismissDialog(); + } + + @Test + public void onKeyguardLockedStateChanged_keyguardIsLocked_dismissDialog() { + WifiDialogActivity.LockScreenMonitor lockScreenMonitor = + new WifiDialogActivity.LockScreenMonitor(mActivity); + + lockScreenMonitor.onKeyguardLockedStateChanged(true /* isKeyguardLocked */); + + verify(mActivity).dismissDialog(); + } }