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 Dodd 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.mediapicker; 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.Activity; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.app.Fragment; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Context; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.content.Intent; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Bundle; 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.os.Handler; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v4.view.PagerAdapter; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v4.view.ViewPager; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v7.app.ActionBar; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.LayoutInflater; 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.Menu; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MenuInflater; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MenuItem; 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.View; 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.ViewGroup; 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.ImageButton; 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.widget.LinearLayout; 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.Factory; 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.DataModel; 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.Binding; 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.BindingBase; 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.binding.ImmutableBindingRef; 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData; 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MediaPickerData; 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.MessagePartData; 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.PendingAttachmentData; 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.DraftMessageData.DraftMessageSubscriptionDataProvider; 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.BugleActionBarActivity; 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.FixedViewPagerAdapter; 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.ui.mediapicker.DocumentImagePicker.SelectionListener; 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.AccessibilityUtil; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert; 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.UiUtils; 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.google.common.annotations.VisibleForTesting; 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.ArrayList; 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Collection; 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.List; 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/** 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Fragment used to select or capture media to be added to the message 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class MediaPicker extends Fragment implements DraftMessageSubscriptionDataProvider { 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The listener interface for events from the media picker */ 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public interface MediaPickerListener { 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** Called when the media picker is opened so the host can accommodate the UI */ 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onOpened(); 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when the media picker goes into or leaves full screen mode so the host can 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * accommodate the fullscreen UI 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onFullScreenChanged(boolean fullScreen); 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when the user selects one or more items 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param items The list of items which were selected 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onItemsSelected(Collection<MessagePartData> items, boolean dismissMediaPicker); 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when the user unselects one item. 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onItemUnselected(MessagePartData item); 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when the media picker is closed. Always called immediately after onItemsSelected 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onDismissed(); 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when media item selection is confirmed in a multi-select action. 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onConfirmItemSelection(); 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when a pending attachment is added. 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param pendingItem the pending attachment data being loaded. 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onPendingItemAdded(PendingAttachmentData pendingItem); 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Called when a new media chooser is selected. 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onChooserSelected(final int chooserIndex); 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The tag used when registering and finding this fragment */ 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final String FRAGMENT_TAG = "mediapicker"; 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Media type constants that the media picker supports 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_DEFAULT = 0x0000; 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_NONE = 0x0000; 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_IMAGE = 0x0001; 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_VIDEO = 0x0002; 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_AUDIO = 0x0004; 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_VCARD = 0x0008; 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_LOCATION = 0x0010; 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private static final int MEDA_TYPE_INVALID = 0x0020; 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public static final int MEDIA_TYPE_ALL = 0xFFFF; 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The listener to call when events occur */ 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MediaPickerListener mListener; 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The handler used to dispatch calls to the listener */ 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private Handler mListenerHandler; 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The bit flags of media types supported */ 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private int mSupportedMediaTypes; 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The list of choosers which could be within the media picker */ 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final MediaChooser[] mChoosers; 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The list of currently enabled choosers */ 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final ArrayList<MediaChooser> mEnabledChoosers; 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The currently selected chooser */ 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MediaChooser mSelectedChooser; 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The main panel that controls the custom layout */ 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MediaPickerPanel mMediaPickerPanel; 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The linear layout that holds the icons to select individual chooser tabs */ 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private LinearLayout mTabStrip; 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The view pager to swap between choosers */ 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private ViewPager mViewPager; 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The current pager adapter for the view pager */ 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private FixedViewPagerAdapter<MediaChooser> mPagerAdapter; 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** True if the media picker is visible */ 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mOpen; 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** The theme color to use to make the media picker match the rest of the UI */ 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private int mThemeColor; 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @VisibleForTesting 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Binding<MediaPickerData> mBinding = BindingBase.createBinding(this); 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** Handles picking image from the document picker */ 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private DocumentImagePicker mDocumentImagePicker; 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** Provides subscription-related data to access per-subscription configurations. */ 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private DraftMessageSubscriptionDataProvider mSubscriptionDataProvider; 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** Provides access to DraftMessageData associated with the current conversation */ 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private ImmutableBindingRef<DraftMessageData> mDraftMessageDataModel; 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public MediaPicker() { 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd this(Factory.get().getApplicationContext()); 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public MediaPicker(final Context context) { 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.bind(DataModel.get().createMediaPickerData(context)); 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mEnabledChoosers = new ArrayList<MediaChooser>(); 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mChoosers = new MediaChooser[] { 179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd new CameraMediaChooser(this), 180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd new GalleryMediaChooser(this), 181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd new AudioMediaChooser(this), 182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }; 183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mOpen = false; 185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setSupportedMediaTypes(MEDIA_TYPE_ALL); 186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mIsAttached; 189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private int mStartingMediaTypeOnAttach = MEDA_TYPE_INVALID; 190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mAnimateOnAttach; 191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onAttach (final Activity activity) { 194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onAttach(activity); 195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mIsAttached = true; 196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mStartingMediaTypeOnAttach != MEDA_TYPE_INVALID) { 197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // open() was previously called. Do the pending open now. 198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd doOpen(mStartingMediaTypeOnAttach, mAnimateOnAttach); 199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onCreate(final Bundle savedInstanceState) { 204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onCreate(savedInstanceState); 205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.getData().init(getLoaderManager()); 206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDocumentImagePicker = new DocumentImagePicker(this, 207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd new SelectionListener() { 208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onDocumentSelected(final PendingAttachmentData data) { 210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mBinding.isBound()) { 211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd dispatchPendingItemAdded(data); 212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public View onCreateView( 219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final LayoutInflater inflater, 220d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ViewGroup container, 221d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Bundle savedInstanceState) { 222d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel = (MediaPickerPanel) inflater.inflate( 223d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd R.layout.mediapicker_fragment, 224d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd container, 225d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd false); 226d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setMediaPicker(this); 227d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTabStrip = (LinearLayout) mMediaPickerPanel.findViewById(R.id.mediapicker_tabstrip); 228d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTabStrip.setBackgroundColor(mThemeColor); 229d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mChoosers) { 230d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd chooser.onCreateTabButton(inflater, mTabStrip); 231d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean enabled = (chooser.getSupportedMediaTypes() & mSupportedMediaTypes) != 232d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd MEDIA_TYPE_NONE; 233d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ImageButton tabButton = chooser.getTabButton(); 234d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (tabButton != null) { 235d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd tabButton.setVisibility(enabled ? View.VISIBLE : View.GONE); 236d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTabStrip.addView(tabButton); 237d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 238d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 239d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 240d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager = (ViewPager) mMediaPickerPanel.findViewById(R.id.mediapicker_view_pager); 241d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 242d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 243d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onPageScrolled( 244d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int position, 245d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final float positionOffset, 246d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int positionOffsetPixels) { 247d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 248d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 249d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 250d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onPageSelected(int position) { 251d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // The position returned is relative to if we are in RtL mode. This class never 252d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // switches the indices of the elements if we are in RtL mode so we need to 253d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // translate the index back. For example, if the user clicked the item most to the 254d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // right in RtL mode we would want the index to appear as 0 here, however the 255d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // position returned would the last possible index. 256d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (UiUtils.isRtlMode()) { 257d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd position = mEnabledChoosers.size() - 1 - position; 258d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 259d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(mEnabledChoosers.get(position)); 260d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 261d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 262d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 263d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onPageScrollStateChanged(final int state) { 264d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 265d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 266d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Camera initialization is expensive, so don't realize offscreen pages if not needed. 267d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager.setOffscreenPageLimit(0); 268d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager.setAdapter(mPagerAdapter); 269d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean isTouchExplorationEnabled = AccessibilityUtil.isTouchExplorationEnabled( 270d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd getActivity()); 271d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setFullScreenOnly(isTouchExplorationEnabled); 272d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setExpanded(mOpen, true, mEnabledChoosers.indexOf(mSelectedChooser)); 273d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mMediaPickerPanel; 274d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 275d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 276d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 277d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onPause() { 278d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onPause(); 279d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd CameraManager.get().onPause(); 280d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mEnabledChoosers) { 281d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd chooser.onPause(); 282d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 283d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 284d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 285d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 286d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onResume() { 287d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onResume(); 288d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd CameraManager.get().onResume(); 289d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 290d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mEnabledChoosers) { 291d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd chooser.onResume(); 292d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 293d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 294d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 295d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 296d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 297d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onActivityResult(requestCode, resultCode, data); 298d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDocumentImagePicker.onActivityResult(requestCode, resultCode, data); 299d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 300d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 301d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 302d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onDestroy() { 303d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onDestroy(); 304d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.unbind(); 305d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 306d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 307d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 308d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Sets the theme color to make the media picker match the surrounding UI 309d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param themeColor The new theme color 310d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 311d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setConversationThemeColor(final int themeColor) { 312d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mThemeColor = themeColor; 313d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mTabStrip != null) { 314d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mTabStrip.setBackgroundColor(mThemeColor); 315d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 316d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 317d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mEnabledChoosers) { 318d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd chooser.setThemeColor(mThemeColor); 319d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 320d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 321d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 322d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 323d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Gets the current conversation theme color. 324d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 325d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getConversationThemeColor() { 326d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mThemeColor; 327d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 328d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 329d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setDraftMessageDataModel(final BindingBase<DraftMessageData> draftBinding) { 330d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDraftMessageDataModel = Binding.createBindingReference(draftBinding); 331d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 332d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 333d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public ImmutableBindingRef<DraftMessageData> getDraftMessageDataModel() { 334d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mDraftMessageDataModel; 335d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 336d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 337d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setSubscriptionDataProvider(final DraftMessageSubscriptionDataProvider provider) { 338d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSubscriptionDataProvider = provider; 339d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 340d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 341d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 342d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public int getConversationSelfSubId() { 343d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSubscriptionDataProvider.getConversationSelfSubId(); 344d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 345d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 346d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 347d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Opens the media picker and optionally shows the chooser for the supplied media type 348d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param startingMediaType The media type of the chooser to open if {@link #MEDIA_TYPE_DEFAULT} 349d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * is used, then the default chooser from saved shared prefs is opened 350d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 351d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void open(final int startingMediaType, final boolean animate) { 352d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mOpen = true; 353d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mIsAttached) { 354d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd doOpen(startingMediaType, animate); 355d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 356d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // open() can get called immediately after the MediaPicker is created. In that case, 357d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // we defer doing work as it may require an attached fragment (eg. calling 358d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Fragment#requestPermission) 359d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mStartingMediaTypeOnAttach = startingMediaType; 360d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mAnimateOnAttach = animate; 361d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 362d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 363d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 364d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private void doOpen(int startingMediaType, final boolean animate) { 365d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean isTouchExplorationEnabled = AccessibilityUtil.isTouchExplorationEnabled( 366d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // getActivity() will be null at this point 367d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Factory.get().getApplicationContext()); 368d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 369d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // If no specific starting type is specified (i.e. MEDIA_TYPE_DEFAULT), try to get the 370d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // last opened chooser index from shared prefs. 371d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (startingMediaType == MEDIA_TYPE_DEFAULT) { 372d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int selectedChooserIndex = mBinding.getData().getSelectedChooserIndex(); 373d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (selectedChooserIndex >= 0 && selectedChooserIndex < mEnabledChoosers.size()) { 374d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(mEnabledChoosers.get(selectedChooserIndex)); 375d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 376d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // This is the first time the picker is being used 377d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isTouchExplorationEnabled) { 378d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Accessibility defaults to audio attachment mode. 379d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd startingMediaType = MEDIA_TYPE_AUDIO; 380d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 381d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 382d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 383d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 384d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser == null) { 385d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mEnabledChoosers) { 386d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (startingMediaType == MEDIA_TYPE_DEFAULT || 387d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd (startingMediaType & chooser.getSupportedMediaTypes()) != MEDIA_TYPE_NONE) { 388d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(chooser); 389d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd break; 390d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 391d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 392d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 393d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 394d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser == null) { 395d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Fall back to the first chooser. 396d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(mEnabledChoosers.get(0)); 397d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 398d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 399d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mMediaPickerPanel != null) { 400d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setFullScreenOnly(isTouchExplorationEnabled); 401d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setExpanded(true, animate, 402d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mEnabledChoosers.indexOf(mSelectedChooser)); 403d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 404d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 405d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 406d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** @return True if the media picker is open */ 407d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean isOpen() { 408d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mOpen; 409d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 410d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 411d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 412d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Sets the list of media types to allow the user to select 413d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param mediaTypes The bit flags of media types to allow. Can be any combination of the 414d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * MEDIA_TYPE_* values 415d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 416d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void setSupportedMediaTypes(final int mediaTypes) { 417d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSupportedMediaTypes = mediaTypes; 418d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mEnabledChoosers.clear(); 419d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean selectNextChooser = false; 420d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final MediaChooser chooser : mChoosers) { 421d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean enabled = (chooser.getSupportedMediaTypes() & mSupportedMediaTypes) != 422d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd MEDIA_TYPE_NONE; 423d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (enabled) { 424d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // TODO Add a way to inform the chooser which media types are supported 425d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mEnabledChoosers.add(chooser); 426d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (selectNextChooser) { 427d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(chooser); 428d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectNextChooser = false; 429d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 430d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else if (mSelectedChooser == chooser) { 431d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectNextChooser = true; 432d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 433d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ImageButton tabButton = chooser.getTabButton(); 434d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (tabButton != null) { 435d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd tabButton.setVisibility(enabled ? View.VISIBLE : View.GONE); 436d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 437d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 438d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 439d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (selectNextChooser && mEnabledChoosers.size() > 0) { 440d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd selectChooser(mEnabledChoosers.get(0)); 441d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 442d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final MediaChooser[] enabledChoosers = new MediaChooser[mEnabledChoosers.size()]; 443d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mEnabledChoosers.toArray(enabledChoosers); 444d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mPagerAdapter = new FixedViewPagerAdapter<MediaChooser>(enabledChoosers); 445d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mViewPager != null) { 446d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager.setAdapter(mPagerAdapter); 447d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 448d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 449d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Only rebind data if we are currently bound. Otherwise, we must have not 450d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // bound to any data yet and should wait until onCreate() to bind data. 451d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mBinding.isBound() && getActivity() != null) { 452d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.unbind(); 453d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.bind(DataModel.get().createMediaPickerData(getActivity())); 454d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.getData().init(getLoaderManager()); 455d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 456d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 457d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 458d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ViewPager getViewPager() { 459d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mViewPager; 460d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 461d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 462d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** Hides the media picker, and frees up any resources it’s using */ 463d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void dismiss(final boolean animate) { 464d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mOpen = false; 465d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mMediaPickerPanel != null) { 466d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setExpanded(false, animate, MediaPickerPanel.PAGE_NOT_SET); 467d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 468d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser = null; 469d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 470d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 471d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 472d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Sets the listener for the media picker events 473d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param listener The listener which will receive events 474d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 475d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setListener(final MediaPickerListener listener) { 476d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isMainThread(); 477d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener = listener; 478d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler = listener != null ? new Handler() : null; 479d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 480d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 481d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** @return True if the media picker is in full-screen mode */ 482d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean isFullScreen() { 483d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mMediaPickerPanel != null && mMediaPickerPanel.isFullScreen(); 484d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 485d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 486d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void setFullScreen(final boolean fullScreen) { 487d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.setFullScreenView(fullScreen, true); 488d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 489d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 490d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void updateActionBar(final ActionBar actionBar) { 491d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (getActivity() == null) { 492d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 493d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 494d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isFullScreen() && mSelectedChooser != null) { 495d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.updateActionBar(actionBar); 496d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 497d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd actionBar.hide(); 498d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 499d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 500d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 501d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 502d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Selects a new chooser 503d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * @param newSelectedChooser The newly selected chooser 504d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 505d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void selectChooser(final MediaChooser newSelectedChooser) { 506d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser == newSelectedChooser) { 507d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 508d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 509d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 510d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 511d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.setSelected(false); 512d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 513d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser = newSelectedChooser; 514d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 515d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.setSelected(true); 516d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 517d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 518d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int chooserIndex = mEnabledChoosers.indexOf(mSelectedChooser); 519d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mViewPager != null) { 520d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mViewPager.setCurrentItem(chooserIndex, true /* smoothScroll */); 521d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 522d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 523d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isFullScreen()) { 524d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd invalidateOptionsMenu(); 525d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 526d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 527d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // Save the newly selected chooser's index so we may directly switch to it the 528d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // next time user opens the media picker. 529d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBinding.getData().saveSelectedChooserIndex(chooserIndex); 530d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mMediaPickerPanel != null) { 531d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mMediaPickerPanel.onChooserChanged(); 532d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 533d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd dispatchChooserSelected(chooserIndex); 534d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 535d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 536d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean canShowIme() { 537d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 538d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedChooser.canShowIme(); 539d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 540d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 541d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 542d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 543d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onBackPressed() { 544d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedChooser != null && mSelectedChooser.onBackPressed(); 545d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 546d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 547d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void invalidateOptionsMenu() { 548d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd ((BugleActionBarActivity) getActivity()).supportInvalidateOptionsMenu(); 549d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 550d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 551d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchOpened() { 552d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setHasOptionsMenu(false); 553d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mOpen = true; 554d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mPagerAdapter.notifyDataSetChanged(); 555d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 556d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 557d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 558d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 559d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onOpened(); 560d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 561d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 562d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 563d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 564d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onFullScreenChanged(false); 565d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onOpenedChanged(true); 566d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 567d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 568d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 569d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchDismissed() { 570d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setHasOptionsMenu(false); 571d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mOpen = false; 572d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 573d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 574d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 575d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 576d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onDismissed(); 577d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 578d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 579d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 580d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 581d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onOpenedChanged(false); 582d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 583d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 584d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 585d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchFullScreen(final boolean fullScreen) { 586d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd setHasOptionsMenu(fullScreen); 587d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 588d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 589d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 590d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 591d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onFullScreenChanged(fullScreen); 592d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 593d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 594d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 595d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 596d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onFullScreenChanged(fullScreen); 597d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 598d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 599d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 600d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchItemsSelected(final MessagePartData item, final boolean dismissMediaPicker) { 601d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final List<MessagePartData> items = new ArrayList<MessagePartData>(1); 602d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd items.add(item); 603d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd dispatchItemsSelected(items, dismissMediaPicker); 604d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 605d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 606d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchItemsSelected(final Collection<MessagePartData> items, 607d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean dismissMediaPicker) { 608d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 609d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 610d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 611d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 612d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onItemsSelected(items, dismissMediaPicker); 613d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 614d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 615d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 616d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 617d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isFullScreen() && !dismissMediaPicker) { 618d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd invalidateOptionsMenu(); 619d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 620d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 621d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 622d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchItemUnselected(final MessagePartData item) { 623d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 624d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 625d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 626d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 627d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onItemUnselected(item); 628d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 629d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 630d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 631d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 632d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isFullScreen()) { 633d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd invalidateOptionsMenu(); 634d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 635d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 636d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 637d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchConfirmItemSelection() { 638d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 639d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 640d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 641d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 642d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onConfirmItemSelection(); 643d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 644d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 645d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 646d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 647d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 648d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchPendingItemAdded(final PendingAttachmentData pendingItem) { 649d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 650d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 651d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 652d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 653d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onPendingItemAdded(pendingItem); 654d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 655d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 656d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 657d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 658d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (isFullScreen()) { 659d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd invalidateOptionsMenu(); 660d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 661d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 662d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 663d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void dispatchChooserSelected(final int chooserIndex) { 664d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mListener != null) { 665d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListenerHandler.post(new Runnable() { 666d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 667d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void run() { 668d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onChooserSelected(chooserIndex); 669d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 670d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd }); 671d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 672d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 673d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 674d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean canSwipeDownChooser() { 675d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedChooser == null ? false : mSelectedChooser.canSwipeDown(); 676d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 677d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 678d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean isChooserHandlingTouch() { 679d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedChooser == null ? false : mSelectedChooser.isHandlingTouch(); 680d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 681d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 682d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void stopChooserTouchHandling() { 683d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 684d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.stopTouchHandling(); 685d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 686d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 687d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 688d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean getChooserShowsActionBarInFullScreen() { 689d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedChooser == null ? false : mSelectedChooser.getActionBarTitleResId() != 0; 690d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 691d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 692d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 693d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 694d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 695d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onCreateOptionsMenu(inflater, menu); 696d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 697d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 698d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 699d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 700d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onOptionsItemSelected(final MenuItem item) { 701d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return (mSelectedChooser != null && mSelectedChooser.onOptionsItemSelected(item)) || 702d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd super.onOptionsItemSelected(item); 703d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 704d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 705d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd PagerAdapter getPagerAdapter() { 706d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mPagerAdapter; 707d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 708d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 709d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void resetViewHolderState() { 710d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mPagerAdapter.resetState(); 711d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 712d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 713d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd /** 714d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Launch an external picker to pick item from document picker as attachment. 715d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 716d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void launchDocumentPicker() { 717d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mDocumentImagePicker.launchPicker(); 718d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 719d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 720d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public ImmutableBindingRef<MediaPickerData> getMediaPickerDataBinding() { 721d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return BindingBase.createBindingReference(mBinding); 722d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 723d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 724d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected static final int CAMERA_PERMISSION_REQUEST_CODE = 1; 725d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected static final int LOCATION_PERMISSION_REQUEST_CODE = 2; 726d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected static final int RECORD_AUDIO_PERMISSION_REQUEST_CODE = 3; 727d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd protected static final int GALLERY_PERMISSION_REQUEST_CODE = 4; 728d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 729d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 730d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onRequestPermissionsResult( 731d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final int requestCode, final String permissions[], final int[] grantResults) { 732d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedChooser != null) { 733d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedChooser.onRequestPermissionsResult(requestCode, permissions, grantResults); 734d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 735d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 736d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 737