1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.conversation; 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v4.util.Pair; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.text.TextUtils; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.Factory; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SubscriptionListData; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionListEntry; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.conversation.SimSelectorView.SimSelectorViewListener; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.AccessibilityUtil; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.OsUtil; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ThreadUtil; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/** 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Manages showing/hiding the SIM selector in conversation. 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddabstract class ConversationSimSelector extends ConversationInput { 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private SimSelectorView mSimSelectorView; 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private Pair<Boolean /* show */, Boolean /* animate */> mPendingShow; 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mDataReady; 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private String mSelectedSimText; 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public ConversationSimSelector(ConversationInputBase baseHost) { 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super(baseHost, false); 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onSubscriptionListDataLoaded(final SubscriptionListData subscriptionListData) { 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ensureSimSelectorView(); 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView.bind(subscriptionListData); 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDataReady = subscriptionListData != null && subscriptionListData.hasData(); 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mPendingShow != null && mDataReady) { 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(OsUtil.isAtLeastL_MR1()); 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean show = mPendingShow.first; 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean animate = mPendingShow.second; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ThreadUtil.getMainThreadHandler().post(new Runnable() { 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // This will No-Op if we are no longer attached to the host. 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mConversationInputBase.showHideInternal(ConversationSimSelector.this, 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd show, animate); 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mPendingShow = null; 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private void announcedSelectedSim() { 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Context context = Factory.get().getApplicationContext(); 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (AccessibilityUtil.isTouchExplorationEnabled(context) && 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd !TextUtils.isEmpty(mSelectedSimText)) { 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd AccessibilityUtil.announceForAccessibilityCompat( 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView, null, 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd context.getString(R.string.selected_sim_content_message, mSelectedSimText)); 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setSelected(final SubscriptionListEntry subEntry) { 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedSimText = subEntry == null ? null : subEntry.displayName; 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean show(boolean animate) { 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd announcedSelectedSim(); 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return showHide(true, animate); 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean hide(boolean animate) { 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return showHide(false, animate); 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean showHide(final boolean show, final boolean animate) { 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!OsUtil.isAtLeastL_MR1()) { 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mDataReady) { 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView.showOrHide(show, animate); 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSimSelectorView.isOpen() == show; 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mPendingShow = Pair.create(show, animate); 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private void ensureSimSelectorView() { 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSimSelectorView == null) { 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Grab the SIM selector view from the host. This class assumes ownership of it. 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView = getSimSelectorView(); 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView.setItemLayoutId(getSimSelectorItemLayoutId()); 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSimSelectorView.setListener(new SimSelectorViewListener() { 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onSimSelectorVisibilityChanged(boolean visible) { 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd onVisibilityChanged(visible); 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onSimItemClicked(SubscriptionListEntry item) { 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectSim(item); 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected abstract SimSelectorView getSimSelectorView(); 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected abstract void selectSim(final SubscriptionListEntry item); 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected abstract int getSimSelectorItemLayoutId(); 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 129