Loading res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -6784,6 +6784,8 @@ <string name="help_url_adaptive_sleep" translatable="false" /> <!-- Help URL, Previously connected bluetooth devices [DO NOT TRANSLATE] --> <string name="help_url_previously_connected_devices" translatable="false"></string> <!-- Help URL, Fast Pair devices on Connected device settings [DO NOT TRANSLATE] --> <string name="help_url_connected_devices_fast_pair_devices" translatable="false"></string> <!-- Help URL, Top level privacy settings [DO NOT TRANSLATE] --> <string name="help_url_privacy_dashboard" translatable="false"></string> res/xml/fast_pair_devices.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2023 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto"> <PreferenceCategory android:key="fast_pair_device_list" settings:controller="com.android.settings.connecteddevice.fastpair.FastPairDeviceGroupController"/> </PreferenceScreen> No newline at end of file src/com/android/settings/connecteddevice/fastpair/FastPairDeviceDashboardFragment.java 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.connecteddevice.fastpair; import android.app.settings.SettingsEnums; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; /** This fragment contains list of available FastPair device */ @SearchIndexable(forTarget = SearchIndexable.MOBILE) public class FastPairDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "FastPairDeviceFrag"; @Override public int getHelpResource() { return R.string.help_url_connected_devices_fast_pair_devices; } @Override protected int getPreferenceScreenResId() { return R.xml.fast_pair_devices; } @Override protected String getLogTag() { return TAG; } @Override public int getMetricsCategory() { return SettingsEnums.FAST_PAIR_DEVICES; } /** For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.fast_pair_devices); } src/com/android/settings/connecteddevice/fastpair/FastPairDeviceGroupController.java 0 → 100644 +143 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.connecteddevice.fastpair; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.flags.Flags; import com.android.settings.overlay.FeatureFactory; /** * Controller to maintain the {@link PreferenceGroup} for all Fast Pair devices. It uses {@link * DevicePreferenceCallback} to add/remove {@link Preference} */ public class FastPairDeviceGroupController extends BasePreferenceController implements PreferenceControllerMixin, DefaultLifecycleObserver, DevicePreferenceCallback { private static final String KEY = "fast_pair_device_list"; @VisibleForTesting PreferenceGroup mPreferenceGroup; private final FastPairDeviceUpdater mFastPairDeviceUpdater; private final BluetoothAdapter mBluetoothAdapter; @VisibleForTesting IntentFilter mIntentFilter; @VisibleForTesting BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updatePreferenceVisibility(); } }; public FastPairDeviceGroupController(Context context) { super(context, KEY); if (Flags.enableSubsequentPairSettingsIntegration()) { FastPairFeatureProvider fastPairFeatureProvider = FeatureFactory.getFeatureFactory().getFastPairFeatureProvider(); mFastPairDeviceUpdater = fastPairFeatureProvider.getFastPairDeviceUpdater(context, this); } else { mFastPairDeviceUpdater = null; } mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); } @Override public void onStart(@NonNull LifecycleOwner owner) { if (mFastPairDeviceUpdater != null) { mFastPairDeviceUpdater.registerCallback(); } mContext.registerReceiver(mReceiver, mIntentFilter, Context.RECEIVER_EXPORTED_UNAUDITED); } @Override public void onStop(@NonNull LifecycleOwner owner) { if (mFastPairDeviceUpdater != null) { mFastPairDeviceUpdater.unregisterCallback(); } mContext.unregisterReceiver(mReceiver); } @Override public void displayPreference(PreferenceScreen screen) { mPreferenceGroup = screen.findPreference(KEY); mPreferenceGroup.setVisible(false); if (isAvailable()) { final Context context = screen.getContext(); mFastPairDeviceUpdater.setPreferenceContext(context); mFastPairDeviceUpdater.forceUpdate(); } } @Override public int getAvailabilityStatus() { return (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) && mFastPairDeviceUpdater != null) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public String getPreferenceKey() { return KEY; } @Override public void onDeviceAdded(Preference preference) { if (preference == null) return; mPreferenceGroup.addPreference(preference); updatePreferenceVisibility(); } @Override public void onDeviceRemoved(Preference preference) { if (preference == null) return; mPreferenceGroup.removePreference(preference); updatePreferenceVisibility(); } private void updatePreferenceVisibility() { mPreferenceGroup.setVisible( mBluetoothAdapter != null && mBluetoothAdapter.isEnabled() && mPreferenceGroup.getPreferenceCount() > 0); } @VisibleForTesting public void setPreferenceGroup(PreferenceGroup preferenceGroup) { mPreferenceGroup = preferenceGroup; } } tests/robotests/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,9 @@ android_robolectric_test { "androidx.test.ext.junit", "androidx.test.rules", "androidx.test.runner", "flag-junit", "aconfig_settings_flags_lib", "platform-test-annotations", ], libs: [ Loading Loading
res/values/strings.xml +2 −0 Original line number Diff line number Diff line Loading @@ -6784,6 +6784,8 @@ <string name="help_url_adaptive_sleep" translatable="false" /> <!-- Help URL, Previously connected bluetooth devices [DO NOT TRANSLATE] --> <string name="help_url_previously_connected_devices" translatable="false"></string> <!-- Help URL, Fast Pair devices on Connected device settings [DO NOT TRANSLATE] --> <string name="help_url_connected_devices_fast_pair_devices" translatable="false"></string> <!-- Help URL, Top level privacy settings [DO NOT TRANSLATE] --> <string name="help_url_privacy_dashboard" translatable="false"></string>
res/xml/fast_pair_devices.xml 0 → 100644 +26 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- ~ Copyright (C) 2023 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto"> <PreferenceCategory android:key="fast_pair_device_list" settings:controller="com.android.settings.connecteddevice.fastpair.FastPairDeviceGroupController"/> </PreferenceScreen> No newline at end of file
src/com/android/settings/connecteddevice/fastpair/FastPairDeviceDashboardFragment.java 0 → 100644 +55 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.connecteddevice.fastpair; import android.app.settings.SettingsEnums; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.search.SearchIndexable; /** This fragment contains list of available FastPair device */ @SearchIndexable(forTarget = SearchIndexable.MOBILE) public class FastPairDeviceDashboardFragment extends DashboardFragment { private static final String TAG = "FastPairDeviceFrag"; @Override public int getHelpResource() { return R.string.help_url_connected_devices_fast_pair_devices; } @Override protected int getPreferenceScreenResId() { return R.xml.fast_pair_devices; } @Override protected String getLogTag() { return TAG; } @Override public int getMetricsCategory() { return SettingsEnums.FAST_PAIR_DEVICES; } /** For Search. */ public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.fast_pair_devices); }
src/com/android/settings/connecteddevice/fastpair/FastPairDeviceGroupController.java 0 → 100644 +143 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.settings.connecteddevice.fastpair; import android.bluetooth.BluetoothAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.DefaultLifecycleObserver; import androidx.lifecycle.LifecycleOwner; import androidx.preference.Preference; import androidx.preference.PreferenceGroup; import androidx.preference.PreferenceScreen; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.flags.Flags; import com.android.settings.overlay.FeatureFactory; /** * Controller to maintain the {@link PreferenceGroup} for all Fast Pair devices. It uses {@link * DevicePreferenceCallback} to add/remove {@link Preference} */ public class FastPairDeviceGroupController extends BasePreferenceController implements PreferenceControllerMixin, DefaultLifecycleObserver, DevicePreferenceCallback { private static final String KEY = "fast_pair_device_list"; @VisibleForTesting PreferenceGroup mPreferenceGroup; private final FastPairDeviceUpdater mFastPairDeviceUpdater; private final BluetoothAdapter mBluetoothAdapter; @VisibleForTesting IntentFilter mIntentFilter; @VisibleForTesting BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { updatePreferenceVisibility(); } }; public FastPairDeviceGroupController(Context context) { super(context, KEY); if (Flags.enableSubsequentPairSettingsIntegration()) { FastPairFeatureProvider fastPairFeatureProvider = FeatureFactory.getFeatureFactory().getFastPairFeatureProvider(); mFastPairDeviceUpdater = fastPairFeatureProvider.getFastPairDeviceUpdater(context, this); } else { mFastPairDeviceUpdater = null; } mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); mIntentFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED); } @Override public void onStart(@NonNull LifecycleOwner owner) { if (mFastPairDeviceUpdater != null) { mFastPairDeviceUpdater.registerCallback(); } mContext.registerReceiver(mReceiver, mIntentFilter, Context.RECEIVER_EXPORTED_UNAUDITED); } @Override public void onStop(@NonNull LifecycleOwner owner) { if (mFastPairDeviceUpdater != null) { mFastPairDeviceUpdater.unregisterCallback(); } mContext.unregisterReceiver(mReceiver); } @Override public void displayPreference(PreferenceScreen screen) { mPreferenceGroup = screen.findPreference(KEY); mPreferenceGroup.setVisible(false); if (isAvailable()) { final Context context = screen.getContext(); mFastPairDeviceUpdater.setPreferenceContext(context); mFastPairDeviceUpdater.forceUpdate(); } } @Override public int getAvailabilityStatus() { return (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) && mFastPairDeviceUpdater != null) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } @Override public String getPreferenceKey() { return KEY; } @Override public void onDeviceAdded(Preference preference) { if (preference == null) return; mPreferenceGroup.addPreference(preference); updatePreferenceVisibility(); } @Override public void onDeviceRemoved(Preference preference) { if (preference == null) return; mPreferenceGroup.removePreference(preference); updatePreferenceVisibility(); } private void updatePreferenceVisibility() { mPreferenceGroup.setVisible( mBluetoothAdapter != null && mBluetoothAdapter.isEnabled() && mPreferenceGroup.getPreferenceCount() > 0); } @VisibleForTesting public void setPreferenceGroup(PreferenceGroup preferenceGroup) { mPreferenceGroup = preferenceGroup; } }
tests/robotests/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,9 @@ android_robolectric_test { "androidx.test.ext.junit", "androidx.test.rules", "androidx.test.runner", "flag-junit", "aconfig_settings_flags_lib", "platform-test-annotations", ], libs: [ Loading