Merge "Add preference click metric logs for some special cases"
diff --git a/res/drawable/ic_settings_close.xml b/res/drawable/ic_settings_close.xml
index 058b4b5..141a2c3 100644
--- a/res/drawable/ic_settings_close.xml
+++ b/res/drawable/ic_settings_close.xml
@@ -18,7 +18,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
- android:viewportHeight="24">
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorControlNormal">
<path
android:fillColor="#FF000000"
android:pathData="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41z"/>
diff --git a/res/layout/accessibility_shortcut_secondary_action.xml b/res/layout/accessibility_shortcut_secondary_action.xml
index b46c303..caf9b1c 100644
--- a/res/layout/accessibility_shortcut_secondary_action.xml
+++ b/res/layout/accessibility_shortcut_secondary_action.xml
@@ -87,6 +87,7 @@
</LinearLayout>
<View
+ android:id="@+id/divider"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java
index f1d36f2..a843a04 100644
--- a/src/com/android/settings/AirplaneModeEnabler.java
+++ b/src/com/android/settings/AirplaneModeEnabler.java
@@ -26,6 +26,8 @@
import android.telephony.TelephonyManager;
import android.util.Log;
+import androidx.annotation.VisibleForTesting;
+
import com.android.settings.network.GlobalSettingsChangeListener;
import com.android.settings.network.ProxySubscriptionManager;
import com.android.settings.overlay.FeatureFactory;
@@ -57,8 +59,8 @@
}
private TelephonyManager mTelephonyManager;
- private ProxySubscriptionManager mProxySubscriptionMgr;
- private PhoneStateListener mPhoneStateListener;
+ @VisibleForTesting
+ PhoneStateListener mPhoneStateListener;
private GlobalSettingsChangeListener mAirplaneModeObserver;
@@ -70,7 +72,6 @@
mOnAirplaneModeChangedListener = listener;
mTelephonyManager = context.getSystemService(TelephonyManager.class);
- mProxySubscriptionMgr = ProxySubscriptionManager.getInstance(context);
mPhoneStateListener = new PhoneStateListener() {
@Override
@@ -143,7 +144,7 @@
return true;
}
final List<SubscriptionInfo> subInfoList =
- mProxySubscriptionMgr.getActiveSubscriptionsInfo();
+ ProxySubscriptionManager.getInstance(mContext).getActiveSubscriptionsInfo();
if (subInfoList == null) {
return false;
}
diff --git a/src/com/android/settings/accessibility/ShortcutPreference.java b/src/com/android/settings/accessibility/ShortcutPreference.java
index f76bb01..b66a2b6 100644
--- a/src/com/android/settings/accessibility/ShortcutPreference.java
+++ b/src/com/android/settings/accessibility/ShortcutPreference.java
@@ -73,9 +73,11 @@
}
final View settings = holder.itemView.findViewById(android.R.id.widget_frame);
- if (settings != null) {
+ final View divider = holder.itemView.findViewById(R.id.divider);
+ if (settings != null && divider != null) {
settings.setOnClickListener(view -> callOnSettingsClicked());
settings.setVisibility(mSettingsVisibility);
+ divider.setVisibility(mSettingsVisibility);
}
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index c23aee6..308878f 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -36,6 +36,7 @@
import com.google.android.setupcompat.template.FooterBarMixin;
import com.google.android.setupcompat.template.FooterButton;
+import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.GlifLayout;
/**
@@ -120,6 +121,19 @@
initViews();
}
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (!isChangingConfigurations() && shouldFinishWhenBackgrounded()) {
+ setResult(RESULT_TIMEOUT);
+ finish();
+ }
+ }
+
+ protected boolean shouldFinishWhenBackgrounded() {
+ return !WizardManagerHelper.isAnySetupWizard(getIntent());
+ }
+
protected void initViews() {
getWindow().setStatusBarColor(Color.TRANSPARENT);
}
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index d94686e..d815f57 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -178,6 +178,11 @@
}
}
+ @Override
+ protected boolean shouldFinishWhenBackgrounded() {
+ return super.shouldFinishWhenBackgrounded() && !mConfirmingCredentials && !mNextClicked;
+ }
+
private void updatePasswordQuality() {
final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
.getActivePasswordQuality(mUserManager.getCredentialOwnerProfile(mUserId));
@@ -243,7 +248,8 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST) {
- if (resultCode == RESULT_FINISHED || resultCode == RESULT_SKIP) {
+ if (resultCode == RESULT_FINISHED || resultCode == RESULT_SKIP
+ || resultCode == RESULT_TIMEOUT) {
setResult(resultCode, data);
finish();
return;
diff --git a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
index a246055..17a933b 100644
--- a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
@@ -23,6 +23,8 @@
import com.android.settings.R;
import com.android.settings.password.ChooseLockSettingsHelper;
+import com.google.android.setupcompat.util.WizardManagerHelper;
+
/**
* Abstract base activity which handles the actual enrolling for biometrics.
*/
@@ -58,7 +60,6 @@
@Override
protected void onStop() {
- super.onStop();
if (mSidecar != null) {
mSidecar.setListener(null);
}
@@ -69,6 +70,9 @@
getSupportFragmentManager()
.beginTransaction().remove(mSidecar).commitAllowingStateLoss();
}
+ if (!WizardManagerHelper.isAnySetupWizard(getIntent())) {
+ setResult(RESULT_TIMEOUT);
+ }
finish();
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
index e1253c1..3b84c35 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
@@ -16,17 +16,13 @@
package com.android.settings.biometrics.face;
-import static android.security.KeyStore.getApplicationContext;
-
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
-import android.content.Context;
import android.content.Intent;
import android.hardware.face.FaceManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.UserHandle;
-import android.provider.Settings;
import android.text.TextUtils;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
@@ -173,14 +169,8 @@
}
@Override
- protected void onStop() {
- super.onStop();
-
- if (!isChangingConfigurations() && !WizardManagerHelper.isAnySetupWizard(getIntent())
- && !mNextClicked) {
- setResult(RESULT_SKIP);
- finish();
- }
+ protected boolean shouldFinishWhenBackgrounded() {
+ return super.shouldFinishWhenBackgrounded() && !mNextClicked;
}
@Override
@@ -216,11 +206,13 @@
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
mResultIntent = data;
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST) {
// If the user finished or skipped enrollment, finish this activity
- if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED) {
- setResult(resultCode);
+ if (resultCode == RESULT_FINISHED || resultCode == RESULT_SKIP
+ || resultCode == RESULT_TIMEOUT) {
+ setResult(resultCode, data);
finish();
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index 073c7e6..6709a6a 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -100,16 +100,6 @@
}
@Override
- protected void onStop() {
- super.onStop();
-
- if (!isChangingConfigurations() && !mConfirmingCredentials && !mNextClicked
- && !WizardManagerHelper.isAnySetupWizard(getIntent())) {
- finish();
- }
- }
-
- @Override
protected boolean isDisabledByAdmin() {
return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
this, DevicePolicyManager.KEYGUARD_DISABLE_FACE, mUserId) != null;
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index 5795e65..e1ca4f7 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -19,7 +19,9 @@
import static android.app.Activity.RESULT_OK;
import static com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST;
+import static com.android.settings.biometrics.BiometricEnrollBase.ENROLL_REQUEST;
import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED;
+import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT;
import android.app.settings.SettingsEnums;
import android.content.Context;
@@ -90,6 +92,9 @@
mEnrollButton.setVisible(true);
};
+ private final FaceSettingsEnrollButtonPreferenceController.Listener mEnrollListener = intent ->
+ startActivityForResult(intent, ENROLL_REQUEST);
+
public static boolean isAvailable(Context context) {
FaceManager manager = Utils.getFaceManagerOrNull(context);
return manager != null && manager.isHardwareDetected();
@@ -230,11 +235,16 @@
}
}
}
+ } else if (requestCode == ENROLL_REQUEST) {
+ if (resultCode == RESULT_TIMEOUT) {
+ setResult(resultCode, data);
+ finish();
+ }
}
if (mToken == null) {
// Didn't get an authentication, finishing
- getActivity().finish();
+ finish();
}
}
@@ -252,7 +262,7 @@
}
mToken = null;
}
- getActivity().finish();
+ finish();
}
}
@@ -277,6 +287,7 @@
mRemoveController.setActivity((SettingsActivity) getActivity());
} else if (controller instanceof FaceSettingsEnrollButtonPreferenceController) {
mEnrollController = (FaceSettingsEnrollButtonPreferenceController) controller;
+ mEnrollController.setListener(mEnrollListener);
mEnrollController.setActivity((SettingsActivity) getActivity());
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
index a087ccc..e89eca4 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsEnrollButtonPreferenceController.java
@@ -43,6 +43,7 @@
private SettingsActivity mActivity;
private Button mButton;
private boolean mIsClicked;
+ private Listener mListener;
public FaceSettingsEnrollButtonPreferenceController(Context context) {
this(context, KEY);
@@ -69,7 +70,11 @@
intent.setClassName("com.android.settings", FaceEnrollIntroduction.class.getName());
intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
- mContext.startActivity(intent);
+ if (mListener != null) {
+ mListener.onStartEnrolling(intent);
+ } else {
+ mContext.startActivity(intent);
+ }
}
@Override
@@ -95,4 +100,19 @@
public void setActivity(SettingsActivity activity) {
mActivity = activity;
}
+
+ public void setListener(Listener listener) {
+ mListener = listener;
+ }
+
+ /**
+ * Interface for registering callbacks related to the face enroll preference button.
+ */
+ public interface Listener {
+ /**
+ * Called when the user has indicated an intent to begin enrolling a new face.
+ * @param intent The Intent that should be used to launch face enrollment.
+ */
+ void onStartEnrolling(Intent intent);
+ }
}
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index e92c967..8194878 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -222,8 +222,8 @@
@Override
protected void onStop() {
- super.onStop();
stopIconAnimation();
+ super.onStop();
}
private void animateProgress(int progress) {
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index 733fb3f..9508268 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -115,10 +115,15 @@
@Override
protected void onStop() {
- super.onStop();
if (mAnimation != null) {
mAnimation.pauseAnimation();
}
+ super.onStop();
+ }
+
+ @Override
+ protected boolean shouldFinishWhenBackgrounded() {
+ return super.shouldFinishWhenBackgrounded() && !mNextClicked;
}
@Override
@@ -163,26 +168,25 @@
finish();
}
} else if (requestCode == ENROLL_REQUEST) {
- if (resultCode == RESULT_FINISHED) {
- setResult(RESULT_FINISHED);
- finish();
- } else if (resultCode == RESULT_SKIP) {
- setResult(RESULT_SKIP);
- finish();
- } else if (resultCode == RESULT_TIMEOUT) {
- setResult(RESULT_TIMEOUT);
- finish();
- } else {
- FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
- int enrolled = fpm.getEnrolledFingerprints().size();
- int max = getResources().getInteger(
- com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
- if (enrolled >= max) {
+ switch (resultCode) {
+ case RESULT_FINISHED:
+ case RESULT_SKIP:
+ case RESULT_TIMEOUT:
+ setResult(resultCode);
finish();
- } else {
- // We came back from enrolling but it wasn't completed, start again.
- startLookingForFingerprint();
- }
+ break;
+ default:
+ FingerprintManager fpm = Utils.getFingerprintManagerOrNull(this);
+ int enrolled = fpm.getEnrolledFingerprints().size();
+ int max = getResources().getInteger(
+ com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser);
+ if (enrolled >= max) {
+ finish();
+ } else {
+ // We came back from enrolling but it wasn't completed, start again.
+ startLookingForFingerprint();
+ }
+ break;
}
} else {
super.onActivityResult(requestCode, resultCode, data);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index 68b21f5..1a8e481 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -133,6 +133,7 @@
private Drawable mHighlightDrawable;
private int mUserId;
private CharSequence mFooterTitle;
+ private boolean mEnrollClicked;
private static final String TAG_AUTHENTICATE_SIDECAR = "authenticate_sidecar";
private static final String TAG_REMOVAL_SIDECAR = "removal_sidecar";
@@ -464,6 +465,14 @@
}
@Override
+ public void onStop() {
+ super.onStop();
+ if (!getActivity().isChangingConfigurations() && !mLaunchedConfirm && !mEnrollClicked) {
+ getActivity().finish();
+ }
+ }
+
+ @Override
public void onSaveInstanceState(final Bundle outState) {
outState.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
mToken);
@@ -475,6 +484,7 @@
public boolean onPreferenceTreeClick(Preference pref) {
final String key = pref.getKey();
if (KEY_FINGERPRINT_ADD.equals(key)) {
+ mEnrollClicked = true;
Intent intent = new Intent();
intent.setClassName(SETTINGS_PACKAGE_NAME,
FingerprintEnrollEnrolling.class.getName());
@@ -564,9 +574,10 @@
}
}
} else if (requestCode == ADD_FINGERPRINT_REQUEST) {
+ mEnrollClicked = false;
if (resultCode == RESULT_TIMEOUT) {
Activity activity = getActivity();
- activity.setResult(RESULT_TIMEOUT);
+ activity.setResult(resultCode);
activity.finish();
}
}
diff --git a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
index 5a04143..b9b8b87 100644
--- a/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
+++ b/src/com/android/settings/homepage/contextualcards/ContextualCardLoader.java
@@ -49,7 +49,7 @@
public class ContextualCardLoader extends AsyncLoaderCompat<List<ContextualCard>> {
@VisibleForTesting
- static final int DEFAULT_CARD_COUNT = 2;
+ static final int DEFAULT_CARD_COUNT = 3;
static final int CARD_CONTENT_LOADER_ID = 1;
private static final String TAG = "ContextualCardLoader";
diff --git a/src/com/android/settings/wifi/WifiSettings2.java b/src/com/android/settings/wifi/WifiSettings2.java
index a667d4a..a1f1ad9 100644
--- a/src/com/android/settings/wifi/WifiSettings2.java
+++ b/src/com/android/settings/wifi/WifiSettings2.java
@@ -76,11 +76,8 @@
import com.android.settingslib.search.SearchIndexableRaw;
import com.android.settingslib.wifi.LongPressWifiEntryPreference;
import com.android.wifitrackerlib.WifiEntry;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.ConnectStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.DisconnectStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.ForgetStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.SignInStatus;
+import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
+import com.android.wifitrackerlib.WifiEntry.ConnectCallback.ConnectStatus;
import com.android.wifitrackerlib.WifiPickerTracker;
import java.time.Clock;
@@ -543,7 +540,7 @@
connect(mSelectedWifiEntry, true /* editIfNoConfig */, false /* fullScreenEdit */);
return true;
case MENU_ID_DISCONNECT:
- mSelectedWifiEntry.disconnect();
+ mSelectedWifiEntry.disconnect(null /* callback */);
return true;
case MENU_ID_FORGET:
forget(mSelectedWifiEntry);
@@ -624,6 +621,16 @@
mDialogWifiEntryKey = null;
}
+ @Override
+ public int getDialogMetricsCategory(int dialogId) {
+ switch (dialogId) {
+ case WIFI_DIALOG_ID:
+ return SettingsEnums.DIALOG_WIFI_AP_EDIT;
+ default:
+ return 0;
+ }
+ }
+
/** Called when the state of Wifi has changed. */
@Override
public void onWifiStateChanged() {
@@ -720,7 +727,7 @@
mConnectedWifiEntryPreferenceCategory.addPreference(pref);
pref.setOnPreferenceClickListener(preference -> {
if (connectedEntry.canSignIn()) {
- connectedEntry.signIn();
+ connectedEntry.signIn(null /* callback */);
} else {
launchNetworkDetailsFragment(pref);
}
@@ -961,7 +968,7 @@
private void forget(WifiEntry wifiEntry) {
mMetricsFeatureProvider.action(getActivity(), SettingsEnums.ACTION_WIFI_FORGET);
- wifiEntry.forget();
+ wifiEntry.forget(null /* callback */);
}
private void connect(WifiEntry wifiEntry, boolean editIfNoConfig, boolean fullScreenEdit) {
@@ -969,11 +976,9 @@
wifiEntry.isSaved());
// If it's an unsaved secure WifiEntry, it will callback
- // WifiEntryCallback#onConnectResult with
- // WifiEntryCallback#CONNECT_STATUS_FAILURE_NO_CONFIG
- wifiEntry.setListener(new WifiEntryConnectCallback(wifiEntry, editIfNoConfig,
+ // ConnectCallback#onConnectResult with ConnectCallback#CONNECT_STATUS_FAILURE_NO_CONFIG
+ wifiEntry.connect(new WifiEntryConnectCallback(wifiEntry, editIfNoConfig,
fullScreenEdit));
- wifiEntry.connect();
}
private class WifiSaveThenConnectActionListener implements WifiManager.ActionListener {
@@ -1039,7 +1044,7 @@
}
};
- private class WifiEntryConnectCallback implements WifiEntryCallback {
+ private class WifiEntryConnectCallback implements ConnectCallback {
final WifiEntry mConnectWifiEntry;
final boolean mEditIfNoConfig;
final boolean mFullScreenEdit;
@@ -1052,18 +1057,13 @@
}
@Override
- public void onUpdated() {
- // Do nothing.
- }
-
- @Override
public void onConnectResult(@ConnectStatus int status) {
final Activity activity = getActivity();
if (isFisishingOrDestroyed(activity)) {
return;
}
- if (status == WifiEntryCallback.CONNECT_STATUS_FAILURE_NO_CONFIG) {
+ if (status == ConnectCallback.CONNECT_STATUS_FAILURE_NO_CONFIG) {
if (mEditIfNoConfig) {
// Edit an unsaved secure Wi-Fi network.
if (mFullScreenEdit) {
@@ -1077,21 +1077,6 @@
Toast.LENGTH_SHORT).show();
}
}
-
- @Override
- public void onDisconnectResult(@DisconnectStatus int status) {
- // Do nothing.
- }
-
- @Override
- public void onForgetResult(@ForgetStatus int status) {
- // Do nothing.
- }
-
- @Override
- public void onSignInResult(@SignInStatus int status) {
- // Do nothing.
- }
}
private boolean isFisishingOrDestroyed(Activity activity) {
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index 5f74d56..5eed9e3 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -75,12 +75,16 @@
import com.android.settingslib.widget.ActionButtonsPreference;
import com.android.settingslib.widget.LayoutPreference;
import com.android.wifitrackerlib.WifiEntry;
+import com.android.wifitrackerlib.WifiEntry.ConnectCallback;
+import com.android.wifitrackerlib.WifiEntry.ConnectCallback.ConnectStatus;
import com.android.wifitrackerlib.WifiEntry.ConnectedInfo;
+import com.android.wifitrackerlib.WifiEntry.DisconnectCallback;
+import com.android.wifitrackerlib.WifiEntry.DisconnectCallback.DisconnectStatus;
+import com.android.wifitrackerlib.WifiEntry.ForgetCallback;
+import com.android.wifitrackerlib.WifiEntry.ForgetCallback.ForgetStatus;
+import com.android.wifitrackerlib.WifiEntry.SignInCallback;
+import com.android.wifitrackerlib.WifiEntry.SignInCallback.SignInStatus;
import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.ConnectStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.DisconnectStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.ForgetStatus;
-import com.android.wifitrackerlib.WifiEntry.WifiEntryCallback.SignInStatus;
import java.net.Inet4Address;
import java.net.Inet6Address;
@@ -95,7 +99,8 @@
*/
public class WifiDetailPreferenceController2 extends AbstractPreferenceController
implements PreferenceControllerMixin, WifiDialog2Listener, LifecycleObserver, OnPause,
- OnResume, WifiEntryCallback {
+ OnResume, WifiEntryCallback, ConnectCallback, DisconnectCallback, ForgetCallback,
+ SignInCallback {
private static final String TAG = "WifiDetailsPrefCtrl2";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
@@ -214,8 +219,6 @@
|| hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED)
|| hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)
|| hasCapabilityChanged(nc, NET_CAPABILITY_PARTIAL_CONNECTIVITY)) {
- // TODO(b/143326832): What to do with WifiEntry?
- // mAccessPoint.update(mWifiConfig, mWifiInfo, mNetworkInfo);
refreshEntityHeader();
}
mNetworkCapabilities = nc;
@@ -298,17 +301,15 @@
setupEntityHeader(screen);
mButtonsPref = ((ActionButtonsPreference) screen.findPreference(KEY_BUTTONS_PREF))
- .setButton1Text(!mWifiEntry.isSaved()
- ? R.string.wifi_disconnect_button_text : R.string.forget)
+ .setButton1Text(R.string.forget)
.setButton1Icon(R.drawable.ic_settings_delete)
.setButton1OnClickListener(view -> forgetNetwork())
.setButton2Text(R.string.wifi_sign_in_button_text)
.setButton2Icon(R.drawable.ic_settings_sign_in)
.setButton2OnClickListener(view -> signIntoNetwork())
- .setButton3Text(R.string.wifi_connect)
- .setButton3Icon(R.drawable.ic_settings_wireless)
- .setButton3OnClickListener(view -> connectNetwork())
- .setButton3Enabled(true)
+ .setButton3Text(getConnectDisconnectButtonTextResource())
+ .setButton3Icon(getConnectDisconnectButtonIconResource())
+ .setButton3OnClickListener(view -> connectDisconnectNetwork())
.setButton4Text(R.string.share)
.setButton4Icon(R.drawable.ic_qrcode_24dp)
.setButton4OnClickListener(view -> shareNetwork());
@@ -587,29 +588,50 @@
}
private void refreshButtons() {
- boolean canForgetNetwork = mWifiEntry.canForget();
- boolean canSignIntoNetwork = canSignIntoNetwork();
- boolean showConnectButton = mWifiEntry.canConnect()
- || mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTING;
- boolean canShareNetwork = canShareNetwork();
+ final boolean canForgetNetwork = mWifiEntry.canForget();
+ final boolean canSignIntoNetwork = canSignIntoNetwork();
+ final boolean canConnectDisconnectNetwork = mWifiEntry.canConnect()
+ || mWifiEntry.canDisconnect();
+ final boolean canShareNetwork = canShareNetwork();
mButtonsPref.setButton1Visible(canForgetNetwork);
mButtonsPref.setButton2Visible(canSignIntoNetwork);
- mButtonsPref.setButton3Visible(showConnectButton);
- if (showConnectButton) {
- if (mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTING) {
- mButtonsPref.setButton3Text(R.string.wifi_connecting).setButton3Enabled(false);
- } else {
- mButtonsPref.setButton3Text(R.string.wifi_connect).setButton3Enabled(true);
- }
- }
+ mButtonsPref.setButton3Visible(mWifiEntry.getLevel() != WifiEntry.WIFI_LEVEL_UNREACHABLE);
+ mButtonsPref.setButton3Enabled(canConnectDisconnectNetwork);
+ mButtonsPref.setButton3Text(getConnectDisconnectButtonTextResource());
+ mButtonsPref.setButton3Icon(getConnectDisconnectButtonIconResource());
mButtonsPref.setButton4Visible(canShareNetwork);
mButtonsPref.setVisible(canForgetNetwork
|| canSignIntoNetwork
- || showConnectButton
+ || canConnectDisconnectNetwork
|| canShareNetwork);
}
+ private int getConnectDisconnectButtonTextResource() {
+ switch (mWifiEntry.getConnectedState()) {
+ case WifiEntry.CONNECTED_STATE_DISCONNECTED:
+ return R.string.wifi_connect;
+ case WifiEntry.CONNECTED_STATE_CONNECTED:
+ return R.string.wifi_disconnect_button_text;
+ case WifiEntry.CONNECTED_STATE_CONNECTING:
+ return R.string.wifi_connecting;
+ default:
+ throw new IllegalStateException("Invalid WifiEntry connected state");
+ }
+ }
+
+ private int getConnectDisconnectButtonIconResource() {
+ switch (mWifiEntry.getConnectedState()) {
+ case WifiEntry.CONNECTED_STATE_DISCONNECTED:
+ case WifiEntry.CONNECTED_STATE_CONNECTING:
+ return R.drawable.ic_settings_wireless;
+ case WifiEntry.CONNECTED_STATE_CONNECTED:
+ return R.drawable.ic_settings_close;
+ default:
+ throw new IllegalStateException("Invalid WifiEntry connected state");
+ }
+ }
+
private void refreshIpLayerInfo() {
// Hide IP layer info if not a connected network.
if (mWifiEntry.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED
@@ -706,7 +728,7 @@
showConfirmForgetDialog();
return;
} else {
- mWifiEntry.forget();
+ mWifiEntry.forget(this);
}
mMetricsFeatureProvider.action(
@@ -719,7 +741,7 @@
final AlertDialog dialog = new AlertDialog.Builder(mContext)
.setPositiveButton(R.string.forget, ((dialog1, which) -> {
try {
- mWifiEntry.forget();
+ mWifiEntry.forget(this);
} catch (RuntimeException e) {
Log.e(TAG, "Failed to remove Passpoint configuration for "
+ WifiEntryShell.getPasspointFqdn(mWifiEntry));
@@ -768,7 +790,7 @@
private void signIntoNetwork() {
mMetricsFeatureProvider.action(
mFragment.getActivity(), SettingsEnums.ACTION_WIFI_SIGNIN);
- mConnectivityManager.startCaptivePortalApp(mNetwork);
+ mWifiEntry.signIn(this);
}
@Override
@@ -813,8 +835,12 @@
}
@VisibleForTesting
- void connectNetwork() {
- mWifiEntry.connect();
+ void connectDisconnectNetwork() {
+ if (mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_DISCONNECTED) {
+ mWifiEntry.connect(this);
+ } else {
+ mWifiEntry.disconnect(this);
+ }
}
private void refreshMacTitle() {
@@ -849,7 +875,7 @@
*/
@Override
public void onConnectResult(@ConnectStatus int status) {
- if (status == WifiEntryCallback.CONNECT_STATUS_SUCCESS) {
+ if (status == ConnectCallback.CONNECT_STATUS_SUCCESS) {
Toast.makeText(mContext,
mContext.getString(R.string.wifi_connected_to_message, mWifiEntry.getTitle()),
Toast.LENGTH_SHORT).show();
@@ -862,10 +888,6 @@
R.string.wifi_failed_connect_message,
Toast.LENGTH_SHORT).show();
}
- mButtonsPref.setButton3Text(R.string.wifi_connect)
- .setButton3Icon(R.drawable.ic_settings_wireless)
- .setButton3Enabled(true)
- .setButton3Visible(true);
}
/**
@@ -873,12 +895,9 @@
*/
@Override
public void onDisconnectResult(@DisconnectStatus int status) {
- if (status != WifiEntryCallback.DISCONNECT_STATUS_SUCCESS) {
+ if (status != DisconnectCallback.DISCONNECT_STATUS_SUCCESS) {
Log.e(TAG, "Disconnect Wi-Fi network failed");
}
-
- updateNetworkInfo();
- refreshPage();
}
/**
@@ -886,7 +905,7 @@
*/
@Override
public void onForgetResult(@ForgetStatus int status) {
- if (status != WifiEntryCallback.FORGET_STATUS_SUCCESS) {
+ if (status != ForgetCallback.FORGET_STATUS_SUCCESS) {
Log.e(TAG, "Forget Wi-Fi network failed");
}
diff --git a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
index db4cb6c..b87b05d 100644
--- a/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiPrivacyPreferenceController2.java
@@ -88,7 +88,7 @@
// To activate changing, we need to reconnect network. WiFi will auto connect to
// current network after disconnect(). Only needed when this is connected network.
if (mWifiEntry.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED) {
- mWifiEntry.disconnect();
+ mWifiEntry.disconnect(null /* callback */);
}
}
updateSummary((DropDownPreference) preference, privacy);
diff --git a/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java b/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java
new file mode 100644
index 0000000..24abac9
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/AirplaneModeEnablerTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.telephony.TelephonyManager;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowSettings;
+
+
+@RunWith(AndroidJUnit4.class)
+public final class AirplaneModeEnablerTest {
+
+ private Context mContext;
+
+ @Mock
+ private AirplaneModeChangedListener mAirplaneModeChangedListener;
+ private AirplaneModeEnabler mAirplaneModeEnabler;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mContext = RuntimeEnvironment.application.getBaseContext();
+ mAirplaneModeEnabler = new AirplaneModeEnabler(mContext,
+ mAirplaneModeChangedListener);
+ }
+
+ @Test
+ public void onRadioPowerStateChanged_beenInvoke_invokeOnAirplaneModeChanged() {
+ mAirplaneModeEnabler.resume();
+
+ ShadowSettings.setAirplaneMode(true);
+
+ mAirplaneModeEnabler.mPhoneStateListener.onRadioPowerStateChanged(
+ TelephonyManager.RADIO_POWER_OFF);
+
+ verify(mAirplaneModeChangedListener, times(1)).onAirplaneModeChanged(true);
+ }
+
+ private class AirplaneModeChangedListener
+ implements AirplaneModeEnabler.OnAirplaneModeChangedListener {
+ public void onAirplaneModeChanged(boolean isAirplaneModeOn) {}
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
index e60303e..b48cd3c 100644
--- a/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
+++ b/tests/robotests/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2Test.java
@@ -1303,22 +1303,35 @@
}
@Test
- public void testConnectButton_shouldInvisibleForConnectNetwork() {
+ public void testDisconnectButton_connectedNetwork_shouldVisible() {
setUpForConnectedNetwork();
+ when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
displayAndResume();
- verify(mMockButtonsPref, times(1)).setButton3Visible(false);
+ verify(mMockButtonsPref).setButton3Visible(true);
+ verify(mMockButtonsPref).setButton3Text(R.string.wifi_disconnect);
}
@Test
- public void testConnectButton_shouldVisibleForDisconnectNetwork() {
+ public void testConnectButton_disconnectedNetwork_shouldVisibleIfReachable() {
setUpForDisconnectedNetwork();
+ when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_MAX);
displayAndResume();
- verify(mMockButtonsPref, times(1)).setButton3Visible(true);
- verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
+ verify(mMockButtonsPref).setButton3Visible(true);
+ verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
+ }
+
+ @Test
+ public void testConnectButton_disconnectedNetwork_shouldInvisibleIfUnreachable() {
+ setUpForDisconnectedNetwork();
+ when(mMockWifiEntry.getLevel()).thenReturn(WifiEntry.WIFI_LEVEL_UNREACHABLE);
+
+ displayAndResume();
+
+ verify(mMockButtonsPref).setButton3Visible(false);
}
private void setUpForToast() {
@@ -1337,11 +1350,11 @@
displayAndResume();
- // check connect button exist
- verifyConnectBtnSetUpAsVisible(inOrder);
+ // check connect button enabled
+ verifyConnectBtnSetUpAsEnabled(inOrder);
// click connect button
- mController.connectNetwork();
+ mController.connectDisconnectNetwork();
// check display button as connecting
verify(mMockWifiManager, times(1)).connect(anyInt(), any(WifiManager.ActionListener.class));
@@ -1352,7 +1365,7 @@
// check connect button invisible, be init as default state and toast success message
verifyConnectBtnBeInitAsDefault(inOrder);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(false);
+ inOrder.verify(mMockButtonsPref).setButton3Enabled(false);
assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
mContext.getString(R.string.wifi_connected_to_message, label));
}
@@ -1368,11 +1381,11 @@
displayAndResume();
- // check connect button exist
- verifyConnectBtnSetUpAsVisible(inOrder);
+ // check connect button enabled
+ verifyConnectBtnSetUpAsEnabled(inOrder);
// click connect button
- mController.connectNetwork();
+ mController.connectDisconnectNetwork();
// check display button as connecting
verify(mMockWifiManager, times(1)).connect(anyInt(), connectListenerCaptor.capture());
@@ -1383,26 +1396,26 @@
// check connect button visible, be init as default and toast failed message
verifyConnectBtnBeInitAsDefault(inOrder);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+ inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo(
mContext.getString(R.string.wifi_failed_connect_message));
}
- private void verifyConnectBtnSetUpAsVisible(InOrder inOrder) {
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Visible(true);
+ private void verifyConnectBtnSetUpAsEnabled(InOrder inOrder) {
+ inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
+ inOrder.verify(mMockButtonsPref).setButton3Icon(R.drawable.ic_settings_wireless);
+ inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
}
private void verifyConnectBtnSetUpAsConnecting(InOrder inOrder) {
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connecting);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(false);
+ inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connecting);
+ inOrder.verify(mMockButtonsPref).setButton3Enabled(false);
}
private void verifyConnectBtnBeInitAsDefault(InOrder inOrder) {
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Text(R.string.wifi_connect);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Icon(R.drawable.ic_settings_wireless);
- inOrder.verify(mMockButtonsPref, times(1)).setButton3Enabled(true);
+ inOrder.verify(mMockButtonsPref).setButton3Text(R.string.wifi_connect);
+ inOrder.verify(mMockButtonsPref).setButton3Icon(R.drawable.ic_settings_wireless);
+ inOrder.verify(mMockButtonsPref).setButton3Enabled(true);
}
@Test