commit a2cb31e9c0d3e93563b3b47e0fb7e859a7926b60
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Sat Jun 11 01:38:48 2016 +0100

    Beginnings of support for the 'Save' app.

diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index a2113dd..137679c 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -34,6 +34,7 @@
         <activity android:name=".cubes.CubesActivity" />       
         <activity android:name=".quaternion.QuaternionActivity" />          
         <activity android:name=".effects3d.Effects3DActivity" />  
-        <activity android:name=".plainmonalisa.PlainMonaLisaActivity" />  
+        <activity android:name=".plainmonalisa.PlainMonaLisaActivity" />
+        <activity android:name=".save.SaveActivity"/>
     </application>
 </manifest>
diff --git a/src/main/java/org/distorted/examples/TableOfContents.java b/src/main/java/org/distorted/examples/TableOfContents.java
index 2f5b4e8..2b1d3fc 100644
--- a/src/main/java/org/distorted/examples/TableOfContents.java
+++ b/src/main/java/org/distorted/examples/TableOfContents.java
@@ -15,7 +15,6 @@ import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.SimpleAdapter;
 
-import org.distorted.examples.R;
 import org.distorted.examples.monalisa.MonaLisaActivity;
 import org.distorted.examples.sink.SinkActivity;
 import org.distorted.examples.fov.FOVActivity;
@@ -37,6 +36,7 @@ import org.distorted.examples.cubes.CubesActivity;
 import org.distorted.examples.quaternion.QuaternionActivity;
 import org.distorted.examples.effects3d.Effects3DActivity;
 import org.distorted.examples.plainmonalisa.PlainMonaLisaActivity;
+import org.distorted.examples.save.SaveActivity;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -55,13 +55,13 @@ public class TableOfContents extends ListActivity
    setTitle(R.string.toc);
    setContentView(R.layout.table_of_contents);
       
-   final List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
-   final SparseArray<Class<? extends Activity>> activityMapping = new SparseArray<Class<? extends Activity>>();
+   final List<Map<String, Object>> data = new ArrayList<>();
+   final SparseArray<Class<? extends Activity>> activityMapping = new SparseArray<>();
       
    int i = 0;
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_monalisa);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_monalisa));
       item.put(ITEM_SUBTITLE, getText(R.string.example_monalisa_subtitle));
@@ -70,7 +70,7 @@ public class TableOfContents extends ListActivity
    }
       
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_sink);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_sink));
       item.put(ITEM_SUBTITLE, getText(R.string.example_sink_subtitle));
@@ -79,7 +79,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_bean);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_bean));
       item.put(ITEM_SUBTITLE, getText(R.string.example_bean_subtitle));
@@ -88,7 +88,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_fov);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_fov));
       item.put(ITEM_SUBTITLE, getText(R.string.example_fov_subtitle));
@@ -97,7 +97,7 @@ public class TableOfContents extends ListActivity
    }
          
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_deform);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_deform));
       item.put(ITEM_SUBTITLE, getText(R.string.example_deform_subtitle));
@@ -106,7 +106,7 @@ public class TableOfContents extends ListActivity
    }
   
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_listener);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_listener));
       item.put(ITEM_SUBTITLE, getText(R.string.example_listener_subtitle));
@@ -115,7 +115,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_interpolator);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_interpolator));
       item.put(ITEM_SUBTITLE, getText(R.string.example_interpolator_subtitle));
@@ -124,7 +124,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_girl);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_girl));
       item.put(ITEM_SUBTITLE, getText(R.string.example_girl_subtitle));
@@ -133,7 +133,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_macroblock);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_macroblock));
       item.put(ITEM_SUBTITLE, getText(R.string.example_macroblock_subtitle));
@@ -142,7 +142,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_movingeffects);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_movingeffects));
       item.put(ITEM_SUBTITLE, getText(R.string.example_movingeffects_subtitle));
@@ -151,7 +151,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_differenteffects);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_differenteffects));
       item.put(ITEM_SUBTITLE, getText(R.string.example_differenteffects_subtitle));
@@ -160,7 +160,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_differentbitmaps);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_differentbitmaps));
       item.put(ITEM_SUBTITLE, getText(R.string.example_differentbitmaps_subtitle));
@@ -169,7 +169,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_scratchpad);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_scratchpad));
       item.put(ITEM_SUBTITLE, getText(R.string.example_scratchpad_subtitle));
@@ -178,7 +178,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_check);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_check));
       item.put(ITEM_SUBTITLE, getText(R.string.example_check_subtitle));
@@ -187,7 +187,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_fbo);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_fbo));
       item.put(ITEM_SUBTITLE, getText(R.string.example_fbo_subtitle));
@@ -196,7 +196,7 @@ public class TableOfContents extends ListActivity
    }
       
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_starwars);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_starwars));
       item.put(ITEM_SUBTITLE, getText(R.string.example_starwars_subtitle));
@@ -205,7 +205,7 @@ public class TableOfContents extends ListActivity
    }
          
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_olimpic);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_olimpic));
       item.put(ITEM_SUBTITLE, getText(R.string.example_olimpic_subtitle));
@@ -214,7 +214,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_quaternion);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_quaternion));
       item.put(ITEM_SUBTITLE, getText(R.string.example_quaternion_subtitle));
@@ -223,7 +223,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_cubes);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_cubes));
       item.put(ITEM_SUBTITLE, getText(R.string.example_cubes_subtitle));
@@ -232,7 +232,7 @@ public class TableOfContents extends ListActivity
    }
    
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_effects3d);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_effects3d));
       item.put(ITEM_SUBTITLE, getText(R.string.example_effects3d_subtitle));
@@ -241,14 +241,23 @@ public class TableOfContents extends ListActivity
    }
 
    {
-      final Map<String, Object> item = new HashMap<String, Object>();
+      final Map<String, Object> item = new HashMap<>();
       item.put(ITEM_IMAGE, R.drawable.icon_example_monalisa);
       item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_plainmonalisa));
       item.put(ITEM_SUBTITLE, getText(R.string.example_plainmonalisa_subtitle));
       data.add(item);
       activityMapping.put(i++, PlainMonaLisaActivity.class);
    }
-     
+
+   {
+      final Map<String, Object> item = new HashMap<>();
+      item.put(ITEM_IMAGE, R.drawable.icon_example_girl);
+      item.put(ITEM_TITLE, (i+1)+". "+getText(R.string.example_save));
+      item.put(ITEM_SUBTITLE, getText(R.string.example_save_subtitle));
+      data.add(item);
+      activityMapping.put(i++, SaveActivity.class);
+   }
+
    final SimpleAdapter dataAdapter = new SimpleAdapter(this, data, R.layout.toc_item, new String[] {ITEM_IMAGE, ITEM_TITLE, ITEM_SUBTITLE}, new int[] {R.id.Image, R.id.Title, R.id.SubTitle});
    setListAdapter(dataAdapter);  
       
diff --git a/src/main/java/org/distorted/examples/save/SaveActivity.java b/src/main/java/org/distorted/examples/save/SaveActivity.java
new file mode 100644
index 0000000..19e4c05
--- /dev/null
+++ b/src/main/java/org/distorted/examples/save/SaveActivity.java
@@ -0,0 +1,91 @@
+
+package org.distorted.examples.save;
+
+import org.distorted.library.Distorted;
+import org.distorted.examples.R;
+
+import android.app.Activity;
+import android.opengl.GLSurfaceView;
+import android.os.Bundle;
+import android.view.View;
+import android.widget.Button;
+import android.widget.SeekBar;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeListener
+{
+    private Button mSave;
+    private SeekBar barSize;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    @Override
+    protected void onCreate(Bundle icicle) 
+      {
+      super.onCreate(icicle);
+      
+      setContentView(R.layout.savelayout);
+           
+      mSave = (Button)findViewById(R.id.saveButton);
+
+      barSize  = (SeekBar)findViewById(R.id.saveSeekBar);
+      barSize.setOnSeekBarChangeListener(this);
+      barSize.setProgress(50);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    @Override
+    protected void onPause() 
+      {
+      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.saveSurfaceView);
+      mView.onPause();
+      
+      super.onPause();
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    @Override
+    protected void onResume() 
+      {
+      super.onResume();
+      
+      GLSurfaceView mView = (GLSurfaceView) this.findViewById(R.id.saveSurfaceView);
+      mView.onResume();
+      }
+ 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    @Override
+    protected void onDestroy() 
+      {
+      Distorted.onDestroy();  
+      super.onDestroy();
+      }
+   
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void Save(View v)
+      {
+      android.util.Log.e("SAVE", "Save button!!");
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
+      {
+      float s = (progress>50 ? ((progress-50)/16.0f + 1.0f):(0.015f*progress + 0.25f));
+      SaveRenderer.setSize(s);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onStartTrackingTouch(SeekBar bar) { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onStopTrackingTouch(SeekBar bar)  { }
+
+}
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
new file mode 100644
index 0000000..ffcdfe5
--- /dev/null
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -0,0 +1,139 @@
+
+package org.distorted.examples.save;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.microedition.khronos.egl.EGLConfig;
+import javax.microedition.khronos.opengles.GL10;
+
+import org.distorted.examples.R;
+
+import org.distorted.library.Distorted;
+import org.distorted.library.DistortedBitmap;
+import org.distorted.library.EffectTypes;
+import org.distorted.library.Float1D;
+import org.distorted.library.Float2D;
+import org.distorted.library.Float4D;
+import org.distorted.library.Interpolator1D;
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.opengl.GLES20;
+import android.opengl.GLSurfaceView;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SaveRenderer implements GLSurfaceView.Renderer 
+{
+    private GLSurfaceView mView;
+    private DistortedBitmap mGirl;
+    private Float2D pLeft, pRight;
+    private Float4D sinkRegion;
+    private static Interpolator1D diSink;
+    private static Float1D s0;
+    
+    private int bmpHeight, bmpWidth;
+    
+    private static float boobsSink;
+    
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public SaveRenderer(GLSurfaceView v) 
+      {
+      mView = v;
+      
+      boobsSink  = 1.0f;
+      
+      pLeft = new Float2D(132, 264);
+      pRight= new Float2D(247, 264);
+      
+      // Make the boobs bigger
+      sinkRegion = new Float4D(0,0,60,60);
+      
+      s0 = new Float1D(boobsSink);
+      
+      diSink = new Interpolator1D(); 
+      diSink.setCount(0.5f);
+      diSink.setDuration(0);
+      diSink.add(s0);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public static void setSize(float s)
+     {
+     boobsSink = s;
+     s0.set(boobsSink);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+   
+   public void onDrawFrame(GL10 glUnused) 
+      {
+      GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+      GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
+      
+      mGirl.draw(System.currentTimeMillis());
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
+      { 
+      mGirl.abortEffects(EffectTypes.MATRIX);
+      
+      if( bmpHeight/bmpWidth > height/width )
+        {
+        int w = (height*bmpWidth)/bmpHeight;
+        mGirl.move((width-w)/2 ,0, 0);
+        mGirl.scale((float)height/bmpHeight);
+        }
+      else
+        {
+        int h = (width*bmpHeight)/bmpWidth;
+        mGirl.move(0 ,(height-h)/2, 0);
+        mGirl.scale((float)width/bmpWidth);
+        }
+      
+      Distorted.onSurfaceChanged(width, height); 
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+    
+    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
+      {    
+      InputStream is = mView.getContext().getResources().openRawResource(R.raw.girl);
+      Bitmap bitmap;
+        
+      try 
+        {
+        bitmap = BitmapFactory.decodeStream(is);
+        } 
+      finally 
+        {
+        try 
+          {
+          is.close();
+          } 
+        catch(IOException e) { }
+        }  
+      
+      bmpHeight = bitmap.getHeight();
+      bmpWidth  = bitmap.getWidth();
+      
+      mGirl = new DistortedBitmap(bitmap, 30);
+
+      mGirl.sink( diSink, sinkRegion, pLeft );
+      mGirl.sink( diSink, sinkRegion, pRight);
+
+      try
+        {
+        Distorted.onSurfaceCreated(mView.getContext());
+        }
+      catch(Exception ex)
+        {
+        android.util.Log.e("Renderer", ex.getMessage() );
+        }
+      }
+}
diff --git a/src/main/java/org/distorted/examples/save/SaveSurfaceView.java b/src/main/java/org/distorted/examples/save/SaveSurfaceView.java
new file mode 100644
index 0000000..44eb047
--- /dev/null
+++ b/src/main/java/org/distorted/examples/save/SaveSurfaceView.java
@@ -0,0 +1,29 @@
+
+package org.distorted.examples.save;
+
+import android.content.Context;
+import android.opengl.GLSurfaceView;
+import android.os.Build;
+import android.util.AttributeSet;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+class SaveSurfaceView extends GLSurfaceView 
+{
+///////////////////////////////////////////////////////////////////////////////////////////////////
+   
+  public SaveSurfaceView(Context c, AttributeSet attrs)
+      {
+      super(c, attrs);
+     
+      setEGLContextClientVersion(2);
+        
+      if( Build.FINGERPRINT.startsWith("generic") )
+        { 
+        setEGLConfigChooser(8, 8, 8, 8, 16, 0);   
+        }
+        
+      setRenderer(new SaveRenderer(this));
+      }
+}
+
diff --git a/src/main/res/drawable-hdpi/icon_example_save.png b/src/main/res/drawable-hdpi/icon_example_save.png
new file mode 100644
index 0000000..766fe70
Binary files /dev/null and b/src/main/res/drawable-hdpi/icon_example_save.png differ
diff --git a/src/main/res/layout/savelayout.xml b/src/main/res/layout/savelayout.xml
new file mode 100644
index 0000000..b1c3a59
--- /dev/null
+++ b/src/main/res/layout/savelayout.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:orientation="vertical" >
+
+    <org.distorted.examples.save.SaveSurfaceView
+        android:id="@+id/saveSurfaceView"
+        android:layout_width="fill_parent"
+        android:layout_height="0dp"
+        android:layout_weight="0.85" />
+
+    <LinearLayout
+        android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:gravity="bottom"
+        android:layout_weight="0.03">
+
+        <Button
+            android:id="@+id/saveButton"
+            android:layout_width="132dp"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical|center"
+            android:text="@string/save"
+            android:onClick="Save"
+            android:textAppearance="?android:attr/textAppearanceMedium"
+            android:layout_gravity="center_vertical"/>
+
+        <SeekBar
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:id="@+id/saveSeekBar"
+            android:layout_gravity="center_vertical"
+            android:layout_margin="5dp"/>
+
+    </LinearLayout>
+
+</LinearLayout>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index fb614f8..68f18cb 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -39,7 +39,8 @@
     <string name="dim3DXZ">3DXZ</string>
     <string name="Up">Up</string>
     <string name="Default">Default</string>
-     
+    <string name="save">Save</string>
+
     <string name="example_monalisa">Mona Lisa</string>  
     <string name="example_monalisa_subtitle">The basics of Distortions.</string>
     <string name="example_sink">Dog</string>  
@@ -82,6 +83,8 @@
     <string name="example_effects3d_subtitle">Test results of all effects on a 3D object.</string>
     <string name="example_plainmonalisa">PlainMonaLisa</string>  
     <string name="example_plainmonalisa_subtitle">MonaLisa rendered on a plain SurfaceView</string>
+    <string name="example_save">Save to PNG</string>
+    <string name="example_save_subtitle">Saving the output to a PNG file.</string>
 
     <string name="example_movingeffects_toast">Click on \'RESET\' and define your path by touching the screen. Then click on one of the effects and see it move along your path.</string>
     <string name="example_cubes_toast">Rotate the cubes by swiping the screen</string>
