Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 6e24863..57c577d 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1704,6 +1704,12 @@
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
+ <intent-filter android:priority="1">
+ <action android:name="android.settings.BACKGROUND_RESTRICTIONS_SETTINGS" />
+ <category android:name="android.intent.category.BROWSABLE" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="package" />
+ </intent-filter>
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.applications.manageapplications.ManageApplications" />
<meta-data android:name="com.android.settings.HIGHLIGHT_MENU_KEY"
diff --git a/aconfig/Android.bp b/aconfig/Android.bp
index b2ffa22..d511d04 100644
--- a/aconfig/Android.bp
+++ b/aconfig/Android.bp
@@ -1,4 +1,5 @@
package {
+ default_team: "trendy_team_android_settings_app",
default_applicable_licenses: ["packages_apps_Settings_license"],
}
diff --git a/res-product/values-fa/strings.xml b/res-product/values-fa/strings.xml
index cd7a52f..68f5cca 100644
--- a/res-product/values-fa/strings.xml
+++ b/res-product/values-fa/strings.xml
@@ -146,12 +146,12 @@
<string name="security_settings_sfps_enroll_find_sensor_message" product="tablet" msgid="2006739081527422127">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این دکمه همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه رایانه لوحی قرار دارد."</string>
<string name="security_settings_sfps_enroll_find_sensor_message" product="device" msgid="1209233633252372907">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این دکمه همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه دستگاه قرار دارد."</string>
<string name="security_settings_sfps_enroll_find_sensor_message" product="default" msgid="6862493139500275821">"حسگر اثر انگشت روی دکمه روشن/خاموش قرار دارد. این دکمه همان دکمه مسطحی است که در کنار دکمه برآمده صدا در لبه تلفن قرار دارد."</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="2012126789397819713">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل رایانه لوحی یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="7119860465479161782">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل دستگاهتان یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="8255422287180693200">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل تلفنتان یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="tablet" msgid="7814892482046294464">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل رایانه لوحی یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید. \n\nاثر انگشت دیگری اضافه کنید تا وقتی رایانه لوحیتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="device" msgid="8418220207105495988">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل دستگاه یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید.\n\nاثر انگشت دیگری اضافه کنید تا وقتی دستگاهتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
- <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="default" msgid="3545300825124248359">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل تلفن یا بهتأیید رساندن هویتتان (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید.\n\nاثر انگشت دیگری اضافه کنید تا وقتی تلفنتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet" msgid="2012126789397819713">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل رایانه لوحی یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="device" msgid="7119860465479161782">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل دستگاه یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_message" product="default" msgid="8255422287180693200">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل تلفن یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید"</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="tablet" msgid="7814892482046294464">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل رایانه لوحی یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید. \n\nاثر انگشت دیگری اضافه کنید تا وقتی رایانه لوحیتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="device" msgid="8418220207105495988">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل دستگاه یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید.\n\nاثر انگشت دیگری اضافه کنید تا وقتی دستگاهتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
+ <string name="security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message" product="default" msgid="3545300825124248359">"ازاینپس میتوانید از اثر انگشتتان برای باز کردن قفل تلفن یا بهتأیید رساندن هویت (مثلاً هنگام ورود به سیستم برنامهها یا تأیید خریدها) استفاده کنید.\n\nاثر انگشت دیگری اضافه کنید تا وقتی تلفنتان را در حالتهای مختلف نگه میدارید باز کردن قفل آسانتر شود."</string>
<string name="lock_screen_pin_skip_message" product="tablet" msgid="2125894016330764666">"درصورت گم شدن یا بهسرقت رفتن رایانه لوحی، پین از آن محافظت میکند"</string>
<string name="lock_screen_pattern_skip_message" product="tablet" msgid="7022124791463099454">"درصورت گم شدن یا بهسرقت رفتن رایانه لوحی، الگو از آن محافظت میکند"</string>
<string name="lock_screen_password_skip_message" product="tablet" msgid="7117050321575989041">"درصورت گم شدن یا بهسرقت رفتن رایانه لوحی، گذرواژه از آن محافظت میکند"</string>
diff --git a/res-product/values-kk/strings.xml b/res-product/values-kk/strings.xml
index 7222034..555e295 100644
--- a/res-product/values-kk/strings.xml
+++ b/res-product/values-kk/strings.xml
@@ -347,12 +347,9 @@
<string name="lockpassword_confirm_your_password_details_frp" product="default" msgid="1465326741724776281">"Телефоныңыз зауыттық параметрлерге қайтарылды. Оны пайдалану үшін бұрынғы құпия сөзді енгізіңіз."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="tablet" msgid="1333164951750797865">"Планшетіңіз зауыттық параметрлерге қайтарылды. Оны пайдалану үшін бұрынғы құпия сөзді енгізіңіз."</string>
<string name="lockpassword_confirm_your_password_details_frp" product="device" msgid="116667646012224967">"Құрылғыңыз зауыттық параметрлерге қайтарылды. Оны пайдалану үшін бұрынғы құпия сөзді енгізіңіз."</string>
- <!-- no translation found for battery_tip_incompatible_charging_message (5097154279720383707) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (4208335872169818919) -->
- <skip />
- <!-- no translation found for battery_tip_incompatible_charging_message (5697523201841444736) -->
- <skip />
+ <string name="battery_tip_incompatible_charging_message" product="default" msgid="5097154279720383707">"Телефоныңыз баяу зарядталуы немесе мүлдем зарядталмауы мүмкін. Жылдамырақ зарядтау үшін ұсынылған кабель мен адаптерді пайдаланыңыз."</string>
+ <string name="battery_tip_incompatible_charging_message" product="device" msgid="4208335872169818919">"Құрылғыңыз баяу зарядталуы немесе мүлдем зарядталмауы мүмкін. Жылдамырақ зарядтау үшін ұсынылған кабель мен адаптерді пайдаланыңыз."</string>
+ <string name="battery_tip_incompatible_charging_message" product="tablet" msgid="5697523201841444736">"Планшетіңіз баяу зарядталуы немесе мүлдем зарядталмауы мүмкін. Жылдамырақ зарядтау үшін ұсынылған кабель мен адаптерді пайдаланыңыз."</string>
<string name="lockscreen_trivial_controls_summary" product="default" msgid="42562533085885152">"Телефон құлпын ашпай-ақ қолдана аласыз."</string>
<string name="lockscreen_trivial_controls_summary" product="tablet" msgid="9052068482124729345">"Планшет құлпын ашпай-ақ қолдана аласыз."</string>
<string name="auto_rotate_summary_a11y" product="default" msgid="2813368383309985185">"Телефонды портрет және альбом режимі арасында ауыстырғанда"</string>
diff --git a/res/layout/fingerprint_enroll_find_sensor_graphic.xml b/res/layout/fingerprint_enroll_find_sensor_graphic.xml
index 0690457..d818d48 100644
--- a/res/layout/fingerprint_enroll_find_sensor_graphic.xml
+++ b/res/layout/fingerprint_enroll_find_sensor_graphic.xml
@@ -25,12 +25,12 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="@string/security_settings_fingerprint_enroll_find_sensor_content_description"
- android:src="@drawable/fingerprint_sensor_location"
- android:scaleType="centerInside"/>
+ android:scaleType="centerInside"
+ android:src="@drawable/fingerprint_sensor_location" />
<com.android.settings.biometrics.fingerprint.FingerprintLocationAnimationView
android:id="@+id/fingerprint_sensor_location_animation"
android:layout_width="match_parent"
- android:layout_height="match_parent"/>
+ android:layout_height="match_parent" />
-</FrameLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/fingerprint_v2_enroll_find_sensor.xml b/res/layout/fingerprint_v2_enroll_find_sensor.xml
index d2a495d..bff0cfb 100644
--- a/res/layout/fingerprint_v2_enroll_find_sensor.xml
+++ b/res/layout/fingerprint_v2_enroll_find_sensor.xml
@@ -16,29 +16,30 @@
-->
<com.google.android.setupdesign.GlifLayout
-xmlns:android="http://schemas.android.com/apk/res/android"
-android:id="@+id/setup_wizard_layout"
-style="?attr/fingerprint_layout_theme"
-android:layout_width="match_parent"
-android:layout_height="match_parent">
-
-<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/setup_wizard_layout"
+ style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- android:clipToPadding="false"
- android:clipChildren="false">
+ android:layout_height="match_parent">
- <Space
- android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:layout_weight="1" />
-
- <include
- layout="@layout/fingerprint_enroll_find_sensor_graphic"
+ <LinearLayout
+ android:id="@+id/content_view"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"/>
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:orientation="vertical">
-</LinearLayout>
+ <Space
+ android:layout_width="wrap_content"
+ android:layout_height="0dp"
+ android:layout_weight="1" />
+
+ <include
+ layout="@layout/fingerprint_enroll_find_sensor_graphic"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal" />
+
+ </LinearLayout>
</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
index 0b087d2..710f3fb 100644
--- a/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
+++ b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
@@ -18,35 +18,35 @@
<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"
+ style="?attr/fingerprint_layout_theme"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
-<LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- style="@style/SudContentFrame"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:orientation="vertical">
-
<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/content_view"
+ style="@style/SudContentFrame"
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1"
- android:gravity="center"
+ android:layout_height="match_parent"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:orientation="vertical">
- <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"
- android:paddingTop="0dp"
- android:paddingBottom="0dp">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ android:gravity="center"
+ android:orientation="vertical">
+ <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"
+ android:paddingTop="0dp"
+ android:paddingBottom="0dp">
<com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fingerprint_progress_bar"
@@ -54,22 +54,23 @@
android:layout_height="match_parent"
android:background="@drawable/fp_illustration"
android:minHeight="@dimen/fingerprint_progress_bar_min_size"
- android:progress="0" />
+ android:progress="0"
+ />
- </com.google.android.setupdesign.view.FillContentLayout>
+ </com.google.android.setupdesign.view.FillContentLayout>
- <TextView
- android:id="@+id/text"
- style="@style/TextAppearance.ErrorText"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal|bottom"
- android:accessibilityLiveRegion="polite"
- android:gravity="center"
- android:visibility="invisible" />
+ <TextView
+ android:id="@+id/text"
+ style="@style/TextAppearance.ErrorText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_horizontal|bottom"
+ android:accessibilityLiveRegion="polite"
+ android:gravity="center"
+ android:visibility="invisible" />
+
+ </LinearLayout>
</LinearLayout>
-</LinearLayout>
-
</com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/values-kk/arrays.xml b/res/values-kk/arrays.xml
index dd773dd..84a063c 100644
--- a/res/values-kk/arrays.xml
+++ b/res/values-kk/arrays.xml
@@ -77,9 +77,11 @@
<item msgid="6556827947082659801">"Қол жетімді"</item>
<item msgid="6096962300722555553">"Аумақтан тыc"</item>
</string-array>
- <!-- no translation found for bluetooth_leaudio_mode:0 (5307106570247137458) -->
- <!-- no translation found for bluetooth_leaudio_mode:1 (7781484297606806796) -->
- <!-- no translation found for bluetooth_leaudio_mode:2 (6667451574264144311) -->
+ <string-array name="bluetooth_leaudio_mode">
+ <item msgid="5307106570247137458">"Disabled"</item>
+ <item msgid="7781484297606806796">"Unicast"</item>
+ <item msgid="6667451574264144311">"Unicast and Broadcast"</item>
+ </string-array>
<string-array name="bluetooth_max_connected_audio_devices">
<item msgid="4792793579224104167">"Жүйенің әдепкі мәнін пайдалану: <xliff:g id="DEFAULT_BLUETOOTH_MAX_CONNECTED_AUDIO_DEVICES">%1$d</xliff:g>"</item>
<item msgid="5818942631838356082">"1"</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 97a9cd5..45305ec 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1248,10 +1248,8 @@
<string name="private_space_screen_lock_summary">Same as device screen lock</string>
<!-- Dialog message to choose a new lock for Private Space. [CHAR LIMIT=50] -->
<string name="private_space_new_lock_title">Choose a new lock for private space?</string>
- <!-- Title for the preference for auto lock private space. [CHAR LIMIT=40] -->
- <string name="private_space_auto_lock_title">Lock automatically</string>
- <!-- Title for private space auto lock settings page. [CHAR LIMIT=50] -->
- <string name="private_space_auto_lock_page_title">Lock private space automatically</string>
+ <!-- Title for the preference for auto lock private space and auto lock private space settings page. [CHAR LIMIT=50] -->
+ <string name="private_space_auto_lock_title">Lock private space automatically</string>
<!-- Description for private space auto lock settings page. [CHAR LIMIT=NONE] -->
<string name="private_space_auto_lock_page_summary">You can lock your private space automatically if you haven\’t used your device for a period of time</string>
<!-- Configure auto lock: Value for auto lock configuration to lock private space every time device locks. [CHAR LIMIT=40] -->
@@ -10874,6 +10872,12 @@
<!-- Title of the warning dialog for enabling the credential provider. [CHAR_LIMIT=NONE] -->
<string name="credman_enable_confirmation_message_title">Use %1$s\?</string>
+ <!-- Positive button text for disabling credential manager. [CHAR_LIMIT=30] -->
+ <string name="credman_confirmation_turn_off_positive_button">Turn off</string>
+
+ <!-- Positive button text for changing credential manager provider. [CHAR_LIMIT=30] -->
+ <string name="credman_confirmation_change_provider_positive_button">Change</string>
+
<!-- Title of the error dialog when too many credential providers are selected (new strings for 24Q3). [CHAR_LIMIT=NONE] -->
<string name="credman_limit_error_msg_title">You can only have 5 services on</string>
diff --git a/res/xml/private_space_auto_lock_settings.xml b/res/xml/private_space_auto_lock_settings.xml
index 82f6c57..ae056a4 100644
--- a/res/xml/private_space_auto_lock_settings.xml
+++ b/res/xml/private_space_auto_lock_settings.xml
@@ -17,4 +17,4 @@
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
- android:title="@string/private_space_auto_lock_page_title"/>
+ android:title="@string/private_space_auto_lock_title"/>
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
index 0bffee9..d6f5289 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPicker.java
@@ -114,6 +114,18 @@
setCancelListener(target.mCancelListener);
super.onCreate(savedInstanceState);
}
+
+ @Override
+ protected CharSequence getPositiveButtonText() {
+ final Bundle bundle = getArguments();
+ if (TextUtils.isEmpty(bundle.getString(EXTRA_KEY))) {
+ return getContext().getString(
+ R.string.credman_confirmation_turn_off_positive_button);
+ }
+
+ return getContext().getString(
+ R.string.credman_confirmation_change_provider_positive_button);
+ }
}
@Override
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index b089dd8..fda6b28 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -138,11 +138,15 @@
final Bundle bundle = getArguments();
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setMessage(bundle.getCharSequence(EXTRA_MESSAGE))
- .setPositiveButton(android.R.string.ok, this)
+ .setPositiveButton(getPositiveButtonText(), this)
.setNegativeButton(android.R.string.cancel, mCancelListener);
return builder.create();
}
+ protected CharSequence getPositiveButtonText() {
+ return getContext().getString(android.R.string.ok);
+ }
+
@Override
public void onClick(DialogInterface dialog, int which) {
final Fragment fragment = getTargetFragment();
diff --git a/src/com/android/settings/biometrics/fingerprint2/OWNERS b/src/com/android/settings/biometrics/fingerprint2/OWNERS
index c58a06d..f5fd453 100644
--- a/src/com/android/settings/biometrics/fingerprint2/OWNERS
+++ b/src/com/android/settings/biometrics/fingerprint2/OWNERS
@@ -1,3 +1,4 @@
# Owners for Biometric Fingerprint
joshmccloskey@google.com
-jbolinger@google.com
\ No newline at end of file
+jbolinger@google.com
+spdonghao@google.com
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
similarity index 96%
rename from src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
rename to src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
index c045b0e..000a477 100644
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
@@ -39,16 +39,16 @@
*
* TODO(b/313493336): Move this to systemui
*/
-interface FingerprintSensorRepo {
+interface FingerprintSensorRepository {
/** Get the [FingerprintSensor] */
val fingerprintSensor: Flow<FingerprintSensor>
}
-class FingerprintSensorRepoImpl(
+class FingerprintSensorRepositoryImpl(
fingerprintManager: FingerprintManager,
backgroundDispatcher: CoroutineDispatcher,
activityScope: CoroutineScope,
-) : FingerprintSensorRepo {
+) : FingerprintSensorRepository {
override val fingerprintSensor: Flow<FingerprintSensor> =
callbackFlow {
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
deleted file mode 100644
index 5909825..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2024 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.biometrics.fingerprint2.data.repository
-
-import android.content.Context
-import android.provider.Settings
-
-/** Interface that indicates if press to auth is on or off. */
-interface PressToAuthRepo {
- /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
- val isEnabled: Boolean
-}
-
-/** Indicates whether or not the press to auth feature is enabled. */
-class PressToAuthRepoImpl(private val context: Context) : PressToAuthRepo {
- /**
- * Gets the status of the press to auth feature.
- *
- * Returns whether or not the press to auth feature is enabled.
- */
- override val isEnabled: Boolean
- get() {
- var toReturn: Int =
- Settings.Secure.getIntForUser(
- context.contentResolver,
- Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- -1,
- context.userId,
- )
- if (toReturn == -1) {
- toReturn =
- if (
- context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
- ) {
- 1
- } else {
- 0
- }
- Settings.Secure.putIntForUser(
- context.contentResolver,
- Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
- toReturn,
- context.userId,
- )
- }
- return (toReturn == 1)
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
new file mode 100644
index 0000000..e769237
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 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.biometrics.fingerprint2.domain.interactor
+
+import android.view.accessibility.AccessibilityManager
+import androidx.lifecycle.LifecycleCoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+
+/** Represents all of the information on accessibility state. */
+interface AccessibilityInteractor {
+ /** A flow that contains whether or not accessibility is enabled */
+ val isAccessibilityEnabled: Flow<Boolean>
+}
+
+class AccessibilityInteractorImpl(
+ accessibilityManager: AccessibilityManager,
+ activityScope: LifecycleCoroutineScope
+) : AccessibilityInteractor {
+ /** A flow that contains whether or not accessibility is enabled */
+ override val isAccessibilityEnabled: Flow<Boolean> =
+ callbackFlow {
+ val listener =
+ AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
+ accessibilityManager.addAccessibilityStateChangeListener(listener)
+
+ // This clause will be called when no one is listening to the flow
+ awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
+ }
+ .stateIn(
+ activityScope, // This is going to tied to the activity scope
+ SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
+ false
+ )
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
index 1fbeb44..135a36c 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
@@ -26,8 +26,7 @@
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
@@ -57,9 +56,9 @@
applicationContext: Context,
private val backgroundDispatcher: CoroutineDispatcher,
private val fingerprintManager: FingerprintManager,
- fingerprintSensorRepo: FingerprintSensorRepo,
+ fingerprintSensorRepository: FingerprintSensorRepository,
private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
- private val pressToAuthRepo: PressToAuthRepo,
+ private val pressToAuthInteractor: PressToAuthInteractor,
private val fingerprintFlow: FingerprintFlow,
) : FingerprintManagerInteractor {
@@ -101,7 +100,7 @@
)
}
- override val sensorPropertiesInternal = fingerprintSensorRepo.fingerprintSensor
+ override val sensorPropertiesInternal = fingerprintSensorRepository.fingerprintSensor
override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
@@ -211,10 +210,6 @@
it.resume(fingerprintManager.isPowerbuttonFps)
}
- override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
- it.resume(pressToAuthRepo.isEnabled)
- }
-
override suspend fun authenticate(): FingerprintAuthAttemptModel =
suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptModel> ->
val authenticationCallback =
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt
new file mode 100644
index 0000000..0224aa2
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2024 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.content.res.Configuration
+import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
+import com.android.systemui.unfold.updates.FoldProvider
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+
+interface FoldStateInteractor {
+ /** A flow that contains the fold state info */
+ val isFolded: Flow<Boolean>
+
+ /**
+ * Indicates a configuration change has occurred, and the repo
+ * should update the [isFolded] flow.
+ */
+ fun onConfigurationChange(newConfig: Configuration)
+}
+
+/**
+ * Interactor which handles fold state
+ */
+class FoldStateInteractorImpl(context: Context) : FoldStateInteractor {
+ private val screenSizeFoldProvider = ScreenSizeFoldProvider(context)
+ override val isFolded: Flow<Boolean> = callbackFlow {
+ val foldStateListener = FoldProvider.FoldCallback { isFolded -> trySend(isFolded) }
+ screenSizeFoldProvider.registerCallback(foldStateListener, context.mainExecutor)
+ awaitClose { screenSizeFoldProvider.unregisterCallback(foldStateListener) }
+ }
+
+ /**
+ * This function is called by the root activity, indicating an orientation event has occurred.
+ * When this happens, the [ScreenSizeFoldProvider] is notified and it will re-compute if the
+ * device is folded or not, and notify the [FoldProvider.FoldCallback]
+ */
+ override fun onConfigurationChange(newConfig: Configuration) {
+ screenSizeFoldProvider.onConfigurationChange(newConfig)
+ }
+
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
new file mode 100644
index 0000000..968203f
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2024 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.view.OrientationEventListener
+import com.android.internal.R
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+
+/**
+ * Interactor which provides information about orientation
+ */
+interface OrientationInteractor {
+ /** A flow that contains the information about the orientation changing */
+ val orientation: Flow<Int>
+ /** A flow that contains the rotation info */
+ val rotation: Flow<Int>
+ /**
+ * A Helper function that computes rotation if device is in
+ * [R.bool.config_reverseDefaultConfigRotation]
+ */
+ fun getRotationFromDefault(rotation: Int): Int
+}
+
+class OrientationInteractorImpl(private val context: Context, activityScope: CoroutineScope) :
+ OrientationInteractor {
+
+ override val orientation: Flow<Int> = callbackFlow {
+ val orientationEventListener =
+ object : OrientationEventListener(context) {
+ override fun onOrientationChanged(orientation: Int) {
+ trySend(orientation)
+ }
+ }
+ orientationEventListener.enable()
+ awaitClose { orientationEventListener.disable() }
+ }
+
+ override val rotation: Flow<Int> =
+ callbackFlow {
+ val orientationEventListener =
+ object : OrientationEventListener(context) {
+ override fun onOrientationChanged(orientation: Int) {
+ trySend(getRotationFromDefault(context.display!!.rotation))
+ }
+ }
+ orientationEventListener.enable()
+ awaitClose { orientationEventListener.disable() }
+ }
+ .stateIn(
+ activityScope, // This is tied to the activity scope
+ SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
+ context.display!!.rotation,
+ )
+
+ override fun getRotationFromDefault(rotation: Int): Int {
+ val isReverseDefaultRotation =
+ context.resources.getBoolean(R.bool.config_reverseDefaultRotation)
+ return if (isReverseDefaultRotation) {
+ (rotation + 1) % 4
+ } else {
+ rotation
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt
new file mode 100644
index 0000000..ab7b5de
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2024 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.database.ContentObserver
+import android.provider.Settings
+import android.util.Log
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.flowOn
+
+/** Interface that indicates if press to auth is on or off. */
+interface PressToAuthInteractor {
+ /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
+ val isEnabled: Flow<Boolean>
+}
+
+/** Indicates whether or not the press to auth feature is enabled. */
+class PressToAuthInteractorImpl(
+ private val context: Context,
+ private val backgroundDispatcher: CoroutineDispatcher,
+) : PressToAuthInteractor {
+
+ /**
+ * A flow that contains the status of the press to auth feature.
+ */
+ override val isEnabled: Flow<Boolean> =
+
+ callbackFlow {
+ val callback =
+ object : ContentObserver(null) {
+ override fun onChange(selfChange: Boolean) {
+ Log.d(TAG, "SFPS_PERFORMANT_AUTH_ENABLED#onchange")
+ trySend(
+ getPressToAuth(),
+ )
+ }
+ }
+
+ context.contentResolver.registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED),
+ false,
+ callback,
+ context.userId
+ )
+ trySend(getPressToAuth())
+ awaitClose {
+ context.contentResolver.unregisterContentObserver(callback)
+ }
+ }.flowOn(backgroundDispatcher)
+
+
+ /**
+ * Returns true if press to auth is enabled
+ */
+ private fun getPressToAuth(): Boolean {
+ var toReturn: Int =
+ Settings.Secure.getIntForUser(
+ context.contentResolver,
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ -1,
+ context.userId,
+ )
+ if (toReturn == -1) {
+ toReturn =
+ if (
+ context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
+ ) {
+ 1
+ } else {
+ 0
+ }
+ Settings.Secure.putIntForUser(
+ context.contentResolver,
+ Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+ toReturn,
+ context.userId,
+ )
+ }
+ return toReturn == 1
+
+ }
+
+ companion object {
+ const val TAG = "PressToAuthInteractor"
+ }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
index 145f3d6..9f753b2 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/Android.bp
@@ -2,13 +2,17 @@
// unit/robo/screenshot etc.
//
// This library shouldn't have many dependencies.
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_library {
name: "FingerprintManagerInteractor",
srcs: [
- "**/*.kt"
+ "**/*.kt",
],
static_libs: [
- "BiometricsSharedLib",
- "kotlinx-coroutines-android",
+ "BiometricsSharedLib",
+ "kotlinx-coroutines-android",
],
-}
\ No newline at end of file
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
index 6e6df23..c0e1b4a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
@@ -75,7 +75,4 @@
/** Indicates if the device has side fingerprint */
suspend fun hasSideFps(): Boolean
-
- /** Indicates if the press to auth feature has been enabled */
- suspend fun pressToAuthEnabled(): Boolean
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index f7e6135..9f3935b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -30,16 +30,20 @@
import androidx.lifecycle.lifecycleScope
import com.android.internal.widget.LockPatternUtils
import com.android.settings.R
-import com.android.settings.SettingsApplication
import com.android.settings.SetupWizardUtils
import com.android.settings.Utils.SETTINGS_PACKAGE_NAME
import com.android.settings.biometrics.BiometricEnrollBase
import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST
import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED
import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractorImpl
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractorImpl
import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment
@@ -48,7 +52,6 @@
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
@@ -66,9 +69,7 @@
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.password.ChooseLockGeneric
import com.android.settings.password.ChooseLockSettingsHelper
import com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE
@@ -90,9 +91,8 @@
private lateinit var navigationViewModel: FingerprintNavigationViewModel
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
- private lateinit var accessibilityViewModel: AccessibilityViewModel
- private lateinit var foldStateViewModel: FoldStateViewModel
- private lateinit var orientationStateViewModel: OrientationStateViewModel
+ private lateinit var foldStateInteractor: FoldStateInteractor
+ private lateinit var orientationInteractor: OrientationInteractor
private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
private lateinit var backgroundViewModel: BackgroundViewModel
private lateinit var fingerprintFlowViewModel: FingerprintFlowViewModel
@@ -127,7 +127,7 @@
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
- foldStateViewModel.onConfigurationChange(newConfig)
+ foldStateInteractor.onConfigurationChange(newConfig)
}
private fun onConfirmDevice(resultCode: Int, data: Intent?) {
@@ -179,7 +179,8 @@
FingerprintFlowViewModel::class.java]
val fingerprintSensorRepo =
- FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+ FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+ val pressToAuthInteractor = PressToAuthInteractorImpl(context, backgroundDispatcher)
val fingerprintManagerInteractor =
FingerprintManagerInteractorImpl(
@@ -188,7 +189,7 @@
fingerprintManager,
fingerprintSensorRepo,
GatekeeperPasswordProvider(LockPatternUtils(context)),
- PressToAuthRepoImpl(context),
+ pressToAuthInteractor,
enrollType,
)
@@ -198,6 +199,12 @@
val hasConfirmedDeviceCredential = gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo
+ val accessibilityInteractor =
+ AccessibilityInteractorImpl(
+ getSystemService(AccessibilityManager::class.java)!!,
+ lifecycleScope,
+ )
+
navigationViewModel =
ViewModelProvider(
this,
@@ -228,10 +235,10 @@
)[FingerprintGatekeeperViewModel::class.java]
// Initialize FoldStateViewModel
- foldStateViewModel =
- ViewModelProvider(this, FoldStateViewModel.FoldStateViewModelFactory(context))[
- FoldStateViewModel::class.java]
- foldStateViewModel.onConfigurationChange(resources.configuration)
+ foldStateInteractor = FoldStateInteractorImpl(context)
+ foldStateInteractor.onConfigurationChange(resources.configuration)
+
+ orientationInteractor = OrientationInteractorImpl(context, lifecycleScope)
// Initialize FingerprintViewModel
fingerprintEnrollViewModel =
@@ -249,20 +256,6 @@
ViewModelProvider(this, FingerprintScrollViewModel.FingerprintScrollViewModelFactory())[
FingerprintScrollViewModel::class.java]
- // Initialize AccessibilityViewModel
- accessibilityViewModel =
- ViewModelProvider(
- this,
- AccessibilityViewModel.AccessibilityViewModelFactory(
- getSystemService(AccessibilityManager::class.java)!!
- ),
- )[AccessibilityViewModel::class.java]
-
- // Initialize OrientationViewModel
- orientationStateViewModel =
- ViewModelProvider(this, OrientationStateViewModel.OrientationViewModelFactory(context))[
- OrientationStateViewModel::class.java]
-
// Initialize FingerprintEnrollEnrollingViewModel
fingerprintEnrollEnrollingViewModel =
ViewModelProvider(
@@ -281,18 +274,24 @@
fingerprintEnrollViewModel,
gatekeeperViewModel,
backgroundViewModel,
- accessibilityViewModel,
- foldStateViewModel,
- orientationStateViewModel,
+ accessibilityInteractor,
+ foldStateInteractor,
+ orientationInteractor,
fingerprintFlowViewModel,
+ fingerprintManagerInteractor,
),
)[FingerprintEnrollFindSensorViewModel::class.java]
// Initialize RFPS View Model
ViewModelProvider(
this,
- RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel, navigationViewModel),
+ RFPSViewModel.RFPSViewModelFactory(
+ fingerprintEnrollEnrollingViewModel,
+ navigationViewModel,
+ orientationInteractor,
+ ),
)[RFPSViewModel::class.java]
+
lifecycleScope.launch {
navigationViewModel.currentStep.collect { step ->
if (step is Init) {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
index 9603e6b..2b1ff9b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
@@ -22,6 +22,7 @@
import android.view.Surface
import android.view.View
import android.view.ViewGroup
+import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
@@ -30,7 +31,6 @@
import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog
import com.android.settings.biometrics.fingerprint.FingerprintFindSensorAnimation
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
@@ -51,12 +51,31 @@
* will work.
*/
class FingerprintEnrollFindSensorV2Fragment(val sensorType: FingerprintSensorType) : Fragment() {
+ /** Used for testing purposes */
+ private var factory: ViewModelProvider.Factory? = null
+
+ @VisibleForTesting
+ constructor(
+ sensorType: FingerprintSensorType,
+ theFactory: ViewModelProvider.Factory,
+ ) : this(sensorType) {
+ factory = theFactory
+ }
+
+ private val viewModelProvider: ViewModelProvider by lazy {
+ if (factory != null) {
+ ViewModelProvider(requireActivity(), factory!!)
+ } else {
+ ViewModelProvider(requireActivity())
+ }
+ }
+
// This is only for non-udfps or non-sfps sensor. For udfps and sfps, we show lottie.
private var animation: FingerprintFindSensorAnimation? = null
private var contentLayoutId: Int = -1
private val viewModel: FingerprintEnrollFindSensorViewModel by lazy {
- ViewModelProvider(requireActivity())[FingerprintEnrollFindSensorViewModel::class.java]
+ viewModelProvider[FingerprintEnrollFindSensorViewModel::class.java]
}
override fun onCreateView(
@@ -65,9 +84,6 @@
savedInstanceState: Bundle?,
): View? {
- val sensorType =
- ViewModelProvider(requireActivity())[FingerprintEnrollViewModel::class.java].sensorTypeCached
-
contentLayoutId =
when (sensorType) {
FingerprintSensorType.UDFPS_OPTICAL,
@@ -76,46 +92,43 @@
else -> R.layout.fingerprint_v2_enroll_find_sensor
}
- return inflater.inflate(contentLayoutId, container, false).also { it ->
- val view = it!! as GlifLayout
+ val view = inflater.inflate(contentLayoutId, container, false)!! as GlifLayout
+ setTexts(sensorType, view)
- // Set up header and description
- lifecycleScope.launch { viewModel.sensorType.collect { setTexts(it, view) } }
+ // Set up footer bar
+ val footerBarMixin = view.getMixin(FooterBarMixin::class.java)
+ setupSecondaryButton(footerBarMixin)
+ lifecycleScope.launch {
+ viewModel.showPrimaryButton.collect { setupPrimaryButton(footerBarMixin) }
+ }
- // Set up footer bar
- val footerBarMixin = view.getMixin(FooterBarMixin::class.java)
- setupSecondaryButton(footerBarMixin)
- lifecycleScope.launch {
- viewModel.showPrimaryButton.collect { setupPrimaryButton(footerBarMixin) }
- }
-
- // Set up lottie or animation
- lifecycleScope.launch {
- viewModel.sfpsLottieInfo.collect { (isFolded, rotation) ->
- setupLottie(view, getSfpsIllustrationLottieAnimation(isFolded, rotation))
- }
- }
- lifecycleScope.launch {
- viewModel.udfpsLottieInfo.collect { isAccessibilityEnabled ->
- val lottieAnimation =
- if (isAccessibilityEnabled) R.raw.udfps_edu_a11y_lottie else R.raw.udfps_edu_lottie
- setupLottie(view, lottieAnimation) { viewModel.proceedToEnrolling() }
- }
- }
- lifecycleScope.launch {
- viewModel.showRfpsAnimation.collect {
- animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
- animation!!.startAnimation()
- }
- }
-
- lifecycleScope.launch {
- viewModel.showErrorDialog.collect { (errMsgId, isSetup) ->
- // TODO: Covert error dialog kotlin as well
- FingerprintErrorDialog.showErrorDialog(requireActivity(), errMsgId, isSetup)
- }
+ // Set up lottie or animation
+ lifecycleScope.launch {
+ viewModel.sfpsLottieInfo.collect { (isFolded, rotation) ->
+ setupLottie(view, getSfpsIllustrationLottieAnimation(isFolded, rotation))
}
}
+ lifecycleScope.launch {
+ viewModel.udfpsLottieInfo.collect { isAccessibilityEnabled ->
+ val lottieAnimation =
+ if (isAccessibilityEnabled) R.raw.udfps_edu_a11y_lottie else R.raw.udfps_edu_lottie
+ setupLottie(view, lottieAnimation) { viewModel.proceedToEnrolling() }
+ }
+ }
+ lifecycleScope.launch {
+ viewModel.showRfpsAnimation.collect {
+ animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
+ animation!!.startAnimation()
+ }
+ }
+
+ lifecycleScope.launch {
+ viewModel.showErrorDialog.collect { (errMsgId, isSetup) ->
+ // TODO: Covert error dialog kotlin as well
+ FingerprintErrorDialog.showErrorDialog(requireActivity(), errMsgId, isSetup)
+ }
+ }
+ return view
}
override fun onDestroy() {
@@ -158,7 +171,7 @@
illustrationLottie?.visibility = View.VISIBLE
}
- private fun setTexts(sensorType: FingerprintSensorType, view: GlifLayout) {
+ private fun setTexts(sensorType: FingerprintSensorType?, view: GlifLayout) {
when (sensorType) {
FingerprintSensorType.UDFPS_OPTICAL,
FingerprintSensorType.UDFPS_ULTRASONIC -> {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
index c6e284a..a9cd16f 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
@@ -26,12 +26,14 @@
import android.view.animation.AnimationUtils
import android.view.animation.Interpolator
import android.widget.TextView
+import androidx.annotation.VisibleForTesting
import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.android.settings.R
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
@@ -41,18 +43,34 @@
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.core.instrumentation.InstrumentedDialogFragment
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
import com.google.android.setupdesign.GlifLayout
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.launch
/** This fragment is responsible for taking care of rear fingerprint enrollment. */
-class RFPSEnrollFragment : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
+class RFPSEnrollFragment() : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
+
+ /** Used for testing purposes */
+ private var factory: ViewModelProvider.Factory? = null
+
+ @VisibleForTesting
+ constructor(theFactory: ViewModelProvider.Factory) : this() {
+ factory = theFactory
+ }
+
+ private val viewModelProvider: ViewModelProvider by lazy {
+ if (factory != null) {
+ ViewModelProvider(requireActivity(), factory!!)
+ } else {
+ ViewModelProvider(requireActivity())
+ }
+ }
private lateinit var linearOutSlowInInterpolator: Interpolator
private lateinit var fastOutLinearInInterpolator: Interpolator
@@ -60,24 +78,14 @@
private lateinit var progressBar: RFPSProgressBar
private val iconTouchViewModel: RFPSIconTouchViewModel by lazy {
- ViewModelProvider(requireActivity())[RFPSIconTouchViewModel::class.java]
+ viewModelProvider[RFPSIconTouchViewModel::class.java]
}
- private val orientationViewModel: OrientationStateViewModel by lazy {
- ViewModelProvider(requireActivity())[OrientationStateViewModel::class.java]
- }
-
- private val rfpsViewModel: RFPSViewModel by lazy {
- ViewModelProvider(requireActivity())[RFPSViewModel::class.java]
- }
+ private val rfpsViewModel: RFPSViewModel by lazy { viewModelProvider[RFPSViewModel::class.java] }
private val backgroundViewModel: BackgroundViewModel by lazy {
- ViewModelProvider(requireActivity())[BackgroundViewModel::class.java]
+ viewModelProvider[BackgroundViewModel::class.java]
}
- private val navigationViewModel: FingerprintNavigationViewModel by lazy {
- ViewModelProvider(requireActivity())[FingerprintNavigationViewModel::class.java]
- }
-
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
@@ -115,9 +123,8 @@
true
}
- // On any orientation event, dismiss dialogs.
viewLifecycleOwner.lifecycleScope.launch {
- orientationViewModel.orientation.collect { dismissDialogs() }
+ rfpsViewModel.shouldDismissDialog.collect { dismissDialogs() }
}
// Signal we are ready for enrollment.
@@ -127,6 +134,8 @@
repeatOnLifecycle(Lifecycle.State.RESUMED) {
// Icon animation update
viewLifecycleOwner.lifecycleScope.launch {
+ // TODO(b/324427704): Fix this delay
+ delay(100)
rfpsViewModel.shouldAnimateIcon.collect { animate ->
progressBar.updateIconAnimation(animate)
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
index 99250e6..2408a88 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -19,6 +19,7 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
@@ -39,10 +40,11 @@
class RFPSViewModel(
private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
private val navigationViewModel: FingerprintNavigationViewModel,
+ orientationInteractor: OrientationInteractor,
) : ViewModel() {
- /** Value to indicate if the text view is visible or not */
private val _textViewIsVisible = MutableStateFlow<Boolean>(false)
+ /** Value to indicate if the text view is visible or not */
val textViewIsVisible: Flow<Boolean> = _textViewIsVisible.asStateFlow()
/** Indicates if the icon should be animating or not */
@@ -78,8 +80,12 @@
.filterIsInstance<FingerEnrollState.EnrollError>()
.shareIn(viewModelScope, SharingStarted.Eagerly, 0)
+ /** Indicates that enrollment was completed. */
val didCompleteEnrollment: Flow<Boolean> = progress.filterNotNull().map { it.remainingSteps == 0 }
+ /** Indicates if the fragment should dismiss a dialog if one was shown. */
+ val shouldDismissDialog = orientationInteractor.orientation.map { true }
+
/** Indicates if the consumer is ready for enrollment */
fun readyForEnrollment() {
fingerprintEnrollViewModel.canEnroll()
@@ -90,6 +96,7 @@
fingerprintEnrollViewModel.stopEnroll()
}
+ /** Set the visibility of the text view */
fun setVisibility(isVisible: Boolean) {
_textViewIsVisible.update { isVisible }
}
@@ -122,6 +129,7 @@
)
}
+ /** Indicates that enrollment has been finished and we can proceed to the next step. */
fun finishedSuccessfully() {
navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#progressFinished")
}
@@ -129,11 +137,17 @@
class RFPSViewModelFactory(
private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
private val navigationViewModel: FingerprintNavigationViewModel,
+ private val orientationInteractor: OrientationInteractor,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
- return RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel) as T
+ return RFPSViewModel(
+ fingerprintEnrollEnrollingViewModel,
+ navigationViewModel,
+ orientationInteractor,
+ )
+ as T
}
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
index fe62681..5a6fc14 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
@@ -24,14 +24,14 @@
import android.graphics.drawable.Drawable
import android.graphics.drawable.LayerDrawable
import android.util.AttributeSet
+import android.util.Log
import android.view.animation.AnimationUtils
import android.view.animation.Interpolator
import com.android.settings.R
import com.android.settings.widget.RingProgressBar
/** Progress bar for rear fingerprint enrollment. */
-class RFPSProgressBar(context: Context, attributeSet: AttributeSet) :
- RingProgressBar(context, attributeSet) {
+class RFPSProgressBar : RingProgressBar {
private val fastOutSlowInInterpolator: Interpolator
@@ -42,9 +42,9 @@
private var progressAnimation: ObjectAnimator? = null
- private var shouldAnimateInternal: Boolean = true
+ private var shouldAnimateInternal: Boolean = false
- init {
+ constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
val fingerprintDrawable = background as LayerDrawable
iconAnimationDrawable =
fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation)
@@ -52,10 +52,8 @@
iconBackgroundBlinksDrawable =
fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background)
as AnimatedVectorDrawable
-
fastOutSlowInInterpolator =
AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in)
-
iconAnimationDrawable.registerAnimationCallback(
object : Animatable2.AnimationCallback() {
override fun onAnimationEnd(drawable: Drawable?) {
@@ -66,7 +64,6 @@
}
}
)
- animateIconAnimationInternal()
progressBackgroundTintMode = PorterDuff.Mode.SRC
@@ -85,8 +82,8 @@
}
shouldAnimateInternal = shouldAnimate
- }
+ }
/** This function should only be called when actual progress has been made. */
fun updateProgress(percentComplete: Float) {
val progress = maxProgress - (percentComplete.coerceIn(0.0f, 100.0f) * maxProgress).toInt()
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
deleted file mode 100644
index 608b370..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.view.accessibility.AccessibilityManager
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.stateIn
-
-/** Represents all of the information on accessibility state. */
-class AccessibilityViewModel(accessibilityManager: AccessibilityManager) : ViewModel() {
- /** A flow that contains whether or not accessibility is enabled */
- val isAccessibilityEnabled: Flow<Boolean> =
- callbackFlow {
- val listener =
- AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
- accessibilityManager.addAccessibilityStateChangeListener(listener)
-
- // This clause will be called when no one is listening to the flow
- awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
- }
- .stateIn(
- viewModelScope, // This is going to tied to the view model scope
- SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
- false,
- )
-
- class AccessibilityViewModelFactory(private val accessibilityManager: AccessibilityManager) :
- ViewModelProvider.Factory {
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(modelClass: Class<T>): T {
- return AccessibilityViewModel(accessibilityManager) as T
- }
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
index 92261b1..3bf806b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
@@ -19,6 +19,10 @@
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
@@ -26,13 +30,11 @@
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.combineTransform
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.filterNotNull
import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.shareIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@@ -42,19 +44,16 @@
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
backgroundViewModel: BackgroundViewModel,
- accessibilityViewModel: AccessibilityViewModel,
- foldStateViewModel: FoldStateViewModel,
- orientationStateViewModel: OrientationStateViewModel,
+ accessibilityInteractor: AccessibilityInteractor,
+ foldStateInteractor: FoldStateInteractor,
+ orientationInteractor: OrientationInteractor,
fingerprintFlowViewModel: FingerprintFlowViewModel,
+ fingerprintManagerInteractor: FingerprintManagerInteractor,
) : ViewModel() {
/** Represents the stream of sensor type. */
val sensorType: Flow<FingerprintSensorType> =
- fingerprintEnrollViewModel.sensorType.shareIn(
- viewModelScope,
- SharingStarted.WhileSubscribed(),
- 1,
- )
+ fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
private val _isUdfps: Flow<Boolean> =
sensorType.map {
it == FingerprintSensorType.UDFPS_OPTICAL || it == FingerprintSensorType.UDFPS_ULTRASONIC
@@ -70,8 +69,8 @@
val sfpsLottieInfo: Flow<Pair<Boolean, Int>> =
combineTransform(
_showSfpsLottie,
- foldStateViewModel.isFolded,
- orientationStateViewModel.rotation,
+ foldStateInteractor.isFolded,
+ orientationInteractor.rotation,
) { _, isFolded, rotation ->
emit(Pair(isFolded, rotation))
}
@@ -79,7 +78,7 @@
private val _showUdfpsLottie = _isUdfps.filter { it }
/** Represents the stream of showing udfps lottie and whether accessibility is enabled. */
val udfpsLottieInfo: Flow<Boolean> =
- _showUdfpsLottie.combine(accessibilityViewModel.isAccessibilityEnabled) {
+ _showUdfpsLottie.combine(accessibilityInteractor.isAccessibilityEnabled) {
_,
isAccessibilityEnabled ->
isAccessibilityEnabled
@@ -104,7 +103,7 @@
// Start or end enroll flow
viewModelScope.launch {
combine(
- fingerprintEnrollViewModel.sensorType,
+ sensorType,
gatekeeperViewModel.hasValidGatekeeperInfo,
gatekeeperViewModel.gatekeeperInfo,
navigationViewModel.currentScreen,
@@ -188,10 +187,11 @@
private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
private val backgroundViewModel: BackgroundViewModel,
- private val accessibilityViewModel: AccessibilityViewModel,
- private val foldStateViewModel: FoldStateViewModel,
- private val orientationStateViewModel: OrientationStateViewModel,
+ private val accessibilityInteractor: AccessibilityInteractor,
+ private val foldStateInteractor: FoldStateInteractor,
+ private val orientationInteractor: OrientationInteractor,
private val fingerprintFlowViewModel: FingerprintFlowViewModel,
+ private val fingerprintManagerInteractor: FingerprintManagerInteractor,
) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel> create(modelClass: Class<T>): T {
@@ -200,10 +200,11 @@
fingerprintEnrollViewModel,
gatekeeperViewModel,
backgroundViewModel,
- accessibilityViewModel,
- foldStateViewModel,
- orientationStateViewModel,
+ accessibilityInteractor,
+ foldStateInteractor,
+ orientationInteractor,
fingerprintFlowViewModel,
+ fingerprintManagerInteractor,
)
as T
}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
index c2cff5e..c27808d 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -56,7 +56,7 @@
}
/** Represents the stream of [FingerprintSensorType] */
- val sensorType: Flow<FingerprintSensorType> =
+ val sensorType: Flow<FingerprintSensorType?> =
fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
/**
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
deleted file mode 100644
index 94a70b0..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.content.Context
-import android.content.res.Configuration
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
-import com.android.systemui.unfold.updates.FoldProvider
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.callbackFlow
-
-/** Represents all of the information on fold state. */
-class FoldStateViewModel(context: Context) : ViewModel() {
-
- private val screenSizeFoldProvider = ScreenSizeFoldProvider(context)
-
- /** A flow that contains the fold state info */
- val isFolded: Flow<Boolean> = callbackFlow {
- val foldStateListener =
- object : FoldProvider.FoldCallback {
- override fun onFoldUpdated(isFolded: Boolean) {
- trySend(isFolded)
- }
- }
- screenSizeFoldProvider.registerCallback(foldStateListener, context.mainExecutor)
- awaitClose { screenSizeFoldProvider.unregisterCallback(foldStateListener) }
- }
-
- fun onConfigurationChange(newConfig: Configuration) {
- screenSizeFoldProvider.onConfigurationChange(newConfig)
- }
-
- class FoldStateViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(modelClass: Class<T>): T {
- return FoldStateViewModel(context) as T
- }
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
deleted file mode 100644
index dd266e1..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.content.Context
-import android.view.OrientationEventListener
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.internal.R
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.stateIn
-
-/** Represents all of the information on orientation state and rotation state. */
-class OrientationStateViewModel(private val context: Context) : ViewModel() {
-
- /** A flow that contains the orientation info */
- val orientation: Flow<Int> = callbackFlow {
- val orientationEventListener =
- object : OrientationEventListener(context) {
- override fun onOrientationChanged(orientation: Int) {
- trySend(orientation)
- }
- }
- orientationEventListener.enable()
- awaitClose { orientationEventListener.disable() }
- }
-
- /** A flow that contains the rotation info */
- val rotation: Flow<Int> =
- callbackFlow {
- val orientationEventListener =
- object : OrientationEventListener(context) {
- override fun onOrientationChanged(orientation: Int) {
- trySend(getRotationFromDefault(context.display!!.rotation))
- }
- }
- orientationEventListener.enable()
- awaitClose { orientationEventListener.disable() }
- }
- .stateIn(
- viewModelScope, // This is going to tied to the view model scope
- SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
- context.display!!.rotation,
- )
-
- fun getRotationFromDefault(rotation: Int): Int {
- val isReverseDefaultRotation =
- context.resources.getBoolean(R.bool.config_reverseDefaultRotation)
- return if (isReverseDefaultRotation) {
- (rotation + 1) % 4
- } else {
- rotation
- }
- }
-
- class OrientationViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(modelClass: Class<T>): T {
- return OrientationStateViewModel(context) as T
- }
- }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index 05bb329..a5f2021 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -45,8 +45,8 @@
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling
import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractorImpl
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
@@ -220,7 +220,8 @@
toReturn == 1
}
val fingerprintSensorProvider =
- FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+ FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+ val pressToAuthInteractor = PressToAuthInteractorImpl(context, backgroundDispatcher)
val interactor =
FingerprintManagerInteractorImpl(
@@ -229,7 +230,7 @@
fingerprintManager,
fingerprintSensorProvider,
GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)),
- PressToAuthRepoImpl(context),
+ pressToAuthInteractor,
Settings,
)
diff --git a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
index 74c39b6..c5b29f3 100644
--- a/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
+++ b/src/com/android/settings/bluetooth/BluetoothNameDialogFragment.java
@@ -132,7 +132,7 @@
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
- if (actionId == EditorInfo.IME_ACTION_DONE) {
+ if (actionId == EditorInfo.IME_ACTION_DONE || actionId == EditorInfo.IME_NULL) {
setDeviceName(v.getText().toString());
if (mAlertDialog != null && mAlertDialog.isShowing()) {
mAlertDialog.dismiss();
diff --git a/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
index 6fe56c8..e627f81 100644
--- a/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
+++ b/src/com/android/settings/development/SensitiveContentProtectionPreferenceController.kt
@@ -16,11 +16,11 @@
package com.android.settings.development
import android.content.Context
+import android.permission.flags.Flags.sensitiveNotificationAppProtection
import android.provider.Settings
import androidx.annotation.VisibleForTesting
import androidx.preference.Preference
import androidx.preference.TwoStatePreference
-import com.android.server.notification.Flags.sensitiveNotificationAppProtection
import com.android.server.notification.Flags.screenshareNotificationHiding
import com.android.settings.core.PreferenceControllerMixin
import com.android.settingslib.development.DeveloperOptionsPreferenceController
diff --git a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
index 49ed63c..b77d5eb 100644
--- a/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
+++ b/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManager.java
@@ -37,13 +37,14 @@
import java.util.Set;
/** A class to dynamically manage per apps {@link NetworkPolicyManager} POLICY_ flags. */
-public final class DynamicDenylistManager {
+public class DynamicDenylistManager {
private static final String TAG = "DynamicDenylistManager";
private static final String PREF_KEY_MANUAL_DENY = "manual_denylist_preference";
private static final String PREF_KEY_DYNAMIC_DENY = "dynamic_denylist_preference";
- private static DynamicDenylistManager sInstance;
+ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+ public static DynamicDenylistManager sInstance = null;
private final Context mContext;
private final NetworkPolicyManager mNetworkPolicyManager;
@@ -115,7 +116,11 @@
final ArraySet<Integer> failedUids = new ArraySet<>();
synchronized (mLock) {
// Set new added UIDs into REJECT policy.
- for (int uid : denylistTargetUids) {
+ for (Integer uidInteger : denylistTargetUids) {
+ if (uidInteger == null) {
+ continue;
+ }
+ final int uid = uidInteger.intValue();
if (!lastDynamicDenylistUids.contains(uid)) {
try {
mNetworkPolicyManager.setUidPolicy(uid, POLICY_REJECT_METERED_BACKGROUND);
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS
new file mode 100644
index 0000000..9f0a21a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS
@@ -0,0 +1 @@
+include /src/com/android/settings/biometrics/fingerprint2/OWNERS
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothNameDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothNameDialogFragmentTest.java
index c3956d3..376c7ed 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothNameDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothNameDialogFragmentTest.java
@@ -33,6 +33,8 @@
private TestBluetoothNameDialogFragment mBluetoothNameDialogFragment;
private TextView mTextView;
+ private static final String NAME_FOR_TEST = "test_device_name";
+
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -51,12 +53,24 @@
null)).isTrue();
}
+ @Test
+ public void onEditorAction_ImeNull_setsDeviceName() {
+
+
+ mTextView.setText(NAME_FOR_TEST);
+ assertThat(
+ mBluetoothNameDialogFragment.onEditorAction(mTextView, EditorInfo.IME_NULL,
+ null)).isTrue();
+ assertThat(mBluetoothNameDialogFragment.getDeviceName()).isEqualTo(NAME_FOR_TEST);
+ }
/**
* Test fragment for {@link BluetoothNameDialogFragment} to test common methods
*/
public static class TestBluetoothNameDialogFragment extends BluetoothNameDialogFragment {
+ private String mName;
+
@Override
protected int getDialogTitle() {
return 0;
@@ -64,12 +78,12 @@
@Override
protected String getDeviceName() {
- return null;
+ return mName;
}
@Override
protected void setDeviceName(String deviceName) {
-
+ mName = deviceName;
}
@Override
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
index 135be4b..6c96f85 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java
@@ -108,6 +108,9 @@
MockitoAnnotations.initMocks(this);
mContext = spy(ApplicationProvider.getApplicationContext());
+ final var spiedResources = spy(mContext.getResources());
+ when(mContext.getResources()).thenReturn(spiedResources);
+
PreferenceManager preferenceManager = new PreferenceManager(mContext);
mScreen = preferenceManager.createPreferenceScreen(mContext);
mPreferenceContainer = new PreferenceCategory(mContext);
@@ -144,6 +147,9 @@
when(mInputDevice.hasKeys(KEYCODE_STYLUS_BUTTON_TAIL)).thenReturn(
new boolean[]{true});
+ when(spiedResources.getBoolean(
+ com.android.internal.R.bool.config_enableStylusPointerIcon)).thenReturn(true);
+
mController = new StylusDevicesController(mContext, mInputDevice, null, mLifecycle);
}
@@ -237,7 +243,7 @@
Preference handwritingPref = mPreferenceContainer.getPreference(0);
Preference buttonPref = mPreferenceContainer.getPreference(1);
- assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(2);
+ assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3);
assertThat(handwritingPref.getTitle().toString()).isEqualTo(
mContext.getString(R.string.stylus_textfield_handwriting));
assertThat(handwritingPref.isVisible()).isTrue();
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
index 0e6f6aa..d642b30 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/datasaver/DynamicDenylistManagerTest.java
@@ -177,8 +177,11 @@
@Test
public void setDenylist_uidDeniedAlready_doNothing() {
initDynamicDenylistManager(new int[] {FAKE_UID_1_INT});
+ final ArraySet uids = new ArraySet<>();
+ uids.add(FAKE_UID_1_INT);
+ uids.add(null);
- setDenylist(new ArraySet<>(List.of(FAKE_UID_1_INT)));
+ setDenylist(uids);
verify(mNetworkPolicyManager, never()).setUidPolicy(anyInt(), anyInt());
}
diff --git a/tests/screenshot/Android.bp b/tests/screenshot/Android.bp
index 5989381..5130fe5 100644
--- a/tests/screenshot/Android.bp
+++ b/tests/screenshot/Android.bp
@@ -13,6 +13,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_app {
name: "ScreenshotTestStub",
defaults: [
diff --git a/tests/screenshot/AndroidManifest.xml b/tests/screenshot/AndroidManifest.xml
index 6c8bb88..9273270 100644
--- a/tests/screenshot/AndroidManifest.xml
+++ b/tests/screenshot/AndroidManifest.xml
@@ -23,6 +23,8 @@
<application>
<activity android:name="com.android.settings.test.screenshot.ContainerActivity" android:exported="true" />
+ <activity android:name="platform.test.screenshot.FragmentScreenshotActivity" android:exported="true"
+ android:theme="@style/GlifTheme.Light" />
</application>
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png b/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png
new file mode 100644
index 0000000..1299f2a
--- /dev/null
+++ b/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png
Binary files differ
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png b/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png
new file mode 100644
index 0000000..a252e5e
--- /dev/null
+++ b/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png
Binary files differ
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_intro.png b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
index 308ab55..3cd9f4a 100644
--- a/tests/screenshot/assets/robolectric/fp_enroll_intro.png
+++ b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
Binary files differ
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
deleted file mode 100644
index 493a669..0000000
--- a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2023 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.tests.screenshot
-
-import android.content.Context
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.testing.FragmentScenario
-import androidx.fragment.app.testing.launchFragmentInContainer
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.lib.model.Default
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.testutils2.FakeFingerprintManagerInteractor
-import com.android.systemui.biometrics.shared.model.FingerprintSensor
-import com.android.systemui.biometrics.shared.model.FingerprintSensorType
-import com.android.systemui.biometrics.shared.model.SensorStrength
-import kotlinx.coroutines.test.StandardTestDispatcher
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import platform.test.screenshot.GoldenImagePathManager
-import platform.test.screenshot.ScreenshotTestRule
-import platform.test.screenshot.matchers.MSSIMMatcher
-
-@RunWith(AndroidJUnit4::class)
-class BasicScreenshotTest {
- @Rule
- @JvmField
- var rule: ScreenshotTestRule =
- ScreenshotTestRule(
- GoldenImagePathManager(
- InstrumentationRegistry.getInstrumentation().getContext(),
- InstrumentationRegistry.getInstrumentation()
- .getTargetContext()
- .getFilesDir()
- .getAbsolutePath() + "/settings_screenshots",
- )
- )
-
- private var context: Context = ApplicationProvider.getApplicationContext()
- private var interactor = FakeFingerprintManagerInteractor()
-
- private val gatekeeperViewModel =
- FingerprintGatekeeperViewModel(
- GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
- interactor,
- )
-
- private val backgroundDispatcher = StandardTestDispatcher()
- private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
- private val fingerprintSensor =
- FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
-
- var enrollFlow = Default
- val flowViewModel = FingerprintFlowViewModel(enrollFlow)
-
- private val navigationViewModel =
- FingerprintNavigationViewModel(
- FingerprintNavigationStep.Introduction,
- false,
- flowViewModel,
- interactor,
- )
-
- private var fingerprintViewModel =
- FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
- private var fingerprintScrollViewModel = FingerprintScrollViewModel()
-
- @Before
- fun setup() {
- val factory =
- object : ViewModelProvider.Factory {
- @Suppress("UNCHECKED_CAST")
- override fun <T : ViewModel> create(modelClass: Class<T>): T {
- return when (modelClass) {
- FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
- FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
- FingerprintNavigationViewModel::class.java -> navigationViewModel
- FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
- else -> null
- }
- as T
- }
- }
-
- fragmentScenario =
- launchFragmentInContainer(Bundle(), R.style.SudThemeGlif) {
- FingerprintEnrollIntroV2Fragment(factory)
- }
- }
-
- /** Renders a [view] into a [Bitmap]. */
- private fun viewToBitmap(view: View): Bitmap {
- val bitmap =
- Bitmap.createBitmap(view.measuredWidth, view.measuredHeight, Bitmap.Config.ARGB_8888)
- val canvas = Canvas(bitmap)
- view.draw(canvas)
- return bitmap
- }
-
- @Test
- fun testEnrollIntro() {
- fragmentScenario.onFragment { fragment ->
- val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
- view.setBackgroundColor(Color.BLACK)
- }
- fragmentScenario.onFragment { fragment ->
- val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
- rule.assertBitmapAgainstGolden(viewToBitmap(view), "fp_enroll_intro", MSSIMMatcher())
- }
- }
-}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/README.md b/tests/screenshot/src/com/android/settings/tests/screenshot/README.md
new file mode 100644
index 0000000..299265a
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/README.md
@@ -0,0 +1,12 @@
+# Background info about tests
+1. This test is ran in postsubmits at andoid-settings/robo_tests.gcl
+2. It is important that this module stays somewhat small, if the test size grows
+ too large, it will be likely that this suite breaks due to flakiness(which
+ tends to happen with screenshot tests). In this case investigate splitting
+ the module.
+
+# Running and updating screenshots.
+1. For FingerprintEnrollIntroScreenshotTest.kt#testEnrollIntro
+2. atest SettingsScreenshotRNGTests
+3. There should be a file like com.android.settings.tests.screenshot.biometrics.fingerprint.fragment.FingerprintEnrollIntroScreenshotTest_testEnrollIntro_actual_robolectric_fp_enroll_intro.png_6245562387930305138.png
+4. Place this screenshot in packages/apps/Settings/tests/screenshot/assets/robolectric/fp_enroll_intro.png
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
new file mode 100644
index 0000000..84d76ff
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2024 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.tests.screenshot.biometrics.fingerprint
+
+import android.content.res.Configuration
+import android.view.Surface
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
+import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.update
+import platform.test.screenshot.DeviceEmulationSpec
+import platform.test.screenshot.DisplaySpec
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.GoldenImagePathManager
+import platform.test.screenshot.matchers.PixelPerfectMatcher
+
+class Injector(step: FingerprintNavigationStep.UiStep) {
+
+ var enrollFlow = Default
+ var fingerprintSensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.REAR)
+ var accessibilityInteractor =
+ object : AccessibilityInteractor {
+ override val isAccessibilityEnabled: Flow<Boolean> = flowOf(true)
+ }
+
+ var foldStateInteractor =
+ object : FoldStateInteractor {
+ private val _foldState = MutableStateFlow(false)
+ override val isFolded: Flow<Boolean> = _foldState.asStateFlow()
+
+ override fun onConfigurationChange(newConfig: Configuration) {
+ _foldState.update { false }
+ }
+ }
+
+ var orientationInteractor =
+ object : OrientationInteractor {
+ override val orientation: Flow<Int> = flowOf(Configuration.ORIENTATION_LANDSCAPE)
+ override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
+
+ override fun getRotationFromDefault(rotation: Int): Int = rotation
+ }
+ var gatekeeperViewModel =
+ FingerprintGatekeeperViewModel(
+ GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
+ interactor,
+ )
+
+ val flowViewModel = FingerprintFlowViewModel(enrollFlow)
+
+ var navigationViewModel = FingerprintNavigationViewModel(step, true, flowViewModel, interactor)
+ var fingerprintViewModel =
+ FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
+
+ var fingerprintScrollViewModel = FingerprintScrollViewModel()
+ var backgroundViewModel = BackgroundViewModel()
+
+ var fingerprintEnrollViewModel =
+ FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel)
+
+ var fingerprintEnrollEnrollingViewModel =
+ FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
+
+ var rfpsIconTouchViewModel = RFPSIconTouchViewModel()
+ var rfpsViewModel =
+ RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel, orientationInteractor)
+
+ var fingerprintFindSensorViewModel =
+ FingerprintEnrollFindSensorViewModel(
+ navigationViewModel,
+ fingerprintEnrollViewModel,
+ gatekeeperViewModel,
+ backgroundViewModel,
+ accessibilityInteractor,
+ foldStateInteractor,
+ orientationInteractor,
+ flowViewModel,
+ interactor,
+ )
+
+ val factory =
+ object : ViewModelProvider.Factory {
+ @Suppress("UNCHECKED_CAST")
+ override fun <T : ViewModel> create(modelClass: Class<T>): T {
+ return when (modelClass) {
+ FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
+ FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
+ FingerprintNavigationViewModel::class.java -> navigationViewModel
+ FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
+ FingerprintEnrollFindSensorViewModel::class.java -> fingerprintFindSensorViewModel
+ FingerprintEnrollViewModel::class.java -> fingerprintEnrollViewModel
+ RFPSViewModel::class.java -> rfpsViewModel
+ BackgroundViewModel::class.java -> backgroundViewModel
+ RFPSIconTouchViewModel::class.java -> rfpsIconTouchViewModel
+ FingerprintEnrollEnrollingViewModel::class.java -> fingerprintEnrollEnrollingViewModel
+ else -> null
+ }
+ as T
+ }
+ }
+
+ init {
+ fingerprintEnrollViewModel.sensorTypeCached = fingerprintSensor.sensorType
+ }
+
+ companion object {
+ private val Phone = DisplaySpec("phone", width = 1080, height = 2340, densityDpi = 420)
+ private const val screenshotPath = "/settings_screenshots"
+ val interactor = FakeFingerprintManagerInteractor()
+
+ fun BiometricFragmentScreenShotRule() =
+ FragmentScreenshotTestRule(
+ DeviceEmulationSpec.forDisplays(Phone).first(),
+ GoldenImagePathManager(
+ InstrumentationRegistry.getInstrumentation().context,
+ InstrumentationRegistry.getInstrumentation().targetContext.filesDir.absolutePath +
+ screenshotPath,
+ ),
+ PixelPerfectMatcher(),
+ true,
+ )
+ }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt
new file mode 100644
index 0000000..215e76f
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2024 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.tests.screenshot.biometrics.fingerprint.fragment
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector.Companion.BiometricFragmentScreenShotRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollEnrollingScreenshotTest {
+ private val injector: Injector =
+ Injector(FingerprintNavigationStep.Enrollment(Injector.interactor.sensorProp))
+
+ @Rule @JvmField var rule: FragmentScreenshotTestRule = BiometricFragmentScreenShotRule()
+
+ @Test
+ fun testEnrollEnrolling() {
+ rule.screenshotTest("fp_enroll_enrolling", Mode.MatchSize, RFPSEnrollFragment(injector.factory))
+ }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt
new file mode 100644
index 0000000..18257c2
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt
@@ -0,0 +1,45 @@
+package com.android.settings.tests.screenshot.biometrics.fingerprint.fragment
+
+/*
+ * Copyright (C) 2024 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.
+ */
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector.Companion.BiometricFragmentScreenShotRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollFindSensorScreenshotTest {
+ private val injector: Injector =
+ Injector(FingerprintNavigationStep.Education(Injector.interactor.sensorProp))
+
+ @Rule @JvmField var rule: FragmentScreenshotTestRule = BiometricFragmentScreenShotRule()
+
+ @Test
+ fun testEnrollFindSensor() {
+ rule.screenshotTest(
+ "fp_enroll_find_sensor",
+ Mode.MatchSize,
+ FingerprintEnrollFindSensorV2Fragment(injector.fingerprintSensor.sensorType, injector.factory),
+ )
+ }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt
new file mode 100644
index 0000000..40a23d7
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2023 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.tests.screenshot.biometrics.fingerprint.fragment
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollIntroScreenshotTest {
+ private val injector: Injector = Injector(FingerprintNavigationStep.Introduction)
+
+ @Rule
+ @JvmField
+ var rule: FragmentScreenshotTestRule = Injector.BiometricFragmentScreenShotRule()
+
+ @Test
+ fun testEnrollIntro() {
+ rule.screenshotTest(
+ "fp_enroll_intro",
+ Mode.MatchSize,
+ FingerprintEnrollIntroV2Fragment(injector.factory),
+ )
+ }
+}
diff --git a/tests/shared/Android.bp b/tests/shared/Android.bp
index 27573e8..6fd9f64 100644
--- a/tests/shared/Android.bp
+++ b/tests/shared/Android.bp
@@ -1,7 +1,11 @@
+package {
+ default_team: "trendy_team_android_settings_app",
+}
+
android_library {
name: "Settings-testutils2",
srcs: [
- "src/**/*.kt"
+ "src/**/*.kt",
],
libs: [
"BiometricsSharedLib",
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index 7991ff1..f571dad 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -37,7 +37,6 @@
var authenticateAttempt = FingerprintAuthAttemptModel.Success(1)
var enrollStateViewModel: List<FingerEnrollState> =
listOf(FingerEnrollState.EnrollProgress(5, 5))
- var pressToAuthEnabled = true
var sensorProp =
FingerprintSensor(
@@ -86,7 +85,4 @@
return sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON
}
- override suspend fun pressToAuthEnabled(): Boolean {
- return pressToAuthEnabled
- }
}
diff --git a/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
index bb30619..18acbba 100644
--- a/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
+++ b/tests/spa_unit/src/com/android/settings/development/SensitiveContentProtectionPreferenceControllerTest.kt
@@ -16,6 +16,7 @@
package com.android.settings.development
import android.content.Context
+import android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
import android.platform.test.annotations.RequiresFlagsDisabled
import android.platform.test.annotations.RequiresFlagsEnabled
import android.platform.test.flag.junit.DeviceFlagsValueProvider
@@ -27,7 +28,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import com.android.server.notification.Flags.FLAG_SCREENSHARE_NOTIFICATION_HIDING
-import com.android.server.notification.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PROTECTION
import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_OFF
import com.android.settings.development.SensitiveContentProtectionPreferenceController.Companion.SETTING_VALUE_ON
import org.junit.Assert.assertEquals
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index f1808e3..c284a6f 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -26,9 +26,9 @@
import android.os.Handler
import androidx.test.core.app.ApplicationProvider
import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractor
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
@@ -77,17 +77,16 @@
@Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
private var testScope = TestScope(backgroundDispatcher)
- private var pressToAuthRepo =
- object : PressToAuthRepo {
- override val isEnabled: Boolean
- get() = false
+ private var pressToAuthInteractor =
+ object : PressToAuthInteractor {
+ override val isEnabled = flowOf(false)
}
@Before
fun setup() {
val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
- val fingerprintSensorRepo =
- object : FingerprintSensorRepo {
+ val fingerprintSensorRepository =
+ object : FingerprintSensorRepository {
override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor)
}
@@ -96,9 +95,9 @@
context,
backgroundDispatcher,
fingerprintManager,
- fingerprintSensorRepo,
+ fingerprintSensorRepository,
gateKeeperPasswordProvider,
- pressToAuthRepo,
+ pressToAuthInteractor,
Default,
)
}
diff --git a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
index 3b02d49..f202c4f 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
@@ -18,27 +18,30 @@
import android.content.Context
import android.content.res.Configuration
-import android.view.accessibility.AccessibilityManager
+import android.view.Surface
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.core.app.ApplicationProvider
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.Default
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
@@ -68,14 +71,13 @@
private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var enrollViewModel: FingerprintEnrollViewModel
private lateinit var navigationViewModel: FingerprintNavigationViewModel
- private lateinit var accessibilityViewModel: AccessibilityViewModel
- private lateinit var foldStateViewModel: FoldStateViewModel
- private lateinit var orientationStateViewModel: OrientationStateViewModel
+ private lateinit var accessibilityInteractor: AccessibilityInteractor
+ private lateinit var foldStateInteractor: FoldStateInteractor
+ private lateinit var orientationInteractor: OrientationInteractor
private lateinit var underTest: FingerprintEnrollFindSensorViewModel
private lateinit var backgroundViewModel: BackgroundViewModel
private val context: Context = ApplicationProvider.getApplicationContext()
- private val accessibilityManager: AccessibilityManager =
- context.getSystemService(AccessibilityManager::class.java)!!
+ private val foldState = MutableStateFlow(false)
@Before
fun setup() {
@@ -95,7 +97,7 @@
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel =
FingerprintNavigationViewModel(
- Education(sensor),
+ FingerprintNavigationStep.Education(sensor),
false,
fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
@@ -111,24 +113,39 @@
navigationViewModel,
)
.create(FingerprintEnrollViewModel::class.java)
- accessibilityViewModel =
- AccessibilityViewModel.AccessibilityViewModelFactory(accessibilityManager)
- .create(AccessibilityViewModel::class.java)
- foldStateViewModel =
- FoldStateViewModel.FoldStateViewModelFactory(context).create(FoldStateViewModel::class.java)
- orientationStateViewModel =
- OrientationStateViewModel.OrientationViewModelFactory(context)
- .create(OrientationStateViewModel::class.java)
+ accessibilityInteractor =
+ object : AccessibilityInteractor {
+ override val isAccessibilityEnabled: Flow<Boolean> = flowOf(false)
+ }
+ foldStateInteractor =
+ object : FoldStateInteractor {
+ override val isFolded: Flow<Boolean> = foldState
+ override fun onConfigurationChange(newConfig: Configuration) {
+ TODO("Not yet implemented")
+ }
+ }
+ orientationInteractor =
+ object: OrientationInteractor {
+ override val orientation: Flow<Int>
+ get() = TODO("Not yet implemented")
+ override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
+
+ override fun getRotationFromDefault(rotation: Int): Int {
+ TODO("Not yet implemented")
+ }
+
+ }
underTest =
FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorViewModelFactory(
navigationViewModel,
enrollViewModel,
gatekeeperViewModel,
backgroundViewModel,
- accessibilityViewModel,
- foldStateViewModel,
- orientationStateViewModel,
+ accessibilityInteractor,
+ foldStateInteractor,
+ orientationInteractor,
fingerprintFlowViewModel,
+ fakeFingerprintManagerInteractor,
)
.create(FingerprintEnrollFindSensorViewModel::class.java)
}
@@ -171,8 +188,8 @@
}
}
- val config = createConfiguration(isFolded = true)
- foldStateViewModel.onConfigurationChange(config)
+ foldState.update { true }
+
advanceUntilIdle()
assertThat(isFolded).isTrue()
assertThat(rotation).isEqualTo(context.display!!.rotation)
@@ -191,8 +208,8 @@
}
}
- val config = createConfiguration(isFolded = false)
- foldStateViewModel.onConfigurationChange(config)
+ foldState.update { false }
+
advanceUntilIdle()
assertThat(isFolded).isFalse()
assertThat(rotation).isEqualTo(context.display!!.rotation)