commit d7f0c07d05d13417e0c9020cee5e9a7af02c9e88
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Oct 23 00:15:23 2022 +0200

    Beginnings of support for 'Overlays': first overlay will be the rotating star which little stars fly to when one solves a level for the first time.

diff --git a/src/main/java/org/distorted/external/RubikScores.java b/src/main/java/org/distorted/external/RubikScores.java
index cb3e6b2a..06f10736 100644
--- a/src/main/java/org/distorted/external/RubikScores.java
+++ b/src/main/java/org/distorted/external/RubikScores.java
@@ -45,6 +45,7 @@ public class RubikScores
   private int mNumPlays;
   private int mNumWins;
   private int mDeviceID;
+  private int mNumStars;
 
   private static class MapValue
     {
@@ -75,6 +76,7 @@ public class RubikScores
     mNumRuns = -1;
     mDeviceID= -1;
     mNumWins =  0;
+    mNumStars=  0;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -233,6 +235,20 @@ public class RubikScores
     return mNumWins;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void changeNumStars(int stars)
+    {
+    mNumStars += stars;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getNumStars()
+    {
+    return mNumStars;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void setName(String newName)
@@ -360,7 +376,8 @@ public class RubikScores
     editor.putInt("scores_numPlays", mNumPlays);
     editor.putInt("scores_numRuns" , mNumRuns );
     editor.putInt("scores_deviceid", mDeviceID);
-    editor.putInt("scores_review"  , mNumWins );
+    editor.putInt("scores_review"  , mNumWins );   // legacy name
+    editor.putInt("scores_numStars", mNumStars );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -431,6 +448,7 @@ public class RubikScores
     mNumRuns        = preferences.getInt("scores_numRuns" , 0);
     mDeviceID       = preferences.getInt("scores_deviceid",-1);
     mNumWins        = preferences.getInt("scores_review"  , 0);
+    mNumStars       = preferences.getInt("scores_numStars", 0);
 
     if( mDeviceID==-1 ) mDeviceID = privateGetDeviceID();
 
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index 43518290..9915c2af 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -37,6 +37,7 @@ import org.distorted.config.ConfigActivity;
 import org.distorted.bandaged.BandagedCreatorActivity;
 import org.distorted.library.main.DistortedLibrary;
 
+import org.distorted.library.main.DistortedScreen;
 import org.distorted.messaging.RubikInAppMessanging;
 import org.distorted.objectlib.main.ObjectControl;
 import org.distorted.objectlib.main.TwistyObject;
@@ -456,6 +457,14 @@ public class RubikActivity extends AppCompatActivity
       return view.getObjectControl().getObject();
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public DistortedScreen getScreen()
+      {
+      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
+      return view.getRenderer().getScreen();
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public ObjectControl getControl()
diff --git a/src/main/java/org/distorted/main/RubikObjectLibInterface.java b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
index a990768b..774693ff 100644
--- a/src/main/java/org/distorted/main/RubikObjectLibInterface.java
+++ b/src/main/java/org/distorted/main/RubikObjectLibInterface.java
@@ -22,6 +22,7 @@ import com.google.android.play.core.tasks.Task;
 import com.google.firebase.analytics.FirebaseAnalytics;
 import com.google.firebase.crashlytics.FirebaseCrashlytics;
 
+import org.distorted.library.main.DistortedScreen;
 import org.distorted.library.message.EffectMessageSender;
 
 import org.distorted.external.RubikNetwork;
@@ -35,6 +36,9 @@ import org.distorted.dialogs.RubikDialogSolved;
 import org.distorted.external.RubikScores;
 import org.distorted.objects.RubikObject;
 import org.distorted.objects.RubikObjectList;
+import org.distorted.overlays.DataStars;
+import org.distorted.overlays.ListenerOverlay;
+import org.distorted.overlays.OverlayStars;
 import org.distorted.screens.RubikScreenPlay;
 import org.distorted.screens.RubikScreenReady;
 import org.distorted.screens.RubikScreenSolver;
@@ -45,11 +49,12 @@ import org.distorted.solvers.SolverMain;
 import java.lang.ref.WeakReference;
 
 import static org.distorted.external.RubikScores.RECORD_FIRST;
+import static org.distorted.external.RubikScores.RECORD_NEW;
 import static org.distorted.external.RubikScores.RECORD_NOT_NEW;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-public class RubikObjectLibInterface implements ObjectLibInterface
+public class RubikObjectLibInterface implements ObjectLibInterface, ListenerOverlay
 {
   private final WeakReference<RubikActivity> mAct;
   private int mIsNewRecord;
@@ -185,50 +190,6 @@ public class RubikObjectLibInterface implements ObjectLibInterface
       }
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void onWinEffectFinished(long startTime, long endTime, String debug, int scrambleNum)
-    {
-    if( ScreenList.getCurrentScreen()== ScreenList.SOLV )
-      {
-      RubikActivity act = mAct.get();
-      Bundle bundle = new Bundle();
-      bundle.putLong("time", mNewRecord );
-
-      reportRecord(act,startTime,endTime,debug,scrambleNum);
-      requestReview(act);
-
-      if( mIsNewRecord!=RECORD_NOT_NEW )
-        {
-        if( mIsNewRecord==RECORD_FIRST && RubikObjectList.thereAreLockedObjects() )
-          {
-
-          }
-        else
-          {
-          RubikDialogNewRecord dialog = new RubikDialogNewRecord();
-          dialog.setArguments(bundle);
-          dialog.show( act.getSupportFragmentManager(), RubikDialogNewRecord.getDialogTag() );
-          }
-        }
-      else
-        {
-        RubikDialogSolved dialog = new RubikDialogSolved();
-        dialog.setArguments(bundle);
-        dialog.show( act.getSupportFragmentManager(), RubikDialogSolved.getDialogTag() );
-        }
-
-      act.runOnUiThread(new Runnable()
-        {
-        @Override
-        public void run()
-          {
-          ScreenList.switchScreen( act, ScreenList.DONE);
-          }
-        });
-      }
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void onScrambleEffectFinished()
@@ -473,4 +434,64 @@ public class RubikObjectLibInterface implements ObjectLibInterface
       mLastCubitColor = -1;
       }
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void onWinEffectFinished(long startTime, long endTime, String debug, int scrambleNum)
+    {
+    if( ScreenList.getCurrentScreen()== ScreenList.SOLV )
+      {
+      RubikActivity act = mAct.get();
+      Bundle bundle = new Bundle();
+      bundle.putLong("time", mNewRecord );
+
+      reportRecord(act,startTime,endTime,debug,scrambleNum);
+      requestReview(act);
+
+      switch(mIsNewRecord)
+        {
+        case RECORD_FIRST  : RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
+                             int level = play.getLevel();
+                             RubikScores scores = RubikScores.getInstance();
+                             int totStars = scores.getNumStars();
+                             int newStars = RubikObjectList.computeNumStars(level);
+                             DistortedScreen screen = act.getScreen();
+
+                             OverlayStars stars = new OverlayStars();
+                             DataStars data  = new DataStars(totStars,newStars,act.getResources());
+                             stars.startOverlay(screen,this,data);
+                             break;
+        case RECORD_NEW    : RubikDialogNewRecord d2 = new RubikDialogNewRecord();
+                             d2.setArguments(bundle);
+                             d2.show( act.getSupportFragmentManager(), RubikDialogNewRecord.getDialogTag() );
+                             break;
+        case RECORD_NOT_NEW: RubikDialogSolved d3 = new RubikDialogSolved();
+                             d3.setArguments(bundle);
+                             d3.show( act.getSupportFragmentManager(), RubikDialogSolved.getDialogTag() );
+                             break;
+        }
+
+      act.runOnUiThread(new Runnable()
+        {
+        @Override
+        public void run()
+          {
+          ScreenList.switchScreen( act, ScreenList.DONE);
+          }
+        });
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void overlayFinished(long id)
+    {
+    RubikActivity act = mAct.get();
+    Bundle bundle = new Bundle();
+    bundle.putLong("time", mNewRecord );
+
+    RubikDialogNewRecord d2 = new RubikDialogNewRecord();
+    d2.setArguments(bundle);
+    d2.show( act.getSupportFragmentManager(), RubikDialogNewRecord.getDialogTag() );
+    }
 }
diff --git a/src/main/java/org/distorted/objects/RubikObjectList.java b/src/main/java/org/distorted/objects/RubikObjectList.java
index 66310769..7dc91015 100644
--- a/src/main/java/org/distorted/objects/RubikObjectList.java
+++ b/src/main/java/org/distorted/objects/RubikObjectList.java
@@ -20,12 +20,12 @@ import org.distorted.external.RubikScores;
 import org.distorted.main.RubikActivity;
 import org.distorted.objectlib.main.ObjectSignatures;
 import org.distorted.objectlib.main.ObjectType;
-import org.distorted.screens.RubikScreenPlay;
 
 import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
 import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
 import static org.distorted.main.RubikActivity.SHOW_DOWNLOADED_DEBUG;
 import static org.distorted.main.RubikActivity.SHOW_SOLVED_DEBUG;
+import static org.distorted.screens.RubikScreenPlay.LEVELS_SHOWN;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -147,6 +147,13 @@ public class RubikObjectList
     return true;
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static int computeNumStars(int level)
+    {
+    return level>=LEVELS_SHOWN ? 50 : level+1;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private static void restoreFreedObjects(SharedPreferences preferences)
@@ -210,7 +217,7 @@ public class RubikObjectList
     {
     RubikScores scores = RubikScores.getInstance();
     int numObjects = RubikObjectList.getNumObjects();
-    int level = RubikScreenPlay.LEVELS_SHOWN;
+    int level = LEVELS_SHOWN;
     int ret = 0;
 
     for(int obj=0; obj<numObjects; obj++)
diff --git a/src/main/java/org/distorted/overlays/DataGeneric.java b/src/main/java/org/distorted/overlays/DataGeneric.java
new file mode 100644
index 00000000..6b121a06
--- /dev/null
+++ b/src/main/java/org/distorted/overlays/DataGeneric.java
@@ -0,0 +1,18 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.overlays;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public abstract class DataGeneric
+{
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/distorted/overlays/DataStars.java b/src/main/java/org/distorted/overlays/DataStars.java
new file mode 100644
index 00000000..e28d4d01
--- /dev/null
+++ b/src/main/java/org/distorted/overlays/DataStars.java
@@ -0,0 +1,50 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.overlays;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+import android.content.res.Resources;
+
+public class DataStars extends DataGeneric
+{
+  private final int mTotStars, mNewStars;
+  private final Resources mRes;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public DataStars(int totStars, int newStars, Resources res)
+    {
+    mTotStars = totStars;
+    mNewStars = newStars;
+    mRes = res;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getTotal()
+    {
+    return mTotStars;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int getNew()
+    {
+    return mNewStars;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  Resources getResources()
+    {
+    return mRes;
+    }
+}
diff --git a/src/main/java/org/distorted/overlays/ListenerOverlay.java b/src/main/java/org/distorted/overlays/ListenerOverlay.java
new file mode 100644
index 00000000..e22ae7eb
--- /dev/null
+++ b/src/main/java/org/distorted/overlays/ListenerOverlay.java
@@ -0,0 +1,17 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.overlays;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public interface ListenerOverlay
+{
+  void overlayFinished(long id);
+}
\ No newline at end of file
diff --git a/src/main/java/org/distorted/overlays/OverlayGeneric.java b/src/main/java/org/distorted/overlays/OverlayGeneric.java
new file mode 100644
index 00000000..513d24c5
--- /dev/null
+++ b/src/main/java/org/distorted/overlays/OverlayGeneric.java
@@ -0,0 +1,19 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.overlays;
+
+import org.distorted.library.main.DistortedScreen;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public abstract class OverlayGeneric
+{
+   public abstract long startOverlay(DistortedScreen screen, ListenerOverlay listener, DataGeneric data);
+}
\ No newline at end of file
diff --git a/src/main/java/org/distorted/overlays/OverlayStars.java b/src/main/java/org/distorted/overlays/OverlayStars.java
new file mode 100644
index 00000000..3ec787b3
--- /dev/null
+++ b/src/main/java/org/distorted/overlays/OverlayStars.java
@@ -0,0 +1,94 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2022 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube is proprietary software licensed under an EULA which you should have received      //
+// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.overlays;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import org.distorted.library.effect.MatrixEffectRotate;
+import org.distorted.library.effect.MatrixEffectScale;
+import org.distorted.library.main.DistortedEffects;
+import org.distorted.library.main.DistortedNode;
+import org.distorted.library.main.DistortedScreen;
+import org.distorted.library.main.DistortedTexture;
+import org.distorted.library.mesh.MeshQuad;
+import org.distorted.library.message.EffectListener;
+import org.distorted.library.type.Dynamic1D;
+import org.distorted.library.type.Static1D;
+import org.distorted.library.type.Static3D;
+import org.distorted.main.R;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class OverlayStars extends OverlayGeneric implements EffectListener
+{
+   private ListenerOverlay mListener;
+   private DistortedNode mNode;
+   private DistortedScreen mScreen;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   private DistortedNode createNode(Resources res, int totS, int newS)
+      {
+      Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.star);
+      DistortedTexture texture = new DistortedTexture();
+      texture.setTexture(bmp);
+
+      float scale = 10;
+
+      Static1D point0   = new Static1D(0);
+      Static1D point360 = new Static1D(360);
+      Dynamic1D angle   = new Dynamic1D();
+      angle.add(point0);
+      angle.add(point360);
+      angle.setCount(1.0f);
+      angle.setDuration(5000);
+      Static3D axis = new Static3D(0,0,1);
+      Static3D center = new Static3D(0,0,0);
+
+      DistortedEffects effects = new DistortedEffects();
+      MatrixEffectScale scaleEffect = new MatrixEffectScale(scale);
+      MatrixEffectRotate rotateEffect = new MatrixEffectRotate(angle,axis,center);
+      effects.apply(scaleEffect);
+      effects.apply(rotateEffect);
+
+      rotateEffect.notifyWhenFinished(this);
+
+      MeshQuad mesh = new MeshQuad();
+
+      return new DistortedNode(texture,effects,mesh);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public long startOverlay(DistortedScreen screen, ListenerOverlay listener, DataGeneric data)
+      {
+      mScreen = screen;
+      mListener= listener;
+      DataStars stars = (DataStars)data;
+      int totS = stars.getTotal();
+      int newS = stars.getNew();
+      Resources res = stars.getResources();
+
+      mNode = createNode(res,totS,newS);
+      mScreen.attach(mNode);
+
+      return 0;
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public void effectFinished(long id)
+      {
+      mScreen.detach(mNode);
+      mListener.overlayFinished(id);
+      }
+}
\ No newline at end of file
diff --git a/src/main/res/layout/dialog_new_record.xml b/src/main/res/layout/dialog_new_record.xml
index c9277abd..0029a47f 100644
--- a/src/main/res/layout/dialog_new_record.xml
+++ b/src/main/res/layout/dialog_new_record.xml
@@ -26,7 +26,7 @@
             android:layout_marginRight="10dp"
             android:layout_marginBottom="10dp"/>
 
-         <TextView
+        <TextView
             android:id="@+id/new_record_submit"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 83de8d34..0b4d32ca 100755
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">Level %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f Sekunden</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 48244863..ccae3bd6 100755
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">Nivel %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f segundos</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index 6b18f8e6..8bfa97c2 100755
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">Niveau %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f secondes</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 8c342418..1a505b1a 100755
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -6,7 +6,7 @@
     <string name="error">エラー</string>
     <string name="effects">エフェクト</string>
     <string name="choose_pattern">パターンを選択</string>
-    <string name="solved">解答済</string>
+    <string name="solved">解決済み</string>
     <string name="new_record">新記録</string>
     <string name="new_record_submit">ハイスコアに提出しますか？</string>
     <string name="back">戻る</string>
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">レベル %1$d</string>
-    <string name="tm_placeholder">%1$02d：%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f 秒</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index d693df3e..32b5ac43 100755
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">레벨 %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f 초</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 01af3a03..d174d4cc 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">Poziom %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f sekund</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 08520b2b..72579911 100755
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -92,8 +92,5 @@
 
     <string name="ms_placeholder">%1$d мс</string>
     <string name="lv_placeholder">Уровень %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f сек.</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index f16d9398..8e21806b 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -96,10 +96,7 @@
     <string name="color_red">红色的</string>
     <string name="color_orange">橙色的</string>
 
-    <string name="ms_placeholder">%1$d 毫秒</string>
-    <string name="lv_placeholder">级别 %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
+    <string name="ms_placeholder">%1$d毫秒</string>
+    <string name="lv_placeholder">%1$d级</string>
     <string name="ti_placeholder">%1$.2f 秒</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index e39916df..2681355a 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -90,10 +90,7 @@
     <string name="color_red">紅色的</string>
     <string name="color_orange">橙色的</string>
 
-    <string name="ms_placeholder">%1$d 毫秒</string>
-    <string name="lv_placeholder">級別 %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
+    <string name="ms_placeholder">%1$d毫秒</string>
+    <string name="lv_placeholder">%1$d級</string>
     <string name="ti_placeholder">%1$.2f 秒</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
 </resources>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index fd65cb62..12020696 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -110,12 +110,14 @@
     <string name="color_red">red</string>
     <string name="color_orange">orange</string>
 
+    <string name="ns_placeholder" translatable="false">+%1$d</string>
+    <string name="sq_placeholder" translatable="false">%1$2d.</string>
+    <string name="mo_placeholder" translatable="false">%1$d/%2$d</string>
+    <string name="tm_placeholder" translatable="false">%1$02d:%2$02d</string>
+    <string name="ap_placeholder" translatable="false">%1$s %2$s</string>
+
     <string name="ms_placeholder">%1$d ms</string>
     <string name="lv_placeholder">Level %1$d</string>
-    <string name="tm_placeholder">%1$02d:%2$02d</string>
-    <string name="ap_placeholder">%1$s %2$s</string>
     <string name="ti_placeholder">%1$.2f seconds</string>
-    <string name="mo_placeholder">%1$d/%2$d</string>
-    <string name="sq_placeholder" translatable="false">%1$2d.</string>
 
 </resources>
