/*
|
* 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();
|
}
|
}
|
}
|