EntityHeaderController.java revision d06aaa8fd00321e938664a813c58a54118b5731f
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 17c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangpackage com.android.settings.applications; 18c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.annotation.IdRes; 201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.annotation.UserIdInt; 21c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.app.Fragment; 22c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.Context; 23c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.Intent; 24c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.pm.PackageInfo; 25c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.pm.ResolveInfo; 26c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.content.res.Resources; 271ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.graphics.drawable.Drawable; 281ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.os.UserHandle; 29c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.support.annotation.IntDef; 30c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.text.TextUtils; 31c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.util.Log; 321ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport android.view.LayoutInflater; 33c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.view.View; 34c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.ImageButton; 35c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.ImageView; 36c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport android.widget.TextView; 371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhangimport com.android.settings.AppHeader; 38c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.R; 39c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settings.Utils; 40c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhangimport com.android.settings.overlay.FeatureFactory; 41c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport com.android.settingslib.applications.ApplicationsState; 42c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 43c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.Retention; 44c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangimport java.lang.annotation.RetentionPolicy; 45c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 46c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhangpublic class AppHeaderController { 47c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 481ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @IntDef({ActionType.ACTION_NONE, 491ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang ActionType.ACTION_APP_INFO, 50c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_APP_PREFERENCE, 51c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_STORE_DEEP_LINK, 52c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ActionType.ACTION_NOTIF_PREFERENCE}) 53c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang @Retention(RetentionPolicy.SOURCE) 541ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public @interface ActionType { 551ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_NONE = 0; 561ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_APP_INFO = 1; 571ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_STORE_DEEP_LINK = 2; 581ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_APP_PREFERENCE = 3; 591ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang int ACTION_NOTIF_PREFERENCE = 4; 60c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 6180d1ec7deea2f4719f0cb1a6da053f52f007004cFan Zhang 62fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang public static final String PREF_KEY_APP_HEADER = "pref_app_header"; 63c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 64c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private static final String TAG = "AppDetailFeature"; 65c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 66c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private final Context mContext; 671ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private final Fragment mFragment; 68c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang private final int mMetricsCategory; 691ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private final View mAppHeader; 70c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 711ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Drawable mIcon; 721ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mLabel; 731ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private CharSequence mSummary; 741ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private String mPackageName; 751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private Intent mAppNotifPrefIntent; 761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @UserIdInt 771ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private int mUid = UserHandle.USER_NULL; 781ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 791ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private int mLeftAction; 801ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType 811ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private int mRightAction; 821ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 83d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent private boolean mIsInstantApp; 84f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 851ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController(Context context, Fragment fragment, View appHeader) { 86c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang mContext = context; 871ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mFragment = fragment; 88c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang mMetricsCategory = FeatureFactory.getFactory(context).getMetricsFeatureProvider() 89c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang .getMetricsCategory(fragment); 901ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (appHeader != null) { 911ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mAppHeader = appHeader; 921ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 931ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mAppHeader = LayoutInflater.from(mContext) 941ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang .inflate(R.layout.app_details, null /* root */); 951ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 961ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 971ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 981ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setIcon(Drawable icon) { 991ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (icon != null) { 1001ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mIcon = icon.getConstantState().newDrawable(mContext.getResources()); 1011ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1021ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1031ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1041ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1051ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setIcon(ApplicationsState.AppEntry appEntry) { 1061ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (appEntry.icon != null) { 1071ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mIcon = appEntry.icon.getConstantState().newDrawable(mContext.getResources()); 1081ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1091ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1101ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1111ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1121ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setLabel(CharSequence label) { 1131ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = label; 1141ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1151ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1161ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1171ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setLabel(ApplicationsState.AppEntry appEntry) { 1181ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLabel = appEntry.label; 1191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1211ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1221ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setSummary(CharSequence summary) { 1231ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = summary; 1241ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1251ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1261ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1271ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setSummary(PackageInfo packageInfo) { 1281ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (packageInfo != null) { 1291ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mSummary = packageInfo.versionName; 1301ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1311ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1321ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1331ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1341ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setButtonActions(@ActionType int leftAction, 1351ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang @ActionType int rightAction) { 1361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mLeftAction = leftAction; 1371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mRightAction = rightAction; 1381ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 139c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 140c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 1411ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setPackageName(String packageName) { 1421ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mPackageName = packageName; 1431ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1441ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1451ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1461ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setUid(int uid) { 1471ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mUid = uid; 1481ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1491ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1501ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 1511ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public AppHeaderController setAppNotifPrefIntent(Intent appNotifPrefIntent) { 1521ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang mAppNotifPrefIntent = appNotifPrefIntent; 1531ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return this; 1541ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 1551ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 156d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent public AppHeaderController setIsInstantApp(boolean isInstantApp) { 157d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent this.mIsInstantApp = isInstantApp; 158f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent return this; 159f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 160f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 1611ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 1621ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang * Binds app header view and data from {@code PackageInfo} and {@code AppEntry}. 1631ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 1641ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public void bindAppHeader(PackageInfo packageInfo, ApplicationsState.AppEntry appEntry) { 165c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final String versionName = packageInfo == null ? null : packageInfo.versionName; 1661ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang final Resources res = mAppHeader.getResources(); 167c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 168c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang // Set Icon 1692ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling final ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon); 170c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (appEntry.icon != null) { 171c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang iconView.setImageDrawable(appEntry.icon.getConstantState().newDrawable(res)); 172c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 173c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 174c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang // Set application name. 1752ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling final TextView labelView = (TextView) mAppHeader.findViewById(R.id.app_detail_title); 176c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang labelView.setText(appEntry.label); 177c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 178c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang // Version number of application 1792ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling final TextView appVersion = (TextView) mAppHeader.findViewById(R.id.app_detail_summary); 180c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 181c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (!TextUtils.isEmpty(versionName)) { 182c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang appVersion.setSelected(true); 183c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang appVersion.setVisibility(View.VISIBLE); 184c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang appVersion.setText(res.getString(R.string.version_text, String.valueOf(versionName))); 185c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } else { 186c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang appVersion.setVisibility(View.INVISIBLE); 187c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 188c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 189c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 1901ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 191fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang * Done mutating appheader, rebinds everything and return a new {@link LayoutPreference}. 192fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang */ 193fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang public LayoutPreference done(Context context) { 194fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang final LayoutPreference pref = new LayoutPreference(context, done()); 195fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang // Makes sure it's the first preference onscreen. 196fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setOrder(-1000); 197fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang pref.setKey(PREF_KEY_APP_HEADER); 198fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang return pref; 199fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang } 200fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang 201fdb833873ac323166533a13819b6e02f5ea83169Fan Zhang /** 2021ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang * Done mutating appheader, rebinds everything. 2031ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 2041ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public View done() { 2051ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return done(true); 2061ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 207c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 2081ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 2091ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang * Done mutating appheader, rebinds everything (optionally skip rebinding buttons). 2101ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 2111ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public View done(boolean rebindActions) { 2122ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling ImageView iconView = (ImageView) mAppHeader.findViewById(R.id.app_detail_icon); 2131ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (iconView != null) { 2141ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang iconView.setImageDrawable(mIcon); 2151ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 2162ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling setText(R.id.app_detail_title, mLabel); 2172ed09339d4fcc9d8464e68c3832e39c68562e883Doris Ling setText(R.id.app_detail_summary, mSummary); 2181ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (rebindActions) { 2191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang bindAppHeaderButtons(); 2201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 221f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 222d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent if (mIsInstantApp) { 223d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent setText(R.id.install_type, 224d06aaa8fd00321e938664a813c58a54118b5731fAntony Sargent mAppHeader.getResources().getString(R.string.install_type_instant)); 225f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent } 226f3ddd87c7ae702999107640289da177ee72a8b01Antony Sargent 2271ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return mAppHeader; 228c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 229c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 2301ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang /** 2311ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang * Only binds app header with button actions. 2321ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang */ 2331ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang public void bindAppHeaderButtons() { 2341ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang ImageButton leftButton = (ImageButton) mAppHeader.findViewById(R.id.left_button); 2351ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang ImageButton rightButton = (ImageButton) mAppHeader.findViewById(R.id.right_button); 2361ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 2371ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang bindButton(leftButton, mLeftAction); 2381ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang bindButton(rightButton, mRightAction); 2391ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 2401ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 2411ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void bindButton(ImageButton button, @ActionType int action) { 242c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (button == null) { 243c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 244c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 245c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang switch (action) { 246c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_APP_INFO: { 2471ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (mPackageName == null || mPackageName.equals(Utils.OS_PKG) 2481ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang || mUid == UserHandle.USER_NULL 2491ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang || !AppHeader.includeAppInfo(mFragment)) { 250c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 251c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } else { 252c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setImageResource(com.android.settings.R.drawable.ic_info); 2531ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setOnClickListener(v -> AppInfoBase.startAppInfoFragment( 2541ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang InstalledAppDetails.class, R.string.application_info_label, 255c6ca314c0b872f75926807ca7d6eb24ebe7cb684Fan Zhang mPackageName, mUid, mFragment, 0 /* request */, mMetricsCategory)); 256c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 257c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 258c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 259c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 260c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_STORE_DEEP_LINK: { 261c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final Intent intent = new Intent(Intent.ACTION_SHOW_APP_INFO) 2621ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang .setPackage(getInstallerPackageName(mContext, mPackageName)); 263c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final Intent result = resolveIntent(intent); 264c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (result == null) { 265c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 266c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } else { 2671ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang result.putExtra(Intent.EXTRA_PACKAGE_NAME, mPackageName); 268c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setImageResource(R.drawable.ic_sim_sd); 2691ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setOnClickListener(v -> mFragment.startActivity(intent)); 270c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 271c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 272c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 273c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 274c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_NOTIF_PREFERENCE: { 2751ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (mAppNotifPrefIntent == null) { 2761ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 2771ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } else { 2781ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setOnClickListener(v -> mFragment.startActivity(mAppNotifPrefIntent)); 2791ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.VISIBLE); 2801ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 281c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 282c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 283c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang case ActionType.ACTION_APP_PREFERENCE: { 284c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang final Intent intent = resolveIntent( 2851ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang new Intent(Intent.ACTION_APPLICATION_PREFERENCES).setPackage(mPackageName)); 286c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (intent == null) { 287c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.GONE); 288c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 289c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 2901ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setOnClickListener(v -> mFragment.startActivity(intent)); 291c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang button.setVisibility(View.VISIBLE); 292c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return; 293c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 2941ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang case ActionType.ACTION_NONE: { 2951ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang button.setVisibility(View.GONE); 2961ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang return; 2971ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 298c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 299c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 300c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 301c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private String getInstallerPackageName(Context context, String packageName) { 302c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang try { 303c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return context.getPackageManager().getInstallerPackageName(packageName); 304c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } catch (IllegalArgumentException e) { 305c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang Log.e(TAG, "Exception while retrieving the package installer of " + packageName, e); 306c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return null; 307c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 308c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 309c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang 310c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang private Intent resolveIntent(Intent i) { 311c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang ResolveInfo result = mContext.getPackageManager().resolveActivity(i, 0); 312c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang if (result != null) { 313c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return new Intent(i.getAction()) 314c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang .setClassName(result.activityInfo.packageName, result.activityInfo.name); 315c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 316c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang return null; 317c9536b8e4124e616f4cf9b2396b000a5355bf333Fan Zhang } 3181ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang 3191ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang private void setText(@IdRes int id, CharSequence text) { 3201ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang TextView textView = (TextView) mAppHeader.findViewById(id); 3211ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang if (textView != null) { 3221ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setText(text); 3231ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE); 3241ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 3251ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang } 3261ff25ba7e6b500123a715b48123e39f70e0c1842Fan Zhang}