[androidkit] change main activity to be like practical app

Change-Id: Ic12e95eb09ebb40928ba64a26e480a0078bd13c2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/410976
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Jorge Betancourt <jmbetancourt@google.com>
diff --git a/platform_tools/android/apps/androidkitdemo/src/main/java/org/skia/androidkitdemo1/MainActivity.java b/platform_tools/android/apps/androidkitdemo/src/main/java/org/skia/androidkitdemo1/MainActivity.java
index 21697e5..fedad04 100644
--- a/platform_tools/android/apps/androidkitdemo/src/main/java/org/skia/androidkitdemo1/MainActivity.java
+++ b/platform_tools/android/apps/androidkitdemo/src/main/java/org/skia/androidkitdemo1/MainActivity.java
@@ -9,16 +9,20 @@
 
 import android.app.Activity;
 import android.graphics.Bitmap;
+import android.graphics.SurfaceTexture;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.util.Log;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
+import android.view.TextureView;
 import android.widget.ImageView;
 import org.skia.androidkit.*;
+import org.skia.androidkit.util.SurfaceRenderer;
 
-public class MainActivity extends Activity implements SurfaceHolder.Callback {
-    public Surface surfaceSurface;
+public class MainActivity extends Activity {
+    private ImageView bitmapImage;
+    private Surface threadedSurface;
 
     static {
         System.loadLibrary("androidkit");
@@ -32,7 +36,11 @@
         Paint p = new Paint();
         p.setColor(new Color(0, 1, 0, 1));
 
-        // Bitmap
+        /*
+         * Draw into a Java Bitmap through software using Skia's native API.
+         * Load the Bitmap into an ImageView.
+         * Applies Matrix transformations to canvas
+         */
         Bitmap.Config conf = Bitmap.Config.ARGB_8888;
         Bitmap bmp = Bitmap.createBitmap(400, 400, conf);
         Surface bitmapSurface = new Surface(bmp);
@@ -41,9 +49,9 @@
         canvas.drawRect(0, 0, 100, 100, p);
 
         float[] m = {1, 0, 0, 100,
-                     0, 1, 0, 100,
-                     0, 0, 1,   0,
-                     0, 0, 0,   1};
+                0, 1, 0, 100,
+                0, 0, 1, 0,
+                0, 0, 0, 1};
         p.setColor(new Color(0, 0, 1, 1));
         canvas.save();
         canvas.concat(m);
@@ -61,28 +69,76 @@
         } catch (Exception e) {
             Log.e("AndroidKit Demo", "Could not load Image resource: " + R.raw.brickwork_texture);
         }
+        bitmapImage = findViewById(R.id.bitmapImage);
+        bitmapImage.setImageBitmap(bmp);
 
-        ImageView image = findViewById(R.id.image);
-        image.setImageBitmap(bmp);
+        /*
+         * Draw into a SurfaceView's surface with GL
+         * The ThreadedSurface is handled by AndroidKit through native code
+         */
+        SurfaceView surfaceView = findViewById(R.id.threadedSurface);
+        surfaceView.getHolder().addCallback(new ThreadedSurfaceHandler());
 
-        //Surface
-        SurfaceView surfaceView = findViewById(R.id.surface);
-        surfaceView.getHolder().addCallback(this);
+        /*
+         * Draw into a SurfaceView's surface with GL
+         * The thread is handled using a util RenderThread provided by AndroidKit
+         */
+        SurfaceView runtimeEffectView = findViewById(R.id.runtimeEffect);
+        runtimeEffectView.getHolder().addCallback(new DemoRuntimeShaderRenderer());
     }
 
-    @Override
-    public void surfaceCreated(@NonNull SurfaceHolder holder) {
+    private class ThreadedSurfaceHandler implements SurfaceHolder.Callback {
+        @Override
+        public void surfaceCreated(@NonNull SurfaceHolder holder) {}
+
+        @Override
+        public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
+            threadedSurface = Surface.createThreadedSurface(holder.getSurface());
+            threadedSurface.getCanvas().drawColor(0xffffffe0);
+            threadedSurface.flushAndSubmit();
+        }
+
+        @Override
+        public void surfaceDestroyed(@NonNull SurfaceHolder holder) {}
     }
 
-    @Override
-    public void surfaceChanged(@NonNull SurfaceHolder holder, int format, int width, int height) {
-        surfaceSurface = Surface.createThreadedSurface(holder.getSurface());
-        surfaceSurface.getCanvas().drawColor(0xffffffe0);
-        surfaceSurface.flushAndSubmit();
-    }
+    class DemoRuntimeShaderRenderer extends SurfaceRenderer {
+        private RuntimeShaderBuilder mBuilder = new RuntimeShaderBuilder(SkSLShader);
 
-    @Override
-    public void surfaceDestroyed(@NonNull SurfaceHolder holder) {
+        private static final String SkSLShader =
+                "uniform half u_time;                                  " +
+                        "uniform half u_w;                                     " +
+                        "uniform half u_h;                                     " +
 
+                        "float f(vec3 p) {                                     " +
+                        "   p.z -= u_time * 10.;                               " +
+                        "   float a = p.z * .1;                                " +
+                        "   p.xy *= mat2(cos(a), sin(a), -sin(a), cos(a));     " +
+                        "   return .1 - length(cos(p.xy) + sin(p.yz));         " +
+                        "}                                                     " +
+
+                        "half4 main(vec2 fragcoord) {                          " +
+                        "   vec3 d = .5 - fragcoord.xy1 / u_h;                 " +
+                        "   vec3 p=vec3(0);                                    " +
+                        "   for (int i = 0; i < 32; i++) p += f(p) * d;        " +
+                        "   return ((sin(p) + vec3(2, 5, 9)) / length(p)).xyz1;" +
+                        "}";
+
+        @Override
+        protected void onSurfaceInitialized(Surface surface) {}
+
+        @Override
+        protected void onRenderFrame(Canvas canvas, long ms) {
+            final int w = canvas.getWidth();
+            final int h = canvas.getHeight();
+
+            Paint p = new Paint();
+            p.setShader(mBuilder.setUniform("u_time", ms/1000.0f)
+                    .setUniform("u_w", w)
+                    .setUniform("u_h", h)
+                    .makeShader());
+
+            canvas.drawRect(0, 0, w, h, p);
+        }
     }
 }
diff --git a/platform_tools/android/apps/androidkitdemo/src/main/res/layout/activity_main.xml b/platform_tools/android/apps/androidkitdemo/src/main/res/layout/activity_main.xml
index b42da69..5cb6e85 100644
--- a/platform_tools/android/apps/androidkitdemo/src/main/res/layout/activity_main.xml
+++ b/platform_tools/android/apps/androidkitdemo/src/main/res/layout/activity_main.xml
@@ -6,32 +6,88 @@
     android:layout_height="match_parent"
     tools:context=".MainActivity">
 
-    <TextView
-        android:id="@+id/text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Hello World!"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintRight_toRightOf="parent"
-        app:layout_constraintTop_toTopOf="parent" />
-    <ImageView
-        android:id="@+id/image"
-        android:layout_width="400px"
-        android:layout_height="400px"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-    </ImageView>
-    <SurfaceView
-        android:id="@+id/surface"
-        android:layout_width="200px"
-        android:layout_height="200px"
-        app:layout_constraintLeft_toLeftOf="parent"
-        app:layout_constraintTop_toBottomOf="@+id/image">
-    </SurfaceView>
-    <org.skia.androidkitdemo1.NavigationSpinner
+    <LinearLayout
+        android:orientation="vertical"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:layout_constraintBottom_toBottomOf="parent">
-    </org.skia.androidkitdemo1.NavigationSpinner>
+        android:layout_height="match_parent">
+        <ScrollView
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:id="@+id/skottie_container">
 
+                <android.support.constraint.ConstraintLayout
+                    android:layout_marginTop="50px"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <ImageView
+                        android:id="@+id/bitmapImage"
+                        android:layout_width="400px"
+                        android:layout_height="400px"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toTopOf="parent">
+                    </ImageView>
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="50px"
+                        app:layout_constraintLeft_toRightOf="@+id/bitmapImage"
+                        app:layout_constraintRight_toRightOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        android:text="ImageView populated by bitmap">
+                    </TextView>
+                </android.support.constraint.ConstraintLayout>
+
+                <android.support.constraint.ConstraintLayout
+                    android:layout_marginTop="50px"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <SurfaceView
+                        android:id="@+id/threadedSurface"
+                        android:layout_width="400px"
+                        android:layout_height="400px"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toTopOf="parent">
+                    </SurfaceView>
+
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="50px"
+                        android:text="SurfaceView drawn on a thread managed by AndroidKit's native code"
+                        app:layout_constraintLeft_toRightOf="@+id/threadedSurface"
+                        app:layout_constraintRight_toRightOf="parent"
+                        app:layout_constraintTop_toTopOf="parent">
+                    </TextView>
+                </android.support.constraint.ConstraintLayout>
+
+
+                <android.support.constraint.ConstraintLayout
+                    android:layout_marginTop="50px"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content">
+                    <SurfaceView
+                        android:id="@+id/runtimeEffect"
+                        android:layout_width="400px"
+                        android:layout_height="400px"
+                        app:layout_constraintLeft_toLeftOf="parent"
+                        app:layout_constraintTop_toTopOf="parent">
+                    </SurfaceView>
+                    <TextView
+                        android:layout_width="0dp"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="50px"
+                        app:layout_constraintLeft_toRightOf="@+id/runtimeEffect"
+                        app:layout_constraintRight_toRightOf="parent"
+                        app:layout_constraintTop_toTopOf="parent"
+                        android:text="Runtime effect drawn on a AndroidKit's\nutil thread. GL on Surface View.">
+                    </TextView>
+
+                </android.support.constraint.ConstraintLayout>
+            </LinearLayout>
+        </ScrollView>
+    </LinearLayout>
 </android.support.constraint.ConstraintLayout>
\ No newline at end of file