1c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang/* 2c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * Copyright (C) 2016 The Android Open Source Project 3c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * 4c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * you may not use this file except in compliance with the License. 6c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * You may obtain a copy of the License at 7c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * 8c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * http://www.apache.org/licenses/LICENSE-2.0 9c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * 10c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * Unless required by applicable law or agreed to in writing, software 11c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * See the License for the specific language governing permissions and 14c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang * limitations under the License. 15c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang */ 16c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 17d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangpackage com.android.settings.widget; 18c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.annotation.IdRes; 201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.annotation.UserIdInt; 21be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport android.app.ActionBar; 22be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport android.app.Activity; 23c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.app.Fragment; 24c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.Context; 25c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.Intent; 26c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.pm.PackageInfo; 27c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.pm.ResolveInfo; 28a006c6de81b3aa348ee0d94ae69283fb733dc183Fan Zhangimport android.graphics.drawable.ColorDrawable; 291ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.graphics.drawable.Drawable; 301ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.os.UserHandle; 31c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.support.annotation.IntDef; 32be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhangimport android.support.annotation.VisibleForTesting; 33841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport android.support.v7.widget.RecyclerView; 34c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.text.TextUtils; 35c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.util.Log; 361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.view.LayoutInflater; 37c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.view.View; 38c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.ImageButton; 39c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.ImageView; 40c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.TextView; 41be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 42c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.R; 43c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.Utils; 44d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.AppInfoBase; 45d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.InstalledAppDetails; 46d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.LayoutPreference; 47c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhangimport com.android.settings.overlay.FeatureFactory; 48c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settingslib.applications.ApplicationsState; 49841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport com.android.settingslib.core.lifecycle.Lifecycle; 50c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 51c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.Retention; 52c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.RetentionPolicy; 53c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 54a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhangimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent 55a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang .ACTION_OPEN_APP_NOTIFICATION_SETTING; 56a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhangimport static com.android.internal.logging.nano.MetricsProto.MetricsEvent.ACTION_OPEN_APP_SETTING; 57a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang 58f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhangpublic class EntityHeaderController { 59c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 601ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @IntDef({ActionType.ACTION_NONE, 61c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_APP_PREFERENCE, 62c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_NOTIF_PREFERENCE}) 63c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang @Retention(RetentionPolicy.SOURCE) 641ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public @interface ActionType { 651ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_NONE = 0; 6675bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang int ACTION_APP_PREFERENCE = 1; 6775bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang int ACTION_NOTIF_PREFERENCE = 2; 68c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 6980d1ec7deea2f4719f0cb1a6da053f52f007004cFan Zhang 70fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang public static final String PREF_KEY_APP_HEADER = "pref_app_header"; 713b172d7b8967759c82fad85fbcb40b06f42ba703Sunny Goyal 72c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private static final String TAG = "AppDetailFeature"; 73c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 74841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private final Context mAppContext; 75841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private final Activity mActivity; 761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private final Fragment mFragment; 77c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang private final int mMetricsCategory; 78f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private final View mHeader; 79841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private Lifecycle mLifecycle; 80841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private RecyclerView mRecyclerView; 811ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Drawable mIcon; 82ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent private String mIconContentDescription; 831ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mLabel; 841ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mSummary; 851ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private String mPackageName; 861ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Intent mAppNotifPrefIntent; 871ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @UserIdInt 881ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private int mUid = UserHandle.USER_NULL; 891ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 90f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private int mAction1; 911ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 92f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private int mAction2; 931ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 9475bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang private boolean mHasAppInfoLink; 9575bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang 96d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent private boolean mIsInstantApp; 97f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 98d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang /** 99d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * Creates a new instance of the controller. 100d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * 101d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * @param fragment The fragment that header will be placed in. 102d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * @param header Optional: header view if it's already created. 103d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang */ 104841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang public static EntityHeaderController newInstance(Activity activity, Fragment fragment, 105d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang View header) { 106841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang return new EntityHeaderController(activity, fragment, header); 107d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 108d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang 109841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private EntityHeaderController(Activity activity, Fragment fragment, View header) { 110841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mActivity = activity; 111841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mAppContext = activity.getApplicationContext(); 1121ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mFragment = fragment; 113841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mMetricsCategory = FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() 114c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang .getMetricsCategory(fragment); 115f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang if (header != null) { 116f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader = header; 1171ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 118f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader = LayoutInflater.from(fragment.getContext()) 1192ed0f99989bf51b10e2276565b6b62c36de17e62Fan Zhang .inflate(R.layout.settings_entity_header, null /* root */); 1201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1211ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1221ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 123841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang public EntityHeaderController setRecyclerView(RecyclerView recyclerView, Lifecycle lifecycle) { 124841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mRecyclerView = recyclerView; 125841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mLifecycle = lifecycle; 126841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang return this; 127841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang } 128841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang 129ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent /** 130ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent * Set the icon in the header. Callers should also consider calling setIconContentDescription 131ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent * to provide a description of this icon for accessibility purposes. 132ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent */ 133f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIcon(Drawable icon) { 1341ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (icon != null) { 135841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mIcon = icon.getConstantState().newDrawable(mAppContext.getResources()); 1361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1381ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1391ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 140ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent /** 141ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent * Convenience method to set the header icon from an ApplicationsState.AppEntry. Callers should 142ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent * also consider calling setIconContentDescription to provide a description of this icon for 143ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent * accessibility purposes. 144ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent */ 145f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIcon(ApplicationsState.AppEntry appEntry) { 1461ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (appEntry.icon != null) { 147841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mIcon = appEntry.icon.getConstantState().newDrawable(mAppContext.getResources()); 1481ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1491ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1501ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1511ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 152ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent public EntityHeaderController setIconContentDescription(String contentDescription) { 153ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent mIconContentDescription = contentDescription; 154ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent return this; 155ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent } 156ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent 157f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setLabel(CharSequence label) { 1581ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = label; 1591ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1601ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1611ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 162f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setLabel(ApplicationsState.AppEntry appEntry) { 1631ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = appEntry.label; 1641ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1651ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1661ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 167f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setSummary(CharSequence summary) { 1681ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = summary; 1691ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1701ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1711ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 172f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setSummary(PackageInfo packageInfo) { 1731ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (packageInfo != null) { 1741ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = packageInfo.versionName; 1751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1771ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1781ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 17975bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang public EntityHeaderController setHasAppInfoLink(boolean hasAppInfoLink) { 18075bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang mHasAppInfoLink = hasAppInfoLink; 18175bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang return this; 18275bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang } 18375bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang 184f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setButtonActions(@ActionType int action1, 185f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang @ActionType int action2) { 186f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mAction1 = action1; 187f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mAction2 = action2; 1881ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 189c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 190c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 191f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setPackageName(String packageName) { 1921ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mPackageName = packageName; 1931ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1941ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1951ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 196f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setUid(int uid) { 1971ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mUid = uid; 1981ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1991ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 2001ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 201f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setAppNotifPrefIntent(Intent appNotifPrefIntent) { 2021ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mAppNotifPrefIntent = appNotifPrefIntent; 2031ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 2041ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 2051ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 206f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIsInstantApp(boolean isInstantApp) { 207d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent this.mIsInstantApp = isInstantApp; 208f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent return this; 209f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 210f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 2111ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 21298289a887b7ed9201c3a74794225ead571ced28fFan Zhang * Done mutating entity header, rebinds everything and return a new {@link LayoutPreference}. 213fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang */ 214be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang public LayoutPreference done(Activity activity, Context uiContext) { 215be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang final LayoutPreference pref = new LayoutPreference(uiContext, done(activity)); 216fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang // Makes sure it's the first preference onscreen. 217fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setOrder(-1000); 2186d479d99a989e7d00860a1a86b51ad5f9dbe5fc6Fan Zhang pref.setSelectable(false); 219fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setKey(PREF_KEY_APP_HEADER); 220fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang return pref; 221fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang } 222fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang 223fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang /** 224f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang * Done mutating entity header, rebinds everything (optionally skip rebinding buttons). 2251ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 226be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang public View done(Activity activity, boolean rebindActions) { 227be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang styleActionBar(activity); 228f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang ImageView iconView = mHeader.findViewById(R.id.entity_header_icon); 2291ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (iconView != null) { 2301ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang iconView.setImageDrawable(mIcon); 231ff8e3e7bde9568972a867669a99974816062b6b0Antony Sargent iconView.setContentDescription(mIconContentDescription); 2321ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 233f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang setText(R.id.entity_header_title, mLabel); 234f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang setText(R.id.entity_header_summary, mSummary); 235d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent if (mIsInstantApp) { 236d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent setText(R.id.install_type, 237f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader.getResources().getString(R.string.install_type_instant)); 238f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 239f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 24015c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans if (rebindActions) { 241f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindHeaderButtons(); 24215c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans } 24315c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans 244f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang return mHeader; 245c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 246c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 2471ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 24898289a887b7ed9201c3a74794225ead571ced28fFan Zhang * Only binds entity header with button actions. 2491ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 250f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController bindHeaderButtons() { 25175bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang final View entityHeaderContent = mHeader.findViewById(R.id.entity_header_content); 25275bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang final ImageButton button1 = mHeader.findViewById(android.R.id.button1); 25375bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang final ImageButton button2 = mHeader.findViewById(android.R.id.button2); 25475bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang bindAppInfoLink(entityHeaderContent); 255f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindButton(button1, mAction1); 256f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindButton(button2, mAction2); 257be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 258be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 259be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 26075bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang private void bindAppInfoLink(View entityHeaderContent) { 26175bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang if (!mHasAppInfoLink) { 26275bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang // Caller didn't ask for app link, skip. 26375bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang return; 26475bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang } 26575bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang if (entityHeaderContent == null 26675bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang || mPackageName == null 26775bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang || mPackageName.equals(Utils.OS_PKG) 26875bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang || mUid == UserHandle.USER_NULL) { 26975bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang Log.w(TAG, "Missing ingredients to build app info link, skip"); 27075bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang return; 27175bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang } 27275bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang entityHeaderContent.setOnClickListener(new View.OnClickListener() { 27375bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang @Override 27475bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang public void onClick(View v) { 27575bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang AppInfoBase.startAppInfoFragment( 27675bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang InstalledAppDetails.class, R.string.application_info_label, 27775bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang mPackageName, mUid, mFragment, 0 /* request */, 27875bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang mMetricsCategory); 27975bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang 28075bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang } 28175bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang }); 28275bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang return; 28375bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang } 28475bee9bf98b7d52348978e09ad68b31170957c2eFan Zhang 285f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController styleActionBar(Activity activity) { 286be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang if (activity == null) { 287be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang Log.w(TAG, "No activity, cannot style actionbar."); 288be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 289be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 290be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang final ActionBar actionBar = activity.getActionBar(); 291be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang if (actionBar == null) { 292be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang Log.w(TAG, "No actionbar, cannot style actionbar."); 293be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 294be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 295a006c6de81b3aa348ee0d94ae69283fb733dc183Fan Zhang actionBar.setBackgroundDrawable( 296a006c6de81b3aa348ee0d94ae69283fb733dc183Fan Zhang new ColorDrawable(Utils.getColorAttr(activity, android.R.attr.colorSecondary))); 297be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang actionBar.setElevation(0); 298841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang if (mRecyclerView != null && mLifecycle != null) { 299841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); 300841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang } 301be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 302be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 303be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 304be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 305be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang /** 306f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang * Done mutating entity header, rebinds everything. 307be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang */ 308be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang @VisibleForTesting 309be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang View done(Activity activity) { 310be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return done(activity, true /* rebindActions */); 3111ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 3121ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 3131ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void bindButton(ImageButton button, @ActionType int action) { 314c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (button == null) { 315c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 316c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 317c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang switch (action) { 318c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_NOTIF_PREFERENCE: { 3191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (mAppNotifPrefIntent == null) { 3201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 3211ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 322d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang button.setOnClickListener(new View.OnClickListener() { 323d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang @Override 324d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang public void onClick(View v) { 325a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() 326a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang .actionWithSource(mAppContext, mMetricsCategory, 327a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang ACTION_OPEN_APP_NOTIFICATION_SETTING); 328d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mFragment.startActivity(mAppNotifPrefIntent); 329d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 330d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang }); 3311ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.VISIBLE); 3321ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 333c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 334c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 335c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_APP_PREFERENCE: { 336c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final Intent intent = resolveIntent( 3371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang new Intent(Intent.ACTION_APPLICATION_PREFERENCES).setPackage(mPackageName)); 338c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (intent == null) { 339a7b40995de90e41a6512ba5a8911af4e2cccdf6fDoris Ling button.setImageDrawable(null); 340c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 341c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 342c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 343d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang button.setOnClickListener(new View.OnClickListener() { 344d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang @Override 345d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang public void onClick(View v) { 346a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() 347a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang .actionWithSource(mAppContext, mMetricsCategory, 348a74337c627a456e51ce8ab95801b2ca0d7cda389Fan Zhang ACTION_OPEN_APP_SETTING); 349d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mFragment.startActivity(intent); 350d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 351d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang }); 352a7b40995de90e41a6512ba5a8911af4e2cccdf6fDoris Ling button.setImageResource(R.drawable.ic_settings_24dp); 353c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 354c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 355c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 3561ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang case ActionType.ACTION_NONE: { 3571ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 3581ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return; 3591ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 360c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 361c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 362c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 363c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private Intent resolveIntent(Intent i) { 364841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang ResolveInfo result = mAppContext.getPackageManager().resolveActivity(i, 0); 365c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (result != null) { 366c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return new Intent(i.getAction()) 367c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang .setClassName(result.activityInfo.packageName, result.activityInfo.name); 368c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 369c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return null; 370c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 3711ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 3721ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void setText(@IdRes int id, CharSequence text) { 373f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang TextView textView = mHeader.findViewById(id); 3741ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (textView != null) { 3751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setText(text); 3761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE); 3771ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 3781ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 37906304504cdd02f304c293a098aace7f93c5dcf49Hyunyoung Song} 380