From b795dcbcd19dfe94d9eb8b083e97b33147712682 Mon Sep 17 00:00:00 2001 From: cosmohsieh Date: Thu, 14 Mar 2019 18:29:55 +0800 Subject: [PATCH 01/14] [Network Connection] Implement new UI changing 1. Change title to multi-lines display 2. Add "SingleSpecifiedSSID" mode, will have connect button 3. Don't pop error dialog, if there is connection failure. Let user retry. 4. Hide progress icon if list item exists Bug: 128586511 Test: atest NetworkRequestDialogFragmentTest Change-Id: Icc560e4882fbcd941574e44690a27d5082a7c4c7 --- res/layout/network_request_dialog_title.xml | 4 +- .../wifi/NetworkRequestDialogFragment.java | 84 +++++++++++++++++-- .../NetworkRequestDialogFragmentTest.java | 46 +++++----- 3 files changed, 96 insertions(+), 38 deletions(-) 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 @@ 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/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"; From baf002d61a6bc87e62d8647199b6db0a125b46fe Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 15 Mar 2019 16:58:11 +0800 Subject: [PATCH 02/14] Fix Wi-Fi Easy Connect buttons UI defects 1. Apply attr/colorAccent to button icons for theme UI control 2. Apply attr/selectableItemBackground for button tapping ripple effect 3. Use ConstraintLayout to separate ssid EditText and scan button 4. Remove ButtonPreference and add AddNetworkPreference. ButtonPreference's naming and design look like a general purpose UI component but it's not. This change refactors the code. 5. In AddNetworkPreference, use settingslib layout file 'preference_access_point' to fix UI alignment problems. Bug: 126964552 Bug: 125434239 Bug: 126762937 Test: manual test atest com.android.settings.wifi.WifiSettingsTest Change-Id: Ib899a1e10f96bb8427ff00d6b5dfca37a0642c44 --- res/drawable/ic_qrcode_24dp.xml | 3 +- res/drawable/ic_scan_24dp.xml | 3 +- res/layout/wifi_button_preference_widget.xml | 3 +- res/layout/wifi_dialog.xml | 39 ++--- .../wifi/AddWifiNetworkPreference.java | 83 +++++++++++ .../settings/wifi/ButtonPreference.java | 135 ------------------ .../android/settings/wifi/WifiSettings.java | 23 +-- .../settings/wifi/ButtonPreferenceTest.java | 82 ----------- .../settings/wifi/WifiSettingsTest.java | 10 +- 9 files changed, 124 insertions(+), 257 deletions(-) create mode 100644 src/com/android/settings/wifi/AddWifiNetworkPreference.java delete mode 100644 src/com/android/settings/wifi/ButtonPreference.java delete mode 100644 tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java 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/wifi_button_preference_widget.xml b/res/layout/wifi_button_preference_widget.xml index 0999d209783..4b004e32b48 100644 --- a/res/layout/wifi_button_preference_widget.xml +++ b/res/layout/wifi_button_preference_widget.xml @@ -22,5 +22,4 @@ android:minWidth="@dimen/min_tap_target_size" android:minHeight="@dimen/min_tap_target_size" android:layout_gravity="center" - android:background="@null" - android:visibility="gone"/> + 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"/> - + { + 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/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 9e5bfc86fc1..7dd9163b56f 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -178,7 +178,8 @@ public class WifiSettings extends RestrictedSettingsFragment private PreferenceCategory mConnectedAccessPointPreferenceCategory; private PreferenceCategory mAccessPointsPreferenceCategory; - private ButtonPreference mAddPreference; + @VisibleForTesting + AddWifiNetworkPreference mAddWifiNetworkPreference; @VisibleForTesting Preference mConfigureWifiSettingsPreference; @VisibleForTesting @@ -236,20 +237,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()); } @@ -589,7 +578,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); @@ -808,8 +797,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/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/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)); + } +} From 7fb5e7575294e1e7918658886cb0c4cf97597b37 Mon Sep 17 00:00:00 2001 From: jackqdyulei Date: Wed, 13 Mar 2019 10:26:04 -0700 Subject: [PATCH 03/14] Make BT icon colorful Add new method to get rainbow bt icon and also refactor AdaptiveHomepageIcon: 1. Rename 2. Add ConstantState Bug: 126425211 Test: RunSettingsRoboTests Change-Id: Idb8aaf253d0d9e2ab33d8852f093e6689ebadde4 --- color-check-baseline.xml | 226 +++++++++++++++++- res/values/arrays.xml | 21 ++ res/values/colors.xml | 16 ++ .../BluetoothDetailsHeaderController.java | 7 +- .../bluetooth/BluetoothDevicePreference.java | 6 +- src/com/android/settings/bluetooth/Utils.java | 27 +++ .../DashboardFeatureProviderImpl.java | 6 +- .../slices/BluetoothDevicesSlice.java | 6 +- ...iveHomepageIcon.java => AdaptiveIcon.java} | 37 ++- ...ageIconTest.java => AdaptiveIconTest.java} | 35 ++- 10 files changed, 358 insertions(+), 29 deletions(-) rename src/com/android/settings/widget/{AdaptiveHomepageIcon.java => AdaptiveIcon.java} (76%) rename tests/robotests/src/com/android/settings/widget/{AdaptiveHomepageIconTest.java => AdaptiveIconTest.java} (80%) diff --git a/color-check-baseline.xml b/color-check-baseline.xml index 70744814dc2..e78bac61a6b 100644 --- a/color-check-baseline.xml +++ b/color-check-baseline.xml @@ -1309,6 +1309,230 @@ column="5"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 7e0ba105e29..521d709e318 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1378,4 +1378,25 @@ @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..2cebd28e617 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -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/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/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/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/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); + } } From cbd35ab0d5feaa29cc88c45df95f42d7dde2a370 Mon Sep 17 00:00:00 2001 From: Salvador Martinez Date: Tue, 19 Mar 2019 15:20:51 -0700 Subject: [PATCH 04/14] Fix sticky battery saver toggle It was persisting to settings secure instead of settings global. Test: robotests pass Bug: 128929858 Change-Id: I8c5bcc875d71096e70f1a70ec84e85d46c3abe43 --- .../batterysaver/BatterySaverStickyPreferenceController.java | 4 ++-- .../BatterySaverStickyPreferenceControllerTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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/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); } From b24514189a3b5d0dbae967a5535243a8f01d67d7 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 19 Mar 2019 15:45:11 -0700 Subject: [PATCH 05/14] Store the application context statically in FeatureFactory It stores the application context in a static class, and will be destoryed when application stops. Bug: 124701288 Test: robo Change-Id: I4678072f3f38ae682be6ba075c85e63c49f8febe --- .../android/settings/overlay/FeatureFactory.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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); From d0ceb83c95b2039982fee5a3da2bb12f493d2964 Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Tue, 19 Mar 2019 10:01:38 +0800 Subject: [PATCH 06/14] Improve UX of WifiDppChooseSavedWifiNetworkFragment In WifiDppChooseSavedWifiNetworkFragment, it does not show the saved Wi-Fi network which is not reachable, users may be confused about why their saved Wi-Fi network not on the list. This change shows saved networks regardless of signal reachable or not. Fix WifiDppChooseSavedWifiNetworkFragment UI overlap problem, remove redundant ScrollView and adjust ConstraintLayout parameters. Bug: 124129645 Test: manual test Change-Id: I86637e8722bb8f40a3b995a617dc1e22b2ae324a --- ...dpp_choose_saved_wifi_network_fragment.xml | 28 ++++----- .../wifi/dpp/WifiNetworkListFragment.java | 63 +++++++++---------- 2 files changed, 41 insertions(+), 50 deletions(-) diff --git a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml index ed288f06053..3606ccd17da 100644 --- a/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml +++ b/res/layout/wifi_dpp_choose_saved_wifi_network_fragment.xml @@ -22,28 +22,24 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + 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"/> - - - - - - - + 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); From f25830b9cc4ef30a5667270fc2534aeff266a9ee Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Mon, 18 Mar 2019 17:38:12 -0700 Subject: [PATCH 07/14] Update enrollment intro 1) Toggles resources between normal and accessibility enrollment 2) Add footer for more detail text Fixes: 127514618 Bug: 111548033 Test: Builds Change-Id: Ib0c47f04abc5ce9abbd8b27ef5782d1874379f16 --- res/drawable/face_enroll_introduction.xml | 31 +++++- .../ic_face_enroll_introduction_detail.xml | 30 ++++++ res/layout/face_enroll_introduction.xml | 99 +++++++++++++------ res/values/strings.xml | 4 +- .../face/FaceEnrollAccessibilityToggle.java | 9 ++ .../face/FaceEnrollIntroduction.java | 43 +++++++- 6 files changed, 174 insertions(+), 42 deletions(-) create mode 100644 res/drawable/ic_face_enroll_introduction_detail.xml 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/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" /> - - - - - + -