commit e71baee137df44e2d5123db4f0f5ff0c188db6ef
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri Mar 10 16:48:44 2023 +0100

    Dialog About.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogAbout.java b/src/main/java/org/distorted/dialogs/RubikDialogAbout.java
new file mode 100644
index 00000000..080f567e
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogAbout.java
@@ -0,0 +1,114 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// 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.dialogs;
+
+import android.app.Dialog;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+
+import androidx.fragment.app.FragmentActivity;
+
+import org.distorted.main.R;
+import org.distorted.main.RubikActivity;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogAbout extends RubikDialogAbstract
+  {
+  private static final String WHATS_NEW =
+      "1. Implement 2x2x3, Pyraminx & Skewb Diamond solvers.\n" +
+      "2. Connect the solvers to the scrambling engine. Which means: from now on, " +
+       "all puzzles which have a solver implemented will be perfectly scrambled " +
+       " - i.e. any scramble at Level 7 will always require exactly 7 moves to solve. " +
+       "Which also means that in some point in the future, we'll have to clear the High Scores.\n" +
+      "3. Implement Icosamate & Master Icosamate";
+
+  private static final String WHATS_COMING =
+      "1. Implemented Pocket Cube, Skewb solvers.\n" +
+      "2. Support for adjustable stickers.\n" +
+      "3. In-game currency (stars)\n" +
+      "4. More objects (Penrose Cubes, higher-order Jings, Ghost Cubes, more Mirrors, more Mixups)";
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onResume()
+    {
+    super.onResume();
+
+    Window window = getDialog().getWindow();
+
+    if( window!=null )
+      {
+      WindowManager.LayoutParams params = window.getAttributes();
+      params.width  = (int)Math.min( mHeight*0.60f,mWidth*0.90f );
+      window.setAttributes(params);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getResource()      { return R.layout.dialog_about; }
+  public int getTitleResource() { return PARAMETRIC_TITLE; }
+  public boolean hasArgument()  { return true; }
+  public int getPositive()      { return R.string.ok; }
+  public int getNegative()      { return -1; }
+  public void positiveAction()  { }
+  public void negativeAction()  { }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private String findCurrentVersion(RubikActivity act)
+    {
+    String version;
+    try
+      {
+      PackageInfo pInfo = act.getPackageManager().getPackageInfo( act.getPackageName(), 0);
+      version= pInfo.versionName;
+      }
+    catch (PackageManager.NameNotFoundException e)
+      {
+      version= "unknown";
+      }
+
+    return version;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  String getTitleString(FragmentActivity act)
+    {
+    Resources res= getResources();
+    RubikActivity ract= (RubikActivity) getContext();
+    String version= ract!=null ? findCurrentVersion(ract) : "unknown";
+    return res.getString(R.string.ab_placeholder,version);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
+    {
+    int margin= (int)(mHeight*0.010f);
+    int titleH= (int)(mHeight*0.035f);
+    int padd  = (int)(mHeight*0.010f);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getDialogTag()
+    {
+    return "DialogAbout";
+    }
+  }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogAbstract.java b/src/main/java/org/distorted/dialogs/RubikDialogAbstract.java
index 9669b526..105b6fec 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogAbstract.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogAbstract.java
@@ -32,6 +32,8 @@ import org.distorted.main.RubikActivity;
 
 abstract public class RubikDialogAbstract extends AppCompatDialogFragment
   {
+  static final int PARAMETRIC_TITLE = -10000;
+
   protected float mTitleSize, mButSize, mTextSize;
   protected int mWidth, mHeight;
   protected String mArgument;
@@ -47,6 +49,13 @@ abstract public class RubikDialogAbstract extends AppCompatDialogFragment
   abstract void negativeAction();
   abstract void prepareBody(Dialog dialog, View view, FragmentActivity act, float size);
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  String getTitleString(FragmentActivity act)
+    {
+    return "";
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   @NonNull
@@ -85,11 +94,21 @@ abstract public class RubikDialogAbstract extends AppCompatDialogFragment
     builder.setCancelable(true);
 
     int title = getTitleResource();
-    if( title>=0 )
+    if( title>=0 || title==PARAMETRIC_TITLE )
       {
       TextView tv = (TextView) inflater.inflate(R.layout.dialog_title, null);
       tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTitleSize);
-      tv.setText(title);
+
+      if( title>=0 )
+        {
+        tv.setText(title);
+        }
+      else
+        {
+        String titleString = getTitleString(act);
+        tv.setText(titleString);
+        }
+
       builder.setCustomTitle(tv);
       }
 
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogWhatsNew.java b/src/main/java/org/distorted/dialogs/RubikDialogWhatsNew.java
deleted file mode 100644
index 7dffd558..00000000
--- a/src/main/java/org/distorted/dialogs/RubikDialogWhatsNew.java
+++ /dev/null
@@ -1,179 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// 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.dialogs;
-
-import android.app.Dialog;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import androidx.fragment.app.FragmentActivity;
-
-import org.distorted.main.R;
-import org.distorted.main.RubikActivity;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class RubikDialogWhatsNew extends RubikDialogAbstract
-  {
-  private static final String[] MESSAGES =
-      {
-      "1.12.1",
-
-      "1. This dialog :)\n" +
-      "2. UI ready for NEW SOLVERS\n" +
-      "3. Important fix for a bug which used to let players solve any scramble with just one move\n" +
-      "4. Support for curved walls of cubies (preparation for Penrose Cubes)\n" +
-      "5. Support for scrambling algorithms (preparation for AI Cube & Camouflage Cubes)",
-
-      "1.12.2",
-
-      "1. Fixes for two critical crashers that appeared in the previous version.",
-
-      "1.12.3",
-
-      "1. Implement the first two solvers - Pyraminx Duo & Ivy Cube\n" +
-      "2. Implement AI Cube and Burr Cube\n" +
-      "3. Many fixes - for Trajber 4x4, touch control, creation of Bandaged Cuboids, scores dialog...",
-
-      "1.12.4",
-
-      "1. Implement 2x2x3, Pyraminx & Skewb Diamond solvers.\n" +
-      "2. Connect the solvers to the scrambling engine. Which means: from now on, " +
-       "all puzzles which have a solver implemented will be perfectly scrambled " +
-       " - i.e. any scramble at Level 7 will always require exactly 7 moves to solve. " +
-       "Which also means that in some point in the future, we'll have to clear the High Scores.\n" +
-      "3. Implement Icosamate & Master Icosamate",
-
-      "Coming",
-
-      "1. Implemented Pocket Cube, Skewb solvers.\n" +
-      "2. Support for adjustable stickers.\n" +
-      "3. In-game currency (stars)\n" +
-      "4. More objects (Penrose Cubes, the Double-Crazy, Ghost Cubes, more Mirrors, more Mixups, Clover Cube)"
-      };
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  @Override
-  public void onResume()
-    {
-    super.onResume();
-
-    Window window = getDialog().getWindow();
-
-    if( window!=null )
-      {
-      WindowManager.LayoutParams params = window.getAttributes();
-      params.width  = (int)Math.min( mHeight*0.65f,mWidth*0.98f );
-      window.setAttributes(params);
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int getResource()      { return R.layout.dialog_scrollable_panes; }
-  public int getTitleResource() { return R.string.whatsnew; }
-  public boolean hasArgument()  { return true; }
-  public int getPositive()      { return R.string.ok; }
-  public int getNegative()      { return -1; }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void positiveAction()
-    {
-
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void negativeAction()
-    {
-
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public void prepareBody(Dialog dialog, View view, FragmentActivity act, float size)
-    {
-    int margin= (int)(mHeight*0.010f);
-    int titleH= (int)(mHeight*0.035f);
-    int padd  = (int)(mHeight*0.010f);
-
-    LinearLayout layout= view.findViewById(R.id.dialog_scrollable_main_layout);
-    TextView text  = view.findViewById(R.id.dialog_scrollable_message);
-    text.setVisibility(View.GONE);
-
-    LinearLayout.LayoutParams pV = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT );
-    pV.setMargins(margin, margin, margin, 0);
-    LinearLayout.LayoutParams pL = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT );
-    pL.setMargins(margin, margin, margin, margin);
-    LinearLayout.LayoutParams pT = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, titleH );
-    LinearLayout.LayoutParams pM = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT );
-    pM.setMargins(0,2*margin,0,0);
-
-    RubikActivity ract = (RubikActivity) getContext();
-    int numMessages= MESSAGES.length/2;
-    String thisVersion = findCurrentVersion(ract);
-
-    for(int i=0; i<numMessages; i++)
-      {
-      String version = MESSAGES[2*i];
-      String message = MESSAGES[2*i+1];
-      boolean isCurrent = version.equals(thisVersion);
-
-      RubikDialogWhatsNewView pane = new RubikDialogWhatsNewView(ract,version,message,padd, isCurrent, (i==(numMessages-1) ? pL:pV),pT,pM);
-      layout.addView(pane.getView());
-      }
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private String findCurrentVersion(RubikActivity act)
-    {
-    String version;
-    try
-      {
-      PackageInfo pInfo = act.getPackageManager().getPackageInfo( act.getPackageName(), 0);
-      version= pInfo.versionName;
-      }
-    catch (PackageManager.NameNotFoundException e)
-      {
-      version= "unknown";
-      }
-
-    return version;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  private int findVersion(String version)
-    {
-    int len = MESSAGES.length;
-
-    for(int i=0; i<len; i++)
-      {
-      if( MESSAGES[i].equals(version) ) return i;
-      }
-
-    return 0;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public static String getDialogTag()
-    {
-    return "DialogSolvers";
-    }
-  }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogWhatsNewView.java b/src/main/java/org/distorted/dialogs/RubikDialogWhatsNewView.java
deleted file mode 100644
index f52ea347..00000000
--- a/src/main/java/org/distorted/dialogs/RubikDialogWhatsNewView.java
+++ /dev/null
@@ -1,49 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright 2023 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.view.View;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import org.distorted.main.R;
-import org.distorted.main.RubikActivity;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class RubikDialogWhatsNewView
-  {
-  private final View mView;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public RubikDialogWhatsNewView(final RubikActivity act, String version, String message, int padding, boolean isCurrent,
-                                 LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pTitle, LinearLayout.LayoutParams pMessage )
-    {
-    mView = act.getLayoutInflater().inflate(R.layout.dialog_whatsnew_pane, null);
-    mView.setLayoutParams(pView);
-    mView.setPadding(padding,padding,padding,padding);
-
-    TextView titleView = mView.findViewById(R.id.whatsnew_pane_title);
-    titleView.setText( isCurrent ? act.getString(R.string.tv_placeholder,version) : version );
-    titleView.setLayoutParams(pTitle);
-
-    TextView messView = mView.findViewById(R.id.whatsnew_pane_message);
-    messView.setText(message);
-    messView.setLayoutParams(pMessage);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public View getView()
-    {
-    return mView;
-    }
-  }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index ca3f9513..f4f74ce6 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -35,7 +35,7 @@ import com.google.firebase.inappmessaging.FirebaseInAppMessaging;
 
 import org.distorted.config.ConfigActivity;
 import org.distorted.bandaged.BandagedCreatorActivity;
-import org.distorted.dialogs.RubikDialogWhatsNew;
+import org.distorted.dialogs.RubikDialogAbout;
 import org.distorted.library.main.DistortedLibrary;
 
 import org.distorted.library.main.DistortedScreen;
@@ -300,9 +300,9 @@ public class RubikActivity extends AppCompatActivity
       {
       Bundle bundle = new Bundle();
       bundle.putString("argument",mOldVersion);
-      RubikDialogWhatsNew newDialog = new RubikDialogWhatsNew();
+      RubikDialogAbout newDialog = new RubikDialogAbout();
       newDialog.setArguments(bundle);
-      newDialog.show(getSupportFragmentManager(), RubikDialogWhatsNew.getDialogTag() );
+      newDialog.show(getSupportFragmentManager(), RubikDialogAbout.getDialogTag() );
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/screens/RubikScreenPlay.java b/src/main/java/org/distorted/screens/RubikScreenPlay.java
index 663ec973..bf5ed6b0 100644
--- a/src/main/java/org/distorted/screens/RubikScreenPlay.java
+++ b/src/main/java/org/distorted/screens/RubikScreenPlay.java
@@ -33,7 +33,7 @@ import android.widget.TextView;
 import org.distorted.dialogs.RubikDialogSolvers;
 import org.distorted.dialogs.RubikDialogStarsStatus;
 import org.distorted.dialogs.RubikDialogUpdates;
-import org.distorted.dialogs.RubikDialogWhatsNew;
+import org.distorted.dialogs.RubikDialogAbout;
 import org.distorted.external.RubikNetwork;
 import org.distorted.external.RubikScores;
 import org.distorted.external.RubikUpdates;
@@ -455,7 +455,7 @@ public class RubikScreenPlay extends RubikScreenBase implements RubikNetwork.Upd
         public void onClick(View v)
           {
           mMenuPopup.dismiss();
-          RubikDialogWhatsNew aDiag = new RubikDialogWhatsNew();
+          RubikDialogAbout aDiag = new RubikDialogAbout();
           aDiag.show(act.getSupportFragmentManager(), null);
           }
         });
diff --git a/src/main/res/drawable/ui_coming.png b/src/main/res/drawable/ui_coming.png
new file mode 100644
index 00000000..d7e8522d
Binary files /dev/null and b/src/main/res/drawable/ui_coming.png differ
diff --git a/src/main/res/drawable/ui_contact.png b/src/main/res/drawable/ui_contact.png
new file mode 100644
index 00000000..ed519943
Binary files /dev/null and b/src/main/res/drawable/ui_contact.png differ
diff --git a/src/main/res/drawable/ui_new.png b/src/main/res/drawable/ui_new.png
new file mode 100644
index 00000000..9bbfd03a
Binary files /dev/null and b/src/main/res/drawable/ui_new.png differ
diff --git a/src/main/res/drawable/ui_share.png b/src/main/res/drawable/ui_share.png
new file mode 100644
index 00000000..5bee5071
Binary files /dev/null and b/src/main/res/drawable/ui_share.png differ
diff --git a/src/main/res/layout/dialog_about.xml b/src/main/res/layout/dialog_about.xml
index c2f1041e..7251c975 100644
--- a/src/main/res/layout/dialog_about.xml
+++ b/src/main/res/layout/dialog_about.xml
@@ -6,8 +6,9 @@
     android:orientation="vertical">
 
     <LinearLayout
+        android:id="@+id/about_share_layout"
         android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="100dp"
         android:gravity="center|fill_horizontal"
         android:layout_marginLeft="10dp"
         android:layout_marginRight="10dp"
@@ -16,27 +17,39 @@
         android:orientation="horizontal">
 
         <ImageView
-            android:layout_gravity="center"
+            android:layout_gravity="top"
             android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:src="@drawable/share"/>
+            android:layout_marginStart="5dp"
+            android:layout_width="0dp"
+            android:layout_weight="0.25"
+            android:src="@drawable/ui_share"/>
 
-        <TextView
-            android:id="@+id/about_share_string"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:gravity="start"
-            android:textSize="24sp"
-            android:text="@string/share"
-            android:layout_marginTop="10dp"
-            android:layout_marginLeft="10dp"
-            android:layout_marginRight="10dp"
-            android:layout_marginBottom="10dp"/>
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:gravity="center|fill_horizontal"
+            android:background="@color/dark_grey"
+            android:orientation="vertical">
+
+            <TextView
+                android:id="@+id/about_share_string"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="start"
+                android:textSize="20sp"
+                android:text="@string/share"
+                android:layout_marginTop="5dp"
+                android:layout_marginLeft="10dp"
+                android:layout_marginRight="10dp"
+                android:layout_marginBottom="5dp"/>
+        </LinearLayout>
    </LinearLayout>
 
    <LinearLayout
+        android:id="@+id/about_email_layout"
         android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
+        android:layout_height="100dp"
         android:gravity="center|fill_horizontal"
         android:layout_marginLeft="10dp"
         android:layout_marginRight="10dp"
@@ -45,17 +58,18 @@
         android:orientation="horizontal">
 
         <ImageView
-            android:layout_gravity="center"
+            android:layout_gravity="top"
             android:layout_height="wrap_content"
-            android:layout_width="wrap_content"
-            android:src="@drawable/email"/>
+            android:layout_marginStart="5dp"
+            android:layout_width="0dp"
+            android:layout_weight="0.25"
+            android:src="@drawable/ui_contact"/>
 
         <LinearLayout
-            android:layout_width="match_parent"
+            android:layout_width="0dp"
             android:layout_height="match_parent"
+            android:layout_weight="1"
             android:gravity="center|fill_horizontal"
-            android:layout_marginLeft="10dp"
-            android:layout_marginRight="10dp"
             android:background="@color/dark_grey"
             android:orientation="vertical">
 
@@ -64,7 +78,7 @@
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="start"
-               android:textSize="18sp"
+               android:textSize="20sp"
                android:text="@string/contact"
                android:layout_marginTop="5dp"
                android:layout_marginLeft="10dp"
@@ -75,12 +89,111 @@
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="start"
-               android:textSize="18sp"
+               android:textSize="14sp"
                android:text="@string/email"
-               android:layout_marginTop="5dp"
+               android:layout_marginLeft="10dp"
+               android:layout_marginRight="10dp"/>
+            <TextView
+               android:id="@+id/about_mail_address"
+               android:layout_width="wrap_content"
+               android:layout_height="wrap_content"
+               android:gravity="start"
+               android:textSize="14sp"
+               android:text="@string/email_address"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginBottom="5dp"/>
         </LinearLayout>
    </LinearLayout>
+
+   <LinearLayout
+        android:id="@+id/about_new_layout"
+        android:layout_width="fill_parent"
+        android:layout_height="150dp"
+        android:gravity="center|fill_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginTop="5dp"
+        android:background="@color/dark_grey"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_gravity="top"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="5dp"
+            android:layout_width="0dp"
+            android:layout_weight="0.25"
+            android:src="@drawable/ui_new"/>
+
+        <ScrollView
+            android:id="@+id/new_scroll"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp">
+
+            <LinearLayout
+                 android:id="@+id/new_scrollable_main_layout"
+                 android:layout_width="match_parent"
+                 android:layout_height="wrap_content"
+                 android:orientation="vertical">
+
+                 <TextView
+                     android:id="@+id/new_scrollable_message"
+                     android:layout_width="match_parent"
+                     android:layout_height="match_parent"
+                     android:text="@string/credits1"
+                     android:gravity="start"/>
+            </LinearLayout>
+        </ScrollView>
+   </LinearLayout>
+
+   <LinearLayout
+        android:id="@+id/about_coming_layout"
+        android:layout_width="fill_parent"
+        android:layout_height="150dp"
+        android:gravity="center|fill_horizontal"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginTop="5dp"
+        android:background="@color/dark_grey"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:layout_gravity="top"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="5dp"
+            android:layout_width="0dp"
+            android:layout_weight="0.25"
+            android:src="@drawable/ui_coming"/>
+
+        <ScrollView
+            android:id="@+id/coming_scroll"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:paddingTop="10dp"
+            android:paddingBottom="10dp"
+            android:paddingLeft="10dp"
+            android:paddingRight="10dp">
+
+            <LinearLayout
+                 android:id="@+id/coming_scrollable_main_layout"
+                 android:layout_width="match_parent"
+                 android:layout_height="wrap_content"
+                 android:orientation="vertical">
+
+                 <TextView
+                     android:id="@+id/coming_scrollable_message"
+                     android:layout_width="match_parent"
+                     android:layout_height="match_parent"
+                     android:text="@string/credits2"
+                     android:gravity="start"/>
+            </LinearLayout>
+        </ScrollView>
+   </LinearLayout>
+
 </LinearLayout>
\ No newline at end of file
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 3823e075..143dc636 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -197,6 +197,8 @@
     <string name="solver_cube2_description">Not implemented yet.\nAuthor: Leszek Koltunski.</string>
     <string name="solver_skew2_description">Not implemented yet.\nAuthor: Leszek Koltunski.</string>
 
+    <string name="email_address" translatable="false">app.magic.cube@gmail.com</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>
