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