19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 Google Inc. 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17fe4f3ae33c8da86585399b4167fd7987c8a16066Joe Onoratopackage com.android.systemui.usb; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.app.Activity; 20f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.app.ActivityManager; 210eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.app.AlertDialog; 220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.app.Dialog; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 26de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.content.DialogInterface.OnCancelListener; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 29f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.content.pm.ApplicationInfo; 30c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 32ec7f7e6378f87cdc826a8b5d836fff26f44b0b09San Mehatimport android.os.Environment; 33c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandlerimport android.os.Handler; 343a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandlerimport android.os.HandlerThread; 350eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.os.IBinder; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 38de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.os.storage.IMountService; 39de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.os.storage.StorageEventListener; 40de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.os.storage.StorageManager; 41de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.util.Log; 42de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.view.View; 43de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.view.WindowManager; 44b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.widget.Button; 45de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport android.widget.ImageView; 46c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandlerimport android.widget.ProgressBar; 47b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.widget.TextView; 48de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlock 49de84f0e77ea2bf713d15c290264059a413c2486aJohn Spurlockimport com.android.internal.R; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 51f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport java.util.List; 52f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This activity is shown to the user for him/her to enable USB mass storage 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on-demand (that is, when the USB cable is connected). It uses the alert 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dialog style. It will be launched from a notification. 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 580eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapupublic class UsbStorageActivity extends Activity 590eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu implements View.OnClickListener, OnCancelListener { 60b104340496e3a531e26c8f428c808eca0e039f50San Mehat private static final String TAG = "UsbStorageActivity"; 61c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 62b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private Button mMountButton; 63b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private Button mUnmountButton; 64c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler private ProgressBar mProgressBar; 65b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private TextView mBanner; 66b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private TextView mMessage; 67b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private ImageView mIcon; 68b104340496e3a531e26c8f428c808eca0e039f50San Mehat private StorageManager mStorageManager = null; 690eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private static final int DLG_CONFIRM_KILL_STORAGE_USERS = 1; 700eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private static final int DLG_ERROR_SHARING = 2; 710eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu static final boolean localLOGV = false; 72c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato private boolean mDestroyed; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 743a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // UI thread 753a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private Handler mUIHandler; 763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // thread for working with the storage services, which can be slow 783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private Handler mAsyncStorageHandler; 793a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Used to detect when the USB cable is unplugged, so we can call finish() */ 8177bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood private BroadcastReceiver mUsbStateReceiver = new BroadcastReceiver() { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 84770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood if (intent.getAction().equals(UsbManager.ACTION_USB_STATE)) { 8577bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood handleUsbStateChanged(intent); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 89b104340496e3a531e26c8f428c808eca0e039f50San Mehat 90b104340496e3a531e26c8f428c808eca0e039f50San Mehat private StorageEventListener mStorageListener = new StorageEventListener() { 91b104340496e3a531e26c8f428c808eca0e039f50San Mehat @Override 92b104340496e3a531e26c8f428c808eca0e039f50San Mehat public void onStorageStateChanged(String path, String oldState, String newState) { 93c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler final boolean on = newState.equals(Environment.MEDIA_SHARED); 94c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler switchDisplay(on); 95b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 96b104340496e3a531e26c8f428c808eca0e039f50San Mehat }; 97209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 102b104340496e3a531e26c8f428c808eca0e039f50San Mehat if (mStorageManager == null) { 103b104340496e3a531e26c8f428c808eca0e039f50San Mehat mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); 104b104340496e3a531e26c8f428c808eca0e039f50San Mehat if (mStorageManager == null) { 105b104340496e3a531e26c8f428c808eca0e039f50San Mehat Log.w(TAG, "Failed to get StorageManager"); 106b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 107b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 108209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock 1093a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler = new Handler(); 1103a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 1113a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler HandlerThread thr = new HandlerThread("SystemUI UsbStorageActivity"); 1123a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler thr.start(); 1133a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler = new Handler(thr.getLooper()); 114b104340496e3a531e26c8f428c808eca0e039f50San Mehat 11520754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 11620754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn if (Environment.isExternalStorageRemovable()) { 11720754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 11820754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn } 11920754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn 120b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler setContentView(com.android.internal.R.layout.usb_storage_activity); 121b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 122b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon = (ImageView) findViewById(com.android.internal.R.id.icon); 123b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner = (TextView) findViewById(com.android.internal.R.id.banner); 124b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage = (TextView) findViewById(com.android.internal.R.id.message); 125b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 126b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton = (Button) findViewById(com.android.internal.R.id.mount_button); 1270eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mMountButton.setOnClickListener(this); 128b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button); 1290eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mUnmountButton.setOnClickListener(this); 130c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress); 131b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 132b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 133c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato @Override 134c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato protected void onDestroy() { 135c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato super.onDestroy(); 136c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato mDestroyed = true; 137c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 138c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato 1393a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchDisplay(final boolean usbStorageInUse) { 1403a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler.post(new Runnable() { 1413a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 1423a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 1433a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchDisplayAsync(usbStorageInUse); 1443a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1453a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 1463a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1473a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 1483a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchDisplayAsync(boolean usbStorageInUse) { 149b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler if (usbStorageInUse) { 150c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar.setVisibility(View.GONE); 151b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton.setVisibility(View.VISIBLE); 152b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton.setVisibility(View.GONE); 153b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon.setImageResource(com.android.internal.R.drawable.usb_android_connected); 154b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner.setText(com.android.internal.R.string.usb_storage_stop_title); 155b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage.setText(com.android.internal.R.string.usb_storage_stop_message); 156b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } else { 157c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar.setVisibility(View.GONE); 158b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton.setVisibility(View.GONE); 159b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton.setVisibility(View.VISIBLE); 160b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon.setImageResource(com.android.internal.R.drawable.usb_android); 161b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner.setText(com.android.internal.R.string.usb_storage_title); 162b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage.setText(com.android.internal.R.string.usb_storage_message); 163b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onResume() { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onResume(); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1700eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mStorageManager.registerListener(mStorageListener); 171770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood registerReceiver(mUsbStateReceiver, new IntentFilter(UsbManager.ACTION_USB_STATE)); 172b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler try { 1733a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 1743a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 1753a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 1763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchDisplay(mStorageManager.isUsbMassStorageEnabled()); 1773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 179b104340496e3a531e26c8f428c808eca0e039f50San Mehat } catch (Exception ex) { 180b104340496e3a531e26c8f428c808eca0e039f50San Mehat Log.e(TAG, "Failed to read UMS enable state", ex); 181b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPause() { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onPause(); 187209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock 18877bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood unregisterReceiver(mUsbStateReceiver); 1890eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (mStorageManager == null && mStorageListener != null) { 1900eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mStorageManager.unregisterListener(mStorageListener); 1910eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19477bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood private void handleUsbStateChanged(Intent intent) { 195770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood boolean connected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED); 19677bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood if (!connected) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It was disconnected from the plug, so finish 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2010eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2020eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private IMountService getMountService() { 2030eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu IBinder service = ServiceManager.getService("mount"); 2040eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (service != null) { 2050eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return IMountService.Stub.asInterface(service); 2060eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2070eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return null; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2090eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2100eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu @Override 2110eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 2120eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu switch (id) { 2130eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu case DLG_CONFIRM_KILL_STORAGE_USERS: 2140eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return new AlertDialog.Builder(this) 2150eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setTitle(R.string.dlg_confirm_kill_storage_users_title) 2160eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 2170eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 2183a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(true); 2190eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu }}) 2200eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setNegativeButton(R.string.cancel, null) 2210eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setMessage(R.string.dlg_confirm_kill_storage_users_text) 2220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setOnCancelListener(this) 2230eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .create(); 2240eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu case DLG_ERROR_SHARING: 2250eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return new AlertDialog.Builder(this) 2260eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setTitle(R.string.dlg_error_title) 2270eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, null) 2280eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setMessage(R.string.usb_storage_error_message) 2290eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setOnCancelListener(this) 2300eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .create(); 2310eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2320eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return null; 2330eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2340eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 235c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato private void scheduleShowDialog(final int id) { 236c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato mUIHandler.post(new Runnable() { 237c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato @Override 238c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato public void run() { 239c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato if (!mDestroyed) { 240c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato removeDialog(id); 241c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato showDialog(id); 242c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 243c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 244c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato }); 2450eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2460eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2473a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchUsbMassStorage(final boolean on) { 2483a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // things to do on the UI thread 2493a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler.post(new Runnable() { 2503a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 2513a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 2523a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUnmountButton.setVisibility(View.GONE); 2533a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mMountButton.setVisibility(View.GONE); 254c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 2553a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mProgressBar.setVisibility(View.VISIBLE); 2563a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // will be hidden once USB mass storage kicks in (or fails) 2573a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2583a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 259209bede6b9edb9171e5bee4077b48e35004a37b4John Spurlock 2603a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // things to do elsewhere 2613a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 2623a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 263c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler public void run() { 2643a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler if (on) { 265c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mStorageManager.enableUsbMassStorage(); 266c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } else { 267c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mStorageManager.disableUsbMassStorage(); 268c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 269c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 2703a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 271c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 272c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 2730eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private void checkStorageUsers() { 2743a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 2753a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 2763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 2773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler checkStorageUsersAsync(); 2783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2793a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 2803a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2813a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 2823a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void checkStorageUsersAsync() { 2830eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu IMountService ims = getMountService(); 2840eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (ims == null) { 2850eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Display error dialog 286c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_ERROR_SHARING); 2870eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 288f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu String extStoragePath = Environment.getExternalStorageDirectory().toString(); 289f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu boolean showDialog = false; 2900eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu try { 291f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu int[] stUsers = ims.getStorageUsers(extStoragePath); 292f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (stUsers != null && stUsers.length > 0) { 293f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu showDialog = true; 294f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } else { 295f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu // List of applications on sdcard. 296f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 297f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu List<ApplicationInfo> infoList = am.getRunningExternalApplications(); 298f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (infoList != null && infoList.size() > 0) { 299f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu showDialog = true; 300f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } 301f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } 3020eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } catch (RemoteException e) { 303f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu // Display error dialog 304c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_ERROR_SHARING); 3050eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 306f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (showDialog) { 3070eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Display dialog to user 308c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_CONFIRM_KILL_STORAGE_USERS); 3090eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } else { 3100eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (localLOGV) Log.i(TAG, "Enabling UMS"); 3113a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(true); 3120eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3130eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3140eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 3150eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onClick(View v) { 3160eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (v == mMountButton) { 3170eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Check for list of storage users and display dialog if needed. 3180eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu checkStorageUsers(); 3190eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } else if (v == mUnmountButton) { 3200eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (localLOGV) Log.i(TAG, "Disabling UMS"); 3213a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(false); 3220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3230eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3240eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 3250eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onCancel(DialogInterface dialog) { 3260eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu finish(); 327b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 330