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 package com.android.settings.dashboard.conditional; 17 18 import android.content.Context; 19 import android.support.annotation.VisibleForTesting; 20 import android.support.v7.widget.RecyclerView; 21 import android.support.v7.widget.helper.ItemTouchHelper; 22 import android.util.Log; 23 import android.view.LayoutInflater; 24 import android.view.View; 25 import android.view.ViewGroup; 26 import android.widget.Button; 27 28 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 29 import com.android.settings.R; 30 import com.android.settings.dashboard.DashboardAdapter.DashboardItemHolder; 31 import com.android.settings.overlay.FeatureFactory; 32 import com.android.settingslib.WirelessUtils; 33 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; 34 35 import java.util.List; 36 import java.util.Objects; 37 38 public class ConditionAdapter extends RecyclerView.Adapter<DashboardItemHolder> { 39 public static final String TAG = "ConditionAdapter"; 40 41 private final Context mContext; 42 private final MetricsFeatureProvider mMetricsFeatureProvider; 43 private List<Condition> mConditions; 44 private boolean mExpanded; 45 46 private View.OnClickListener mConditionClickListener = new View.OnClickListener() { 47 48 @Override 49 public void onClick(View v) { 50 //TODO: get rid of setTag/getTag 51 Condition condition = (Condition) v.getTag(); 52 mMetricsFeatureProvider.action(mContext, 53 MetricsEvent.ACTION_SETTINGS_CONDITION_CLICK, 54 condition.getMetricsConstant()); 55 condition.onPrimaryClick(); 56 } 57 }; 58 59 @VisibleForTesting 60 ItemTouchHelper.SimpleCallback mSwipeCallback = new ItemTouchHelper.SimpleCallback(0, 61 ItemTouchHelper.START | ItemTouchHelper.END) { 62 @Override 63 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 64 RecyclerView.ViewHolder target) { 65 return true; 66 } 67 68 @Override 69 public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 70 return viewHolder.getItemViewType() == R.layout.condition_tile 71 ? super.getSwipeDirs(recyclerView, viewHolder) : 0; 72 } 73 74 @Override 75 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 76 Object item = getItem(viewHolder.getItemId()); 77 // item can become null when running monkey 78 if (item != null) { 79 ((Condition) item).silence(); 80 } 81 } 82 }; 83 ConditionAdapter(Context context, List<Condition> conditions, boolean expanded)84 public ConditionAdapter(Context context, List<Condition> conditions, boolean expanded) { 85 mContext = context; 86 mConditions = conditions; 87 mExpanded = expanded; 88 mMetricsFeatureProvider = FeatureFactory.getFactory(context).getMetricsFeatureProvider(); 89 90 setHasStableIds(true); 91 } 92 getItem(long itemId)93 public Object getItem(long itemId) { 94 for (Condition condition : mConditions) { 95 if (Objects.hash(condition.getTitle()) == itemId) { 96 return condition; 97 } 98 } 99 return null; 100 } 101 102 @Override onCreateViewHolder(ViewGroup parent, int viewType)103 public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) { 104 return new DashboardItemHolder(LayoutInflater.from(parent.getContext()).inflate( 105 viewType, parent, false)); 106 } 107 108 @Override onBindViewHolder(DashboardItemHolder holder, int position)109 public void onBindViewHolder(DashboardItemHolder holder, int position) { 110 bindViews(mConditions.get(position), holder, 111 position == mConditions.size() - 1, mConditionClickListener); 112 } 113 114 @Override getItemId(int position)115 public long getItemId(int position) { 116 return Objects.hash(mConditions.get(position).getTitle()); 117 } 118 119 @Override getItemViewType(int position)120 public int getItemViewType(int position) { 121 return R.layout.condition_tile; 122 } 123 124 @Override getItemCount()125 public int getItemCount() { 126 if (mExpanded) { 127 return mConditions.size(); 128 } 129 return 0; 130 } 131 addDismissHandling(final RecyclerView recyclerView)132 public void addDismissHandling(final RecyclerView recyclerView) { 133 final ItemTouchHelper itemTouchHelper = new ItemTouchHelper(mSwipeCallback); 134 itemTouchHelper.attachToRecyclerView(recyclerView); 135 } 136 bindViews(final Condition condition, DashboardItemHolder view, boolean isLastItem, View.OnClickListener onClickListener)137 private void bindViews(final Condition condition, 138 DashboardItemHolder view, boolean isLastItem, 139 View.OnClickListener onClickListener) { 140 if (condition instanceof AirplaneModeCondition) { 141 Log.d(TAG, "Airplane mode condition has been bound with " 142 + "isActive=" + condition.isActive() + ". Airplane mode is currently " + 143 WirelessUtils.isAirplaneModeOn(condition.mManager.getContext())); 144 } 145 View card = view.itemView.findViewById(R.id.content); 146 card.setTag(condition); 147 card.setOnClickListener(onClickListener); 148 view.icon.setImageDrawable(condition.getIcon()); 149 view.title.setText(condition.getTitle()); 150 151 CharSequence[] actions = condition.getActions(); 152 final boolean hasButtons = actions.length > 0; 153 setViewVisibility(view.itemView, R.id.buttonBar, hasButtons); 154 155 view.summary.setText(condition.getSummary()); 156 for (int i = 0; i < 2; i++) { 157 Button button = (Button) view.itemView.findViewById(i == 0 158 ? R.id.first_action : R.id.second_action); 159 if (actions.length > i) { 160 button.setVisibility(View.VISIBLE); 161 button.setText(actions[i]); 162 final int index = i; 163 button.setOnClickListener(new View.OnClickListener() { 164 @Override 165 public void onClick(View v) { 166 Context context = v.getContext(); 167 FeatureFactory.getFactory(context).getMetricsFeatureProvider() 168 .action(context, MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON, 169 condition.getMetricsConstant()); 170 condition.onActionClick(index); 171 } 172 }); 173 } else { 174 button.setVisibility(View.GONE); 175 } 176 } 177 setViewVisibility(view.itemView, R.id.divider, !isLastItem); 178 } 179 setViewVisibility(View containerView, int viewId, boolean visible)180 private void setViewVisibility(View containerView, int viewId, boolean visible) { 181 View view = containerView.findViewById(viewId); 182 if (view != null) { 183 view.setVisibility(visible ? View.VISIBLE : View.GONE); 184 } 185 } 186 } 187