InstalledAppDetails: "Clear defaults" button now clears USB service settings

The USB service caches the preferred activity preferences for USB devices
and accessories and allows permission to access the hardware based on the
user's selection.  The "Clear defaults" button can now be used to clear
these settings.

Change-Id: I307c118cb0ce06362e289e35bca93a47ce4631a5
Signed-off-by: Mike Lockwood <lockwood@android.com>
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e092bc9..a8f9787 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -48,6 +48,7 @@
     <uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
     <uses-permission android:name="android.permission.STATUS_BAR" />
+    <uses-permission android:name="android.permission.MANAGE_USB" />
 
     <application android:label="@string/settings_label"
             android:icon="@mipmap/ic_launcher_settings"
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 06d97fc..8edf206 100644
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -37,13 +37,16 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.hardware.usb.IUsbManager;
 import android.net.Uri;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.Message;
 import android.os.RemoteException;
+import android.os.ServiceManager;
 import android.preference.PreferenceActivity;
 import android.text.format.Formatter;
 import android.util.Log;
@@ -79,6 +82,7 @@
     public static final String ARG_PACKAGE_NAME = "package";
 
     private PackageManager mPm;
+    private IUsbManager mUsbManager;
     private ApplicationsState mState;
     private ApplicationsState.AppEntry mAppEntry;
     private PackageInfo mPackageInfo;
@@ -305,7 +309,9 @@
         
         mState = ApplicationsState.getInstance(getActivity().getApplication());
         mPm = getActivity().getPackageManager();
-        
+        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
+        mUsbManager = IUsbManager.Stub.asInterface(b);
+
         mCanBeOnSdCardChecker = new CanBeOnSdCardChecker();
     }
 
@@ -444,8 +450,14 @@
         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
         mPm.getPreferredActivities(intentList, prefActList, packageName);
         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
+        boolean hasUsbDefaults = false;
+        try {
+            hasUsbDefaults = mUsbManager.hasDefaults(packageName, mAppEntry.info.uid);
+        } catch (RemoteException e) {
+            Log.e(TAG, "mUsbManager.hasDefaults", e);
+        }
         TextView autoLaunchView = (TextView)mRootView.findViewById(R.id.auto_launch);
-        if (prefActList.size() <= 0) {
+        if (prefActList.size() <= 0 && !hasUsbDefaults) {
             // Disable clear activities button
             autoLaunchView.setText(R.string.auto_launch_disable_text);
             mActivitiesButton.setEnabled(false);
@@ -784,6 +796,11 @@
             }
         } else if(v == mActivitiesButton) {
             mPm.clearPackagePreferredActivities(packageName);
+            try {
+                mUsbManager.clearDefaults(packageName, mAppEntry.info.uid);
+            } catch (RemoteException e) {
+                Log.e(TAG, "mUsbManager.clearDefaults", e);
+            }
             mActivitiesButton.setEnabled(false);
         } else if(v == mClearDataButton) {
             if (mAppEntry.info.manageSpaceActivityName != null) {