commit fe381d8e24acd55794fbba0f38d443f6914945f8
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri May 10 12:15:41 2019 +0100

    Remember settings across app restarts.

diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 86d1b52f..0fbcc8d9 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -19,10 +19,12 @@
 
 package org.distorted.magic;
 
+import android.content.SharedPreferences;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.opengl.GLSurfaceView;
 import android.os.Bundle;
+import android.preference.PreferenceManager;
 import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
 import android.view.View;
@@ -39,6 +41,11 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
     private static final int SMALLEST_SIZE = 2;
     private static final int[] button_ids  = {R.id.rubikSize2, R.id.rubikSize3, R.id.rubikSize4};
 
+    private static final int DEFAULT_APPEAR_POS     = 10;
+    private static final int DEFAULT_DISAPPEAR_POS  = 10;
+    private static final int DEFAULT_APPEAR_TYPE    = 1;
+    private static final int DEFAULT_DISAPPEAR_TYPE = 1;
+
     private static int mSize = DEFAULT_SIZE;
 
     private int mAppearPos, mDisappearPos;
@@ -54,10 +61,8 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
       setContentView(R.layout.layout);
       markButton(mSize);
 
-      if( savedState==null )
-        {
-        onComplete(10,10,1,1);
-        }
+      restorePreferences();
+      applyPreferences();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -68,6 +73,7 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
       GLSurfaceView view = findViewById(R.id.rubikSurfaceView);
       view.onPause();
       DistortedLibrary.onPause();
+      savePreferences();
       super.onPause();
       }
 
@@ -90,32 +96,6 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
       super.onDestroy();
       }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void onSaveInstanceState(Bundle savedInstanceState)
-      {
-      super.onSaveInstanceState(savedInstanceState);
-
-      savedInstanceState.putInt("appearPos"    , mAppearPos    );
-      savedInstanceState.putInt("disappearPos" , mDisappearPos );
-      savedInstanceState.putInt("appearType"   , mAppearType   );
-      savedInstanceState.putInt("disappearType", mDisappearType);
-      }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public void onRestoreInstanceState(Bundle savedInstanceState)
-      {
-      super.onRestoreInstanceState(savedInstanceState);
-
-      mAppearPos     = savedInstanceState.getInt("appearPos"    );
-      mDisappearPos  = savedInstanceState.getInt("disappearPos" );
-      mAppearType    = savedInstanceState.getInt("appearType"   );
-      mDisappearType = savedInstanceState.getInt("disappearType");
-      }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     static int getSize()
@@ -156,13 +136,7 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
       mAppearType   = aT;
       mDisappearType= dT;
 
-      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
-      RubikRenderer renderer = view.getRenderer();
-
-      renderer.setAppearDuration(mAppearPos*100);
-      renderer.setDisappearDuration(mDisappearPos*100);
-      renderer.setAppearType(AppearEffect.getType(mAppearType));
-      renderer.setDisappearType(DisappearEffect.getType(mDisappearType));
+      applyPreferences();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -207,4 +181,44 @@ public class RubikActivity extends AppCompatActivity implements RubikSettings.On
          }
        }
      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void savePreferences()
+     {
+     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+     SharedPreferences.Editor editor = preferences.edit();
+
+     editor.putInt("appearPos"    , mAppearPos    );
+     editor.putInt("disappearPos" , mDisappearPos );
+     editor.putInt("appearType"   , mAppearType   );
+     editor.putInt("disappearType", mDisappearType);
+
+     editor.apply();
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void restorePreferences()
+     {
+     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
+
+     mAppearPos     = preferences.getInt("appearPos"    , DEFAULT_APPEAR_POS    );
+     mDisappearPos  = preferences.getInt("disappearPos" , DEFAULT_DISAPPEAR_POS );
+     mAppearType    = preferences.getInt("appearType"   , DEFAULT_APPEAR_TYPE   );
+     mDisappearType = preferences.getInt("disappearType", DEFAULT_DISAPPEAR_TYPE);
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private void applyPreferences()
+     {
+     RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+     RubikRenderer renderer = view.getRenderer();
+
+     renderer.setAppearDuration(mAppearPos*100 +1);
+     renderer.setDisappearDuration(mDisappearPos*100 +1);
+     renderer.setAppearType(AppearEffect.getType(mAppearType));
+     renderer.setDisappearType(DisappearEffect.getType(mDisappearType));
+     }
 }
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index 40048c78..642bfb05 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -86,9 +86,8 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
       mCanRotate = true;
       mCanDrag   = true;
 
-      mAppearType    = AppearEffect.Type.SCALE;
-      mDisappearType = DisappearEffect.Type.SCALE;
-
+      mAppearType        = AppearEffect.Type.SCALE;
+      mDisappearType     = DisappearEffect.Type.SCALE;
       mAppearDuration    = 1000;
       mDisappearDuration = 1000;
 
diff --git a/src/main/java/org/distorted/magic/RubikSettings.java b/src/main/java/org/distorted/magic/RubikSettings.java
index 536c17b1..de4afd27 100644
--- a/src/main/java/org/distorted/magic/RubikSettings.java
+++ b/src/main/java/org/distorted/magic/RubikSettings.java
@@ -78,10 +78,20 @@ public class RubikSettings extends AppCompatDialogFragment implements SeekBar.On
 
     Bundle args = getArguments();
 
-    mAppearPos     = args.getInt("appearPos");
-    mDisappearPos  = args.getInt("disappearPos");
-    mAppearType    = args.getInt("appearType");
-    mDisappearType = args.getInt("disappearType");
+    try
+      {
+      mAppearPos     = args.getInt("appearPos");
+      mDisappearPos  = args.getInt("disappearPos");
+      mAppearType    = args.getInt("appearType");
+      mDisappearType = args.getInt("disappearType");
+      }
+    catch(NullPointerException ex)
+      {
+      mAppearPos     = 10;
+      mDisappearPos  = 10;
+      mAppearType    =  1;
+      mDisappearType =  1;
+      }
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
