diff options
Diffstat (limited to 'services/java/com/android')
-rw-r--r-- | services/java/com/android/server/status/StorageNotification.java | 395 | ||||
-rw-r--r-- | services/java/com/android/server/status/UsbStorageActivity.java | 272 |
2 files changed, 0 insertions, 667 deletions
diff --git a/services/java/com/android/server/status/StorageNotification.java b/services/java/com/android/server/status/StorageNotification.java deleted file mode 100644 index 8da8cd3..0000000 --- a/services/java/com/android/server/status/StorageNotification.java +++ /dev/null @@ -1,395 +0,0 @@ -/* - * Copyright (C) 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.status; - -import android.app.Activity; -import android.app.Notification; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.pm.PackageManager; -import android.content.res.Resources; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.storage.IMountService; -import android.os.Message; -import android.os.ServiceManager; -import android.os.storage.StorageEventListener; -import android.os.storage.StorageManager; -import android.os.storage.StorageResultCode; -import android.provider.Settings; -import android.util.Slog; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; - -public class StorageNotification extends StorageEventListener { - private static final String TAG = "StorageNotification"; - - private static final boolean POP_UMS_ACTIVITY_ON_CONNECT = true; - - /** - * Binder context for this service - */ - private Context mContext; - - /** - * The notification that is shown when a USB mass storage host - * is connected. - * <p> - * This is lazily created, so use {@link #setUsbStorageNotification()}. - */ - private Notification mUsbStorageNotification; - - /** - * The notification that is shown when the following media events occur: - * - Media is being checked - * - Media is blank (or unknown filesystem) - * - Media is corrupt - * - Media is safe to unmount - * - Media is missing - * <p> - * This is lazily created, so use {@link #setMediaStorageNotification()}. - */ - private Notification mMediaStorageNotification; - private boolean mUmsAvailable; - private StorageManager mStorageManager; - - public StorageNotification(Context context) { - mContext = context; - - mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); - mUmsAvailable = mStorageManager.isUsbMassStorageConnected(); - Slog.d(TAG, String.format( "Startup with UMS connection %s (media state %s)", mUmsAvailable, - Environment.getExternalStorageState())); - } - - /* - * @override com.android.os.storage.StorageEventListener - */ - @Override - public void onUsbMassStorageConnectionChanged(boolean connected) { - mUmsAvailable = connected; - /* - * Even though we may have a UMS host connected, we the SD card - * may not be in a state for export. - */ - String st = Environment.getExternalStorageState(); - - Slog.i(TAG, String.format("UMS connection changed to %s (media state %s)", connected, st)); - - if (connected && (st.equals( - Environment.MEDIA_REMOVED) || st.equals(Environment.MEDIA_CHECKING))) { - /* - * No card or card being checked = don't display - */ - connected = false; - } - updateUsbMassStorageNotification(connected); - } - - /* - * @override com.android.os.storage.StorageEventListener - */ - @Override - public void onStorageStateChanged(String path, String oldState, String newState) { - Slog.i(TAG, String.format( - "Media {%s} state changed from {%s} -> {%s}", path, oldState, newState)); - if (newState.equals(Environment.MEDIA_SHARED)) { - /* - * Storage is now shared. Modify the UMS notification - * for stopping UMS. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.server.status.UsbStorageActivity.class); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - setUsbStorageNotification( - com.android.internal.R.string.usb_storage_stop_notification_title, - com.android.internal.R.string.usb_storage_stop_notification_message, - com.android.internal.R.drawable.stat_sys_warning, false, true, pi); - } else if (newState.equals(Environment.MEDIA_CHECKING)) { - /* - * Storage is now checking. Update media notification and disable - * UMS notification. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_checking_notification_title, - com.android.internal.R.string.ext_media_checking_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_prepare, true, false, null); - updateUsbMassStorageNotification(false); - } else if (newState.equals(Environment.MEDIA_MOUNTED)) { - /* - * Storage is now mounted. Dismiss any media notifications, - * and enable UMS notification if connected. - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_UNMOUNTED)) { - /* - * Storage is now unmounted. We may have been unmounted - * because the user is enabling/disabling UMS, in which case we don't - * want to display the 'safe to unmount' notification. - */ - if (!mStorageManager.isUsbMassStorageEnabled()) { - if (oldState.equals(Environment.MEDIA_SHARED)) { - /* - * The unmount was due to UMS being enabled. Dismiss any - * media notifications, and enable UMS notification if connected - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(mUmsAvailable); - } else { - /* - * Show safe to unmount media notification, and enable UMS - * notification if connected. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_safe_unmount_notification_title, - com.android.internal.R.string.ext_media_safe_unmount_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard, true, true, null); - updateUsbMassStorageNotification(mUmsAvailable); - } - } else { - /* - * The unmount was due to UMS being enabled. Dismiss any - * media notifications, and disable the UMS notification - */ - setMediaStorageNotification(0, 0, 0, false, false, null); - updateUsbMassStorageNotification(false); - } - } else if (newState.equals(Environment.MEDIA_NOFS)) { - /* - * Storage has no filesystem. Show blank media notification, - * and enable UMS notification if connected. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - - setMediaStorageNotification( - com.android.internal.R.string.ext_media_nofs_notification_title, - com.android.internal.R.string.ext_media_nofs_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, true, false, pi); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_UNMOUNTABLE)) { - /* - * Storage is corrupt. Show corrupt media notification, - * and enable UMS notification if connected. - */ - Intent intent = new Intent(); - intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - - setMediaStorageNotification( - com.android.internal.R.string.ext_media_unmountable_notification_title, - com.android.internal.R.string.ext_media_unmountable_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, true, false, pi); - updateUsbMassStorageNotification(mUmsAvailable); - } else if (newState.equals(Environment.MEDIA_REMOVED)) { - /* - * Storage has been removed. Show nomedia media notification, - * and disable UMS notification regardless of connection state. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_nomedia_notification_title, - com.android.internal.R.string.ext_media_nomedia_notification_message, - com.android.internal.R.drawable.stat_notify_sdcard_usb, - true, false, null); - updateUsbMassStorageNotification(false); - } else if (newState.equals(Environment.MEDIA_BAD_REMOVAL)) { - /* - * Storage has been removed unsafely. Show bad removal media notification, - * and disable UMS notification regardless of connection state. - */ - setMediaStorageNotification( - com.android.internal.R.string.ext_media_badremoval_notification_title, - com.android.internal.R.string.ext_media_badremoval_notification_message, - com.android.internal.R.drawable.stat_sys_warning, - true, true, null); - updateUsbMassStorageNotification(false); - } else { - Slog.w(TAG, String.format("Ignoring unknown state {%s}", newState)); - } - } - - /** - * Update the state of the USB mass storage notification - */ - void updateUsbMassStorageNotification(boolean available) { - - if (available) { - Intent intent = new Intent(); - intent.setClass(mContext, com.android.server.status.UsbStorageActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - final boolean adbOn = 1 == Settings.Secure.getInt( - mContext.getContentResolver(), - Settings.Secure.ADB_ENABLED, - 0); - - PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); - setUsbStorageNotification( - com.android.internal.R.string.usb_storage_notification_title, - com.android.internal.R.string.usb_storage_notification_message, - com.android.internal.R.drawable.stat_sys_data_usb, - false, true, pi); - - if (POP_UMS_ACTIVITY_ON_CONNECT && !adbOn) { - // We assume that developers don't want to enable UMS every - // time they attach a device to a USB host. The average user, - // however, is looking to charge the phone (in which case this - // is harmless) or transfer files (in which case this coaches - // the user about how to complete that task and saves several - // steps). - mContext.startActivity(intent); - } - } else { - setUsbStorageNotification(0, 0, 0, false, false, null); - } - } - - /** - * Sets the USB storage notification. - */ - private synchronized void setUsbStorageNotification(int titleId, int messageId, int icon, - boolean sound, boolean visible, PendingIntent pi) { - - if (!visible && mUsbStorageNotification == null) { - return; - } - - NotificationManager notificationManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - - if (notificationManager == null) { - return; - } - - if (visible) { - Resources r = Resources.getSystem(); - CharSequence title = r.getText(titleId); - CharSequence message = r.getText(messageId); - - if (mUsbStorageNotification == null) { - mUsbStorageNotification = new Notification(); - mUsbStorageNotification.icon = icon; - mUsbStorageNotification.when = 0; - } - - if (sound) { - mUsbStorageNotification.defaults |= Notification.DEFAULT_SOUND; - } else { - mUsbStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; - } - - mUsbStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; - - mUsbStorageNotification.tickerText = title; - if (pi == null) { - Intent intent = new Intent(); - pi = PendingIntent.getBroadcast(mContext, 0, intent, 0); - } - - mUsbStorageNotification.setLatestEventInfo(mContext, title, message, pi); - } - - final int notificationId = mUsbStorageNotification.icon; - if (visible) { - notificationManager.notify(notificationId, mUsbStorageNotification); - } else { - notificationManager.cancel(notificationId); - } - } - - private synchronized boolean getMediaStorageNotificationDismissable() { - if ((mMediaStorageNotification != null) && - ((mMediaStorageNotification.flags & Notification.FLAG_AUTO_CANCEL) == - Notification.FLAG_AUTO_CANCEL)) - return true; - - return false; - } - - /** - * Sets the media storage notification. - */ - private synchronized void setMediaStorageNotification(int titleId, int messageId, int icon, boolean visible, - boolean dismissable, PendingIntent pi) { - - if (!visible && mMediaStorageNotification == null) { - return; - } - - NotificationManager notificationManager = (NotificationManager) mContext - .getSystemService(Context.NOTIFICATION_SERVICE); - - if (notificationManager == null) { - return; - } - - if (mMediaStorageNotification != null && visible) { - /* - * Dismiss the previous notification - we're about to - * re-use it. - */ - final int notificationId = mMediaStorageNotification.icon; - notificationManager.cancel(notificationId); - } - - if (visible) { - Resources r = Resources.getSystem(); - CharSequence title = r.getText(titleId); - CharSequence message = r.getText(messageId); - - if (mMediaStorageNotification == null) { - mMediaStorageNotification = new Notification(); - mMediaStorageNotification.when = 0; - } - - mMediaStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; - - if (dismissable) { - mMediaStorageNotification.flags = Notification.FLAG_AUTO_CANCEL; - } else { - mMediaStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; - } - - mMediaStorageNotification.tickerText = title; - if (pi == null) { - Intent intent = new Intent(); - pi = PendingIntent.getBroadcast(mContext, 0, intent, 0); - } - - mMediaStorageNotification.icon = icon; - mMediaStorageNotification.setLatestEventInfo(mContext, title, message, pi); - } - - final int notificationId = mMediaStorageNotification.icon; - if (visible) { - notificationManager.notify(notificationId, mMediaStorageNotification); - } else { - notificationManager.cancel(notificationId); - } - } -} diff --git a/services/java/com/android/server/status/UsbStorageActivity.java b/services/java/com/android/server/status/UsbStorageActivity.java deleted file mode 100644 index e8631c5..0000000 --- a/services/java/com/android/server/status/UsbStorageActivity.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (C) 2007 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server.status; - -import com.android.internal.R; -import android.app.Activity; -import android.app.ActivityManager; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.content.DialogInterface.OnCancelListener; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.os.Bundle; -import android.os.Environment; -import android.os.Handler; -import android.os.IBinder; -import android.os.storage.IMountService; -import android.os.storage.StorageManager; -import android.os.storage.StorageEventListener; -import android.os.RemoteException; -import android.os.ServiceManager; -import android.widget.ImageView; -import android.widget.Button; -import android.widget.ProgressBar; -import android.widget.TextView; -import android.view.View; -import android.view.Window; -import android.util.Log; - -import java.util.List; - -/** - * This activity is shown to the user for him/her to enable USB mass storage - * on-demand (that is, when the USB cable is connected). It uses the alert - * dialog style. It will be launched from a notification. - */ -public class UsbStorageActivity extends Activity - implements View.OnClickListener, OnCancelListener { - private static final String TAG = "UsbStorageActivity"; - - private Button mMountButton; - private Button mUnmountButton; - private ProgressBar mProgressBar; - private TextView mBanner; - private TextView mMessage; - private ImageView mIcon; - private StorageManager mStorageManager = null; - private static final int DLG_CONFIRM_KILL_STORAGE_USERS = 1; - private static final int DLG_ERROR_SHARING = 2; - static final boolean localLOGV = false; - - /** Used to detect when the USB cable is unplugged, so we can call finish() */ - private BroadcastReceiver mBatteryReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction() == Intent.ACTION_BATTERY_CHANGED) { - handleBatteryChanged(intent); - } - } - }; - - private StorageEventListener mStorageListener = new StorageEventListener() { - @Override - public void onStorageStateChanged(String path, String oldState, String newState) { - final boolean on = newState.equals(Environment.MEDIA_SHARED); - switchDisplay(on); - } - }; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (mStorageManager == null) { - mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); - if (mStorageManager == null) { - Log.w(TAG, "Failed to get StorageManager"); - } - } - - requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - setProgressBarIndeterminateVisibility(true); - - setTitle(getString(com.android.internal.R.string.usb_storage_activity_title)); - - setContentView(com.android.internal.R.layout.usb_storage_activity); - - mIcon = (ImageView) findViewById(com.android.internal.R.id.icon); - mBanner = (TextView) findViewById(com.android.internal.R.id.banner); - mMessage = (TextView) findViewById(com.android.internal.R.id.message); - - mMountButton = (Button) findViewById(com.android.internal.R.id.mount_button); - mMountButton.setOnClickListener(this); - mUnmountButton = (Button) findViewById(com.android.internal.R.id.unmount_button); - mUnmountButton.setOnClickListener(this); - mProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress); - } - - private void switchDisplay(boolean usbStorageInUse) { - if (usbStorageInUse) { - mProgressBar.setVisibility(View.GONE); - mUnmountButton.setVisibility(View.VISIBLE); - mMountButton.setVisibility(View.GONE); - mIcon.setImageResource(com.android.internal.R.drawable.usb_android_connected); - mBanner.setText(com.android.internal.R.string.usb_storage_stop_title); - mMessage.setText(com.android.internal.R.string.usb_storage_stop_message); - } else { - mProgressBar.setVisibility(View.GONE); - mUnmountButton.setVisibility(View.GONE); - mMountButton.setVisibility(View.VISIBLE); - mIcon.setImageResource(com.android.internal.R.drawable.usb_android); - mBanner.setText(com.android.internal.R.string.usb_storage_title); - mMessage.setText(com.android.internal.R.string.usb_storage_message); - } - } - - @Override - protected void onResume() { - super.onResume(); - - mStorageManager.registerListener(mStorageListener); - registerReceiver(mBatteryReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); - try { - switchDisplay(mStorageManager.isUsbMassStorageEnabled()); - } catch (Exception ex) { - Log.e(TAG, "Failed to read UMS enable state", ex); - } - } - - @Override - protected void onPause() { - super.onPause(); - - unregisterReceiver(mBatteryReceiver); - if (mStorageManager == null && mStorageListener != null) { - mStorageManager.unregisterListener(mStorageListener); - } - } - - private void handleBatteryChanged(Intent intent) { - int pluggedType = intent.getIntExtra("plugged", 0); - if (pluggedType == 0) { - // It was disconnected from the plug, so finish - finish(); - } - } - - private IMountService getMountService() { - IBinder service = ServiceManager.getService("mount"); - if (service != null) { - return IMountService.Stub.asInterface(service); - } - return null; - } - - @Override - public Dialog onCreateDialog(int id, Bundle args) { - switch (id) { - case DLG_CONFIRM_KILL_STORAGE_USERS: - return new AlertDialog.Builder(this) - .setTitle(R.string.dlg_confirm_kill_storage_users_title) - .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { - switchUsbMassStorageAsync(true); - }}) - .setNegativeButton(R.string.cancel, null) - .setMessage(R.string.dlg_confirm_kill_storage_users_text) - .setOnCancelListener(this) - .create(); - case DLG_ERROR_SHARING: - return new AlertDialog.Builder(this) - .setTitle(R.string.dlg_error_title) - .setNeutralButton(R.string.dlg_ok, null) - .setMessage(R.string.usb_storage_error_message) - .setOnCancelListener(this) - .create(); - } - return null; - } - - private void showDialogInner(int id) { - removeDialog(id); - showDialog(id); - } - - private void switchUsbMassStorageAsync(boolean on) { - mUnmountButton.setVisibility(View.GONE); - mMountButton.setVisibility(View.GONE); - - mProgressBar.setVisibility(View.VISIBLE); - // will be hidden once USB mass storage kicks in (or fails) - - final boolean _on = on; - new Thread() { - public void run() { - if (_on) { - mStorageManager.enableUsbMassStorage(); - } else { - mStorageManager.disableUsbMassStorage(); - } - } - }.start(); - } - - private void checkStorageUsers() { - IMountService ims = getMountService(); - if (ims == null) { - // Display error dialog - showDialogInner(DLG_ERROR_SHARING); - } - String extStoragePath = Environment.getExternalStorageDirectory().toString(); - boolean showDialog = false; - try { - int[] stUsers = ims.getStorageUsers(extStoragePath); - if (stUsers != null && stUsers.length > 0) { - showDialog = true; - } else { - // List of applications on sdcard. - ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); - List<ApplicationInfo> infoList = am.getRunningExternalApplications(); - if (infoList != null && infoList.size() > 0) { - showDialog = true; - } - } - } catch (RemoteException e) { - // Display error dialog - showDialogInner(DLG_ERROR_SHARING); - } - if (showDialog) { - // Display dialog to user - showDialogInner(DLG_CONFIRM_KILL_STORAGE_USERS); - } else { - if (localLOGV) Log.i(TAG, "Enabling UMS"); - switchUsbMassStorageAsync(true); - } - } - - public void onClick(View v) { - if (v == mMountButton) { - // Check for list of storage users and display dialog if needed. - checkStorageUsers(); - } else if (v == mUnmountButton) { - if (localLOGV) Log.i(TAG, "Disabling UMS"); - switchUsbMassStorageAsync(false); - } - } - - public void onCancel(DialogInterface dialog) { - finish(); - } - -} |