From 6db89c73d6a9c70c40b31dd715f89e548f4fb0db Mon Sep 17 00:00:00 2001 From: Xinyi Zhou Date: Thu, 4 Aug 2022 01:44:34 +0000 Subject: [PATCH] Revert "Delete Fast Pair Settings" This reverts commit 3438e20da1bbb6d9c6af88b0fd468d0c3c59bfd0. Reason for revert: Fast Pair Project is resumed Test: loaded on device Change-Id: I54f68794be9c527c5c873e301aada51bcdb6e298 --- res/drawable/ic_fast_pair_24dp.xml | 36 +++++ res/values/strings.xml | 16 +++ res/xml/connected_devices_advanced.xml | 9 ++ res/xml/fast_pair_settings.xml | 32 +++++ .../nearby/FastPairPreferenceController.java | 41 ++++++ .../nearby/FastPairSettingsFragment.java | 125 ++++++++++++++++++ .../FastPairPreferenceControllerTest.java | 52 ++++++++ .../nearby/FastPairSettingsFragmentTest.java | 47 +++++++ 8 files changed, 358 insertions(+) create mode 100644 res/drawable/ic_fast_pair_24dp.xml create mode 100644 res/xml/fast_pair_settings.xml create mode 100644 src/com/android/settings/nearby/FastPairPreferenceController.java create mode 100644 src/com/android/settings/nearby/FastPairSettingsFragment.java create mode 100644 tests/unit/src/com/android/settings/nearby/FastPairPreferenceControllerTest.java create mode 100644 tests/unit/src/com/android/settings/nearby/FastPairSettingsFragmentTest.java diff --git a/res/drawable/ic_fast_pair_24dp.xml b/res/drawable/ic_fast_pair_24dp.xml new file mode 100644 index 00000000000..17bfdd9143f --- /dev/null +++ b/res/drawable/ic_fast_pair_24dp.xml @@ -0,0 +1,36 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 28055ab297a..4329d3df132 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -5938,6 +5938,19 @@ + + + + + Fast Pair + + + Nearby detection of Fast Pair bluetooth devices. + + Scan for nearby devices + + Saved devices + @@ -8124,6 +8137,9 @@ connected, device, headphones, headset, speaker, wireless, pair, earbuds, music, media + + pair, earbuds, bluetooth + background, theme, grid, customize, personalize diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml index 152446c38c7..e7d178c61f8 100644 --- a/res/xml/connected_devices_advanced.xml +++ b/res/xml/connected_devices_advanced.xml @@ -67,6 +67,15 @@ android:summary="@string/summary_placeholder" settings:controller="com.android.settings.uwb.UwbPreferenceController"/> + + diff --git a/res/xml/fast_pair_settings.xml b/res/xml/fast_pair_settings.xml new file mode 100644 index 00000000000..95662fc47ed --- /dev/null +++ b/res/xml/fast_pair_settings.xml @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/src/com/android/settings/nearby/FastPairPreferenceController.java b/src/com/android/settings/nearby/FastPairPreferenceController.java new file mode 100644 index 00000000000..a1152022c6b --- /dev/null +++ b/src/com/android/settings/nearby/FastPairPreferenceController.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2022 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.nearby; + +import android.content.Context; + +import androidx.lifecycle.LifecycleObserver; + +import com.android.settings.core.BasePreferenceController; + +/** + * {@link BasePreferenceController} for Fast Pair settings. + */ +public class FastPairPreferenceController extends BasePreferenceController implements + LifecycleObserver { + public static final String TAG = "FastPairPrefController"; + public static final String KEY_FAST_PAIR_SETTINGS = "connected_device_fast_pair"; + + public FastPairPreferenceController(Context context) { + super(context, KEY_FAST_PAIR_SETTINGS); + } + + @Override + public int getAvailabilityStatus() { + return AVAILABLE; + } +} diff --git a/src/com/android/settings/nearby/FastPairSettingsFragment.java b/src/com/android/settings/nearby/FastPairSettingsFragment.java new file mode 100644 index 00000000000..a92833a3db7 --- /dev/null +++ b/src/com/android/settings/nearby/FastPairSettingsFragment.java @@ -0,0 +1,125 @@ +/* + * Copyright (C) 2022 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.nearby; + +import android.app.settings.SettingsEnums; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.Bundle; +import android.provider.Settings; +import android.text.TextUtils; +import android.util.Log; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; + +import com.android.settings.R; +import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.widget.MainSwitchPreference; + +import java.util.Objects; + +/** + * Fragment with the top level fast pair settings. + */ +@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC) +public class FastPairSettingsFragment extends SettingsPreferenceFragment { + + private static final String TAG = "FastPairSettingsFrag"; + + private static final String SCAN_SWITCH_KEY = "fast_pair_scan_switch"; + private static final String SAVED_DEVICES_PREF_KEY = "saved_devices"; + + @Override + public void onCreate(Bundle icicle) { + super.onCreate(icicle); + + MainSwitchPreference mainSwitchPreference = Objects.requireNonNull( + findPreference(SCAN_SWITCH_KEY)); + mainSwitchPreference.setChecked(false); + + Preference savedDevicePref = Objects.requireNonNull( + findPreference(SAVED_DEVICES_PREF_KEY)); + savedDevicePref.setOnPreferenceClickListener(preference -> { + Intent savedDevicesIntent = getSavedDevicesIntent(); + if (savedDevicesIntent != null && getActivity() != null) { + getActivity().startActivity(savedDevicesIntent); + } + return true; + }); + } + + @Override + public int getMetricsCategory() { + return SettingsEnums.CONNECTION_DEVICE_ADVANCED_FAST_PAIR; + } + + @Override + public int getHelpResource() { + return 0; + } + + @Override + protected int getPreferenceScreenResId() { + return R.xml.fast_pair_settings; + } + + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = + new BaseSearchIndexProvider(R.xml.fast_pair_settings); + + @Nullable + private ComponentName getSavedDevicesComponent() { + String savedDevicesComponent = Settings.Secure.getString( + getContentResolver(), + Settings.Secure.NEARBY_FAST_PAIR_SETTINGS_DEVICES_COMPONENT); + if (TextUtils.isEmpty(savedDevicesComponent)) { + savedDevicesComponent = getString( + com.android.internal.R.string.config_defaultNearbyFastPairSettingsDevicesComponent); + } + + if (TextUtils.isEmpty(savedDevicesComponent)) { + return null; + } + + return ComponentName.unflattenFromString(savedDevicesComponent); + } + + @Nullable + private Intent getSavedDevicesIntent() { + ComponentName componentName = getSavedDevicesComponent(); + if (componentName == null) { + return null; + } + + PackageManager pm = getPackageManager(); + Intent intent = getIntent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setComponent(componentName); + + final ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.GET_META_DATA); + if (resolveInfo == null || resolveInfo.activityInfo == null) { + Log.e(TAG, "Device-specified fast pair component (" + componentName + + ") not available"); + return null; + } + return intent; + } +} diff --git a/tests/unit/src/com/android/settings/nearby/FastPairPreferenceControllerTest.java b/tests/unit/src/com/android/settings/nearby/FastPairPreferenceControllerTest.java new file mode 100644 index 00000000000..f06be4b2288 --- /dev/null +++ b/tests/unit/src/com/android/settings/nearby/FastPairPreferenceControllerTest.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2022 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.nearby; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; + +import android.content.Context; +import android.os.Looper; + +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class FastPairPreferenceControllerTest { + + private Context mContext; + private FastPairPreferenceController mController; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + mController = new FastPairPreferenceController(mContext); + if (Looper.myLooper() == null) { + Looper.prepare(); + } + } + + @Test + public void isAvailable_shouldBeTrue() { + assertThat(mController.isAvailable()).isTrue(); + } +} diff --git a/tests/unit/src/com/android/settings/nearby/FastPairSettingsFragmentTest.java b/tests/unit/src/com/android/settings/nearby/FastPairSettingsFragmentTest.java new file mode 100644 index 00000000000..faabe8fd9fe --- /dev/null +++ b/tests/unit/src/com/android/settings/nearby/FastPairSettingsFragmentTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2022 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.nearby; + +import static com.google.common.truth.Truth.assertThat; + +import android.app.Instrumentation; +import android.app.settings.SettingsEnums; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class FastPairSettingsFragmentTest { + + private FastPairSettingsFragment mFragment; + + @Before + public void setUp() { + final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); + instrumentation.runOnMainSync(() -> mFragment = new FastPairSettingsFragment()); + } + + @Test + public void getCategoryKey_isNetwork() { + assertThat(mFragment.getMetricsCategory()) + .isEqualTo(SettingsEnums.CONNECTION_DEVICE_ADVANCED_FAST_PAIR); + } +}