commit e3efd628c71fb8379921811f557e36affd15682b
Author: Leszek Koltunski <leszek@distorted.org>
Date:   Fri Dec 2 00:31:36 2016 +0000

    Fix the 'Save' app on Android API >=23 (we need to explicitly ask for write permission)

diff --git a/build.gradle b/build.gradle
index ed95f9b..aa42a2b 100644
--- a/build.gradle
+++ b/build.gradle
@@ -20,4 +20,5 @@ android {
 
 dependencies {
     compile project(':distorted-library')
+    compile "com.android.support:support-v4:23.4.0"
 }
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 5b97bb0..e76e0c3 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -7,6 +7,7 @@
     <uses-sdk android:minSdkVersion="11" android:targetSdkVersion="23" />
     <uses-feature android:glEsVersion="0x00020000" android:required="true" />
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
 
     <application android:icon="@drawable/icon" android:label="@string/app_name" android:allowBackup="true" android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
         <activity android:name=".TableOfContents">
diff --git a/src/main/java/org/distorted/examples/save/SaveActivity.java b/src/main/java/org/distorted/examples/save/SaveActivity.java
index c03b70c..79cc344 100644
--- a/src/main/java/org/distorted/examples/save/SaveActivity.java
+++ b/src/main/java/org/distorted/examples/save/SaveActivity.java
@@ -22,9 +22,12 @@ package org.distorted.examples.save;
 import org.distorted.library.Distorted;
 import org.distorted.examples.R;
 
+import android.Manifest;
 import android.app.Activity;
+import android.content.pm.PackageManager;
 import android.opengl.GLSurfaceView;
 import android.os.Bundle;
+import android.support.v4.app.ActivityCompat;
 import android.view.View;
 import android.widget.SeekBar;
 
@@ -32,6 +35,27 @@ import android.widget.SeekBar;
 
 public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeListener
   {
+  private static final int REQUEST_EXTERNAL_STORAGE = 1;
+  private static String[] PERMISSIONS_STORAGE =
+     {
+     Manifest.permission.READ_EXTERNAL_STORAGE,
+     Manifest.permission.WRITE_EXTERNAL_STORAGE
+     };
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Checks if the app has permission to write to device storage
+// If the app does not has permission then the user will be prompted to grant permissions
+
+   private void verifyStoragePermissions()
+     {
+     int permission = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
+
+     if (permission != PackageManager.PERMISSION_GRANTED)
+       {
+       ActivityCompat.requestPermissions( this, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE );
+       }
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
     
   @Override
@@ -85,6 +109,8 @@ public class SaveActivity extends Activity implements SeekBar.OnSeekBarChangeLis
 
   public void Save(View v)
     {
+    verifyStoragePermissions();
+
     SaveSurfaceView view = (SaveSurfaceView) this.findViewById(R.id.saveSurfaceView);
     view.getRenderer().Save();
     }
diff --git a/src/main/java/org/distorted/examples/save/SaveRenderer.java b/src/main/java/org/distorted/examples/save/SaveRenderer.java
index 7ac8ad4..1d03699 100644
--- a/src/main/java/org/distorted/examples/save/SaveRenderer.java
+++ b/src/main/java/org/distorted/examples/save/SaveRenderer.java
@@ -35,7 +35,6 @@ import org.distorted.library.DistortedBitmap;
 import org.distorted.library.EffectTypes;
 import org.distorted.library.type.Dynamic1D;
 import org.distorted.library.type.Static1D;
-import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static3D;
 import org.distorted.library.type.Static4D;
 
diff --git a/src/main/java/org/distorted/examples/save/SaveWorkerThread.java b/src/main/java/org/distorted/examples/save/SaveWorkerThread.java
index 3ca558e..0eb5691 100644
--- a/src/main/java/org/distorted/examples/save/SaveWorkerThread.java
+++ b/src/main/java/org/distorted/examples/save/SaveWorkerThread.java
@@ -58,7 +58,7 @@ class SaveWorkerThread extends Thread
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public SaveWorkerThread()
+  private SaveWorkerThread()
     {
     }
 
