commit 88b94310cb1551fa0a82d8fe1bee00817ee20548
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Apr 2 23:36:13 2022 +0200

    Bandaged 3x3: beginnings of support for the Play Screen.

diff --git a/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java b/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
index 3dbc94a5..ec4c1e45 100644
--- a/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
+++ b/src/main/java/org/distorted/bandaged/BandagedCreatorActivity.java
@@ -19,6 +19,7 @@
 
 package org.distorted.bandaged;
 
+import android.content.Intent;
 import android.content.SharedPreferences;
 import android.graphics.Bitmap;
 import android.os.Build;
@@ -272,7 +273,9 @@ public class BandagedCreatorActivity extends AppCompatActivity
 
     public void playObject(String name)
       {
-
+      Intent intent = new Intent(this, BandagedPlayActivity.class);
+      intent.putExtra("name", name);
+      startActivity(intent);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java b/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
index c0b01184..120f76f7 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayActivity.java
@@ -32,12 +32,11 @@ import androidx.appcompat.app.AppCompatActivity;
 import com.google.firebase.analytics.FirebaseAnalytics;
 
 import org.distorted.dialogs.RubikDialogError;
+import org.distorted.external.RubikFiles;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.main.R;
 import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objectlib.main.TwistyObject;
-import org.distorted.objects.RubikObject;
-import org.distorted.objects.RubikObjectList;
 
 import java.io.InputStream;
 
@@ -50,6 +49,7 @@ public class BandagedPlayActivity extends AppCompatActivity
 
     public static final float DIALOG_BUTTON_SIZE  = 0.06f;
     public static final float MENU_BIG_TEXT_SIZE  = 0.05f;
+    public static final float BUTTON_TEXT_SIZE    = 0.05f;
 
     public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -61,7 +61,7 @@ public class BandagedPlayActivity extends AppCompatActivity
     private static int mScreenWidth, mScreenHeight;
     private int mCurrentApiVersion;
     private BandagedPlayScreen mScreen;
-    private int mObjectOrdinal;
+    private String mObjectName;
     private int mHeightBar;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -75,8 +75,7 @@ public class BandagedPlayActivity extends AppCompatActivity
       setContentView(R.layout.bandaged_play);
 
       Bundle b = getIntent().getExtras();
-
-      if(b != null) mObjectOrdinal = b.getInt("obj");
+      mObjectName = b!=null ? b.getString("name") : "";
 
       mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
 
@@ -178,12 +177,11 @@ public class BandagedPlayActivity extends AppCompatActivity
       view.onResume();
 
       if( mScreen==null ) mScreen = new BandagedPlayScreen();
-      mScreen.onAttachedToWindow(this,mObjectOrdinal);
+      mScreen.onAttachedToWindow(this,mObjectName);
 
-      if( mObjectOrdinal>=0 && mObjectOrdinal< RubikObjectList.getNumObjects() )
+      if( mObjectName.length()>0 )
         {
-        RubikObject object = RubikObjectList.getObject(mObjectOrdinal);
-        changeIfDifferent(object,mObjectOrdinal,view.getObjectControl());
+        changeIfDifferent(mObjectName,view.getObjectControl());
         }
       }
 
@@ -206,31 +204,29 @@ public class BandagedPlayActivity extends AppCompatActivity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void changeIfDifferent(RubikObject object,int ordinal,ObjectControl control)
+    private void changeIfDifferent(String name,ObjectControl control)
       {
-      if( object!=null )
-        {
-        int meshState          = object.getMeshState();
-        int iconMode           = TwistyObject.MODE_NORM;
-        InputStream jsonStream = object.getObjectStream(this);
-        InputStream meshStream = object.getMeshStream(this);
-        String name            = object.getUpperName();
+      RubikFiles files = RubikFiles.getInstance();
 
-        control.changeIfDifferent(ordinal,name,meshState,iconMode,jsonStream,meshStream);
-        }
+      int meshState          = TwistyObject.MESH_NICE;
+      int iconMode           = TwistyObject.MODE_NORM;
+      InputStream jsonStream = files.openFile(this,name+"_object.json");
+      InputStream meshStream = null;
+      int ordinal            = 0; // if jsonStream!=null, this doesn't matter
+
+      control.changeIfDifferent(ordinal,name,meshState,iconMode,jsonStream,meshStream);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    public void changeObject(int ordinal)
+    public void changeObject(String name)
       {
-      mObjectOrdinal = ordinal;
-      RubikObject object = RubikObjectList.getObject(ordinal);
+      mObjectName = name;
       BandagedPlayView view = findViewById(R.id.bandagedPlayView);
       ObjectControl control = view.getObjectControl();
-      changeIfDifferent(object,ordinal,control);
+      changeIfDifferent(name,control);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -269,6 +265,13 @@ public class BandagedPlayActivity extends AppCompatActivity
       return view.getObjectControl();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public BandagedPlayScreen getScreen()
+      {
+      return mScreen;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public static int getDrawableSize()
diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayLibInterface.java b/src/main/java/org/distorted/bandaged/BandagedPlayLibInterface.java
index de9d55ea..93f68fc6 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayLibInterface.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayLibInterface.java
@@ -19,6 +19,8 @@
 
 package org.distorted.bandaged;
 
+import java.lang.ref.WeakReference;
+
 import com.google.firebase.crashlytics.FirebaseCrashlytics;
 
 import org.distorted.library.message.EffectMessageSender;
@@ -30,6 +32,17 @@ import org.distorted.objectlib.helpers.ObjectLibInterface;
 
 public class BandagedPlayLibInterface implements ObjectLibInterface
 {
+  private final WeakReference<BandagedPlayActivity> mAct;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  BandagedPlayLibInterface(BandagedPlayActivity act)
+    {
+    mAct = new WeakReference<>(act);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   public void onWinEffectFinished(long startTime, long endTime, String debug, int scrambleNum) { }
   public void onScrambleEffectFinished() { }
   public void onBeginRotation() { }
@@ -37,8 +50,32 @@ public class BandagedPlayLibInterface implements ObjectLibInterface
   public void onObjectCreated(long time) { }
   public void onReplaceModeDown(int cubit, int face) { }
   public void onReplaceModeUp() { }
-  public void onFinishRotation(int axis, int row, int angle) { }
-  public void failedToDrag() { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void onFinishRotation(int axis, int row, int angle)
+    {
+    BandagedPlayActivity act = mAct.get();
+
+    if( act!=null )
+      {
+      BandagedPlayScreen play = act.getScreen();
+      play.addMove(act,axis,row,angle);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void failedToDrag()
+    {
+    BandagedPlayActivity act = mAct.get();
+
+    if( act!=null )
+      {
+      BandagedPlayScreen play = act.getScreen();
+      play.reddenLock(act);
+      }
+    }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
index 22f14ada..737e48c4 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayScreen.java
@@ -19,6 +19,8 @@
 
 package org.distorted.bandaged;
 
+import android.app.Activity;
+import android.content.SharedPreferences;
 import android.view.View;
 import android.widget.LinearLayout;
 
@@ -26,7 +28,6 @@ import org.distorted.helpers.LockController;
 import org.distorted.helpers.MovesController;
 import org.distorted.helpers.TransparentImageButton;
 import org.distorted.main.R;
-import org.distorted.main.RubikActivity;
 import org.distorted.objectlib.main.ObjectControl;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -36,7 +37,7 @@ public class BandagedPlayScreen
   private TransparentImageButton mBackButton, mScrambleButton, mSolveButton;
   private final LockController mLockController;
   protected MovesController mMovesController;
-  private int mObjectOrdinal;
+  private String mObjectName;
   private int mBarHeight;
   private float mButtonSize;
 
@@ -52,7 +53,7 @@ public class BandagedPlayScreen
 
   private void setupBackButton(final BandagedPlayActivity act)
     {
-    int icon = RubikActivity.getDrawable(R.drawable.ui_small_smallback,R.drawable.ui_medium_smallback, R.drawable.ui_big_smallback, R.drawable.ui_huge_smallback);
+    int icon = BandagedPlayActivity.getDrawable(R.drawable.ui_small_smallback,R.drawable.ui_medium_smallback, R.drawable.ui_big_smallback, R.drawable.ui_huge_smallback);
     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
     mBackButton = new TransparentImageButton(act, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
 
@@ -70,13 +71,13 @@ public class BandagedPlayScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  void onAttachedToWindow(final BandagedPlayActivity act, final int objectOrdinal)
+  void onAttachedToWindow(final BandagedPlayActivity act, final String objectName)
     {
     int width = act.getScreenWidthInPixels();
     mBarHeight = act.getHeightBar();
-    mButtonSize = width*RubikActivity.BUTTON_TEXT_SIZE;
+    mButtonSize = width*BandagedPlayActivity.BUTTON_TEXT_SIZE;
 
-    mObjectOrdinal = objectOrdinal;
+    mObjectName = objectName;
 
     LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
     LinearLayout.LayoutParams paramsM = new LinearLayout.LayoutParams(width/2, LinearLayout.LayoutParams.MATCH_PARENT);
@@ -103,12 +104,11 @@ public class BandagedPlayScreen
     layout.addView(layoutLeft);
     layout.addView(layoutMid);
     layout.addView(layoutRight);
-
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void setLockState(final RubikActivity act)
+  public void setLockState(final BandagedPlayActivity act)
     {
     boolean locked = act.getControl().retLocked();
     mLockController.setState(act,locked);
@@ -116,9 +116,30 @@ public class BandagedPlayScreen
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public void reddenLock(final RubikActivity act)
+  public void reddenLock(final BandagedPlayActivity act)
     {
     ObjectControl control = act.getControl();
     mLockController.reddenLock(act,control);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void addMove(Activity act, int axis, int row, int angle)
+    {
+    mMovesController.addMove(act,axis,row,angle);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void saveMovePreferences(SharedPreferences.Editor editor)
+    {
+    mMovesController.savePreferences(editor);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void restoreMovePreferences(Activity act, SharedPreferences preferences)
+    {
+    mMovesController.restorePreferences(act,preferences);
+    }
 }
diff --git a/src/main/java/org/distorted/bandaged/BandagedPlayView.java b/src/main/java/org/distorted/bandaged/BandagedPlayView.java
index eb6c5413..b1d1b7a2 100644
--- a/src/main/java/org/distorted/bandaged/BandagedPlayView.java
+++ b/src/main/java/org/distorted/bandaged/BandagedPlayView.java
@@ -85,7 +85,7 @@ public class BandagedPlayView extends GLSurfaceView
       if(!isInEditMode())
         {
         BandagedPlayActivity act = (BandagedPlayActivity)context;
-        BandagedPlayLibInterface ref = new BandagedPlayLibInterface();
+        BandagedPlayLibInterface ref = new BandagedPlayLibInterface(act);
         mObjectController = new ObjectControl(act,ref);
         mObjectController.setRotateOnCreation(true);
         mRenderer = new BandagedPlayRenderer(this);
