102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood/* 202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * Copyright (C) 2011 The Android Open Source Project 302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * 402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * you may not use this file except in compliance with the License. 602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * You may obtain a copy of the License at 702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * 802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * 1002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * Unless required by applicable law or agreed to in writing, software 1102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 1202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * See the License for the specific language governing permissions and 1402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * limitations under the License. 1502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood */ 1602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 1702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodpackage com.android.settings.deviceinfo; 1802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 196d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwoodimport android.content.BroadcastReceiver; 2002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.content.Context; 216d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwoodimport android.content.Intent; 226d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwoodimport android.content.IntentFilter; 2302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.hardware.usb.UsbManager; 2402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.os.Bundle; 256ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthallimport android.os.UserManager; 2602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.preference.CheckBoxPreference; 2702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.preference.Preference; 2802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.preference.PreferenceScreen; 2902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport android.util.Log; 3002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 3102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport com.android.settings.R; 3202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodimport com.android.settings.SettingsPreferenceFragment; 33ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasaniimport com.android.settings.Utils; 3402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 3502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood/** 3602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood * USB storage settings. 3702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood */ 3802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwoodpublic class UsbSettings extends SettingsPreferenceFragment { 3902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 4002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private static final String TAG = "UsbSettings"; 4102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 4202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private static final String KEY_MTP = "usb_mtp"; 4302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private static final String KEY_PTP = "usb_ptp"; 4423a006236b2c8fc2b4ee5da35912150c7d6756d0Mike Lockwood 4502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private UsbManager mUsbManager; 4602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private CheckBoxPreference mMtp; 4702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private CheckBoxPreference mPtp; 48b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao private boolean mUsbAccessoryMode; 496d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood 506d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() { 516d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood public void onReceive(Context content, Intent intent) { 52b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao String action = intent.getAction(); 53b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao if (action.equals(UsbManager.ACTION_USB_STATE)) { 54b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao mUsbAccessoryMode = intent.getBooleanExtra(UsbManager.USB_FUNCTION_ACCESSORY, false); 55b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao Log.e(TAG, "UsbAccessoryMode " + mUsbAccessoryMode); 56b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao } 57ed9d461818780a6c38a081030a55983ea0883fa6Mike Lockwood updateToggles(mUsbManager.getDefaultFunction()); 586d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood } 596d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood }; 6002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 6102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood private PreferenceScreen createPreferenceHierarchy() { 6202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood PreferenceScreen root = getPreferenceScreen(); 6302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood if (root != null) { 6402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood root.removeAll(); 6502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 6602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood addPreferencesFromResource(R.xml.usb_settings); 6702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood root = getPreferenceScreen(); 6802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 6902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mMtp = (CheckBoxPreference)root.findPreference(KEY_MTP); 7002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mPtp = (CheckBoxPreference)root.findPreference(KEY_PTP); 7102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 726ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 736ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 746ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall mMtp.setEnabled(false); 756ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall mPtp.setEnabled(false); 766ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall } 776ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall 7802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood return root; 7902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 8002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 8102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood @Override 8202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood public void onCreate(Bundle icicle) { 8302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood super.onCreate(icicle); 8402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE); 8502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 8602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 8702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood @Override 886d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood public void onPause() { 896d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood super.onPause(); 906d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood getActivity().unregisterReceiver(mStateReceiver); 916d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood } 926d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood 936d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood @Override 9402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood public void onResume() { 9502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood super.onResume(); 9602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 9702900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood // Make sure we reload the preference hierarchy since some of these settings 9802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood // depend on others... 9902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood createPreferenceHierarchy(); 1006d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood 1016d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood // ACTION_USB_STATE is sticky so this will call updateToggles 1026d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood getActivity().registerReceiver(mStateReceiver, 1036d11dc5c8c98d0a93e23d48774e863df17da01caMike Lockwood new IntentFilter(UsbManager.ACTION_USB_STATE)); 10402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 10502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 106ed9d461818780a6c38a081030a55983ea0883fa6Mike Lockwood private void updateToggles(String function) { 107688605ec02f99ecd424aeaf31f5e966bbee5f6beMike Lockwood if (UsbManager.USB_FUNCTION_MTP.equals(function)) { 10802900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mMtp.setChecked(true); 10902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mPtp.setChecked(false); 110688605ec02f99ecd424aeaf31f5e966bbee5f6beMike Lockwood } else if (UsbManager.USB_FUNCTION_PTP.equals(function)) { 11102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mMtp.setChecked(false); 11202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mPtp.setChecked(true); 11302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } else { 11402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mMtp.setChecked(false); 11502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood mPtp.setChecked(false); 11602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 1176ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 1186ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 1196ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall Log.e(TAG, "USB is locked down"); 1206ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall mMtp.setEnabled(false); 1216ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall mPtp.setEnabled(false); 1226ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall } else if (!mUsbAccessoryMode) { 123b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao //Enable MTP and PTP switch while USB is not in Accessory Mode, otherwise disable it 124b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao Log.e(TAG, "USB Normal Mode"); 125b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao mMtp.setEnabled(true); 126b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao mPtp.setEnabled(true); 127b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao } else { 128b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao Log.e(TAG, "USB Accessory Mode"); 129b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao mMtp.setEnabled(false); 130b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao mPtp.setEnabled(false); 131b76be1f8d41c40c8d1d494d296c35ffed1d8ae59Wu, Hao } 13202900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 13302900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 13402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood @Override 13502900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 13602900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood 137ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasani // Don't allow any changes to take effect as the USB host will be disconnected, killing 138ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasani // the monkeys 139ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasani if (Utils.isMonkeyRunning()) { 140ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasani return true; 141ae69755aa874dbac77e9874d9716ab891a144193Amith Yamasani } 1426ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall // If this user is disallowed from using USB, don't handle their attempts to change the 1436ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall // setting. 1446ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall UserManager um = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 1456ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall if (um.hasUserRestriction(UserManager.DISALLOW_USB_FILE_TRANSFER)) { 1466ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall return true; 1476ad2e323f7733f39c6757a19a9ae9f5020cf9225Maggie Benthall } 148cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey 149cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey String function = "none"; 150cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey if (preference == mMtp && mMtp.isChecked()) { 151cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey function = UsbManager.USB_FUNCTION_MTP; 152cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey } else if (preference == mPtp && mPtp.isChecked()) { 153cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey function = UsbManager.USB_FUNCTION_PTP; 15402900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 155cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey 156cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey mUsbManager.setCurrentFunction(function, true); 157cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey updateToggles(function); 158cfd328b64fe837a5c2d236bc78256abcbec65adbJeff Sharkey 15902900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood return true; 16002900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood } 16102900a12b11efc89057fc5d0a19c08d20ff8d2c1Mike Lockwood} 162