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