diff --git a/color-check-baseline.xml b/color-check-baseline.xml
index 70744814dc2..7ab18a4407d 100644
--- a/color-check-baseline.xml
+++ b/color-check-baseline.xml
@@ -965,7 +965,7 @@
priority="4"
summary="Using hardcoded color"
explanation="Hardcoded color values are bad because theme changes cannot be uniformly applied.Instead use the theme specific colors such as `?android:attr/textColorPrimary` in attributes.
This ensures that a theme change from a light to a dark theme can be uniformlyapplied across the app."
- errorLine1=" <color name="homepage_about_background">#9FA8DA</color>"
+ errorLine1=" <color name="homepage_about_background">#6F86DA</color>"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/face_enroll_introduction.xml b/res/drawable/face_enroll_introduction.xml
index 4493d661c2f..6065f237237 100644
--- a/res/drawable/face_enroll_introduction.xml
+++ b/res/drawable/face_enroll_introduction.xml
@@ -1,3 +1,4 @@
+
-
+ android:width="240dp"
+ android:height="240dp"
+ android:viewportWidth="300"
+ android:viewportHeight="300">
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_face_enroll_introduction_detail.xml b/res/drawable/ic_face_enroll_introduction_detail.xml
new file mode 100644
index 00000000000..7159148f830
--- /dev/null
+++ b/res/drawable/ic_face_enroll_introduction_detail.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/drawable/ic_qrcode_24dp.xml b/res/drawable/ic_qrcode_24dp.xml
index ff7806f8107..6928cb97105 100644
--- a/res/drawable/ic_qrcode_24dp.xml
+++ b/res/drawable/ic_qrcode_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
- android:viewportHeight="24">
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorAccent">
diff --git a/res/drawable/ic_scan_24dp.xml b/res/drawable/ic_scan_24dp.xml
index bcef8e32db0..c7b82d1f7e2 100644
--- a/res/drawable/ic_scan_24dp.xml
+++ b/res/drawable/ic_scan_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
- android:viewportHeight="24">
+ android:viewportHeight="24"
+ android:tint="?android:attr/colorAccent">
diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml
index b5f13db2ab9..b55041ae19a 100644
--- a/res/layout/face_enroll_introduction.xml
+++ b/res/layout/face_enroll_introduction.xml
@@ -27,7 +27,7 @@
@@ -45,50 +45,87 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
-
-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
diff --git a/res/layout/network_request_dialog_title.xml b/res/layout/network_request_dialog_title.xml
index f643e0f5c5a..b61a7db4d23 100644
--- a/res/layout/network_request_dialog_title.xml
+++ b/res/layout/network_request_dialog_title.xml
@@ -25,14 +25,12 @@
+ android:background="?android:attr/selectableItemBackground"/>
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 333296c95c1..d5dbb17d03f 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -50,29 +50,31 @@
android:text="@string/wifi_ssid"
android:textDirection="locale" />
-
+ android:layout_height="wrap_content">
+ android:inputType="textNoSuggestions"/>
+
-
+
-
+ android:layout_height="wrap_content">
+ android:password="true"/>
-
+
-
+ android:layout_height="0dp"
+ android:gravity="center_horizontal"
+ android:orientation="vertical"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toTopOf="@+id/footer">
-
+
+
+ android:layout_height="wrap_content"/>
-
-
-
-
-
-
-
+
@string/wifi_calling_mode_cellular_preferred_summary
+
+
+ - @color/bt_color_icon_1
+ - @color/bt_color_icon_2
+ - @color/bt_color_icon_3
+ - @color/bt_color_icon_4
+ - @color/bt_color_icon_5
+ - @color/bt_color_icon_6
+ - @color/bt_color_icon_7
+
+
+
+
+ - @color/bt_color_bg_1
+ - @color/bt_color_bg_2
+ - @color/bt_color_bg_3
+ - @color/bt_color_bg_4
+ - @color/bt_color_bg_5
+ - @color/bt_color_bg_6
+ - @color/bt_color_bg_7
+
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 0afd28882a4..59ed4c47e5c 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -96,7 +96,7 @@
#26459C
#1A73E8
#2EC7DC
- #9FA8DA
+ #6F86DA
#5E97F6
#1f000000
@@ -140,4 +140,20 @@
#ff1a73e8
#b3ffffff
+
+ #48a50e0e
+ #480d652d
+ #48e37400
+ #48b06000
+ #489c166b
+ #48681da8
+ #48007b83
+
+ #fad2cf
+ #ceead6
+ #feefc3
+ #fedfc8
+ #fdcfe8
+ #e9d2fd
+ #cbf0f8
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 631d9120cad..7dc257572e5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -898,8 +898,10 @@
Use your face to unlock your phone, authorize purchases, or sign in to apps.
Use your face to unlock your phone or approve purchases.\n\nNote: You can\u2019t use your face to unlock this device. For more information, contact your organization\u2019s admin.
-
+
Use your face to unlock your phone, authorize purchases, or sign in to apps
+
+
Center your face in the circle
@@ -941,6 +943,11 @@
Your face can be used to unlock your device and access apps.
Learn more
+
+ Delete face data?
+
+ Data recorded by face unlock will be permanently and securely deleted. After removal, you will need your PIN, pattern, or password to unlock your phone, sign in to apps, and confirm payments.
+
@@ -2235,6 +2242,8 @@
@string/bluetooth_device_context_disconnect
Failed to connect to network
+
+ Network not in range
Forget
@@ -7050,7 +7059,7 @@
handle actions such as open web page, making phone calls, default SMS apps [CHAR LIMIT=40]-->
Default apps
- Languages, time, backup, updates
+ Languages, gestures, time, backup
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
index 2db654bec94..dffc67de169 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollAccessibilityToggle.java
@@ -20,6 +20,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
+import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
@@ -68,4 +69,12 @@ public class FaceEnrollAccessibilityToggle extends LinearLayout {
public void setChecked(boolean checked) {
mSwitch.setChecked(checked);
}
+
+ public void setListener(CompoundButton.OnCheckedChangeListener listener) {
+ mSwitch.setOnCheckedChangeListener(listener);
+ }
+
+ public Switch getSwitch() {
+ return mSwitch;
+ }
}
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index c7966f21dd0..d923e55fa4d 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -25,7 +25,7 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
-import android.widget.LinearLayout;
+import android.widget.CompoundButton;
import android.widget.TextView;
import com.android.settings.R;
@@ -38,6 +38,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.span.LinkSpan;
+import com.google.android.setupdesign.view.IllustrationVideoView;
public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
@@ -46,19 +47,44 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
private FaceManager mFaceManager;
private FaceEnrollAccessibilityToggle mSwitchDiversity;
+ private IllustrationVideoView mIllustrationNormal;
+ private View mIllustrationAccessibility;
+
+ private CompoundButton.OnCheckedChangeListener mSwitchDiversityListener =
+ new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked) {
+ mIllustrationNormal.stop();
+ mIllustrationNormal.setVisibility(View.INVISIBLE);
+ mIllustrationAccessibility.setVisibility(View.VISIBLE);
+ } else {
+ mIllustrationNormal.setVisibility(View.VISIBLE);
+ mIllustrationNormal.start();
+ mIllustrationAccessibility.setVisibility(View.INVISIBLE);
+ }
+ }
+ };
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+
mFaceManager = Utils.getFaceManagerOrNull(this);
- final LinearLayout accessibilityLayout = findViewById(R.id.accessibility_layout);
final Button accessibilityButton = findViewById(R.id.accessibility_button);
+ final View footerView = findViewById(R.id.footer_layout);
accessibilityButton.setOnClickListener(view -> {
mSwitchDiversity.setChecked(true);
- accessibilityButton.setVisibility(View.INVISIBLE);
- accessibilityLayout.setVisibility(View.VISIBLE);
+ accessibilityButton.setVisibility(View.GONE);
+ mSwitchDiversity.setVisibility(View.VISIBLE);
+ footerView.setVisibility(View.GONE);
});
mSwitchDiversity = findViewById(R.id.toggle_diversity);
+ mSwitchDiversity.setListener(mSwitchDiversityListener);
+
+ mIllustrationNormal = findViewById(R.id.illustration_normal);
+ mIllustrationAccessibility = findViewById(R.id.illustration_accessibility);
mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
if (WizardManagerHelper.isAnySetupWizard(getIntent())) {
@@ -91,6 +117,13 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
);
}
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mSwitchDiversityListener.onCheckedChanged(mSwitchDiversity.getSwitch(),
+ mSwitchDiversity.isChecked());
+ }
+
@Override
protected boolean isDisabledByAdmin() {
return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
@@ -114,7 +147,7 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
@Override
protected int getDescriptionResDisabledByAdmin() {
- return R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled;
+ return R.string.security_settings_face_enroll_introduction_message_unlock_disabled;
}
@Override
diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java
index ea5a303e6f3..9651eec1f02 100644
--- a/src/com/android/settings/biometrics/face/FaceSettings.java
+++ b/src/com/android/settings/biometrics/face/FaceSettings.java
@@ -31,6 +31,7 @@ import android.provider.SearchIndexableResource;
import android.util.Log;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.password.ChooseLockSettingsHelper;
@@ -56,6 +57,7 @@ public class FaceSettings extends DashboardFragment {
private int mUserId;
private byte[] mToken;
private FaceSettingsAttentionPreferenceController mAttentionController;
+ private FaceSettingsRemoveButtonPreferenceController mRemoveController;
private final FaceSettingsRemoveButtonPreferenceController.Listener mRemovalListener = () -> {
if (getActivity() != null) {
@@ -166,8 +168,9 @@ public class FaceSettings extends DashboardFragment {
if (controller instanceof FaceSettingsAttentionPreferenceController) {
mAttentionController = (FaceSettingsAttentionPreferenceController) controller;
} else if (controller instanceof FaceSettingsRemoveButtonPreferenceController) {
- ((FaceSettingsRemoveButtonPreferenceController) controller)
- .setListener(mRemovalListener);
+ mRemoveController = (FaceSettingsRemoveButtonPreferenceController) controller;
+ mRemoveController.setListener(mRemovalListener);
+ mRemoveController.setActivity((SettingsActivity) getActivity());
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
index baab391d84f..5174482e118 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsRemoveButtonPreferenceController.java
@@ -16,9 +16,14 @@
package com.android.settings.biometrics.face;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.settings.SettingsEnums;
import android.content.Context;
+import android.content.DialogInterface;
import android.hardware.face.Face;
import android.hardware.face.FaceManager;
+import android.os.Bundle;
import android.os.UserHandle;
import android.util.Log;
import android.view.View;
@@ -28,7 +33,9 @@ import android.widget.Toast;
import androidx.preference.Preference;
import com.android.settings.R;
+import com.android.settings.SettingsActivity;
import com.android.settings.core.BasePreferenceController;
+import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
import com.android.settingslib.widget.LayoutPreference;
import java.util.List;
@@ -43,6 +50,33 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
private static final String TAG = "FaceSettings/Remove";
private static final String KEY = "security_settings_face_delete_faces_container";
+ public static class ConfirmRemoveDialog extends InstrumentedDialogFragment {
+
+ private DialogInterface.OnClickListener mOnClickListener;
+
+ @Override
+ public int getMetricsCategory() {
+ return SettingsEnums.DIALOG_FACE_REMOVE;
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+
+ builder.setTitle(R.string.security_settings_face_settings_remove_dialog_title)
+ .setMessage(R.string.security_settings_face_settings_remove_dialog_details)
+ .setPositiveButton(R.string.okay, mOnClickListener)
+ .setNegativeButton(R.string.cancel, mOnClickListener);
+ AlertDialog dialog = builder.create();
+ dialog.setCanceledOnTouchOutside(false);
+ return dialog;
+ }
+
+ public void setOnClickListener(DialogInterface.OnClickListener listener) {
+ mOnClickListener = listener;
+ }
+ }
+
interface Listener {
void onRemoved();
}
@@ -50,6 +84,7 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
private Button mButton;
private List mFaces;
private Listener mListener;
+ private SettingsActivity mActivity;
private final Context mContext;
private final int mUserId;
@@ -77,6 +112,27 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
}
};
+ private final DialogInterface.OnClickListener mOnClickListener
+ = new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ if (mFaces.isEmpty()) {
+ Log.e(TAG, "No faces");
+ return;
+ }
+ if (mFaces.size() > 1) {
+ Log.e(TAG, "Multiple enrollments: " + mFaces.size());
+ }
+
+ // Remove the first/only face
+ mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
+ } else {
+ mButton.setEnabled(true);
+ }
+ }
+ };
+
public FaceSettingsRemoveButtonPreferenceController(Context context, String preferenceKey) {
super(context, preferenceKey);
mContext = context;
@@ -115,20 +171,17 @@ public class FaceSettingsRemoveButtonPreferenceController extends BasePreference
public void onClick(View v) {
if (v == mButton) {
mButton.setEnabled(false);
- if (mFaces.isEmpty()) {
- Log.e(TAG, "No faces");
- return;
- }
- if (mFaces.size() > 1) {
- Log.e(TAG, "Multiple enrollments: " + mFaces.size());
- }
-
- // Remove the first/only face
- mFaceManager.remove(mFaces.get(0), mUserId, mRemovalCallback);
+ ConfirmRemoveDialog dialog = new ConfirmRemoveDialog();
+ dialog.setOnClickListener(mOnClickListener);
+ dialog.show(mActivity.getSupportFragmentManager(), ConfirmRemoveDialog.class.getName());
}
}
public void setListener(Listener listener) {
mListener = listener;
}
+
+ public void setActivity(SettingsActivity activity) {
+ mActivity = activity;
+ }
}
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
index fd805b828f3..38603526ba6 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsHeaderController.java
@@ -26,7 +26,6 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.widget.EntityHeaderController;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -66,10 +65,8 @@ public class BluetoothDetailsHeaderController extends BluetoothDetailsController
}
protected void setHeaderProperties() {
- final Pair pair = BluetoothUtils
- .getBtClassDrawableWithDescription(mContext, mCachedDevice,
- mContext.getResources().getFraction(R.fraction.bt_battery_scale_fraction, 1,
- 1));
+ final Pair pair = Utils.getBtRainbowDrawableWithDescription(mContext,
+ mCachedDevice);
String summaryText = mCachedDevice.getConnectionSummary();
// If both the hearing aids are connected, two device status should be shown.
// If Second Summary is unavailable, to set it to null.
diff --git a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
index d4c0ed099fc..8d727ebdb96 100644
--- a/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
+++ b/src/com/android/settings/bluetooth/BluetoothDevicePreference.java
@@ -38,7 +38,6 @@ import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.widget.GearPreference;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
@@ -130,8 +129,8 @@ public final class BluetoothDevicePreference extends GearPreference implements
// Null check is done at the framework
setSummary(mCachedDevice.getConnectionSummary());
- final Pair pair = BluetoothUtils
- .getBtClassDrawableWithDescription(getContext(), mCachedDevice);
+ final Pair pair = Utils
+ .getBtRainbowDrawableWithDescription(getContext(), mCachedDevice);
if (pair.first != null) {
setIcon(pair.first);
contentDescription = pair.second;
@@ -246,5 +245,4 @@ public final class BluetoothDevicePreference extends GearPreference implements
R.string.bluetooth_pairing_error_message);
}
}
-
}
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index ff4a98fc5ce..e02ddc42616 100755
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -21,8 +21,12 @@ import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.Resources;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
import android.provider.Settings;
import android.util.Log;
+import android.util.Pair;
import android.widget.Toast;
import androidx.annotation.VisibleForTesting;
@@ -30,8 +34,10 @@ import androidx.appcompat.app.AlertDialog;
import com.android.settings.R;
import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.widget.AdaptiveIcon;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
@@ -179,4 +185,25 @@ public final class Utils {
return META_INT_ERROR;
}
}
+
+ /**
+ * Get colorful bluetooth icon with description
+ */
+ public static Pair getBtRainbowDrawableWithDescription(Context context,
+ CachedBluetoothDevice cachedDevice) {
+ final Pair pair = BluetoothUtils.getBtClassDrawableWithDescription(
+ context, cachedDevice);
+ final Resources resources = context.getResources();
+ final int[] iconFgColors = resources.getIntArray(R.array.bt_icon_fg_colors);
+ final int[] iconBgColors = resources.getIntArray(R.array.bt_icon_bg_colors);
+
+ // get color index based on mac address
+ final int index = Math.abs(cachedDevice.getAddress().hashCode()) % iconBgColors.length;
+ pair.first.setColorFilter(iconFgColors[index], PorterDuff.Mode.SRC_ATOP);
+ final Drawable adaptiveIcon = new AdaptiveIcon(context, pair.first);
+ ((AdaptiveIcon) adaptiveIcon).setBackgroundColor(iconBgColors[index]);
+
+ return new Pair<>(adaptiveIcon, pair.second);
+ }
+
}
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index 6348b912185..744cbd2f566 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -46,7 +46,7 @@ import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.AdaptiveHomepageIcon;
+import com.android.settings.widget.AdaptiveIcon;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.Tile;
@@ -197,8 +197,8 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
Drawable iconDrawable = tileIcon.loadDrawable(preference.getContext());
if (forceRoundedIcon
&& !TextUtils.equals(mContext.getPackageName(), tile.getPackageName())) {
- iconDrawable = new AdaptiveHomepageIcon(mContext, iconDrawable);
- ((AdaptiveHomepageIcon) iconDrawable).setBackgroundColor(mContext, tile);
+ iconDrawable = new AdaptiveIcon(mContext, iconDrawable);
+ ((AdaptiveIcon) iconDrawable).setBackgroundColor(mContext, tile);
}
preference.setIcon(iconDrawable);
} else if (tile.getMetaData() != null
diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
index b14fec94406..7a1f7f5d6a1 100644
--- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceController.java
@@ -19,7 +19,7 @@ public class BatterySaverStickyPreferenceController extends BasePreferenceContro
@Override
public void updateState(Preference preference) {
- int setting = Settings.System.getInt(mContext.getContentResolver(),
+ int setting = Settings.Global.getInt(mContext.getContentResolver(),
LOW_POWER_STICKY_AUTO_DISABLE_ENABLED, 1);
((SwitchPreference) preference).setChecked(setting == 0);
@@ -28,7 +28,7 @@ public class BatterySaverStickyPreferenceController extends BasePreferenceContro
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean keepActive = (Boolean) newValue;
- Settings.System.putInt(mContext.getContentResolver(),
+ Settings.Global.putInt(mContext.getContentResolver(),
LOW_POWER_STICKY_AUTO_DISABLE_ENABLED,
keepActive ? 0 : 1);
return true;
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
index f75588c04c3..bb6999949cd 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryDatabaseManager.java
@@ -59,7 +59,7 @@ public class BatteryDatabaseManager {
mDatabaseHelper = AnomalyDatabaseHelper.getInstance(context);
}
- public static BatteryDatabaseManager getInstance(Context context) {
+ public static synchronized BatteryDatabaseManager getInstance(Context context) {
if (sSingleton == null) {
sSingleton = new BatteryDatabaseManager(context);
}
@@ -84,15 +84,15 @@ public class BatteryDatabaseManager {
public synchronized boolean insertAnomaly(int uid, String packageName, int type,
int anomalyState,
long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- ContentValues values = new ContentValues();
- values.put(UID, uid);
- values.put(PACKAGE_NAME, packageName);
- values.put(ANOMALY_TYPE, type);
- values.put(ANOMALY_STATE, anomalyState);
- values.put(TIME_STAMP_MS, timestampMs);
- return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ ContentValues values = new ContentValues();
+ values.put(UID, uid);
+ values.put(PACKAGE_NAME, packageName);
+ values.put(ANOMALY_TYPE, type);
+ values.put(ANOMALY_STATE, anomalyState);
+ values.put(TIME_STAMP_MS, timestampMs);
+
+ return db.insertWithOnConflict(TABLE_ANOMALY, null, values, CONFLICT_IGNORE) != -1;
}
/**
@@ -100,43 +100,41 @@ public class BatteryDatabaseManager {
*/
public synchronized List queryAllAnomalies(long timestampMsAfter, int state) {
final List appInfos = new ArrayList<>();
- try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
- final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
- final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
- final Map mAppInfoBuilders = new ArrayMap<>();
- final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
- String.valueOf(state)};
+ final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+ final String[] projection = {PACKAGE_NAME, ANOMALY_TYPE, UID};
+ final String orderBy = AnomalyDatabaseHelper.AnomalyColumns.TIME_STAMP_MS + " DESC";
+ final Map mAppInfoBuilders = new ArrayMap<>();
+ final String selection = TIME_STAMP_MS + " > ? AND " + ANOMALY_STATE + " = ? ";
+ final String[] selectionArgs = new String[]{String.valueOf(timestampMsAfter),
+ String.valueOf(state)};
- try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, orderBy)) {
- while (cursor.moveToNext()) {
- final int uid = cursor.getInt(cursor.getColumnIndex(UID));
- if (!mAppInfoBuilders.containsKey(uid)) {
- final AppInfo.Builder builder = new AppInfo.Builder()
- .setUid(uid)
- .setPackageName(
- cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
- mAppInfoBuilders.put(uid, builder);
- }
- mAppInfoBuilders.get(uid).addAnomalyType(
- cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
+ try (Cursor cursor = db.query(TABLE_ANOMALY, projection, selection, selectionArgs,
+ null /* groupBy */, null /* having */, orderBy)) {
+ while (cursor.moveToNext()) {
+ final int uid = cursor.getInt(cursor.getColumnIndex(UID));
+ if (!mAppInfoBuilders.containsKey(uid)) {
+ final AppInfo.Builder builder = new AppInfo.Builder()
+ .setUid(uid)
+ .setPackageName(
+ cursor.getString(cursor.getColumnIndex(PACKAGE_NAME)));
+ mAppInfoBuilders.put(uid, builder);
}
+ mAppInfoBuilders.get(uid).addAnomalyType(
+ cursor.getInt(cursor.getColumnIndex(ANOMALY_TYPE)));
}
+ }
- for (Integer uid : mAppInfoBuilders.keySet()) {
- appInfos.add(mAppInfoBuilders.get(uid).build());
- }
+ for (Integer uid : mAppInfoBuilders.keySet()) {
+ appInfos.add(mAppInfoBuilders.get(uid).build());
}
return appInfos;
}
public synchronized void deleteAllAnomaliesBeforeTimeStamp(long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
- new String[]{String.valueOf(timestampMs)});
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ db.delete(TABLE_ANOMALY, TIME_STAMP_MS + " < ?",
+ new String[]{String.valueOf(timestampMs)});
}
/**
@@ -152,12 +150,12 @@ public class BatteryDatabaseManager {
for (int i = 0; i < size; i++) {
whereArgs[i] = appInfos.get(i).packageName;
}
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final ContentValues values = new ContentValues();
- values.put(ANOMALY_STATE, state);
- db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
- Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
- }
+
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final ContentValues values = new ContentValues();
+ values.put(ANOMALY_STATE, state);
+ db.update(TABLE_ANOMALY, values, PACKAGE_NAME + " IN (" + TextUtils.join(",",
+ Collections.nCopies(appInfos.size(), "?")) + ")", whereArgs);
}
}
@@ -170,21 +168,20 @@ public class BatteryDatabaseManager {
public synchronized SparseLongArray queryActionTime(
@AnomalyDatabaseHelper.ActionType int type) {
final SparseLongArray timeStamps = new SparseLongArray();
- try (SQLiteDatabase db = mDatabaseHelper.getReadableDatabase()) {
- final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
- final String selection = ActionColumns.ACTION_TYPE + " = ? ";
- final String[] selectionArgs = new String[]{String.valueOf(type)};
+ final SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
+ final String[] projection = {ActionColumns.UID, ActionColumns.TIME_STAMP_MS};
+ final String selection = ActionColumns.ACTION_TYPE + " = ? ";
+ final String[] selectionArgs = new String[]{String.valueOf(type)};
- try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
- null /* groupBy */, null /* having */, null /* orderBy */)) {
- final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
- final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
+ try (Cursor cursor = db.query(TABLE_ACTION, projection, selection, selectionArgs,
+ null /* groupBy */, null /* having */, null /* orderBy */)) {
+ final int uidIndex = cursor.getColumnIndex(ActionColumns.UID);
+ final int timestampIndex = cursor.getColumnIndex(ActionColumns.TIME_STAMP_MS);
- while (cursor.moveToNext()) {
- final int uid = cursor.getInt(uidIndex);
- final long timeStamp = cursor.getLong(timestampIndex);
- timeStamps.append(uid, timeStamp);
- }
+ while (cursor.moveToNext()) {
+ final int uid = cursor.getInt(uidIndex);
+ final long timeStamp = cursor.getLong(timestampIndex);
+ timeStamps.append(uid, timeStamp);
}
}
@@ -196,14 +193,14 @@ public class BatteryDatabaseManager {
*/
public synchronized boolean insertAction(@AnomalyDatabaseHelper.ActionType int type,
int uid, String packageName, long timestampMs) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final ContentValues values = new ContentValues();
- values.put(ActionColumns.UID, uid);
- values.put(ActionColumns.PACKAGE_NAME, packageName);
- values.put(ActionColumns.ACTION_TYPE, type);
- values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
- return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
- }
+ final SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final ContentValues values = new ContentValues();
+ values.put(ActionColumns.UID, uid);
+ values.put(ActionColumns.PACKAGE_NAME, packageName);
+ values.put(ActionColumns.ACTION_TYPE, type);
+ values.put(ActionColumns.TIME_STAMP_MS, timestampMs);
+
+ return db.insertWithOnConflict(TABLE_ACTION, null, values, CONFLICT_REPLACE) != -1;
}
/**
@@ -211,14 +208,13 @@ public class BatteryDatabaseManager {
*/
public synchronized boolean deleteAction(@AnomalyDatabaseHelper.ActionType int type,
int uid, String packageName) {
- try (SQLiteDatabase db = mDatabaseHelper.getWritableDatabase()) {
- final String where =
- ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
- + ActionColumns.PACKAGE_NAME + " = ? ";
- final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
- String.valueOf(packageName)};
+ SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();
+ final String where =
+ ActionColumns.ACTION_TYPE + " = ? AND " + ActionColumns.UID + " = ? AND "
+ + ActionColumns.PACKAGE_NAME + " = ? ";
+ final String[] whereArgs = new String[]{String.valueOf(type), String.valueOf(uid),
+ String.valueOf(packageName)};
- return db.delete(TABLE_ACTION, where, whereArgs) != 0;
- }
+ return db.delete(TABLE_ACTION, where, whereArgs) != 0;
}
}
diff --git a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
index 99fe21930bf..5c1fbdd3ac6 100644
--- a/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
+++ b/src/com/android/settings/homepage/contextualcards/slices/BluetoothDevicesSlice.java
@@ -46,7 +46,6 @@ import com.android.settings.slices.CustomSliceRegistry;
import com.android.settings.slices.CustomSliceable;
import com.android.settings.slices.SliceBroadcastReceiver;
import com.android.settings.slices.SliceBuilderUtils;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -211,8 +210,9 @@ public class BluetoothDevicesSlice implements CustomSliceable {
@VisibleForTesting
IconCompat getBluetoothDeviceIcon(CachedBluetoothDevice device) {
- final Pair pair = BluetoothUtils
- .getBtClassDrawableWithDescription(mContext, device);
+ final Pair pair =
+ com.android.settings.bluetooth.Utils.getBtRainbowDrawableWithDescription(mContext,
+ device);
final Drawable drawable = pair.first;
// Use default bluetooth icon if can't get icon.
diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
index a76d3814183..e4c64f7adc1 100644
--- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
+++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java
@@ -104,7 +104,7 @@ public class RecentLocationAccessPreferenceController extends AbstractPreference
.setOnClickListener((v) -> {
final Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSION);
intent.putExtra(Intent.EXTRA_PERMISSION_NAME,
- Manifest.permission_group.LOCATION);
+ Manifest.permission.ACCESS_FINE_LOCATION);
intent.putExtra(Intent.EXTRA_PACKAGE_NAME, access.packageName);
intent.putExtra(Intent.EXTRA_USER, access.userHandle);
mContext.startActivity(intent);
diff --git a/src/com/android/settings/overlay/FeatureFactory.java b/src/com/android/settings/overlay/FeatureFactory.java
index 23136a423cd..d9af345d652 100644
--- a/src/com/android/settings/overlay/FeatureFactory.java
+++ b/src/com/android/settings/overlay/FeatureFactory.java
@@ -20,6 +20,8 @@ import android.content.Context;
import android.text.TextUtils;
import android.util.Log;
+import androidx.annotation.Nullable;
+
import com.android.settings.R;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -50,6 +52,7 @@ public abstract class FeatureFactory {
private static final boolean DEBUG = false;
protected static FeatureFactory sFactory;
+ protected static Context sAppContext;
/**
* Returns a factory for creating feature controllers. Creates the factory if it does not
@@ -60,6 +63,9 @@ public abstract class FeatureFactory {
if (sFactory != null) {
return sFactory;
}
+ if (sAppContext == null) {
+ sAppContext = context.getApplicationContext();
+ }
if (DEBUG) Log.d(LOG_TAG, "getFactory");
final String clsName = context.getString(R.string.config_featureFactory);
@@ -76,6 +82,16 @@ public abstract class FeatureFactory {
return sFactory;
}
+ /**
+ * Returns an application {@link Context} used to create this {@link FeatureFactory}. If the
+ * factory has not been properly created yet (aka {@link #getFactory} has not been called), this
+ * will return null.
+ */
+ @Nullable
+ public static Context getAppContext() {
+ return sAppContext;
+ }
+
public abstract AssistGestureFeatureProvider getAssistGestureFeatureProvider();
public abstract SuggestionFeatureProvider getSuggestionFeatureProvider(Context context);
diff --git a/src/com/android/settings/panel/PanelFragment.java b/src/com/android/settings/panel/PanelFragment.java
index a222d36e7b8..20421d099dd 100644
--- a/src/com/android/settings/panel/PanelFragment.java
+++ b/src/com/android/settings/panel/PanelFragment.java
@@ -48,16 +48,11 @@ public class PanelFragment extends Fragment {
private RecyclerView mPanelSlices;
private PanelContent mPanel;
- private final MetricsFeatureProvider mMetricsProvider;
+ private MetricsFeatureProvider mMetricsProvider;
@VisibleForTesting
PanelSlicesAdapter mAdapter;
- public PanelFragment() {
- final Context context = getActivity();
- mMetricsProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider();
- }
-
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@@ -83,6 +78,7 @@ public class PanelFragment extends Fragment {
.getPanelFeatureProvider()
.getPanel(activity, panelType, mediaPackageName);
+ mMetricsProvider = FeatureFactory.getFactory(activity).getMetricsFeatureProvider();
// Log panel opened.
mMetricsProvider.action(
0 /* attribution */,
diff --git a/src/com/android/settings/widget/AdaptiveHomepageIcon.java b/src/com/android/settings/widget/AdaptiveIcon.java
similarity index 76%
rename from src/com/android/settings/widget/AdaptiveHomepageIcon.java
rename to src/com/android/settings/widget/AdaptiveIcon.java
index bc7aaa7f22e..04b33ae8d1e 100644
--- a/src/com/android/settings/widget/AdaptiveHomepageIcon.java
+++ b/src/com/android/settings/widget/AdaptiveIcon.java
@@ -35,14 +35,15 @@ import com.android.settings.R;
import com.android.settings.homepage.AdaptiveIconShapeDrawable;
import com.android.settingslib.drawer.Tile;
-public class AdaptiveHomepageIcon extends LayerDrawable {
+public class AdaptiveIcon extends LayerDrawable {
private static final String TAG = "AdaptiveHomepageIcon";
@VisibleForTesting(otherwise = NONE)
int mBackgroundColor = -1;
+ private AdaptiveConstantState mAdaptiveConstantState;
- public AdaptiveHomepageIcon(Context context, Drawable foreground) {
+ public AdaptiveIcon(Context context, Drawable foreground) {
super(new Drawable[]{
new AdaptiveIconShapeDrawable(context.getResources()),
foreground
@@ -50,6 +51,7 @@ public class AdaptiveHomepageIcon extends LayerDrawable {
final int insetPx = context.getResources()
.getDimensionPixelSize(R.dimen.dashboard_tile_foreground_image_inset);
setLayerInset(1 /* index */, insetPx, insetPx, insetPx, insetPx);
+ mAdaptiveConstantState = new AdaptiveConstantState(context, foreground);
}
public void setBackgroundColor(Context context, Tile tile) {
@@ -85,5 +87,36 @@ public class AdaptiveHomepageIcon extends LayerDrawable {
mBackgroundColor = color;
getDrawable(0).setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
Log.d(TAG, "Setting background color " + mBackgroundColor);
+ mAdaptiveConstantState.color = color;
+ }
+
+ @Override
+ public ConstantState getConstantState() {
+ return mAdaptiveConstantState;
+ }
+
+ @VisibleForTesting
+ static class AdaptiveConstantState extends ConstantState {
+ Context context;
+ Drawable drawable;
+ int color;
+
+ public AdaptiveConstantState(Context context, Drawable drawable) {
+ this.context = context;
+ this.drawable = drawable;
+ }
+
+ @Override
+ public Drawable newDrawable() {
+ final AdaptiveIcon icon = new AdaptiveIcon(context, drawable);
+ icon.setBackgroundColor(color);
+
+ return icon;
+ }
+
+ @Override
+ public int getChangingConfigurations() {
+ return 0;
+ }
}
}
diff --git a/src/com/android/settings/wifi/AddWifiNetworkPreference.java b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
new file mode 100644
index 00000000000..cd2e4a8182a
--- /dev/null
+++ b/src/com/android/settings/wifi/AddWifiNetworkPreference.java
@@ -0,0 +1,83 @@
+/*
+ * 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.wifi;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageButton;
+
+import androidx.annotation.DrawableRes;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settings.R;
+import com.android.settings.wifi.dpp.WifiDppUtils;
+
+/**
+ * The Preference for users to add Wi-Fi networks in WifiSettings
+ */
+public class AddWifiNetworkPreference extends Preference {
+
+ private static final String TAG = "AddWifiNetworkPreference";
+
+ private boolean mInitialized;
+
+ public AddWifiNetworkPreference(Context context) {
+ super(context);
+
+ setLayoutResource(com.android.settingslib.R.layout.preference_access_point);
+ setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
+ setIcon(R.drawable.ic_menu_add);
+ setTitle(R.string.wifi_add_network);
+ }
+
+ @Override
+ public void onBindViewHolder(PreferenceViewHolder holder) {
+ super.onBindViewHolder(holder);
+
+ if (!mInitialized) {
+ mInitialized = true;
+
+ final ImageButton imageButton = (ImageButton) holder.findViewById(R.id.button_icon);
+ imageButton.setImageDrawable(getDrawable(R.drawable.ic_scan_24dp));
+ imageButton.setContentDescription(
+ getContext().getString(R.string.wifi_dpp_scan_qr_code));
+ imageButton.setOnClickListener(view -> {
+ getContext().startActivity(
+ WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
+ });
+
+ final View divider = (View) holder.findViewById(
+ com.android.settingslib.R.id.two_target_divider);
+ divider.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ private Drawable getDrawable(@DrawableRes int iconResId) {
+ Drawable buttonIcon = null;
+
+ try {
+ buttonIcon = getContext().getDrawable(iconResId);
+ } catch (Resources.NotFoundException exception) {
+ Log.e(TAG, "Resource does not exist: " + iconResId);
+ }
+ return buttonIcon;
+ }
+}
diff --git a/src/com/android/settings/wifi/ButtonPreference.java b/src/com/android/settings/wifi/ButtonPreference.java
deleted file mode 100644
index 5169d7ac4ba..00000000000
--- a/src/com/android/settings/wifi/ButtonPreference.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Copyright (C) 2018 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.wifi;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.widget.ImageButton;
-
-import androidx.annotation.DrawableRes;
-import androidx.annotation.VisibleForTesting;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-/**
- * This preference provides one button layout with Settings style.
- * It looks like below
- *
- * --------------------------------------------------------------
- * | icon | title | button |
- * --------------------------------------------------------------
- *
- * User can set icon / click listener for button.
- * By default, the button is invisible.
- */
-public class ButtonPreference extends Preference {
-
- private static final String TAG = "ButtonPreference";
-
- private ImageButton mImageButton;
- private Drawable mButtonIcon;
- private View.OnClickListener mClickListener;
- private String mContentDescription;
-
- // Used for dummy pref.
- public ButtonPreference(Context context, AttributeSet attrs) {
- super(context, attrs);
- setWidgetLayoutResource(R.layout.wifi_button_preference_widget);
- mImageButton = null;
- mButtonIcon = null;
- mClickListener = null;
- mContentDescription = null;
- }
-
- public ButtonPreference(Context context) {
- this(context, /* attrs */ null);
- }
-
- @Override
- public void onBindViewHolder(final PreferenceViewHolder view) {
- super.onBindViewHolder(view);
- initButton(view);
- }
-
- @Override
- public void setOrder(int order) {
- super.setOrder(order);
- setButtonVisibility();
- }
-
- @VisibleForTesting
- protected void initButton(final PreferenceViewHolder view) {
- if (mImageButton == null) {
- mImageButton = (ImageButton) view.findViewById(R.id.button_icon);
- }
- if (mImageButton != null) {
- mImageButton.setImageDrawable(mButtonIcon);
- mImageButton.setOnClickListener(mClickListener);
- mImageButton.setContentDescription(mContentDescription);
- }
- setButtonVisibility();
- }
-
- private void setButtonVisibility() {
- if(mImageButton != null) {
- mImageButton.setVisibility(mButtonIcon == null ? View.GONE : View.VISIBLE);
- }
- }
-
- /**
- * Sets the drawable to be displayed in button.
- */
- public void setButtonIcon(@DrawableRes int iconResId) {
- if (iconResId == 0) {
- return;
- }
-
- try {
- mButtonIcon = getContext().getDrawable(iconResId);
- notifyChanged();
- } catch (Resources.NotFoundException exception) {
- Log.e(TAG, "Resource does not exist: " + iconResId);
- }
- }
-
- /**
- * Register a callback to be invoked when button is clicked.
- */
- public void setButtonOnClickListener(View.OnClickListener listener) {
- if (listener != mClickListener) {
- mClickListener = listener;
- notifyChanged();
- }
- }
-
- /**
- * A content description briefly describes the button and is primarily used for accessibility
- * support to determine how a button should be presented to the user.
- */
- public void setButtonContentDescription(String contentDescription) {
- if (contentDescription != mContentDescription) {
- mContentDescription = contentDescription;
- notifyChanged();
- }
- }
-}
diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
index ba29e3abab4..09360e427d8 100644
--- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
+++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java
@@ -82,11 +82,15 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
@VisibleForTesting
final static String EXTRA_APP_NAME = "com.android.settings.wifi.extra.APP_NAME";
+ final static String EXTRA_IS_SPECIFIED_SSID =
+ "com.android.settings.wifi.extra.REQUEST_IS_FOR_SINGLE_NETWORK";
private List mAccessPointList;
private FilterWifiTracker mFilterWifiTracker;
private AccessPointAdapter mDialogAdapter;
private NetworkRequestUserSelectionCallback mUserSelectionCallback;
+ private boolean mIsSpecifiedSsid;
+ private boolean mWaitingConnectCallback;
public static NetworkRequestDialogFragment newInstance() {
NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment();
@@ -104,6 +108,11 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
final TextView title = customTitle.findViewById(R.id.network_request_title_text);
title.setText(getTitle());
+ final Intent intent = getActivity().getIntent();
+ if (intent != null) {
+ mIsSpecifiedSsid = intent.getBooleanExtra(EXTRA_IS_SPECIFIED_SSID, false);
+ }
+
final ProgressBar progressBar = customTitle.findViewById(
R.id.network_request_title_progress);
progressBar.setVisibility(View.VISIBLE);
@@ -115,10 +124,13 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
final AlertDialog.Builder builder = new AlertDialog.Builder(context)
.setCustomTitle(customTitle)
.setAdapter(mDialogAdapter, this)
- .setPositiveButton(R.string.cancel, (dialog, which) -> getActivity().finish())
+ .setNegativeButton(R.string.cancel, (dialog, which) -> getActivity().finish())
// Do nothings, will replace the onClickListener to avoid auto closing dialog.
.setNeutralButton(R.string.network_connection_request_dialog_showall,
null /* OnClickListener */);
+ if (mIsSpecifiedSsid) {
+ builder.setPositiveButton(R.string.wifi_connect, null /* OnClickListener */);
+ }
// Clicking list item is to connect wifi ap.
final AlertDialog dialog = builder.create();
@@ -136,8 +148,19 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
notifyAdapterRefresh();
neutralBtn.setVisibility(View.GONE);
});
- });
+ // Replace Positive onClickListener to avoid closing dialog
+ if (mIsSpecifiedSsid) {
+ final Button positiveBtn = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
+ positiveBtn.setOnClickListener(v -> {
+ // When clicking connect button, should connect to the first and the only one
+ // list item.
+ this.onClick(dialog, 0 /* position */);
+ });
+ // Disable button in first, and enable it after there are some accesspoints in list.
+ positiveBtn.setEnabled(false);
+ }
+ });
return dialog;
}
@@ -184,6 +207,9 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
if (wifiConfig != null) {
mUserSelectionCallback.select(wifiConfig);
+
+ mWaitingConnectCallback = true;
+ updateConnectButton(false);
}
}
}
@@ -223,7 +249,7 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
}
}
- private void showNeutralButton() {
+ private void showAllButton() {
final AlertDialog alertDialog = (AlertDialog) getDialog();
if (alertDialog == null) {
return;
@@ -235,6 +261,35 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
}
}
+ private void updateConnectButton(boolean enabled) {
+ // The button is only showed in single SSID mode.
+ if (!mIsSpecifiedSsid) {
+ return;
+ }
+
+ final AlertDialog alertDialog = (AlertDialog) getDialog();
+ if (alertDialog == null) {
+ return;
+ }
+
+ final Button positiveBtn = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
+ if (positiveBtn != null) {
+ positiveBtn.setEnabled(enabled);
+ }
+ }
+
+ private void hideProgressIcon() {
+ final AlertDialog alertDialog = (AlertDialog) getDialog();
+ if (alertDialog == null) {
+ return;
+ }
+
+ final View progress = alertDialog.findViewById(R.id.network_request_title_progress);
+ if (progress != null) {
+ progress.setVisibility(View.GONE);
+ }
+ }
+
@Override
public void onResume() {
super.onResume();
@@ -403,7 +458,9 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
@Override
public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) {
- stopScanningAndPopErrorDialog(ERROR_DIALOG_TYPE.ABORT);
+ // Do nothing when selection is failed, let user could try again easily.
+ mWaitingConnectCallback = false;
+ updateConnectButton(true);
}
private final class FilterWifiTracker {
@@ -427,10 +484,6 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
mAccessPointKeys.add(key);
}
}
-
- if (mShowLimitedItem && (mAccessPointKeys.size() > MAX_NUMBER_LIST_ITEM)) {
- showNeutralButton();
- }
}
/**
@@ -457,6 +510,21 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp
}
}
+ // Update related UI buttons
+ if (mShowLimitedItem && (count >= MAX_NUMBER_LIST_ITEM)) {
+ showAllButton();
+ }
+ if (count > 0) {
+ hideProgressIcon();
+ }
+ // Enable connect button if there is Accesspoint item, except for the situation that
+ // user click but connected status doesn't come back yet.
+ if (count < 0) {
+ updateConnectButton(false);
+ } else if (!mWaitingConnectCallback) {
+ updateConnectButton(true);
+ }
+
return result;
}
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index a8fc34d7a8c..585cf71ac95 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -179,7 +179,8 @@ public class WifiSettings extends RestrictedSettingsFragment
private PreferenceCategory mConnectedAccessPointPreferenceCategory;
private PreferenceCategory mAccessPointsPreferenceCategory;
- private ButtonPreference mAddPreference;
+ @VisibleForTesting
+ AddWifiNetworkPreference mAddWifiNetworkPreference;
@VisibleForTesting
Preference mConfigureWifiSettingsPreference;
@VisibleForTesting
@@ -237,20 +238,8 @@ public class WifiSettings extends RestrictedSettingsFragment
(PreferenceCategory) findPreference(PREF_KEY_ACCESS_POINTS);
mConfigureWifiSettingsPreference = findPreference(PREF_KEY_CONFIGURE_WIFI_SETTINGS);
mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS);
-
- Context prefContext = getPrefContext();
- mAddPreference = new ButtonPreference(prefContext);
- mAddPreference.setIcon(R.drawable.ic_menu_add);
- mAddPreference.setTitle(R.string.wifi_add_network);
- mAddPreference.setButtonIcon(R.drawable.ic_scan_24dp);
- mAddPreference.setButtonOnClickListener((View v) -> {
- // Launch QR code scanner to join a network.
- getContext().startActivity(
- WifiDppUtils.getEnrolleeQrCodeScannerIntent(/* ssid */ null));
- });
- mAddPreference.setButtonContentDescription(getString(R.string.wifi_dpp_scan_qr_code));
+ mAddWifiNetworkPreference = new AddWifiNetworkPreference(getPrefContext());
mStatusMessagePreference = (LinkablePreference) findPreference(PREF_KEY_STATUS_MESSAGE);
-
mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());
}
@@ -590,7 +579,7 @@ public class WifiSettings extends RestrictedSettingsFragment
showDialog(mSelectedAccessPoint, WifiConfigUiBase.MODE_CONNECT);
break;
}
- } else if (preference == mAddPreference) {
+ } else if (preference == mAddWifiNetworkPreference) {
onAddNetworkPressed();
} else {
return super.onPreferenceTreeClick(preference);
@@ -809,8 +798,8 @@ public class WifiSettings extends RestrictedSettingsFragment
}
}
removeCachedPrefs(mAccessPointsPreferenceCategory);
- mAddPreference.setOrder(index);
- mAccessPointsPreferenceCategory.addPreference(mAddPreference);
+ mAddWifiNetworkPreference.setOrder(index);
+ mAccessPointsPreferenceCategory.addPreference(mAddWifiNetworkPreference);
setAdditionalSettingsSummaries();
if (!hasAvailableAccessPoints) {
diff --git a/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java b/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
index 4688d762a21..84f1c363f35 100644
--- a/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiNetworkListFragment.java
@@ -34,11 +34,14 @@ import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.core.SubSettingLauncher;
import com.android.settings.wifi.AddNetworkFragment;
+import com.android.settings.wifi.savedaccesspoints.SavedNetworkComparator;
import com.android.settingslib.wifi.AccessPoint;
import com.android.settingslib.wifi.AccessPointPreference;
+import com.android.settingslib.wifi.WifiSavedConfigUtils;
import com.android.settingslib.wifi.WifiTracker;
import com.android.settingslib.wifi.WifiTrackerFactory;
+import java.util.Collections;
import java.util.List;
public class WifiNetworkListFragment extends SettingsPreferenceFragment implements
@@ -256,17 +259,6 @@ public class WifiNetworkListFragment extends SettingsPreferenceFragment implemen
return false;
}
- // Can only use saved network for DPP configuration. For ephemeral connections networkId
- // is invalid.
- if (!accessPoint.isSaved()) {
- return false;
- }
-
- // Ignore access points that are out of range.
- if (!accessPoint.isReachable()) {
- return false;
- }
-
return true;
}
@@ -290,44 +282,47 @@ public class WifiNetworkListFragment extends SettingsPreferenceFragment implemen
return;
}
- // AccessPoints are sorted by the WifiTracker
- final List accessPoints = mWifiTracker.getAccessPoints();
-
- mAccessPointsPreferenceCategory.setVisible(true);
-
- cacheRemoveAllPrefs(mAccessPointsPreferenceCategory);
+ // TODO(b/128942314): Lists reachable AccessPoints on top of the list
+ final List savedAccessPoints =
+ WifiSavedConfigUtils.getAllConfigs(getContext(), mWifiManager);
+ Collections.sort(savedAccessPoints, SavedNetworkComparator.INSTANCE);
int index = 0;
- for (; index < accessPoints.size(); index++) {
- AccessPoint accessPoint = accessPoints.get(index);
- // Check if this access point is valid for DPP.
- if (isValidForDppConfiguration(accessPoint)) {
- final String key = accessPoint.getKey();
+ mAccessPointsPreferenceCategory.removeAll();
+ for (AccessPoint savedAccessPoint : savedAccessPoints) {
+ if (isValidForDppConfiguration(savedAccessPoint)) {
+ // Replaces with an AccessPoint from scanned result for signal information
+ savedAccessPoint = getScannedAccessPointIfAvailable(savedAccessPoint);
+ final AccessPointPreference preference =
+ createAccessPointPreference(savedAccessPoint);
- final AccessPointPreference pref = (AccessPointPreference) getCachedPreference(key);
- if (pref != null) {
- pref.setOrder(index);
- continue;
- }
- final AccessPointPreference preference = createAccessPointPreference(accessPoint);
- preference.setKey(key);
- preference.setOrder(index);
+ preference.setOrder(index++);
+ preference.setEnabled(savedAccessPoint.isReachable());
+ savedAccessPoint.setListener(this);
- mAccessPointsPreferenceCategory.addPreference(preference);
- accessPoint.setListener(this);
preference.refresh();
+ mAccessPointsPreferenceCategory.addPreference(preference);
}
}
- removeCachedPrefs(mAccessPointsPreferenceCategory);
mAddPreference.setOrder(index);
mAccessPointsPreferenceCategory.addPreference(mAddPreference);
if (mIsTest) {
- mFakeNetworkPreference.setOrder(index + 1);
mAccessPointsPreferenceCategory.addPreference(mFakeNetworkPreference);
}
}
+ private AccessPoint getScannedAccessPointIfAvailable(AccessPoint savedAccessPoint) {
+ final List scannedAccessPoints = mWifiTracker.getAccessPoints();
+ final WifiConfiguration savedWifiConfiguration = savedAccessPoint.getConfig();
+ for (AccessPoint scannedAccessPoint : scannedAccessPoints) {
+ if (scannedAccessPoint.matches(savedWifiConfiguration)) {
+ return scannedAccessPoint;
+ }
+ }
+ return savedAccessPoint;
+ }
+
private AccessPointPreference createAccessPointPreference(AccessPoint accessPoint) {
return new AccessPointPreference(accessPoint, getPrefContext(), mUserBadgeCache,
R.drawable.ic_wifi_signal_0, /* forSavedNetworks */ false);
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
index a441864391e..0ee9cfc5ede 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterysaver/BatterySaverStickyPreferenceControllerTest.java
@@ -42,7 +42,7 @@ public class BatterySaverStickyPreferenceControllerTest {
}
private int getAutoDisableSetting() {
- return Settings.System.getInt(mContext.getContentResolver(),
+ return Settings.Global.getInt(mContext.getContentResolver(),
LOW_POWER_STICKY_AUTO_DISABLE_ENABLED,
1);
}
diff --git a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
similarity index 80%
rename from tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
rename to tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
index 05a9cfb3dfc..1be3332c222 100644
--- a/tests/robotests/src/com/android/settings/widget/AdaptiveHomepageIconTest.java
+++ b/tests/robotests/src/com/android/settings/widget/AdaptiveIconTest.java
@@ -48,7 +48,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
-public class AdaptiveHomepageIconTest {
+public class AdaptiveIconTest {
private Context mContext;
private ActivityInfo mActivityInfo;
@@ -64,8 +64,8 @@ public class AdaptiveHomepageIconTest {
@Test
public void createIcon_shouldSetBackgroundAndInset() {
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
assertThat(icon.getNumberOfLayers()).isEqualTo(2);
assertThat(icon.getDrawable(0)).isInstanceOf(AdaptiveIconShapeDrawable.class);
@@ -73,8 +73,8 @@ public class AdaptiveHomepageIconTest {
@Test
public void setBackgroundColor_shouldUpdateColorFilter() {
- final AdaptiveHomepageIcon icon =
- spy(new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK)));
+ final AdaptiveIcon icon =
+ spy(new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK)));
final ShapeDrawable background = mock(ShapeDrawable.class);
when(icon.getDrawable(0)).thenReturn(background);
@@ -89,8 +89,8 @@ public class AdaptiveHomepageIconTest {
mActivityInfo.metaData.putInt(META_DATA_PREFERENCE_ICON_BACKGROUND_ARGB, 0xff0000);
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor).isEqualTo(0xff0000);
@@ -101,8 +101,8 @@ public class AdaptiveHomepageIconTest {
final Tile tile = spy(new Tile(mActivityInfo, CategoryKey.CATEGORY_HOMEPAGE));
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
@@ -118,11 +118,24 @@ public class AdaptiveHomepageIconTest {
doReturn(Icon.createWithResource(mContext, R.drawable.ic_settings_accent))
.when(tile).getIcon(mContext);
- final AdaptiveHomepageIcon icon =
- new AdaptiveHomepageIcon(mContext, new ColorDrawable(Color.BLACK));
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
icon.setBackgroundColor(mContext, tile);
assertThat(icon.mBackgroundColor)
.isEqualTo(mContext.getColor(R.color.material_blue_500));
}
+
+ @Test
+ public void getConstantState_returnCorrectState() {
+ final AdaptiveIcon icon =
+ new AdaptiveIcon(mContext, new ColorDrawable(Color.BLACK));
+ icon.setBackgroundColor(Color.YELLOW);
+
+ final AdaptiveIcon.AdaptiveConstantState state =
+ (AdaptiveIcon.AdaptiveConstantState) icon.getConstantState();
+
+ assertThat(state.color).isEqualTo(Color.YELLOW);
+ assertThat(state.context).isEqualTo(mContext);
+ }
}
diff --git a/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java
deleted file mode 100644
index 7f0598dce85..00000000000
--- a/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2018 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.wifi;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.ImageButton;
-
-import androidx.preference.PreferenceViewHolder;
-
-import com.android.settings.R;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-@RunWith(RobolectricTestRunner.class)
-public class ButtonPreferenceTest {
-
- private Context mContext;
- private View mRootView;
- private ButtonPreference mPref;
- private PreferenceViewHolder mHolder;
- private boolean mClicked;
-
- @Before
- public void setUp() {
- MockitoAnnotations.initMocks(this);
-
- mContext = RuntimeEnvironment.application;
- mPref = new ButtonPreference(mContext);
- mRootView = View.inflate(mContext, R.layout.wifi_button_preference_widget, /* parent */
- null);
- mHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
- }
-
- @Test
- public void initButton_noIcon_shouldInvisible() {
- mPref.initButton(mHolder);
- assertThat(mRootView.findViewById(R.id.button_icon).getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void initButton_withIcon_shouldVisible() {
- mPref.setButtonIcon(R.drawable.ic_qrcode_24dp);
- mPref.initButton(mHolder);
- assertThat(mRootView.findViewById(R.id.button_icon).getVisibility()).isEqualTo(
- View.VISIBLE);
- }
-
- @Test
- public void initButton_whenClick_shouldCallback() {
- mClicked = false;
- mPref.setButtonIcon(R.drawable.ic_qrcode_24dp);
- mPref.setButtonOnClickListener((View v) -> {
- mClicked = true;
- });
- mPref.initButton(mHolder);
- ImageButton button = (ImageButton) mRootView.findViewById(R.id.button_icon);
- button.performClick();
- assertThat(mClicked).isTrue();
- }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
index 21b68f216f2..d2403b942a1 100644
--- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java
@@ -106,12 +106,12 @@ public class NetworkRequestDialogFragmentTest {
}
@Test
- public void clickPositiveButton_shouldCloseTheDialog() {
+ public void clickNegativeButton_shouldCloseTheDialog() {
networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), null);
AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(alertDialog.isShowing()).isTrue();
- Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
+ Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
assertThat(positiveButton).isNotNull();
positiveButton.performClick();
@@ -185,26 +185,6 @@ public class NetworkRequestDialogFragmentTest {
verify(spyActivity).finish();
}
- @Test
- public void updateAccessPointList_onUserSelectionConnectFailure_shouldCallAbortDialog() {
- FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment();
- FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment);
- List accessPointList = createAccessPointList();
- when(spyFakeFragment.getAccessPointList()).thenReturn(accessPointList);
- spyFakeFragment.show(mActivity.getSupportFragmentManager(), null);
-
- AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- assertThat(alertDialog.isShowing()).isTrue();
-
- // Test if config would update list.
- WifiConfiguration config = new WifiConfiguration();
- config.SSID = "Test AP 3";
- fakeFragment.onUserSelectionConnectFailure(config);
-
- assertThat(fakeFragment.bCalledStopAndPop).isTrue();
- assertThat(fakeFragment.errorType).isEqualTo(ERROR_DIALOG_TYPE.ABORT);
- }
-
@Test
public void onUserSelectionCallbackRegistration_onClick_shouldCallSelect() {
// Assert.
@@ -267,19 +247,27 @@ public class NetworkRequestDialogFragmentTest {
Bundle bundle = new Bundle();
bundle.putString(KEY_SSID, "Test AP 1");
- bundle.putInt(KEY_SECURITY, 1);
+ bundle.putInt(KEY_SECURITY, 1 /* WEP */);
accessPointList.add(new AccessPoint(mContext, bundle));
bundle.putString(KEY_SSID, "Test AP 2");
- bundle.putInt(KEY_SECURITY, 1);
+ bundle.putInt(KEY_SECURITY, 1 /* WEP */);
accessPointList.add(new AccessPoint(mContext, bundle));
bundle.putString(KEY_SSID, "Test AP 3");
- bundle.putInt(KEY_SECURITY, 2);
+ bundle.putInt(KEY_SECURITY, 1 /* WEP */);
accessPointList.add(new AccessPoint(mContext, bundle));
bundle.putString(KEY_SSID, "Test AP 4");
- bundle.putInt(KEY_SECURITY, 0);
+ bundle.putInt(KEY_SECURITY, 0 /* NONE */);
+ accessPointList.add(new AccessPoint(mContext, bundle));
+
+ bundle.putString(KEY_SSID, "Test AP 5");
+ bundle.putInt(KEY_SECURITY, 1 /* WEP */);
+ accessPointList.add(new AccessPoint(mContext, bundle));
+
+ bundle.putString(KEY_SSID, "Test AP 6");
+ bundle.putInt(KEY_SECURITY, 1 /* WEP */);
accessPointList.add(new AccessPoint(mContext, bundle));
return accessPointList;
@@ -300,9 +288,13 @@ public class NetworkRequestDialogFragmentTest {
networkRequestDialogFragment.show(mActivity.getSupportFragmentManager(), /* tag */ null);
final AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog();
+
+ List accessPointList = createAccessPointList();
+ when(mWifiTracker.getAccessPoints()).thenReturn(accessPointList);
+
final String SSID_AP = "Test AP ";
final List scanResults = new ArrayList<>();
- for (int i = 0; i < 6 ; i ++) {
+ for (int i = 0; i < 7 ; i ++) {
ScanResult scanResult = new ScanResult();
scanResult.SSID = SSID_AP + i;
scanResult.capabilities = "WEP";
diff --git a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
index 22ccd3c2295..c811b0caf99 100644
--- a/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/WifiSettingsTest.java
@@ -69,6 +69,7 @@ public class WifiSettingsTest {
mWifiSettings = spy(new WifiSettings());
doReturn(mContext).when(mWifiSettings).getContext();
doReturn(mPowerManager).when(mContext).getSystemService(PowerManager.class);
+ mWifiSettings.mAddWifiNetworkPreference = new AddWifiNetworkPreference(mContext);
mWifiSettings.mSavedNetworksPreference = new Preference(mContext);
mWifiSettings.mConfigureWifiSettingsPreference = new Preference(mContext);
mWifiSettings.mWifiTracker = mWifiTracker;
@@ -151,4 +152,11 @@ public class WifiSettingsTest {
assertThat(mWifiSettings.mConfigureWifiSettingsPreference.getSummary()).isEqualTo(
mContext.getString(R.string.wifi_configure_settings_preference_summary_wakeup_off));
}
-}
\ No newline at end of file
+
+ @Test
+ public void checkAddWifiNetworkPrefernce_preferenceVisible() {
+ assertThat(mWifiSettings.mAddWifiNetworkPreference.isVisible()).isTrue();
+ assertThat(mWifiSettings.mAddWifiNetworkPreference.getTitle()).isEqualTo(
+ mContext.getString(R.string.wifi_add_network));
+ }
+}