Index: platform_tools/android/apps/canvasproof/src/main/java/org/skia/canvasproof/CanvasProofActivity.java |
diff --git a/platform_tools/android/apps/canvasproof/src/main/java/org/skia/canvasproof/CanvasProofActivity.java b/platform_tools/android/apps/canvasproof/src/main/java/org/skia/canvasproof/CanvasProofActivity.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9363585bbff7a51d379d478c76808593b01211f3 |
--- /dev/null |
+++ b/platform_tools/android/apps/canvasproof/src/main/java/org/skia/canvasproof/CanvasProofActivity.java |
@@ -0,0 +1,205 @@ |
+/* |
+ * Copyright 2015 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+package org.skia.canvasproof; |
+ |
+import android.app.Activity; |
+import android.content.res.AssetManager; |
+import android.graphics.Picture; |
+import android.opengl.GLSurfaceView; |
+import android.os.Bundle; |
+import android.util.Log; |
+import android.view.Gravity; |
+import android.view.MotionEvent; |
+import android.view.View; |
+import android.widget.LinearLayout.LayoutParams; |
+import android.widget.LinearLayout; |
+import java.io.File; |
+import java.io.IOException; |
+import java.io.InputStream; |
+ |
+public class CanvasProofActivity extends Activity { |
+ private static final String TAG = "CanvasProofActivity"; |
+ private GaneshPictureRenderer ganeshPictureRenderer; |
+ private HwuiPictureView hwuiPictureView; |
+ private GLSurfaceView ganeshPictureView; |
+ private LinearLayout splitPaneView; |
+ private View currentView; |
+ private float x, y; |
+ private int resourcesIndex; |
+ private class PictureAsset { |
+ public String path; |
+ public long ptr; |
+ public Picture picture; |
+ }; |
+ private PictureAsset[] assets; |
+ |
+ @SuppressWarnings("deprecation") // purposely using this |
+ private static Picture ReadPicture(InputStream inputStream) |
+ throws IOException { |
+ Picture p = null; |
+ try { |
+ p = Picture.createFromStream(inputStream); |
+ } catch (java.lang.Exception e) { |
+ Log.e(TAG, "Exception in Picture.createFromStream", e); |
+ } |
+ inputStream.close(); |
+ return p; |
+ } |
+ |
+ private void getAssetPaths() { |
+ String directory = "skps"; |
+ AssetManager mgr = this.getAssets(); |
+ assert (mgr != null); |
+ String[] resources; |
+ try { |
+ resources = mgr.list(directory); |
+ } catch (IOException e) { |
+ Log.e(TAG, "IOException in getAssetPaths", e); |
+ return; |
+ } |
+ if (resources == null || resources.length == 0) { |
+ Log.e(TAG, "SKP assets should be packaged in " + |
+ ".../apps/canvasproof/src/main/assets/skps/" + |
+ ", but none were found."); |
+ return; |
+ } |
+ CreateSkiaPicture.init(); |
+ this.assets = new PictureAsset[resources.length]; |
+ for (int i = 0; i < resources.length; ++i) { |
+ String path = directory + File.separator + resources[i]; |
+ this.assets[i] = new PictureAsset(); |
+ this.assets[i].path = path; |
+ try { |
+ this.assets[i].ptr = CreateSkiaPicture.create(mgr.open(path)); |
+ if (0 == this.assets[i].ptr) { |
+ Log.e(TAG, "CreateSkiaPicture.create returned 0 " + path); |
+ } |
+ Picture p = CanvasProofActivity.ReadPicture(mgr.open(path)); |
+ if (null == p) { |
+ Log.e(TAG, "CanvasProofActivity.ReadPicture.create " + |
+ "returned null " + path); |
+ } else if (0 == p.getHeight() || 0 == p.getWidth()) { |
+ Log.e(TAG, "CanvasProofActivity.ReadPicture.create " + |
+ "empty picture" + path); |
+ p = null; |
+ } |
+ this.assets[i].picture = p; |
+ } catch (IOException e) { |
+ Log.e(TAG, "IOException in getAssetPaths " + path + e); |
+ return; |
+ } |
+ } |
+ } |
+ |
+ private void nextView() { |
+ if (this.currentView == this.hwuiPictureView) { |
+ this.currentView = this.ganeshPictureView; |
+ this.ganeshPictureView.setRenderMode( |
+ GLSurfaceView.RENDERMODE_CONTINUOUSLY); |
+ } else if (this.currentView == null || |
+ this.currentView == this.ganeshPictureView) { |
+ this.setContentView(new View(this)); |
+ LayoutParams layoutParams = |
+ new LayoutParams( |
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 0.5f); |
+ this.ganeshPictureView.setLayoutParams(layoutParams); |
+ this.ganeshPictureView.setRenderMode( |
+ GLSurfaceView.RENDERMODE_WHEN_DIRTY); |
+ this.splitPaneView.addView(this.ganeshPictureView); |
+ this.hwuiPictureView.setLayoutParams(layoutParams); |
+ this.splitPaneView.addView(this.hwuiPictureView); |
+ this.currentView = this.splitPaneView; |
+ this.hwuiPictureView.fullTime = false; |
+ } else if (this.currentView == this.splitPaneView) { |
+ this.splitPaneView.removeAllViews(); |
+ this.currentView = this.hwuiPictureView; |
+ this.hwuiPictureView.fullTime = true; |
+ } else { |
+ Log.e(TAG, "unexpected value"); |
+ this.setContentView(null); |
+ return; |
+ } |
+ this.setContentView(this.currentView); |
+ this.currentView.invalidate(); |
+ } |
+ |
+ private void nextPicture(int d) { |
+ if (this.assets == null) { |
+ Log.w(TAG, "this.assets == null"); |
+ return; |
+ } |
+ assert (this.assets.length > 0); |
+ resourcesIndex = (resourcesIndex + d) % this.assets.length; |
+ while (resourcesIndex < 0) { |
+ resourcesIndex += this.assets.length; |
+ } |
+ while (resourcesIndex >= this.assets.length) { |
+ resourcesIndex -= this.assets.length; |
+ } |
+ this.ganeshPictureRenderer.setPicture(assets[resourcesIndex].ptr); |
+ this.hwuiPictureView.setPicture(assets[resourcesIndex].picture); |
+ this.currentView.invalidate(); |
+ } |
+ |
+ @Override |
+ protected void onStop() { |
+ this.ganeshPictureRenderer.releaseResources(); |
+ super.onStop(); |
+ } |
+ |
+ @Override |
+ protected void onCreate(Bundle savedInstanceState) { |
+ super.onCreate(savedInstanceState); |
+ |
+ this.getAssetPaths(); |
+ this.ganeshPictureRenderer = new GaneshPictureRenderer(); |
+ this.hwuiPictureView = new HwuiPictureView(this); |
+ |
+ this.ganeshPictureRenderer.setScale(2.0f); |
+ this.hwuiPictureView.setScale(2.0f); |
+ this.ganeshPictureView = ganeshPictureRenderer.makeView(this); |
+ this.splitPaneView = new LinearLayout(this); |
+ this.splitPaneView.setOrientation(LinearLayout.VERTICAL); |
+ this.splitPaneView.setGravity(Gravity.FILL); |
+ |
+ LayoutParams layoutParams = |
+ new LayoutParams( |
+ LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 0.5f); |
+ this.ganeshPictureView.setLayoutParams(layoutParams); |
+ this.hwuiPictureView.setLayoutParams(layoutParams); |
+ |
+ this.nextView(); |
+ this.nextPicture(0); |
+ } |
+ |
+ // TODO: replace this funtion with onTouchEvent(). |
+ // @Override public boolean onTouchEvent(MotionEvent event)... |
+ @Override |
+ public boolean dispatchTouchEvent (MotionEvent event) { |
+ switch(event.getAction()) { |
+ case MotionEvent.ACTION_DOWN: |
+ this.x = event.getX(); |
+ this.y = event.getY(); |
+ break; |
+ case MotionEvent.ACTION_UP: |
+ float dx = event.getX() - this.x; |
+ float dy = event.getY() - this.y; |
+ float dx2 = dx * dx; |
+ float dy2 = dy * dy; |
+ if (dx2 + dy2 > 22500.0) { |
+ if (dy2 < dx2) { |
+ this.nextPicture(dx > 0 ? 1 : -1); |
+ } else if (dy > 0) { |
+ this.nextView(); |
+ } |
+ } |
+ break; |
+ } |
+ return super.onTouchEvent(event); |
+ } |
+} |