diff options
author | Vinod Krishnan <vinodkrishnan@google.com> | 2016-03-21 17:54:54 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-03-21 17:54:54 +0000 |
commit | f7ac4baf1459752e0ed0b62a61df5048784e1b17 (patch) | |
tree | 0a4f48f2c6eaf41182ad419b4edc3de4e5b7e739 | |
parent | ad6218a2c0991a34a9f9e7ff375c0088a12e42ef (diff) | |
parent | 3cc4e9da825cc19608e8d9f9df4c5a5d8eff379a (diff) | |
download | android_packages_apps_PackageInstaller-f7ac4baf1459752e0ed0b62a61df5048784e1b17.tar.gz android_packages_apps_PackageInstaller-f7ac4baf1459752e0ed0b62a61df5048784e1b17.tar.bz2 android_packages_apps_PackageInstaller-f7ac4baf1459752e0ed0b62a61df5048784e1b17.zip |
Merge changes I285e3269,I0c4c9ceb into nyc-dev
* changes:
Show No permissions, if there are no permissions
Wear Cleanup: Removing implicit intent & API change
7 files changed, 119 insertions, 59 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 7bc39a18..a750491c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -125,15 +125,7 @@ <!-- Wearable Components --> <service android:name=".wear.WearPackageInstallerService" android:permission="com.google.android.permission.INSTALL_WEARABLE_PACKAGES" - android:exported="true"> - <intent-filter> - <action android:name="com.android.packageinstaller.wear.INSTALL_PACKAGE"/> - <data android:scheme="content" android:mimeType="vnd.android.cursor.item/*"/> - </intent-filter> - <intent-filter> - <action android:name="com.android.packageinstaller.wear.UNINSTALL_PACKAGE"/> - </intent-filter> - </service> + android:exported="true"/> <provider android:name=".wear.WearPackageIconProvider" android:authorities="com.google.android.packageinstaller.wear.provider" diff --git a/res/layout-watch/settings_internal.xml b/res/layout-watch/settings_internal.xml index fdd21cef..e1947aaa 100644 --- a/res/layout-watch/settings_internal.xml +++ b/res/layout-watch/settings_internal.xml @@ -14,19 +14,38 @@ limitations under the License. --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> - <TextView - android:id="@+id/header" + <LinearLayout android:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="@dimen/settings_header_base_height" - android:layout_marginLeft="16dp" - android:layout_marginTop="@dimen/settings_header_top_margin" - android:textSize="@dimen/setting_short_header_text_size" - android:maxLines="2" - android:ellipsize="end" - android:textColor="#9E9E9E" - android:fontFamily="sans-serif-condensed-light" + android:layout_height="match_parent" + android:orientation="vertical"> + <TextView + android:id="@+id/header" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/settings_header_base_height" + android:layout_marginLeft="16dp" + android:layout_marginTop="@dimen/settings_header_top_margin" + android:textSize="@dimen/setting_short_header_text_size" + android:maxLines="2" + android:ellipsize="end" + android:textColor="#9E9E9E" + android:fontFamily="sans-serif-condensed-light" + /> + + <TextView + android:id="@+id/details" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:minHeight="@dimen/settings_header_base_height" + android:layout_marginLeft="16dp" + android:layout_marginTop="@dimen/settings_header_top_margin" + android:maxLines="2" + android:ellipsize="end" + android:textColor="@color/permissions_settings_item_color" + android:textSize="14sp" + android:visibility="gone" /> + </LinearLayout> <android.support.wearable.view.WearableListView xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java index 13a16d6e..4b621a64 100644 --- a/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java +++ b/src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java @@ -123,18 +123,18 @@ public final class AppPermissionsFragmentWear extends TitledSettingsFragment { super.onViewCreated(view, savedInstanceState); if (mAppPermissions != null) { initializeLayout(mAdapter); - bindHeader(mAppPermissions.getPackageInfo()); + mHeader.setText(R.string.app_permissions); + mDetails.setText(R.string.no_permissions); + if (mAdapter.getItemCount() == 0) { + mDetails.setVisibility(View.VISIBLE); + mWheel.setVisibility(View.GONE); + } else { + mDetails.setVisibility(View.GONE); + mWheel.setVisibility(View.VISIBLE); + } } } - private void bindHeader(PackageInfo packageInfo) { - Activity activity = getActivity(); - PackageManager pm = activity.getPackageManager(); - ApplicationInfo appInfo = packageInfo.applicationInfo; - CharSequence label = appInfo.loadLabel(pm); - mHeader.setText(label); - } - private void initializePermissionGroupList() { final String packageName = mAppPermissions.getPackageInfo().packageName; List<AppPermissionGroup> groups = mAppPermissions.getPermissionGroups(); diff --git a/src/com/android/packageinstaller/permission/ui/wear/TitledSettingsFragment.java b/src/com/android/packageinstaller/permission/ui/wear/TitledSettingsFragment.java index ef7efb28..b673a498 100644 --- a/src/com/android/packageinstaller/permission/ui/wear/TitledSettingsFragment.java +++ b/src/com/android/packageinstaller/permission/ui/wear/TitledSettingsFragment.java @@ -28,7 +28,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.WindowInsets; -import android.widget.FrameLayout; +import android.widget.LinearLayout; import android.widget.TextView; import com.android.packageinstaller.permission.ui.wear.settings.ViewUtils; @@ -46,6 +46,7 @@ public abstract class TitledSettingsFragment extends Fragment implements private int mInitialHeaderHeight; protected TextView mHeader; + protected TextView mDetails; protected WearableListView mWheel; private int mCharLimitShortTitle; @@ -114,6 +115,9 @@ public abstract class TitledSettingsFragment extends Fragment implements mHeader.addOnLayoutChangeListener(this); mHeader.addTextChangedListener(mHeaderTextWatcher); + mDetails = (TextView) v.findViewById(R.id.details); + mDetails.addOnLayoutChangeListener(this); + mWheel.setAdapter(adapter); mWheel.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override @@ -134,13 +138,14 @@ public abstract class TitledSettingsFragment extends Fragment implements adjustHeaderSize(); - positionOnCircular(getContext(), mHeader, mWheel); + positionOnCircular(getContext(), mHeader, mDetails, mWheel); } - public void positionOnCircular(Context context, View header, final ViewGroup wheel) { + public void positionOnCircular(Context context, View header, View details, + final ViewGroup wheel) { if (ViewUtils.getIsCircular(context)) { - FrameLayout.LayoutParams params = - (FrameLayout.LayoutParams) header.getLayoutParams(); + LinearLayout.LayoutParams params = + (LinearLayout.LayoutParams) header.getLayoutParams(); params.topMargin = (int) context.getResources().getDimension( R.dimen.settings_header_top_margin_circular); // Note that the margins are made symmetrical here. Since they're symmetrical we choose @@ -152,10 +157,14 @@ public abstract class TitledSettingsFragment extends Fragment implements params.rightMargin = margin; params.gravity = Gravity.CENTER_HORIZONTAL; header.setLayoutParams(params); + details.setLayoutParams(params); if (header instanceof TextView) { ((TextView) header).setGravity(Gravity.CENTER); } + if (details instanceof TextView) { + ((TextView) details).setGravity(Gravity.CENTER); + } final int leftPadding = (int) context.getResources().getDimension( R.dimen.round_content_padding_left); @@ -209,7 +218,7 @@ public abstract class TitledSettingsFragment extends Fragment implements } mHeader.setMinHeight((int) height); - FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mHeader.getLayoutParams(); + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mHeader.getLayoutParams(); final Context context = getContext(); if (!singleLine) { // Make the top margin a little bit smaller so there is more space for the title. diff --git a/src/com/android/packageinstaller/wear/WearPackageArgs.java b/src/com/android/packageinstaller/wear/WearPackageArgs.java index 67051da0..da49192a 100644 --- a/src/com/android/packageinstaller/wear/WearPackageArgs.java +++ b/src/com/android/packageinstaller/wear/WearPackageArgs.java @@ -25,6 +25,8 @@ import android.os.Bundle; * installing/uninstalling. */ public class WearPackageArgs { + private static final String KEY_PACKAGE_NAME = + "com.google.android.clockwork.EXTRA_PACKAGE_NAME"; private static final String KEY_ASSET_URI = "com.google.android.clockwork.EXTRA_ASSET_URI"; private static final String KEY_START_ID = @@ -45,16 +47,16 @@ public class WearPackageArgs { "com.google.android.clockwork.EXTRA_KEY_SHOULD_CHECK_GMS_DEPENDENCY"; public static String getPackageName(Bundle b) { - return b.getString(Intent.EXTRA_INSTALLER_PACKAGE_NAME); + return b.getString(KEY_PACKAGE_NAME); } - public static Uri getAssetUri(Bundle b) { - return b.getParcelable(KEY_ASSET_URI); + public static Bundle setPackageName(Bundle b, String packageName) { + b.putString(KEY_PACKAGE_NAME, packageName); + return b; } - public static Bundle setAssetUri(Bundle b, Uri assetUri) { - b.putParcelable(KEY_ASSET_URI, assetUri); - return b; + public static Uri getAssetUri(Bundle b) { + return b.getParcelable(KEY_ASSET_URI); } public static Uri getPermUri(Bundle b) { diff --git a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java index 3874c0a4..7387ed2a 100644 --- a/src/com/android/packageinstaller/wear/WearPackageInstallerService.java +++ b/src/com/android/packageinstaller/wear/WearPackageInstallerService.java @@ -66,13 +66,18 @@ import java.util.Set; * * Install Action example: * adb shell am startservice -a com.android.packageinstaller.wear.INSTALL_PACKAGE \ - * -t vnd.android.cursor.item/wearable_apk \ - * -d content://com.google.android.clockwork.home.provider/host/com.google.android.wearable.app/wearable/com.google.android.gms/apk \ + * -d package://com.google.android.gms \ + * --eu com.google.android.clockwork.EXTRA_ASSET_URI content://com.google.android.clockwork.home.provider/host/com.google.android.wearable.app/wearable/com.google.android.gms/apk \ * --es android.intent.extra.INSTALLER_PACKAGE_NAME com.google.android.gms \ * --ez com.google.android.clockwork.EXTRA_CHECK_PERMS false \ * --eu com.google.android.clockwork.EXTRA_PERM_URI content://com.google.android.clockwork.home.provider/host/com.google.android.wearable.app/permissions \ * com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService * + * Uninstall Action example: + * adb shell am startservice -a com.android.packageinstaller.wear.UNINSTALL_PACKAGE \ + * -d package://com.google.android.gms \ + * com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService + * * Retry GMS: * adb shell am startservice -a com.android.packageinstaller.wear.RETRY_GMS \ * com.android.packageinstaller/com.android.packageinstaller.wear.WearPackageInstallerService @@ -141,29 +146,49 @@ public class WearPackageInstallerService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { if (!DeviceUtils.isWear(this)) { - Log.w(TAG, "Not running on wearable"); + Log.w(TAG, "Not running on wearable."); + return START_NOT_STICKY; + } + + if (intent == null) { + Log.w(TAG, "Got null intent."); return START_NOT_STICKY; } + + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "Got install/uninstall request " + intent); + } + + Uri packageUri = intent.getData(); + if (packageUri == null) { + Log.e(TAG, "No package URI in intent"); + return START_NOT_STICKY; + } + final String packageName = WearPackageUtil.getSanitizedPackageName(packageUri); + if (packageName == null) { + Log.e(TAG, "Invalid package name in URI (expected package:<pkgName>): " + packageUri); + return START_NOT_STICKY; + } + PowerManager.WakeLock lock = getLock(this.getApplicationContext()); if (!lock.isHeld()) { lock.acquire(); } - if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, "Got install/uninstall request " + intent); + + Bundle intentBundle = intent.getExtras(); + if (intentBundle == null) { + intentBundle = new Bundle(); } - if (intent != null) { - Bundle intentBundle = intent.getExtras(); - WearPackageArgs.setStartId(intentBundle, startId); - if (Intent.ACTION_INSTALL_PACKAGE.equals(intent.getAction())) { - final Message msg = mServiceHandler.obtainMessage(START_INSTALL); - WearPackageArgs.setAssetUri(intentBundle, intent.getData()); - msg.setData(intentBundle); - mServiceHandler.sendMessage(msg); - } else if (Intent.ACTION_UNINSTALL_PACKAGE.equals(intent.getAction())) { - Message msg = mServiceHandler.obtainMessage(START_UNINSTALL); - msg.setData(intentBundle); - mServiceHandler.sendMessage(msg); - } + WearPackageArgs.setStartId(intentBundle, startId); + WearPackageArgs.setPackageName(intentBundle, packageName); + if (Intent.ACTION_INSTALL_PACKAGE.equals(intent.getAction())) { + Message msg = mServiceHandler.obtainMessage(START_INSTALL); + msg.setData(intentBundle); + mServiceHandler.sendMessage(msg); + } else if (Intent.ACTION_UNINSTALL_PACKAGE.equals(intent.getAction())) { + Message msg = mServiceHandler.obtainMessage(START_UNINSTALL); + msg.setData(intentBundle); + mServiceHandler.sendMessage(msg); } return START_NOT_STICKY; } diff --git a/src/com/android/packageinstaller/wear/WearPackageUtil.java b/src/com/android/packageinstaller/wear/WearPackageUtil.java index 688d6167..c351277e 100644 --- a/src/com/android/packageinstaller/wear/WearPackageUtil.java +++ b/src/com/android/packageinstaller/wear/WearPackageUtil.java @@ -21,6 +21,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageParser; +import android.net.Uri; import android.os.ParcelFileDescriptor; import android.system.ErrnoException; import android.system.Os; @@ -164,4 +165,16 @@ public class WearPackageUtil { + " for " + wearablePackageName); context.startService(newIntent); } + + /** + * @return com.google.com from expected formats like + * Uri: package:com.google.com, package:/com.google.com, package://com.google.com + */ + public static String getSanitizedPackageName(Uri packageUri) { + String packageName = packageUri.getEncodedSchemeSpecificPart(); + if (packageName != null) { + return packageName.replaceAll("^/+", ""); + } + return packageName; + } } |