/* * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.camera.app; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.TextView; import com.android.camera.util.Gusterpolator; import com.android.camera.widget.Cling; import com.android.camera.widget.ExternalViewerButton; import com.android.camera2.R; /** * Shows controls at the bottom of the screen for editing, viewing a photo * sphere image and creating a tiny planet from a photo sphere image. */ class FilmstripBottomPanel implements CameraAppUI.BottomPanel { private static final int ANIM_DURATION = 150; private final AppController mController; private final ViewGroup mLayout; private Listener mListener; private final View mControlLayout; private ImageButton mEditButton; private ExternalViewerButton mViewButton; private ImageButton mDeleteButton; private ImageButton mShareButton; private final View mMiddleFiller; private View mProgressLayout; private TextView mProgressText; private View mProgressErrorLayout; private TextView mProgressErrorText; private ProgressBar mProgressBar; private boolean mTinyPlanetEnabled; public FilmstripBottomPanel(AppController controller, ViewGroup bottomControlsLayout) { mController = controller; mLayout = bottomControlsLayout; mMiddleFiller = mLayout.findViewById(R.id.filmstrip_bottom_control_middle_filler); mControlLayout = mLayout.findViewById(R.id.bottom_control_panel); setupEditButton(); setupViewButton(); setupDeleteButton(); setupShareButton(); setupProgressUi(); } @Override public void setListener(Listener listener) { mListener = listener; } @Override public void setClingForViewer(int viewerType, Cling cling) { mViewButton.setClingForViewer(viewerType, cling); } @Override public void clearClingForViewer(int viewerType) { mViewButton.clearClingForViewer(viewerType); } @Override public Cling getClingForViewer(int viewerType) { return mViewButton.getClingForViewer(viewerType); } @Override public void setVisible(boolean visible) { if (visible) { mLayout.setVisibility(View.VISIBLE); } else { mLayout.setVisibility(View.INVISIBLE); } } @Override public void setEditButtonVisibility(boolean visible) { mEditButton.setVisibility(visible ? View.VISIBLE : View.GONE); updateMiddleFillerLayoutVisibility(); } @Override public void setEditEnabled(boolean enabled) { mEditButton.setEnabled(enabled); } @Override public void setViewerButtonVisibility(int state) { mViewButton.setState(state); updateMiddleFillerLayoutVisibility(); } @Override public void setViewEnabled(boolean enabled) { mViewButton.setEnabled(enabled); } @Override public void setTinyPlanetEnabled(boolean enabled) { mTinyPlanetEnabled = enabled; } @Override public void setDeleteButtonVisibility(boolean visible) { mDeleteButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); } @Override public void setDeleteEnabled(boolean enabled) { mDeleteButton.setEnabled(enabled); } @Override public void setShareButtonVisibility(boolean visible) { mShareButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); } @Override public void setShareEnabled(boolean enabled) { mShareButton.setEnabled(enabled); } @Override public void setProgressText(CharSequence text) { mProgressText.setText(text); } @Override public void setProgress(int progress) { mProgressBar.setProgress(progress); } @Override public void showProgressError(CharSequence message) { hideControls(); hideProgress(); mProgressErrorLayout.setVisibility(View.VISIBLE); mProgressErrorText.setText(message); } @Override public void hideProgressError() { mProgressErrorLayout.setVisibility(View.INVISIBLE); } @Override public void showProgress() { mProgressLayout.setVisibility(View.VISIBLE); hideProgressError(); } @Override public void hideProgress() { mProgressLayout.setVisibility(View.INVISIBLE); } @Override public void showControls() { mControlLayout.setVisibility(View.VISIBLE); } @Override public void hideControls() { mControlLayout.setVisibility(View.INVISIBLE); } private void setupEditButton() { mEditButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_edit); mEditButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mTinyPlanetEnabled) { mController.openContextMenu(mEditButton); } else if (mListener != null) { mListener.onEdit(); } } }); mController.registerForContextMenu(mEditButton); mEditButton.setLongClickable(false); } private void setupViewButton() { mViewButton = (ExternalViewerButton) mLayout.findViewById( R.id.filmstrip_bottom_control_view); mViewButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { mListener.onExternalViewer(); } } }); } private void setupDeleteButton() { mDeleteButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_delete); mDeleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { mListener.onDelete(); } } }); } private void setupShareButton() { mShareButton = (ImageButton) mLayout.findViewById(R.id.filmstrip_bottom_control_share); mShareButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (mListener != null) { mListener.onShare(); } } }); } private void setupProgressUi() { mProgressLayout = mLayout.findViewById(R.id.bottom_progress_panel); mProgressText = (TextView) mLayout.findViewById(R.id.bottom_session_progress_text); mProgressBar = (ProgressBar) mLayout.findViewById(R.id.bottom_session_progress_bar); mProgressBar.setMax(100); mProgressLayout.setVisibility(View.INVISIBLE); mProgressErrorText = (TextView) mLayout.findViewById(R.id.bottom_progress_error_text); mProgressErrorLayout = mLayout.findViewById(R.id.bottom_progress_error_panel); mProgressErrorLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mListener != null) { mListener.onProgressErrorClicked(); } } }); } /** * Updates the visibility of the middle filler view in the center. The * middle filler view should be visible when edit button and viewer buttons * are both visible. */ private void updateMiddleFillerLayoutVisibility() { if (mEditButton.getVisibility() == View.VISIBLE && mViewButton.getVisibility() == View.VISIBLE) { mMiddleFiller.setVisibility(View.INVISIBLE); } else { mMiddleFiller.setVisibility(View.GONE); } } public void show() { ObjectAnimator animator = ObjectAnimator .ofFloat(mLayout, "translationY", mLayout.getHeight(), 0.0f); animator.setDuration(ANIM_DURATION); animator.setInterpolator(Gusterpolator.INSTANCE); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { mViewButton.updateClingVisibility(); } }); mViewButton.hideClings(); animator.start(); } public void hide() { int offset = mLayout.getHeight(); if (mLayout.getTranslationY() < offset) { ObjectAnimator animator = ObjectAnimator .ofFloat(mLayout, "translationY", mLayout.getTranslationY(), offset); animator.setDuration(ANIM_DURATION); animator.setInterpolator(Gusterpolator.INSTANCE); mViewButton.hideClings(); animator.start(); } } }