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}