commit f6fcf06a5d980410773c8d21678c988a590d4fc7
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri May 10 00:07:14 2019 +0100

    New RubikSettings dialog.

diff --git a/src/main/java/org/distorted/effect/AppearEffect.java b/src/main/java/org/distorted/effect/AppearEffect.java
index 7b09f81b..900a2e75 100644
--- a/src/main/java/org/distorted/effect/AppearEffect.java
+++ b/src/main/java/org/distorted/effect/AppearEffect.java
@@ -48,6 +48,7 @@ public abstract class AppearEffect implements EffectListener
       }
     }
 
+  public static final int NUM_EFFECTS = Type.values().length;
   private final int FAKE_EFFECT_ID = -1;
 
   private int mCubeEffectNumber, mCubeEffectFinished, mCubeEffectReturned;
diff --git a/src/main/java/org/distorted/effect/DisappearEffect.java b/src/main/java/org/distorted/effect/DisappearEffect.java
index a03e66a4..f65dbe9c 100644
--- a/src/main/java/org/distorted/effect/DisappearEffect.java
+++ b/src/main/java/org/distorted/effect/DisappearEffect.java
@@ -48,6 +48,7 @@ public abstract class DisappearEffect implements EffectListener
       }
     }
 
+  public static final int NUM_EFFECTS = Type.values().length;
   private final int FAKE_EFFECT_ID = -2;
 
   private int mCubeEffectNumber, mCubeEffectFinished, mCubeEffectReturned;
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 98541bac..87c3b5a3 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -19,19 +19,19 @@
 
 package org.distorted.magic;
 
-import android.app.Activity;
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.opengl.GLSurfaceView;
 import android.os.Bundle;
 import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AppCompatActivity;
 import android.view.View;
 
 import org.distorted.library.main.DistortedLibrary;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class RubikActivity extends Activity
+public class RubikActivity extends AppCompatActivity implements RubikSettings.OnCompleteListener
 {
             static final int DEFAULT_SIZE  = 3;
     private static final int SMALLEST_SIZE = 2;
@@ -39,14 +39,23 @@ public class RubikActivity extends Activity
 
     private static int mSize = DEFAULT_SIZE;
 
+    private int mAppearPos, mDisappearPos;
+    private int mAppearType, mDisappearType;
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     @Override
     protected void onCreate(Bundle savedState)
       {
       super.onCreate(savedState);
+      setTheme(R.style.CustomActivityThemeNoActionBar);
       setContentView(R.layout.layout);
       markButton(mSize);
+
+      mAppearPos     = 10;
+      mDisappearPos  = 10;
+      mAppearType    =  1;
+      mDisappearType =  1;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,7 +107,26 @@ public class RubikActivity extends Activity
 
     public void Settings(View v)
       {
-      android.util.Log.e("rubik", "settings...");
+      Bundle args = new Bundle();
+
+      args.putInt("appearPos"    , mAppearPos    );
+      args.putInt("disappearPos" , mDisappearPos );
+      args.putInt("appearType"   , mAppearType   );
+      args.putInt("disappearType", mDisappearType);
+
+      RubikSettings settings = new RubikSettings();
+      settings.setArguments(args);
+      settings.show(getSupportFragmentManager(), null);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onComplete(int aP, int dP, int aT, int dT)
+      {
+      mAppearPos    = aP;
+      mDisappearPos = dP;
+      mAppearType   = aT;
+      mDisappearType= dT;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikSettings.java b/src/main/java/org/distorted/magic/RubikSettings.java
new file mode 100644
index 00000000..536c17b1
--- /dev/null
+++ b/src/main/java/org/distorted/magic/RubikSettings.java
@@ -0,0 +1,227 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2019 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.magic;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.FragmentActivity;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatDialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.SeekBar;
+import android.widget.Spinner;
+
+import org.distorted.effect.AppearEffect;
+import org.distorted.effect.DisappearEffect;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikSettings extends AppCompatDialogFragment implements SeekBar.OnSeekBarChangeListener, AdapterView.OnItemSelectedListener
+  {
+  public interface OnCompleteListener
+    {
+    void onComplete(int aP, int dP, int aT, int dT);
+    }
+
+  private OnCompleteListener mListener;
+
+  private int mAppearPos, mDisappearPos;
+  private int mAppearType, mDisappearType;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onAttach(Context context)
+    {
+    super.onAttach(context);
+
+    try
+      {
+      mListener = (OnCompleteListener)context;
+      }
+    catch (final ClassCastException e)
+      {
+      throw new ClassCastException(context.toString() + " must implement OnCompleteListener");
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onCreate(@Nullable Bundle savedInstanceState)
+    {
+    super.onCreate(savedInstanceState);
+
+    Bundle args = getArguments();
+
+    mAppearPos     = args.getInt("appearPos");
+    mDisappearPos  = args.getInt("disappearPos");
+    mAppearType    = args.getInt("appearType");
+    mDisappearType = args.getInt("disappearType");
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState)
+    {
+    FragmentActivity act = getActivity();
+    AlertDialog.Builder builder = new AlertDialog.Builder(act);
+
+    builder.setCancelable(false);
+    builder.setPositiveButton( R.string.save, new DialogInterface.OnClickListener()
+      {
+      @Override
+      public void onClick(DialogInterface dialog, int which)
+        {
+        saveOptions();
+        }
+      });
+
+    LayoutInflater inflater = act.getLayoutInflater();
+    final View view = inflater.inflate(R.layout.settings, null);
+    builder.setView(view);
+
+    Spinner appearTypeSpinner  = view.findViewById(R.id.appearType);
+
+    if( appearTypeSpinner!=null )
+      {
+      appearTypeSpinner.setOnItemSelectedListener(this);
+      String[] appear = getAppearEffectNames();
+      ArrayAdapter<String> adapterType = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, appear);
+      adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+      appearTypeSpinner.setAdapter(adapterType);
+
+      if(mAppearType>=0 && mAppearType<appear.length)
+        {
+        appearTypeSpinner.setSelection(mAppearType);
+        }
+      }
+    else
+      {
+      android.util.Log.e("dialog", "APPEAR TYPE SPINNER NULL!!");
+      }
+
+    SeekBar appearBar = view.findViewById(R.id.appearDuration);
+    appearBar.setOnSeekBarChangeListener(this);
+    appearBar.setProgress(mAppearPos);
+
+    Spinner disappearTypeSpinner  = view.findViewById(R.id.disappearType);
+
+    if( disappearTypeSpinner!=null )
+      {
+      disappearTypeSpinner.setOnItemSelectedListener(this);
+      String[] disappear = getDisappearEffectNames();
+      ArrayAdapter<String> adapterType = new ArrayAdapter<>(act,android.R.layout.simple_spinner_item, disappear);
+      adapterType.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+      disappearTypeSpinner.setAdapter(adapterType);
+
+      if(mDisappearType>=0 && mDisappearType<disappear.length)
+        {
+        disappearTypeSpinner.setSelection(mDisappearType);
+        }
+      }
+    else
+      {
+      android.util.Log.e("dialog", "DISAPPEAR TYPE SPINNER NULL!!");
+      }
+
+    SeekBar disappearBar = view.findViewById(R.id.disappearDuration);
+    disappearBar.setOnSeekBarChangeListener(this);
+    disappearBar.setProgress(mDisappearPos);
+
+    return builder.create();
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private String[] getAppearEffectNames()
+      {
+      int length = AppearEffect.NUM_EFFECTS;
+      AppearEffect.Type[] types = AppearEffect.Type.values();
+      String[] names = new String[length];
+
+      for( int i=0; i<length; i++)
+        {
+        names[i] = types[i].name();
+        }
+
+      return names;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private String[] getDisappearEffectNames()
+      {
+      int length = DisappearEffect.NUM_EFFECTS;
+      DisappearEffect.Type[] types = DisappearEffect.Type.values();
+      String[] names = new String[length];
+
+      for( int i=0; i<length; i++)
+        {
+        names[i] = types[i].name();
+        }
+
+      return names;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    private void saveOptions()
+      {
+      mListener.onComplete(mAppearPos, mDisappearPos, mAppearType, mDisappearType);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
+      {
+      switch(parent.getId())
+        {
+        case R.id.appearType   : mAppearType   = pos; break;
+        case R.id.disappearType: mDisappearType= pos; break;
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onProgressChanged(SeekBar bar, int progress, boolean fromUser)
+      {
+      switch (bar.getId())
+        {
+        case R.id.appearDuration   : mAppearPos   = progress; break;
+        case R.id.disappearDuration: mDisappearPos= progress; break;
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public void onNothingSelected(AdapterView<?> parent) { }
+    public void onStartTrackingTouch(SeekBar bar) { }
+    public void onStopTrackingTouch(SeekBar bar)  { }
+  }
diff --git a/src/main/res/layout/settings.xml b/src/main/res/layout/settings.xml
new file mode 100644
index 00000000..8602aa67
--- /dev/null
+++ b/src/main/res/layout/settings.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center_horizontal"
+    android:orientation="vertical">
+
+    <TextView
+        android:layout_width="fill_parent"
+        android:layout_height="48dp"
+        android:paddingStart="15dp"
+        android:paddingEnd="15dp"
+        android:gravity="start|bottom"
+        android:text="@string/appear"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="48dp"
+        android:gravity="center|fill_horizontal"
+        android:orientation="horizontal">
+
+        <SeekBar
+            android:id="@+id/appearDuration"
+            android:layout_weight="0.6"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp" />
+
+        <Spinner
+            android:id="@+id/appearType"
+            android:layout_weight="0.4"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:textAlignment="center"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp" />
+
+    </LinearLayout>
+
+    <TextView
+        android:layout_width="fill_parent"
+        android:layout_height="48dp"
+        android:paddingStart="15dp"
+        android:paddingEnd="15dp"
+        android:gravity="start|bottom"
+        android:text="@string/disappear"
+        android:textAppearance="?android:attr/textAppearanceMedium" />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="48dp"
+        android:gravity="center|fill_horizontal"
+        android:orientation="horizontal">
+
+        <SeekBar
+            android:id="@+id/disappearDuration"
+            android:layout_weight="0.6"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp" />
+
+        <Spinner
+            android:id="@+id/disappearType"
+            android:layout_weight="0.4"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:textAlignment="center"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp" />
+
+    </LinearLayout>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 167fbf63..2d9cc32a 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -2,4 +2,7 @@
     <string name="app_name">Magic Cube</string>
     <string name="scramble">Scramble</string>
     <string name="settings">Settings</string>
+    <string name="save">SAVE</string>
+    <string name="appear">Appear Effects</string>
+    <string name="disappear">Disappear Effects</string>
 </resources>
diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml
index 5885930d..a0eef02b 100644
--- a/src/main/res/values/styles.xml
+++ b/src/main/res/values/styles.xml
@@ -8,4 +8,11 @@
         <item name="colorAccent">@color/colorAccent</item>
     </style>
 
+    <style name="CustomActivityThemeNoActionBar" parent="@style/Theme.AppCompat.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+
 </resources>
