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/AndroidManifest.xml b/AndroidManifest.xml index 7807f0e07d9..caca44439cc 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3054,6 +3054,14 @@ + + + + + + + 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/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" /> + - - diff --git a/res/values/strings.xml b/res/values/strings.xml index ae080cd8fc0..6aacb0a8da6 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2056,6 +2056,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 @@ -8404,6 +8412,12 @@ Phone app + + + Roles + (Default) 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 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/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/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/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/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; } 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/AddNetworkFragment.java b/src/com/android/settings/wifi/AddNetworkFragment.java index 814b3583e93..72d878b3109 100644 --- a/src/com/android/settings/wifi/AddNetworkFragment.java +++ b/src/com/android/settings/wifi/AddNetworkFragment.java @@ -23,12 +23,14 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; +import android.widget.ImageButton; import androidx.annotation.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.settings.R; import com.android.settings.core.InstrumentedFragment; +import com.android.settings.wifi.dpp.WifiDppUtils; public class AddNetworkFragment extends InstrumentedFragment implements WifiConfigUiBase, View.OnClickListener { @@ -64,6 +66,18 @@ public class AddNetworkFragment extends InstrumentedFragment implements WifiConf mCancelBtn.setOnClickListener(this); mUIController = new WifiConfigController(this, rootView, null, getMode()); + if (WifiDppUtils.isSharingNetworkEnabled(getContext())) { + final ImageButton scannerButton = rootView.findViewById(R.id.ssid_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)); + }); + } + } + 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/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/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/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..dc0ff849eaf 100644 --- a/src/com/android/settings/wifi/dpp/WifiDppUtils.java +++ b/src/com/android/settings/wifi/dpp/WifiDppUtils.java @@ -16,12 +16,36 @@ 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 */ 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"; @@ -54,4 +78,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/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/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); + } +} 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, 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(); + } +} 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;