PhotoEditor.java revision 0f8a40e4cfdc5f6cd47c22e81f69ed0446067c54
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.photoeditor; 18 19import java.io.IOException; 20import java.io.InputStream; 21 22import com.android.photoeditor.filters.ImageUtils; 23 24import android.app.Activity; 25import android.app.AlertDialog; 26import android.content.DialogInterface; 27import android.content.Intent; 28import android.content.res.Resources; 29import android.os.Bundle; 30import android.view.View; 31 32/** 33 * Main activity of the photo editor. 34 */ 35public class PhotoEditor extends Activity { 36 37 private Toolbar toolbar; 38 private View backButton; 39 40 @Override 41 public void onCreate(Bundle savedInstanceState) { 42 super.onCreate(savedInstanceState); 43 setContentView(R.layout.main); 44 { 45 // HACK: create faked view in order to read bitcode in resource 46 View view = new View(getApplication()); 47 byte[] pgm; 48 int pgmLength; 49 50 // read bitcode in res 51 InputStream is = view.getResources().openRawResource(R.raw.libjni_photoeditor_portable); 52 try { 53 try { 54 pgm = new byte[1024]; 55 pgmLength = 0; 56 57 while(true) { 58 int bytesLeft = pgm.length - pgmLength; 59 if (bytesLeft == 0) { 60 byte[] buf2 = new byte[pgm.length * 2]; 61 System.arraycopy(pgm, 0, buf2, 0, pgm.length); 62 pgm = buf2; 63 bytesLeft = pgm.length - pgmLength; 64 } 65 int bytesRead = is.read(pgm, pgmLength, bytesLeft); 66 if (bytesRead <= 0) { 67 break; 68 } 69 pgmLength += bytesRead; 70 } 71 ImageUtils.init(pgm, pgmLength); 72 } finally { 73 is.close(); 74 } 75 } catch(IOException e) { 76 throw new Resources.NotFoundException(); 77 } 78 } 79 80 toolbar = (Toolbar) findViewById(R.id.toolbar); 81 toolbar.initialize(); 82 83 final EffectsBar effectsBar = (EffectsBar) findViewById(R.id.effects_bar); 84 final View actionBar = findViewById(R.id.action_bar); 85 final View quickviewOn = findViewById(R.id.quickview_on_button); 86 backButton = findViewById(R.id.action_bar_back); 87 backButton.setOnClickListener(new View.OnClickListener() { 88 89 @Override 90 public void onClick(View v) { 91 if (actionBar.isEnabled()) { 92 if (quickviewOn.getVisibility() == View.VISIBLE) { 93 quickviewOn.performClick(); 94 } else if (effectsBar.hasEffectOn()) { 95 effectsBar.effectsOff(null); 96 } else { 97 tryRun(new Runnable() { 98 99 @Override 100 public void run() { 101 finish(); 102 } 103 }); 104 } 105 } 106 } 107 }); 108 109 Intent intent = getIntent(); 110 if (Intent.ACTION_EDIT.equalsIgnoreCase(intent.getAction()) && (intent.getData() != null)) { 111 toolbar.openPhoto(intent.getData()); 112 } 113 } 114 115 private void tryRun(final Runnable runnable) { 116 if (findViewById(R.id.save_button).isEnabled()) { 117 // Pop-up a dialog before executing the runnable to save unsaved photo. 118 AlertDialog.Builder builder = new AlertDialog.Builder(this) 119 .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { 120 121 @Override 122 public void onClick(DialogInterface dialog, int which) { 123 toolbar.savePhoto(new Runnable() { 124 125 @Override 126 public void run() { 127 runnable.run(); 128 } 129 }); 130 } 131 }) 132 .setNeutralButton(R.string.no, new DialogInterface.OnClickListener() { 133 134 @Override 135 public void onClick(DialogInterface dialog, int which) { 136 runnable.run(); 137 } 138 }) 139 .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 140 141 @Override 142 public void onClick(DialogInterface dialog, int which) { 143 // no-op 144 } 145 }); 146 builder.setMessage(R.string.save_photo).show(); 147 return; 148 } 149 150 runnable.run(); 151 } 152 153 @Override 154 public void onBackPressed() { 155 backButton.performClick(); 156 } 157} 158