1 /* 2 * Copyright (C) 2015 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.animation.Animator; 19 import android.animation.AnimatorListenerAdapter; 20 import android.animation.ObjectAnimator; 21 import android.support.v7.widget.RecyclerView; 22 import android.support.v7.widget.helper.ItemTouchHelper; 23 import android.view.View; 24 import android.view.View.OnLayoutChangeListener; 25 import android.view.ViewGroup.LayoutParams; 26 import android.widget.Button; 27 import android.widget.ImageView; 28 import com.android.internal.logging.MetricsLogger; 29 import com.android.internal.logging.MetricsProto.MetricsEvent; 30 import com.android.settings.R; 31 import com.android.settings.dashboard.DashboardAdapter; 32 33 public class ConditionAdapterUtils { 34 addDismiss(final RecyclerView recyclerView)35 public static void addDismiss(final RecyclerView recyclerView) { 36 ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, 37 ItemTouchHelper.START | ItemTouchHelper.END) { 38 @Override 39 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, 40 RecyclerView.ViewHolder target) { 41 return true; 42 } 43 44 @Override 45 public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { 46 return viewHolder.getItemViewType() == R.layout.condition_card 47 ? super.getSwipeDirs(recyclerView, viewHolder) : 0; 48 } 49 50 @Override 51 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { 52 DashboardAdapter adapter = (DashboardAdapter) recyclerView.getAdapter(); 53 Object item = adapter.getItem(viewHolder.getItemId()); 54 if (item instanceof Condition) { 55 ((Condition) item).silence(); 56 } 57 } 58 }; 59 ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); 60 itemTouchHelper.attachToRecyclerView(recyclerView); 61 } 62 bindViews(final Condition condition, DashboardAdapter.DashboardItemHolder view, boolean isExpanded, View.OnClickListener onClickListener, View.OnClickListener onExpandListener)63 public static void bindViews(final Condition condition, 64 DashboardAdapter.DashboardItemHolder view, boolean isExpanded, 65 View.OnClickListener onClickListener, View.OnClickListener onExpandListener) { 66 View card = view.itemView.findViewById(R.id.content); 67 card.setTag(condition); 68 card.setOnClickListener(onClickListener); 69 view.icon.setImageIcon(condition.getIcon()); 70 view.title.setText(condition.getTitle()); 71 ImageView expand = (ImageView) view.itemView.findViewById(R.id.expand_indicator); 72 expand.setTag(condition); 73 expand.setImageResource(isExpanded ? R.drawable.ic_expand_less : R.drawable.ic_expand_more); 74 expand.setContentDescription(expand.getContext().getString(isExpanded 75 ? R.string.condition_expand_hide : R.string.condition_expand_show)); 76 expand.setOnClickListener(onExpandListener); 77 78 View detailGroup = view.itemView.findViewById(R.id.detail_group); 79 CharSequence[] actions = condition.getActions(); 80 if (isExpanded != (detailGroup.getVisibility() == View.VISIBLE)) { 81 animateChange(view.itemView, view.itemView.findViewById(R.id.content), 82 detailGroup, isExpanded, actions.length > 0); 83 } 84 if (isExpanded) { 85 view.summary.setText(condition.getSummary()); 86 for (int i = 0; i < 2; i++) { 87 Button button = (Button) detailGroup.findViewById(i == 0 88 ? R.id.first_action : R.id.second_action); 89 if (actions.length > i) { 90 button.setVisibility(View.VISIBLE); 91 button.setText(actions[i]); 92 final int index = i; 93 button.setOnClickListener(new View.OnClickListener() { 94 @Override 95 public void onClick(View v) { 96 MetricsLogger.action(v.getContext(), 97 MetricsEvent.ACTION_SETTINGS_CONDITION_BUTTON, 98 condition.getMetricsConstant()); 99 condition.onActionClick(index); 100 } 101 }); 102 } else { 103 button.setVisibility(View.GONE); 104 } 105 } 106 } 107 } 108 animateChange(final View view, final View content, final View detailGroup, final boolean visible, final boolean hasButtons)109 private static void animateChange(final View view, final View content, 110 final View detailGroup, final boolean visible, final boolean hasButtons) { 111 setViewVisibility(detailGroup, R.id.divider, hasButtons); 112 setViewVisibility(detailGroup, R.id.buttonBar, hasButtons); 113 final int beforeBottom = content.getBottom(); 114 setHeight(detailGroup, visible ? LayoutParams.WRAP_CONTENT : 0); 115 detailGroup.setVisibility(View.VISIBLE); 116 view.addOnLayoutChangeListener(new OnLayoutChangeListener() { 117 public static final long DURATION = 250; 118 119 @Override 120 public void onLayoutChange(View v, int left, int top, int right, int bottom, 121 int oldLeft, int oldTop, int oldRight, int oldBottom) { 122 final int afterBottom = content.getBottom(); 123 v.removeOnLayoutChangeListener(this); 124 final ObjectAnimator animator = ObjectAnimator.ofInt(content, "bottom", 125 beforeBottom, afterBottom); 126 animator.setDuration(DURATION); 127 animator.addListener(new AnimatorListenerAdapter() { 128 @Override 129 public void onAnimationEnd(Animator animation) { 130 if (!visible) { 131 detailGroup.setVisibility(View.GONE); 132 } 133 } 134 }); 135 animator.start(); 136 } 137 }); 138 } 139 setHeight(View detailGroup, int height)140 private static void setHeight(View detailGroup, int height) { 141 final LayoutParams params = detailGroup.getLayoutParams(); 142 params.height = height; 143 detailGroup.setLayoutParams(params); 144 } 145 setViewVisibility(View containerView, int viewId, boolean visible)146 private static void setViewVisibility(View containerView, int viewId, boolean visible) { 147 View view = containerView.findViewById(viewId); 148 if (view != null) { 149 view.setVisibility(visible ? View.VISIBLE : View.GONE); 150 } 151 } 152 } 153