EntityHeaderController.java revision 841d1d5aabc33024b2e03276085b0d1dbdb92b23
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 421ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport com.android.settings.AppHeader; 43c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.R; 44c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.Utils; 45d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.AppInfoBase; 46d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.InstalledAppDetails; 47d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhangimport com.android.settings.applications.LayoutPreference; 48c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhangimport com.android.settings.overlay.FeatureFactory; 49c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settingslib.applications.ApplicationsState; 50841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhangimport com.android.settingslib.core.lifecycle.Lifecycle; 51c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 52c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.Retention; 53c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.RetentionPolicy; 54c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 55f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhangpublic class EntityHeaderController { 56c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 571ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @IntDef({ActionType.ACTION_NONE, 581ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang ActionType.ACTION_APP_INFO, 59c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_APP_PREFERENCE, 60c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_NOTIF_PREFERENCE}) 61c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang @Retention(RetentionPolicy.SOURCE) 621ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public @interface ActionType { 631ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_NONE = 0; 641ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_APP_INFO = 1; 65dcc0af50c67cfdd1769977e2d97f0446da116e69Fan Zhang int ACTION_APP_PREFERENCE = 2; 66dcc0af50c67cfdd1769977e2d97f0446da116e69Fan Zhang int ACTION_NOTIF_PREFERENCE = 3; 67c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 6880d1ec7deea2f4719f0cb1a6da053f52f007004cFan Zhang 69fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang public static final String PREF_KEY_APP_HEADER = "pref_app_header"; 703b172d7b8967759c82fad85fbcb40b06f42ba703Sunny Goyal 71c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private static final String TAG = "AppDetailFeature"; 72c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 73841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private final Context mAppContext; 74841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private final Activity mActivity; 751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private final Fragment mFragment; 76c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang private final int mMetricsCategory; 77f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private final View mHeader; 78841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private Lifecycle mLifecycle; 79841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private RecyclerView mRecyclerView; 801ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Drawable mIcon; 811ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mLabel; 821ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mSummary; 831ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private String mPackageName; 841ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Intent mAppNotifPrefIntent; 851ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @UserIdInt 861ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private int mUid = UserHandle.USER_NULL; 871ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 88f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private int mAction1; 891ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 90f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang private int mAction2; 911ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 92d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent private boolean mIsInstantApp; 93f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 94d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang /** 95d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * Creates a new instance of the controller. 96d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * 97d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * @param fragment The fragment that header will be placed in. 98d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang * @param header Optional: header view if it's already created. 99d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang */ 100841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang public static EntityHeaderController newInstance(Activity activity, Fragment fragment, 101d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang View header) { 102841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang return new EntityHeaderController(activity, fragment, header); 103d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 104d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang 105841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang private EntityHeaderController(Activity activity, Fragment fragment, View header) { 106841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mActivity = activity; 107841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mAppContext = activity.getApplicationContext(); 1081ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mFragment = fragment; 109841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mMetricsCategory = FeatureFactory.getFactory(mAppContext).getMetricsFeatureProvider() 110c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang .getMetricsCategory(fragment); 111f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang if (header != null) { 112f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader = header; 1131ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 114f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader = LayoutInflater.from(fragment.getContext()) 1152ed0f99989bf51b10e2276565b6b62c36de17e62Fan Zhang .inflate(R.layout.settings_entity_header, null /* root */); 1161ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1171ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1181ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 119841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang public EntityHeaderController setRecyclerView(RecyclerView recyclerView, Lifecycle lifecycle) { 120841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mRecyclerView = recyclerView; 121841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mLifecycle = lifecycle; 122841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang return this; 123841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang } 124841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang 125f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIcon(Drawable icon) { 1261ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (icon != null) { 127841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mIcon = icon.getConstantState().newDrawable(mAppContext.getResources()); 1281ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1291ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1301ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1311ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 132f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIcon(ApplicationsState.AppEntry appEntry) { 1331ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (appEntry.icon != null) { 134841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mIcon = appEntry.icon.getConstantState().newDrawable(mAppContext.getResources()); 1351ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1381ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 139f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setLabel(CharSequence label) { 1401ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = label; 1411ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1421ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1431ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 144f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setLabel(ApplicationsState.AppEntry appEntry) { 1451ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = appEntry.label; 1461ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1471ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1481ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 149f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setSummary(CharSequence summary) { 1501ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = summary; 1511ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1521ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1531ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 154f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setSummary(PackageInfo packageInfo) { 1551ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (packageInfo != null) { 1561ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = packageInfo.versionName; 1571ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1581ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1591ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1601ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 161f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setButtonActions(@ActionType int action1, 162f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang @ActionType int action2) { 163f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mAction1 = action1; 164f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mAction2 = action2; 1651ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 166c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 167c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 168f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setPackageName(String packageName) { 1691ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mPackageName = packageName; 1701ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1711ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1721ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 173f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setUid(int uid) { 1741ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mUid = uid; 1751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1771ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 178f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setAppNotifPrefIntent(Intent appNotifPrefIntent) { 1791ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mAppNotifPrefIntent = appNotifPrefIntent; 1801ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1811ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1821ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 183f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController setIsInstantApp(boolean isInstantApp) { 184d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent this.mIsInstantApp = isInstantApp; 185f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent return this; 186f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 187f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 1881ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 18998289a887b7ed9201c3a74794225ead571ced28fFan Zhang * Done mutating entity header, rebinds everything and return a new {@link LayoutPreference}. 190fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang */ 191be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang public LayoutPreference done(Activity activity, Context uiContext) { 192be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang final LayoutPreference pref = new LayoutPreference(uiContext, done(activity)); 193fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang // Makes sure it's the first preference onscreen. 194fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setOrder(-1000); 195fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setKey(PREF_KEY_APP_HEADER); 196fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang return pref; 197fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang } 198fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang 199fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang /** 200f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang * Done mutating entity header, rebinds everything (optionally skip rebinding buttons). 2011ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 202be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang public View done(Activity activity, boolean rebindActions) { 203be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang styleActionBar(activity); 204f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang ImageView iconView = mHeader.findViewById(R.id.entity_header_icon); 2051ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (iconView != null) { 2061ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang iconView.setImageDrawable(mIcon); 2071ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 208f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang setText(R.id.entity_header_title, mLabel); 209f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang setText(R.id.entity_header_summary, mSummary); 210d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent if (mIsInstantApp) { 211d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent setText(R.id.install_type, 212f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang mHeader.getResources().getString(R.string.install_type_instant)); 213f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 214f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 21515c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans if (rebindActions) { 216f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindHeaderButtons(); 21715c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans } 21815c7f5fda4d09eb7eece01a111877c90f9eb3dc2Jesse Evans 219f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang return mHeader; 220c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 221c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 2221ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 22398289a887b7ed9201c3a74794225ead571ced28fFan Zhang * Only binds entity header with button actions. 2241ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 225f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController bindHeaderButtons() { 226f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang ImageButton button1 = mHeader.findViewById(android.R.id.button1); 227f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang ImageButton button2 = mHeader.findViewById(android.R.id.button2); 2281ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 229f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindButton(button1, mAction1); 230f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang bindButton(button2, mAction2); 231be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 232be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 233be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 234f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang public EntityHeaderController styleActionBar(Activity activity) { 235be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang if (activity == null) { 236be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang Log.w(TAG, "No activity, cannot style actionbar."); 237be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 238be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 239be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang final ActionBar actionBar = activity.getActionBar(); 240be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang if (actionBar == null) { 241be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang Log.w(TAG, "No actionbar, cannot style actionbar."); 242be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 243be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 244a006c6de81b3aa348ee0d94ae69283fb733dc183Fan Zhang actionBar.setBackgroundDrawable( 245a006c6de81b3aa348ee0d94ae69283fb733dc183Fan Zhang new ColorDrawable(Utils.getColorAttr(activity, android.R.attr.colorSecondary))); 246be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang actionBar.setElevation(0); 247841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang if (mRecyclerView != null && mLifecycle != null) { 248841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang ActionBarShadowController.attachToRecyclerView(mActivity, mLifecycle, mRecyclerView); 249841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang } 250be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 251be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return this; 252be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang } 253be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang 254be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang /** 255f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang * Done mutating entity header, rebinds everything. 256be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang */ 257be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang @VisibleForTesting 258be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang View done(Activity activity) { 259be6fab0135d785b18996e20c1be2eb49e7934881Fan Zhang return done(activity, true /* rebindActions */); 2601ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 2611ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 2621ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void bindButton(ImageButton button, @ActionType int action) { 263c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (button == null) { 264c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 265c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 266c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang switch (action) { 267c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_APP_INFO: { 2681ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (mPackageName == null || mPackageName.equals(Utils.OS_PKG) 2691ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang || mUid == UserHandle.USER_NULL 2701ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang || !AppHeader.includeAppInfo(mFragment)) { 271c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 272c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } else { 27393e08ebf80556ad245c2a6c40c0bdc645297fcf4Daniel Nishi button.setContentDescription( 274841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang mAppContext.getString(R.string.application_info_label)); 275c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setImageResource(com.android.settings.R.drawable.ic_info); 276d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang button.setOnClickListener(new View.OnClickListener() { 277d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang @Override 278d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang public void onClick(View v) { 279d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang AppInfoBase.startAppInfoFragment( 280d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang InstalledAppDetails.class, R.string.application_info_label, 281d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mPackageName, mUid, mFragment, 0 /* request */, 282d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mMetricsCategory); 283d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang 284d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 285d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang }); 286c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 287c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 288c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 289c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 290c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_NOTIF_PREFERENCE: { 2911ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (mAppNotifPrefIntent == null) { 2921ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 2931ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 294d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang button.setOnClickListener(new View.OnClickListener() { 295d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang @Override 296d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang public void onClick(View v) { 297d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mFragment.startActivity(mAppNotifPrefIntent); 298d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 299d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang }); 3001ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.VISIBLE); 3011ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 302c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 303c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 304c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_APP_PREFERENCE: { 305c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final Intent intent = resolveIntent( 3061ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang new Intent(Intent.ACTION_APPLICATION_PREFERENCES).setPackage(mPackageName)); 307c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (intent == null) { 308c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 309c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 310c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 311d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang button.setOnClickListener(new View.OnClickListener() { 312d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang @Override 313d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang public void onClick(View v) { 314d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang mFragment.startActivity(intent); 315d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang } 316d7414259d03f00b08d2ad4bc223ff1d417c4c4a8Fan Zhang }); 317c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 318c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 319c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 3201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang case ActionType.ACTION_NONE: { 3211ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 3221ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return; 3231ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 324c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 325c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 326c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 327c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private Intent resolveIntent(Intent i) { 328841d1d5aabc33024b2e03276085b0d1dbdb92b23Fan Zhang ResolveInfo result = mAppContext.getPackageManager().resolveActivity(i, 0); 329c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (result != null) { 330c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return new Intent(i.getAction()) 331c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang .setClassName(result.activityInfo.packageName, result.activityInfo.name); 332c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 333c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return null; 334c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 3351ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 3361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void setText(@IdRes int id, CharSequence text) { 337f5bd885a1d0cd5e61aeb3d4a03261dea6548789aFan Zhang TextView textView = mHeader.findViewById(id); 3381ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (textView != null) { 3391ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setText(text); 3401ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE); 3411ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 3421ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 34306304504cdd02f304c293a098aace7f93c5dcf49Hyunyoung Song} 344