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