diff options
author | Yuli Huang <yuli@google.com> | 2012-03-07 01:18:08 +0800 |
---|---|---|
committer | Yuli Huang <yuli@google.com> | 2012-03-07 01:18:08 +0800 |
commit | 88b29bb8922b26ec060dafcebaef199b4d82cf5c (patch) | |
tree | dbca47b02e9ad9d9efd74a19785f564df8d68bf9 /src/com/android/gallery3d/photoeditor | |
parent | 6696043a3f116eaad983822a7f077e4d6a106ee0 (diff) | |
download | android_packages_apps_Snap-88b29bb8922b26ec060dafcebaef199b4d82cf5c.tar.gz android_packages_apps_Snap-88b29bb8922b26ec060dafcebaef199b4d82cf5c.tar.bz2 android_packages_apps_Snap-88b29bb8922b26ec060dafcebaef199b4d82cf5c.zip |
Fix b/5885342: Multiple PhotoEditor activities cause exceptions.
Avoid using a static variable to keep tracking views across activities.
Change-Id: Ia53444502d476d37b64344e5aea5f58a06ee3b03
Diffstat (limited to 'src/com/android/gallery3d/photoeditor')
4 files changed, 62 insertions, 49 deletions
diff --git a/src/com/android/gallery3d/photoeditor/EffectsBar.java b/src/com/android/gallery3d/photoeditor/EffectsBar.java index de47159a3..ccf684a4c 100644 --- a/src/com/android/gallery3d/photoeditor/EffectsBar.java +++ b/src/com/android/gallery3d/photoeditor/EffectsBar.java @@ -116,7 +116,7 @@ public class EffectsBar extends LinearLayout { private boolean exitActiveEffect(final Runnable runnableOnDone) { if (activeEffect != null) { - SpinnerProgressDialog.showDialog(); + SpinnerProgressDialog.showDialog((Toolbar) getRootView().findViewById(R.id.toolbar)); activeEffect.end(new Runnable() { @Override diff --git a/src/com/android/gallery3d/photoeditor/PhotoEditor.java b/src/com/android/gallery3d/photoeditor/PhotoEditor.java index 8f3990b5e..c5b16b83c 100644 --- a/src/com/android/gallery3d/photoeditor/PhotoEditor.java +++ b/src/com/android/gallery3d/photoeditor/PhotoEditor.java @@ -21,7 +21,6 @@ import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; -import android.view.ViewGroup; import com.android.gallery3d.R; @@ -37,18 +36,19 @@ public class PhotoEditor extends Activity { private FilterStack filterStack; private ActionBar actionBar; private EffectsBar effectsBar; + private Toolbar toolbar; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.photoeditor_main); - SpinnerProgressDialog.initialize((ViewGroup) findViewById(R.id.toolbar)); Intent intent = getIntent(); if (Intent.ACTION_EDIT.equalsIgnoreCase(intent.getAction())) { sourceUri = intent.getData(); } + toolbar = (Toolbar) findViewById(R.id.toolbar); actionBar = (ActionBar) findViewById(R.id.action_bar); filterStack = new FilterStack((PhotoView) findViewById(R.id.photo_view), new FilterStack.StackListener() { @@ -76,7 +76,7 @@ public class PhotoEditor extends Activity { } private void openPhoto() { - SpinnerProgressDialog.showDialog(); + SpinnerProgressDialog.showDialog(toolbar); LoadScreennailTask.Callback callback = new LoadScreennailTask.Callback() { @Override @@ -103,7 +103,7 @@ public class PhotoEditor extends Activity { @Override public void run() { - SpinnerProgressDialog.showDialog(); + SpinnerProgressDialog.showDialog(toolbar); OnDoneCallback callback = new OnDoneCallback() { @Override @@ -131,7 +131,7 @@ public class PhotoEditor extends Activity { @Override public void run() { - SpinnerProgressDialog.showDialog(); + SpinnerProgressDialog.showDialog(toolbar); filterStack.getOutputBitmap(new OnDoneBitmapCallback() { @Override diff --git a/src/com/android/gallery3d/photoeditor/SpinnerProgressDialog.java b/src/com/android/gallery3d/photoeditor/SpinnerProgressDialog.java index 065075e52..108c17d50 100644 --- a/src/com/android/gallery3d/photoeditor/SpinnerProgressDialog.java +++ b/src/com/android/gallery3d/photoeditor/SpinnerProgressDialog.java @@ -19,7 +19,6 @@ package com.android.gallery3d.photoeditor; import android.app.Dialog; import android.view.MotionEvent; import android.view.View; -import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ProgressBar; @@ -34,46 +33,52 @@ import java.util.ArrayList; */ public class SpinnerProgressDialog extends Dialog { - private static ViewGroup toolbar; private static SpinnerProgressDialog dialog; + private final Toolbar toolbar; private final ArrayList<View> enabledTools = new ArrayList<View>(); - public static void initialize(ViewGroup toolbar) { - SpinnerProgressDialog.toolbar = toolbar; - } - - public static void showDialog() { + public static void showDialog(Toolbar toolbar) { // There should be only one progress dialog running at a time. if (dialog == null) { - dialog = new SpinnerProgressDialog(); - dialog.setCancelable(false); + dialog = new SpinnerProgressDialog(toolbar); dialog.show(); - // Disable enabled tools when showing spinner progress dialog. - for (int i = 0; i < toolbar.getChildCount(); i++) { - View view = toolbar.getChildAt(i); - if (view.isEnabled()) { - dialog.enabledTools.add(view); - view.setEnabled(false); - } - } } } public static void dismissDialog() { if (dialog != null) { dialog.dismiss(); - // Enable tools that were disabled by this spinner progress dialog. - for (View view : dialog.enabledTools) { - view.setEnabled(true); - } dialog = null; } } - private SpinnerProgressDialog() { + private SpinnerProgressDialog(Toolbar toolbar) { super(toolbar.getContext(), R.style.SpinnerProgressDialog); addContentView(new ProgressBar(toolbar.getContext()), new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); + setCancelable(false); + this.toolbar = toolbar; + } + + @Override + public void show() { + super.show(); + // Disable enabled tools when showing spinner progress dialog. + for (View view : toolbar.getTools()) { + if (view.isEnabled()) { + enabledTools.add(view); + view.setEnabled(false); + } + } + } + + @Override + public void dismiss() { + super.dismiss(); + // Enable tools that were disabled by this spinner progress dialog. + for (View view : enabledTools) { + view.setEnabled(true); + } } @Override diff --git a/src/com/android/gallery3d/photoeditor/Toolbar.java b/src/com/android/gallery3d/photoeditor/Toolbar.java index 45ec016bb..777a1aa54 100644 --- a/src/com/android/gallery3d/photoeditor/Toolbar.java +++ b/src/com/android/gallery3d/photoeditor/Toolbar.java @@ -22,6 +22,7 @@ import android.os.Message; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; +import android.view.ViewGroup.OnHierarchyChangeListener; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.RelativeLayout; @@ -34,36 +35,55 @@ import java.util.List; /** * Toolbar that contains all tools and controls their idle/awake behaviors from UI thread. */ -public class Toolbar extends RelativeLayout { +public class Toolbar extends RelativeLayout implements OnHierarchyChangeListener { private final ToolbarIdleHandler idleHandler; + private final List<View> tools = new ArrayList<View>(); public Toolbar(Context context, AttributeSet attrs) { super(context, attrs); - idleHandler = new ToolbarIdleHandler(context); - setOnHierarchyChangeListener(idleHandler); + setOnHierarchyChangeListener(this); + idleHandler = new ToolbarIdleHandler(this); idleHandler.killIdle(); } @Override + public void onChildViewAdded(View parent, View child) { + // Photo-view isn't treated as a tool that responds to user events. + if (child.getId() != R.id.photo_view) { + tools.add(child); + } + } + + @Override + public void onChildViewRemoved(View parent, View child) { + tools.remove(child); + } + + public List<View> getTools() { + return tools; + } + + @Override public boolean dispatchTouchEvent(MotionEvent ev) { idleHandler.killIdle(); return super.dispatchTouchEvent(ev); } - private static class ToolbarIdleHandler implements OnHierarchyChangeListener { + private static class ToolbarIdleHandler { private static final int MAKE_IDLE = 1; private static final int TIMEOUT_IDLE = 8000; - private final List<View> childViews = new ArrayList<View>(); + private final List<View> tools; private final Handler mainHandler; private final Animation fadeIn; private final Animation fadeOut; private boolean idle; - public ToolbarIdleHandler(Context context) { + public ToolbarIdleHandler(Toolbar toolbar) { + tools = toolbar.getTools(); mainHandler = new Handler() { @Override @@ -72,7 +92,7 @@ public class Toolbar extends RelativeLayout { case MAKE_IDLE: if (!idle) { idle = true; - for (View view : childViews) { + for (View view : tools) { view.startAnimation(fadeOut); } } @@ -81,6 +101,7 @@ public class Toolbar extends RelativeLayout { } }; + Context context = toolbar.getContext(); fadeIn = AnimationUtils.loadAnimation(context, R.anim.photoeditor_fade_in); fadeOut = AnimationUtils.loadAnimation(context, R.anim.photoeditor_fade_out); } @@ -89,24 +110,11 @@ public class Toolbar extends RelativeLayout { mainHandler.removeMessages(MAKE_IDLE); if (idle) { idle = false; - for (View view : childViews) { + for (View view : tools) { view.startAnimation(fadeIn); } } mainHandler.sendEmptyMessageDelayed(MAKE_IDLE, TIMEOUT_IDLE); } - - @Override - public void onChildViewAdded(View parent, View child) { - // All child views, except photo-view, will fade out on inactivity timeout. - if (child.getId() != R.id.photo_view) { - childViews.add(child); - } - } - - @Override - public void onChildViewRemoved(View parent, View child) { - childViews.remove(child); - } } } |