diff --git a/res/values/arrays.xml b/res/values/arrays.xml index ef75d031ccc..194e8fb21e6 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -1419,4 +1419,16 @@ @string/enhanced_4g_lte_mode_summary_4g_calling + + + + + + @string/rtt_settings_no_visible + + @string/rtt_settings_visible_during_call + + @string/rtt_settings_always_visible + + diff --git a/res/values/config.xml b/res/values/config.xml index a39533e0e68..b3eceb3c732 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -420,4 +420,8 @@ + + + + diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml index d9c61b59e6a..3e27117c7e5 100644 --- a/res/xml/accessibility_settings.xml +++ b/res/xml/accessibility_settings.xml @@ -144,6 +144,12 @@ android:summary="@string/accessibility_hearingaid_not_connected_summary" android:title="@string/accessibility_hearingaid_title"/> + + 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 00000000000..6f3f77d49b4 --- /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 00000000000..5eaf2a4f42c --- /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. + * + *

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