blob: 018476c18ef1f9f852f178b03bfc4e4d3ef723c7 [file] [log] [blame]
/*
* 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();
}
}
}