/* * Copyright (C) 2010 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.photoeditor; import android.app.Activity; 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; /** * Main activity of the photo editor that opens a photo and prepares tools for photo editing. */ public class PhotoEditor extends Activity { private static final String SAVE_URI_KEY = "save_uri"; private Uri sourceUri; private Uri saveUri; private FilterStack filterStack; private ActionBar actionBar; private EffectsBar effectsBar; @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(); } actionBar = (ActionBar) findViewById(R.id.action_bar); filterStack = new FilterStack((PhotoView) findViewById(R.id.photo_view), new FilterStack.StackListener() { @Override public void onStackChanged(boolean canUndo, boolean canRedo) { actionBar.updateButtons(canUndo, canRedo); } }, savedInstanceState); if (savedInstanceState != null) { saveUri = savedInstanceState.getParcelable(SAVE_URI_KEY); actionBar.updateSave(saveUri == null); } // Effects-bar is initially disabled until photo is successfully loaded. effectsBar = (EffectsBar) findViewById(R.id.effects_bar); effectsBar.initialize(filterStack); effectsBar.setEnabled(false); actionBar.setClickRunnable(R.id.undo_button, createUndoRedoRunnable(true)); actionBar.setClickRunnable(R.id.redo_button, createUndoRedoRunnable(false)); actionBar.setClickRunnable(R.id.save_button, createSaveRunnable()); actionBar.setClickRunnable(R.id.share_button, createShareRunnable()); actionBar.setClickRunnable(R.id.action_bar_back, createBackRunnable()); } private void openPhoto() { SpinnerProgressDialog.showDialog(); LoadScreennailTask.Callback callback = new LoadScreennailTask.Callback() { @Override public void onComplete(final Bitmap result) { filterStack.setPhotoSource(result, new OnDoneCallback() { @Override public void onDone() { SpinnerProgressDialog.dismissDialog(); effectsBar.setEnabled(result != null); } }); } }; new LoadScreennailTask(this, callback).execute(sourceUri); } private Runnable createUndoRedoRunnable(final boolean undo) { return new Runnable() { @Override public void run() { effectsBar.exit(new Runnable() { @Override public void run() { SpinnerProgressDialog.showDialog(); OnDoneCallback callback = new OnDoneCallback() { @Override public void onDone() { SpinnerProgressDialog.dismissDialog(); } }; if (undo) { filterStack.undo(callback); } else { filterStack.redo(callback); } } }); } }; } private Runnable createSaveRunnable() { return new Runnable() { @Override public void run() { effectsBar.exit(new Runnable() { @Override public void run() { SpinnerProgressDialog.showDialog(); filterStack.getOutputBitmap(new OnDoneBitmapCallback() { @Override public void onDone(Bitmap bitmap) { SaveCopyTask.Callback callback = new SaveCopyTask.Callback() { @Override public void onComplete(Uri result) { SpinnerProgressDialog.dismissDialog(); saveUri = result; actionBar.updateSave(saveUri == null); } }; new SaveCopyTask(PhotoEditor.this, sourceUri, callback).execute( bitmap); } }); } }); } }; } private Runnable createShareRunnable() { return new Runnable() { @Override public void run() { effectsBar.exit(new Runnable() { @Override public void run() { if (saveUri != null) { Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_STREAM, saveUri); intent.setType("image/*"); startActivity(intent); } } }); } }; } private Runnable createBackRunnable() { return new Runnable() { @Override public void run() { // Exit effects or go back to the previous activity on pressing back button. if (!effectsBar.exit(null)) { // Pop-up a dialog to save unsaved photo. if (actionBar.canSave()) { new YesNoCancelDialogBuilder(PhotoEditor.this, new Runnable() { @Override public void run() { actionBar.clickSave(); } }, new Runnable() { @Override public void run() { finish(); } }, R.string.save_photo).show(); } else { finish(); } } } }; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); filterStack.saveStacks(outState); outState.putParcelable(SAVE_URI_KEY, saveUri); } @Override public void onBackPressed() { actionBar.clickBack(); } @Override protected void onPause() { super.onPause(); filterStack.onPause(); // Dismiss any running progress dialog as all operations are paused. SpinnerProgressDialog.dismissDialog(); } @Override protected void onResume() { super.onResume(); filterStack.onResume(); openPhoto(); } }