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