1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.applications.manageapplications; 18 19 import android.content.pm.ApplicationInfo; 20 import android.content.pm.PackageManager; 21 import android.graphics.drawable.Drawable; 22 import android.support.annotation.StringRes; 23 import android.support.annotation.VisibleForTesting; 24 import android.support.v7.widget.RecyclerView; 25 import android.text.TextUtils; 26 import android.util.Log; 27 import android.view.LayoutInflater; 28 import android.view.View; 29 import android.view.ViewGroup; 30 import android.widget.ImageView; 31 import android.widget.Switch; 32 import android.widget.TextView; 33 34 import com.android.settings.R; 35 import com.android.settingslib.applications.ApplicationsState; 36 import com.android.settingslib.applications.ApplicationsState.AppEntry; 37 38 public class ApplicationViewHolder extends RecyclerView.ViewHolder { 39 40 private final TextView mAppName; 41 private final ImageView mAppIcon; 42 43 private final boolean mKeepStableHeight; 44 45 @VisibleForTesting 46 View mSummaryContainer; 47 @VisibleForTesting 48 final TextView mSummary; 49 @VisibleForTesting 50 final TextView mDisabled; 51 @VisibleForTesting 52 final ViewGroup mWidgetContainer; 53 @VisibleForTesting 54 final Switch mSwitch; 55 56 ApplicationViewHolder(View itemView, boolean keepStableHeight) { 57 super(itemView); 58 mAppName = itemView.findViewById(android.R.id.title); 59 mAppIcon = itemView.findViewById(android.R.id.icon); 60 mSummaryContainer = itemView.findViewById(R.id.summary_container); 61 mSummary = itemView.findViewById(android.R.id.summary); 62 mDisabled = itemView.findViewById(R.id.appendix); 63 mKeepStableHeight = keepStableHeight; 64 mSwitch = itemView.findViewById(R.id.switchWidget); 65 mWidgetContainer = itemView.findViewById(android.R.id.widget_frame); 66 } 67 68 static View newView(ViewGroup parent) { 69 return newView(parent, false); 70 } 71 72 static View newView(ViewGroup parent, boolean twoTarget) { 73 ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()) 74 .inflate(R.layout.preference_app, parent, false); 75 if (twoTarget) { 76 final ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame); 77 if (widgetFrame != null) { 78 LayoutInflater.from(parent.getContext()) 79 .inflate(R.layout.preference_widget_master_switch, widgetFrame, true); 80 81 View divider = LayoutInflater.from(parent.getContext()).inflate( 82 R.layout.preference_two_target_divider, view, false); 83 // second to last, before widget frame 84 view.addView(divider, view.getChildCount() - 1); 85 } 86 } 87 return view; 88 } 89 90 void setSummary(CharSequence summary) { 91 mSummary.setText(summary); 92 updateSummaryContainer(); 93 } 94 95 void setSummary(@StringRes int summary) { 96 mSummary.setText(summary); 97 updateSummaryContainer(); 98 } 99 100 void setEnabled(boolean isEnabled) { 101 itemView.setEnabled(isEnabled); 102 } 103 104 void setTitle(CharSequence title) { 105 if (title == null) { 106 return; 107 } 108 mAppName.setText(title); 109 } 110 111 void setIcon(int drawableRes) { 112 mAppIcon.setImageResource(drawableRes); 113 } 114 115 void setIcon(Drawable icon) { 116 if (icon == null) { 117 return; 118 } 119 mAppIcon.setImageDrawable(icon); 120 } 121 122 void updateDisableView(ApplicationInfo info) { 123 if ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 124 mDisabled.setVisibility(View.VISIBLE); 125 mDisabled.setText(R.string.not_installed); 126 } else if (!info.enabled || info.enabledSetting 127 == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { 128 mDisabled.setVisibility(View.VISIBLE); 129 mDisabled.setText(R.string.disabled); 130 } else { 131 mDisabled.setVisibility(View.GONE); 132 } 133 updateSummaryContainer(); 134 } 135 136 void updateSummaryContainer() { 137 if (mKeepStableHeight) { 138 mSummaryContainer.setVisibility(View.VISIBLE); 139 return; 140 } 141 final boolean hasContent = 142 !TextUtils.isEmpty(mDisabled.getText()) || !TextUtils.isEmpty(mSummary.getText()); 143 mSummaryContainer.setVisibility(hasContent ? View.VISIBLE : View.GONE); 144 } 145 146 void updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize) { 147 if (ManageApplications.DEBUG) { 148 Log.d(ManageApplications.TAG, "updateSizeText of " 149 + entry.label + " " + entry + ": " + entry.sizeStr); 150 } 151 if (entry.sizeStr != null) { 152 switch (whichSize) { 153 case ManageApplications.SIZE_INTERNAL: 154 setSummary(entry.internalSizeStr); 155 break; 156 case ManageApplications.SIZE_EXTERNAL: 157 setSummary(entry.externalSizeStr); 158 break; 159 default: 160 setSummary(entry.sizeStr); 161 break; 162 } 163 } else if (entry.size == ApplicationsState.SIZE_INVALID) { 164 setSummary(invalidSizeStr); 165 } 166 } 167 168 void updateSwitch(View.OnClickListener listener, boolean enabled, boolean checked) { 169 if (mSwitch != null && mWidgetContainer != null) { 170 mWidgetContainer.setOnClickListener(listener); 171 mSwitch.setChecked(checked); 172 mSwitch.setEnabled(enabled); 173 } 174 } 175 } 176