Loading res/values/strings.xml +5 −0 Original line number Diff line number Diff line Loading @@ -394,6 +394,11 @@ <!-- Title for pairing bluetooth device page [CHAR LIMIT=none] --> <string name="bluetooth_pairing_page_title">Pair new device</string> <!-- Title for connected device group [CHAR LIMIT=none]--> <string name="connected_device_connected_title">Currently connected</string> <!-- Title for connected device group [CHAR LIMIT=none]--> <string name="connected_device_saved_title">Saved devices</string> <!-- Date & time settings screen title --> <string name="date_and_time">Date & time</string> <!-- The title of the activity to pick a time zone. --> Loading res/xml/connected_devices.xml +3 −0 Original line number Diff line number Diff line Loading @@ -19,4 +19,7 @@ android:key="connected_devices_screen" android:title="@string/connected_devices_dashboard_title"> <PreferenceCategory android:key="connected_device_list" android:title="@string/connected_device_connected_title"/> </PreferenceScreen> src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java 0 → 100644 +181 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; import android.os.SystemProperties; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.widget.GearPreference; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.BluetoothDeviceFilter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Update the bluetooth devices. It gets bluetooth event from {@link LocalBluetoothManager} using * {@link BluetoothCallback}. It notifies the upper level whether to add/remove the preference * through {@link DevicePreferenceCallback} * * In {@link BluetoothDeviceUpdater}, it uses {@link BluetoothDeviceFilter.Filter} to detect * whether the {@link CachedBluetoothDevice} is relevant. */ public abstract class BluetoothDeviceUpdater implements BluetoothCallback { private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY = "persist.bluetooth.showdeviceswithoutnames"; protected final LocalBluetoothManager mLocalManager; protected final DevicePreferenceCallback mDevicePreferenceCallback; protected final Map<BluetoothDevice, Preference> mPreferenceMap; protected Context mPrefContext; private final boolean mShowDeviceWithoutNames; private DashboardFragment mFragment; @VisibleForTesting final GearPreference.OnGearClickListener mDeviceProfilesListener = pref -> { final CachedBluetoothDevice device = ((BluetoothDevicePreference) pref).getBluetoothDevice(); if (device == null) { return; } final Bundle args = new Bundle(); args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, device.getDevice().getAddress()); final SettingsActivity activity = (SettingsActivity) mFragment.getActivity(); activity.startPreferencePanel(mFragment, BluetoothDeviceDetailsFragment.class.getName(), args, R.string.device_details_title, null, null, 0); }; public BluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback) { this(fragment, devicePreferenceCallback, Utils.getLocalBtManager(fragment.getContext())); } @VisibleForTesting BluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, LocalBluetoothManager localManager) { mFragment = fragment; mDevicePreferenceCallback = devicePreferenceCallback; mShowDeviceWithoutNames = SystemProperties.getBoolean( BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false); mPreferenceMap = new HashMap<>(); mLocalManager = localManager; } /** * Register the bluetooth event callback and update the list */ public void registerCallback() { mLocalManager.setForegroundActivity(mFragment.getContext()); mLocalManager.getEventManager().registerCallback(this); forceUpdate(); } /** * Unregister the bluetooth event callback */ public void unregisterCallback() { mLocalManager.setForegroundActivity(null); mLocalManager.getEventManager().unregisterCallback(this); } /** * Force to update the list of bluetooth devices */ public void forceUpdate() { Collection<CachedBluetoothDevice> cachedDevices = mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { update(cachedBluetoothDevice); } } @Override public void onBluetoothStateChanged(int bluetoothState) { forceUpdate(); } @Override public void onScanningStateChanged(boolean started) {} @Override public void onDeviceAdded(CachedBluetoothDevice cachedDevice) { update(cachedDevice); } @Override public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {} @Override public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { update(cachedDevice); } @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {} /** * Set the context to generate the {@link Preference}, so it could get the correct theme. */ public void setPrefContext(Context context) { mPrefContext = context; } /** * Update whether to show {@cde cachedBluetoothDevice} in the list. */ abstract public void update(CachedBluetoothDevice cachedBluetoothDevice); /** * Add the {@link Preference} that represents the {@code cachedDevice} */ protected void addPreference(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); if (!mPreferenceMap.containsKey(device)) { BluetoothDevicePreference btPreference = new BluetoothDevicePreference(mPrefContext, cachedDevice, mShowDeviceWithoutNames); btPreference.setOnGearClickListener(mDeviceProfilesListener); mPreferenceMap.put(device, btPreference); mDevicePreferenceCallback.onDeviceAdded(btPreference); } } /** * Remove the {@link Preference} that represents the {@code cachedDevice} */ protected void removePreference(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); if (mPreferenceMap.containsKey(device)) { mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device)); mPreferenceMap.remove(device); } } } src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.support.annotation.VisibleForTesting; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; /** * Controller to maintain connected bluetooth devices */ public class ConnectedBluetoothDeviceUpdater extends BluetoothDeviceUpdater { public ConnectedBluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback) { super(fragment, devicePreferenceCallback); } @VisibleForTesting ConnectedBluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, LocalBluetoothManager localBluetoothManager) { super(fragment, devicePreferenceCallback, localBluetoothManager); } @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { if (state == BluetoothAdapter.STATE_CONNECTED) { addPreference(cachedDevice); } else if (state == BluetoothAdapter.STATE_DISCONNECTED) { removePreference(cachedDevice); } } @Override public void update(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); final boolean filterMatch = device.getBondState() == BluetoothDevice.BOND_BONDED && device.isConnected(); if (filterMatch) { // Add the preference if it is new one addPreference(cachedDevice); } else { removePreference(cachedDevice); } } } src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +17 −10 Original line number Diff line number Diff line Loading @@ -17,27 +17,20 @@ package com.android.settings.connecteddevice; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.provider.SearchIndexableResource; import android.support.annotation.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController; import com.android.settings.bluetooth.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.deviceinfo.UsbBackend; import com.android.settings.nfc.NfcPreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ConnectedDeviceDashboardFragment extends DashboardFragment { Loading Loading @@ -66,7 +59,14 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override protected List<AbstractPreferenceController> getPreferenceControllers(Context context) { return null; final List<AbstractPreferenceController> controllers = new ArrayList<>(); final Lifecycle lifecycle = getLifecycle(); final ConnectedDeviceGroupController connectedDeviceGroupController = new ConnectedDeviceGroupController(this, lifecycle); controllers.add(connectedDeviceGroupController); return controllers; } @VisibleForTesting Loading Loading @@ -109,6 +109,7 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { /** * For Search. */ //TODO(b/69333961): update the index for this new fragment public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override Loading @@ -120,8 +121,14 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override public List<String> getNonIndexableKeys(Context context) { return new ArrayList<>(); } @Override public List<AbstractPreferenceController> getPreferenceControllers( Context context) { //TODO(b/69333961): update the index for controllers return super.getPreferenceControllers(context); } }; } Loading
res/values/strings.xml +5 −0 Original line number Diff line number Diff line Loading @@ -394,6 +394,11 @@ <!-- Title for pairing bluetooth device page [CHAR LIMIT=none] --> <string name="bluetooth_pairing_page_title">Pair new device</string> <!-- Title for connected device group [CHAR LIMIT=none]--> <string name="connected_device_connected_title">Currently connected</string> <!-- Title for connected device group [CHAR LIMIT=none]--> <string name="connected_device_saved_title">Saved devices</string> <!-- Date & time settings screen title --> <string name="date_and_time">Date & time</string> <!-- The title of the activity to pick a time zone. --> Loading
res/xml/connected_devices.xml +3 −0 Original line number Diff line number Diff line Loading @@ -19,4 +19,7 @@ android:key="connected_devices_screen" android:title="@string/connected_devices_dashboard_title"> <PreferenceCategory android:key="connected_device_list" android:title="@string/connected_device_connected_title"/> </PreferenceScreen>
src/com/android/settings/bluetooth/BluetoothDeviceUpdater.java 0 → 100644 +181 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import android.bluetooth.BluetoothDevice; import android.content.Context; import android.os.Bundle; import android.os.SystemProperties; import android.support.annotation.VisibleForTesting; import android.support.v7.preference.Preference; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.widget.GearPreference; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.BluetoothDeviceFilter; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** * Update the bluetooth devices. It gets bluetooth event from {@link LocalBluetoothManager} using * {@link BluetoothCallback}. It notifies the upper level whether to add/remove the preference * through {@link DevicePreferenceCallback} * * In {@link BluetoothDeviceUpdater}, it uses {@link BluetoothDeviceFilter.Filter} to detect * whether the {@link CachedBluetoothDevice} is relevant. */ public abstract class BluetoothDeviceUpdater implements BluetoothCallback { private static final String BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY = "persist.bluetooth.showdeviceswithoutnames"; protected final LocalBluetoothManager mLocalManager; protected final DevicePreferenceCallback mDevicePreferenceCallback; protected final Map<BluetoothDevice, Preference> mPreferenceMap; protected Context mPrefContext; private final boolean mShowDeviceWithoutNames; private DashboardFragment mFragment; @VisibleForTesting final GearPreference.OnGearClickListener mDeviceProfilesListener = pref -> { final CachedBluetoothDevice device = ((BluetoothDevicePreference) pref).getBluetoothDevice(); if (device == null) { return; } final Bundle args = new Bundle(); args.putString(BluetoothDeviceDetailsFragment.KEY_DEVICE_ADDRESS, device.getDevice().getAddress()); final SettingsActivity activity = (SettingsActivity) mFragment.getActivity(); activity.startPreferencePanel(mFragment, BluetoothDeviceDetailsFragment.class.getName(), args, R.string.device_details_title, null, null, 0); }; public BluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback) { this(fragment, devicePreferenceCallback, Utils.getLocalBtManager(fragment.getContext())); } @VisibleForTesting BluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, LocalBluetoothManager localManager) { mFragment = fragment; mDevicePreferenceCallback = devicePreferenceCallback; mShowDeviceWithoutNames = SystemProperties.getBoolean( BLUETOOTH_SHOW_DEVICES_WITHOUT_NAMES_PROPERTY, false); mPreferenceMap = new HashMap<>(); mLocalManager = localManager; } /** * Register the bluetooth event callback and update the list */ public void registerCallback() { mLocalManager.setForegroundActivity(mFragment.getContext()); mLocalManager.getEventManager().registerCallback(this); forceUpdate(); } /** * Unregister the bluetooth event callback */ public void unregisterCallback() { mLocalManager.setForegroundActivity(null); mLocalManager.getEventManager().unregisterCallback(this); } /** * Force to update the list of bluetooth devices */ public void forceUpdate() { Collection<CachedBluetoothDevice> cachedDevices = mLocalManager.getCachedDeviceManager().getCachedDevicesCopy(); for (CachedBluetoothDevice cachedBluetoothDevice : cachedDevices) { update(cachedBluetoothDevice); } } @Override public void onBluetoothStateChanged(int bluetoothState) { forceUpdate(); } @Override public void onScanningStateChanged(boolean started) {} @Override public void onDeviceAdded(CachedBluetoothDevice cachedDevice) { update(cachedDevice); } @Override public void onDeviceDeleted(CachedBluetoothDevice cachedDevice) {} @Override public void onDeviceBondStateChanged(CachedBluetoothDevice cachedDevice, int bondState) { update(cachedDevice); } @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) {} /** * Set the context to generate the {@link Preference}, so it could get the correct theme. */ public void setPrefContext(Context context) { mPrefContext = context; } /** * Update whether to show {@cde cachedBluetoothDevice} in the list. */ abstract public void update(CachedBluetoothDevice cachedBluetoothDevice); /** * Add the {@link Preference} that represents the {@code cachedDevice} */ protected void addPreference(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); if (!mPreferenceMap.containsKey(device)) { BluetoothDevicePreference btPreference = new BluetoothDevicePreference(mPrefContext, cachedDevice, mShowDeviceWithoutNames); btPreference.setOnGearClickListener(mDeviceProfilesListener); mPreferenceMap.put(device, btPreference); mDevicePreferenceCallback.onDeviceAdded(btPreference); } } /** * Remove the {@link Preference} that represents the {@code cachedDevice} */ protected void removePreference(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); if (mPreferenceMap.containsKey(device)) { mDevicePreferenceCallback.onDeviceRemoved(mPreferenceMap.get(device)); mPreferenceMap.remove(device); } } }
src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java 0 → 100644 +66 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 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.bluetooth; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.support.annotation.VisibleForTesting; import com.android.settings.connecteddevice.DevicePreferenceCallback; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; /** * Controller to maintain connected bluetooth devices */ public class ConnectedBluetoothDeviceUpdater extends BluetoothDeviceUpdater { public ConnectedBluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback) { super(fragment, devicePreferenceCallback); } @VisibleForTesting ConnectedBluetoothDeviceUpdater(DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, LocalBluetoothManager localBluetoothManager) { super(fragment, devicePreferenceCallback, localBluetoothManager); } @Override public void onConnectionStateChanged(CachedBluetoothDevice cachedDevice, int state) { if (state == BluetoothAdapter.STATE_CONNECTED) { addPreference(cachedDevice); } else if (state == BluetoothAdapter.STATE_DISCONNECTED) { removePreference(cachedDevice); } } @Override public void update(CachedBluetoothDevice cachedDevice) { final BluetoothDevice device = cachedDevice.getDevice(); final boolean filterMatch = device.getBondState() == BluetoothDevice.BOND_BONDED && device.isConnected(); if (filterMatch) { // Add the preference if it is new one addPreference(cachedDevice); } else { removePreference(cachedDevice); } } }
src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java +17 −10 Original line number Diff line number Diff line Loading @@ -17,27 +17,20 @@ package com.android.settings.connecteddevice; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.provider.SearchIndexableResource; import android.support.annotation.VisibleForTesting; import com.android.internal.logging.nano.MetricsProto; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.bluetooth.BluetoothMasterSwitchPreferenceController; import com.android.settings.bluetooth.Utils; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.SummaryLoader; import com.android.settings.deviceinfo.UsbBackend; import com.android.settings.nfc.NfcPreferenceController; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ConnectedDeviceDashboardFragment extends DashboardFragment { Loading Loading @@ -66,7 +59,14 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override protected List<AbstractPreferenceController> getPreferenceControllers(Context context) { return null; final List<AbstractPreferenceController> controllers = new ArrayList<>(); final Lifecycle lifecycle = getLifecycle(); final ConnectedDeviceGroupController connectedDeviceGroupController = new ConnectedDeviceGroupController(this, lifecycle); controllers.add(connectedDeviceGroupController); return controllers; } @VisibleForTesting Loading Loading @@ -109,6 +109,7 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { /** * For Search. */ //TODO(b/69333961): update the index for this new fragment public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override Loading @@ -120,8 +121,14 @@ public class ConnectedDeviceDashboardFragment extends DashboardFragment { @Override public List<String> getNonIndexableKeys(Context context) { return new ArrayList<>(); } @Override public List<AbstractPreferenceController> getPreferenceControllers( Context context) { //TODO(b/69333961): update the index for controllers return super.getPreferenceControllers(context); } }; }