From 5aef897e9b106e192f8f8f49e2f10f1e408a5b2a Mon Sep 17 00:00:00 2001 From: Johnson Lu Date: Fri, 7 Dec 2018 11:56:49 +0800 Subject: [PATCH 1/6] Implement receiver flow of WiFi sharing feature 1.Add a button to launch QR code scanner when add a network. 2.Scan button added in AddNetworkFragment / WifiDialog / WifiSettings. Bug: 120630683 Test: make RunSettingsRoboTests Change-Id: I340bfa2247e092f586dd90dfea37c355e681ffee --- res/layout/wifi_button_preference_widget.xml | 25 ++++ res/layout/wifi_dialog.xml | 51 ++++++-- .../settings/wifi/AddNetworkFragment.java | 14 ++ .../settings/wifi/ButtonPreference.java | 123 ++++++++++++++++++ src/com/android/settings/wifi/WifiDialog.java | 16 ++- .../android/settings/wifi/WifiSettings.java | 13 +- .../settings/wifi/dpp/WifiDppUtils.java | 45 +++++++ .../settings/wifi/ButtonPreferenceTest.java | 82 ++++++++++++ 8 files changed, 356 insertions(+), 13 deletions(-) create mode 100644 res/layout/wifi_button_preference_widget.xml create mode 100644 src/com/android/settings/wifi/ButtonPreference.java create mode 100644 tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java diff --git a/res/layout/wifi_button_preference_widget.xml b/res/layout/wifi_button_preference_widget.xml new file mode 100644 index 00000000000..55078c28ecf --- /dev/null +++ b/res/layout/wifi_button_preference_widget.xml @@ -0,0 +1,25 @@ + + + + diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml index bb2946d9202..2a395b677c4 100644 --- a/res/layout/wifi_dialog.xml +++ b/res/layout/wifi_dialog.xml @@ -50,13 +50,28 @@ android:text="@string/wifi_ssid" android:textDirection="locale" /> - + + + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:layout_margin="5dp" + android:background="@null" + android:src="@drawable/ic_qrcode_24dp" + android:visibility="gone" + android:contentDescription="@string/wifi_add_network" /> + - + + + + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:layout_margin="5dp" + android:background="@null" + android:src="@drawable/ic_qrcode_24dp" + android:visibility="gone" + android:contentDescription="@string/wifi_add_network" /> + { + // Launch QR code scanner to join a network. + getContext().startActivity( + WifiDppUtils.getConfiguratorQRCodeScannerIntent(/* ssid */ null)); + }); + } + } + return rootView; } diff --git a/src/com/android/settings/wifi/ButtonPreference.java b/src/com/android/settings/wifi/ButtonPreference.java new file mode 100644 index 00000000000..62e8caf1e20 --- /dev/null +++ b/src/com/android/settings/wifi/ButtonPreference.java @@ -0,0 +1,123 @@ +/* + * 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 com.android.settings.R; + +import androidx.annotation.VisibleForTesting; +import androidx.annotation.DrawableRes; +import androidx.preference.Preference; +import androidx.preference.PreferenceViewHolder; + +/** + * 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; + + // 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; + } + + 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); + } + setButtonVisibility(); + } + + private void setButtonVisibility() { + if(mImageButton != null) { + mImageButton.setVisibility(mButtonIcon == null ? View.GONE : View.VISIBLE); + } + } + + /** + * Sets the drawable to be displayed in button. + */ + public ButtonPreference setButtonIcon(@DrawableRes int iconResId) { + if (iconResId == 0) { + return this; + } + + try { + mButtonIcon = getContext().getDrawable(iconResId); + notifyChanged(); + } catch (Resources.NotFoundException exception) { + Log.e(TAG, "Resource does not exist: " + iconResId); + } + return this; + } + + /** + * Register a callback to be invoked when button is clicked. + */ + public ButtonPreference setButtonOnClickListener(View.OnClickListener listener) { + if (listener != mClickListener) { + mClickListener = listener; + notifyChanged(); + } + return this; + } +} diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java index 2b8fb2d3236..0e2ca608b5b 100644 --- a/src/com/android/settings/wifi/WifiDialog.java +++ b/src/com/android/settings/wifi/WifiDialog.java @@ -21,10 +21,13 @@ import android.content.DialogInterface; import android.os.Bundle; import android.view.View; import android.widget.Button; +import android.widget.ImageButton; import androidx.appcompat.app.AlertDialog; import com.android.settings.R; +import com.android.settings.wifi.dpp.WifiDppUtils; + import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.wifi.AccessPoint; @@ -77,7 +80,18 @@ public class WifiDialog extends AlertDialog implements WifiConfigUiBase, @Override protected void onCreate(Bundle savedInstanceState) { - mView = getLayoutInflater().inflate(R.layout.wifi_dialog, null); + mView = getLayoutInflater().inflate(R.layout.wifi_dialog, /* root */ null); + if (WifiDppUtils.isSharingNetworkEnabled(getContext())) { + final ImageButton scannerButton = mView.findViewById(R.id.password_scanner_button); + if (scannerButton != null) { + scannerButton.setVisibility(View.VISIBLE); + scannerButton.setOnClickListener((View v) -> { + // Launch QR code scanner to join a network. + getContext().startActivity( + WifiDppUtils.getConfiguratorQRCodeScannerIntent(/* ssid */ null)); + }); + } + } setView(mView); mController = new WifiConfigController(this, mView, mAccessPoint, mMode); super.onCreate(savedInstanceState); diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 1c9a5e136c0..54de28d9de4 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -66,6 +66,7 @@ import com.android.settings.search.SearchIndexableRaw; import com.android.settings.widget.SummaryUpdater.OnSummaryChangeListener; import com.android.settings.widget.SwitchBarController; import com.android.settings.wifi.details.WifiNetworkDetailsFragment; +import com.android.settings.wifi.dpp.WifiDppUtils; import com.android.settingslib.RestrictedLockUtils; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.search.SearchIndexable; @@ -175,7 +176,7 @@ public class WifiSettings extends RestrictedSettingsFragment private PreferenceCategory mConnectedAccessPointPreferenceCategory; private PreferenceCategory mAccessPointsPreferenceCategory; - private Preference mAddPreference; + private ButtonPreference mAddPreference; @VisibleForTesting Preference mConfigureWifiSettingsPreference; @VisibleForTesting @@ -235,9 +236,17 @@ public class WifiSettings extends RestrictedSettingsFragment mSavedNetworksPreference = findPreference(PREF_KEY_SAVED_NETWORKS); Context prefContext = getPrefContext(); - mAddPreference = new Preference(prefContext); + mAddPreference = new ButtonPreference(prefContext); mAddPreference.setIcon(R.drawable.ic_menu_add); mAddPreference.setTitle(R.string.wifi_add_network); + if (WifiDppUtils.isSharingNetworkEnabled(getContext())) { + mAddPreference.setButtonIcon(R.drawable.ic_qrcode_24dp); + mAddPreference.setButtonOnClickListener((View v) -> { + // Launch QR code scanner to join a network. + getContext().startActivity( + WifiDppUtils.getConfiguratorQRCodeScannerIntent(/* ssid */ null)); + }); + } mStatusMessagePreference = (LinkablePreference) findPreference(PREF_KEY_STATUS_MESSAGE); mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager()); diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java index 70ef3a84a39..ae144bad32a 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java +++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java @@ -16,7 +16,10 @@ package com.android.settings.wifi.dpp; +import android.content.Context; import android.content.Intent; +import android.text.TextUtils; +import android.util.FeatureFlagUtils; /** * Here are the items shared by both WifiDppConfiguratorActivity & WifiDppEnrolleeActivity @@ -54,4 +57,46 @@ public class WifiDppUtils { * H true Optional. True if the network SSID is hidden. */ public static final String EXTRA_QR_CODE = "qrCode"; + + /** + * Returns whether the user can share the network represented by this preference with QR code. + */ + public static boolean isSharingNetworkEnabled(Context context) { + return FeatureFlagUtils.isEnabled(context, + com.android.settings.core.FeatureFlags.WIFI_SHARING); + } + + /** + * Returns an intent to launch QR code scanner. + * + * @param ssid The data corresponding to {@code WifiConfiguration} SSID + * @return Intent for launching QR code scanner + */ + public static Intent getConfiguratorQRCodeScannerIntent(String ssid) { + final Intent intent = new Intent( + WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_SCANNER); + if (!TextUtils.isEmpty(ssid)) { + intent.putExtra(EXTRA_WIFI_SSID, ssid); + } + return intent; + } + + /** + * Returns an intent to launch QR code generator. + * + * @param ssid The data corresponding to {@code WifiConfiguration} SSID + * @param Security The data is from {@code AccessPoint.securityToString} + * @return Intent for launching QR code generator + */ + public static Intent getConfiguratorQRCodeGeneratorIntent(String ssid, String Security) { + final Intent intent = new Intent( + WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR); + if (!TextUtils.isEmpty(ssid)) { + intent.putExtra(EXTRA_WIFI_SSID, ssid); + } + if (!TextUtils.isEmpty(Security)) { + intent.putExtra(EXTRA_WIFI_SECURITY, Security); + } + return intent; + } } diff --git a/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java b/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java new file mode 100644 index 00000000000..3dc109f9078 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/ButtonPreferenceTest.java @@ -0,0 +1,82 @@ +/* + * 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 com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import androidx.preference.PreferenceViewHolder; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; + +@RunWith(SettingsRobolectricTestRunner.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(); + } +} From 4ab0d168e2da6bcfbcf98226cc5ab23cae49157c Mon Sep 17 00:00:00 2001 From: Arc Wang Date: Fri, 7 Dec 2018 16:00:18 +0800 Subject: [PATCH 2/6] Implement Wi-Fi DPP UI. Add WifiDppEnrolleeActivity Remove bottom buttons of WifiDppQrCodeScannerFragment Add ActionBar in WifiDppQrCodeScannerFragment & WifiDppQrCodeGeneratorFragment Bug: 118797380 Bug: 118794858 Test: atest WifiDppConfiguratorActivityTest atest WifiDppQrCodeScannerFragmentTest atest WifiDppQrCodeGeneratorFragmentTest atest atest RunSettingsRoboTests Change-Id: I1d464dc9a8d54a896b8e0c9185a74bed7b193b60 --- AndroidManifest.xml | 8 ++ .../wifi_dpp_qrcode_scanner_fragment.xml | 3 - res/values/strings.xml | 8 ++ .../wifi/dpp/WifiDppConfiguratorActivity.java | 123 +++++++++++++----- .../wifi/dpp/WifiDppEnrolleeActivity.java | 106 +++++++++++++++ .../wifi/dpp/WifiDppQrCodeBaseFragment.java | 28 ++-- .../dpp/WifiDppQrCodeGeneratorFragment.java | 63 ++++++++- .../dpp/WifiDppQrCodeScannerFragment.java | 74 +++++++++-- .../settings/wifi/dpp/WifiDppUtils.java | 21 +++ .../dpp/WifiDppConfiguratorActivityTest.java | 8 ++ .../WifiDppQrCodeGeneratorFragmentTest.java | 54 ++++++++ .../dpp/WifiDppQrCodeScannerFragmentTest.java | 6 - 12 files changed, 427 insertions(+), 75 deletions(-) create mode 100644 src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java create mode 100644 tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7807f0e07d9..caca44439cc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3054,6 +3054,14 @@ + + + + + + + diff --git a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml index ab38ac106a0..0beacff9027 100644 --- a/res/layout/wifi_dpp_qrcode_scanner_fragment.xml +++ b/res/layout/wifi_dpp_qrcode_scanner_fragment.xml @@ -44,8 +44,5 @@ android:layout_height="wrap_content" android:layout_gravity="center"/> - - diff --git a/res/values/strings.xml b/res/values/strings.xml index cbb5e3be3ad..6ab65664be0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2054,6 +2054,14 @@ Add a device to this network Center the device\u2019s QR code below to add device to \u201c%1$s\u201d + + Scan QR code + + Join \u201c%1$s\u201d by scanning a QR code + + Share Wi\u2011Fi + + Scan this QR code with another device to join \u201c%1$s\u201d Share with other device users diff --git a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java index d81c19b8579..e4ae292d998 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java +++ b/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivity.java @@ -31,8 +31,26 @@ import com.android.internal.logging.nano.MetricsProto; import com.android.settings.core.InstrumentedActivity; import com.android.settings.R; +/** + * To provision "other" device with specified Wi-Fi network. + * + * Uses different intents to specify different provisioning ways. + * + * For intent action {@code ACTION_CONFIGURATOR_QR_CODE_SCANNER} and + * {@code android.settings.WIFI_DPP_CONFIGURATOR_QR_CODE_GENERATOR}, specify the Wi-Fi network to be + * provisioned in: + * + * {@code WifiDppUtils.EXTRA_WIFI_SECURITY} + * {@code WifiDppUtils.EXTRA_WIFI_SSID} + * {@code WifiDppUtils.EXTRA_WIFI_PRE_SHARED_KEY} + * {@code WifiDppUtils.EXTRA_WIFI_HIDDEN_SSID} + * + * For intent action {@code ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK}, specify Wi-Fi (DPP) + * QR code in {@code WifiDppUtils.EXTRA_QR_CODE} + */ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements - WifiNetworkConfig.Retriever { + WifiNetworkConfig.Retriever, + WifiDppQrCodeGeneratorFragment.OnQrCodeGeneratorFragmentAddButtonClickedListener { private static final String TAG = "WifiDppConfiguratorActivity"; public static final String ACTION_CONFIGURATOR_QR_CODE_SCANNER = @@ -43,7 +61,6 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements "android.settings.WIFI_DPP_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK"; private FragmentManager mFragmentManager; - private FragmentTransaction mFragmentTransaction; /** The Wi-Fi network which will be configured */ private WifiNetworkConfig mWifiNetworkConfig; @@ -57,12 +74,20 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.wifi_dpp_activity); - mFragmentManager = getSupportFragmentManager(); - mFragmentTransaction = getSupportFragmentManager().beginTransaction(); - Intent intent = getIntent(); + handleIntent(getIntent()); + + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setElevation(0); + actionBar.setDisplayShowTitleEnabled(false); + } + } + + private void handleIntent(Intent intent) { boolean cancelActivity = false; WifiNetworkConfig config; switch (intent.getAction()) { @@ -72,7 +97,7 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements cancelActivity = true; } else { mWifiNetworkConfig = config; - addQrCodeScannerFragment(/* addToBackStack= */ false); + showQrCodeScannerFragment(/* addToBackStack= */ false); } break; case ACTION_CONFIGURATOR_QR_CODE_GENERATOR: @@ -81,11 +106,11 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements cancelActivity = true; } else { mWifiNetworkConfig = config; - addQrCodeGeneratorFragment(); + showQrCodeGeneratorFragment(); } break; case ACTION_CONFIGURATOR_CHOOSE_SAVED_WIFI_NETWORK: - addChooseSavedWifiNetworkFragment(/* addToBackStack */ false); + showChooseSavedWifiNetworkFragment(/* addToBackStack */ false); break; default: cancelActivity = true; @@ -98,45 +123,55 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements } } - private void addQrCodeScannerFragment(boolean addToBackStack) { - WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment(); - mFragmentTransaction.add(R.id.fragment_container, fragment); - if (addToBackStack) { - mFragmentTransaction.addToBackStack(/* name */ null); + private void showQrCodeScannerFragment(boolean addToBackStack) { + // Avoid to replace the same fragment during configuration change + if (mFragmentManager.findFragmentByTag(WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER) != null) { + return; } - mFragmentTransaction.commit(); + + WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment(); + FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); + + fragmentTransaction.replace(R.id.fragment_container, fragment, + WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER); + if (addToBackStack) { + fragmentTransaction.addToBackStack(/* name */ null); + } + fragmentTransaction.commit(); } - private void addQrCodeGeneratorFragment() { + private void showQrCodeGeneratorFragment() { + // Avoid to replace the same fragment during configuration change + if (mFragmentManager.findFragmentByTag( + WifiDppUtils.TAG_FRAGMENT_QR_CODE_GENERATOR) != null) { + return; + } + WifiDppQrCodeGeneratorFragment fragment = new WifiDppQrCodeGeneratorFragment(); - mFragmentTransaction.add(R.id.fragment_container, fragment); - mFragmentTransaction.commit(); + FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); + + fragmentTransaction.replace(R.id.fragment_container, fragment, + WifiDppUtils.TAG_FRAGMENT_QR_CODE_GENERATOR); + fragmentTransaction.commit(); } - private void addChooseSavedWifiNetworkFragment(boolean addToBackStack) { - ActionBar action = getActionBar(); - if (action != null) { - action.hide(); + private void showChooseSavedWifiNetworkFragment(boolean addToBackStack) { + // Avoid to replace the same fragment during configuration change + if (mFragmentManager.findFragmentByTag( + WifiDppUtils.TAG_FRAGMENT_CHOOSE_SAVED_WIFI_NETWORK) != null) { + return; } WifiDppChooseSavedWifiNetworkFragment fragment = new WifiDppChooseSavedWifiNetworkFragment(); - mFragmentTransaction.add(R.id.fragment_container, fragment); + FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); + + fragmentTransaction.replace(R.id.fragment_container, fragment, + WifiDppUtils.TAG_FRAGMENT_CHOOSE_SAVED_WIFI_NETWORK); if (addToBackStack) { - mFragmentTransaction.addToBackStack(/* name */ null); + fragmentTransaction.addToBackStack(/* name */ null); } - mFragmentTransaction.commit(); - } - - @Override - protected void onStop() { - Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container); - if (fragment != null) { - // Remove it to prevent stacking multiple fragments after screen rotated. - mFragmentManager.beginTransaction().remove(fragment).commit(); - } - - super.onStop(); + fragmentTransaction.commit(); } @Override @@ -153,4 +188,22 @@ public class WifiDppConfiguratorActivity extends InstrumentedActivity implements return true; } } + + @Override + public boolean onNavigateUp(){ + Fragment fragment = mFragmentManager.findFragmentById(R.id.fragment_container); + if (fragment instanceof WifiDppQrCodeGeneratorFragment) { + setResult(Activity.RESULT_CANCELED); + finish(); + return true; + } else if (fragment instanceof WifiDppQrCodeScannerFragment) { + mFragmentManager.popBackStackImmediate(); + } + + return false; + } + + @Override public void onQrCodeGeneratorFragmentAddButtonClicked() { + showQrCodeScannerFragment(/* addToBackStack */ true); + } } diff --git a/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java new file mode 100644 index 00000000000..7c58fd577be --- /dev/null +++ b/src/com/android/settings/wifi/dpp/WifiDppEnrolleeActivity.java @@ -0,0 +1,106 @@ +/* + * 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.dpp; + +import android.app.ActionBar; +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; + +import com.android.internal.logging.nano.MetricsProto; + +import com.android.settings.core.InstrumentedActivity; +import com.android.settings.R; + +/** + * To provision "this" device with specified Wi-Fi network. + * + * To use intent action {@code ACTION_ENROLLEE_QR_CODE_SCANNER}, specify the SSID string of the + * Wi-Fi network to be provisioned in {@code WifiDppUtils.EXTRA_QR_CODE}. + */ +public class WifiDppEnrolleeActivity extends InstrumentedActivity { + private static final String TAG = "WifiDppEnrolleeActivity"; + + public static final String ACTION_ENROLLEE_QR_CODE_SCANNER = + "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"; + + private FragmentManager mFragmentManager; + + @Override + public int getMetricsCategory() { + //TODO:Should we use a new metrics category for Wi-Fi DPP? + return MetricsProto.MetricsEvent.WIFI_NETWORK_DETAILS; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.wifi_dpp_activity); + mFragmentManager = getSupportFragmentManager(); + + handleIntent(getIntent()); + + ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setElevation(0); + actionBar.setDisplayShowTitleEnabled(false); + } + } + + private void handleIntent(Intent intent) { + switch (intent.getAction()) { + case ACTION_ENROLLEE_QR_CODE_SCANNER: + String ssid = intent.getStringExtra(WifiDppUtils.EXTRA_WIFI_SSID); + showQrCodeScannerFragment(/* addToBackStack */ false, ssid); + break; + default: + Log.e(TAG, "Launch with an invalid action"); + setResult(Activity.RESULT_CANCELED); + finish(); + } + } + + private void showQrCodeScannerFragment(boolean addToBackStack, String ssid) { + // Avoid to replace the same fragment during configuration change + if (mFragmentManager.findFragmentByTag(WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER) != null) { + return; + } + + WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment(ssid); + FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); + + fragmentTransaction.replace(R.id.fragment_container, fragment, + WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER); + if (addToBackStack) { + fragmentTransaction.addToBackStack(/* name */ null); + } + fragmentTransaction.commit(); + } + + @Override + public boolean onNavigateUp(){ + setResult(Activity.RESULT_CANCELED); + finish(); + return true; + } +} diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java index c86fc989e34..cddd55cdd40 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeBaseFragment.java @@ -33,6 +33,10 @@ import com.android.settings.core.InstrumentedFragment; import com.android.settings.wifi.qrcode.QrDecorateView; import com.android.settings.R; +/** + * TODO: Should refine code to only initiate UI component in each child fragment. + */ + /** * There are below 4 fragments for Wi-Fi DPP UI flow, to reduce redundant code of UI components, * this parent fragment instantiates all UI components and provides setting APIs for them. @@ -58,11 +62,9 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { private ImageView mWifiApPictureView; //optional, for WifiDppAddDeviceFragment private TextView mChooseDifferentNetwork;//optional, for WifiDppAddDeviceFragment - private Button mButtonLeft; //optional, for WifiDppQrCodeScannerFragment, - // WifiDppChooseSavedWifiNetworkFragment, + private Button mButtonLeft; //optional, for WifiDppChooseSavedWifiNetworkFragment, // WifiDppAddDeviceFragment - private Button mButtonRight; //optional, for WifiDppQrCodeScannerFragment, - // WifiDppChooseSavedWifiNetworkFragment, + private Button mButtonRight; //optional, for WifiDppChooseSavedWifiNetworkFragment, // WifiDppAddDeviceFragment abstract protected int getLayout(); @@ -122,8 +124,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void setLeftButtonText(String text) { @@ -133,8 +134,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void setRightButtonText(String text) { @@ -144,8 +144,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void hideLeftButton() { @@ -155,8 +154,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void hideRightButton() { @@ -166,8 +164,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void setLeftButtonOnClickListener(View.OnClickListener listener) { @@ -177,8 +174,7 @@ public abstract class WifiDppQrCodeBaseFragment extends InstrumentedFragment { } /** - * optional, for WifiDppQrCodeScannerFragment, - * WifiDppChooseSavedWifiNetworkFragment, + * optional, for WifiDppChooseSavedWifiNetworkFragment, * WifiDppAddDeviceFragment */ protected void setRightButtonOnClickListener(View.OnClickListener listener) { diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java index 9935bf2d7fe..b064253f315 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java @@ -16,7 +16,12 @@ package com.android.settings.wifi.dpp; +import android.app.ActionBar; +import android.content.Context; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import com.android.settings.R; @@ -30,8 +35,64 @@ public class WifiDppQrCodeGeneratorFragment extends WifiDppQrCodeBaseFragment { return R.layout.wifi_dpp_qrcode_generator_fragment; } + // Container Activity must implement this interface + public interface OnQrCodeGeneratorFragmentAddButtonClickedListener { + public void onQrCodeGeneratorFragmentAddButtonClicked(); + } + OnQrCodeGeneratorFragmentAddButtonClickedListener mListener; + @Override - public void onActivityCreated (Bundle savedInstanceState) { + public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); + + WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity()) + .getWifiNetworkConfig(); + if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) { + throw new IllegalArgumentException("Invalid Wi-Fi network for configuring"); + } + setTitle(getString(R.string.wifi_dpp_share_wifi)); + setDescription(getString(R.string.wifi_dpp_scan_qr_code_with_another_device, + wifiNetworkConfig.getSsid())); + + setHasOptionsMenu(true); + ActionBar actionBar = getActivity().getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.show(); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + + mListener = (OnQrCodeGeneratorFragmentAddButtonClickedListener) context; + } + + @Override + public void onDetach() { + mListener = null; + + super.onDetach(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + MenuItem item = menu.add(0, Menu.FIRST, 0, R.string.next_label); + item.setIcon(R.drawable.ic_menu_add); + item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); + + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem menuItem) { + switch (menuItem.getItemId()) { + case Menu.FIRST: + mListener.onQrCodeGeneratorFragmentAddButtonClicked(); + return true; + default: + return super.onOptionsItemSelected(menuItem); + } } } diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java index 70dade508ce..5689c56ddad 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java +++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragment.java @@ -17,12 +17,15 @@ package com.android.settings.wifi.dpp; import android.annotation.Nullable; +import android.app.ActionBar; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.graphics.Rect; import android.os.Bundle; -import android.text.TextUtils; import android.util.Size; +import android.view.Menu; +import android.view.MenuInflater; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; @@ -38,32 +41,60 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl private SurfaceView mSurfaceView; private QrDecorateView mDecorateView; + /** true if the fragment working for configurator, false enrollee*/ + private final boolean mConfiguratorMode; + + /** The SSID of the Wi-Fi network which the user specify to enroll */ + private String mSsid; + @Override protected int getLayout() { return R.layout.wifi_dpp_qrcode_scanner_fragment; } + /** + * Configurator container activity of the fragment should create instance with this constructor. + */ + public WifiDppQrCodeScannerFragment() { + super(); + + mConfiguratorMode = true; + } + + /** + * Enrollee container activity of the fragment should create instance with this constructor and + * specify the SSID string of the WI-Fi network to be provisioned. + */ + public WifiDppQrCodeScannerFragment(String ssid) { + super(); + + mConfiguratorMode = false; + mSsid = ssid; + } + @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - setTitle(getString(R.string.wifi_dpp_add_device_to_network)); + if (mConfiguratorMode) { + setTitle(getString(R.string.wifi_dpp_add_device_to_network)); - WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity()) + WifiNetworkConfig wifiNetworkConfig = ((WifiNetworkConfig.Retriever) getActivity()) .getWifiNetworkConfig(); - if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) { - throw new IllegalArgumentException("Invalid Wi-Fi network for configuring"); + if (!WifiNetworkConfig.isValidConfig(wifiNetworkConfig)) { + throw new IllegalArgumentException("Invalid Wi-Fi network for configuring"); + } + setDescription(getString(R.string.wifi_dpp_center_qr_code, wifiNetworkConfig.getSsid())); + } else { + setTitle(getString(R.string.wifi_dpp_scan_qr_code)); + setDescription(getString(R.string.wifi_dpp_scan_qr_code_join_network, mSsid)); } - setDescription(getString(R.string.wifi_dpp_center_qr_code, wifiNetworkConfig.getSsid())); - hideRightButton(); - - setLeftButtonText(getString(android.R.string.cancel)); - - setLeftButtonOnClickListener((view) -> { - getActivity().setResult(Activity.RESULT_CANCELED); - getActivity().finish(); - }); + ActionBar actionBar = getActivity().getActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.show(); + } } @Override @@ -78,6 +109,21 @@ public class WifiDppQrCodeScannerFragment extends WifiDppQrCodeBaseFragment impl mDecorateView = (QrDecorateView) view.findViewById(R.id.decorate_view); } + @Override + public void onDestroyView() { + SurfaceHolder surfaceHolder = mSurfaceView.getHolder(); + surfaceHolder.removeCallback(this); + + super.onDestroyView(); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + menu.removeItem(Menu.FIRST); + + super.onCreateOptionsMenu(menu, inflater); + } + @Override public void surfaceCreated(final SurfaceHolder holder) { initCamera(holder); diff --git a/src/com/android/settings/wifi/dpp/WifiDppUtils.java b/src/com/android/settings/wifi/dpp/WifiDppUtils.java index 70ef3a84a39..8d4017144ea 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java +++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java @@ -22,6 +22,27 @@ import android.content.Intent; * Here are the items shared by both WifiDppConfiguratorActivity & WifiDppEnrolleeActivity */ public class WifiDppUtils { + /** + * The fragment tag specified to FragmentManager for container activities to manage fragments. + */ + public static final String TAG_FRAGMENT_QR_CODE_SCANNER = "qr_code_scanner_fragment"; + + /** + * @see #TAG_FRAGMENT_QR_CODE_SCANNER + */ + public static final String TAG_FRAGMENT_QR_CODE_GENERATOR = "qr_code_generator_fragment"; + + /** + * @see #TAG_FRAGMENT_QR_CODE_SCANNER + */ + public static final String TAG_FRAGMENT_CHOOSE_SAVED_WIFI_NETWORK = + "choose_saved_wifi_network_fragment"; + + /** + * @see #TAG_FRAGMENT_QR_CODE_SCANNER + */ + public static final String TAG_FRAGMENT_ADD_DEVICE = "add_device_fragment"; + /** The data is from {@code com.android.settingslib.wifi.AccessPoint.securityToString} */ public static final String EXTRA_WIFI_SECURITY = "security"; diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java index 70e958748c9..2f95fa50bad 100644 --- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppConfiguratorActivityTest.java @@ -73,4 +73,12 @@ public class WifiDppConfiguratorActivityTest { assertThat(activity instanceof WifiNetworkConfig.Retriever).isEqualTo(true); } + + @Test + public void testActivity_shouldImplementsQrCodeGeneratorFragmentCallback() { + WifiDppConfiguratorActivity activity = mActivityRule.getActivity(); + + assertThat(activity instanceof WifiDppQrCodeGeneratorFragment + .OnQrCodeGeneratorFragmentAddButtonClickedListener).isEqualTo(true); + } } diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java new file mode 100644 index 00000000000..d3f667f489f --- /dev/null +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java @@ -0,0 +1,54 @@ +/* + * 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.dpp; + +import android.app.Activity; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; + +import com.android.settings.R; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class WifiDppQrCodeGeneratorFragmentTest { + @Rule + public final ActivityTestRule mActivityRule = + new ActivityTestRule<>(WifiDppConfiguratorActivity.class, true); + + @Before + public void setUp() { + Intent intent = + new Intent(WifiDppConfiguratorActivity.ACTION_CONFIGURATOR_QR_CODE_GENERATOR); + intent.putExtra(WifiDppUtils.EXTRA_WIFI_SECURITY, "WEP"); + intent.putExtra(WifiDppUtils.EXTRA_WIFI_SSID, "GoogleGuest"); + mActivityRule.launchActivity(intent); + } + + @Test + public void rotateScreen_shouldNotCrash() { + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); + mActivityRule.getActivity().setRequestedOrientation( + ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); + } +} diff --git a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java index 98742eda75f..70cfc2d9fcc 100644 --- a/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java +++ b/tests/unit/src/com/android/settings/wifi/dpp/WifiDppQrCodeScannerFragmentTest.java @@ -16,12 +16,6 @@ package com.android.settings.wifi.dpp; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static android.support.test.espresso.Espresso.onView; - -import static com.google.common.truth.Truth.assertThat; - import android.app.Activity; import android.content.Intent; import android.content.pm.ActivityInfo; From c1f8600d9ffd399fbf6bc630ee35815a392727b9 Mon Sep 17 00:00:00 2001 From: Pasty Chang Date: Tue, 11 Dec 2018 02:22:55 +0000 Subject: [PATCH 3/6] Change to use setupcompat and setupdesign for suw pages 1. remove the dependence of setupwizardlib. 2. add to use setupcompat and setupdesign. 3. modify new footer button in following up cl. Bug: 120805516 Bug: 120872944 Test: RunSettingsRoboTests Change-Id: I463dd35b799d4250b2aabce0cb0b8102cf9dd7d6 --- Android.mk | 3 ++- res/layout-land/choose_lock_pattern.xml | 8 ++++---- .../confirm_lock_pattern_normal.xml | 8 ++++---- .../fingerprint_enroll_enrolling.xml | 8 ++++---- .../fingerprint_enroll_find_sensor.xml | 4 ++-- res/layout-land/fingerprint_enroll_finish.xml | 12 +++++------ res/layout/choose_lock_password.xml | 6 +++--- res/layout/choose_lock_pattern_common.xml | 10 +++++----- .../choose_lock_pattern_common_footer.xml | 4 ++-- res/layout/confirm_lock_password_normal.xml | 4 ++-- .../confirm_lock_pattern_normal_base.xml | 8 ++++---- res/layout/encryption_interstitial.xml | 6 +++--- res/layout/face_enroll_enrolling.xml | 6 +++--- res/layout/face_enroll_finish.xml | 10 +++++----- res/layout/face_enroll_finish_footer.xml | 4 ++-- res/layout/face_enroll_introduction.xml | 14 ++++++------- .../face_enroll_introduction_footer.xml | 4 ++-- .../fingerprint_enroll_enrolling_base.xml | 10 +++++----- .../fingerprint_enroll_find_sensor_base.xml | 6 +++--- res/layout/fingerprint_enroll_finish_base.xml | 10 +++++----- .../fingerprint_enroll_finish_base_footer.xml | 4 ++-- .../fingerprint_enroll_introduction.xml | 14 ++++++------- ...fingerprint_enroll_introduction_footer.xml | 4 ++-- res/layout/master_clear.xml | 4 ++-- res/layout/master_clear_confirm.xml | 4 ++-- res/layout/redaction_interstitial.xml | 6 +++--- res/layout/setup_preference.xml | 2 +- res/layout/storage_wizard_generic.xml | 6 +++--- res/layout/storage_wizard_init.xml | 6 +++--- res/layout/storage_wizard_progress.xml | 6 +++--- res/layout/storage_wizard_ready.xml | 6 +++--- .../settings/EncryptionInterstitial.java | 3 ++- src/com/android/settings/MasterClear.java | 5 +++-- .../android/settings/MasterClearConfirm.java | 5 +++-- .../android/settings/SetupWizardUtils.java | 16 ++++++++------- .../biometrics/BiometricEnrollBase.java | 3 ++- .../BiometricEnrollIntroduction.java | 3 ++- .../face/FaceEnrollIntroduction.java | 3 ++- .../FingerprintEnrollIntroduction.java | 3 ++- .../deviceinfo/StorageWizardBase.java | 3 ++- .../settings/password/ChooseLockPassword.java | 3 ++- .../settings/password/ChooseLockPattern.java | 2 +- .../password/ChooseLockSettingsHelper.java | 3 ++- .../ChooseLockTypeDialogFragment.java | 3 ++- .../password/SetupChooseLockGeneric.java | 3 ++- .../utils/SettingsDividerItemDecoration.java | 2 +- .../settings/wifi/WifiDialogActivity.java | 3 ++- .../fingerprint_enroll_find_sensor.xml | 6 +++--- .../settings/SetupWizardUtilsTest.java | 12 ++++++----- .../password/ChooseLockPasswordTest.java | 3 ++- .../password/ChooseLockPatternTest.java | 3 ++- .../ChooseLockSettingsHelperTest.java | 8 +++++--- .../SettingsRobolectricTestRunner.java | 20 +++++++++---------- 53 files changed, 171 insertions(+), 151 deletions(-) diff --git a/Android.mk b/Android.mk index 04749bfa45f..7eb9b6ac071 100644 --- a/Android.mk +++ b/Android.mk @@ -30,6 +30,8 @@ LOCAL_STATIC_ANDROID_LIBRARIES := \ androidx.preference_preference \ androidx.recyclerview_recyclerview \ com.google.android.material_material \ + setupcompat \ + setupdesign LOCAL_JAVA_LIBRARIES := \ telephony-common \ @@ -53,7 +55,6 @@ ifneq ($(INCREMENTAL_BUILDS),) LOCAL_JACK_FLAGS := --multi-dex native endif -include frameworks/opt/setupwizard/library/common-gingerbread.mk include frameworks/base/packages/SettingsLib/common.mk include frameworks/base/packages/SettingsLib/search/common.mk diff --git a/res/layout-land/choose_lock_pattern.xml b/res/layout-land/choose_lock_pattern.xml index 4d6f798c39c..25230cbc714 100644 --- a/res/layout-land/choose_lock_pattern.xml +++ b/res/layout-land/choose_lock_pattern.xml @@ -15,7 +15,7 @@ limitations under the License. --> - - - + - + diff --git a/res/layout-land/confirm_lock_pattern_normal.xml b/res/layout-land/confirm_lock_pattern_normal.xml index 158d3437faf..23e5d6618a1 100644 --- a/res/layout-land/confirm_lock_pattern_normal.xml +++ b/res/layout-land/confirm_lock_pattern_normal.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - + - + diff --git a/res/layout-land/fingerprint_enroll_enrolling.xml b/res/layout-land/fingerprint_enroll_enrolling.xml index 8b902f17f8b..eb326023f76 100644 --- a/res/layout-land/fingerprint_enroll_enrolling.xml +++ b/res/layout-land/fingerprint_enroll_enrolling.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - - - + - + diff --git a/res/layout-land/fingerprint_enroll_find_sensor.xml b/res/layout-land/fingerprint_enroll_find_sensor.xml index 8712ad70e34..e6a2e66feac 100644 --- a/res/layout-land/fingerprint_enroll_find_sensor.xml +++ b/res/layout-land/fingerprint_enroll_find_sensor.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - - + diff --git a/res/layout-land/fingerprint_enroll_finish.xml b/res/layout-land/fingerprint_enroll_finish.xml index 04ed5403f19..1187c208d39 100644 --- a/res/layout-land/fingerprint_enroll_finish.xml +++ b/res/layout-land/fingerprint_enroll_finish.xml @@ -15,7 +15,7 @@ ~ limitations under the License --> - - - + - @@ -120,8 +120,8 @@ android:contentDescription="@android:string/fingerprint_icon_content_description" android:src="@drawable/fingerprint_enroll_finish" /> - + - + diff --git a/res/layout/choose_lock_password.xml b/res/layout/choose_lock_password.xml index cea3e128c90..1962ee0befe 100644 --- a/res/layout/choose_lock_password.xml +++ b/res/layout/choose_lock_password.xml @@ -14,14 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + diff --git a/res/layout/choose_lock_pattern_common.xml b/res/layout/choose_lock_pattern_common.xml index 77dd12d6dbc..df7fd8c48dd 100644 --- a/res/layout/choose_lock_pattern_common.xml +++ b/res/layout/choose_lock_pattern_common.xml @@ -16,14 +16,14 @@ --> - - - + @@ -119,4 +119,4 @@ - + diff --git a/res/layout/choose_lock_pattern_common_footer.xml b/res/layout/choose_lock_pattern_common_footer.xml index deea8f03d4b..b0397eaf95a 100644 --- a/res/layout/choose_lock_pattern_common_footer.xml +++ b/res/layout/choose_lock_pattern_common_footer.xml @@ -16,7 +16,7 @@ --> - - + diff --git a/res/layout/confirm_lock_password_normal.xml b/res/layout/confirm_lock_password_normal.xml index 0b516cab031..4b92a4a257c 100644 --- a/res/layout/confirm_lock_password_normal.xml +++ b/res/layout/confirm_lock_password_normal.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/confirm_lock_pattern_normal_base.xml b/res/layout/confirm_lock_pattern_normal_base.xml index bfabf996c01..14798dfbfd5 100644 --- a/res/layout/confirm_lock_pattern_normal_base.xml +++ b/res/layout/confirm_lock_pattern_normal_base.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - + - + diff --git a/res/layout/encryption_interstitial.xml b/res/layout/encryption_interstitial.xml index f827e37371c..ff56a7c5b9a 100644 --- a/res/layout/encryption_interstitial.xml +++ b/res/layout/encryption_interstitial.xml @@ -15,13 +15,13 @@ limitations under the License. --> - + app:sucFooter="@layout/encryption_interstitial_footer"> - + diff --git a/res/layout/face_enroll_enrolling.xml b/res/layout/face_enroll_enrolling.xml index 2208cc264d7..e596ff94e97 100644 --- a/res/layout/face_enroll_enrolling.xml +++ b/res/layout/face_enroll_enrolling.xml @@ -15,14 +15,14 @@ ~ limitations under the License. --> - + app:sucFooter="@layout/face_enroll_enrolling_footer"> - \ No newline at end of file + \ No newline at end of file diff --git a/res/layout/face_enroll_finish.xml b/res/layout/face_enroll_finish.xml index 9966497bcb4..6b3e6ab554a 100644 --- a/res/layout/face_enroll_finish.xml +++ b/res/layout/face_enroll_finish.xml @@ -15,14 +15,14 @@ ~ limitations under the License --> - + app:sucFooter="@layout/face_enroll_finish_footer"> - @@ -51,10 +51,10 @@ android:contentDescription="@null" android:src="@drawable/face_enroll_introduction" /> - + - + diff --git a/res/layout/face_enroll_finish_footer.xml b/res/layout/face_enroll_finish_footer.xml index 06d263906f2..b33cde79fd4 100644 --- a/res/layout/face_enroll_finish_footer.xml +++ b/res/layout/face_enroll_finish_footer.xml @@ -16,7 +16,7 @@ --> - - + diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml index a56bca595cf..7a5c172dac6 100644 --- a/res/layout/face_enroll_introduction.xml +++ b/res/layout/face_enroll_introduction.xml @@ -15,14 +15,14 @@ ~ limitations under the License --> - + app:sucFooter="@layout/face_enroll_introduction_footer"> - - - @@ -57,8 +57,8 @@ android:contentDescription="@null" android:src="@drawable/face_enroll_introduction" /> - + - + diff --git a/res/layout/face_enroll_introduction_footer.xml b/res/layout/face_enroll_introduction_footer.xml index 0fcc13b5819..d73a8edffe3 100644 --- a/res/layout/face_enroll_introduction_footer.xml +++ b/res/layout/face_enroll_introduction_footer.xml @@ -16,7 +16,7 @@ --> - - + diff --git a/res/layout/fingerprint_enroll_enrolling_base.xml b/res/layout/fingerprint_enroll_enrolling_base.xml index 00a452ca8e8..5a2b60f5d90 100644 --- a/res/layout/fingerprint_enroll_enrolling_base.xml +++ b/res/layout/fingerprint_enroll_enrolling_base.xml @@ -15,14 +15,14 @@ ~ limitations under the License --> - + app:sucFooter="@layout/fingerprint_enroll_enrolling_base_footer"> - - + - + diff --git a/res/layout/fingerprint_enroll_find_sensor_base.xml b/res/layout/fingerprint_enroll_find_sensor_base.xml index ea518a7c63c..18941a2a831 100644 --- a/res/layout/fingerprint_enroll_find_sensor_base.xml +++ b/res/layout/fingerprint_enroll_find_sensor_base.xml @@ -15,14 +15,14 @@ ~ limitations under the License --> - + app:sucFooter="@layout/fingerprint_enroll_find_sensor_base_footer"> - + diff --git a/res/layout/fingerprint_enroll_finish_base.xml b/res/layout/fingerprint_enroll_finish_base.xml index 819bf4e5725..5224dabb9a1 100644 --- a/res/layout/fingerprint_enroll_finish_base.xml +++ b/res/layout/fingerprint_enroll_finish_base.xml @@ -15,14 +15,14 @@ ~ limitations under the License --> - + app:sucFooter="@layout/fingerprint_enroll_finish_base_footer"> - - + - + diff --git a/res/layout/fingerprint_enroll_finish_base_footer.xml b/res/layout/fingerprint_enroll_finish_base_footer.xml index 4c257fa489e..91164bdea66 100644 --- a/res/layout/fingerprint_enroll_finish_base_footer.xml +++ b/res/layout/fingerprint_enroll_finish_base_footer.xml @@ -16,7 +16,7 @@ --> - - + diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml index 4228f4205d4..701d94a6253 100644 --- a/res/layout/fingerprint_enroll_introduction.xml +++ b/res/layout/fingerprint_enroll_introduction.xml @@ -15,14 +15,14 @@ limitations under the License --> - + app:sucFooter="@layout/fingerprint_enroll_introduction_footer"> - - - @@ -57,8 +57,8 @@ android:contentDescription="@null" android:src="@drawable/fingerprint_enroll_introduction" /> - + - + diff --git a/res/layout/fingerprint_enroll_introduction_footer.xml b/res/layout/fingerprint_enroll_introduction_footer.xml index b2d697340cf..1298d829d38 100644 --- a/res/layout/fingerprint_enroll_introduction_footer.xml +++ b/res/layout/fingerprint_enroll_introduction_footer.xml @@ -16,7 +16,7 @@ --> - - + diff --git a/res/layout/master_clear.xml b/res/layout/master_clear.xml index 8d4d6231a23..83b02ff2763 100644 --- a/res/layout/master_clear.xml +++ b/res/layout/master_clear.xml @@ -14,7 +14,7 @@ limitations under the License. --> - - + diff --git a/res/layout/master_clear_confirm.xml b/res/layout/master_clear_confirm.xml index d513dbb3135..2acdfcecf40 100644 --- a/res/layout/master_clear_confirm.xml +++ b/res/layout/master_clear_confirm.xml @@ -13,7 +13,7 @@ See the License for the specific language governing permissions and limitations under the License. --> - - + diff --git a/res/layout/redaction_interstitial.xml b/res/layout/redaction_interstitial.xml index 939ff92b9ac..929ac078b13 100644 --- a/res/layout/redaction_interstitial.xml +++ b/res/layout/redaction_interstitial.xml @@ -15,14 +15,14 @@ limitations under the License --> - - + diff --git a/res/layout/setup_preference.xml b/res/layout/setup_preference.xml index 298bc9a473b..314bb0ede33 100644 --- a/res/layout/setup_preference.xml +++ b/res/layout/setup_preference.xml @@ -15,7 +15,7 @@ limitations under the License. --> - - + app:sucFooter="@layout/storage_wizard_footer"> - + diff --git a/res/layout/storage_wizard_init.xml b/res/layout/storage_wizard_init.xml index 4905de604f5..3b7a5de5346 100644 --- a/res/layout/storage_wizard_init.xml +++ b/res/layout/storage_wizard_init.xml @@ -14,13 +14,13 @@ limitations under the License. --> - + app:sucFooter="@layout/storage_wizard_footer"> - + diff --git a/res/layout/storage_wizard_progress.xml b/res/layout/storage_wizard_progress.xml index 0b38475eb81..e1d685bace3 100644 --- a/res/layout/storage_wizard_progress.xml +++ b/res/layout/storage_wizard_progress.xml @@ -14,13 +14,13 @@ limitations under the License. --> - + app:sucFooter="@layout/storage_wizard_footer"> - + diff --git a/res/layout/storage_wizard_ready.xml b/res/layout/storage_wizard_ready.xml index a9e4ddf9bb6..e947758e7e9 100644 --- a/res/layout/storage_wizard_ready.xml +++ b/res/layout/storage_wizard_ready.xml @@ -14,13 +14,13 @@ limitations under the License. --> - + app:sucFooter="@layout/storage_wizard_footer"> - + diff --git a/src/com/android/settings/EncryptionInterstitial.java b/src/com/android/settings/EncryptionInterstitial.java index caef9888a45..8cae26b831f 100644 --- a/src/com/android/settings/EncryptionInterstitial.java +++ b/src/com/android/settings/EncryptionInterstitial.java @@ -39,7 +39,8 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.InstrumentedFragment; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; import java.util.List; diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java index 307bbc1425a..8e745a3823f 100644 --- a/src/com/android/settings/MasterClear.java +++ b/src/com/android/settings/MasterClear.java @@ -64,8 +64,9 @@ import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settings.password.ConfirmLockPattern; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.setupwizardlib.TemplateLayout; -import com.android.setupwizardlib.template.ButtonFooterMixin; + +import com.google.android.setupcompat.TemplateLayout; +import com.google.android.setupdesign.template.ButtonFooterMixin; import java.util.List; diff --git a/src/com/android/settings/MasterClearConfirm.java b/src/com/android/settings/MasterClearConfirm.java index 8ebb71054b3..ffbb2aa1307 100644 --- a/src/com/android/settings/MasterClearConfirm.java +++ b/src/com/android/settings/MasterClearConfirm.java @@ -43,8 +43,9 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.core.InstrumentedFragment; import com.android.settings.enterprise.ActionDisabledByAdminDialogHelper; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.setupwizardlib.TemplateLayout; -import com.android.setupwizardlib.template.ButtonFooterMixin; + +import com.google.android.setupcompat.TemplateLayout; +import com.google.android.setupdesign.template.ButtonFooterMixin; /** * Confirm and execute a reset of the device to a clean "just out of the box" diff --git a/src/com/android/settings/SetupWizardUtils.java b/src/com/android/settings/SetupWizardUtils.java index 27cdb691d2b..0dbb2dcef9d 100644 --- a/src/com/android/settings/SetupWizardUtils.java +++ b/src/com/android/settings/SetupWizardUtils.java @@ -21,7 +21,9 @@ import android.os.SystemProperties; import androidx.annotation.VisibleForTesting; -import com.android.setupwizardlib.util.WizardManagerHelper; +import com.google.android.setupcompat.util.WizardManagerHelper; +import com.google.android.setupdesign.util.ThemeHelper; + public class SetupWizardUtils { @@ -35,17 +37,17 @@ public class SetupWizardUtils { } if (theme != null) { switch (theme) { - case WizardManagerHelper.THEME_GLIF_V3_LIGHT: + case ThemeHelper.THEME_GLIF_V3_LIGHT: return R.style.GlifV3Theme_Light; - case WizardManagerHelper.THEME_GLIF_V3: + case ThemeHelper.THEME_GLIF_V3: return R.style.GlifV3Theme; - case WizardManagerHelper.THEME_GLIF_V2_LIGHT: + case ThemeHelper.THEME_GLIF_V2_LIGHT: return R.style.GlifV2Theme_Light; - case WizardManagerHelper.THEME_GLIF_V2: + case ThemeHelper.THEME_GLIF_V2: return R.style.GlifV2Theme; - case WizardManagerHelper.THEME_GLIF_LIGHT: + case ThemeHelper.THEME_GLIF_LIGHT: return R.style.GlifTheme_Light; - case WizardManagerHelper.THEME_GLIF: + case ThemeHelper.THEME_GLIF: return R.style.GlifTheme; } } diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java index f5a1b5e6560..0aa8936241c 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollBase.java +++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java @@ -32,7 +32,8 @@ import com.android.settings.SetupWizardUtils; import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling; import com.android.settings.core.InstrumentedActivity; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; /** * Base activity for all biometric enrollment steps. diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index beefb39759d..2424eb10280 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -28,7 +28,8 @@ import android.widget.TextView; import com.android.settings.R; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; -import com.android.setupwizardlib.span.LinkSpan; + +import com.google.android.setupdesign.span.LinkSpan; /** * Abstract base class for the intro onboarding activity for biometric enrollment. diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index 748f874813b..c4a9c4f06bc 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -29,7 +29,8 @@ import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollIntroduction; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.setupwizardlib.span.LinkSpan; + +import com.google.android.setupdesign.span.LinkSpan; public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java index 241545dfb39..8821ce5c6c3 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java @@ -32,7 +32,8 @@ import com.android.settings.biometrics.BiometricEnrollIntroduction; import com.android.settings.password.ChooseLockSettingsHelper; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.setupwizardlib.span.LinkSpan; + +import com.google.android.setupdesign.span.LinkSpan; public class FingerprintEnrollIntroduction extends BiometricEnrollIntroduction { diff --git a/src/com/android/settings/deviceinfo/StorageWizardBase.java b/src/com/android/settings/deviceinfo/StorageWizardBase.java index ef0e46b745e..50c908acc8d 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardBase.java +++ b/src/com/android/settings/deviceinfo/StorageWizardBase.java @@ -44,7 +44,8 @@ import androidx.fragment.app.FragmentActivity; import com.android.settings.R; import com.android.settingslib.Utils; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; import java.text.NumberFormat; import java.util.List; diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 1ef95da036a..32d4edf78dd 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -68,7 +68,8 @@ import com.android.settings.Utils; import com.android.settings.core.InstrumentedFragment; import com.android.settings.notification.RedactionInterstitial; import com.android.settings.widget.ImeAwareEditText; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; import java.util.ArrayList; import java.util.List; diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 0d06ed8292a..1c9e3ff5951 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -48,9 +48,9 @@ import com.android.settings.SetupWizardUtils; import com.android.settings.Utils; import com.android.settings.core.InstrumentedFragment; import com.android.settings.notification.RedactionInterstitial; -import com.android.setupwizardlib.GlifLayout; import com.google.android.collect.Lists; +import com.google.android.setupdesign.GlifLayout; import java.util.ArrayList; import java.util.Collections; diff --git a/src/com/android/settings/password/ChooseLockSettingsHelper.java b/src/com/android/settings/password/ChooseLockSettingsHelper.java index 938dec46f6c..1c9191a3f73 100644 --- a/src/com/android/settings/password/ChooseLockSettingsHelper.java +++ b/src/com/android/settings/password/ChooseLockSettingsHelper.java @@ -31,7 +31,8 @@ import androidx.fragment.app.Fragment; import com.android.internal.widget.LockPatternUtils; import com.android.settings.SettingsActivity; import com.android.settings.Utils; -import com.android.setupwizardlib.util.WizardManagerHelper; + +import com.google.android.setupcompat.util.WizardManagerHelper; public final class ChooseLockSettingsHelper { diff --git a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java index 10c73c575f5..191f82795a6 100644 --- a/src/com/android/settings/password/ChooseLockTypeDialogFragment.java +++ b/src/com/android/settings/password/ChooseLockTypeDialogFragment.java @@ -39,7 +39,8 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.password.ChooseLockGeneric.ChooseLockGenericFragment; -import com.android.setupwizardlib.util.WizardManagerHelper; + +import com.google.android.setupcompat.util.WizardManagerHelper; import java.util.List; diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java index 76001048ace..8cd40d5254d 100644 --- a/src/com/android/settings/password/SetupChooseLockGeneric.java +++ b/src/com/android/settings/password/SetupChooseLockGeneric.java @@ -38,7 +38,8 @@ import com.android.settings.SetupEncryptionInterstitial; import com.android.settings.SetupWizardUtils; import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor; import com.android.settings.utils.SettingsDividerItemDecoration; -import com.android.setupwizardlib.GlifPreferenceLayout; + +import com.google.android.setupdesign.GlifPreferenceLayout; /** * Setup Wizard's version of ChooseLockGeneric screen. It inherits the logic and basic structure diff --git a/src/com/android/settings/utils/SettingsDividerItemDecoration.java b/src/com/android/settings/utils/SettingsDividerItemDecoration.java index 85cd9617b98..3d9e9019747 100644 --- a/src/com/android/settings/utils/SettingsDividerItemDecoration.java +++ b/src/com/android/settings/utils/SettingsDividerItemDecoration.java @@ -21,7 +21,7 @@ import android.content.Context; import androidx.preference.PreferenceViewHolder; import androidx.recyclerview.widget.RecyclerView; -import com.android.setupwizardlib.DividerItemDecoration; +import com.google.android.setupdesign.DividerItemDecoration; public class SettingsDividerItemDecoration extends DividerItemDecoration { diff --git a/src/com/android/settings/wifi/WifiDialogActivity.java b/src/com/android/settings/wifi/WifiDialogActivity.java index e3a03ad55c9..9ef6a39a028 100644 --- a/src/com/android/settings/wifi/WifiDialogActivity.java +++ b/src/com/android/settings/wifi/WifiDialogActivity.java @@ -30,7 +30,8 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.SetupWizardUtils; import com.android.settingslib.wifi.AccessPoint; -import com.android.setupwizardlib.util.WizardManagerHelper; + +import com.google.android.setupcompat.util.WizardManagerHelper; public class WifiDialogActivity extends Activity implements WifiDialog.WifiDialogListener, DialogInterface.OnDismissListener { diff --git a/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml b/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml index cedf5b9eb62..50e2a379894 100644 --- a/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml +++ b/tests/robotests/res/layout-mcc999/fingerprint_enroll_find_sensor.xml @@ -15,14 +15,14 @@ limitations under the License. --> - + app:sucFooter="@layout/fingerprint_enroll_find_sensor_base_footer"> - + diff --git a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java index beabd15a4b6..6220ac18f62 100644 --- a/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java +++ b/tests/robotests/src/com/android/settings/SetupWizardUtilsTest.java @@ -22,7 +22,9 @@ import android.content.Intent; import android.os.SystemProperties; import com.android.settings.testutils.SettingsRobolectricTestRunner; -import com.android.setupwizardlib.util.WizardManagerHelper; + +import com.google.android.setupcompat.util.WizardManagerHelper; +import com.google.android.setupdesign.util.ThemeHelper; import org.junit.Test; import org.junit.runner.RunWith; @@ -47,9 +49,9 @@ public class SetupWizardUtilsTest { @Test public void testGetTheme_withIntentExtra_shouldReturnExtraTheme() { SystemProperties.set(SetupWizardUtils.SYSTEM_PROP_SETUPWIZARD_THEME, - WizardManagerHelper.THEME_GLIF); + ThemeHelper.THEME_GLIF); Intent intent = new Intent(); - intent.putExtra(WizardManagerHelper.EXTRA_THEME, WizardManagerHelper.THEME_GLIF_V2); + intent.putExtra(WizardManagerHelper.EXTRA_THEME, ThemeHelper.THEME_GLIF_V2); assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV2Theme); } @@ -57,7 +59,7 @@ public class SetupWizardUtilsTest { @Test public void testGetTheme_withEmptyIntent_shouldReturnSystemProperty() { SystemProperties.set(SetupWizardUtils.SYSTEM_PROP_SETUPWIZARD_THEME, - WizardManagerHelper.THEME_GLIF_V2_LIGHT); + ThemeHelper.THEME_GLIF_V2_LIGHT); Intent intent = new Intent(); assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV2Theme_Light); @@ -66,7 +68,7 @@ public class SetupWizardUtilsTest { @Test public void testGetTheme_glifV3Light_shouldReturnThemeResource() { SystemProperties.set(SetupWizardUtils.SYSTEM_PROP_SETUPWIZARD_THEME, - WizardManagerHelper.THEME_GLIF_V3_LIGHT); + ThemeHelper.THEME_GLIF_V3_LIGHT); Intent intent = new Intent(); assertThat(SetupWizardUtils.getTheme(intent)).isEqualTo(R.style.GlifV3Theme_Light); diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index fd44e4f1a36..6e3e4294cd3 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -32,7 +32,8 @@ import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settings.testutils.shadow.ShadowUtils; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; import org.junit.After; import org.junit.Before; diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java index ab7f7954cc5..352e2c43807 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java @@ -32,7 +32,8 @@ import com.android.settings.testutils.shadow.SettingsShadowResources; import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; import com.android.settings.testutils.shadow.ShadowUtils; import com.android.settingslib.testutils.DrawableTestHelper; -import com.android.setupwizardlib.GlifLayout; + +import com.google.android.setupdesign.GlifLayout; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java index e3f3833ac33..12b0ebfd3bd 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockSettingsHelperTest.java @@ -19,7 +19,9 @@ import com.android.internal.widget.LockPatternUtils; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.testutils.shadow.ShadowUserManager; import com.android.settings.testutils.shadow.ShadowUtils; -import com.android.setupwizardlib.util.WizardManagerHelper; + +import com.google.android.setupcompat.util.WizardManagerHelper; +import com.google.android.setupdesign.util.ThemeHelper; import org.junit.Test; import org.junit.runner.RunWith; @@ -109,7 +111,7 @@ public class ChooseLockSettingsHelperTest { @Test public void testLaunchConfirmationActivity_internal_shouldPropagateTheme() { Intent intent = new Intent() - .putExtra(WizardManagerHelper.EXTRA_THEME, WizardManagerHelper.THEME_GLIF_V2); + .putExtra(WizardManagerHelper.EXTRA_THEME, ThemeHelper.THEME_GLIF_V2); Activity activity = Robolectric.buildActivity(Activity.class, intent).get(); ChooseLockSettingsHelper helper = getChooseLockSettingsHelper(activity); helper.launchConfirmationActivity(123, "test title", true, 0 /* userId */); @@ -118,7 +120,7 @@ public class ChooseLockSettingsHelperTest { IntentForResult startedActivity = shadowActivity.getNextStartedActivityForResult(); assertThat(startedActivity.requestCode).isEqualTo(123); assertThat(startedActivity.intent.getStringExtra(WizardManagerHelper.EXTRA_THEME)) - .isEqualTo(WizardManagerHelper.THEME_GLIF_V2); + .isEqualTo(ThemeHelper.THEME_GLIF_V2); } private ChooseLockSettingsHelper getChooseLockSettingsHelper(Activity activity) { diff --git a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java index 74914f4eb44..6a177950c0d 100644 --- a/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java +++ b/tests/robotests/src/com/android/settings/testutils/SettingsRobolectricTestRunner.java @@ -72,9 +72,9 @@ public class SettingsRobolectricTestRunner extends RobolectricTestRunner { public static void addIncludedResourcePaths(List paths) { try { paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:packages/apps/Settings/res")), null)); + Fs.fromURL(new URL("file:packages/apps/Settings/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/base/packages/SettingsLib/res")), null)); + Fs.fromURL(new URL("file:frameworks/base/packages/SettingsLib/res")), null)); paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:frameworks/base/packages/SettingsLib/AppPreference/res/")), null)); paths.add(new ResourcePath(null, @@ -88,21 +88,19 @@ public class SettingsRobolectricTestRunner extends RobolectricTestRunner { paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:frameworks/base/packages/SettingsLib/SettingsLayoutPreference/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/base/core/res/res")), null)); + Fs.fromURL(new URL("file:frameworks/base/core/res/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/opt/setupwizard/library/main/res")), null)); + Fs.fromURL(new URL("file:external/setupcompat/main/res")), null)); + paths.add(new ResourcePath(null, + Fs.fromURL(new URL("file:external/setupdesign/main/res")), null)); paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:out/target/common/obj/JAVA_LIBRARIES/robolectric_android-all-stub_intermediates/classes/raw-res/res")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/opt/setupwizard/library/gingerbread/res")), null)); + Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat-nodeps/android_common/aar/res/")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:frameworks/opt/setupwizard/library/recyclerview/res")), null)); + Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/extras/material-design-x/com.google.android.material_material-nodeps/android_common/aar/res/")), null)); paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.appcompat_appcompat-nodeps/android_common/aar/res/")), null)); - paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/extras/material-design-x/com.google.android.material_material-nodeps/android_common/aar/res/")), null)); - paths.add(new ResourcePath(null, - Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.cardview_cardview-nodeps/android_common/aar/res")), null)); + Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.cardview_cardview-nodeps/android_common/aar/res")), null)); paths.add(new ResourcePath(null, Fs.fromURL(new URL("file:out/soong/.intermediates/prebuilts/sdk/current/androidx/androidx.slice_slice-view-nodeps/android_common/aar/res")), null)); paths.add(new ResourcePath(null, From 6bafa1d830d4ef3d3de0ce16a806c0fc86dfac0f Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Fri, 7 Dec 2018 13:24:50 -0800 Subject: [PATCH 4/6] Update settings together with framework changes Bug: 120578823 Test: builds, behaves as expected Change-Id: Id7fd84069c725cde3ed2c38060ab6a636066fcfa --- .../settings/biometrics/face/FaceEnrollSidecar.java | 3 ++- .../FaceSettingsAttentionPreferenceController.java | 10 ++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java index 7b445e59f3d..2433fcb7892 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollSidecar.java @@ -43,8 +43,9 @@ public class FaceEnrollSidecar extends BiometricEnrollSidecar { if (mUserId != UserHandle.USER_NULL) { mFaceManager.setActiveUser(mUserId); } + // TODO: Send the list of disabled features mFaceManager.enroll(mToken, mEnrollmentCancel, - 0 /* flags */, mUserId, mEnrollmentCallback); + mEnrollmentCallback, new int[0] /* disabledFeatures */); } private FaceManager.EnrollmentCallback mEnrollmentCallback diff --git a/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java index 9c4f964c7fd..2e32bf3df60 100644 --- a/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java +++ b/src/com/android/settings/biometrics/face/FaceSettingsAttentionPreferenceController.java @@ -48,7 +48,6 @@ public class FaceSettingsAttentionPreferenceController extends TogglePreferenceC public void setToken(byte[] token) { mToken = token; - mPreference.setChecked(mFaceManager.getRequireAttention(mToken)); } /** @@ -64,18 +63,13 @@ public class FaceSettingsAttentionPreferenceController extends TogglePreferenceC public boolean isChecked() { if (!FaceSettings.isAvailable(mContext)) { return true; - } else if (mToken == null) { - // The token will be null when the controller is first created, since CC has not been - // completed by the user. Once it's completed, FaceSettings will use setToken which - // will retrieve the correct value from FaceService - return true; } - return mFaceManager.getRequireAttention(mToken); + return mFaceManager.getFeature(FaceManager.FEATURE_REQUIRE_ATTENTION); } @Override public boolean setChecked(boolean isChecked) { - mFaceManager.setRequireAttention(isChecked, mToken); + mFaceManager.setFeature(FaceManager.FEATURE_REQUIRE_ATTENTION, isChecked, mToken); return true; } From 7eb57526706ce5f3c9ef5bad00e1c53095e1a0b0 Mon Sep 17 00:00:00 2001 From: Yanting Yang Date: Wed, 12 Dec 2018 17:05:36 +0800 Subject: [PATCH 5/6] Update background color of Contextual Home Page Change-Id: Ifdd708c0ffaaa7bd50e945c33769cb093a40295f Fixes: 120684259 Test: visual, robotest --- res/values/themes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values/themes.xml b/res/values/themes.xml index 1e24770abd8..9a05bfca127 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -198,6 +198,7 @@ true @*android:color/ripple_material_light @android:color/white + @android:color/white true From 2101151180dc94eaf9413d2a5fb9561c6fb8052b Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Mon, 10 Dec 2018 17:23:34 -0800 Subject: [PATCH 6/6] Add temporary link to PermissionController for new default apps UI. This change adds a temporary link in the default apps settings to allow launching the new default apps UI in PermissionController during the process we migrate default apps to use roles. Bug: 110557011 Test: manually tested the UI Change-Id: I0ac340acd5a077c74b48b28c97f517adb2084a36 --- res/values/strings.xml | 6 + res/xml/app_default_settings.xml | 8 ++ .../RolesPreferenceController.java | 62 ++++++++ .../RolesPreferenceControllerTest.java | 136 ++++++++++++++++++ 4 files changed, 212 insertions(+) create mode 100644 src/com/android/settings/applications/defaultapps/RolesPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index b6d923953bf..479cde7c423 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8389,6 +8389,12 @@ Phone app + + + Roles + (Default) diff --git a/res/xml/app_default_settings.xml b/res/xml/app_default_settings.xml index a993aa1803b..c26c069c7f7 100644 --- a/res/xml/app_default_settings.xml +++ b/res/xml/app_default_settings.xml @@ -79,6 +79,14 @@ android:fragment="com.android.settings.applications.managedomainurls.ManageDomainUrls" settings:keywords="@string/keywords_default_links"/> + + + diff --git a/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java b/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java new file mode 100644 index 00000000000..59166ddc2b6 --- /dev/null +++ b/src/com/android/settings/applications/defaultapps/RolesPreferenceController.java @@ -0,0 +1,62 @@ +/* + * 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.applications.defaultapps; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.provider.Settings; +import android.text.TextUtils; + +import androidx.preference.Preference; + +import com.android.settings.core.BasePreferenceController; + +/** + * STOPSHIP(b/110557011): Remove once the new UI is ready. + */ +public class RolesPreferenceController extends BasePreferenceController { + + private Intent mIntent; + + public RolesPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + + PackageManager packageManager = context.getPackageManager(); + String packageName = packageManager.getPermissionControllerPackageName(); + if (packageName != null) { + mIntent = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS) + .setPackage(packageName); + } + } + + @Override + public int getAvailabilityStatus() { + return mIntent != null ? AVAILABLE_UNSEARCHABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (TextUtils.equals(preference.getKey(), mPreferenceKey)) { + if (mIntent != null) { + mContext.startActivity(mIntent); + } + return true; + } + return false; + } +} diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java new file mode 100644 index 00000000000..0946f3734f1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/RolesPreferenceControllerTest.java @@ -0,0 +1,136 @@ +/* + * 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.applications.defaultapps; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.provider.Settings; + +import androidx.preference.Preference; + +import com.android.settings.core.BasePreferenceController; +import com.android.settings.testutils.SettingsRobolectricTestRunner; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +@RunWith(SettingsRobolectricTestRunner.class) +public class RolesPreferenceControllerTest { + + private static final String PREFERENCE_KEY = "roles"; + private static final String DIFFERENT_PREFERENCE_KEY = "different"; + private static final String PERMISSION_CONTROLLER_PACKAGE_NAME = + "com.android.permissioncontroller"; + + @Mock + private Context mContext; + @Mock + private PackageManager mPackageManager; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mContext.getPackageManager()).thenReturn(mPackageManager); + } + + @Test + public void getAvailabilityStatus_noPermissionController_shouldReturnUnsupportedOnDevice() { + when(mPackageManager.getPermissionControllerPackageName()).thenReturn(null); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(controller.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + public void getAvailabilityStatus_hasPermissionController_shouldReturnAvailableUnsearchable() { + when(mPackageManager.getPermissionControllerPackageName()) + .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + + assertThat(controller.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE_UNSEARCHABLE); + } + + @Test + public void handlePreferenceTreeClick_differentKey_shouldReturnFalse() { + when(mPackageManager.getPermissionControllerPackageName()) + .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + Preference preference = mock(Preference.class); + when(preference.getKey()).thenReturn(DIFFERENT_PREFERENCE_KEY); + + assertThat(controller.handlePreferenceTreeClick(preference)).isFalse(); + } + + @Test + public void handlePreferenceTreeClick_sameKey_shouldReturnTrue() { + when(mPackageManager.getPermissionControllerPackageName()) + .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + Preference preference = mock(Preference.class); + when(preference.getKey()).thenReturn(PREFERENCE_KEY); + + assertThat(controller.handlePreferenceTreeClick(preference)).isTrue(); + } + + @Test + public void handlePreferenceTreeClick_noPermissionController_shouldNotStartActivity() { + when(mPackageManager.getPermissionControllerPackageName()).thenReturn(null); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + Preference preference = mock(Preference.class); + when(preference.getKey()).thenReturn(PREFERENCE_KEY); + controller.handlePreferenceTreeClick(preference); + + verify(mContext, never()).startActivity(any(Intent.class)); + } + + @Test + public void handlePreferenceTreeClick_hasPermissionController_shouldStartActivityWithIntent() { + when(mPackageManager.getPermissionControllerPackageName()) + .thenReturn(PERMISSION_CONTROLLER_PACKAGE_NAME); + RolesPreferenceController controller = new RolesPreferenceController(mContext, + PREFERENCE_KEY); + Preference preference = mock(Preference.class); + when(preference.getKey()).thenReturn(PREFERENCE_KEY); + controller.handlePreferenceTreeClick(preference); + ArgumentCaptor intent = ArgumentCaptor.forClass(Intent.class); + + verify(mContext).startActivity(intent.capture()); + assertThat(intent.getValue().getAction()) + .isEqualTo(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS); + assertThat(intent.getValue().getPackage()).isEqualTo(PERMISSION_CONTROLLER_PACKAGE_NAME); + } +}