summaryrefslogtreecommitdiff
path: root/src/com/android/settings/widget/EntityHeaderController.java
diff options
context:
space:
mode:
authorFan Zhang <zhfan@google.com>2017-05-18 11:28:21 -0700
committerFan Zhang <zhfan@google.com>2017-05-18 16:36:32 -0700
commitd7414259d03f00b08d2ad4bc223ff1d417c4c4a8 (patch)
tree0fd1ebb97f3ad7a582fd8145b90def8b65a916c0 /src/com/android/settings/widget/EntityHeaderController.java
parentf5bd885a1d0cd5e61aeb3d4a03261dea6548789a (diff)
Move entity header controller out of application package.
Bug: 37669238 Test: rerun robotests Change-Id: I54eb30f28fa0a88a6f0b97b53f9f1408320b5ce0
Diffstat (limited to 'src/com/android/settings/widget/EntityHeaderController.java')
-rw-r--r--src/com/android/settings/widget/EntityHeaderController.java329
1 files changed, 329 insertions, 0 deletions
diff --git a/src/com/android/settings/widget/EntityHeaderController.java b/src/com/android/settings/widget/EntityHeaderController.java
new file mode 100644
index 0000000000..d5231776f6
--- /dev/null
+++ b/src/com/android/settings/widget/EntityHeaderController.java
@@ -0,0 +1,329 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.widget;
+
+import android.annotation.IdRes;
+import android.annotation.UserIdInt;
+import android.app.ActionBar;
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.ResolveInfo;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.support.annotation.IntDef;
+import android.support.annotation.VisibleForTesting;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.settings.AppHeader;
+import com.android.settings.R;
+import com.android.settings.Utils;
+import com.android.settings.applications.AppInfoBase;
+import com.android.settings.applications.InstalledAppDetails;
+import com.android.settings.applications.LayoutPreference;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.applications.ApplicationsState;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+public class EntityHeaderController {
+
+ @IntDef({ActionType.ACTION_NONE,
+ ActionType.ACTION_APP_INFO,
+ ActionType.ACTION_APP_PREFERENCE,
+ ActionType.ACTION_NOTIF_PREFERENCE})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ActionType {
+ int ACTION_NONE = 0;
+ int ACTION_APP_INFO = 1;
+ int ACTION_APP_PREFERENCE = 2;
+ int ACTION_NOTIF_PREFERENCE = 3;
+ }
+
+ public static final String PREF_KEY_APP_HEADER = "pref_app_header";
+
+ private static final String TAG = "AppDetailFeature";
+
+ private final Context mContext;
+ private final Fragment mFragment;
+ private final int mMetricsCategory;
+ private final View mHeader;
+
+ private Drawable mIcon;
+ private CharSequence mLabel;
+ private CharSequence mSummary;
+ private String mPackageName;
+ private Intent mAppNotifPrefIntent;
+ @UserIdInt
+ private int mUid = UserHandle.USER_NULL;
+ @ActionType
+ private int mAction1;
+ @ActionType
+ private int mAction2;
+
+ private boolean mIsInstantApp;
+
+ /**
+ * Creates a new instance of the controller.
+ *
+ * @param fragment The fragment that header will be placed in.
+ * @param header Optional: header view if it's already created.
+ */
+ public static EntityHeaderController newInstance(Context context, Fragment fragment,
+ View header) {
+ return new EntityHeaderController(context.getApplicationContext(), fragment, header);
+ }
+
+ private EntityHeaderController(Context context, Fragment fragment, View header) {
+ mContext = context;
+ mFragment = fragment;
+ mMetricsCategory = FeatureFactory.getFactory(context).getMetricsFeatureProvider()
+ .getMetricsCategory(fragment);
+ if (header != null) {
+ mHeader = header;
+ } else {
+ mHeader = LayoutInflater.from(fragment.getContext())
+ .inflate(R.layout.settings_entity_header, null /* root */);
+ }
+ }
+
+ public EntityHeaderController setIcon(Drawable icon) {
+ if (icon != null) {
+ mIcon = icon.getConstantState().newDrawable(mContext.getResources());
+ }
+ return this;
+ }
+
+ public EntityHeaderController setIcon(ApplicationsState.AppEntry appEntry) {
+ if (appEntry.icon != null) {
+ mIcon = appEntry.icon.getConstantState().newDrawable(mContext.getResources());
+ }
+ return this;
+ }
+
+ public EntityHeaderController setLabel(CharSequence label) {
+ mLabel = label;
+ return this;
+ }
+
+ public EntityHeaderController setLabel(ApplicationsState.AppEntry appEntry) {
+ mLabel = appEntry.label;
+ return this;
+ }
+
+ public EntityHeaderController setSummary(CharSequence summary) {
+ mSummary = summary;
+ return this;
+ }
+
+ public EntityHeaderController setSummary(PackageInfo packageInfo) {
+ if (packageInfo != null) {
+ mSummary = packageInfo.versionName;
+ }
+ return this;
+ }
+
+ public EntityHeaderController setButtonActions(@ActionType int action1,
+ @ActionType int action2) {
+ mAction1 = action1;
+ mAction2 = action2;
+ return this;
+ }
+
+ public EntityHeaderController setPackageName(String packageName) {
+ mPackageName = packageName;
+ return this;
+ }
+
+ public EntityHeaderController setUid(int uid) {
+ mUid = uid;
+ return this;
+ }
+
+ public EntityHeaderController setAppNotifPrefIntent(Intent appNotifPrefIntent) {
+ mAppNotifPrefIntent = appNotifPrefIntent;
+ return this;
+ }
+
+ public EntityHeaderController setIsInstantApp(boolean isInstantApp) {
+ this.mIsInstantApp = isInstantApp;
+ return this;
+ }
+
+ /**
+ * Done mutating appheader, rebinds everything and return a new {@link LayoutPreference}.
+ */
+ public LayoutPreference done(Activity activity, Context uiContext) {
+ final LayoutPreference pref = new LayoutPreference(uiContext, done(activity));
+ // Makes sure it's the first preference onscreen.
+ pref.setOrder(-1000);
+ pref.setKey(PREF_KEY_APP_HEADER);
+ return pref;
+ }
+
+ /**
+ * Done mutating entity header, rebinds everything (optionally skip rebinding buttons).
+ */
+ public View done(Activity activity, boolean rebindActions) {
+ styleActionBar(activity);
+ ImageView iconView = mHeader.findViewById(R.id.entity_header_icon);
+ if (iconView != null) {
+ iconView.setImageDrawable(mIcon);
+ }
+ setText(R.id.entity_header_title, mLabel);
+ setText(R.id.entity_header_summary, mSummary);
+ if (mIsInstantApp) {
+ setText(R.id.install_type,
+ mHeader.getResources().getString(R.string.install_type_instant));
+ }
+
+ if (rebindActions) {
+ bindHeaderButtons();
+ }
+
+ return mHeader;
+ }
+
+ /**
+ * Only binds app header with button actions.
+ */
+ public EntityHeaderController bindHeaderButtons() {
+ ImageButton button1 = mHeader.findViewById(android.R.id.button1);
+ ImageButton button2 = mHeader.findViewById(android.R.id.button2);
+
+ bindButton(button1, mAction1);
+ bindButton(button2, mAction2);
+ return this;
+ }
+
+ public EntityHeaderController styleActionBar(Activity activity) {
+ if (activity == null) {
+ Log.w(TAG, "No activity, cannot style actionbar.");
+ return this;
+ }
+ final ActionBar actionBar = activity.getActionBar();
+ if (actionBar == null) {
+ Log.w(TAG, "No actionbar, cannot style actionbar.");
+ return this;
+ }
+ actionBar.setBackgroundDrawable(
+ new ColorDrawable(Utils.getColorAttr(activity, android.R.attr.colorSecondary)));
+ actionBar.setElevation(0);
+
+ return this;
+ }
+
+ /**
+ * Done mutating entity header, rebinds everything.
+ */
+ @VisibleForTesting
+ View done(Activity activity) {
+ return done(activity, true /* rebindActions */);
+ }
+
+ private void bindButton(ImageButton button, @ActionType int action) {
+ if (button == null) {
+ return;
+ }
+ switch (action) {
+ case ActionType.ACTION_APP_INFO: {
+ if (mPackageName == null || mPackageName.equals(Utils.OS_PKG)
+ || mUid == UserHandle.USER_NULL
+ || !AppHeader.includeAppInfo(mFragment)) {
+ button.setVisibility(View.GONE);
+ } else {
+ button.setContentDescription(
+ mContext.getString(R.string.application_info_label));
+ button.setImageResource(com.android.settings.R.drawable.ic_info);
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ AppInfoBase.startAppInfoFragment(
+ InstalledAppDetails.class, R.string.application_info_label,
+ mPackageName, mUid, mFragment, 0 /* request */,
+ mMetricsCategory);
+
+ }
+ });
+ button.setVisibility(View.VISIBLE);
+ }
+ return;
+ }
+ case ActionType.ACTION_NOTIF_PREFERENCE: {
+ if (mAppNotifPrefIntent == null) {
+ button.setVisibility(View.GONE);
+ } else {
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mFragment.startActivity(mAppNotifPrefIntent);
+ }
+ });
+ button.setVisibility(View.VISIBLE);
+ }
+ return;
+ }
+ case ActionType.ACTION_APP_PREFERENCE: {
+ final Intent intent = resolveIntent(
+ new Intent(Intent.ACTION_APPLICATION_PREFERENCES).setPackage(mPackageName));
+ if (intent == null) {
+ button.setVisibility(View.GONE);
+ return;
+ }
+ button.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ mFragment.startActivity(intent);
+ }
+ });
+ button.setVisibility(View.VISIBLE);
+ return;
+ }
+ case ActionType.ACTION_NONE: {
+ button.setVisibility(View.GONE);
+ return;
+ }
+ }
+ }
+
+ private Intent resolveIntent(Intent i) {
+ ResolveInfo result = mContext.getPackageManager().resolveActivity(i, 0);
+ if (result != null) {
+ return new Intent(i.getAction())
+ .setClassName(result.activityInfo.packageName, result.activityInfo.name);
+ }
+ return null;
+ }
+
+ private void setText(@IdRes int id, CharSequence text) {
+ TextView textView = mHeader.findViewById(id);
+ if (textView != null) {
+ textView.setText(text);
+ textView.setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);
+ }
+ }
+}