Merge "settings(payments): Use newly exposed formal API for CardEmulation.getServices()" into main am: 85ca373e75 am: 3521df9dca
Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/2810325
Change-Id: Ic739f9650dcfe638521dc0488c397ef9b8fa5ea7
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java
index 70fdbf0..0bfb87d 100644
--- a/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java
+++ b/src/com/android/settings/biometrics/fingerprint/UdfpsEnrollHelper.java
@@ -76,6 +76,8 @@
private int mCenterTouchCount = 0;
+ private int mPace = 1;
+
@Nullable
UdfpsEnrollHelper.Listener mListener;
@@ -157,6 +159,9 @@
}
}
+ if (mRemainingSteps > remaining) {
+ mPace = mRemainingSteps - remaining;
+ }
mRemainingSteps = remaining;
if (mListener != null && mTotalSteps != -1) {
@@ -258,7 +263,7 @@
return false;
}
- return mRemainingSteps <= 2 && mRemainingSteps >= 0;
+ return mRemainingSteps <= mPace && mRemainingSteps >= 0;
}
private int getStageThresholdSteps(int totalSteps, int stageIndex) {
diff --git a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
index 5014634..453941d 100644
--- a/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
+++ b/src/com/android/settings/network/telephony/MobileNetworkSwitchController.java
@@ -16,12 +16,16 @@
package com.android.settings.network.telephony;
+import static android.telephony.TelephonyManager.CALL_STATE_IDLE;
+
import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
import android.content.Context;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;
@@ -40,26 +44,40 @@
private int mSubId;
private SubscriptionsChangeListener mChangeListener;
private SubscriptionManager mSubscriptionManager;
+ private TelephonyManager mTelephonyManager;
+ private CallStateTelephonyCallback mCallStateCallback;
public MobileNetworkSwitchController(Context context, String preferenceKey) {
super(context, preferenceKey);
mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
+ mTelephonyManager = mContext.getSystemService(TelephonyManager.class);
mChangeListener = new SubscriptionsChangeListener(context, this);
}
void init(int subId) {
mSubId = subId;
+ mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId);
}
@OnLifecycleEvent(ON_RESUME)
public void onResume() {
mChangeListener.start();
+
+ if (mCallStateCallback == null) {
+ mCallStateCallback = new CallStateTelephonyCallback();
+ mTelephonyManager.registerTelephonyCallback(
+ mContext.getMainExecutor(), mCallStateCallback);
+ }
update();
}
@OnLifecycleEvent(ON_PAUSE)
public void onPause() {
+ if (mCallStateCallback != null) {
+ mTelephonyManager.unregisterTelephonyCallback(mCallStateCallback);
+ mCallStateCallback = null;
+ }
mChangeListener.stop();
}
@@ -118,4 +136,12 @@
public void onSubscriptionsChanged() {
update();
}
+
+ private class CallStateTelephonyCallback extends TelephonyCallback implements
+ TelephonyCallback.CallStateListener {
+ @Override
+ public void onCallStateChanged(int state) {
+ mSwitchBar.setSwitchBarEnabled(state == CALL_STATE_IDLE);
+ }
+ }
}
diff --git a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
index a6b565a..9ea8c58 100644
--- a/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
+++ b/src/com/android/settings/notification/NotificationAccessConfirmationActivity.java
@@ -17,6 +17,7 @@
package com.android.settings.notification;
+import static android.app.admin.DevicePolicyResources.Strings.Settings.WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import static com.android.internal.notification.NotificationAccessConfirmationActivityContract.EXTRA_COMPONENT_NAME;
@@ -26,6 +27,7 @@
import android.annotation.Nullable;
import android.app.Activity;
import android.app.NotificationManager;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
@@ -35,10 +37,12 @@
import android.content.pm.ServiceInfo;
import android.os.Bundle;
import android.os.UserHandle;
+import android.os.UserManager;
import android.text.TextUtils;
import android.util.Slog;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityEvent;
+import android.widget.Toast;
import com.android.internal.app.AlertActivity;
import com.android.internal.app.AlertController;
@@ -55,12 +59,28 @@
private ComponentName mComponentName;
private NotificationManager mNm;
+ private DevicePolicyManager mDpm;
+ private UserManager mUm;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ mUm = getSystemService(UserManager.class);
+ mDpm = getSystemService(DevicePolicyManager.class);
+
+ if (mUm.isManagedProfile()) {
+ Slog.w(LOG_TAG, "Apps in the work profile do not support notification listeners");
+ Toast.makeText(this,
+ mDpm.getResources().getString(WORK_APPS_CANNOT_ACCESS_NOTIFICATION_SETTINGS,
+ () -> getString(R.string.notification_settings_work_profile)),
+ Toast.LENGTH_SHORT).show();
+ finish();
+ return;
+ }
+
mNm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mComponentName = getIntent().getParcelableExtra(EXTRA_COMPONENT_NAME);
diff --git a/src/com/android/settings/password/SetNewPasswordActivity.java b/src/com/android/settings/password/SetNewPasswordActivity.java
index e54ae7a..fc664ec 100644
--- a/src/com/android/settings/password/SetNewPasswordActivity.java
+++ b/src/com/android/settings/password/SetNewPasswordActivity.java
@@ -121,7 +121,9 @@
@Override
public void launchChooseLock(Bundle chooseLockFingerprintExtras) {
- Intent intent = new Intent(this, SetupChooseLockGeneric.class);
+ final boolean isInSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
+ Intent intent = isInSetupWizard ? new Intent(this, SetupChooseLockGeneric.class)
+ : new Intent(this, ChooseLockGeneric.class);
intent.setAction(mNewPasswordAction);
intent.putExtras(chooseLockFingerprintExtras);
if (mCallerAppName != null) {
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index a3bef83..bc6c512 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -256,12 +256,6 @@
return InternalSetupChooseLockGenericFragment.class;
}
- @Override
- protected boolean isToolbarEnabled() {
- // Hide the action bar from this page.
- return false;
- }
-
public static class InternalSetupChooseLockGenericFragment
extends ChooseLockGenericFragment {
@Override
diff --git a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt
index f4489c6..e123389 100644
--- a/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt
+++ b/tests/spa_unit/src/com/android/settings/spa/app/appinfo/InteractAcrossProfilesDetailsPreferenceTest.kt
@@ -40,6 +40,7 @@
import com.android.settingslib.spaprivileged.framework.common.crossProfileApps
import org.junit.After
import org.junit.Before
+import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -116,6 +117,7 @@
composeTestRule.waitUntilExists(hasText(SUMMARY))
}
+ @Ignore
@Test
fun whenClick_startActivity() {
mockCanConfig(true)
diff --git a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java
index e460d67..3cdd23a 100644
--- a/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/MobileNetworkSwitchControllerTest.java
@@ -35,6 +35,8 @@
import android.os.Looper;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyCallback;
+import android.telephony.TelephonyManager;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
@@ -44,28 +46,32 @@
import androidx.preference.PreferenceViewHolder;
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.android.settings.network.SubscriptionUtil;
import com.android.settings.widget.SettingsMainSwitchPreference;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
+import org.junit.Rule;
import org.junit.Test;
-import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import java.util.Arrays;
+import java.util.concurrent.Executor;
-@RunWith(AndroidJUnit4.class)
public class MobileNetworkSwitchControllerTest {
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
@Mock
private SubscriptionManager mSubscriptionManager;
@Mock
private SubscriptionInfo mSubscription;
+ @Mock
+ private TelephonyManager mTelephonyManager;
private PreferenceScreen mScreen;
private PreferenceManager mPreferenceManager;
@@ -76,7 +82,9 @@
@Before
public void setUp() {
- MockitoAnnotations.initMocks(this);
+ if (Looper.myLooper() == null) {
+ Looper.prepare();
+ }
mContext = spy(ApplicationProvider.getApplicationContext());
when(mContext.getSystemService(SubscriptionManager.class)).thenReturn(mSubscriptionManager);
when(mSubscriptionManager.setSubscriptionEnabled(eq(mSubId), anyBoolean()))
@@ -89,18 +97,19 @@
when(sub2.getSubscriptionId()).thenReturn(456);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription, sub2));
+ when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager);
+ when(mTelephonyManager.createForSubscriptionId(mSubId))
+ .thenReturn(mTelephonyManager);
+
final String key = "prefKey";
mController = new MobileNetworkSwitchController(mContext, key);
mController.init(mSubscription.getSubscriptionId());
- if (Looper.myLooper() == null) {
- Looper.prepare();
- }
-
mPreferenceManager = new PreferenceManager(mContext);
mScreen = mPreferenceManager.createPreferenceScreen(mContext);
mSwitchBar = new SettingsMainSwitchPreference(mContext);
mSwitchBar.setKey(key);
+ mSwitchBar.setTitle("123");
mScreen.addPreference(mSwitchBar);
final LayoutInflater inflater = LayoutInflater.from(mContext);
@@ -117,7 +126,6 @@
@Test
@UiThreadTest
- @Ignore
public void isAvailable_pSIM_isNotAvailable() {
when(mSubscription.isEmbedded()).thenReturn(false);
mController.displayPreference(mScreen);
@@ -130,7 +138,6 @@
@Test
@UiThreadTest
- @Ignore
public void displayPreference_oneEnabledSubscription_switchBarNotHidden() {
doReturn(true).when(mSubscriptionManager).isActiveSubscriptionId(mSubId);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription));
@@ -140,7 +147,6 @@
@Test
@UiThreadTest
- @Ignore
public void displayPreference_oneDisabledSubscription_switchBarNotHidden() {
doReturn(false).when(mSubscriptionManager).isActiveSubscriptionId(mSubId);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(mSubscription));
@@ -152,7 +158,6 @@
@Test
@UiThreadTest
- @Ignore
public void displayPreference_subscriptionEnabled_switchIsOn() {
when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(true);
mController.displayPreference(mScreen);
@@ -162,7 +167,6 @@
@Test
@UiThreadTest
- @Ignore
public void displayPreference_subscriptionDisabled_switchIsOff() {
when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
@@ -174,7 +178,6 @@
@Test
@UiThreadTest
- @Ignore
public void switchChangeListener_fromEnabledToDisabled_setSubscriptionEnabledCalledCorrectly() {
when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(true);
mController.displayPreference(mScreen);
@@ -183,18 +186,24 @@
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
doNothing().when(mContext).startActivity(intentCaptor.capture());
+
+ // set switch off then should start a Activity.
mSwitchBar.setChecked(false);
+
+ when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
+ // Simulate action of back from previous activity.
+ mController.displayPreference(mScreen);
Bundle extra = intentCaptor.getValue().getExtras();
verify(mContext, times(1)).startActivity(any());
assertThat(extra.getInt(ToggleSubscriptionDialogActivity.ARG_SUB_ID)).isEqualTo(mSubId);
assertThat(extra.getBoolean(ToggleSubscriptionDialogActivity.ARG_enable))
.isEqualTo(false);
+ assertThat(mSwitchBar.isChecked()).isFalse();
}
@Test
@UiThreadTest
- @Ignore
public void switchChangeListener_fromEnabledToDisabled_setSubscriptionEnabledFailed() {
when(mSubscriptionManager.setSubscriptionEnabled(eq(mSubId), anyBoolean()))
.thenReturn(false);
@@ -205,7 +214,12 @@
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
doNothing().when(mContext).startActivity(intentCaptor.capture());
+
+ // set switch off then should start a Activity.
mSwitchBar.setChecked(false);
+
+ // Simulate action of back from previous activity.
+ mController.displayPreference(mScreen);
Bundle extra = intentCaptor.getValue().getExtras();
verify(mContext, times(1)).startActivity(any());
@@ -217,7 +231,6 @@
@Test
@UiThreadTest
- @Ignore
public void switchChangeListener_fromDisabledToEnabled_setSubscriptionEnabledCalledCorrectly() {
when(mSubscriptionManager.isActiveSubscriptionId(mSubId)).thenReturn(false);
mController.displayPreference(mScreen);
@@ -233,4 +246,24 @@
assertThat(extra.getInt(ToggleSubscriptionDialogActivity.ARG_SUB_ID)).isEqualTo(mSubId);
assertThat(extra.getBoolean(ToggleSubscriptionDialogActivity.ARG_enable)).isEqualTo(true);
}
+ @Test
+ @UiThreadTest
+ public void onResumeAndonPause_registerAndUnregisterTelephonyCallback() {
+ mController.onResume();
+
+ verify(mTelephonyManager)
+ .registerTelephonyCallback(any(Executor.class), any(TelephonyCallback.class));
+
+ mController.onPause();
+ verify(mTelephonyManager)
+ .unregisterTelephonyCallback(any(TelephonyCallback.class));
+ }
+
+ @Test
+ @UiThreadTest
+ public void onPause_doNotRegisterAndUnregisterTelephonyCallback() {
+ mController.onPause();
+ verify(mTelephonyManager, times(0))
+ .unregisterTelephonyCallback(any(TelephonyCallback.class));
+ }
}