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