1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package com.android.settings.connecteddevice; 17 18 import android.content.pm.PackageManager; 19 import android.content.Context; 20 import android.support.annotation.VisibleForTesting; 21 import android.support.v7.preference.Preference; 22 import android.support.v7.preference.PreferenceGroup; 23 import android.support.v7.preference.PreferenceScreen; 24 25 import com.android.settings.bluetooth.BluetoothDeviceUpdater; 26 import com.android.settings.bluetooth.SavedBluetoothDeviceUpdater; 27 import com.android.settings.connecteddevice.dock.DockUpdater; 28 import com.android.settings.core.BasePreferenceController; 29 import com.android.settings.core.PreferenceControllerMixin; 30 import com.android.settings.dashboard.DashboardFragment; 31 import com.android.settings.overlay.DockUpdaterFeatureProvider; 32 import com.android.settings.overlay.FeatureFactory; 33 import com.android.settingslib.core.lifecycle.LifecycleObserver; 34 import com.android.settingslib.core.lifecycle.events.OnStart; 35 import com.android.settingslib.core.lifecycle.events.OnStop; 36 37 /** 38 * Controller to maintain the {@link PreferenceGroup} for all 39 * saved devices. It uses {@link DevicePreferenceCallback} to add/remove {@link Preference} 40 */ 41 public class SavedDeviceGroupController extends BasePreferenceController 42 implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop, 43 DevicePreferenceCallback { 44 45 private static final String KEY = "saved_device_list"; 46 47 @VisibleForTesting 48 PreferenceGroup mPreferenceGroup; 49 private BluetoothDeviceUpdater mBluetoothDeviceUpdater; 50 private DockUpdater mSavedDockUpdater; 51 SavedDeviceGroupController(Context context)52 public SavedDeviceGroupController(Context context) { 53 super(context, KEY); 54 55 DockUpdaterFeatureProvider dockUpdaterFeatureProvider = 56 FeatureFactory.getFactory(context).getDockUpdaterFeatureProvider(); 57 mSavedDockUpdater = 58 dockUpdaterFeatureProvider.getSavedDockUpdater(context, this); 59 } 60 61 @Override onStart()62 public void onStart() { 63 mBluetoothDeviceUpdater.registerCallback(); 64 mSavedDockUpdater.registerCallback(); 65 } 66 67 @Override onStop()68 public void onStop() { 69 mBluetoothDeviceUpdater.unregisterCallback(); 70 mSavedDockUpdater.unregisterCallback(); 71 } 72 73 @Override displayPreference(PreferenceScreen screen)74 public void displayPreference(PreferenceScreen screen) { 75 if (isAvailable()) { 76 mPreferenceGroup = (PreferenceGroup) screen.findPreference(KEY); 77 mPreferenceGroup.setVisible(false); 78 mBluetoothDeviceUpdater.setPrefContext(screen.getContext()); 79 mBluetoothDeviceUpdater.forceUpdate(); 80 mSavedDockUpdater.forceUpdate(); 81 } 82 } 83 84 @Override getAvailabilityStatus()85 public int getAvailabilityStatus() { 86 return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH) 87 ? AVAILABLE 88 : UNSUPPORTED_ON_DEVICE; 89 } 90 91 @Override getPreferenceKey()92 public String getPreferenceKey() { 93 return KEY; 94 } 95 96 @Override onDeviceAdded(Preference preference)97 public void onDeviceAdded(Preference preference) { 98 if (mPreferenceGroup.getPreferenceCount() == 0) { 99 mPreferenceGroup.setVisible(true); 100 } 101 mPreferenceGroup.addPreference(preference); 102 } 103 104 @Override onDeviceRemoved(Preference preference)105 public void onDeviceRemoved(Preference preference) { 106 mPreferenceGroup.removePreference(preference); 107 if (mPreferenceGroup.getPreferenceCount() == 0) { 108 mPreferenceGroup.setVisible(false); 109 } 110 } 111 init(DashboardFragment fragment)112 public void init(DashboardFragment fragment) { 113 mBluetoothDeviceUpdater = new SavedBluetoothDeviceUpdater(fragment.getContext(), 114 fragment, SavedDeviceGroupController.this); 115 } 116 117 @VisibleForTesting setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater)118 public void setBluetoothDeviceUpdater(BluetoothDeviceUpdater bluetoothDeviceUpdater) { 119 mBluetoothDeviceUpdater = bluetoothDeviceUpdater; 120 } 121 122 @VisibleForTesting setSavedDockUpdater(DockUpdater savedDockUpdater)123 public void setSavedDockUpdater(DockUpdater savedDockUpdater) { 124 mSavedDockUpdater = savedDockUpdater; 125 } 126 } 127