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.text.TextUtils; 23 import android.util.Log; 24 import android.view.LayoutInflater; 25 import android.view.View; 26 import android.view.ViewGroup; 27 import android.widget.ImageView; 28 import android.widget.Switch; 29 import android.widget.TextView; 30 31 import androidx.annotation.StringRes; 32 import androidx.annotation.VisibleForTesting; 33 import androidx.recyclerview.widget.RecyclerView; 34 35 import com.android.settings.R; 36 import com.android.settingslib.applications.ApplicationsState; 37 import com.android.settingslib.applications.ApplicationsState.AppEntry; 38 39 public class ApplicationViewHolder extends RecyclerView.ViewHolder { 40 41 @VisibleForTesting 42 final TextView mAppName; 43 @VisibleForTesting 44 final TextView mSummary; 45 @VisibleForTesting 46 final TextView mDisabled; 47 @VisibleForTesting 48 final ViewGroup mWidgetContainer; 49 @VisibleForTesting 50 final Switch mSwitch; 51 52 private final ImageView mAppIcon; 53 ApplicationViewHolder(View itemView)54 ApplicationViewHolder(View itemView) { 55 super(itemView); 56 mAppName = itemView.findViewById(android.R.id.title); 57 mAppIcon = itemView.findViewById(android.R.id.icon); 58 mSummary = itemView.findViewById(android.R.id.summary); 59 mDisabled = itemView.findViewById(R.id.appendix); 60 mSwitch = itemView.findViewById(R.id.switchWidget); 61 mWidgetContainer = itemView.findViewById(android.R.id.widget_frame); 62 } 63 newView(ViewGroup parent)64 static View newView(ViewGroup parent) { 65 return newView(parent, false /* twoTarget */); 66 } 67 newView(ViewGroup parent, boolean twoTarget)68 static View newView(ViewGroup parent, boolean twoTarget) { 69 ViewGroup view = (ViewGroup) LayoutInflater.from(parent.getContext()) 70 .inflate(R.layout.preference_app, parent, false); 71 final ViewGroup widgetFrame = view.findViewById(android.R.id.widget_frame); 72 if (twoTarget) { 73 if (widgetFrame != null) { 74 LayoutInflater.from(parent.getContext()) 75 .inflate(R.layout.preference_widget_primary_switch, widgetFrame, true); 76 77 View divider = LayoutInflater.from(parent.getContext()).inflate( 78 R.layout.preference_two_target_divider, view, false); 79 // second to last, before widget frame 80 view.addView(divider, view.getChildCount() - 1); 81 } 82 } else if (widgetFrame != null) { 83 widgetFrame.setVisibility(View.GONE); 84 } 85 return view; 86 } 87 setSummary(CharSequence summary)88 void setSummary(CharSequence summary) { 89 mSummary.setText(summary); 90 } 91 setSummary(@tringRes int summary)92 void setSummary(@StringRes int summary) { 93 mSummary.setText(summary); 94 } 95 setEnabled(boolean isEnabled)96 void setEnabled(boolean isEnabled) { 97 itemView.setEnabled(isEnabled); 98 } 99 setTitle(CharSequence title, CharSequence contentDescription)100 void setTitle(CharSequence title, CharSequence contentDescription) { 101 if (title == null) { 102 return; 103 } 104 mAppName.setText(title); 105 106 if (TextUtils.isEmpty(contentDescription)) { 107 return; 108 } 109 mAppName.setContentDescription(contentDescription); 110 } 111 setIcon(int drawableRes)112 void setIcon(int drawableRes) { 113 mAppIcon.setImageResource(drawableRes); 114 } 115 setIcon(Drawable icon)116 void setIcon(Drawable icon) { 117 if (icon == null) { 118 return; 119 } 120 mAppIcon.setImageDrawable(icon); 121 } 122 updateDisableView(ApplicationInfo info)123 void updateDisableView(ApplicationInfo info) { 124 if ((info.flags & ApplicationInfo.FLAG_INSTALLED) == 0) { 125 mDisabled.setVisibility(View.VISIBLE); 126 mDisabled.setText(R.string.not_installed); 127 } else if (!info.enabled || info.enabledSetting 128 == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) { 129 mDisabled.setVisibility(View.VISIBLE); 130 mDisabled.setText(R.string.disabled); 131 } else { 132 mDisabled.setVisibility(View.GONE); 133 } 134 } 135 updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize)136 void updateSizeText(AppEntry entry, CharSequence invalidSizeStr, int whichSize) { 137 if (ManageApplications.DEBUG) { 138 Log.d(ManageApplications.TAG, "updateSizeText of " 139 + entry.label + " " + entry + ": " + entry.sizeStr); 140 } 141 if (entry.sizeStr != null) { 142 switch (whichSize) { 143 case ManageApplications.SIZE_INTERNAL: 144 setSummary(entry.internalSizeStr); 145 break; 146 case ManageApplications.SIZE_EXTERNAL: 147 setSummary(entry.externalSizeStr); 148 break; 149 default: 150 setSummary(entry.sizeStr); 151 break; 152 } 153 } else if (entry.size == ApplicationsState.SIZE_INVALID) { 154 setSummary(invalidSizeStr); 155 } 156 } 157 updateSwitch(Switch.OnCheckedChangeListener listener, boolean enabled, boolean checked)158 void updateSwitch(Switch.OnCheckedChangeListener listener, boolean enabled, boolean checked) { 159 if (mSwitch != null && mWidgetContainer != null) { 160 mWidgetContainer.setFocusable(false); 161 mWidgetContainer.setClickable(false); 162 mSwitch.setFocusable(true); 163 mSwitch.setClickable(true); 164 mSwitch.setOnCheckedChangeListener(listener); 165 mSwitch.setChecked(checked); 166 mSwitch.setEnabled(enabled); 167 } 168 } 169 } 170