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.usb; 17 18 import android.content.Context; 19 import android.hardware.usb.UsbManager; 20 import android.hardware.usb.UsbPort; 21 import android.support.annotation.VisibleForTesting; 22 import android.support.v7.preference.Preference; 23 24 import com.android.settings.R; 25 import com.android.settings.connecteddevice.DevicePreferenceCallback; 26 import com.android.settings.core.SubSettingLauncher; 27 import com.android.settings.dashboard.DashboardFragment; 28 29 /** 30 * Controller to maintain connected usb device 31 */ 32 public class ConnectedUsbDeviceUpdater { 33 private DashboardFragment mFragment; 34 private UsbBackend mUsbBackend; 35 private DevicePreferenceCallback mDevicePreferenceCallback; 36 @VisibleForTesting 37 Preference mUsbPreference; 38 @VisibleForTesting 39 UsbConnectionBroadcastReceiver mUsbReceiver; 40 41 @VisibleForTesting 42 UsbConnectionBroadcastReceiver.UsbConnectionListener mUsbConnectionListener = 43 (connected, functions, powerRole, dataRole) -> { 44 if (connected) { 45 mUsbPreference.setSummary(getSummary(mUsbBackend.getCurrentFunctions(), 46 mUsbBackend.getPowerRole())); 47 mDevicePreferenceCallback.onDeviceAdded(mUsbPreference); 48 } else { 49 mDevicePreferenceCallback.onDeviceRemoved(mUsbPreference); 50 } 51 }; 52 ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback)53 public ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment, 54 DevicePreferenceCallback devicePreferenceCallback) { 55 this(context, fragment, devicePreferenceCallback, new UsbBackend(context)); 56 } 57 58 @VisibleForTesting ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment, DevicePreferenceCallback devicePreferenceCallback, UsbBackend usbBackend)59 ConnectedUsbDeviceUpdater(Context context, DashboardFragment fragment, 60 DevicePreferenceCallback devicePreferenceCallback, UsbBackend usbBackend) { 61 mFragment = fragment; 62 mDevicePreferenceCallback = devicePreferenceCallback; 63 mUsbBackend = usbBackend; 64 mUsbReceiver = new UsbConnectionBroadcastReceiver(context, 65 mUsbConnectionListener, mUsbBackend); 66 } 67 registerCallback()68 public void registerCallback() { 69 // This method could handle multiple register 70 mUsbReceiver.register(); 71 } 72 unregisterCallback()73 public void unregisterCallback() { 74 mUsbReceiver.unregister(); 75 } 76 initUsbPreference(Context context)77 public void initUsbPreference(Context context) { 78 mUsbPreference = new Preference(context, null /* AttributeSet */); 79 mUsbPreference.setTitle(R.string.usb_pref); 80 mUsbPreference.setIcon(R.drawable.ic_usb); 81 mUsbPreference.setOnPreferenceClickListener((Preference p) -> { 82 // New version - uses a separate screen. 83 new SubSettingLauncher(mFragment.getContext()) 84 .setDestination(UsbDetailsFragment.class.getName()) 85 .setTitle(R.string.device_details_title) 86 .setSourceMetricsCategory(mFragment.getMetricsCategory()) 87 .launch(); 88 return true; 89 }); 90 91 forceUpdate(); 92 } 93 forceUpdate()94 private void forceUpdate() { 95 // Register so we can get the connection state from sticky intent. 96 //TODO(b/70336520): Use an API to get data instead of sticky intent 97 mUsbReceiver.register(); 98 } 99 getSummary(long functions, int power)100 public static int getSummary(long functions, int power) { 101 switch (power) { 102 case UsbPort.POWER_ROLE_SINK: 103 if (functions == UsbManager.FUNCTION_MTP) { 104 return R.string.usb_summary_file_transfers; 105 } else if (functions == UsbManager.FUNCTION_RNDIS) { 106 return R.string.usb_summary_tether; 107 } else if (functions == UsbManager.FUNCTION_PTP) { 108 return R.string.usb_summary_photo_transfers; 109 } else if (functions == UsbManager.FUNCTION_MIDI) { 110 return R.string.usb_summary_MIDI; 111 } else { 112 return R.string.usb_summary_charging_only; 113 } 114 case UsbPort.POWER_ROLE_SOURCE: 115 if (functions == UsbManager.FUNCTION_MTP) { 116 return R.string.usb_summary_file_transfers_power; 117 } else if (functions == UsbManager.FUNCTION_RNDIS) { 118 return R.string.usb_summary_tether_power; 119 } else if (functions == UsbManager.FUNCTION_PTP) { 120 return R.string.usb_summary_photo_transfers_power; 121 } else if (functions == UsbManager.FUNCTION_MIDI) { 122 return R.string.usb_summary_MIDI_power; 123 } else { 124 return R.string.usb_summary_power_only; 125 } 126 default: 127 return R.string.usb_summary_charging_only; 128 } 129 } 130 } 131