19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 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 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.Notification; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.NotificationManager; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.app.PendingIntent; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.BroadcastReceiver; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IMountService; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Environment; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.UEventObserver; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileReader; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MountService implements an to the mount service daemon 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass MountService extends IMountService.Stub { 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "MountService"; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Binder context for this service 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Context mContext; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * listener object for communicating with the mount service daemon 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private MountListener mListener; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The notification that is shown when a USB mass storage host 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is connected. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is lazily created, so use {@link #setUsbStorageNotification()}. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Notification mUsbStorageNotification; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The notification that is shown when the following media events occur: 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Media is being checked 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Media is blank (or unknown filesystem) 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Media is corrupt 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Media is safe to unmount 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * - Media is missing 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is lazily created, so use {@link #setMediaStorageNotification()}. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Notification mMediaStorageNotification; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mShowSafeUnmountNotificationWhenUnmounted; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mPlaySounds; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean mMounted; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 85ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project private boolean mAutoStartUms; 86ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Constructs a new MountService instance 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param context Binder context for this service 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public MountService(Context context) { 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Register a BOOT_COMPLETED handler so that we can start 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // MountListener. We defer the startup so that we don't 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // start processing events before we ought-to 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.registerReceiver(mBroadcastReceiver, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener = new MountListener(this); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShowSafeUnmountNotificationWhenUnmounted = false; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlaySounds = SystemProperties.get("persist.service.mount.playsnd", "1").equals("1"); 105ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 106ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mAutoStartUms = SystemProperties.get("persist.service.mount.umsauto", "0").equals("1"); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onReceive(Context context, Intent intent) { 1117ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat String action = intent.getAction(); 1127ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1137ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (action.equals(Intent.ACTION_BOOT_COMPLETED)) { 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread thread = new Thread(mListener, MountListener.class.getName()); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project thread.start(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1207ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat public void shutdown() { 1217ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (mContext.checkCallingOrSelfPermission( 1227ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat android.Manifest.permission.SHUTDOWN) 1237ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat != PackageManager.PERMISSION_GRANTED) { 1247ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat throw new SecurityException("Requires SHUTDOWN permission"); 1257ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1267ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1277ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.d(TAG, "Shutting down"); 1287ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat String state = Environment.getExternalStorageState(); 1297ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1307ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (state.equals(Environment.MEDIA_SHARED)) { 1317ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat /* 1327ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * If the media is currently shared, unshare it. 1337ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * XXX: This is still dangerous!. We should not 1347ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * be rebooting at *all* if UMS is enabled, since 1357ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * the UMS host could have dirty FAT cache entries 1367ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * yet to flush. 1377ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat */ 1387ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat try { 1397ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat setMassStorageEnabled(false); 1407ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } catch (Exception e) { 1417ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "ums disable failed", e); 1427ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1437ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } else if (state.equals(Environment.MEDIA_CHECKING)) { 1447ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat /* 1457ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * If the media is being checked, then we need to wait for 1467ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * it to complete before being able to proceed. 1477ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat */ 1487ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat // XXX: @hackbod - Should we disable the ANR timer here? 1497ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat int retries = 30; 1507ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat while (state.equals(Environment.MEDIA_CHECKING) && (retries-- >=0)) { 1517ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat try { 1527ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Thread.sleep(1000); 1537ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } catch (InterruptedException iex) { 1547ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "Interrupted while waiting for media", iex); 1557ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat break; 1567ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1577ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat state = Environment.getExternalStorageState(); 1587ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1597ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (retries == 0) { 1607ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "Timed out waiting for media to check"); 1617ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1627ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1637ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1647ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (state.equals(Environment.MEDIA_MOUNTED)) { 1657ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat /* 1667ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat * If the media is mounted, then gracefully unmount it. 1677ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat */ 1687ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat try { 1697ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat String m = Environment.getExternalStorageDirectory().toString(); 1707ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat unmountMedia(m); 1717ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1727ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat int retries = 12; 1737ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat while (!state.equals(Environment.MEDIA_UNMOUNTED) && (retries-- >=0)) { 1747ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat try { 1757ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Thread.sleep(1000); 1767ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } catch (InterruptedException iex) { 1777ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "Interrupted while waiting for media", iex); 1787ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat break; 1797ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1807ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat state = Environment.getExternalStorageState(); 1817ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1827ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat if (retries == 0) { 1837ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "Timed out waiting for media to unmount"); 1847ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1857ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } catch (Exception e) { 1867ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat Log.e(TAG, "external storage unmount failed", e); 1877ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1887ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1897ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat } 1907ebf017658070323ed1c2bbd80c46c7cd2390d87San Mehat 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if USB mass storage support is enabled. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getMassStorageEnabled() throws RemoteException { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mListener.getMassStorageEnabled(); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enables or disables USB mass storage support. 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param enable true to enable USB mass storage support 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setMassStorageEnabled(boolean enable) throws RemoteException { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.setMassStorageEnabled(enable); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return true if USB mass storage is connected. 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getMassStorageConnected() throws RemoteException { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mListener.getMassStorageConnected(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attempt to mount external media 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void mountMedia(String mountPath) throws RemoteException { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission( 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS) 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires MOUNT_UNMOUNT_FILESYSTEMS permission"); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.mountMedia(mountPath); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attempt to unmount external media to prepare for eject 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unmountMedia(String mountPath) throws RemoteException { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission( 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS) 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires MOUNT_UNMOUNT_FILESYSTEMS permission"); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set a flag so that when we get the unmounted event, we know 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to display the notification 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShowSafeUnmountNotificationWhenUnmounted = true; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // tell mountd to unmount the media 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.ejectMedia(mountPath); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Attempt to format external media 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void formatMedia(String formatPath) throws RemoteException { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission( 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS) 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires MOUNT_FORMAT_FILESYSTEMS permission"); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mListener.formatMedia(formatPath); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns true if we're playing media notification sounds. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean getPlayNotificationSounds() { 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPlaySounds; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set whether or not we're playing media notification sounds. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setPlayNotificationSounds(boolean enabled) { 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mContext.checkCallingOrSelfPermission( 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.WRITE_SETTINGS) 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException("Requires WRITE_SETTINGS permission"); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPlaySounds = enabled; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemProperties.set("persist.service.mount.playsnd", (enabled ? "1" : "0")); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 278ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Returns true if we auto-start UMS on cable insertion. 279ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 280ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public boolean getAutoStartUms() { 281ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project return mAutoStartUms; 282ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 283ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 284ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 285ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project * Set whether or not we're playing media notification sounds. 286ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project */ 287ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project public void setAutoStartUms(boolean enabled) { 288ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mContext.checkCallingOrSelfPermission( 289ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project android.Manifest.permission.WRITE_SETTINGS) 290ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project != PackageManager.PERMISSION_GRANTED) { 291ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project throw new SecurityException("Requires WRITE_SETTINGS permission"); 292ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 293ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project mAutoStartUms = enabled; 294ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project SystemProperties.set("persist.service.mount.umsauto", (enabled ? "1" : "0")); 295ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 296ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project 297ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project /** 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Update the state of the USB mass storage notification 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateUsbMassStorageNotification(boolean suppressIfConnected, boolean sound) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (getMassStorageConnected() && !suppressIfConnected) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setClass(mContext, com.android.internal.app.UsbStorageActivity.class); 3079517443904e341ee77c38648763d55687cd88760Mike Lockwood intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUsbStorageNotification( 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.usb_storage_notification_title, 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.usb_storage_notification_message, 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.drawable.stat_sys_data_usb, 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sound, true, pi); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUsbStorageNotification(0, 0, 0, false, false, null); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RemoteException e) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Nothing to do 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void handlePossibleExplicitUnmountBroadcast(String path) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMounted) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMounted = false; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the USB mass storage connected event to all clients. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyUmsConnected() { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String storageState = Environment.getExternalStorageState(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!storageState.equals(Environment.MEDIA_REMOVED) && 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !storageState.equals(Environment.MEDIA_BAD_REMOVAL) && 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project !storageState.equals(Environment.MEDIA_CHECKING)) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 340ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project if (mAutoStartUms) { 341ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project try { 342ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project setMassStorageEnabled(true); 343ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } catch (RemoteException e) { 344ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 345ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } else { 346ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project updateUsbMassStorageNotification(false, true); 347ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_UMS_CONNECTED); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the USB mass storage disconnected event to all clients. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyUmsDisconnected() { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(false, false); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_UMS_DISCONNECTED); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media removed event to all clients. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaRemoved(String path) { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(true, false); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification( 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_nomedia_notification_title, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_nomedia_notification_message, 372a7ef2698a6c9182ffd41574495a18da1ffc2be2cMike Lockwood com.android.internal.R.drawable.stat_notify_sdcard_usb, 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false, null); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handlePossibleExplicitUnmountBroadcast(path); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_REMOVED, 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media unmounted event to all clients. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaUnmounted(String path) { 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mShowSafeUnmountNotificationWhenUnmounted) { 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification( 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_safe_unmount_notification_title, 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_safe_unmount_notification_message, 389de46acddf597da5637b99a8a6e52ffd642ae913eMike Lockwood com.android.internal.R.drawable.stat_notify_sdcard, 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, true, null); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mShowSafeUnmountNotificationWhenUnmounted = false; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification(0, 0, 0, false, false, null); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(false, false); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_UNMOUNTED, 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media checking event to all clients. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaChecking(String path) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification( 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_checking_notification_title, 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_checking_notification_message, 409de46acddf597da5637b99a8a6e52ffd642ae913eMike Lockwood com.android.internal.R.drawable.stat_notify_sdcard_prepare, 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false, null); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(true, false); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_CHECKING, 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media nofs event to all clients. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaNoFs(String path) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification(com.android.internal.R.string.ext_media_nofs_notification_title, 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_nofs_notification_message, 429a7ef2698a6c9182ffd41574495a18da1ffc2be2cMike Lockwood com.android.internal.R.drawable.stat_notify_sdcard_usb, 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false, pi); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(false, false); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(Intent.ACTION_MEDIA_NOFS, 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media mounted event to all clients. 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaMounted(String path, boolean readOnly) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification(0, 0, 0, false, false, null); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(false, false); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.putExtra("read-only", readOnly); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMounted = true; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media shared event to all clients. 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaShared(String path) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setClass(mContext, com.android.internal.app.UsbStorageStopActivity.class); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setUsbStorageNotification(com.android.internal.R.string.usb_storage_stop_notification_title, 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.usb_storage_stop_notification_message, 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.drawable.stat_sys_warning, 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false, true, pi); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handlePossibleExplicitUnmountBroadcast(path); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(Intent.ACTION_MEDIA_SHARED, 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media bad removal event to all clients. 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaBadRemoval(String path) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(true, false); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification(com.android.internal.R.string.ext_media_badremoval_notification_title, 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_badremoval_notification_message, 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.drawable.stat_sys_warning, 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, true, null); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handlePossibleExplicitUnmountBroadcast(path); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_BAD_REMOVAL, 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(Intent.ACTION_MEDIA_REMOVED, 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media unmountable event to all clients. 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaUnmountable(String path) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setClass(mContext, com.android.internal.app.ExternalMediaFormatActivity.class); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, 0); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setMediaStorageNotification(com.android.internal.R.string.ext_media_unmountable_notification_title, 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.string.ext_media_unmountable_notification_message, 497a7ef2698a6c9182ffd41574495a18da1ffc2be2cMike Lockwood com.android.internal.R.drawable.stat_notify_sdcard_usb, 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true, false, pi); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateUsbMassStorageNotification(false, false); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handlePossibleExplicitUnmountBroadcast(path); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent = new Intent(Intent.ACTION_MEDIA_UNMOUNTABLE, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Broadcasts the media eject event to all clients. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void notifyMediaEject(String path) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(Intent.ACTION_MEDIA_EJECT, 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri.parse("file://" + path)); 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.sendBroadcast(intent); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the USB storage notification. 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void setUsbStorageNotification(int titleId, int messageId, int icon, boolean sound, boolean visible, 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PendingIntent pi) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!visible && mUsbStorageNotification == null) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationManager notificationManager = (NotificationManager) mContext 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getSystemService(Context.NOTIFICATION_SERVICE); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notificationManager == null) { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = Resources.getSystem(); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = r.getText(titleId); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence message = r.getText(messageId); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mUsbStorageNotification == null) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification = new Notification(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.icon = icon; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.when = 0; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sound && mPlaySounds) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.defaults |= Notification.DEFAULT_SOUND; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.tickerText = title; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi == null) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi = PendingIntent.getBroadcast(mContext, 0, intent, 0); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUsbStorageNotification.setLatestEventInfo(mContext, title, message, pi); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int notificationId = mUsbStorageNotification.icon; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notificationManager.notify(notificationId, mUsbStorageNotification); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notificationManager.cancel(notificationId); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized boolean getMediaStorageNotificationDismissable() { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mMediaStorageNotification != null) && 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ((mMediaStorageNotification.flags & Notification.FLAG_AUTO_CANCEL) == 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Notification.FLAG_AUTO_CANCEL)) 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the media storage notification. 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private synchronized void setMediaStorageNotification(int titleId, int messageId, int icon, boolean visible, 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean dismissable, PendingIntent pi) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!visible && mMediaStorageNotification == null) { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NotificationManager notificationManager = (NotificationManager) mContext 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getSystemService(Context.NOTIFICATION_SERVICE); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (notificationManager == null) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMediaStorageNotification != null && visible) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dismiss the previous notification - we're about to 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * re-use it. 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int notificationId = mMediaStorageNotification.icon; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notificationManager.cancel(notificationId); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources r = Resources.getSystem(); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence title = r.getText(titleId); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence message = r.getText(messageId); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMediaStorageNotification == null) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification = new Notification(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.when = 0; 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPlaySounds) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.defaults |= Notification.DEFAULT_SOUND; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.defaults &= ~Notification.DEFAULT_SOUND; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dismissable) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.flags = Notification.FLAG_AUTO_CANCEL; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.flags = Notification.FLAG_ONGOING_EVENT; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.tickerText = title; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pi == null) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = new Intent(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi = PendingIntent.getBroadcast(mContext, 0, intent, 0); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.icon = icon; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMediaStorageNotification.setLatestEventInfo(mContext, title, message, pi); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int notificationId = mMediaStorageNotification.icon; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (visible) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notificationManager.notify(notificationId, mMediaStorageNotification); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project notificationManager.cancel(notificationId); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 646