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 190eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport com.android.internal.R; 20b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.app.Activity; 21f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.app.ActivityManager; 220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.app.AlertDialog; 230eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.app.Dialog; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 290eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.content.DialogInterface.OnCancelListener; 30f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.content.pm.ApplicationInfo; 31f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.content.pm.PackageManager; 32f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException; 33c4308f01c965571dc2354107c3574df113e397eeMike Lockwoodimport android.hardware.usb.UsbManager; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 35ec7f7e6378f87cdc826a8b5d836fff26f44b0b09San Mehatimport android.os.Environment; 36c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandlerimport android.os.Handler; 373a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandlerimport android.os.HandlerThread; 380eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.os.IBinder; 390eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapuimport android.os.storage.IMountService; 40b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageManager; 41b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageEventListener; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 44b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.widget.ImageView; 45b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.widget.Button; 46c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandlerimport android.widget.ProgressBar; 47b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.widget.TextView; 48b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandlerimport android.view.View; 49c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandlerimport android.view.Window; 5020754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackbornimport android.view.WindowManager; 51b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.util.Log; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 53f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapuimport java.util.List; 54f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This activity is shown to the user for him/her to enable USB mass storage 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on-demand (that is, when the USB cable is connected). It uses the alert 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dialog style. It will be launched from a notification. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 600eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapupublic class UsbStorageActivity extends Activity 610eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu implements View.OnClickListener, OnCancelListener { 62b104340496e3a531e26c8f428c808eca0e039f50San Mehat private static final String TAG = "UsbStorageActivity"; 63c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 64b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private Button mMountButton; 65b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private Button mUnmountButton; 66c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler private ProgressBar mProgressBar; 67b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private TextView mBanner; 68b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private TextView mMessage; 69b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler private ImageView mIcon; 70b104340496e3a531e26c8f428c808eca0e039f50San Mehat private StorageManager mStorageManager = null; 710eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private static final int DLG_CONFIRM_KILL_STORAGE_USERS = 1; 720eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private static final int DLG_ERROR_SHARING = 2; 730eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu static final boolean localLOGV = false; 74c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato private boolean mDestroyed; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // UI thread 773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private Handler mUIHandler; 783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 793a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // thread for working with the storage services, which can be slow 803a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private Handler mAsyncStorageHandler; 813a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** Used to detect when the USB cable is unplugged, so we can call finish() */ 8377bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood private BroadcastReceiver mUsbStateReceiver = new BroadcastReceiver() { 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 86770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood if (intent.getAction().equals(UsbManager.ACTION_USB_STATE)) { 8777bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood handleUsbStateChanged(intent); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 91b104340496e3a531e26c8f428c808eca0e039f50San Mehat 92b104340496e3a531e26c8f428c808eca0e039f50San Mehat private StorageEventListener mStorageListener = new StorageEventListener() { 93b104340496e3a531e26c8f428c808eca0e039f50San Mehat @Override 94b104340496e3a531e26c8f428c808eca0e039f50San Mehat public void onStorageStateChanged(String path, String oldState, String newState) { 95c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler final boolean on = newState.equals(Environment.MEDIA_SHARED); 96c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler switchDisplay(on); 97b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 98b104340496e3a531e26c8f428c808eca0e039f50San Mehat }; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104b104340496e3a531e26c8f428c808eca0e039f50San Mehat if (mStorageManager == null) { 105b104340496e3a531e26c8f428c808eca0e039f50San Mehat mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); 106b104340496e3a531e26c8f428c808eca0e039f50San Mehat if (mStorageManager == null) { 107b104340496e3a531e26c8f428c808eca0e039f50San Mehat Log.w(TAG, "Failed to get StorageManager"); 108b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 109b104340496e3a531e26c8f428c808eca0e039f50San Mehat } 1103a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 1113a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler = new Handler(); 1123a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 1133a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler HandlerThread thr = new HandlerThread("SystemUI UsbStorageActivity"); 1143a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler thr.start(); 1153a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler = new Handler(thr.getLooper()); 116b104340496e3a531e26c8f428c808eca0e039f50San Mehat 11720754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); 11820754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn if (Environment.isExternalStorageRemovable()) { 11920754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); 12020754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn } 12120754649790424455e8a5dbd5ab1fa0e0a4ca87eDianne Hackborn 122b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler setContentView(com.android.internal.R.layout.usb_storage_activity); 123b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 124b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon = (ImageView) findViewById(com.android.internal.R.id.icon); 125b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner = (TextView) findViewById(com.android.internal.R.id.banner); 126b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage = (TextView) findViewById(com.android.internal.R.id.message); 127b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 128b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton = (Button) findViewById(com.android.internal.R.id.mount_button); 1290eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mMountButton.setOnClickListener(this); 130b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button); 1310eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mUnmountButton.setOnClickListener(this); 132c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress); 133b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 134b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler 135c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato @Override 136c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato protected void onDestroy() { 137c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato super.onDestroy(); 138c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato mDestroyed = true; 139c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 140c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato 1413a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchDisplay(final boolean usbStorageInUse) { 1423a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler.post(new Runnable() { 1433a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 1443a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 1453a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchDisplayAsync(usbStorageInUse); 1463a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1473a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 1483a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1493a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 1503a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchDisplayAsync(boolean usbStorageInUse) { 151b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler if (usbStorageInUse) { 152c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar.setVisibility(View.GONE); 153b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton.setVisibility(View.VISIBLE); 154b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton.setVisibility(View.GONE); 155b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon.setImageResource(com.android.internal.R.drawable.usb_android_connected); 156b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner.setText(com.android.internal.R.string.usb_storage_stop_title); 157b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage.setText(com.android.internal.R.string.usb_storage_stop_message); 158b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } else { 159c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mProgressBar.setVisibility(View.GONE); 160b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mUnmountButton.setVisibility(View.GONE); 161b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMountButton.setVisibility(View.VISIBLE); 162b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mIcon.setImageResource(com.android.internal.R.drawable.usb_android); 163b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mBanner.setText(com.android.internal.R.string.usb_storage_title); 164b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler mMessage.setText(com.android.internal.R.string.usb_storage_message); 165b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onResume() { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onResume(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1720eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mStorageManager.registerListener(mStorageListener); 173770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood registerReceiver(mUsbStateReceiver, new IntentFilter(UsbManager.ACTION_USB_STATE)); 174b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler try { 1753a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 1763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 1773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 1783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchDisplay(mStorageManager.isUsbMassStorageEnabled()); 1793a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 1803a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 181b104340496e3a531e26c8f428c808eca0e039f50San Mehat } catch (Exception ex) { 182b104340496e3a531e26c8f428c808eca0e039f50San Mehat Log.e(TAG, "Failed to read UMS enable state", ex); 183b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onPause() { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onPause(); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19077bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood unregisterReceiver(mUsbStateReceiver); 1910eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (mStorageManager == null && mStorageListener != null) { 1920eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu mStorageManager.unregisterListener(mStorageListener); 1930eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19677bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood private void handleUsbStateChanged(Intent intent) { 197770126a678ccc9328a89407ffc82f4d998b25427Mike Lockwood boolean connected = intent.getExtras().getBoolean(UsbManager.USB_CONNECTED); 19877bc30d232633eb36323245bc5d0cbf144a3bd26Mike Lockwood if (!connected) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // It was disconnected from the plug, so finish 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2030eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2040eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private IMountService getMountService() { 2050eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu IBinder service = ServiceManager.getService("mount"); 2060eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (service != null) { 2070eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return IMountService.Stub.asInterface(service); 2080eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2090eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return null; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2110eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2120eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu @Override 2130eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public Dialog onCreateDialog(int id, Bundle args) { 2140eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu switch (id) { 2150eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu case DLG_CONFIRM_KILL_STORAGE_USERS: 2160eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return new AlertDialog.Builder(this) 2170eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setTitle(R.string.dlg_confirm_kill_storage_users_title) 2180eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { 2190eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onClick(DialogInterface dialog, int which) { 2203a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(true); 2210eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu }}) 2220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setNegativeButton(R.string.cancel, null) 2230eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setMessage(R.string.dlg_confirm_kill_storage_users_text) 2240eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setOnCancelListener(this) 2250eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .create(); 2260eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu case DLG_ERROR_SHARING: 2270eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return new AlertDialog.Builder(this) 2280eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setTitle(R.string.dlg_error_title) 2290eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setNeutralButton(R.string.dlg_ok, null) 2300eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setMessage(R.string.usb_storage_error_message) 2310eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .setOnCancelListener(this) 2320eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu .create(); 2330eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2340eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu return null; 2350eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2360eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 237c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato private void scheduleShowDialog(final int id) { 238c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato mUIHandler.post(new Runnable() { 239c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato @Override 240c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato public void run() { 241c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato if (!mDestroyed) { 242c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato removeDialog(id); 243c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato showDialog(id); 244c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 245c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato } 246c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato }); 2470eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 2480eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 2493a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void switchUsbMassStorage(final boolean on) { 2503a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // things to do on the UI thread 2513a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUIHandler.post(new Runnable() { 2523a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 2533a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 2543a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mUnmountButton.setVisibility(View.GONE); 2553a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mMountButton.setVisibility(View.GONE); 256c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 2573a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mProgressBar.setVisibility(View.VISIBLE); 2583a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // will be hidden once USB mass storage kicks in (or fails) 2593a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2603a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 261c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 2623a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler // things to do elsewhere 2633a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 2643a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 265c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler public void run() { 2663a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler if (on) { 267c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mStorageManager.enableUsbMassStorage(); 268c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } else { 269c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler mStorageManager.disableUsbMassStorage(); 270c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 271c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 2723a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 273c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler } 274c8b7b9f45e0f51138101c509b6d176d35bbf2c78Daniel Sandler 2750eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu private void checkStorageUsers() { 2763a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler mAsyncStorageHandler.post(new Runnable() { 2773a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler @Override 2783a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler public void run() { 2793a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler checkStorageUsersAsync(); 2803a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2813a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler }); 2823a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler } 2833a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler 2843a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler private void checkStorageUsersAsync() { 2850eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu IMountService ims = getMountService(); 2860eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (ims == null) { 2870eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Display error dialog 288c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_ERROR_SHARING); 2890eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 290f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu String extStoragePath = Environment.getExternalStorageDirectory().toString(); 291f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu boolean showDialog = false; 2920eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu try { 293f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu int[] stUsers = ims.getStorageUsers(extStoragePath); 294f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (stUsers != null && stUsers.length > 0) { 295f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu showDialog = true; 296f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } else { 297f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu // List of applications on sdcard. 298f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 299f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu List<ApplicationInfo> infoList = am.getRunningExternalApplications(); 300f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (infoList != null && infoList.size() > 0) { 301f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu showDialog = true; 302f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } 303f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu } 3040eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } catch (RemoteException e) { 305f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu // Display error dialog 306c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_ERROR_SHARING); 3070eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 308f7f5dda5e54da53b98f1504672a422a484496531Suchi Amalapurapu if (showDialog) { 3090eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Display dialog to user 310c7f8b6fcf56aeb457013832555f6358f6babee90Joe Onorato scheduleShowDialog(DLG_CONFIRM_KILL_STORAGE_USERS); 3110eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } else { 3120eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (localLOGV) Log.i(TAG, "Enabling UMS"); 3133a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(true); 3140eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3150eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3160eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 3170eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onClick(View v) { 3180eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (v == mMountButton) { 3190eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu // Check for list of storage users and display dialog if needed. 3200eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu checkStorageUsers(); 3210eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } else if (v == mUnmountButton) { 3220eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu if (localLOGV) Log.i(TAG, "Disabling UMS"); 3233a4940f3f08196baaa69a71f76316af5744ec771Daniel Sandler switchUsbMassStorage(false); 3240eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3250eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu } 3260eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu 3270eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu public void onCancel(DialogInterface dialog) { 3280eec21d97d9dc4eb4fdbad0e4c0fc53703452d02Suchi Amalapurapu finish(); 329b94f795c257e32a1d7be1115568b5b6f576dec37Daniel Sandler } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 332