diff options
7 files changed, 204 insertions, 25 deletions
| diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index fb2a72b8a4e1..2e56996d0a21 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -68,7 +68,7 @@ public class ResolverActivity extends AlertActivity implements      protected void onCreate(Bundle savedInstanceState, Intent intent,              CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, -            boolean alwaysUseOption, boolean alwaysChoose) { +            boolean alwaysUseOption) {          super.onCreate(savedInstanceState);          mPm = getPackageManager();          intent.setComponent(null); @@ -91,7 +91,7 @@ public class ResolverActivity extends AlertActivity implements          }          mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList);          int count = mAdapter.getCount(); -        if (count > 1 || (count == 1 && alwaysChoose)) { +        if (count > 1) {              ap.mAdapter = mAdapter;          } else if (count == 1) {              startActivity(mAdapter.intentForPosition(0)); @@ -104,12 +104,6 @@ public class ResolverActivity extends AlertActivity implements          setupAlert();      } -    protected void onCreate(Bundle savedInstanceState, Intent intent, -            CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, -            boolean alwaysUseOption) { -        onCreate(savedInstanceState, intent, title, initialIntents, rList, alwaysUseOption, false); -      } -      public void onClick(DialogInterface dialog, int which) {          ResolveInfo ri = mAdapter.resolveInfoForPosition(which);          Intent intent = mAdapter.intentForPosition(which); diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index ecd6fb64f104..bbe146d63158 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -41,6 +41,15 @@          </activity>          <!-- started from UsbDeviceSettingsManager --> +        <activity android:name=".usb.UsbConfirmActivity" +            android:exported="true" +            android:permission="android.permission.MANAGE_USB" +            android:theme="@*android:style/Theme.Holo.Dialog.Alert" +            android:finishOnCloseSystemDialogs="true" +            android:excludeFromRecents="true"> +        </activity> + +        <!-- started from UsbDeviceSettingsManager -->          <activity android:name=".usb.UsbPermissionActivity"              android:exported="true"              android:permission="android.permission.MANAGE_USB" diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 06c8ed910cce..8998674b52cf 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -122,6 +122,12 @@      <!-- Prompt for the USB accessory permission dialog [CHAR LIMIT=80] -->      <string name="usb_accessory_permission_prompt">Allow the application %1$s to access the USB accessory?</string> +    <!-- Prompt for the USB device confirm dialog [CHAR LIMIT=80] --> +    <string name="usb_device_confirm_prompt">Open %1$s when this USB device is connected?</string> + +    <!-- Prompt for the USB accessory confirm dialog [CHAR LIMIT=80] --> +    <string name="usb_accessory_confirm_prompt">Open %1$s when this USB accessory is connected?</string> +      <!-- Prompt for the USB accessory URI dialog [CHAR LIMIT=80] -->      <string name="usb_accessory_uri_prompt">Additional information for this device may be found at: %1$s</string> diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java new file mode 100644 index 000000000000..4e6f81f98a38 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbConfirmActivity.java @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * 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.systemui.usb; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.hardware.usb.IUsbManager; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbAccessory; +import android.hardware.usb.UsbManager; +import android.os.Bundle; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.TextView; + +import com.android.internal.app.AlertActivity; +import com.android.internal.app.AlertController; + +import com.android.systemui.R; + +public class UsbConfirmActivity extends AlertActivity +        implements DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { + +    private static final String TAG = "UsbConfirmActivity"; + +    private CheckBox mAlwaysUse; +    private TextView mClearDefaultHint; +    private UsbDevice mDevice; +    private UsbAccessory mAccessory; +    private ResolveInfo mResolveInfo; +    private boolean mPermissionGranted; +    private UsbDisconnectedReceiver mDisconnectedReceiver; + +    @Override +    public void onCreate(Bundle icicle) { +        super.onCreate(icicle); + +       Intent intent = getIntent(); +        mDevice = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); +        mAccessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY); +        mResolveInfo = (ResolveInfo)intent.getParcelableExtra("rinfo"); + +        PackageManager packageManager = getPackageManager(); +        String appName = mResolveInfo.loadLabel(packageManager).toString(); + +        final AlertController.AlertParams ap = mAlertParams; +        ap.mIcon = mResolveInfo.loadIcon(packageManager); +        ap.mTitle = appName; +        if (mDevice == null) { +            ap.mMessage = getString(R.string.usb_accessory_confirm_prompt, appName); +            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mAccessory); +        } else { +            ap.mMessage = getString(R.string.usb_device_confirm_prompt, appName); +            mDisconnectedReceiver = new UsbDisconnectedReceiver(this, mDevice); +        } +        ap.mPositiveButtonText = getString(com.android.internal.R.string.ok); +        ap.mNegativeButtonText = getString(com.android.internal.R.string.cancel); +        ap.mPositiveButtonListener = this; +        ap.mNegativeButtonListener = this; + +        // add "always use" checkbox +        LayoutInflater inflater = (LayoutInflater)getSystemService( +                Context.LAYOUT_INFLATER_SERVICE); +        ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); +        mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); +        mAlwaysUse.setText(com.android.internal.R.string.alwaysUse); +        mAlwaysUse.setOnCheckedChangeListener(this); +        mClearDefaultHint = (TextView)ap.mView.findViewById( +                                                    com.android.internal.R.id.clearDefaultHint); +        mClearDefaultHint.setVisibility(View.GONE); + +        setupAlert(); + +    } + +    public void onClick(DialogInterface dialog, int which) { +        if (which == AlertDialog.BUTTON_POSITIVE) { +            try { +                IBinder b = ServiceManager.getService(USB_SERVICE); +                IUsbManager service = IUsbManager.Stub.asInterface(b); +                int uid = mResolveInfo.activityInfo.applicationInfo.uid; +                boolean alwaysUse = mAlwaysUse.isChecked(); +                Intent intent = null; + +                if (mDevice != null) { +                    intent = new Intent(UsbManager.ACTION_USB_DEVICE_ATTACHED); +                    intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice); + +                    // grant permission for the device +                    service.grantDevicePermission(mDevice, uid); +                    // set or clear default setting +                    if (alwaysUse) { +                        service.setDevicePackage(mDevice, mResolveInfo.activityInfo.packageName); +                    } else { +                        service.setDevicePackage(mDevice, null); +                    } +                } else if (mAccessory != null) { +                    intent = new Intent(UsbManager.ACTION_USB_ACCESSORY_ATTACHED); +                    intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory); + +                    // grant permission for the accessory +                    service.grantAccessoryPermission(mAccessory, uid); +                    // set or clear default setting +                    if (alwaysUse) { +                        service.setAccessoryPackage(mAccessory, +                                mResolveInfo.activityInfo.packageName); +                    } else { +                        service.setAccessoryPackage(mAccessory, null); +                    } +                } + +                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +                intent.setComponent( +                    new ComponentName(mResolveInfo.activityInfo.packageName, +                            mResolveInfo.activityInfo.name)); +                startActivity(intent); +            } catch (Exception e) { +                Log.e(TAG, "Unable to start activity", e); +            } +        } +        finish(); +    } + +    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { +        if (mClearDefaultHint == null) return; + +        if(isChecked) { +            mClearDefaultHint.setVisibility(View.VISIBLE); +        } else { +            mClearDefaultHint.setVisibility(View.GONE); +        } +    } +} diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java index f1784df0e425..27cce6d51a16 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java @@ -49,7 +49,7 @@ public class UsbPermissionActivity extends AlertActivity      private static final String TAG = "UsbPermissionActivity"; -    private CheckBox mAlwaysCheck; +    private CheckBox mAlwaysUse;      private TextView mClearDefaultHint;      private UsbDevice mDevice;      private UsbAccessory mAccessory; @@ -100,9 +100,9 @@ public class UsbPermissionActivity extends AlertActivity          LayoutInflater inflater = (LayoutInflater)getSystemService(                  Context.LAYOUT_INFLATER_SERVICE);          ap.mView = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null); -        mAlwaysCheck = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); -        mAlwaysCheck.setText(com.android.internal.R.string.alwaysUse); -        mAlwaysCheck.setOnCheckedChangeListener(this); +        mAlwaysUse = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); +        mAlwaysUse.setText(com.android.internal.R.string.alwaysUse); +        mAlwaysUse.setOnCheckedChangeListener(this);          mClearDefaultHint = (TextView)ap.mView.findViewById(                                                      com.android.internal.R.id.clearDefaultHint);          mClearDefaultHint.setVisibility(View.GONE); @@ -123,7 +123,7 @@ public class UsbPermissionActivity extends AlertActivity                  intent.putExtra(UsbManager.EXTRA_DEVICE, mDevice);                  if (mPermissionGranted) {                      service.grantDevicePermission(mDevice, mUid); -                    if (mAlwaysCheck.isChecked()) { +                    if (mAlwaysUse.isChecked()) {                          service.setDevicePackage(mDevice, mPackageName);                      }                  } @@ -132,7 +132,7 @@ public class UsbPermissionActivity extends AlertActivity                  intent.putExtra(UsbManager.EXTRA_ACCESSORY, mAccessory);                  if (mPermissionGranted) {                      service.grantAccessoryPermission(mAccessory, mUid); -                    if (mAlwaysCheck.isChecked()) { +                    if (mAlwaysUse.isChecked()) {                          service.setAccessoryPackage(mAccessory, mPackageName);                      }                  } diff --git a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java index 84d73dd9301d..7c63820bd343 100644 --- a/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java +++ b/packages/SystemUI/src/com/android/systemui/usb/UsbResolverActivity.java @@ -56,11 +56,7 @@ public class UsbResolverActivity extends ResolverActivity {          ArrayList<ResolveInfo> rList = intent.getParcelableArrayListExtra(EXTRA_RESOLVE_INFOS);          CharSequence title = getResources().getText(com.android.internal.R.string.chooseUsbActivity);          super.onCreate(savedInstanceState, target, title, null, rList, -                true, /* Set alwaysUseOption to true to enable "always use this app" checkbox. */ -                true  /* Set alwaysChoose to display activity when only one choice is available. -                         This is necessary because this activity is needed for the user to allow -                         the application permission to access the device */ -                ); +                true /* Set alwaysUseOption to true to enable "always use this app" checkbox. */ );          mDevice = (UsbDevice)target.getParcelableExtra(UsbManager.EXTRA_DEVICE);          if (mDevice != null) { diff --git a/services/java/com/android/server/usb/UsbDeviceSettingsManager.java b/services/java/com/android/server/usb/UsbDeviceSettingsManager.java index c40ce76a5e60..de0b114ea0c5 100644 --- a/services/java/com/android/server/usb/UsbDeviceSettingsManager.java +++ b/services/java/com/android/server/usb/UsbDeviceSettingsManager.java @@ -655,17 +655,31 @@ class UsbDeviceSettingsManager {                  Log.e(TAG, "startActivity failed", e);              }          } else { -            // start UsbResolverActivity so user can choose an activity              Intent resolverIntent = new Intent(); -            resolverIntent.setClassName("com.android.systemui", -                    "com.android.systemui.usb.UsbResolverActivity");              resolverIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); -            resolverIntent.putExtra(Intent.EXTRA_INTENT, intent); -            resolverIntent.putParcelableArrayListExtra("rlist", matches); + +            if (count == 1) { +                // start UsbConfirmActivity if there is only one choice +                resolverIntent.setClassName("com.android.systemui", +                        "com.android.systemui.usb.UsbConfirmActivity"); +                resolverIntent.putExtra("rinfo", matches.get(0)); + +                if (device != null) { +                    resolverIntent.putExtra(UsbManager.EXTRA_DEVICE, device); +                } else { +                    resolverIntent.putExtra(UsbManager.EXTRA_ACCESSORY, accessory); +                } +            } else { +                // start UsbResolverActivity so user can choose an activity +                resolverIntent.setClassName("com.android.systemui", +                        "com.android.systemui.usb.UsbResolverActivity"); +                resolverIntent.putParcelableArrayListExtra("rlist", matches); +                resolverIntent.putExtra(Intent.EXTRA_INTENT, intent); +            }              try {                  mContext.startActivity(resolverIntent);              } catch (ActivityNotFoundException e) { -                Log.e(TAG, "unable to start UsbResolverActivity"); +                Log.e(TAG, "unable to start activity " + resolverIntent);              }          }      } |