1 /* 2 * Copyright (C) 2011 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 17 package com.android.settings.deviceinfo; 18 19 import android.content.BroadcastReceiver; 20 import android.content.Context; 21 import android.content.Intent; 22 import android.content.IntentFilter; 23 import android.hardware.usb.UsbManager; 24 import android.os.Bundle; 25 import android.os.UserManager; 26 import android.preference.CheckBoxPreference; 27 import android.preference.Preference; 28 import android.preference.PreferenceScreen; 29 import android.util.Log; 30 31 import com.android.settings.R; 32 import com.android.settings.SettingsPreferenceFragment; 33 import com.android.settings.Utils; 34 35 /** 36 * USB storage settings. 37 */ 38 public class UsbSettings extends SettingsPreferenceFragment { 39 40 private static final String TAG = "UsbSettings"; 41 42 private static final String KEY_MTP = "usb_mtp"; 43 private static final String KEY_PTP = "usb_ptp"; 44 45 private UsbManager mUsbManager; 46 private CheckBoxPreference mMtp; 47 private CheckBoxPreference mPtp; 48 private boolean mUsbAccessoryMode; 49 50 private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() { 51 public void onReceive(Context content, Intent intent) { 52 String action = intent.getAction(); 53 if (action.equals(UsbManager.ACTION_USB_STATE)) { 54 mUsbAccessoryMode = intent.getBooleanExtra(UsbManager.USB_FUNCTION_ACCESSORY, false); 55 Log.e(TAG, "UsbAccessoryMode " + mUsbAccessoryMode); 56 } 57 updateToggles(mUsbManager.getDefaultFunction()); 58 } 59 }; 60 createPreferenceHierarchy()61 private PreferenceScreen createPreferenceHierarchy() { 62 PreferenceScreen root = getPreferenceScreen(); 63 if (root != null) { 64 root.removeAll(); 65 } 66 addPreferencesFromResource(R.xml.usb_settings); 67 root = getPreferenceScreen(); 68 69 mMtp = (CheckBoxPreference)root.findPreference(KEY_MTP); 70 mPtp = (CheckBoxPreference)root.findPreference(KEY_PTP); 71 72 UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 73 if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 74 mMtp.setEnabled(false); 75 mPtp.setEnabled(false); 76 } 77 78 return root; 79 } 80 81 @Override onCreate(Bundle icicle)82 public void onCreate(Bundle icicle) { 83 super.onCreate(icicle); 84 mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE); 85 } 86 87 @Override onPause()88 public void onPause() { 89 super.onPause(); 90 getActivity().unregisterReceiver(mStateReceiver); 91 } 92 93 @Override onResume()94 public void onResume() { 95 super.onResume(); 96 97 // Make sure we reload the preference hierarchy since some of these settings 98 // depend on others... 99 createPreferenceHierarchy(); 100 101 // ACTION_USB_STATE is sticky so this will call updateToggles 102 getActivity().registerReceiver(mStateReceiver, 103 new IntentFilter(UsbManager.ACTION_USB_STATE)); 104 } 105 updateToggles(String function)106 private void updateToggles(String function) { 107 if (UsbManager.USB_FUNCTION_MTP.equals(function)) { 108 mMtp.setChecked(true); 109 mPtp.setChecked(false); 110 } else if (UsbManager.USB_FUNCTION_PTP.equals(function)) { 111 mMtp.setChecked(false); 112 mPtp.setChecked(true); 113 } else { 114 mMtp.setChecked(false); 115 mPtp.setChecked(false); 116 } 117 UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 118 if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 119 Log.e(TAG, "USB is locked down"); 120 mMtp.setEnabled(false); 121 mPtp.setEnabled(false); 122 } else if (!mUsbAccessoryMode) { 123 //Enable MTP and PTP switch while USB is not in Accessory Mode, otherwise disable it 124 Log.e(TAG, "USB Normal Mode"); 125 mMtp.setEnabled(true); 126 mPtp.setEnabled(true); 127 } else { 128 Log.e(TAG, "USB Accessory Mode"); 129 mMtp.setEnabled(false); 130 mPtp.setEnabled(false); 131 } 132 } 133 134 @Override onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)135 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 136 137 // Don't allow any changes to take effect as the USB host will be disconnected, killing 138 // the monkeys 139 if (Utils.isMonkeyRunning()) { 140 return true; 141 } 142 // If this user is disallowed from using USB, don't handle their attempts to change the 143 // setting. 144 UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 145 if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 146 return true; 147 } 148 149 String function = "none"; 150 if (preference == mMtp && mMtp.isChecked()) { 151 function = UsbManager.USB_FUNCTION_MTP; 152 } else if (preference == mPtp && mPtp.isChecked()) { 153 function = UsbManager.USB_FUNCTION_PTP; 154 } 155 156 mUsbManager.setCurrentFunction(function, true); 157 updateToggles(function); 158 159 return true; 160 } 161 } 162