• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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