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.messaging.ui.conversation; 17 18 import android.content.Context; 19 import android.util.AttributeSet; 20 import android.view.LayoutInflater; 21 import android.view.View; 22 import android.view.ViewGroup; 23 import android.view.animation.Animation; 24 import android.view.animation.TranslateAnimation; 25 import android.widget.ArrayAdapter; 26 import android.widget.FrameLayout; 27 import android.widget.ListView; 28 29 import com.android.messaging.R; 30 import com.android.messaging.datamodel.data.SubscriptionListData; 31 import com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionListEntry; 32 import com.android.messaging.util.UiUtils; 33 34 import java.util.ArrayList; 35 import java.util.List; 36 37 /** 38 * Displays a SIM selector above the compose message view and overlays the message list. 39 */ 40 public class SimSelectorView extends FrameLayout implements SimSelectorItemView.HostInterface { 41 public interface SimSelectorViewListener { 42 void onSimItemClicked(SubscriptionListEntry item); 43 void onSimSelectorVisibilityChanged(boolean visible); 44 } 45 46 private ListView mSimListView; 47 private final SimSelectorAdapter mAdapter; 48 private boolean mShow; 49 private SimSelectorViewListener mListener; 50 private int mItemLayoutId; 51 52 public SimSelectorView(Context context, AttributeSet attrs) { 53 super(context, attrs); 54 mAdapter = new SimSelectorAdapter(getContext()); 55 } 56 57 @Override 58 protected void onFinishInflate() { 59 super.onFinishInflate(); 60 mSimListView = (ListView) findViewById(R.id.sim_list); 61 mSimListView.setAdapter(mAdapter); 62 63 // Clicking anywhere outside the switcher list should dismiss. 64 setOnClickListener(new OnClickListener() { 65 @Override 66 public void onClick(View v) { 67 showOrHide(false, true); 68 } 69 }); 70 } 71 72 public void bind(final SubscriptionListData data) { 73 mAdapter.bindData(data.getActiveSubscriptionEntriesExcludingDefault()); 74 } 75 76 public void setItemLayoutId(final int layoutId) { 77 mItemLayoutId = layoutId; 78 } 79 80 public void setListener(final SimSelectorViewListener listener) { 81 mListener = listener; 82 } 83 84 public void toggleVisibility() { 85 showOrHide(!mShow, true); 86 } 87 88 public void showOrHide(final boolean show, final boolean animate) { 89 final boolean oldShow = mShow; 90 mShow = show && mAdapter.getCount() > 1; 91 if (oldShow != mShow) { 92 if (mListener != null) { 93 mListener.onSimSelectorVisibilityChanged(mShow); 94 } 95 96 if (animate) { 97 // Fade in the background pane. 98 setVisibility(VISIBLE); 99 setAlpha(mShow ? 0.0f : 1.0f); 100 animate().alpha(mShow ? 1.0f : 0.0f) 101 .setDuration(UiUtils.REVEAL_ANIMATION_DURATION) 102 .withEndAction(new Runnable() { 103 @Override 104 public void run() { 105 setAlpha(1.0f); 106 setVisibility(mShow ? VISIBLE : GONE); 107 } 108 }); 109 } else { 110 setVisibility(mShow ? VISIBLE : GONE); 111 } 112 113 // Slide in the SIM selector list via a translate animation. 114 mSimListView.setVisibility(mShow ? VISIBLE : GONE); 115 if (animate) { 116 mSimListView.clearAnimation(); 117 final TranslateAnimation translateAnimation = new TranslateAnimation( 118 Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, 119 Animation.RELATIVE_TO_SELF, mShow ? 1.0f : 0.0f, 120 Animation.RELATIVE_TO_SELF, mShow ? 0.0f : 1.0f); 121 translateAnimation.setInterpolator(UiUtils.EASE_OUT_INTERPOLATOR); 122 translateAnimation.setDuration(UiUtils.REVEAL_ANIMATION_DURATION); 123 mSimListView.startAnimation(translateAnimation); 124 } 125 } 126 } 127 128 /** 129 * An adapter that takes a list of SubscriptionListEntry and displays them as a list of 130 * available SIMs in the SIM selector. 131 */ 132 private class SimSelectorAdapter extends ArrayAdapter<SubscriptionListEntry> { 133 public SimSelectorAdapter(final Context context) { 134 super(context, R.layout.sim_selector_item_view, new ArrayList<SubscriptionListEntry>()); 135 } 136 137 public void bindData(final List<SubscriptionListEntry> newList) { 138 clear(); 139 addAll(newList); 140 notifyDataSetChanged(); 141 } 142 143 @Override 144 public View getView(final int position, final View convertView, final ViewGroup parent) { 145 SimSelectorItemView itemView; 146 if (convertView != null && convertView instanceof SimSelectorItemView) { 147 itemView = (SimSelectorItemView) convertView; 148 } else { 149 final LayoutInflater inflater = (LayoutInflater) getContext() 150 .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 151 itemView = (SimSelectorItemView) inflater.inflate(mItemLayoutId, 152 parent, false); 153 itemView.setHostInterface(SimSelectorView.this); 154 } 155 itemView.bind(getItem(position)); 156 return itemView; 157 } 158 } 159 160 @Override 161 public void onSimItemClicked(SubscriptionListEntry item) { 162 mListener.onSimItemClicked(item); 163 showOrHide(false, true); 164 } 165 166 public boolean isOpen() { 167 return mShow; 168 } 169 } 170