Merge "Settings: Do not show install info for Play Store app" into main
diff --git a/res/layout/vpn_dialog.xml b/res/layout/vpn_dialog.xml
index 062772e..fadd202 100644
--- a/res/layout/vpn_dialog.xml
+++ b/res/layout/vpn_dialog.xml
@@ -13,7 +13,10 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:theme="@style/Theme.Material3.DynamicColors.DayNight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
@@ -45,12 +48,17 @@
android:orientation="vertical"
android:visibility="gone">
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_name"
- android:labelFor="@+id/name"/>
- <EditText style="@style/vpn_value"
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/name_layout"
+ android:hint="@string/vpn_name"
+ app:endIconMode="clear_text"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
android:id="@+id/name"
android:inputType="textCapWords"/>
+ </com.google.android.material.textfield.TextInputLayout>
<TextView style="@style/vpn_label"
android:text="@string/vpn_type"
@@ -60,23 +68,34 @@
android:prompt="@string/vpn_type"
android:entries="@array/vpn_types"/>
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_server"
- android:labelFor="@+id/server"/>
- <EditText style="@style/vpn_value"
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/server_layout"
+ android:hint="@string/vpn_server"
+ app:endIconMode="clear_text"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
android:id="@+id/server"/>
+ </com.google.android.material.textfield.TextInputLayout>
<LinearLayout android:id="@+id/options_ipsec_identity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_ipsec_identifier"
- android:labelFor="@+id/ipsec_identifier"/>
- <EditText style="@style/vpn_value"
- android:id="@+id/ipsec_identifier"
- android:hint="@string/vpn_not_used"/>
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/ipsec_identifier_layout"
+ android:hint="@string/vpn_ipsec_identifier"
+ app:endIconMode="clear_text"
+ app:helperTextEnabled="true"
+ app:helperText="@string/vpn_not_used"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
+ android:id="@+id/ipsec_identifier"/>
+ </com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout android:id="@+id/ipsec_psk"
@@ -84,12 +103,17 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_ipsec_secret"
- android:labelFor="@+id/ipsec_secret"/>
- <EditText style="@style/vpn_value"
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/ipsec_secret_layout"
+ android:hint="@string/vpn_ipsec_secret"
+ app:endIconMode="password_toggle"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
android:id="@+id/ipsec_secret"
- android:password="true"/>
+ android:inputType="textPassword"/>
+ </com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
<LinearLayout android:id="@+id/ipsec_user"
@@ -153,27 +177,33 @@
android:orientation="vertical"
android:visibility="gone" >
- <TextView
+ <com.google.android.material.textfield.TextInputLayout
style="@style/vpn_label"
- android:text="@string/proxy_hostname_label"
- android:labelFor="@+id/vpn_proxy_host" />
+ android:id="@+id/vpn_proxy_host_layout"
+ android:hint="@string/proxy_hostname_label"
+ app:endIconMode="clear_text"
+ app:helperTextEnabled="true"
+ app:helperText="@string/proxy_hostname_hint"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
+ android:id="@+id/vpn_proxy_host"
+ android:inputType="textNoSuggestions"/>
+ </com.google.android.material.textfield.TextInputLayout>
- <EditText
- android:id="@+id/vpn_proxy_host"
- style="@style/vpn_value"
- android:hint="@string/proxy_hostname_hint"
- android:inputType="textNoSuggestions" />
-
- <TextView
+ <com.google.android.material.textfield.TextInputLayout
style="@style/vpn_label"
- android:text="@string/proxy_port_label"
- android:labelFor="@+id/vpn_proxy_port" />
-
- <EditText
- android:id="@+id/vpn_proxy_port"
- style="@style/vpn_value"
- android:hint="@string/proxy_port_hint"
- android:inputType="number" />
+ android:id="@+id/vpn_proxy_port_layout"
+ android:hint="@string/proxy_port_label"
+ app:endIconMode="clear_text"
+ app:helperTextEnabled="true"
+ app:helperText="@string/proxy_port_hint"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
+ android:id="@+id/vpn_proxy_port"
+ android:inputType="number"/>
+ </com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</LinearLayout>
@@ -182,18 +212,28 @@
android:layout_height="wrap_content"
android:orientation="vertical">
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_username"
- android:labelFor="@+id/username"/>
- <EditText style="@style/vpn_value"
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/username_layout"
+ android:hint="@string/vpn_username"
+ app:endIconMode="clear_text"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
android:id="@+id/username"/>
+ </com.google.android.material.textfield.TextInputLayout>
- <TextView style="@style/vpn_label"
- android:text="@string/vpn_password"
- android:labelFor="@+id/password"/>
- <EditText style="@style/vpn_value"
+ <com.google.android.material.textfield.TextInputLayout
+ style="@style/vpn_label"
+ android:id="@+id/password_layout"
+ android:hint="@string/vpn_password"
+ app:endIconMode="password_toggle"
+ app:errorEnabled="true">
+ <com.google.android.material.textfield.TextInputEditText
+ style="@style/vpn_value"
android:id="@+id/password"
- android:password="true"/>
+ android:inputType="textPassword"/>
+ </com.google.android.material.textfield.TextInputLayout>
<CheckBox style="@style/vpn_value"
android:id="@+id/save_login"
diff --git a/res/xml/night_display_settings.xml b/res/xml/night_display_settings.xml
index 95d5034..d75619d 100644
--- a/res/xml/night_display_settings.xml
+++ b/res/xml/night_display_settings.xml
@@ -52,7 +52,7 @@
android:title="@string/night_display_end_time_title"
settings:controller="com.android.settings.display.NightDisplayCustomEndTimePreferenceController"/>
- <com.android.settings.widget.SeekBarPreference
+ <com.android.settingslib.widget.SliderPreference
android:key="night_display_temperature"
android:title="@string/night_display_temperature_title"
settings:keywords="@string/keywords_display_night_display"
diff --git a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
index a8e456d..3ae64fc 100644
--- a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
+++ b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java
@@ -127,14 +127,13 @@
final String htmlDescription = mA11yShortcutInfo.loadHtmlDescription(mPm);
final String settingsClassName = mA11yShortcutInfo.getSettingsActivityName();
final String tileServiceClassName = mA11yShortcutInfo.getTileServiceName();
- final int metricsCategory = FeatureFactory.getFeatureFactory()
- .getAccessibilityMetricsFeatureProvider()
- .getDownloadedFeatureMetricsCategory(mComponentName);
+ final int pageIdCategory = FeatureFactory.getFeatureFactory()
+ .getAccessibilityPageIdFeatureProvider().getCategory(mComponentName);
ThreadUtils.getUiThreadHandler().post(() -> {
RestrictedPreferenceHelper.putBasicExtras(
this, prefKey, getTitle(), intro, description, imageRes,
- htmlDescription, mComponentName, metricsCategory);
+ htmlDescription, mComponentName, pageIdCategory);
RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName);
RestrictedPreferenceHelper.putTileServiceExtras(
this, getPackageName(), tileServiceClassName);
diff --git a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
index 4e9cd92..347c769 100644
--- a/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityDetailsSettingsFragment.java
@@ -228,10 +228,10 @@
new ComponentName(packageName, tileServiceClassName).flattenToString());
}
- final int metricsCategory = FeatureFactory.getFeatureFactory()
- .getAccessibilityMetricsFeatureProvider()
- .getDownloadedFeatureMetricsCategory(componentName);
- extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory);
+ final int pageIdCategory = FeatureFactory.getFeatureFactory()
+ .getAccessibilityPageIdFeatureProvider().getCategory(componentName);
+ extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, pageIdCategory);
+ extras.putInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY, pageIdCategory);
extras.putParcelable(AccessibilitySettings.EXTRA_COMPONENT_NAME, componentName);
extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, info.getAnimatedImageRes());
diff --git a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
index 018bd2e..7d03230 100644
--- a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
+++ b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProvider.java
@@ -15,8 +15,6 @@
*/
package com.android.settings.accessibility;
-import android.content.ComponentName;
-
import androidx.annotation.Nullable;
/**
@@ -25,11 +23,11 @@
public interface AccessibilityFeedbackFeatureProvider {
/**
- * Returns value according to the {@code componentName}.
+ * Returns value according to the {@code pageId}.
*
- * @param componentName the component name of the downloaded service or activity
- * @return Feedback bucket ID
+ * @param pageId The unique identifier of the page.
+ * @return Feedback bucket ID associated with the page, or {@code null} if is not found.
*/
@Nullable
- String getCategory(@Nullable ComponentName componentName);
+ String getCategory(int pageId);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
index 917c5f6..2381887 100644
--- a/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
+++ b/src/com/android/settings/accessibility/AccessibilityFeedbackFeatureProviderImpl.java
@@ -15,8 +15,6 @@
*/
package com.android.settings.accessibility;
-import android.content.ComponentName;
-
import androidx.annotation.Nullable;
/** Default implementation of {@link AccessibilityFeedbackFeatureProvider}. */
@@ -25,7 +23,7 @@
@Override
@Nullable
- public String getCategory(@Nullable ComponentName componentName) {
- return "";
+ public String getCategory(int pageId) {
+ return null;
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
similarity index 84%
rename from src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
rename to src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
index a9d7c05..698efbe 100644
--- a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProvider.java
+++ b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProvider.java
@@ -21,9 +21,9 @@
import androidx.annotation.Nullable;
/**
- * Provider for Accessibility metrics related features.
+ * Provider for Accessibility page id related features.
*/
-public interface AccessibilityMetricsFeatureProvider {
+public interface AccessibilityPageIdFeatureProvider {
/**
* Returns {@link android.app.settings.SettingsEnums} value according to the {@code
@@ -32,5 +32,5 @@
* @param componentName the component name of the downloaded service or activity
* @return value in {@link android.app.settings.SettingsEnums}
*/
- int getDownloadedFeatureMetricsCategory(@Nullable ComponentName componentName);
+ int getCategory(@Nullable ComponentName componentName);
}
diff --git a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
similarity index 75%
rename from src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
rename to src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
index 0f85f38..acd8aab 100644
--- a/src/com/android/settings/accessibility/AccessibilityMetricsFeatureProviderImpl.java
+++ b/src/com/android/settings/accessibility/AccessibilityPageIdFeatureProviderImpl.java
@@ -19,14 +19,16 @@
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
+import androidx.annotation.Nullable;
+
/**
- * Provider implementation for Accessibility metrics related features.
+ * Provider implementation for Accessibility page id related features.
*/
-public class AccessibilityMetricsFeatureProviderImpl implements
- AccessibilityMetricsFeatureProvider {
+public class AccessibilityPageIdFeatureProviderImpl implements
+ AccessibilityPageIdFeatureProvider {
@Override
- public int getDownloadedFeatureMetricsCategory(ComponentName componentName) {
+ public int getCategory(@Nullable ComponentName componentName) {
return SettingsEnums.ACCESSIBILITY_SERVICE;
}
}
diff --git a/src/com/android/settings/accessibility/AccessibilityServicePreference.java b/src/com/android/settings/accessibility/AccessibilityServicePreference.java
index 8a22d82..7032774 100644
--- a/src/com/android/settings/accessibility/AccessibilityServicePreference.java
+++ b/src/com/android/settings/accessibility/AccessibilityServicePreference.java
@@ -123,13 +123,12 @@
final String settingsClassName = mA11yServiceInfo.getSettingsActivityName();
final String tileServiceClassName = mA11yServiceInfo.getTileServiceName();
final ResolveInfo resolveInfo = mA11yServiceInfo.getResolveInfo();
- final int metricsCategory = FeatureFactory.getFeatureFactory()
- .getAccessibilityMetricsFeatureProvider()
- .getDownloadedFeatureMetricsCategory(mComponentName);
+ final int pageIdCategory = FeatureFactory.getFeatureFactory()
+ .getAccessibilityPageIdFeatureProvider().getCategory(mComponentName);
ThreadUtils.getUiThreadHandler().post(() -> {
RestrictedPreferenceHelper.putBasicExtras(
this, prefKey, getTitle(), intro, description, imageRes,
- htmlDescription, mComponentName, metricsCategory);
+ htmlDescription, mComponentName, pageIdCategory);
RestrictedPreferenceHelper.putServiceExtras(this, resolveInfo, mServiceEnabled);
RestrictedPreferenceHelper.putSettingsExtras(this, getPackageName(), settingsClassName);
RestrictedPreferenceHelper.putTileServiceExtras(
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 57eb4d5..2c8247f 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -97,6 +97,7 @@
static final String EXTRA_HTML_DESCRIPTION = "html_description";
static final String EXTRA_TIME_FOR_LOGGING = "start_time_to_log_a11y_tool";
static final String EXTRA_METRICS_CATEGORY = "metrics_category";
+ static final String EXTRA_FEEDBACK_CATEGORY = "feedback_category";
// Timeout before we update the services if packages are added/removed
// since the AccessibilityManagerService has to do that processing first
@@ -255,7 +256,7 @@
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
if (getFeedbackManager().isAvailable()) {
menu.add(Menu.NONE, MENU_ID_SEND_FEEDBACK, Menu.NONE,
- getPrefContext().getText(R.string.accessibility_send_feedback_title));
+ R.string.accessibility_send_feedback_title);
}
super.onCreateOptionsMenu(menu, inflater);
}
@@ -286,7 +287,7 @@
private FeedbackManager getFeedbackManager() {
if (mFeedbackManager == null) {
- mFeedbackManager = new FeedbackManager(getActivity());
+ mFeedbackManager = new FeedbackManager(getActivity(), SettingsEnums.ACCESSIBILITY);
}
return mFeedbackManager;
}
diff --git a/src/com/android/settings/accessibility/FeedbackManager.java b/src/com/android/settings/accessibility/FeedbackManager.java
index 52aefd2..dc4baa7 100644
--- a/src/com/android/settings/accessibility/FeedbackManager.java
+++ b/src/com/android/settings/accessibility/FeedbackManager.java
@@ -16,7 +16,6 @@
package com.android.settings.accessibility;
import android.app.Activity;
-import android.content.ComponentName;
import android.content.Intent;
import android.text.TextUtils;
@@ -46,23 +45,14 @@
* Constructs a new FeedbackManager.
*
* @param activity The activity context. A WeakReference is used to prevent memory leaks.
+ * @param pageId The unique identifier of the page associated with the feedback.
*/
- public FeedbackManager(@Nullable Activity activity) {
- this(activity, /* componentName= */ null);
- }
-
- /**
- * Constructs a new FeedbackManager.
- *
- * @param activity The activity context. A WeakReference is used to prevent memory leaks.
- * @param componentName The component name associated with the feedback.
- */
- public FeedbackManager(@Nullable Activity activity, @Nullable ComponentName componentName) {
+ public FeedbackManager(@Nullable Activity activity, int pageId) {
this(activity,
DeviceInfoUtils.getFeedbackReporterPackage(activity),
FeatureFactory.getFeatureFactory()
.getAccessibilityFeedbackFeatureProvider()
- .getCategory(componentName));
+ .getCategory(pageId));
}
/**
diff --git a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
index 013fdee..c6995b0 100644
--- a/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragment.java
@@ -31,8 +31,6 @@
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
@@ -60,6 +58,11 @@
}
@Override
+ public int getFeedbackCategory() {
+ return getArguments().getInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY);
+ }
+
+ @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Init new preference to replace the switch preference instead.
@@ -115,13 +118,6 @@
return mTileComponentName;
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- // Do not call super. We don't want to see the "Help & feedback" option on this page so as
- // not to confuse users who think they might be able to send feedback about a specific
- // accessibility service from this page.
- }
-
// IMPORTANT: Refresh the info since there are dynamically changing capabilities.
private AccessibilityShortcutInfo getAccessibilityShortcutInfo() {
final List<AccessibilityShortcutInfo> infos = AccessibilityManager.getInstance(
diff --git a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
index 5c18be8..ae6239a 100644
--- a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
+++ b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java
@@ -217,6 +217,7 @@
extras.putInt(AccessibilitySettings.EXTRA_ANIMATED_IMAGE_RES, imageRes);
extras.putString(AccessibilitySettings.EXTRA_HTML_DESCRIPTION, htmlDescription);
extras.putInt(AccessibilitySettings.EXTRA_METRICS_CATEGORY, metricsCategory);
+ extras.putInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY, metricsCategory);
}
/**
diff --git a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
index 06bcdb7..a11ad46 100644
--- a/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragment.java
@@ -39,8 +39,6 @@
import android.text.BidiFormatter;
import android.text.TextUtils;
import android.util.Log;
-import android.view.Menu;
-import android.view.MenuInflater;
import android.view.accessibility.AccessibilityManager;
import android.widget.CompoundButton;
@@ -76,10 +74,8 @@
}
@Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- // Do not call super. We don't want to see the "Help & feedback" option on this page so as
- // not to confuse users who think they might be able to send feedback about a specific
- // accessibility service from this page.
+ public int getFeedbackCategory() {
+ return getArguments().getInt(AccessibilitySettings.EXTRA_FEEDBACK_CATEGORY);
}
@Override
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index 9367251..66c32df 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -40,6 +40,9 @@
import android.text.Html;
import android.text.TextUtils;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
@@ -48,6 +51,7 @@
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageView;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
@@ -89,6 +93,7 @@
// <img src="R.drawable.fileName"/>, a11y settings will get the resources successfully.
private static final String IMG_PREFIX = "R.drawable.";
private static final String DRAWABLE_FOLDER = "drawable";
+ static final int MENU_ID_SEND_FEEDBACK = 0;
protected TopIntroPreference mTopIntroPreference;
protected SettingsMainSwitchPreference mToggleServiceSwitchPreference;
@@ -102,6 +107,7 @@
protected Intent mSettingsIntent;
// The mComponentName maybe null, such as Magnify
protected ComponentName mComponentName;
+ @Nullable private FeedbackManager mFeedbackManager;
protected CharSequence mFeatureName;
protected Uri mImageUri;
protected CharSequence mHtmlDescription;
@@ -241,6 +247,24 @@
}
@Override
+ public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
+ if (getFeedbackManager().isAvailable()) {
+ menu.add(Menu.NONE, MENU_ID_SEND_FEEDBACK, Menu.NONE,
+ R.string.accessibility_send_feedback_title);
+ }
+ super.onCreateOptionsMenu(menu, inflater);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
+ if (item.getItemId() == MENU_ID_SEND_FEEDBACK) {
+ getFeedbackManager().sendFeedback();
+ return true;
+ }
+ return super.onOptionsItemSelected(item);
+ }
+
+ @Override
public int getDialogMetricsCategory(int dialogId) {
switch (dialogId) {
case DialogEnums.LAUNCH_ACCESSIBILITY_TUTORIAL:
@@ -739,4 +763,28 @@
super.onCreateRecyclerView(inflater, parent, savedInstanceState);
return AccessibilityFragmentUtils.addCollectionInfoToAccessibilityDelegate(recyclerView);
}
+
+ @VisibleForTesting
+ void setFeedbackManager(FeedbackManager feedbackManager) {
+ this.mFeedbackManager = feedbackManager;
+ }
+
+ private FeedbackManager getFeedbackManager() {
+ if (mFeedbackManager == null) {
+ mFeedbackManager = new FeedbackManager(getActivity(), getFeedbackCategory());
+ }
+ return mFeedbackManager;
+ }
+
+ /**
+ * Returns the category of the feedback page.
+ *
+ * <p>By default, this method returns {@link SettingsEnums#PAGE_UNKNOWN}. This indicates that
+ * the feedback category is unknown, and the absence of a feedback menu.
+ *
+ * @return The feedback category, which is {@link SettingsEnums#PAGE_UNKNOWN} by default.
+ */
+ protected int getFeedbackCategory() {
+ return SettingsEnums.PAGE_UNKNOWN;
+ }
}
diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
index 10813a7..eb0c93b 100644
--- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java
@@ -80,6 +80,12 @@
}
@Override
+ public int getFeedbackCategory() {
+ // The feedback options should not be displayed on the setup wizard page.
+ return SettingsEnums.PAGE_UNKNOWN;
+ }
+
+ @Override
public void onStop() {
// Log the final choice in value if it's different from the previous value.
if (mToggleServiceSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) {
diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
index 10796b5..14dc0bc 100644
--- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
+++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java
@@ -80,6 +80,12 @@
}
@Override
+ public int getFeedbackCategory() {
+ // The feedback options should not be displayed on the setup wizard page.
+ return SettingsEnums.PAGE_UNKNOWN;
+ }
+
+ @Override
public void onStop() {
// Log the final choice in value if it's different from the previous value.
if (mToggleServiceSwitchPreference.isChecked() != mToggleSwitchWasInitiallyChecked) {
diff --git a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
index 826583d..ad1f823 100644
--- a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
+++ b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java
@@ -95,8 +95,7 @@
userHandle)) {
if (RestrictedLockUtilsInternal.isPolicyEnforcedByAdvancedProtection(context,
DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY, userHandle.getIdentifier())) {
- return context.getString(com.android.settingslib.widget.restricted
- .R.string.disabled_by_advanced_protection);
+ return context.getString(com.android.settingslib.R.string.disabled);
} else {
return context.getString(
com.android.settingslib.widget.restricted.R.string.disabled_by_admin);
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index ef19709..83f23bd 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -107,7 +107,10 @@
// intent will include this extra containing a bundle of the form:
// "modality" -> consented (boolean).
public static final String EXTRA_PARENTAL_CONSENT_STATUS = "consent_status";
-
+ // Whether the face enrollment should be launched first when there are multiple biometrics
+ // supported.
+ public static final String EXTRA_LAUNCH_FACE_ENROLL_FIRST =
+ "launch_face_enroll_first";
private static final String SAVED_STATE_CONFIRMING_CREDENTIALS = "confirming_credentials";
private static final String SAVED_STATE_IS_SINGLE_ENROLLING =
"is_single_enrolling";
@@ -130,6 +133,7 @@
private boolean mIsFingerprintEnrollable = false;
private boolean mParentalOptionsRequired = false;
private boolean mSkipReturnToParent = false;
+ private boolean mLaunchFaceEnrollFirst = false;
private Bundle mParentalOptions;
@Nullable private Long mGkPwHandle;
@Nullable private ParentalConsentHelper mParentalConsentHelper;
@@ -214,6 +218,7 @@
mParentalOptionsRequired = intent.getBooleanExtra(EXTRA_REQUIRE_PARENTAL_CONSENT, false);
mSkipReturnToParent = intent.getBooleanExtra(EXTRA_SKIP_RETURN_TO_PARENT, false);
+ mLaunchFaceEnrollFirst = intent.getBooleanExtra(EXTRA_LAUNCH_FACE_ENROLL_FIRST, false);
// determine what can be enrolled
final boolean isSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
@@ -221,6 +226,7 @@
Log.d(TAG, "parentalOptionsRequired: " + mParentalOptionsRequired
+ ", skipReturnToParent: " + mSkipReturnToParent
+ + ", launchFaceEnrollFirst: " + mLaunchFaceEnrollFirst
+ ", isSetupWizard: " + isSetupWizard
+ ", isMultiSensor: " + isMultiSensor);
@@ -356,7 +362,8 @@
} else if (canUseFace || canUseFingerprint) {
if (mGkPwHandle == null) {
setOrConfirmCredentialsNow();
- } else if (canUseFingerprint && mIsFingerprintEnrollable) {
+ } else if (canUseFingerprint && mIsFingerprintEnrollable
+ && !(canUseFace && mIsFaceEnrollable && mLaunchFaceEnrollFirst)) {
launchFingerprintOnlyEnroll();
} else if (canUseFace && mIsFaceEnrollable) {
launchFaceOnlyEnroll();
@@ -510,7 +517,8 @@
int requestCode, int resultCode, Intent data) {
Log.d(TAG, "handleOnActivityResultWhileEnrolling, request = " + requestCode + ""
- + ", resultCode = " + resultCode);
+ + ", resultCode = " + resultCode + ", launchFaceEnrollFirst="
+ + mLaunchFaceEnrollFirst);
switch (requestCode) {
case REQUEST_HANDOFF_PARENT:
setResult(RESULT_OK, newResultIntent());
@@ -526,7 +534,8 @@
// SetupFingerprintEnrollIntroduction/FingerprintEnrollmentActivity
TransitionHelper.applyForwardTransition(this, TRANSITION_FADE_THROUGH);
updateGatekeeperPasswordHandle(data);
- if (mIsFingerprintEnrollable) {
+ if (mIsFingerprintEnrollable
+ && !(mIsFaceEnrollable && mLaunchFaceEnrollFirst)) {
launchFingerprintOnlyEnroll();
} else {
launchFaceOnlyEnroll();
@@ -548,7 +557,7 @@
}
if ((resultCode == BiometricEnrollBase.RESULT_SKIP
|| resultCode == BiometricEnrollBase.RESULT_FINISHED)
- && mIsFaceEnrollable) {
+ && mIsFaceEnrollable && !mLaunchFaceEnrollFirst) {
// Apply forward animation during the transition from
// SetupFingerprintEnroll*/FingerprintEnrollmentActivity to
// SetupFaceEnrollIntroduction
@@ -556,6 +565,9 @@
mIsPreviousEnrollmentCanceled =
resultCode != BiometricEnrollBase.RESULT_FINISHED;
launchFaceOnlyEnroll();
+ } else if (resultCode == Activity.RESULT_CANCELED && mIsFaceEnrollable
+ && mLaunchFaceEnrollFirst) {
+ launchFaceOnlyEnroll();
} else {
notifySafetyIssueActionLaunchedIfNeeded(resultCode);
finishOrLaunchHandToParent(resultCode);
@@ -563,7 +575,14 @@
break;
case REQUEST_SINGLE_ENROLL_FACE:
mIsSingleEnrolling = false;
- if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable) {
+ if ((resultCode == BiometricEnrollBase.RESULT_SKIP
+ || resultCode == BiometricEnrollBase.RESULT_FINISHED)
+ && mIsFingerprintEnrollable && mLaunchFaceEnrollFirst) {
+ mIsPreviousEnrollmentCanceled =
+ resultCode != BiometricEnrollBase.RESULT_FINISHED;
+ launchFingerprintOnlyEnroll();
+ } else if (resultCode == Activity.RESULT_CANCELED && mIsFingerprintEnrollable
+ && !mLaunchFaceEnrollFirst) {
mIsPreviousEnrollmentCanceled = true;
launchFingerprintOnlyEnroll();
} else {
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index db6abc3..21b0fa0 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -43,6 +43,7 @@
import com.android.internal.widget.VerifyCredentialResponse;
import com.android.settings.R;
import com.android.settings.SetupWizardUtils;
+import com.android.settings.biometrics.face.FaceEnroll;
import com.android.settings.biometrics.fingerprint.FingerprintEnroll;
import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
@@ -282,9 +283,7 @@
*/
public static Intent getFaceIntroIntent(@NonNull Context context,
@NonNull Intent activityIntent) {
- final Intent intent = new Intent(context,
- FeatureFactory.getFeatureFactory().getFaceFeatureProvider()
- .getEnrollActivityClassProvider().getNext());
+ final Intent intent = new Intent(context, FaceEnroll.class);
WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
return intent;
}
diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
index 700b601..a145913 100644
--- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
+++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java
@@ -25,11 +25,11 @@
import com.android.settings.R;
import com.android.settings.core.SliderPreferenceController;
-import com.android.settings.widget.SeekBarPreference;
+import com.android.settingslib.widget.SliderPreference;
public class NightDisplayIntensityPreferenceController extends SliderPreferenceController {
- private ColorDisplayManager mColorDisplayManager;
+ private final ColorDisplayManager mColorDisplayManager;
public NightDisplayIntensityPreferenceController(Context context, String key) {
super(context, key);
@@ -64,11 +64,11 @@
@Override
public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen);
- final SeekBarPreference preference = screen.findPreference(getPreferenceKey());
- preference.setContinuousUpdates(true);
+ SliderPreference preference = screen.findPreference(getPreferenceKey());
+ preference.setUpdatesContinuously(true);
preference.setMax(getMax());
preference.setMin(getMin());
- preference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_ENDS);
+ // TODO(b/394828723) add haptic feedback
}
@Override
diff --git a/src/com/android/settings/localepicker/LocaleDialogFragment.java b/src/com/android/settings/localepicker/LocaleDialogFragment.java
index a3a4b8f..5c7958a 100644
--- a/src/com/android/settings/localepicker/LocaleDialogFragment.java
+++ b/src/com/android/settings/localepicker/LocaleDialogFragment.java
@@ -26,11 +26,6 @@
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
import android.window.OnBackInvokedCallback;
import android.window.OnBackInvokedDispatcher;
@@ -57,6 +52,7 @@
static final String ARG_DIALOG_TYPE = "arg_dialog_type";
static final String ARG_TARGET_LOCALE = "arg_target_locale";
static final String ARG_SHOW_DIALOG = "arg_show_dialog";
+ static final String ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED = "arg_show_dialog_for_not_translated";
private boolean mShouldKeepDialog;
private OnBackInvokedDispatcher mBackDispatcher;
@@ -185,6 +181,7 @@
private final int mDialogType;
private final LocaleStore.LocaleInfo mLocaleInfo;
private final MetricsFeatureProvider mMetricsFeatureProvider;
+ private final boolean mShowDialogForNotTranslated;
private LocaleListEditor mParent;
@@ -194,6 +191,7 @@
mContext = context;
Bundle arguments = dialogFragment.getArguments();
mDialogType = arguments.getInt(ARG_DIALOG_TYPE);
+ mShowDialogForNotTranslated = arguments.getBoolean(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED);
mLocaleInfo = (LocaleStore.LocaleInfo) arguments.getSerializable(ARG_TARGET_LOCALE);
mMetricsFeatureProvider =
FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
@@ -215,6 +213,7 @@
bundle.putInt(ARG_DIALOG_TYPE, mDialogType);
bundle.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, mLocaleInfo);
intent.putExtras(bundle);
+ intent.putExtra(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, mShowDialogForNotTranslated);
mParent.onActivityResult(mDialogType, result, intent);
mMetricsFeatureProvider.action(mContext, SettingsEnums.ACTION_CHANGE_LANGUAGE,
changed);
diff --git a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
index 907fe7b..af8b668 100644
--- a/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
+++ b/src/com/android/settings/localepicker/LocaleDragAndDropAdapter.java
@@ -364,12 +364,25 @@
}
public void notifyListChanged(LocaleStore.LocaleInfo localeInfo) {
- if (!localeInfo.getLocale().equals(mCacheItemList.get(0).getLocale())) {
+ if (listChanged()) {
mFeedItemList = new ArrayList<>(mCacheItemList);
notifyDataSetChanged();
}
}
+ private boolean listChanged() {
+ if (mFeedItemList.size() == mCacheItemList.size()) {
+ for (int i = 0; i < mFeedItemList.size(); i++) {
+ if (!mFeedItemList.get(i).getLocale().equals(mCacheItemList.get(i).getLocale())) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return true;
+ }
+ }
+
public void setCacheItemList() {
mCacheItemList = new ArrayList<>(mFeedItemList);
}
diff --git a/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java b/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
index a7ebe32..df0af63 100644
--- a/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
+++ b/src/com/android/settings/localepicker/LocaleLinearLayoutManager.java
@@ -151,7 +151,7 @@
}
if (result) {
- mLocaleListEditor.showConfirmDialog(false, mAdapter.getFeedItemList().get(0));
+ mLocaleListEditor.showConfirmDialog(mAdapter.getFeedItemList().get(0), null);
}
return result;
}
diff --git a/src/com/android/settings/localepicker/LocaleListEditor.java b/src/com/android/settings/localepicker/LocaleListEditor.java
index b1f005a..e2da851 100644
--- a/src/com/android/settings/localepicker/LocaleListEditor.java
+++ b/src/com/android/settings/localepicker/LocaleListEditor.java
@@ -44,6 +44,7 @@
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentManager;
import androidx.preference.Preference;
@@ -235,7 +236,9 @@
localeInfo = mAdapter.getFeedItemList().get(0);
if (resultCode == Activity.RESULT_OK) {
mAdapter.doTheUpdate();
- if (!localeInfo.isTranslated()) {
+ boolean showNotTranslatedDialog = data.getBooleanExtra(
+ LocaleDialogFragment.ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, true);
+ if (showNotTranslatedDialog && !localeInfo.isTranslated()) {
Bundle args = new Bundle();
args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE,
LocaleDialogFragment.DIALOG_NOT_AVAILABLE_LOCALE);
@@ -428,13 +431,10 @@
// to remove.
mRemoveMode = false;
mShowingRemoveDialog = false;
- LocaleStore.LocaleInfo firstLocale =
- mAdapter.getFeedItemList().get(0);
+ Locale defaultBeforeRemoval = Locale.getDefault();
mAdapter.removeChecked();
- boolean isFirstRemoved =
- firstLocale != mAdapter.getFeedItemList().get(0);
- showConfirmDialog(isFirstRemoved, isFirstRemoved ? firstLocale
- : mAdapter.getFeedItemList().get(0));
+ showConfirmDialog(mAdapter.getFeedItemList().get(0),
+ defaultBeforeRemoval);
setRemoveMode(false);
dialogHelper.getDialog().dismiss();
})
@@ -520,27 +520,73 @@
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP
|| event.getAction() == MotionEvent.ACTION_CANCEL) {
- showConfirmDialog(false, mAdapter.getFeedItemList().get(0));
+ showConfirmDialog(mAdapter.getFeedItemList().get(0), null);
}
return false;
}
- public void showConfirmDialog(boolean isFirstRemoved, LocaleStore.LocaleInfo localeInfo) {
+ protected void showConfirmDialog(LocaleStore.LocaleInfo localeInfo,
+ @Nullable Locale defaultLocaleBeforeRemoval) {
Locale currentSystemLocale = LocalePicker.getLocales().get(0);
if (!localeInfo.getLocale().equals(currentSystemLocale)) {
- final LocaleDialogFragment localeDialogFragment =
- LocaleDialogFragment.newInstance();
- Bundle args = new Bundle();
- args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
- args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE,
- isFirstRemoved ? LocaleStore.getLocaleInfo(currentSystemLocale) : localeInfo);
- localeDialogFragment.setArguments(args);
- localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT);
+ displayDialogFragment(localeInfo, true);
} else {
- mAdapter.doTheUpdate();
+ if (!localeInfo.isTranslated()) {
+ if (defaultLocaleBeforeRemoval == null) {
+ showDialogDueToDragAndDrop();
+ } else {
+ showDialogDueToRemoval(defaultLocaleBeforeRemoval);
+ }
+ } else {
+ mAdapter.doTheUpdate();
+ }
}
}
+ private void showDialogDueToDragAndDrop() {
+ LocaleStore.LocaleInfo newLocale = mAdapter.getFeedItemList().stream().filter(
+ i -> i.isTranslated()).findFirst().orElse(null);
+ if (newLocale == null) {
+ return;
+ }
+ LocaleStore.LocaleInfo oldLocale = null;
+ final LocaleList localeList = LocalePicker.getLocales();
+ for (int i = 0; i < localeList.size(); i++) {
+ LocaleStore.LocaleInfo temp = LocaleStore.getLocaleInfo(localeList.get(i));
+ if (temp.isTranslated()) {
+ oldLocale = temp;
+ break;
+ }
+ }
+ if (oldLocale != null && !newLocale.getLocale().equals(
+ oldLocale.getLocale())) {
+ displayDialogFragment(newLocale, false);
+ }
+ }
+
+ private void showDialogDueToRemoval(Locale preDefault) {
+ if (preDefault == null) {
+ return;
+ }
+ LocaleStore.LocaleInfo currentDefault = mAdapter.getFeedItemList().stream().filter(
+ i -> i.isTranslated()).findFirst().orElse(null);
+ if (currentDefault != null && !preDefault.equals(currentDefault.getLocale())) {
+ displayDialogFragment(currentDefault, false);
+ }
+ }
+
+ private void displayDialogFragment(LocaleStore.LocaleInfo localeInfo,
+ boolean showDialogForNotTranslated) {
+ final LocaleDialogFragment localeDialogFragment = LocaleDialogFragment.newInstance();
+ Bundle args = new Bundle();
+ args.putBoolean(LocaleDialogFragment.ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED,
+ showDialogForNotTranslated);
+ args.putInt(LocaleDialogFragment.ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
+ args.putSerializable(LocaleDialogFragment.ARG_TARGET_LOCALE, localeInfo);
+ localeDialogFragment.setArguments(args);
+ localeDialogFragment.show(mFragmentManager, TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT);
+ }
+
// Hide the "Remove" menu if there is only one locale in the list, show it otherwise
// This is called when the menu is first created, and then one add / remove locale
private void updateVisibilityOfRemoveMenu() {
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 46aa19b..7e04f0d 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -17,7 +17,7 @@
import android.content.Context
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
import com.android.settings.accounts.AccountFeatureProvider
import com.android.settings.applications.ApplicationFeatureProvider
@@ -145,9 +145,9 @@
abstract val accessibilitySearchFeatureProvider: AccessibilitySearchFeatureProvider
/**
- * Retrieves implementation for Accessibility metrics category feature.
+ * Retrieves implementation for Accessibility page id category feature.
*/
- abstract val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider
+ abstract val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider
/**
* Retrieves implementation for advanced vpn feature.
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 08abf2b..4949c3f 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -22,8 +22,8 @@
import android.os.UserManager
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProviderImpl
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProviderImpl
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProviderImpl
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
import com.android.settings.accessibility.AccessibilitySearchFeatureProviderImpl
import com.android.settings.accounts.AccountFeatureProvider
@@ -174,8 +174,8 @@
AccessibilitySearchFeatureProviderImpl()
}
- override val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider by lazy {
- AccessibilityMetricsFeatureProviderImpl()
+ override val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider by lazy {
+ AccessibilityPageIdFeatureProviderImpl()
}
override val advancedVpnFeatureProvider by lazy { AdvancedVpnFeatureProviderImpl() }
diff --git a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
index eb28dfb..267b5bc 100644
--- a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
+++ b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
@@ -23,6 +23,7 @@
import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
import static androidx.test.espresso.intent.matcher.IntentMatchers.hasExtra;
+import static com.android.settings.biometrics.BiometricEnrollActivity.EXTRA_LAUNCH_FACE_ENROLL_FIRST;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_BIOMETRICS;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FACE;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT;
@@ -39,6 +40,7 @@
import android.hardware.face.FaceSensorPropertiesInternal;
import android.hardware.fingerprint.FingerprintManager;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;
@@ -145,7 +147,7 @@
assumeTrue(mHasFace || mHasFingerprint);
setPin();
- final Intent intent = getIntent(true /* useInternal */);
+ final Intent intent = getIntent(true /* useInternal */, null);
LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
@@ -163,6 +165,26 @@
}
@Test
+ public void launchWithPinAndPwHandle_confirmsPin_firstEnrollmentIsFace() throws Exception {
+ assumeTrue(mHasFace && mHasFingerprint);
+
+ setPin();
+ final Intent intent = getFaceEnrollFirstIntent();
+ LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
+ LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
+ LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
+ assertThat(response.containsGatekeeperPasswordHandle()).isTrue();
+ intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
+ response.getGatekeeperPasswordHandle());
+ }).get();
+
+ try (ActivityScenario<BiometricEnrollActivity> scenario =
+ ActivityScenario.launch(intent)) {
+ intended(hasComponent(FaceEnroll.class.getName()));
+ }
+ }
+
+ @Test
public void launchWithStrongBiometricAllowed_doNotEnrollWeak() throws Exception {
assumeTrue(mHasFace || mHasFingerprint);
@@ -184,13 +206,22 @@
}
private Intent getIntent() {
- return getIntent(false /* useInternal */);
+ return getIntent(false /* useInternal */, null);
}
- private Intent getIntent(boolean useInternal) {
+ private Intent getFaceEnrollFirstIntent() {
+ final Bundle bundle = new Bundle();
+ bundle.putBoolean(EXTRA_LAUNCH_FACE_ENROLL_FIRST, true);
+ return getIntent(true /* useInternal */, bundle);
+ }
+
+ private Intent getIntent(boolean useInternal, Bundle bundle) {
final Intent intent = new Intent(mContext, useInternal
? BiometricEnrollActivity.InternalActivity.class : BiometricEnrollActivity.class);
intent.setAction(ACTION_BIOMETRIC_ENROLL);
+ if (bundle != null && !bundle.isEmpty()) {
+ intent.putExtras(bundle);
+ }
return intent;
}
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index e590a80..6710da9 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -22,7 +22,6 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -458,12 +457,10 @@
setupFragment();
mFragment.setFeedbackManager(
new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
- when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
- verify(mMenu).add(anyInt(), eq(AccessibilitySettings.MENU_ID_SEND_FEEDBACK),
- anyInt(), eq(mContext.getText(R.string.accessibility_send_feedback_title)));
+ verify(mMenu).add(anyInt(), anyInt(), anyInt(), anyInt());
}
@Test
@@ -472,12 +469,10 @@
setupFragment();
mFragment.setFeedbackManager(
new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
- when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
- verify(mMenu, never()).add(anyInt(), eq(AccessibilitySettings.MENU_ID_SEND_FEEDBACK),
- anyInt(), eq(mContext.getText(R.string.accessibility_send_feedback_title)));
+ verify(mMenu, never()).add(anyInt(), anyInt(), anyInt(), anyInt());
}
@Test
@@ -486,8 +481,6 @@
setupFragment();
mFragment.setFeedbackManager(
new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
- when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
- mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
when(mMenuItem.getItemId()).thenReturn(AccessibilitySettings.MENU_ID_SEND_FEEDBACK);
mFragment.onOptionsItemSelected(mMenuItem);
@@ -502,8 +495,6 @@
setupFragment();
mFragment.setFeedbackManager(
new FeedbackManager(mFragment.getActivity(), PACKAGE_NAME, DEFAULT_CATEGORY));
- when(mMenu.add(anyInt(), anyInt(), anyInt(), anyInt())).thenReturn(mMenuItem);
- mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
when(mMenuItem.getItemId()).thenReturn(AccessibilitySettings.MENU_ID_SEND_FEEDBACK);
mFragment.onOptionsItemSelected(mMenuItem);
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
index 8f9d2e1..571075c 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragmentTest.java
@@ -23,9 +23,12 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -37,10 +40,13 @@
import android.content.pm.PackageManager;
import android.icu.text.CaseMap;
import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.Settings;
import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityManager;
@@ -66,8 +72,9 @@
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.shadow.api.Shadow;
@@ -84,6 +91,8 @@
})
public class ToggleFeaturePreferenceFragmentTest {
@Rule
+ public final MockitoRule mocks = MockitoJUnit.rule();
+ @Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
private static final String PLACEHOLDER_PACKAGE_NAME = "com.placeholder.example";
@@ -96,6 +105,7 @@
PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_TILE_CLASS_NAME);
private static final String PLACEHOLDER_TILE_TOOLTIP_CONTENT =
PLACEHOLDER_PACKAGE_NAME + "tooltip_content";
+ private static final String PLACEHOLDER_CATEGORY = "category";
private static final String PLACEHOLDER_DIALOG_TITLE = "title";
private static final String DEFAULT_SUMMARY = "default summary";
private static final String DEFAULT_DESCRIPTION = "default description";
@@ -120,10 +130,13 @@
private ContentResolver mContentResolver;
@Mock
private PackageManager mPackageManager;
+ @Mock
+ private Menu mMenu;
+ @Mock
+ private MenuItem mMenuItem;
@Before
public void setUpTestFragment() {
- MockitoAnnotations.initMocks(this);
mShadowAccessibilityManager = Shadow.extract(
mContext.getSystemService(AccessibilityManager.class));
@@ -170,6 +183,61 @@
}
@Test
+ @EnableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+ public void onCreateOptionsMenu_enableLowVisionGenericFeedback_shouldAddSendFeedbackMenu() {
+ mFragment.setFeedbackManager(
+ new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+
+ mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
+
+ verify(mMenu).add(anyInt(), eq(ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK),
+ anyInt(), eq(R.string.accessibility_send_feedback_title));
+ }
+
+ @Test
+ @DisableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+ public void onCreateOptionsMenu_disableLowVisionGenericFeedback_shouldNotAddSendFeedbackMenu() {
+ mFragment.setFeedbackManager(
+ new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+
+ mFragment.onCreateOptionsMenu(mMenu, /* inflater= */ null);
+
+ verify(mMenu, never()).add(anyInt(),
+ eq(ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK), anyInt(),
+ eq(R.string.accessibility_send_feedback_title));
+ }
+
+ @Test
+ @EnableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+ public void onOptionsItemSelected_enableLowVisionGenericFeedback_shouldStartSendFeedback() {
+ mFragment.setFeedbackManager(
+ new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+ when(mMenuItem.getItemId()).thenReturn(
+ ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK);
+
+ mFragment.onOptionsItemSelected(mMenuItem);
+
+ verify(mActivity).startActivityForResult(
+ argThat(intent -> intent != null
+ && Intent.ACTION_BUG_REPORT.equals(intent.getAction())), anyInt());
+ }
+
+ @Test
+ @DisableFlags(com.android.server.accessibility.Flags.FLAG_ENABLE_LOW_VISION_GENERIC_FEEDBACK)
+ public void onOptionsItemSelected_disableLowVisionGenericFeedback_shouldNotStartSendFeedback() {
+ mFragment.setFeedbackManager(
+ new FeedbackManager(mActivity, PLACEHOLDER_PACKAGE_NAME, PLACEHOLDER_CATEGORY));
+ when(mMenuItem.getItemId()).thenReturn(
+ ToggleFeaturePreferenceFragment.MENU_ID_SEND_FEEDBACK);
+
+ mFragment.onOptionsItemSelected(mMenuItem);
+
+ verify(mActivity, never()).startActivityForResult(
+ argThat(intent -> intent != null
+ && Intent.ACTION_BUG_REPORT.equals(intent.getAction())), anyInt());
+ }
+
+ @Test
public void updateShortcutPreferenceData_assignDefaultValueToVariable() {
mFragment.mComponentName = PLACEHOLDER_COMPONENT_NAME;
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
index 65c9caf..7149d4f 100644
--- a/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/ExternalSourcesDetailsTest.java
@@ -333,7 +333,7 @@
@RequiresFlagsEnabled(android.security.Flags.FLAG_AAPM_FEATURE_DISABLE_INSTALL_UNKNOWN_SOURCES)
@Test
- public void getPreferenceSummary_restrictedGlobally_adminString() {
+ public void getPreferenceSummary_restrictedGloballyByAdmin_adminString() {
final EnforcingAdmin nonAdvancedProtectionEnforcingAdmin = new EnforcingAdmin("test.pkg",
UnknownAuthority.UNKNOWN_AUTHORITY, mUserHandle, new ComponentName("", ""));
@@ -353,7 +353,7 @@
@RequiresFlagsEnabled(Flags.FLAG_AAPM_FEATURE_DISABLE_INSTALL_UNKNOWN_SOURCES)
@Test
- public void getPreferenceSummary_restrictedGlobally_advancedProtectionString() {
+ public void getPreferenceSummary_restrictedGloballyByAdvancedProtection_disabledString() {
final EnforcingAdmin advancedProtectionEnforcingAdmin = new EnforcingAdmin("test.pkg",
new UnknownAuthority(ADVANCED_PROTECTION_SYSTEM_ENTITY), mUserHandle,
new ComponentName("", ""));
@@ -363,12 +363,10 @@
advancedProtectionEnforcingAdmin);
when(mUserManager.hasUserRestrictionForUser(DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY,
mUserHandle)).thenReturn(true);
- when(mContext.getString(
- com.android.settingslib.widget.restricted.R.string.disabled_by_advanced_protection))
- .thenReturn("disabled_by_advanced_protection");
+ when(mContext.getString(com.android.settingslib.R.string.disabled)).thenReturn("disabled");
CharSequence summary = ExternalSourcesDetails.getPreferenceSummary(mContext, mAppEntry);
- assertEquals("disabled_by_advanced_protection", summary.toString());
+ assertEquals("disabled", summary.toString());
}
}
diff --git a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
index 4272afe..22d39e3 100644
--- a/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
+++ b/tests/robotests/src/com/android/settings/localepicker/LocaleListEditorTest.java
@@ -36,7 +36,6 @@
import android.app.Dialog;
import android.app.IActivityManager;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -100,6 +99,8 @@
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
private static final String ARG_DIALOG_TYPE = "arg_dialog_type";
+ private static final String
+ ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED = "arg_show_dialog_for_not_translated";
private static final String TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT = "dialog_confirm_system_default";
private static final String TAG_DIALOG_NOT_AVAILABLE = "dialog_not_available_locale";
private static final String TAG_DIALOG_ADD_SYSTEM_LOCALE = "dialog_add_system_locale";
@@ -123,6 +124,10 @@
@Mock
private LocaleStore.LocaleInfo mLocaleInfo;
@Mock
+ private LocaleStore.LocaleInfo mLocaleInfo1;
+ @Mock
+ private LocaleStore.LocaleInfo mLocaleInfo2;
+ @Mock
private FragmentManager mFragmentManager;
@Mock
private FragmentTransaction mFragmentTransaction;
@@ -270,7 +275,7 @@
public void showConfirmDialog_systemLocaleSelected_shouldShowLocaleChangeDialog()
throws Exception {
//pre-condition
- setUpLocaleConditions();
+ setUpLocaleConditions(true);
final Configuration config = new Configuration();
config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US")));
when(mActivityService.getConfiguration()).thenReturn(config);
@@ -300,6 +305,41 @@
}
@Test
+ public void showConfirmDialog_2ndLocaleSelected_shouldShowLocaleChangeDialog()
+ throws Exception {
+ //pre-condition
+ Locale.setDefault(Locale.forLanguageTag("en-US"));
+ setUpLocaleConditions2();
+ final Configuration config = new Configuration();
+ config.setLocales((LocaleList.forLanguageTags("blo-BJ,en-US,zh-TW")));
+ when(mActivityService.getConfiguration()).thenReturn(config);
+ when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
+ when(mAdapter.getCheckedCount()).thenReturn(1);
+ when(mAdapter.getItemCount()).thenReturn(3);
+ when(mAdapter.isFirstLocaleChecked()).thenReturn(false);
+ ReflectionHelpers.setField(mLocaleListEditor, "mRemoveMode", true);
+ ReflectionHelpers.setField(mLocaleListEditor, "mShowingRemoveDialog", true);
+
+ //launch the first dialog
+ mLocaleListEditor.showRemoveLocaleWarningDialog();
+
+ final Dialog dialog = ShadowDialog.getLatestDialog();
+
+ assertThat(dialog).isNotNull();
+
+ // click the remove button
+ dialog.findViewById(R.id.button_ok).performClick();
+ ShadowLooper.idleMainLooper();
+
+ assertThat(dialog.isShowing()).isFalse();
+
+ // check the second dialog is showing
+ verify(mFragmentTransaction).add(any(LocaleDialogFragment.class),
+ eq(TAG_DIALOG_CONFIRM_SYSTEM_DEFAULT));
+ }
+
+
+ @Test
public void mayAppendUnicodeTags_appendUnicodeTags_success() {
LocaleStore.LocaleInfo localeInfo = LocaleStore.fromLocale(Locale.forLanguageTag("en-US"));
@@ -315,7 +355,8 @@
Bundle bundle = new Bundle();
bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
mIntent.putExtras(bundle);
- setUpLocaleConditions();
+ mIntent.putExtra(ARG_SHOW_DIALOG_FOR_NOT_TRANSLATED, true);
+ setUpLocaleConditions(false);
mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_OK,
mIntent);
@@ -328,7 +369,7 @@
Bundle bundle = new Bundle();
bundle.putInt(ARG_DIALOG_TYPE, DIALOG_CONFIRM_SYSTEM_DEFAULT);
mIntent.putExtras(bundle);
- setUpLocaleConditions();
+ setUpLocaleConditions(true);
mLocaleListEditor.onActivityResult(REQUEST_CONFIRM_SYSTEM_DEFAULT, Activity.RESULT_CANCELED,
mIntent);
@@ -338,7 +379,7 @@
@Test
public void onTouch_dragDifferentLocaleToTop_showConfirmDialog() throws Exception {
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
- setUpLocaleConditions();
+ setUpLocaleConditions(true);
final Configuration config = new Configuration();
config.setLocales((LocaleList.forLanguageTags("zh-TW,en-US")));
when(mActivityService.getConfiguration()).thenReturn(config);
@@ -352,7 +393,7 @@
@Test
public void onTouch_dragSameLocaleToTop_updateAdapter() throws Exception {
MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0.0f, 0.0f, 0);
- setUpLocaleConditions();
+ setUpLocaleConditions(true);
final Configuration config = new Configuration();
config.setLocales((LocaleList.forLanguageTags("en-US,zh-TW")));
when(mActivityService.getConfiguration()).thenReturn(config);
@@ -490,12 +531,26 @@
verify(mAdapter).setCheckBoxDescription(any(LocaleDragCell.class), any(), anyBoolean());
}
- private void setUpLocaleConditions() {
+ private void setUpLocaleConditions(boolean isTranslated) {
ShadowActivityManager.setService(mActivityService);
mLocaleList = new ArrayList<>();
mLocaleList.add(mLocaleInfo);
when(mLocaleInfo.getFullNameNative()).thenReturn("English");
when(mLocaleInfo.getLocale()).thenReturn(LocaleList.forLanguageTags("en-US").get(0));
+ when(mLocaleInfo.isTranslated()).thenReturn(isTranslated);
+ when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
+ }
+
+ private void setUpLocaleConditions2() {
+ ShadowActivityManager.setService(mActivityService);
+ mLocaleList = new ArrayList<>();
+ mLocaleList.add(mLocaleInfo);
+ mLocaleList.add(mLocaleInfo1);
+ mLocaleList.add(mLocaleInfo2);
+ when(mLocaleInfo.getLocale()).thenReturn(Locale.forLanguageTag("blo-BJ"));
+ when(mLocaleInfo.isTranslated()).thenReturn(false);
+ when(mLocaleInfo2.getLocale()).thenReturn(Locale.forLanguageTag("zh-TW"));
+ when(mLocaleInfo2.isTranslated()).thenReturn(true);
when(mAdapter.getFeedItemList()).thenReturn(mLocaleList);
}
}
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index c5d4c36..e002de1 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -20,7 +20,7 @@
import android.content.Context;
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider;
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -94,7 +94,7 @@
public WifiTrackerLibProvider wifiTrackerLibProvider;
public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
- public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
+ public AccessibilityPageIdFeatureProvider mAccessibilityPageIdFeatureProvider;
public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider;
public WifiFeatureProvider mWifiFeatureProvider;
public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
@@ -145,7 +145,7 @@
wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
- mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
+ mAccessibilityPageIdFeatureProvider = mock(AccessibilityPageIdFeatureProvider.class);
mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class);
mWifiFeatureProvider = mock(WifiFeatureProvider.class);
mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
@@ -294,8 +294,8 @@
}
@Override
- public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
- return mAccessibilityMetricsFeatureProvider;
+ public AccessibilityPageIdFeatureProvider getAccessibilityPageIdFeatureProvider() {
+ return mAccessibilityPageIdFeatureProvider;
}
@Override
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 56dd444..7b1bdc0 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -18,7 +18,7 @@
import android.content.Context
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider
import com.android.settings.accounts.AccountFeatureProvider
import com.android.settings.applications.ApplicationFeatureProvider
@@ -130,7 +130,7 @@
get() = TODO("Not yet implemented")
override val accessibilitySearchFeatureProvider: AccessibilitySearchFeatureProvider
get() = TODO("Not yet implemented")
- override val accessibilityMetricsFeatureProvider: AccessibilityMetricsFeatureProvider
+ override val accessibilityPageIdFeatureProvider: AccessibilityPageIdFeatureProvider
get() = TODO("Not yet implemented")
override val advancedVpnFeatureProvider: AdvancedVpnFeatureProvider
get() = TODO("Not yet implemented")
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index d77d7a4..eda0aeb 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -20,7 +20,7 @@
import android.content.Context;
import com.android.settings.accessibility.AccessibilityFeedbackFeatureProvider;
-import com.android.settings.accessibility.AccessibilityMetricsFeatureProvider;
+import com.android.settings.accessibility.AccessibilityPageIdFeatureProvider;
import com.android.settings.accessibility.AccessibilitySearchFeatureProvider;
import com.android.settings.accounts.AccountFeatureProvider;
import com.android.settings.applications.ApplicationFeatureProvider;
@@ -93,7 +93,7 @@
public WifiTrackerLibProvider wifiTrackerLibProvider;
public SecuritySettingsFeatureProvider securitySettingsFeatureProvider;
public AccessibilitySearchFeatureProvider mAccessibilitySearchFeatureProvider;
- public AccessibilityMetricsFeatureProvider mAccessibilityMetricsFeatureProvider;
+ public AccessibilityPageIdFeatureProvider mAccessibilityPageIdFeatureProvider;
public AdvancedVpnFeatureProvider mAdvancedVpnFeatureProvider;
public WifiFeatureProvider mWifiFeatureProvider;
public KeyboardSettingsFeatureProvider mKeyboardSettingsFeatureProvider;
@@ -146,7 +146,7 @@
wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
- mAccessibilityMetricsFeatureProvider = mock(AccessibilityMetricsFeatureProvider.class);
+ mAccessibilityPageIdFeatureProvider = mock(AccessibilityPageIdFeatureProvider.class);
mAdvancedVpnFeatureProvider = mock(AdvancedVpnFeatureProvider.class);
mWifiFeatureProvider = mock(WifiFeatureProvider.class);
mKeyboardSettingsFeatureProvider = mock(KeyboardSettingsFeatureProvider.class);
@@ -295,8 +295,8 @@
}
@Override
- public AccessibilityMetricsFeatureProvider getAccessibilityMetricsFeatureProvider() {
- return mAccessibilityMetricsFeatureProvider;
+ public AccessibilityPageIdFeatureProvider getAccessibilityPageIdFeatureProvider() {
+ return mAccessibilityPageIdFeatureProvider;
}
@Override