commit 917d15f594d4f92eb8b6f9e43a88b8749628f016
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Apr 15 00:51:52 2022 +0200

    BandagedPlay: configurable mode and scramble depth

diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
index a9d2792f..a3862f56 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
@@ -23,6 +23,7 @@ import java.util.Random;
 
 import android.app.Activity;
 import android.content.SharedPreferences;
+import android.os.Bundle;
 import android.view.View;
 import android.widget.LinearLayout;
 
@@ -42,8 +43,6 @@ public class BandagedPlayScreen
   public static final int ANIMATION_ON  = 0;
   public static final int ANIMATION_OFF = 1;
 
-  private static final int NUM_SCRAMBLES = 30;
-
   private TransparentImageButton mBackButton, mScrambleButton, mSolveButton, mSettingsButton;
   private final LockController mLockController;
   private final MovesController mMovesController;
@@ -60,9 +59,6 @@ public class BandagedPlayScreen
     {
     mLockController = new LockController();
     mMovesController= new MovesController();
-
-    mAnimationMode = ANIMATION_OFF;
-    mScrambleDepth = NUM_SCRAMBLES;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -98,7 +94,12 @@ public class BandagedPlayScreen
       @Override
       public void onClick(View v)
         {
+        Bundle bundle = new Bundle();
+        bundle.putInt("scraPos", mScrambleDepth );
+        bundle.putInt("animPos", mAnimationMode );
+
         RubikDialogBandagedSettings setDiag = new RubikDialogBandagedSettings();
+        setDiag.setArguments(bundle);
         setDiag.show(act.getSupportFragmentManager(), null);
         }
       });
@@ -142,16 +143,18 @@ public class BandagedPlayScreen
         TwistyObject object = control.getObject();
         ObjectScrambler.setSignature(object.getSignature());
 
+        int depth = RubikDialogBandagedSettings.DEPTHS[mScrambleDepth];
+
         if( mAnimationMode==ANIMATION_OFF )
           {
-          if( mMoves==null || mMoves.length<mScrambleDepth ) mMoves = new int[mScrambleDepth][3];
+          if( mMoves==null || mMoves.length<depth ) mMoves = new int[depth][3];
           if( mRnd==null ) mRnd = new Random();
 
-          for(int move=0; move<mScrambleDepth; move++)
+          for(int move=0; move<depth; move++)
             {
-            object.randomizeNewScramble(mMoves, mRnd, move, mScrambleDepth);
+            object.randomizeNewScramble(mMoves, mRnd, move, depth);
             }
-          for(int move=0; move<mScrambleDepth; move++)
+          for(int move=0; move<depth; move++)
             {
             int row = mMoves[move][1];
             mMoves[move][1] = (1<<row);
@@ -162,7 +165,7 @@ public class BandagedPlayScreen
 
         if( mAnimationMode==ANIMATION_ON )
           {
-          control.scrambleObject(mScrambleDepth);
+          control.scrambleObject(depth);
           }
         }
       });
@@ -255,6 +258,9 @@ public class BandagedPlayScreen
     mMovesController.savePreferences(mKey,editor);
     ObjectControl control = act.getControl();
     control.savePreferences(editor);
+
+    editor.putInt("playScreen_scramble" , mScrambleDepth);
+    editor.putInt("playScreen_animation", mAnimationMode);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -264,6 +270,9 @@ public class BandagedPlayScreen
     mMovesController.restorePreferences(act,mKey,preferences);
     ObjectControl control = act.getControl();
     control.restorePreferences(preferences);
+
+    mScrambleDepth = preferences.getInt("playScreen_scramble",1);
+    mAnimationMode = preferences.getInt("playScreen_animation",ANIMATION_OFF);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogBandagedSettings.java b/src/main/java/org/distorted/dialogs/RubikDialogBandagedSettings.java
index 6a2014eb..6a8ab7f1 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogBandagedSettings.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogBandagedSettings.java
@@ -27,7 +27,10 @@ import android.util.TypedValue;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.Window;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
 import android.widget.Button;
+import android.widget.Spinner;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -35,13 +38,88 @@ import androidx.appcompat.app.AlertDialog;
 import androidx.appcompat.app.AppCompatDialogFragment;
 import androidx.fragment.app.FragmentActivity;
 
+import org.distorted.bandaged.BandagedPlayActivity;
+import org.distorted.bandaged.BandagedPlayScreen;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class RubikDialogBandagedSettings extends AppCompatDialogFragment
+public class RubikDialogBandagedSettings extends AppCompatDialogFragment implements AdapterView.OnItemSelectedListener
   {
+  public static final int[] DEPTHS = new int[] {20,50,100,200,500,1000};
+  private int mAnimPos, mScraPos;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String[] createScrambleModes()
+    {
+    int len = DEPTHS.length;
+    String[] ret = new String[len];
+
+    for(int i=0; i<len; i++)
+      {
+      ret[i] = String.valueOf(DEPTHS[i]);
+      }
+
+    return ret;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void configureView(FragmentActivity act, View view, float textSize, int scraPos, int animPos)
+    {
+    TextView text1 = view.findViewById(R.id.bandaged_text_scramble);
+    text1.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+    TextView text2 = view.findViewById(R.id.bandaged_text_animation);
+    text2.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+
+    mScraPos = scraPos;
+    mAnimPos = animPos;
+
+    Spinner scramble = view.findViewById(R.id.bandaged_spinner_scramble);
+    scramble.setOnItemSelectedListener(this);
+    String[] scrambleModes = createScrambleModes();
+
+    ArrayAdapter<String> scrambleAdapter = new ArrayAdapter<>(act, android.R.layout.simple_spinner_item, scrambleModes );
+    scrambleAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+    scramble.setAdapter(scrambleAdapter);
+    scramble.setSelection(mScraPos);
+
+    Spinner animation = view.findViewById(R.id.bandaged_spinner_animation);
+    animation.setOnItemSelectedListener(this);
+    String[] animationModes = { "ON" , "OFF" };
+
+    ArrayAdapter<String> animationAdapter = new ArrayAdapter<>(act, android.R.layout.simple_spinner_item, animationModes );
+    animationAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+    animation.setAdapter(animationAdapter);
+    animation.setSelection(mAnimPos);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
+    {
+    int spinnerID = parent.getId();
+
+    if( spinnerID == R.id.bandaged_spinner_scramble )
+      {
+      mScraPos = pos;
+      }
+    else if( spinnerID == R.id.bandaged_spinner_animation )
+      {
+      mAnimPos = pos;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onNothingSelected(AdapterView<?> parent) { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   @NonNull
   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState)
@@ -54,26 +132,47 @@ public class RubikDialogBandagedSettings extends AppCompatDialogFragment
     act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
     final float titleSize= displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
     final float okSize   = displaymetrics.widthPixels * RubikActivity.DIALOG_BUTTON_SIZE;
-    final float textSize = displaymetrics.widthPixels * RubikActivity.MENU_SMALL_TEXT_SIZE;
+    final float textSize = displaymetrics.widthPixels * RubikActivity.MENU_BIG_TEXT_SIZE;
 
     TextView tv = (TextView) inflater.inflate(R.layout.dialog_title, null);
     tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
     tv.setText(R.string.settings);
     builder.setCustomTitle(tv);
 
+    Bundle args = getArguments();
+    int scraPos, animPos;
+
+    try
+      {
+      scraPos = args.getInt("scraPos");
+      animPos = args.getInt("animPos");
+      }
+    catch(Exception e)
+      {
+      scraPos = 0;
+      animPos = 0;
+      }
+
+    final BandagedPlayActivity bact = (BandagedPlayActivity)getContext();
+
     builder.setCancelable(true);
     builder.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener()
       {
       @Override
       public void onClick(DialogInterface dialog, int which)
         {
+        BandagedPlayScreen screen = bact!=null ? bact.getScreen() : null;
 
+        if( screen!=null )
+          {
+          screen.setScrambleDepth(mScraPos);
+          screen.setAnimationMode(mAnimPos);
+          }
         }
       });
 
     final View view = inflater.inflate(R.layout.dialog_settings, null);
-
-
+    configureView(act,view,textSize,scraPos,animPos);
     builder.setView(view);
 
     Dialog dialog = builder.create();
diff --git a/src/main/res/layout/dialog_settings.xml b/src/main/res/layout/dialog_settings.xml
index 89ae86fa..cb6142f2 100644
--- a/src/main/res/layout/dialog_settings.xml
+++ b/src/main/res/layout/dialog_settings.xml
@@ -11,20 +11,70 @@
         android:gravity="center|fill_horizontal"
         android:layout_marginLeft="10dp"
         android:layout_marginRight="10dp"
-        android:layout_marginTop="0dp"
         android:background="@color/grey"
         android:orientation="vertical">
 
-        <TextView
-            android:id="@+id/solved_time"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:textSize="24sp"
-            android:layout_marginTop="10dp"
+        <LinearLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center|fill_horizontal"
             android:layout_marginLeft="10dp"
             android:layout_marginRight="10dp"
-            android:layout_marginBottom="10dp"/>
+            android:layout_marginTop="10dp"
+            android:layout_marginBottom="5dp"
+            android:orientation="horizontal">
+
+            <TextView
+               android:id="@+id/bandaged_text_scramble"
+               android:layout_width="0dp"
+               android:layout_height="wrap_content"
+               android:layout_weight="0.5"
+               android:gravity="start"
+               android:textSize="24sp"
+               android:text="@string/scramble"
+               android:layout_marginLeft="10dp"
+               android:layout_marginRight="10dp"/>
+
+            <Spinner
+               android:id="@+id/bandaged_spinner_scramble"
+               android:gravity="end"
+               android:layout_width="0dp"
+               android:layout_height="wrap_content"
+               android:layout_weight="0.5"/>
+
+        </LinearLayout>
+
+        <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:gravity="center|fill_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginTop="5dp"
+        android:layout_marginBottom="10dp"
+        android:orientation="horizontal">
+
+            <TextView
+               android:id="@+id/bandaged_text_animation"
+               android:layout_width="0dp"
+               android:layout_height="wrap_content"
+               android:layout_weight="0.5"
+               android:gravity="start"
+               android:textSize="24sp"
+               android:text="@string/animation"
+               android:layout_marginTop="10dp"
+               android:layout_marginLeft="10dp"
+               android:layout_marginRight="10dp"
+               android:layout_marginBottom="10dp"/>
+
+            <Spinner
+               android:id="@+id/bandaged_spinner_animation"
+               android:gravity="end"
+               android:layout_width="0dp"
+               android:layout_height="wrap_content"
+               android:layout_weight="0.5"/>
+
+        </LinearLayout>
 
     </LinearLayout>
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 9b43a311..779a3b5f 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">Löschen</string>
     <string name="delete_object_really">Möchten Sie diesen Cube löschen?</string>
     <string name="settings">Einstellungen</string>
+    <string name="animation">Animation</string>
 
     <string name="scores">Highscores</string>
     <string name="patterns">Hübsche Muster</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 03918b21..8a78956a 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">Borrar</string>
     <string name="delete_object_really">¿Quieres borrar este Cubo?</string>
     <string name="settings">Ajustes</string>
+    <string name="animation">Animación</string>
 
     <string name="scores">Leaderboard</string>
     <string name="patterns">Patrones</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 69c89edc..791400d7 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">Supprimer</string>
     <string name="delete_object_really">Voulez-vous supprimer ce Cube?</string>
     <string name="settings">Réglages</string>
+    <string name="animation">Animation</string>
 
     <string name="scores">Meilleurs scores</string>
     <string name="patterns">Jolis motifs</string>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 18e81e05..fe44dd64 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">消す</string>
     <string name="delete_object_really">このキューブを削除しますか?</string>
     <string name="settings">設定</string>
+    <string name="animation">効果</string>
 
     <string name="scores">ハイスコア</string>
     <string name="patterns">プリティパターン</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index d24710e8..eb5b5bd7 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">삭제</string>
     <string name="delete_object_really">이 큐브를 삭제하시겠습니까?</string>
     <string name="settings">설정</string>
+    <string name="animation">효과</string>
 
     <string name="scores">고득점</string>
     <string name="patterns">예쁜 패턴</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index f27ad4f7..5a4dddda 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">Usuń</string>
     <string name="delete_object_really">Chcesz usunąć tą kostkę?</string>
     <string name="settings">Ustawienia</string>
+    <string name="animation">Animacja</string>
 
     <string name="scores">Lista najlepszych</string>
     <string name="patterns">Piękne Wzory</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 118dd346..475d4257 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">Удалить</string>
     <string name="delete_object_really">Вы хотите удалить этот куб?</string>
     <string name="settings">Настройки</string>
+    <string name="animation">Эффект</string>
 
     <string name="scores">Высокие баллы</string>
     <string name="patterns">Красивые узоры</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index b84d2ddf..82a9f270 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">删除</string>
     <string name="delete_object_really">你想删除这个立方体吗?</string>
     <string name="settings">设置</string>
+    <string name="animation">动画</string>
 
     <string name="scores">高分</string>
     <string name="patterns">模式</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index e5cf82b0..d867b953 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -42,6 +42,7 @@
     <string name="delete_object">刪除</string>
     <string name="delete_object_really">是否要刪除此多維數據集?</string>
     <string name="settings">設置</string>
+    <string name="animation">動畫</string>
 
     <string name="scores">高分</string>
     <string name="patterns">模式</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 5d2393d4..3e6c6667 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -43,6 +43,7 @@
     <string name="delete_object">Delete</string>
     <string name="delete_object_really">Do you want to delete this Cube?</string>
     <string name="settings">Settings</string>
+    <string name="animation">Animation</string>
 
     <string name="scores">High Scores</string>
     <string name="patterns">Pretty Patterns</string>
