summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/app/PhotoPageBottomControls.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/gallery3d/app/PhotoPageBottomControls.java')
-rw-r--r--src/com/android/gallery3d/app/PhotoPageBottomControls.java137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/com/android/gallery3d/app/PhotoPageBottomControls.java b/src/com/android/gallery3d/app/PhotoPageBottomControls.java
new file mode 100644
index 000000000..24b8ceb7e
--- /dev/null
+++ b/src/com/android/gallery3d/app/PhotoPageBottomControls.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2012 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.gallery3d.app;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.widget.RelativeLayout;
+
+import com.android.gallery3d.R;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class PhotoPageBottomControls implements OnClickListener {
+ public interface Delegate {
+ public boolean canDisplayBottomControls();
+ public boolean canDisplayBottomControl(int control);
+ public void onBottomControlClicked(int control);
+ public void refreshBottomControlsWhenReady();
+ }
+
+ private Delegate mDelegate;
+ private ViewGroup mParentLayout;
+ private ViewGroup mContainer;
+
+ private boolean mContainerVisible = false;
+ private Map<View, Boolean> mControlsVisible = new HashMap<View, Boolean>();
+
+ private Animation mContainerAnimIn = new AlphaAnimation(0f, 1f);
+ private Animation mContainerAnimOut = new AlphaAnimation(1f, 0f);
+ private static final int CONTAINER_ANIM_DURATION_MS = 200;
+
+ private static final int CONTROL_ANIM_DURATION_MS = 150;
+ private static Animation getControlAnimForVisibility(boolean visible) {
+ Animation anim = visible ? new AlphaAnimation(0f, 1f)
+ : new AlphaAnimation(1f, 0f);
+ anim.setDuration(CONTROL_ANIM_DURATION_MS);
+ return anim;
+ }
+
+ public PhotoPageBottomControls(Delegate delegate, Context context, RelativeLayout layout) {
+ mDelegate = delegate;
+ mParentLayout = layout;
+
+ LayoutInflater inflater = (LayoutInflater) context
+ .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ mContainer = (ViewGroup) inflater
+ .inflate(R.layout.photopage_bottom_controls, mParentLayout, false);
+ mParentLayout.addView(mContainer);
+
+ for (int i = mContainer.getChildCount() - 1; i >= 0; i--) {
+ View child = mContainer.getChildAt(i);
+ child.setOnClickListener(this);
+ mControlsVisible.put(child, false);
+ }
+
+ mContainerAnimIn.setDuration(CONTAINER_ANIM_DURATION_MS);
+ mContainerAnimOut.setDuration(CONTAINER_ANIM_DURATION_MS);
+
+ mDelegate.refreshBottomControlsWhenReady();
+ }
+
+ private void hide() {
+ mContainer.clearAnimation();
+ mContainerAnimOut.reset();
+ mContainer.startAnimation(mContainerAnimOut);
+ mContainer.setVisibility(View.INVISIBLE);
+ }
+
+ private void show() {
+ mContainer.clearAnimation();
+ mContainerAnimIn.reset();
+ mContainer.startAnimation(mContainerAnimIn);
+ mContainer.setVisibility(View.VISIBLE);
+ }
+
+ public void refresh() {
+ boolean visible = mDelegate.canDisplayBottomControls();
+ boolean containerVisibilityChanged = (visible != mContainerVisible);
+ if (containerVisibilityChanged) {
+ if (visible) {
+ show();
+ } else {
+ hide();
+ }
+ mContainerVisible = visible;
+ }
+ if (!mContainerVisible) {
+ return;
+ }
+ for (View control : mControlsVisible.keySet()) {
+ Boolean prevVisibility = mControlsVisible.get(control);
+ boolean curVisibility = mDelegate.canDisplayBottomControl(control.getId());
+ if (prevVisibility.booleanValue() != curVisibility) {
+ if (!containerVisibilityChanged) {
+ control.clearAnimation();
+ control.startAnimation(getControlAnimForVisibility(curVisibility));
+ }
+ control.setVisibility(curVisibility ? View.VISIBLE : View.INVISIBLE);
+ mControlsVisible.put(control, curVisibility);
+ }
+ }
+ // Force a layout change
+ mContainer.requestLayout(); // Kick framework to draw the control.
+ }
+
+ public void cleanup() {
+ mParentLayout.removeView(mContainer);
+ mControlsVisible.clear();
+ }
+
+ @Override
+ public void onClick(View view) {
+ if (mContainerVisible && mControlsVisible.get(view).booleanValue()) {
+ mDelegate.onBottomControlClicked(view.getId());
+ }
+ }
+}