FilmstripBottomPanel.java revision e7d7b9ef5e09ba464306565c6c62302a4d9bbe5e
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.camera.app;
18
19import android.util.SparseArray;
20import android.view.View;
21import android.view.View.OnClickListener;
22import android.view.ViewGroup;
23import android.widget.ImageButton;
24import android.widget.ProgressBar;
25import android.widget.TextView;
26
27import com.android.camera.debug.Log;
28import com.android.camera.widget.Cling;
29import com.android.camera2.R;
30
31/**
32 * Shows controls at the bottom of the screen for editing, viewing a photo
33 * sphere image and creating a tiny planet from a photo sphere image.
34 */
35class FilmstripBottomPanel implements CameraAppUI.BottomPanel {
36    private static final Log.Tag TAG = new Log.Tag("BottomPanel");
37
38    private final AppController mController;
39    private final ViewGroup mLayout;
40    private Listener mListener;
41    private final View mControlLayout;
42    private ImageButton mEditButton;
43    private ImageButton mViewButton;
44    private ImageButton mDeleteButton;
45    private ImageButton mShareButton;
46    private final View mMiddleFiller;
47    private View mProgressLayout;
48    private TextView mProgressText;
49    private View mProgressErrorLayout;
50    private TextView mProgressErrorText;
51    private ProgressBar mProgressBar;
52    private boolean mTinyPlanetEnabled;
53    private final SparseArray<Cling> mClingMap = new SparseArray<Cling>();
54
55    public FilmstripBottomPanel(AppController controller, ViewGroup bottomControlsLayout) {
56        mController = controller;
57        mLayout = bottomControlsLayout;
58        mMiddleFiller = mLayout.findViewById(R.id.filmstrip_bottom_control_middle_filler);
59        mControlLayout = mLayout.findViewById(R.id.bottom_control_panel);
60        setupEditButton();
61        setupViewButton();
62        setupDeleteButton();
63        setupShareButton();
64        setupProgressUi();
65    }
66
67    @Override
68    public void setListener(Listener listener) {
69        mListener = listener;
70    }
71
72    @Override
73    public void setClingForViewer(int viewerType, Cling cling) {
74        if (cling == null) {
75            Log.w(TAG, "Cannot set a null cling for viewer");
76            return;
77        }
78        mClingMap.put(viewerType, cling);
79        cling.setReferenceView(mViewButton);
80    }
81
82    @Override
83    public void clearClingForViewer(int viewerType) {
84        Cling cling = mClingMap.get(viewerType);
85        if (cling == null) {
86            Log.w(TAG, "Cling does not exist for the given viewer type: " + viewerType);
87        }
88        cling.setReferenceView(null);
89        mClingMap.remove(viewerType);
90    }
91
92    @Override
93    public Cling getClingForViewer(int viewerType) {
94        return mClingMap.get(viewerType);
95    }
96
97    @Override
98    public void setVisible(boolean visible) {
99        if (visible) {
100            mLayout.setVisibility(View.VISIBLE);
101        } else {
102            mLayout.setVisibility(View.INVISIBLE);
103            hideClings();
104        }
105    }
106
107    @Override
108    public void setEditButtonVisibility(boolean visible) {
109        mEditButton.setVisibility(visible ? View.VISIBLE : View.GONE);
110        updateMiddleFillerLayoutVisibility();
111    }
112
113    @Override
114    public void setEditEnabled(boolean enabled) {
115        mEditButton.setEnabled(enabled);
116    }
117
118    @Override
119    public void setViewerButtonVisibility(int state) {
120        if (state == VIEWER_NONE) {
121            mViewButton.setVisibility(View.GONE);
122            hideClings();
123
124        } else {
125            mViewButton.setImageResource(getViewButtonResource(state));
126            mViewButton.setVisibility(View.VISIBLE);
127            View cling = mClingMap.get(state);
128            if (cling != null) {
129                cling.setVisibility(View.VISIBLE);
130            }
131        }
132        updateMiddleFillerLayoutVisibility();
133    }
134
135    @Override
136    public void setViewEnabled(boolean enabled) {
137        mViewButton.setEnabled(enabled);
138    }
139
140    @Override
141    public void setTinyPlanetEnabled(boolean enabled) {
142        mTinyPlanetEnabled = enabled;
143    }
144
145    @Override
146    public void setDeleteButtonVisibility(boolean visible) {
147        mDeleteButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
148    }
149
150    @Override
151    public void setDeleteEnabled(boolean enabled) {
152        mDeleteButton.setEnabled(enabled);
153    }
154
155    @Override
156    public void setShareButtonVisibility(boolean visible) {
157        mShareButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
158    }
159
160    @Override
161    public void setShareEnabled(boolean enabled) {
162        mShareButton.setEnabled(enabled);
163    }
164
165    @Override
166    public void setProgressText(CharSequence text) {
167        mProgressText.setText(text);
168    }
169
170    @Override
171    public void setProgress(int progress) {
172        mProgressBar.setProgress(progress);
173    }
174
175    @Override
176    public void showProgressError(CharSequence message) {
177        hideControls();
178        hideProgress();
179        mProgressErrorLayout.setVisibility(View.VISIBLE);
180        mProgressErrorText.setText(message);
181    }
182
183    @Override
184    public void hideProgressError() {
185        mProgressErrorLayout.setVisibility(View.INVISIBLE);
186    }
187
188    @Override
189    public void showProgress() {
190        mProgressLayout.setVisibility(View.VISIBLE);
191        hideProgressError();
192    }
193
194    @Override
195    public void hideProgress() {
196        mProgressLayout.setVisibility(View.INVISIBLE);
197    }
198
199    @Override
200    public void showControls() {
201        mControlLayout.setVisibility(View.VISIBLE);
202    }
203
204    @Override
205    public void hideControls() {
206        mControlLayout.setVisibility(View.INVISIBLE);
207    }
208
209    /**
210     * Sets all the clings to be invisible.
211     */
212    private void hideClings() {
213        for (int i = 0; i < mClingMap.size(); i++) {
214            mClingMap.valueAt(i).setVisibility(View.INVISIBLE);
215        }
216    }
217
218    private int getViewButtonResource(int state) {
219        switch (state) {
220            case VIEWER_REFOCUS:
221                return R.drawable.ic_refocus_normal;
222            case VIEWER_PHOTO_SPHERE:
223                return R.drawable.ic_view_photosphere;
224            default:
225                return R.drawable.ic_control_play;
226        }
227    }
228
229    private void setupEditButton() {
230        mEditButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_edit);
231        mEditButton.setOnClickListener(new View.OnClickListener() {
232            @Override
233            public void onClick(View view) {
234                if (mTinyPlanetEnabled) {
235                    mController.openContextMenu(mEditButton);
236                } else if (mListener != null) {
237                    mListener.onEdit();
238                }
239            }
240        });
241        mController.registerForContextMenu(mEditButton);
242        mEditButton.setLongClickable(false);
243    }
244
245    private void setupViewButton() {
246        mViewButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_view);
247        mViewButton.setOnClickListener(new View.OnClickListener() {
248            @Override
249            public void onClick(View view) {
250                if (mListener != null) {
251                    mListener.onExternalViewer();
252                }
253            }
254        });
255    }
256
257    private void setupDeleteButton() {
258        mDeleteButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_delete);
259        mDeleteButton.setOnClickListener(new View.OnClickListener() {
260            @Override
261            public void onClick(View view) {
262                if (mListener != null) {
263                    mListener.onDelete();
264                }
265            }
266        });
267    }
268
269    private void setupShareButton() {
270        mShareButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_share);
271        mShareButton.setOnClickListener(new View.OnClickListener() {
272            @Override
273            public void onClick(View view) {
274                if (mListener != null) {
275                    mListener.onShare();
276                }
277            }
278        });
279    }
280
281    private void setupProgressUi() {
282        mProgressLayout = mLayout.findViewById(R.id.bottom_progress_panel);
283        mProgressText = (TextView) mLayout.findViewById(R.id.bottom_session_progress_text);
284        mProgressBar = (ProgressBar) mLayout.findViewById(R.id.bottom_session_progress_bar);
285        mProgressBar.setMax(100);
286        mProgressLayout.setVisibility(View.INVISIBLE);
287        mProgressErrorText = (TextView) mLayout.findViewById(R.id.bottom_progress_error_text);
288        mProgressErrorLayout = mLayout.findViewById(R.id.bottom_progress_error_panel);
289        mProgressErrorLayout.setOnClickListener(new OnClickListener() {
290            @Override
291            public void onClick(View v) {
292                if (mListener != null) {
293                    mListener.onProgressErrorClicked();
294                }
295            }
296        });
297    }
298
299    /**
300     * Updates the visibility of the middle filler view in the center. The
301     * middle filler view should be visible when edit button and viewer buttons
302     * are both visible.
303     */
304    private void updateMiddleFillerLayoutVisibility() {
305        if (mEditButton.getVisibility() == View.VISIBLE &&
306                mViewButton.getVisibility() == View.VISIBLE) {
307            mMiddleFiller.setVisibility(View.INVISIBLE);
308        } else {
309            mMiddleFiller.setVisibility(View.GONE);
310        }
311    }
312}
313