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