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