Snap for 5179425 from 57baac2df5 to qt-release

Change-Id: I91ab279caa558370561119874b87a189a8021fe9
This commit is contained in:
android-build-team Robot
2018-12-13 04:02:03 +00:00
78 changed files with 1171 additions and 248 deletions

View File

@@ -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

View File

@@ -3054,6 +3054,14 @@
</intent-filter>
</activity>
<activity
android:name=".wifi.dpp.WifiDppEnrolleeActivity">
<intent-filter>
<action android:name="android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<activity android:name=".homepage.contextualcards.ContextualCardFeedbackDialog"
android:theme="@android:style/Theme.DeviceDefault.Light.Dialog.Alert" />
<!-- This is the longest AndroidManifest.xml ever. -->

View File

@@ -15,7 +15,7 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
@@ -164,7 +164,7 @@
</LinearLayout>
<!-- right side: lock pattern -->
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
@@ -177,8 +177,8 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -89,7 +89,7 @@
</ScrollView>
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle"
android:layout_width="0dp"
android:layout_height="match_parent"
@@ -102,7 +102,7 @@
android:layout_gravity="center"
android:background="@color/lock_pattern_background" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,7 +15,7 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -108,7 +108,7 @@
android:gravity="center"
android:orientation="vertical">
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginVertical="24dp"
@@ -120,7 +120,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
<TextView
style="@style/TextAppearance.FingerprintErrorText"
@@ -139,4 +139,4 @@
</LinearLayout>
</ScrollView>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,7 +15,7 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -112,4 +112,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,7 +15,7 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -75,7 +75,7 @@
android:layout_height="0dp"
android:layout_weight="1" />
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -103,11 +103,11 @@
android:layout_height="wrap_content"
android:text="@string/security_settings_fingerprint_enroll_done" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>
</LinearLayout>
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent">
@@ -120,8 +120,8 @@
android:contentDescription="@android:string/fingerprint_icon_content_description"
android:src="@drawable/fingerprint_enroll_finish" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</LinearLayout>
</ScrollView>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -14,14 +14,14 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
android:importantForAutofill="noExcludeDescendants"
settings:suwFooter="@layout/choose_lock_password_footer"
settings:sucFooter="@layout/choose_lock_password_footer"
settings:suwHeaderText="@string/lockpassword_choose_your_screen_lock_header">
<LinearLayout
@@ -79,4 +79,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,14 +16,14 @@
-->
<!-- Used in phone portrait and tablet, as referenced in alias.xml. -->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
android:layout="@layout/suw_glif_blank_template"
settings:suwFooter="@layout/choose_lock_pattern_common_footer"
settings:sucFooter="@layout/choose_lock_pattern_common_footer"
settings:suwHeaderText="@string/lockpassword_choose_your_screen_lock_header">
<com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient
@@ -85,7 +85,7 @@
android:paddingHorizontal="?attr/suwMarginSides"
android:textSize="12sp" />
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content"
android:layout_height="0dp"
@@ -97,7 +97,7 @@
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</LinearLayout>
@@ -119,4 +119,4 @@
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,7 +16,7 @@
-->
<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
@@ -49,4 +49,4 @@
android:layout_height="wrap_content"
android:text="@string/lockpattern_tutorial_continue_label" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>

View File

@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -82,4 +82,4 @@
android:text="@string/cancel" />
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
@@ -65,7 +65,7 @@
android:paddingLeft="0dp"
android:paddingRight="0dp">
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content"
android:layout_height="0dp"
@@ -77,7 +77,7 @@
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
<TextView
style="@style/TextAppearance.ConfirmDeviceCredentialsErrorText"
@@ -104,4 +104,4 @@
</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,13 +15,13 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_lock"
app:suwFooter="@layout/encryption_interstitial_footer">
app:sucFooter="@layout/encryption_interstitial_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -39,4 +39,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="?attr/face_layout_theme"
app:suwFooter="@layout/face_enroll_enrolling_footer">
app:sucFooter="@layout/face_enroll_enrolling_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -71,4 +71,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
style="?attr/face_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/face_enroll_finish_footer">
app:sucFooter="@layout/face_enroll_finish_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -39,7 +39,7 @@
android:gravity="center"
android:orientation="vertical">
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -51,10 +51,10 @@
android:contentDescription="@null"
android:src="@drawable/face_enroll_introduction" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</LinearLayout>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,7 +16,7 @@
-->
<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
@@ -34,4 +34,4 @@
android:layout_height="wrap_content"
android:text="@string/security_settings_face_enroll_done" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="?attr/face_layout_theme"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/face_enroll_introduction_footer">
app:sucFooter="@layout/face_enroll_introduction_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -32,20 +32,20 @@
android:clipToPadding="false"
android:orientation="vertical">
<com.android.setupwizardlib.view.RichTextView
<com.google.android.setupdesign.view.RichTextView
android:id="@+id/description_text"
style="@style/SuwDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/security_settings_face_enroll_introduction_message" />
<com.android.setupwizardlib.view.RichTextView
<com.google.android.setupdesign.view.RichTextView
android:id="@+id/error_text"
style="@style/SuwDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -57,8 +57,8 @@
android:contentDescription="@null"
android:src="@drawable/face_enroll_introduction" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,7 +16,7 @@
-->
<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
@@ -41,4 +41,4 @@
android:layout_height="wrap_content"
android:text="@string/suw_next_button_label" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="?attr/fingerprint_layout_theme"
app:suwFooter="@layout/fingerprint_enroll_enrolling_base_footer">
app:sucFooter="@layout/fingerprint_enroll_enrolling_base_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -64,7 +64,7 @@
android:gravity="center"
android:orientation="vertical">
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="@dimen/fingerprint_progress_bar_max_size"
android:layout_height="@dimen/fingerprint_progress_bar_max_size"
android:paddingTop="0dp"
@@ -75,7 +75,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
<TextView
style="@style/TextAppearance.FingerprintErrorText"
@@ -91,4 +91,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/fingerprint_enroll_find_sensor_base_footer">
app:sucFooter="@layout/fingerprint_enroll_find_sensor_base_footer">
<LinearLayout
android:layout_width="match_parent"
@@ -59,4 +59,4 @@
android:layout_gravity="center_horizontal"/>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,14 +15,14 @@
~ limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/fingerprint_enroll_finish_base_footer">
app:sucFooter="@layout/fingerprint_enroll_finish_base_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -48,7 +48,7 @@
android:gravity="center"
android:orientation="vertical">
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="@dimen/fingerprint_progress_bar_max_size"
android:layout_height="@dimen/fingerprint_progress_bar_max_size"
android:layout_marginVertical="24dp"
@@ -64,7 +64,7 @@
android:padding="7dp"
android:contentDescription="@android:string/fingerprint_icon_content_description"
android:src="@drawable/fingerprint_enroll_finish" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
<!-- Added to align elements with fingerprint_enroll_enrolling_base -->
<TextView
@@ -78,4 +78,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,7 +16,7 @@
-->
<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
@@ -41,4 +41,4 @@
android:layout_height="wrap_content"
android:text="@string/security_settings_fingerprint_enroll_done" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>

View File

@@ -15,14 +15,14 @@
limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
style="?attr/fingerprint_layout_theme"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/fingerprint_enroll_introduction_footer">
app:sucFooter="@layout/fingerprint_enroll_introduction_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -32,20 +32,20 @@
android:clipToPadding="false"
android:orientation="vertical">
<com.android.setupwizardlib.view.RichTextView
<com.google.android.setupdesign.view.RichTextView
android:id="@+id/description_text"
style="@style/SuwDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/security_settings_fingerprint_enroll_introduction_message" />
<com.android.setupwizardlib.view.RichTextView
<com.google.android.setupdesign.view.RichTextView
android:id="@+id/error_text"
style="@style/SuwDescription.Glif"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.android.setupwizardlib.view.FillContentLayout
<com.google.android.setupdesign.view.FillContentLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
@@ -57,8 +57,8 @@
android:contentDescription="@null"
android:src="@drawable/fingerprint_enroll_introduction" />
</com.android.setupwizardlib.view.FillContentLayout>
</com.google.android.setupdesign.view.FillContentLayout>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -16,7 +16,7 @@
-->
<!-- TODO: Use aapt:attr when it is fixed (b/36809755) -->
<com.android.setupwizardlib.view.ButtonBarLayout
<com.google.android.setupdesign.view.ButtonBarLayout
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/SuwGlifButtonBar.Stackable"
android:layout_width="match_parent"
@@ -41,4 +41,4 @@
android:layout_height="wrap_content"
android:text="@string/suw_next_button_label" />
</com.android.setupwizardlib.view.ButtonBarLayout>
</com.google.android.setupdesign.view.ButtonBarLayout>

View File

@@ -14,7 +14,7 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
@@ -135,4 +135,4 @@
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
@@ -37,4 +37,4 @@
android:layout_height="wrap_content"
android:text="@string/master_clear_final_desc"/>
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,14 +15,14 @@
limitations under the License
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:icon="@drawable/ic_suggested_notifications"
settings:suwFooter="@layout/redaction_interstitial_footer"
settings:sucFooter="@layout/redaction_interstitial_footer"
settings:suwHeaderText="@string/lock_screen_notifications_interstitial_title">
<LinearLayout
@@ -78,4 +78,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -15,7 +15,7 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifPreferenceLayout
<com.google.android.setupdesign.GlifPreferenceLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list_container"
android:layout_width="match_parent"

View File

@@ -14,13 +14,13 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/storage_wizard_footer">
app:sucFooter="@layout/storage_wizard_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -44,4 +44,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -14,13 +14,13 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/storage_wizard_footer">
app:sucFooter="@layout/storage_wizard_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -136,4 +136,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -14,13 +14,13 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/storage_wizard_footer">
app:sucFooter="@layout/storage_wizard_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -59,4 +59,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -14,13 +14,13 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/storage_wizard_footer">
app:sucFooter="@layout/storage_wizard_footer">
<LinearLayout
style="@style/SuwContentFrame"
@@ -38,4 +38,4 @@
</LinearLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@null"
android:visibility="gone"
android:contentDescription="@string/wifi_add_network" />

View File

@@ -50,13 +50,28 @@
android:text="@string/wifi_ssid"
android:textDirection="locale" />
<EditText android:id="@+id/ssid"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText android:id="@+id/ssid"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/wifi_item_edit_content"
android:hint="@string/wifi_ssid_hint"
android:singleLine="true"
android:inputType="textNoSuggestions" />
<ImageButton
android:id="@+id/ssid_scanner_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/wifi_item_edit_content"
android:hint="@string/wifi_ssid_hint"
android:singleLine="true"
android:inputType="textNoSuggestions" />
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" />
</RelativeLayout>
<LinearLayout android:id="@+id/ssid_too_long_warning"
android:layout_width="match_parent"
@@ -270,12 +285,28 @@
style="@style/wifi_item_label"
android:text="@string/wifi_password" />
<EditText android:id="@+id/password"
android:layout_width="match_parent"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<EditText android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/wifi_item_edit_content"
android:singleLine="true"
android:password="true" />
<ImageButton
android:id="@+id/password_scanner_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/wifi_item_edit_content"
android:singleLine="true"
android:password="true" />
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" />
</RelativeLayout>
</LinearLayout>
<LinearLayout android:id="@+id/show_password_layout"

View File

@@ -44,8 +44,5 @@
android:layout_height="wrap_content"
android:layout_gravity="center"/>
<include layout="@layout/wifi_dpp_fragment_footer"
android:gravity="center|bottom"/>
</LinearLayout>

View File

@@ -2056,6 +2056,14 @@
<string name="wifi_dpp_add_device_to_network">Add a device to this network</string>
<!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=120] -->
<string name="wifi_dpp_center_qr_code">Center the device\u2019s QR code below to add device to \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
<!-- Title for the fragment to scan QR code [CHAR LIMIT=50] -->
<string name="wifi_dpp_scan_qr_code">Scan QR code</string>
<!-- Hint for the user to center another device's QR code in the below camera window [CHAR LIMIT=NONE] -->
<string name="wifi_dpp_scan_qr_code_join_network">Join \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d by scanning a QR code</string>
<!-- Title for the fragment to share Wi-Fi [CHAR LIMIT=50] -->
<string name="wifi_dpp_share_wifi">Share Wi\u2011Fi</string>
<!-- Hint for the user to use another device to scan QR code on screen to join Wi-Fi [CHAR LIMIT=NONE] -->
<string name="wifi_dpp_scan_qr_code_with_another_device">Scan this QR code with another device to join \u201c<xliff:g id="ssid" example="OfficeWifi">%1$s</xliff:g>\u201d</string>
<!-- Label for the check box to share a network with other users on the same device -->
<string name="wifi_shared">Share with other device users</string>
<!-- Hint for unchanged fields -->
@@ -8404,6 +8412,12 @@
<!-- Title for Default Phone app settings [CHAR LIMIT=30] -->
<string name="default_phone_title">Phone app</string>
<!--
~ STOPSHIP(b/110557011): Remove once the new UI is ready.
-->
<!-- Title for Roles settings [CHAR LIMIT=30] -->
<string name="roles_title">Roles</string>
<!-- Label of default app for current setting [CHAR LIMIT=40] -->
<string name="default_app">(Default)</string>

View File

@@ -198,6 +198,7 @@
<item name="android:windowLightStatusBar">true</item>
<item name="android:navigationBarDividerColor">@*android:color/ripple_material_light</item>
<item name="android:navigationBarColor">@android:color/white</item>
<item name="android:windowBackground">@android:color/white</item>
<item name="android:windowLightNavigationBar">true</item>
</style>

View File

@@ -79,6 +79,14 @@
android:fragment="com.android.settings.applications.managedomainurls.ManageDomainUrls"
settings:keywords="@string/keywords_default_links"/>
<!--
~ STOPSHIP(b/110557011): Remove once the new UI is ready.
-->
<Preference
android:key="roles"
android:title="@string/roles_title"
settings:controller="com.android.settings.applications.defaultapps.RolesPreferenceController" />
<com.android.settings.widget.WorkOnlyCategory
android:key="work_app_defaults"
android:title="@string/default_for_work">

View File

@@ -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;

View File

@@ -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;

View File

@@ -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"

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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.

View File

@@ -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.

View File

@@ -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 {

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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

View File

@@ -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 {

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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());

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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) {

View File

@@ -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);
}
}
}

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -15,14 +15,14 @@
limitations under the License.
-->
<com.android.setupwizardlib.GlifLayout
<com.google.android.setupdesign.GlifLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/setup_wizard_layout"
style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:suwFooter="@layout/fingerprint_enroll_find_sensor_base_footer">
app:sucFooter="@layout/fingerprint_enroll_find_sensor_base_footer">
<FrameLayout
android:layout_width="match_parent"
@@ -77,4 +77,4 @@
</LinearLayout>
</FrameLayout>
</com.android.setupwizardlib.GlifLayout>
</com.google.android.setupdesign.GlifLayout>

View File

@@ -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);

View File

@@ -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> 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);
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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) {

View File

@@ -72,9 +72,9 @@ public class SettingsRobolectricTestRunner extends RobolectricTestRunner {
public static void addIncludedResourcePaths(List<ResourcePath> 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,

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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<WifiDppConfiguratorActivity> 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);
}
}

View File

@@ -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;