commit e16374207b4970d8c332622cd004054030eaceb3
Author: leszek <leszek@koltunski.pl>
Date:   Sat Mar 16 17:25:17 2024 +0100

    3 message dialogs.

diff --git a/src/main/java/org/distorted/bandaged/BandagedActivity.java b/src/main/java/org/distorted/bandaged/BandagedActivity.java
index 22d82f7e..56465ead 100644
--- a/src/main/java/org/distorted/bandaged/BandagedActivity.java
+++ b/src/main/java/org/distorted/bandaged/BandagedActivity.java
@@ -29,6 +29,7 @@ import androidx.appcompat.app.AppCompatActivity;
 import androidx.preference.PreferenceManager;
 
 import org.distorted.dialogs.RubikDialogError;
+import org.distorted.dialogs.RubikDialogMessage;
 import org.distorted.external.RubikFiles;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.main.MainActivity;
@@ -58,6 +59,7 @@ public class BandagedActivity extends AppCompatActivity
     private BandagedScreen mScreen;
     private boolean mRTL;
     private int mObjectOrdinal;
+    private boolean mDisplayMessageDialog;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -78,6 +80,8 @@ public class BandagedActivity extends AppCompatActivity
       mScreenWidth =displaymetrics.widthPixels;
       mScreenHeight=displaymetrics.heightPixels;
 
+      mDisplayMessageDialog = true;
+
       final Configuration config = getResources().getConfiguration();
       final int layoutDirection = config.getLayoutDirection();
       mRTL = layoutDirection==LAYOUT_DIRECTION_RTL;
@@ -230,6 +234,9 @@ public class BandagedActivity extends AppCompatActivity
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       SharedPreferences.Editor editor = preferences.edit();
       mScreen.savePreferences(editor);
+
+      editor.putBoolean("bandageDisplayDialog", mDisplayMessageDialog );
+
       editor.apply();
       }
 
@@ -239,6 +246,24 @@ public class BandagedActivity extends AppCompatActivity
       {
       SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
       mScreen.restorePreferences(this,preferences);
+
+      mDisplayMessageDialog = preferences.getBoolean("bandageDisplayDialog",true);
+
+      if( mDisplayMessageDialog )
+        {
+        Bundle bundle = new Bundle();
+        bundle.putString("argument", getString(R.string.bandage_message) );
+        RubikDialogMessage diag = new RubikDialogMessage();
+        diag.setArguments(bundle);
+        diag.show( getSupportFragmentManager(), RubikDialogMessage.getDialogTag() );
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void doNotShowDialogAnymore()
+      {
+      mDisplayMessageDialog = false;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/bandaged/BandagedRenderer.java b/src/main/java/org/distorted/bandaged/BandagedRenderer.java
index 4989376f..5b6335d9 100644
--- a/src/main/java/org/distorted/bandaged/BandagedRenderer.java
+++ b/src/main/java/org/distorted/bandaged/BandagedRenderer.java
@@ -290,6 +290,7 @@ public class BandagedRenderer implements GLSurfaceView.Renderer, DistortedLibrar
        {
        setupIconCreation(act);
        act.addObject(obj.getShortName());
+       act.doNotShowDialogAnymore();
        }
      }
 
diff --git a/src/main/java/org/distorted/config/ConfigActivity.java b/src/main/java/org/distorted/config/ConfigActivity.java
index 89fd778a..5cb255b0 100644
--- a/src/main/java/org/distorted/config/ConfigActivity.java
+++ b/src/main/java/org/distorted/config/ConfigActivity.java
@@ -22,6 +22,7 @@ import androidx.appcompat.app.AppCompatActivity;
 import androidx.preference.PreferenceManager;
 
 import org.distorted.dialogs.RubikDialogError;
+import org.distorted.dialogs.RubikDialogMessage;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.main.MainActivity;
 import org.distorted.main.R;
@@ -48,6 +49,7 @@ public class ConfigActivity extends AppCompatActivity
     private int mCurrentApiVersion;
     private int mObjectOrdinal;
     private boolean mSupportsAdjColors;
+    private boolean mDisplayMessageDialog;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -60,9 +62,10 @@ public class ConfigActivity extends AppCompatActivity
       setContentView(R.layout.config);
 
       Bundle b = getIntent().getExtras();
-
       if(b != null) mObjectOrdinal = b.getInt("obj");
 
+      mDisplayMessageDialog = true;
+
       DisplayMetrics displaymetrics = new DisplayMetrics();
       getWindowManager().getDefaultDisplay().getRealMetrics(displaymetrics);
       mScreenWidth =displaymetrics.widthPixels;
@@ -175,7 +178,7 @@ public class ConfigActivity extends AppCompatActivity
       OSInterface os = view.getInterface();
       os.setPreferences(preferences);
 
-      restorePreferences();
+      restorePreferences(preferences);
 
       if( mScreen==null ) mScreen = new ConfigScreen();
       mScreen.onAttachedToWindow(this,mObjectOrdinal);
@@ -193,6 +196,7 @@ public class ConfigActivity extends AppCompatActivity
         ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
         ObjectControl control = view.getObjectControl();
         control.repaintPuzzleFace(cubit,face,color);
+        mDisplayMessageDialog = false;
         }
       }
 
@@ -240,15 +244,28 @@ public class ConfigActivity extends AppCompatActivity
       os.setEditor(editor);
       view.getObjectControl().savePreferences();
 
+      editor.putBoolean("configDisplayDialog", mDisplayMessageDialog );
+
       editor.apply();
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-    private void restorePreferences()
+    private void restorePreferences(SharedPreferences preferences)
       {
       ConfigSurfaceView view = findViewById(R.id.configSurfaceView);
       view.getObjectControl().restoreStickers();
+
+      mDisplayMessageDialog = preferences.getBoolean("configDisplayDialog",true);
+
+      if( mDisplayMessageDialog )
+        {
+        Bundle bundle = new Bundle();
+        bundle.putString("argument", getString(R.string.config_message) );
+        RubikDialogMessage diag = new RubikDialogMessage();
+        diag.setArguments(bundle);
+        diag.show( getSupportFragmentManager(), RubikDialogMessage.getDialogTag() );
+        }
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java b/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java
index e13e5dcb..fa85c75f 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogAbandon.java
@@ -11,6 +11,7 @@ package org.distorted.dialogs;
 
 import android.app.Dialog;
 import android.view.View;
+import android.widget.TextView;
 
 import androidx.fragment.app.FragmentActivity;
 
@@ -22,13 +23,12 @@ import org.distorted.playui.ScreenList;
 
 public class RubikDialogAbandon extends RubikDialogAbstract
   {
-  public int getResource()      { return R.layout.abandon_solve; }
+  public int getResource()      { return R.layout.dialog_message; }
   public int getTitleResource() { return -1; }
   public boolean hasArgument()  { return false; }
   public int getPositive()      { return R.string.yes; }
   public int getNegative()      { return R.string.no; }
   public void negativeAction()  { }
-  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size) { }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -37,4 +37,12 @@ public class RubikDialogAbandon extends RubikDialogAbstract
     final PlayActivity act = (PlayActivity)getContext();
     ScreenList.goBack(act);
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
+    {
+    TextView mess = view.findViewById(R.id.dialog_message);
+    mess.setText(R.string.abandon_solve);
+    }
   }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogBandagedDelete.java b/src/main/java/org/distorted/dialogs/RubikDialogBandagedDelete.java
index 5ce25295..65e2e2c0 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogBandagedDelete.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogBandagedDelete.java
@@ -28,6 +28,7 @@ public class RubikDialogBandagedDelete extends RubikDialogAbstract
   public boolean hasArgument()  { return true; }
   public int getPositive()      { return R.string.yes; }
   public int getNegative()      { return R.string.no; }
+  public void negativeAction()  { }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -37,13 +38,6 @@ public class RubikDialogBandagedDelete extends RubikDialogAbstract
     if( bact!=null ) bact.deleteObject(mArgument);
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void negativeAction()
-    {
-
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogMessage.java b/src/main/java/org/distorted/dialogs/RubikDialogMessage.java
new file mode 100644
index 00000000..0cfcf2e4
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogMessage.java
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2024 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.dialogs;
+
+import android.app.Dialog;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.fragment.app.FragmentActivity;
+
+import org.distorted.main.R;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogMessage extends RubikDialogAbstract
+  {
+  public int getResource()      { return R.layout.dialog_message; }
+  public int getTitleResource() { return -1; }
+  public boolean hasArgument()  { return true; }
+  public int getPositive()      { return R.string.ok; }
+  public int getNegative()      { return -1; }
+  public void negativeAction()  { }
+  public void positiveAction()  { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
+    {
+    TextView mess = view.findViewById(R.id.dialog_message);
+    mess.setText(mArgument);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getDialogTag()
+    {
+    return "DialogBandageMessage";
+    }
+  }
diff --git a/src/main/java/org/distorted/main/MainActivity.java b/src/main/java/org/distorted/main/MainActivity.java
index d7a2ad3e..1b80239e 100644
--- a/src/main/java/org/distorted/main/MainActivity.java
+++ b/src/main/java/org/distorted/main/MainActivity.java
@@ -473,7 +473,7 @@ public class MainActivity extends AppCompatActivity implements RubikNetwork.Upda
       int vw = v.getWidth();
 
       MainSettingsPopup popup = new MainSettingsPopup(this,mSortMode,mScreenWidth,mScreenHeight);
-      popup.displayPopup(this,v,sw,sh,(int)((vw-sw)/2),0);
+      popup.displayPopup(this,v,sw,sh,((vw-sw)/2),0);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/solverui/ScreenSolver.java b/src/main/java/org/distorted/solverui/ScreenSolver.java
index 3731e55b..42306506 100644
--- a/src/main/java/org/distorted/solverui/ScreenSolver.java
+++ b/src/main/java/org/distorted/solverui/ScreenSolver.java
@@ -426,6 +426,7 @@ public class ScreenSolver extends ScreenAbstract
           ScreenList.switchScreen(act, ScreenList.SOLU);
           ScreenSolution solution = (ScreenSolution) ScreenList.SOLU.getScreenClass();
           solution.setupMoves(act, moves);
+          if( moves.length()>0 ) act.doNotShowDialogAnymore();
           }
         });
       }
@@ -448,6 +449,7 @@ public class ScreenSolver extends ScreenAbstract
           ScreenList.switchScreen(act, ScreenList.SOLU);
           ScreenSolution solution = (ScreenSolution) ScreenList.SOLU.getScreenClass();
           solution.setupMoves(act, moves);
+          if( moves!=null && moves.length>0 ) act.doNotShowDialogAnymore();
           }
         });
       }
diff --git a/src/main/java/org/distorted/solverui/SolverActivity.java b/src/main/java/org/distorted/solverui/SolverActivity.java
index a0cde4bd..571c429c 100644
--- a/src/main/java/org/distorted/solverui/SolverActivity.java
+++ b/src/main/java/org/distorted/solverui/SolverActivity.java
@@ -23,6 +23,7 @@ import androidx.appcompat.app.AppCompatActivity;
 import androidx.preference.PreferenceManager;
 
 import org.distorted.dialogs.RubikDialogError;
+import org.distorted.dialogs.RubikDialogMessage;
 import org.distorted.library.main.DistortedLibrary;
 import org.distorted.library.main.DistortedScreen;
 import org.distorted.main.MainActivity;
@@ -56,6 +57,7 @@ public class SolverActivity extends AppCompatActivity
     private int mHeightUpperBar;
     private int mSolverOrdinal;
     private int mObjectOrdinal;
+    private boolean mDisplayMessageDialog;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -77,6 +79,8 @@ public class SolverActivity extends AppCompatActivity
       mScreenWidth =displaymetrics.widthPixels;
       mScreenHeight=displaymetrics.heightPixels;
 
+      mDisplayMessageDialog = true;
+
       cutoutHack();
       computeBarHeights();
       }
@@ -222,6 +226,8 @@ public class SolverActivity extends AppCompatActivity
 
       ScreenList.savePreferences(editor);
 
+      editor.putBoolean("solverDisplayDialog", mDisplayMessageDialog );
+
       boolean success = editor.commit();
       if( !success ) android.util.Log.e("D", "Failed to save preferences");
       }
@@ -236,6 +242,24 @@ public class SolverActivity extends AppCompatActivity
         }
 
       ScreenList.restorePreferences(preferences);
+
+      mDisplayMessageDialog = preferences.getBoolean("solverDisplayDialog",true);
+
+      if( mDisplayMessageDialog )
+        {
+        Bundle bundle = new Bundle();
+        bundle.putString("argument", getString(R.string.solver_message) );
+        RubikDialogMessage diag = new RubikDialogMessage();
+        diag.setArguments(bundle);
+        diag.show( getSupportFragmentManager(), RubikDialogMessage.getDialogTag() );
+        }
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void doNotShowDialogAnymore()
+      {
+      mDisplayMessageDialog = false;
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/res/layout/abandon_solve.xml b/src/main/res/layout/abandon_solve.xml
deleted file mode 100644
index afc04019..00000000
--- a/src/main/res/layout/abandon_solve.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    android:layout_marginLeft="10dp"
-    android:layout_marginTop="0dp"
-    android:layout_marginRight="10dp"
-    android:background="@color/grey"
-    android:gravity="center|fill_horizontal">
-
-    <TextView
-        android:id="@+id/privacy_string"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:layout_marginLeft="10dp"
-        android:layout_marginTop="10dp"
-        android:layout_marginRight="10dp"
-        android:layout_marginBottom="10dp"
-        android:gravity="center"
-        android:text="@string/abandon_solve"
-        android:textSize="24sp" />
-</LinearLayout>
diff --git a/src/main/res/layout/dialog_message.xml b/src/main/res/layout/dialog_message.xml
new file mode 100644
index 00000000..f7bff814
--- /dev/null
+++ b/src/main/res/layout/dialog_message.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:layout_marginLeft="10dp"
+    android:layout_marginTop="0dp"
+    android:layout_marginRight="10dp"
+    android:background="@color/grey"
+    android:gravity="center|fill_horizontal">
+
+    <TextView
+        android:id="@+id/dialog_message"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="10dp"
+        android:layout_marginTop="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginBottom="10dp"
+        android:gravity="center"
+        android:textSize="24sp" />
+</LinearLayout>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index ed31da2e..877354d5 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -114,6 +114,10 @@
     <string name="config_corner">Corners</string>
     <string name="config_no_support">Current puzzle does not support adjusting colors.</string>
 
+    <string name="config_message">Touch the stickers to change their color.</string>
+    <string name="bandage_message">Bandage the cube by touching it.</string>
+    <string name="solver_message">Set up scrambled position by touching the stickers.</string>
+
     <string name="sort_classic">classic</string>
     <string name="sort_shape">shape</string>
     <string name="sort_difficulty">difficulty</string>
