Merge "Update api name" am: f82f807e03 am: c36a071238
Change-Id: I4f69bebb7f926588dd326061d030982d324b9b9b
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index b9a1939..e2524bc 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -1422,4 +1422,16 @@
<item>@string/enhanced_4g_lte_mode_summary_4g_calling</item>
</string-array>
+ <!--String arrays for showing the rtt settings options -->
+ <string-array name="rtt_setting_mode">
+ <!-- 0: Invalid value -->
+ <item></item>
+ <!-- 1: Not visible -->
+ <item>@string/rtt_settings_no_visible</item>
+ <!-- 2: Visible during call -->
+ <item>@string/rtt_settings_visible_during_call</item>
+ <!-- 3: Always visible -->
+ <item>@string/rtt_settings_always_visible</item>
+ </string-array>
+
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index e4b4812..147a73e 100755
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -420,4 +420,8 @@
<!-- RTT setting intent action -->
<string name="config_rtt_setting_intent_action" translatable="false"></string>
+
+ <!-- Package name of dialer supports RTT setting-->
+ <string name="config_rtt_setting_package_name" translatable="false"></string>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 92db0fb..c416e24 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -827,7 +827,7 @@
<!-- Button text in face settings which lets the user enroll their face [CHAR LIMIT=40] -->
<string name="security_settings_face_settings_enroll">Set up face unlock</string>
<!-- Text shown in face settings explaining what your face can be used for. [CHAR LIMIT=NONE] -->
- <string name="security_settings_face_settings_footer">Use face unlock to unlock your device, sign in to apps, and confirm payments.\n\nKeep in mind:\nLooking at the phone can unlock it when you don\u2019t intend to.\n\nYour phone can be unlocked by someone else if it\u2019s held up to your face while your eyes are open.\n\nYour phone can be unlocked by someone who looks a lot like you, say, an identical sibling.</string>
+ <string name="security_settings_face_settings_footer">Use face unlock to unlock your device, sign in to apps, and confirm payments.\n\nKeep in mind:\nLooking at the phone can unlock it when you don\u2019t intend to.\n\nYour phone can be unlocked by someone else if it\u2019s held up to your face.\n\nYour phone can be unlocked by someone who looks a lot like you, say, an identical sibling.</string>
<!-- Text shown in face settings explaining what your face can be used for. Used when attention checking is not supported. [CHAR LIMIT=NONE] -->
<string name="security_settings_face_settings_footer_attention_not_supported">Use face unlock to unlock your device, sign in to apps, and confirm payments.\n\nKeep in mind:\nLooking at the phone can unlock it when you don\u2019t intend to.\n\nYour phone can be unlocked by someone else if it\u2019s held up to your face, even if your eyes are closed.\n\nYour phone can be unlocked by someone who looks a lot like you, say, an identical sibling.</string>
<!-- Dialog title shown when the user removes an enrollment [CHAR LIMIT=35] -->
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index d9c61b5..3e27117 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -145,6 +145,12 @@
android:title="@string/accessibility_hearingaid_title"/>
<Preference
+ android:key="rtt_setting"
+ android:summary="@string/summary_placeholder"
+ android:title="@string/rtt_settings_title"
+ settings:controller="com.android.settings.accessibility.RTTSettingPreferenceController"/>
+
+ <Preference
android:fragment="com.android.settings.accessibility.CaptionPropertiesFragment"
android:key="captioning_preference_screen"
android:title="@string/accessibility_captioning_title" />
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index cb98892..3d1e946 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -121,6 +121,7 @@
"accessibility_shortcut_preference";
private static final String HEARING_AID_PREFERENCE =
"hearing_aid_preference";
+ private static final String RTT_SETTINGS_SCREEN = "rtt_setting";
private static final String CAPTIONING_PREFERENCE_SCREEN =
"captioning_preference_screen";
private static final String DISPLAY_MAGNIFICATION_PREFERENCE_SCREEN =
@@ -240,6 +241,7 @@
private Preference mAccessibilityShortcutPreferenceScreen;
private Preference mDisplayDaltonizerPreferenceScreen;
private Preference mHearingAidPreference;
+ private Preference mRTTPreference;
private Preference mVibrationPreferenceScreen;
private Preference mLiveCaptionPreference;
private SwitchPreference mToggleInversionPreference;
@@ -248,6 +250,7 @@
private SwitchPreference mDarkUIModePreference;
private DarkUIPreferenceController mDarkUIPreferenceController;
private LiveCaptionPreferenceController mLiveCaptionPreferenceController;
+ private RTTSettingPreferenceController mRTTSettingPreferenceController;
private int mLongPressTimeoutDefault;
@@ -309,6 +312,9 @@
mLiveCaptionPreferenceController = new LiveCaptionPreferenceController(context,
LIVE_CAPTION_PREFERENCE_KEY);
+ mRTTSettingPreferenceController =
+ new RTTSettingPreferenceController(context, RTT_SETTINGS_SCREEN);
+
}
@Override
@@ -503,6 +509,11 @@
mHearingAidPreference = findPreference(HEARING_AID_PREFERENCE);
mHearingAidPreferenceController.displayPreference(getPreferenceScreen());
+ // RTT Setting
+ mRTTPreference = findPreference(RTT_SETTINGS_SCREEN);
+ mRTTSettingPreferenceController.displayPreference(getPreferenceScreen());
+
+
// Captioning.
mCaptioningPreferenceScreen = findPreference(CAPTIONING_PREFERENCE_SCREEN);
@@ -787,6 +798,8 @@
mHearingAidPreferenceController.updateState(mHearingAidPreference);
+ mRTTSettingPreferenceController.updateState(mRTTPreference);
+
mLiveCaptionPreferenceController.updateState(mLiveCaptionPreference);
updateFeatureSummary(Settings.Secure.ACCESSIBILITY_CAPTIONING_ENABLED,
diff --git a/src/com/android/settings/accessibility/RTTSettingPreferenceController.java b/src/com/android/settings/accessibility/RTTSettingPreferenceController.java
new file mode 100644
index 0000000..d455fc1
--- /dev/null
+++ b/src/com/android/settings/accessibility/RTTSettingPreferenceController.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2020 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.accessibility;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.telecom.TelecomManager;
+import android.text.TextUtils;
+
+import androidx.annotation.VisibleForTesting;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.R;
+import com.android.settings.core.BasePreferenceController;
+
+import java.util.List;
+
+/** A controller to control the status for RTT setting in Accessibility screen.*/
+public class RTTSettingPreferenceController extends BasePreferenceController {
+
+ private static final String DIALER_RTT_CONFIGURATION = "dialer_rtt_configuration";
+
+ private final Context mContext;
+ private final PackageManager mPackageManager;
+ private final TelecomManager mTelecomManager;
+ private final CharSequence[] mModes;
+ private final String mDialerPackage;
+
+ @VisibleForTesting
+ Intent mRTTIntent;
+
+ public RTTSettingPreferenceController(Context context, String preferenceKey) {
+ super(context, preferenceKey);
+ mContext = context;
+ mModes = mContext.getResources().getTextArray(R.array.rtt_setting_mode);
+ mDialerPackage = mContext.getString(R.string.config_rtt_setting_package_name);
+ mPackageManager = context.getPackageManager();
+ mTelecomManager = context.getSystemService(TelecomManager.class);
+ mRTTIntent = new Intent(context.getString(R.string.config_rtt_setting_intent_action));
+ }
+
+ @Override
+ public int getAvailabilityStatus() {
+ final List<ResolveInfo> resolved =
+ mPackageManager.queryIntentActivities(mRTTIntent, 0 /* flags */);
+ return resolved != null && !resolved.isEmpty() && isDialerSupportRTTSetting()
+ ? AVAILABLE
+ : UNSUPPORTED_ON_DEVICE;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ super.displayPreference(screen);
+ final Preference pref = screen.findPreference(getPreferenceKey());
+ pref.setIntent(mRTTIntent);
+ }
+
+ @Override
+ public CharSequence getSummary() {
+ final int option = Settings.Secure.getInt(mContext.getContentResolver(),
+ DIALER_RTT_CONFIGURATION, 1 /* not visible */);
+ return mModes[option];
+ }
+
+ @VisibleForTesting
+ boolean isDialerSupportRTTSetting() {
+ return TextUtils.equals(mTelecomManager.getDefaultDialerPackage(), mDialerPackage);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/accessibility/RTTSettingPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/RTTSettingPreferenceControllerTest.java
new file mode 100644
index 0000000..6f3f77d
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/accessibility/RTTSettingPreferenceControllerTest.java
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2020 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.accessibility;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ResolveInfo;
+
+import com.android.settings.core.BasePreferenceController;
+import com.android.settings.testutils.ResolveInfoBuilder;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowPackageManager;
+
+@RunWith(RobolectricTestRunner.class)
+public class RTTSettingPreferenceControllerTest {
+
+ private Context mContext;
+ private ShadowPackageManager mShadowPackageManager;
+ private RTTSettingPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mShadowPackageManager = shadowOf(mContext.getPackageManager());
+ mController = spy(new RTTSettingPreferenceController(mContext, "rtt_setting"));
+ mController.mRTTIntent = new Intent("com.android.test.action.example");
+ }
+
+ @Test
+ public void getAvailabilityStatus_defaultDialerIsExpected_intentCanBeHandled_returnAVAILABLE() {
+ // Default dialer is expected.
+ doReturn(true).when(mController).isDialerSupportRTTSetting();
+ // Intent can be handled.
+ final ResolveInfo info = new ResolveInfoBuilder("pkg")
+ .setActivity("pkg", "class").build();
+ final Intent intent = new Intent("com.android.test.action.example");
+ mShadowPackageManager.addResolveInfoForIntent(intent, info);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.AVAILABLE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_intentCanNotBeHandled_shouldReturnUNSUPPORTED_ON_DEVICE() {
+ // Default dialer is expected.
+ doReturn(true).when(mController).isDialerSupportRTTSetting();
+ // Intent can not be handled.
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ }
+
+ @Test
+ public void getAvailabilityStatus_defaultDialerIsNotExpected_returnUNSUPPORTED_ON_DEVICE() {
+ // Default dialer is not expected.
+ doReturn(false).when(mController).isDialerSupportRTTSetting();
+ // Intent can be handled.
+ final ResolveInfo info = new ResolveInfoBuilder("pkg")
+ .setActivity("pkg", "class").build();
+ final Intent intent = new Intent("com.android.test.action.example");
+ mShadowPackageManager.addResolveInfoForIntent(intent, info);
+
+ assertThat(mController.getAvailabilityStatus())
+ .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE);
+ }
+}
diff --git a/tests/robotests/src/com/android/settings/testutils/ResolveInfoBuilder.java b/tests/robotests/src/com/android/settings/testutils/ResolveInfoBuilder.java
new file mode 100644
index 0000000..5eaf2a4
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/testutils/ResolveInfoBuilder.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2020 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.testutils;
+
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Helper for building {@link ResolveInfo}s to be used in Robolectric tests.
+ *
+ * <p>The resulting {@link PackageInfo}s should typically be added to {@link
+ * org.robolectric.shadows.ShadowPackageManager#addResolveInfoForIntent(Intent, ResolveInfo)}.
+ */
+public final class ResolveInfoBuilder {
+
+ private final String mPackageName;
+ private ActivityInfo mActivityInfo;
+ private ProviderInfo mProviderInfo;
+
+ public ResolveInfoBuilder(String packageName) {
+ this.mPackageName = Preconditions.checkNotNull(packageName);
+ }
+
+ public ResolveInfoBuilder setActivity(String packageName, String className) {
+ mActivityInfo = new ActivityInfo();
+ mActivityInfo.packageName = packageName;
+ mActivityInfo.name = className;
+ return this;
+ }
+
+ public ResolveInfoBuilder setProvider(
+ String packageName, String className, String authority, boolean isSystemApp) {
+ mProviderInfo = new ProviderInfo();
+ mProviderInfo.authority = authority;
+ mProviderInfo.applicationInfo = new ApplicationInfo();
+ if (isSystemApp) {
+ mProviderInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM;
+ }
+ mProviderInfo.packageName = mPackageName;
+ mProviderInfo.applicationInfo.packageName = mPackageName;
+ mProviderInfo.name = className;
+ return this;
+ }
+
+ public ResolveInfo build() {
+ ResolveInfo info = new ResolveInfo();
+ info.activityInfo = mActivityInfo;
+ info.resolvePackageName = mPackageName;
+ info.providerInfo = mProviderInfo;
+ return info;
+ }
+}