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