diff options
author | Fan Zhang <zhfan@google.com> | 2017-05-18 11:28:21 -0700 |
---|---|---|
committer | Fan Zhang <zhfan@google.com> | 2017-05-18 16:36:32 -0700 |
commit | d7414259d03f00b08d2ad4bc223ff1d417c4c4a8 (patch) | |
tree | 0fd1ebb97f3ad7a582fd8145b90def8b65a916c0 /src/com/android/settings/widget/EntityHeaderController.java | |
parent | f5bd885a1d0cd5e61aeb3d4a03261dea6548789a (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.java | 329 |
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); + } + } +} |