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.app.FragmentManager;
19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context;
20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle;
21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v7.app.ActionBar;
22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.EditText;
23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R;
25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.BindingBase;
26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.ImmutableBindingRef;
27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData;
28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData.ConversationDataListener;
29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationData.SimpleConversationDataListener;
30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData;
31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider;
32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MessagePartData;
33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.PendingAttachmentData;
34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.SubscriptionListData.SubscriptionListEntry;
35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.ConversationDrawables;
36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.mediapicker.MediaPicker;
37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.mediapicker.MediaPicker.MediaPickerListener;
38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert;
39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ImeUtil;
40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.ImeUtil.ImeStateHost;
41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.google.common.annotations.VisibleForTesting;
42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Collection;
44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/**
46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Manages showing/hiding/persisting different mutually exclusive UI components nested in
47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * ConversationFragment that take user inputs, i.e. media picker, SIM selector and
48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * IME keyboard (the IME keyboard is not owned by Bugle, but we try to model it the same way
49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * as the other components).
50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */
51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class ConversationInputManager implements ConversationInput.ConversationInputBase {
52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * The host component where all input components are contained. This is typically the
54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * conversation fragment but may be mocked in test code.
55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public interface ConversationInputHost extends DraftMessageSubscriptionDataProvider {
57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void invalidateActionBar();
58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void setOptionsMenuVisibility(boolean visible);
59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void dismissActionMode();
60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void selectSim(SubscriptionListEntry subscriptionData);
61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void onStartComposeMessage();
62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        SimSelectorView getSimSelectorView();
63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        MediaPicker createMediaPicker();
64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void showHideSimSelector(boolean show);
65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        int getSimSelectorItemLayoutId();
66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * The "sink" component where all inputs components will direct the user inputs to. This is
70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * typically the ComposeMessageView but may be mocked in test code.
71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public interface ConversationInputSink {
73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void onMediaItemsSelected(Collection<MessagePartData> items);
74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void onMediaItemsUnselected(MessagePartData item);
75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void onPendingAttachmentAdded(PendingAttachmentData pendingItem);
76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void resumeComposeMessage();
77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        EditText getComposeEditText();
78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        void setAccessibility(boolean enabled);
79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationInputHost mHost;
82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationInputSink mSink;
83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /** Dependencies injected from the host during construction */
85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final FragmentManager mFragmentManager;
86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final Context mContext;
87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ImeStateHost mImeStateHost;
88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ImmutableBindingRef<ConversationData> mConversationDataModel;
89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ImmutableBindingRef<DraftMessageData> mDraftDataModel;
90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationInput[] mInputs;
92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationMediaPicker mMediaInput;
93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationSimSelector mSimInput;
94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationImeKeyboard mImeInput;
95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private int mUpdateCount;
96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ImeUtil.ImeStateObserver mImeStateObserver = new ImeUtil.ImeStateObserver() {
98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onImeStateChanged(final boolean imeOpen) {
100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mImeInput.onVisibilityChanged(imeOpen);
101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private final ConversationDataListener mDataListener = new SimpleConversationDataListener() {
105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onConversationParticipantDataLoaded(ConversationData data) {
107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mConversationDataModel.ensureBound(data);
108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void onSubscriptionListDataLoaded(ConversationData data) {
112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mConversationDataModel.ensureBound(data);
113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mSimInput.onSubscriptionListDataLoaded(data.getSubscriptionListData());
114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    };
116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public ConversationInputManager(
118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final Context context,
119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ConversationInputHost host,
120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ConversationInputSink sink,
121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ImeStateHost imeStateHost,
122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final FragmentManager fm,
123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final BindingBase<ConversationData> conversationDataModel,
124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final BindingBase<DraftMessageData> draftDataModel,
125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final Bundle savedState) {
126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mHost = host;
127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSink = sink;
128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mFragmentManager = fm;
129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mContext = context;
130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mImeStateHost = imeStateHost;
131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mConversationDataModel = BindingBase.createBindingReference(conversationDataModel);
132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mDraftDataModel = BindingBase.createBindingReference(draftDataModel);
133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Register listeners on dependencies.
135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mImeStateHost.registerImeStateObserver(mImeStateObserver);
136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mConversationDataModel.getData().addConversationDataListener(mDataListener);
137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Initialize the inputs
139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mMediaInput = new ConversationMediaPicker(this);
140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSimInput = new SimSelector(this);
141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mImeInput = new ConversationImeKeyboard(this, mImeStateHost.isImeOpen());
142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mInputs = new ConversationInput[] { mMediaInput, mSimInput, mImeInput };
143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (savedState != null) {
145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            for (int i = 0; i < mInputs.length; i++) {
146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mInputs[i].restoreState(savedState);
147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        updateHostOptionsMenu();
150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void onDetach() {
153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mImeStateHost.unregisterImeStateObserver(mImeStateObserver);
154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Don't need to explicitly unregister for data model events. It will unregister all
155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // listeners automagically on unbind.
156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void onSaveInputState(final Bundle savedState) {
159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mInputs[i].saveState(savedState);
161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public String getInputStateKey(final ConversationInput input) {
166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return input.getClass().getCanonicalName() + "_savedstate_";
167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean onBackPressed() {
170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mInputs[i].onBackPressed()) {
172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return true;
173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return false;
176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean onNavigationUpPressed() {
179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mInputs[i].onNavigationUpPressed()) {
181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return true;
182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return false;
185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void resetMediaPickerState() {
188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mMediaInput.resetViewHolderState();
189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void showHideMediaPicker(final boolean show, final boolean animate) {
192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        showHideInternal(mMediaInput, show, animate);
193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Show or hide the sim selector
197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param show visibility
198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param animate whether to animate the change in visibility
199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return true if the state of the visibility was changed
200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean showHideSimSelector(final boolean show, final boolean animate) {
202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return showHideInternal(mSimInput, show, animate);
203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void showHideImeKeyboard(final boolean show, final boolean animate) {
206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        showHideInternal(mImeInput, show, animate);
207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void hideAllInputs(final boolean animate) {
210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        beginUpdate();
211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            showHideInternal(mInputs[i], false, animate);
213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        endUpdate();
215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Toggle the visibility of the sim selector.
219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param animate
220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @param subEntry
221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * @return true if the view is now shown, false if it now hidden
222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean toggleSimSelector(final boolean animate, final SubscriptionListEntry subEntry) {
224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mSimInput.setSelected(subEntry);
225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSimInput.toggle(animate);
226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean updateActionBar(final ActionBar actionBar) {
229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mInputs[i].mShowing) {
231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return mInputs[i].updateActionBar(actionBar);
232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return false;
235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @VisibleForTesting
238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    boolean isMediaPickerVisible() {
239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mMediaInput.mShowing;
240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @VisibleForTesting
243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    boolean isSimSelectorVisible() {
244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mSimInput.mShowing;
245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @VisibleForTesting
248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    boolean isImeKeyboardVisible() {
249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return mImeInput.mShowing;
250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @VisibleForTesting
253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    void testNotifyImeStateChanged(final boolean imeOpen) {
254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mImeStateObserver.onImeStateChanged(imeOpen);
255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * returns true if the state of the visibility was actually changed
259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public boolean showHideInternal(final ConversationInput target, final boolean show,
262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final boolean animate) {
263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!mConversationDataModel.isBound()) {
264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return false;
265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (target.mShowing == show) {
268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return false;
269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        beginUpdate();
271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        boolean success;
272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!show) {
273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            success = target.hide(animate);
274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        } else {
275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            success = target.show(animate);
276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (success) {
279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            target.onVisibilityChanged(show);
280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        endUpdate();
282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        return true;
283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void handleOnShow(final ConversationInput target) {
287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (!mConversationDataModel.isBound()) {
288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return;
289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        beginUpdate();
291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // All inputs are mutually exclusive. Showing one will hide everything else.
293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // The one exception, is that the keyboard and location media chooser can be open at the
294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // time to enable searching within that chooser
295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        for (int i = 0; i < mInputs.length; i++) {
296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final ConversationInput currInput = mInputs[i];
297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (currInput != target) {
298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // TODO : If there's more exceptions we will want to make this more
299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                // generic
300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                if (currInput instanceof ConversationMediaPicker &&
301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        target instanceof ConversationImeKeyboard &&
302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mMediaInput.getExistingOrCreateMediaPicker() != null &&
303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mMediaInput.getExistingOrCreateMediaPicker().canShowIme()) {
304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    // Allow the keyboard and location mediaPicker to be open at the same time,
305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    // but ensure the media picker is full screen to allow enough room
306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mMediaInput.getExistingOrCreateMediaPicker().setFullScreen(true);
307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    continue;
308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                showHideInternal(currInput, false /* show */, false /* animate */);
310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Always dismiss action mode on show.
313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mHost.dismissActionMode();
314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        // Invoking any non-keyboard input UI is treated as starting message compose.
315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (target != mImeInput) {
316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mHost.onStartComposeMessage();
317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        endUpdate();
319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void beginUpdate() {
323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mUpdateCount++;
324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    @Override
327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    public void endUpdate() {
328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        Assert.isTrue(mUpdateCount > 0);
329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        if (--mUpdateCount == 0) {
330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            // Always try to update the host action bar after every update cycle.
331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mHost.invalidateActionBar();
332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private void updateHostOptionsMenu() {
336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        mHost.setOptionsMenuVisibility(!mMediaInput.isOpen());
337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Manages showing/hiding the media picker in conversation.
341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private class ConversationMediaPicker extends ConversationInput {
343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public ConversationMediaPicker(ConversationInputBase baseHost) {
344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super(baseHost, false);
345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private MediaPicker mMediaPicker;
348d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
349d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
350d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean show(boolean animate) {
351d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker == null) {
352d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker = getExistingOrCreateMediaPicker();
353d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                setConversationThemeColor(ConversationDrawables.get().getConversationThemeColor());
354d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.setSubscriptionDataProvider(mHost);
355d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.setDraftMessageDataModel(mDraftDataModel);
356d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.setListener(new MediaPickerListener() {
357d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
358d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onOpened() {
359d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        handleStateChange();
360d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
361d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
362d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
363d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onFullScreenChanged(boolean fullScreen) {
364d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        // When we're full screen, we want to disable accessibility on the
365d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        // ComposeMessageView controls (attach button, message input, sim chooser)
366d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        // that are hiding underneath the action bar.
367d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.setAccessibility(!fullScreen /*enabled*/);
368d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        handleStateChange();
369d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
370d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
371d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
372d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onDismissed() {
373d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        // Re-enable accessibility on all controls now that the media picker is
374d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        // going away.
375d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.setAccessibility(true /*enabled*/);
376d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        handleStateChange();
377d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
378d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
379d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    private void handleStateChange() {
380d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        onVisibilityChanged(isOpen());
381d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mHost.invalidateActionBar();
382d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        updateHostOptionsMenu();
383d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
384d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
385d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
386d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onItemsSelected(final Collection<MessagePartData> items,
387d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            final boolean resumeCompose) {
388d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.onMediaItemsSelected(items);
389d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mHost.invalidateActionBar();
390d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        if (resumeCompose) {
391d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                            mSink.resumeComposeMessage();
392d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        }
393d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
394d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
395d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
396d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onItemUnselected(final MessagePartData item) {
397d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.onMediaItemsUnselected(item);
398d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mHost.invalidateActionBar();
399d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
400d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
401d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
402d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onConfirmItemSelection() {
403d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.resumeComposeMessage();
404d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
405d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
406d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
407d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onPendingItemAdded(final PendingAttachmentData pendingItem) {
408d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mSink.onPendingAttachmentAdded(pendingItem);
409d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
410d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
411d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    @Override
412d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    public void onChooserSelected(final int chooserIndex) {
413d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mHost.invalidateActionBar();
414d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mHost.dismissActionMode();
415d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    }
416d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                });
417d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
418d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
419d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mMediaPicker.open(MediaPicker.MEDIA_TYPE_DEFAULT, animate);
420d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
421d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return isOpen();
422d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
423d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
424d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
425d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean hide(boolean animate) {
426d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker != null) {
427d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.dismiss(animate);
428d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
429d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return !isOpen();
430d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
431d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
432d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void resetViewHolderState() {
433d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker != null) {
434d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.resetViewHolderState();
435d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
436d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
437d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
438d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public void setConversationThemeColor(final int themeColor) {
439d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker != null) {
440d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.setConversationThemeColor(themeColor);
441d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
442d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
443d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
444d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private boolean isOpen() {
445d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return (mMediaPicker != null && mMediaPicker.isOpen());
446d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
447d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
448d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        private MediaPicker getExistingOrCreateMediaPicker() {
449d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker != null) {
450d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return mMediaPicker;
451d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
452d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            MediaPicker mediaPicker = (MediaPicker)
453d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    mFragmentManager.findFragmentByTag(MediaPicker.FRAGMENT_TAG);
454d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mediaPicker == null) {
455d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mediaPicker = mHost.createMediaPicker();
456d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                if (mediaPicker == null) {
457d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                    return null;    // this use of ComposeMessageView doesn't support media picking
458d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                }
459d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mFragmentManager.beginTransaction().replace(
460d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        R.id.mediapicker_container,
461d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        mediaPicker,
462d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                        MediaPicker.FRAGMENT_TAG).commit();
463d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
464d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return mediaPicker;
465d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
466d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
467d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
468d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean updateActionBar(ActionBar actionBar) {
469d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (isOpen()) {
470d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                mMediaPicker.updateActionBar(actionBar);
471d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return true;
472d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
473d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return false;
474d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
475d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
476d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
477d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean onNavigationUpPressed() {
478d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (isOpen() && mMediaPicker.isFullScreen()) {
479d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return onBackPressed();
480d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
481d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return super.onNavigationUpPressed();
482d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
483d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
484d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean onBackPressed() {
485d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            if (mMediaPicker != null && mMediaPicker.onBackPressed()) {
486d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd                return true;
487d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            }
488d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return super.onBackPressed();
489d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
490d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
491d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
492d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
493d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Manages showing/hiding the SIM selector in conversation.
494d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
495d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private class SimSelector extends ConversationSimSelector {
496d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public SimSelector(ConversationInputBase baseHost) {
497d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super(baseHost);
498d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
499d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
500d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
501d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        protected SimSelectorView getSimSelectorView() {
502d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return mHost.getSimSelectorView();
503d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
504d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
505d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
506d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public int getSimSelectorItemLayoutId() {
507d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return mHost.getSimSelectorItemLayoutId();
508d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
509d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
510d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
511d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        protected void selectSim(SubscriptionListEntry item) {
512d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mHost.selectSim(item);
513d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
514d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
515d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
516d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean show(boolean animate) {
517d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final boolean result = super.show(animate);
518d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mHost.showHideSimSelector(true /*show*/);
519d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return result;
520d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
521d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
522d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
523d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean hide(boolean animate) {
524d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            final boolean result = super.hide(animate);
525d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            mHost.showHideSimSelector(false /*show*/);
526d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return result;
527d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
528d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
529d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
530d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    /**
531d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     * Manages showing/hiding the IME keyboard in conversation.
532d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd     */
533d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    private class ConversationImeKeyboard extends ConversationInput {
534d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public ConversationImeKeyboard(ConversationInputBase baseHost, final boolean isShowing) {
535d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            super(baseHost, isShowing);
536d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
537d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
538d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
539d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean show(boolean animate) {
540d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            ImeUtil.get().showImeKeyboard(mContext, mSink.getComposeEditText());
541d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
542d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
543d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd
544d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        @Override
545d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        public boolean hide(boolean animate) {
546d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            ImeUtil.get().hideImeKeyboard(mContext, mSink.getComposeEditText());
547d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd            return true;
548d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd        }
549d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd    }
550d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd}
551