1 /* 2 * Copyright (C) 2016 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.google.android.car.kitchensink.setting; 17 18 import android.annotation.Nullable; 19 import android.content.Context; 20 import android.hardware.usb.UsbDevice; 21 import android.hardware.usb.UsbManager; 22 import android.os.Bundle; 23 import android.preference.Preference; 24 import android.preference.PreferenceCategory; 25 import android.preference.PreferenceFragment; 26 import android.preference.PreferenceGroup; 27 import android.util.Log; 28 29 import com.google.android.car.kitchensink.R; 30 import com.google.android.car.kitchensink.setting.usb.UsbDevicePreference; 31 import com.google.android.car.kitchensink.setting.usb.UsbDeviceSettings; 32 import com.google.android.car.kitchensink.setting.usb.UsbSettingsStorage; 33 34 import java.util.HashMap; 35 import java.util.List; 36 37 /** 38 * Usb manager handles management for USB device settings. 39 */ 40 public class UsbManagerFragment extends PreferenceFragment 41 implements UsbDevicePreference.UsbDevicePreferenceCallback { 42 43 // TODO: for produciton settings version we need to handle detach through broadcast. 44 45 private static final String TAG = UsbManagerFragment.class.getSimpleName(); 46 private static final boolean LOCAL_LOGD = true; 47 private static final boolean LOCAL_LOGV = true; 48 49 private UsbSettingsStorage mUsbSettingsStorage; 50 private UsbManager mUsbManager; 51 52 @Override 53 public void onCreate(Bundle savedInstanceState) { 54 super.onCreate(savedInstanceState); 55 addPreferencesFromResource(R.xml.usb_manager_prefs); 56 mUsbSettingsStorage = new UsbSettingsStorage(getContext()); 57 mUsbManager = (UsbManager) getActivity().getSystemService(Context.USB_SERVICE); 58 } 59 60 @Override 61 public void onResume() { 62 super.onResume(); 63 populateSettings(); 64 } 65 66 private void populateSettings() { 67 getPreferenceScreen().removeAll(); 68 HashMap<String, UsbDevice> attachedDevices = mUsbManager.getDeviceList(); 69 List<UsbDeviceSettings> allSavedSettings = mUsbSettingsStorage.getAllSettings(); 70 PreferenceGroup availableDevicesCategory = 71 createPreferenceCategory(1, R.string.usb_available_devices); 72 getPreferenceScreen().addPreference(availableDevicesCategory); 73 74 PreferenceGroup savedDevicesCategory = 75 createPreferenceCategory(2, R.string.usb_saved_devices); 76 getPreferenceScreen().addPreference(savedDevicesCategory); 77 78 for (UsbDevice attachedDevice : attachedDevices.values()) { 79 if (LOCAL_LOGD) { 80 Log.d(TAG, "Attached device: " + attachedDevice); 81 } 82 if (attachedDevice.getSerialNumber() == null) { 83 if (LOCAL_LOGV) { 84 Log.v(TAG, "Attached device: " + attachedDevice + " misseshave serial number"); 85 } 86 continue; 87 } 88 UsbDeviceSettings deviceSettings = getSavedSetting(allSavedSettings, attachedDevice); 89 if (deviceSettings != null) { 90 // This might be slow if there are a lot of settings. 91 allSavedSettings.remove(deviceSettings); 92 } else { 93 deviceSettings = UsbDeviceSettings.constructSettings(attachedDevice); 94 } 95 UsbDevicePreference preference = new UsbDevicePreference( 96 getContext(), deviceSettings, this); 97 availableDevicesCategory.addPreference(preference); 98 } 99 availableDevicesCategory.setEnabled(availableDevicesCategory.getPreferenceCount() > 0); 100 101 for (UsbDeviceSettings savedSettings : allSavedSettings) { 102 UsbDevicePreference preference = new UsbDevicePreference( 103 getContext(), savedSettings, this); 104 savedDevicesCategory.addPreference(preference); 105 } 106 savedDevicesCategory.setEnabled(savedDevicesCategory.getPreferenceCount() > 0); 107 } 108 109 private PreferenceGroup createPreferenceCategory(int order, int titleId) { 110 PreferenceGroup preferenceGroup = new PreferenceCategory(getContext()); 111 preferenceGroup.setTitle(titleId); 112 preferenceGroup.setOrder(order); 113 preferenceGroup.setSelectable(false); 114 return preferenceGroup; 115 } 116 117 @Nullable 118 private UsbDeviceSettings getSavedSetting(List<UsbDeviceSettings> settings, UsbDevice device) { 119 for (UsbDeviceSettings savedSetting : settings) { 120 if (savedSetting.matchesDevice(device)) { 121 return savedSetting; 122 } 123 } 124 return null; 125 } 126 127 @Override 128 public void onUsbDevicePreferenceDelete(Preference preference, UsbDeviceSettings settings) { 129 mUsbSettingsStorage.deleteSettings( 130 settings.getSerialNumber(), settings.getVid(), settings.getPid()); 131 populateSettings(); 132 } 133 134 } 135