UsbSettings.java revision 6d11dc5c8c98d0a93e23d48774e863df17da01ca
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
17package com.android.settings.deviceinfo;
18
19import android.content.BroadcastReceiver;
20import android.content.ContentQueryMap;
21import android.content.ContentResolver;
22import android.content.Context;
23import android.content.Intent;
24import android.content.IntentFilter;
25import android.hardware.usb.UsbManager;
26import android.os.Bundle;
27import android.os.storage.StorageManager;
28import android.os.storage.StorageVolume;
29import android.preference.CheckBoxPreference;
30import android.preference.Preference;
31import android.preference.PreferenceScreen;
32import android.provider.Settings;
33import android.util.Log;
34import android.view.Menu;
35import android.view.MenuInflater;
36import android.view.MenuItem;
37
38import com.android.settings.R;
39import com.android.settings.SettingsPreferenceFragment;
40
41import java.io.File;
42
43/**
44 * USB storage settings.
45 */
46public class UsbSettings extends SettingsPreferenceFragment {
47
48    private static final String TAG = "UsbSettings";
49
50    private static final String KEY_MTP = "usb_mtp";
51    private static final String KEY_PTP = "usb_ptp";
52    private static final String KEY_INSTALLER_CD = "usb_installer_cd";
53    private static final int MENU_ID_INSTALLER_CD = Menu.FIRST;
54
55    private UsbManager mUsbManager;
56    private String mInstallerImagePath;
57    private CheckBoxPreference mMtp;
58    private CheckBoxPreference mPtp;
59    private MenuItem mInstallerCd;
60
61    private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
62        public void onReceive(Context content, Intent intent) {
63            updateToggles();
64        }
65    };
66
67    private PreferenceScreen createPreferenceHierarchy() {
68        PreferenceScreen root = getPreferenceScreen();
69        if (root != null) {
70            root.removeAll();
71        }
72        addPreferencesFromResource(R.xml.usb_settings);
73        root = getPreferenceScreen();
74
75        mMtp = (CheckBoxPreference)root.findPreference(KEY_MTP);
76        mPtp = (CheckBoxPreference)root.findPreference(KEY_PTP);
77
78        return root;
79    }
80
81    @Override
82    public void onCreate(Bundle icicle) {
83        super.onCreate(icicle);
84        mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
85        mInstallerImagePath = getString(com.android.internal.R.string.config_isoImagePath);
86        if (!(new File(mInstallerImagePath)).exists()) {
87            mInstallerImagePath = null;
88        }
89        setHasOptionsMenu(mInstallerImagePath != null);
90    }
91
92    @Override
93    public void onPause() {
94        super.onPause();
95        getActivity().unregisterReceiver(mStateReceiver);
96    }
97
98    @Override
99    public void onResume() {
100        super.onResume();
101
102        // Make sure we reload the preference hierarchy since some of these settings
103        // depend on others...
104        createPreferenceHierarchy();
105
106        // ACTION_USB_STATE is sticky so this will call updateToggles
107        getActivity().registerReceiver(mStateReceiver,
108                new IntentFilter(UsbManager.ACTION_USB_STATE));
109    }
110
111    private void updateToggles() {
112        if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MTP)) {
113            mMtp.setChecked(true);
114            mPtp.setChecked(false);
115        } else if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_PTP)) {
116            mMtp.setChecked(false);
117            mPtp.setChecked(true);
118        } else  {
119            mMtp.setChecked(false);
120            mPtp.setChecked(false);
121        }
122        if (mInstallerCd != null) {
123            if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MASS_STORAGE)) {
124                mInstallerCd.setTitle( R.string.usb_label_installer_cd_done);
125            } else {
126                mInstallerCd.setTitle( R.string.usb_label_installer_cd);
127            }
128        }
129    }
130
131    @Override
132    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
133        Log.d(TAG, "onPreferenceTreeClick " + preference);
134
135        // temporary hack - using check boxes as radio buttons
136        // don't allow unchecking them
137        if (preference instanceof CheckBoxPreference) {
138            CheckBoxPreference checkBox = (CheckBoxPreference)preference;
139            if (!checkBox.isChecked()) {
140                checkBox.setChecked(true);
141                return true;
142            }
143        }
144        if (preference == mMtp) {
145            mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MTP, true);
146        } else if (preference == mPtp) {
147            mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_PTP, true);
148        }
149        updateToggles();
150        return true;
151    }
152
153    @Override
154    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
155        mInstallerCd = menu.add(Menu.NONE, MENU_ID_INSTALLER_CD, 0,
156                R.string.usb_label_installer_cd);
157        mInstallerCd.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
158    }
159
160    @Override
161    public boolean onOptionsItemSelected(MenuItem item) {
162        switch (item.getItemId()) {
163            case MENU_ID_INSTALLER_CD:
164                if (mUsbManager.isFunctionEnabled(UsbManager.USB_FUNCTION_MASS_STORAGE)) {
165                    // Disable installer CD, return to default function.
166                    mUsbManager.setCurrentFunction(null, false);
167                } else {
168                    // Enable installer CD.  Don't set as default function.
169                    mUsbManager.setCurrentFunction(UsbManager.USB_FUNCTION_MASS_STORAGE, false);
170                    mUsbManager.setMassStorageBackingFile(mInstallerImagePath);
171                }
172                updateToggles();
173                return true;
174        }
175        return super.onOptionsItemSelected(item);
176    }
177}
178