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