blob: 9363585bbff7a51d379d478c76808593b01211f3 [file] [log] [blame]
/*
* 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);
}
}