commit 0333d81ed8cfa8980b7c6e2cc2563516ede2804c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Thu Feb 20 12:22:45 2020 +0000

    Progress with StateSolving

diff --git a/src/main/java/org/distorted/dialog/RubikDialogScoresPagerAdapter.java b/src/main/java/org/distorted/dialog/RubikDialogScoresPagerAdapter.java
index 08c65409..2ec3dbcb 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogScoresPagerAdapter.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogScoresPagerAdapter.java
@@ -28,8 +28,8 @@ import android.view.ViewGroup;
 import android.widget.LinearLayout;
 
 import org.distorted.network.RubikScoresDownloader;
-import org.distorted.object.RubikObject;
-import org.distorted.uistate.RubikStatePlay;
+import static org.distorted.object.RubikObject.LENGTH;
+import static org.distorted.uistate.RubikStatePlay.MAX_SCRAMBLE;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -49,7 +49,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
 
     addPage(mViews[c],country[c],name[c],time[c]);
 
-    for(int i = 0; i< RubikObject.LENGTH; i++)
+    for(int i=0; i<LENGTH; i++)
       {
       if( i==c ) continue;
 
@@ -66,7 +66,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
       @Override
       public void run()
         {
-        for(int i = 0; i< RubikObject.LENGTH; i++)
+        for(int i=0; i<LENGTH; i++)
           {
           mViews[i].prepareView(mAct);
           }
@@ -86,7 +86,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
 
   private void addPage(final RubikDialogScoresView view, final String[][] country, final String[][] name, final String[][] time)
     {
-    for(int i=0; i<RubikStatePlay.MAX_SCRAMBLE; i++)
+    for(int i=0; i<MAX_SCRAMBLE; i++)
       {
       final LinearLayout section = view.createSection(mAct, i, country[i], name[i], time[i]);
 
@@ -119,7 +119,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
       @Override
       public void run()
         {
-        for(int i = 0; i< RubikObject.LENGTH; i++)
+        for(int i=0; i<LENGTH; i++)
           {
           mViews[i].exception(exce);
           }
@@ -132,11 +132,11 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
   RubikDialogScoresPagerAdapter(FragmentActivity act, ViewPager viewPager)
     {
     mAct = act;
-    mViews = new RubikDialogScoresView[RubikObject.LENGTH];
+    mViews = new RubikDialogScoresView[LENGTH];
     mViewPager = viewPager;
 
     viewPager.setAdapter(this);
-    viewPager.setOffscreenPageLimit( RubikObject.LENGTH-1 );
+    viewPager.setOffscreenPageLimit(LENGTH-1);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -150,7 +150,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
 
     boolean allCreated = true;
 
-    for(int i = 0; i< RubikObject.LENGTH; i++)
+    for(int i=0; i<LENGTH; i++)
       {
       if( mViews[i]==null )
         {
@@ -181,7 +181,7 @@ class RubikDialogScoresPagerAdapter extends PagerAdapter implements RubikScoresD
   @Override
   public int getCount()
     {
-    return RubikObject.LENGTH;
+    return LENGTH;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/dialog/RubikDialogScoresView.java b/src/main/java/org/distorted/dialog/RubikDialogScoresView.java
index f372f4bc..5bd95873 100644
--- a/src/main/java/org/distorted/dialog/RubikDialogScoresView.java
+++ b/src/main/java/org/distorted/dialog/RubikDialogScoresView.java
@@ -30,7 +30,7 @@ import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import org.distorted.magic.R;
-import org.distorted.network.RubikScoresDownloader;
+import static org.distorted.network.RubikScoresDownloader.MAX_PLACES;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -73,7 +73,7 @@ public class RubikDialogScoresView extends FrameLayout
     Resources res = act.getResources();
     String packageName = act.getPackageName();
 
-    for(int j = 0; j< RubikScoresDownloader.MAX_PLACES; j++)
+    for(int j=0; j<MAX_PLACES; j++)
       {
       if( name[j] != null )
         {
diff --git a/src/main/java/org/distorted/magic/RubikActivity.java b/src/main/java/org/distorted/magic/RubikActivity.java
index 1ca9f846..ecbb69e1 100644
--- a/src/main/java/org/distorted/magic/RubikActivity.java
+++ b/src/main/java/org/distorted/magic/RubikActivity.java
@@ -128,6 +128,9 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
         }
 
       RubikState.savePreferences(editor);
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      view.getRenderer().savePreferences(editor);
+
       editor.apply();
       }
 
@@ -148,6 +151,9 @@ public class RubikActivity extends AppCompatActivity implements View.OnClickList
         }
 
       RubikState.restorePreferences(preferences);
+
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      view.getRenderer().restorePreferences(preferences);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/magic/RubikRenderer.java b/src/main/java/org/distorted/magic/RubikRenderer.java
index fdaf4ac2..e5d0b12f 100644
--- a/src/main/java/org/distorted/magic/RubikRenderer.java
+++ b/src/main/java/org/distorted/magic/RubikRenderer.java
@@ -19,6 +19,7 @@
 
 package org.distorted.magic;
 
+import android.content.SharedPreferences;
 import android.opengl.GLSurfaceView;
 
 import org.distorted.effect.BaseEffect;
@@ -33,6 +34,7 @@ import org.distorted.object.RubikCube;
 import org.distorted.object.RubikObject;
 import org.distorted.uistate.RubikState;
 import org.distorted.uistate.RubikStatePlay;
+import org.distorted.uistate.RubikStateSolving;
 
 import javax.microedition.khronos.egl.EGLConfig;
 import javax.microedition.khronos.opengles.GL10;
@@ -133,6 +135,24 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
        }
      }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   void savePreferences(SharedPreferences.Editor editor)
+     {
+     android.util.Log.e("renderer", "saving prefs");
+
+     //editor.putInt("state", mCurrentState.ordinal() );
+     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   void restorePreferences(SharedPreferences preferences)
+     {
+     android.util.Log.e("renderer", "restoring prefs");
+
+     //int stateOrdinal = preferences.getInt("state", RubikState.MAIN.ordinal() );
+     }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // no this will not race with onDrawFrame
 
@@ -242,9 +262,16 @@ public class RubikRenderer implements GLSurfaceView.Renderer, EffectListener
 
        if( solved && !mIsSolved )
          {
-         mCanDrag        = true;
-         mCanRotate      = false;
-         mCanUI          = false;
+         if( RubikState.getCurrentState()==RubikState.SOLV )
+           {
+           RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass();
+           long time = solving.stopCounting();
+           android.util.Log.e("renderer", "solving time: "+time+" milliseconds");
+           }
+
+         mCanDrag   = true;
+         mCanRotate = false;
+         mCanUI     = false;
          doEffectNow( BaseEffect.Type.WIN );
          }
        else
diff --git a/src/main/java/org/distorted/magic/RubikSurfaceView.java b/src/main/java/org/distorted/magic/RubikSurfaceView.java
index 3c91af8f..19aa3e05 100644
--- a/src/main/java/org/distorted/magic/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/magic/RubikSurfaceView.java
@@ -30,6 +30,8 @@ import org.distorted.library.type.Static2D;
 import org.distorted.library.type.Static4D;
 import org.distorted.object.RubikCube;
 import org.distorted.object.RubikCubeMovement;
+import org.distorted.uistate.RubikState;
+import org.distorted.uistate.RubikStateSolving;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -221,7 +223,7 @@ public class RubikSurfaceView extends GLSurfaceView
                                        Static4D rotatedTouchPoint1= rotateVectorByInvertedQuat(touchPoint1, mQuatAccumulated);
                                        Static4D rotatedCamera= rotateVectorByInvertedQuat(CAMERA_POINT, mQuatAccumulated);
 
-                                       if( mMovement.faceTouched(rotatedTouchPoint1, rotatedCamera) )
+                                       if( mMovement.faceTouched(rotatedTouchPoint1,rotatedCamera) )
                                          {
                                          mDragging           = false;
                                          mBeginningRotation  = mRenderer.canRotate();
@@ -261,6 +263,12 @@ public class RubikSurfaceView extends GLSurfaceView
 
                                            cube.addNewRotation( (int)rot.get0(), (int)(cube.getSize()*rot.get1()) );
 
+                                           if( RubikState.getCurrentState()==RubikState.SOLV )
+                                             {
+                                             RubikStateSolving solving = (RubikStateSolving)RubikState.SOLV.getStateClass();
+                                             solving.startCounting( (RubikActivity)getContext() );
+                                             }
+
                                            mBeginningRotation = false;
                                            mContinuingRotation= true;
                                            }
diff --git a/src/main/java/org/distorted/network/RubikScoresDownloader.java b/src/main/java/org/distorted/network/RubikScoresDownloader.java
index 593bde55..b9dda581 100644
--- a/src/main/java/org/distorted/network/RubikScoresDownloader.java
+++ b/src/main/java/org/distorted/network/RubikScoresDownloader.java
@@ -184,7 +184,6 @@ public class RubikScoresDownloader implements Runnable
   private boolean doDownload()
     {
     String version = R.string.app_version+"d";
-
     String message=URL+"/download.cgi?n="+URLencode(mUserName)+"&r="+mNumRuns+"&e="+version;
 
     try
diff --git a/src/main/java/org/distorted/object/RubikObject.java b/src/main/java/org/distorted/object/RubikObject.java
index d6a8366d..8123f027 100644
--- a/src/main/java/org/distorted/object/RubikObject.java
+++ b/src/main/java/org/distorted/object/RubikObject.java
@@ -19,10 +19,10 @@
 
 package org.distorted.object;
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
 import org.distorted.magic.R;
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
 public enum RubikObject
   {
   CUBE2 ( 2, R.drawable.button2 ),
diff --git a/src/main/java/org/distorted/uistate/RubikStateSolving.java b/src/main/java/org/distorted/uistate/RubikStateSolving.java
index bc767c87..cf29ec98 100644
--- a/src/main/java/org/distorted/uistate/RubikStateSolving.java
+++ b/src/main/java/org/distorted/uistate/RubikStateSolving.java
@@ -29,15 +29,25 @@ import android.widget.TextView;
 import org.distorted.magic.R;
 import org.distorted.magic.RubikActivity;
 
+import java.util.Timer;
+import java.util.TimerTask;
+
 import static android.view.View.INVISIBLE;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 public class RubikStateSolving extends RubikStateAbstract
   {
+  private TextView mTime;
+  private Timer mTimer;
+  private long mStartTime;
+  private boolean mRunning;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
   public void leaveState(RubikActivity act)
     {
-
+    stopCounting();
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -49,9 +59,9 @@ public class RubikStateSolving extends RubikStateAbstract
     // TOP ////////////////////////////
     LinearLayout layoutTop = act.findViewById(R.id.mainTitle);
     layoutTop.removeAllViews();
-    final TextView text = (TextView)inflater.inflate(R.layout.upper_text, null);
-    text.setText(R.string.ready);
-    layoutTop.addView(text);
+    mTime = (TextView)inflater.inflate(R.layout.upper_text, null);
+    mTime.setText(R.string.ready);
+    layoutTop.addView(mTime);
 
     // BOT ////////////////////////////
     LinearLayout layoutBot = act.findViewById(R.id.mainBar);
@@ -95,4 +105,52 @@ public class RubikStateSolving extends RubikStateAbstract
     {
 
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void startCounting(final RubikActivity act)
+    {
+    if( !mRunning )
+      {
+      mRunning = true;
+      mStartTime = System.currentTimeMillis();
+      mTimer = new Timer();
+
+      mTimer.scheduleAtFixedRate(new TimerTask()
+        {
+        @Override
+        public void run()
+          {
+          act.runOnUiThread(new Runnable()
+            {
+            @Override
+            public void run()
+              {
+              int elapsed = (int)(System.currentTimeMillis()-mStartTime)/1000;
+              mTime.setText(act.getString(R.string.tm_placeholder,elapsed/60,elapsed%60));
+              }
+            });
+          }
+        }, 0, 1000);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public long stopCounting()
+    {
+    if( mRunning )
+      {
+      if( mTimer!=null )
+        {
+        mTimer.cancel();
+        mTimer = null;
+        }
+      mRunning = false;
+
+      return System.currentTimeMillis()-mStartTime;
+      }
+
+    return 0;
+    }
   }
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 7c016297..bb80158c 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -25,4 +25,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="sc_placeholder">Scramble %1$d</string>
+    <string name="tm_placeholder">%1$02d:%2$02d</string>
 </resources>
