diff --git a/res/layout/app_details.xml b/res/layout/app_details.xml index 4aa1496718f..5ffeec57a94 100644 --- a/res/layout/app_details.xml +++ b/res/layout/app_details.xml @@ -26,17 +26,23 @@ android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:paddingTop="24dp" - android:paddingBottom="24dp" > + android:paddingBottom="24dp" + android:clipChildren="false" + android:clipToPadding="false"> + android:paddingStart="8dp" + android:clipChildren="false" + android:clipToPadding="false"> + android:layout_height="80dp" + android:clipChildren="false" + android:clipToPadding="false"> 16dp 56dp + + 6dp 120dp 40dp 16dp diff --git a/src/com/android/settings/applications/AppHeaderController.java b/src/com/android/settings/applications/AppHeaderController.java index b138edef671..9e416796712 100644 --- a/src/com/android/settings/applications/AppHeaderController.java +++ b/src/com/android/settings/applications/AppHeaderController.java @@ -24,6 +24,8 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.ResolveInfo; import android.content.res.Resources; +import android.graphics.Outline; +import android.graphics.drawable.AdaptiveIconDrawable; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.support.annotation.IntDef; @@ -31,6 +33,7 @@ import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; +import android.view.ViewOutlineProvider; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; @@ -61,12 +64,23 @@ public class AppHeaderController { public static final String PREF_KEY_APP_HEADER = "pref_app_header"; + public static final ViewOutlineProvider OUTLINE_PROVIDER = new ViewOutlineProvider() { + @Override + public void getOutline(View view, Outline outline) { + Drawable background = ((ImageView)view).getDrawable(); + if (background != null) { + background.getOutline(outline); + } + } + }; + private static final String TAG = "AppDetailFeature"; private final Context mContext; private final Fragment mFragment; private final int mMetricsCategory; private final View mAppHeader; + private final int mIconElevation; private Drawable mIcon; private CharSequence mLabel; @@ -93,6 +107,8 @@ public class AppHeaderController { mAppHeader = LayoutInflater.from(fragment.getContext()) .inflate(R.layout.app_details, null /* root */); } + mIconElevation = mContext.getResources() + .getDimensionPixelSize(R.dimen.launcher_icon_elevation); } public AppHeaderController setIcon(Drawable icon) { @@ -212,6 +228,13 @@ public class AppHeaderController { ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon); if (iconView != null) { iconView.setImageDrawable(mIcon); + if (mIcon instanceof AdaptiveIconDrawable) { + iconView.setElevation(mIconElevation); + iconView.setOutlineProvider(OUTLINE_PROVIDER); + } else { + iconView.setElevation(0); + iconView.setOutlineProvider(null); + } ImageView badgeView = mAppHeader.findViewById(R.id.app_icon_instant_apps_badge); if (badgeView != null) { badgeView.setVisibility(mIsInstantApp ? View.VISIBLE : View.GONE); diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 229e29458c5..0c284611944 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -23,6 +23,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; +import android.graphics.drawable.AdaptiveIconDrawable; import android.icu.text.AlphabeticIndex; import android.os.Bundle; import android.os.Environment; @@ -34,6 +35,7 @@ import android.preference.PreferenceFrameLayout; import android.support.annotation.VisibleForTesting; import android.text.TextUtils; import android.util.ArraySet; +import android.util.LauncherIcons; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -90,7 +92,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.List; import java.util.Locale; import java.util.Set; @@ -812,6 +813,8 @@ public class ManageApplications extends InstrumentedPreferenceFragment private final AppStateBaseBridge mExtraInfoBridge; private final Handler mBgHandler; private final Handler mFgHandler; + private final LauncherIcons mLauncherIcons; + private int mFilterMode; private ArrayList mBaseEntries; private ArrayList mEntries; @@ -866,6 +869,7 @@ public class ManageApplications extends InstrumentedPreferenceFragment mContext = manageApplications.getActivity(); mPm = mContext.getPackageManager(); mFilterMode = filterMode; + mLauncherIcons = new LauncherIcons(mContext); if (mManageApplications.mListType == LIST_TYPE_NOTIFICATION) { mExtraInfoBridge = new AppStateNotificationBridge(mContext, mState, this, manageApplications.mNotifBackend); @@ -1300,6 +1304,9 @@ public class ManageApplications extends InstrumentedPreferenceFragment } mState.ensureIcon(entry); if (entry.icon != null) { + if (entry.icon instanceof AdaptiveIconDrawable) { + entry.icon = mLauncherIcons.wrapIconDrawableWithShadow(entry.icon); + } holder.appIcon.setImageDrawable(entry.icon); } updateSummary(holder); diff --git a/tests/robotests/src/android/util/LauncherIcons.java b/tests/robotests/src/android/util/LauncherIcons.java new file mode 100644 index 00000000000..a18cfaed1db --- /dev/null +++ b/tests/robotests/src/android/util/LauncherIcons.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2017 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 android.util; + +import android.content.Context; +import android.graphics.drawable.Drawable; + +/** + * This class is only needed to get around RoboElectric issue. + */ +public final class LauncherIcons { + + public LauncherIcons(Context context) { + } + + public Drawable wrapIconDrawableWithShadow(Drawable drawable) { + return drawable; + } +}