commit c2d85688ccfecd951cf2cecf630fac780107b594
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Mon Jul 18 20:34:16 2022 +0200

    Lots of progress

diff --git a/distorted-sokoban/build.gradle b/distorted-sokoban/build.gradle
index 58ec2f4..11f0d23 100644
--- a/distorted-sokoban/build.gradle
+++ b/distorted-sokoban/build.gradle
@@ -26,6 +26,7 @@ dependencies {
     implementation 'com.google.firebase:firebase-analytics'
     implementation 'com.google.firebase:firebase-crashlytics'
     implementation 'com.google.firebase:firebase-inappmessaging-display'
+    implementation 'com.google.android.material:material:1.6.1'
     implementation "androidx.work:work-runtime:2.7.1"
 }
 
diff --git a/distorted-sokoban/src/main/AndroidManifest.xml b/distorted-sokoban/src/main/AndroidManifest.xml
index 88bd1d9..7ade1da 100644
--- a/distorted-sokoban/src/main/AndroidManifest.xml
+++ b/distorted-sokoban/src/main/AndroidManifest.xml
@@ -8,14 +8,14 @@
                         android:normalScreens="true" 
                         android:largeScreens="true" 
                         android:anyDensity="true"/>
-    
+
     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 
     <uses-feature android:name="android.hardware.touchscreen"/>
     
     <application android:icon="@drawable/icon" android:label="@string/app_name">
-        <activity android:name=".Sokoban"
+        <activity android:name=".SokobanSplash"
                   android:label="@string/app_name"
                   android:exported="true"
                   android:screenOrientation="portrait"
@@ -26,7 +26,7 @@
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
-        <activity android:name=".SokobanMain"
+        <activity android:name=".SokobanActivity"
                   android:exported="true"
                   android:screenOrientation="portrait"
                   android:label="@string/app_name"
diff --git a/distorted-sokoban/src/main/java/helpers/TransparentButton.java b/distorted-sokoban/src/main/java/helpers/TransparentButton.java
new file mode 100644
index 0000000..7611522
--- /dev/null
+++ b/distorted-sokoban/src/main/java/helpers/TransparentButton.java
@@ -0,0 +1,46 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 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 helpers;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.TypedValue;
+import android.widget.LinearLayout;
+
+import com.google.android.material.button.MaterialButton;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@SuppressLint("ViewConstructor")
+public class TransparentButton extends MaterialButton
+{
+   public TransparentButton(Context context, int resId, float textSize)
+      {
+      this(context, resId, textSize, 1.0f);
+      }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+   public TransparentButton(Context context, int resId, float textSize, float weight)
+      {
+      super(context);
+
+      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, weight);
+
+      setLayoutParams(params);
+      setPadding(0,0,0,0);
+      setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
+      setText(resId);
+
+      TypedValue outValue = new TypedValue();
+      context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
+      setBackgroundResource(outValue.resourceId);
+      }
+}
diff --git a/distorted-sokoban/src/main/java/helpers/TransparentImageButton.java b/distorted-sokoban/src/main/java/helpers/TransparentImageButton.java
new file mode 100644
index 0000000..d40a01e
--- /dev/null
+++ b/distorted-sokoban/src/main/java/helpers/TransparentImageButton.java
@@ -0,0 +1,50 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 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 helpers;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.util.TypedValue;
+import android.widget.LinearLayout;
+
+import com.google.android.material.button.MaterialButton;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+@SuppressLint("ViewConstructor")
+public class TransparentImageButton extends MaterialButton
+{
+  public static final int GRAVITY_START  = 0;
+  public static final int GRAVITY_MIDDLE = 1;
+  public static final int GRAVITY_END    = 2;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public TransparentImageButton(Context context, int icon, int gravity, LinearLayout.LayoutParams params)
+    {
+    super(context);
+
+    setLayoutParams(params);
+    setPadding(0,0,0,0);
+    setIconResource(icon);
+    setIconTint(null);
+
+    switch(gravity)
+      {
+      case GRAVITY_START : setIconGravity(MaterialButton.ICON_GRAVITY_START     ); break;
+      case GRAVITY_MIDDLE: setIconGravity(MaterialButton.ICON_GRAVITY_TEXT_START); break;
+      case GRAVITY_END   : setIconGravity(MaterialButton.ICON_GRAVITY_END       ); break;
+      }
+
+    TypedValue outValue = new TypedValue();
+    context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
+    setBackgroundResource(outValue.resourceId);
+    }
+}
diff --git a/distorted-sokoban/src/main/java/org/distorted/keyboard/StringBlock.java b/distorted-sokoban/src/main/java/org/distorted/keyboard/StringBlock.java
new file mode 100644
index 0000000..60685a8
--- /dev/null
+++ b/distorted-sokoban/src/main/java/org/distorted/keyboard/StringBlock.java
@@ -0,0 +1,201 @@
+package org.distorted.keyboard;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Paint.Align;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class StringBlock
+{
+	//private static final String TAG_BLOCK="SokobanStringBlock";
+	
+	private String str;
+	private int height,length;
+	private int realheight;
+	private int size, len;
+	private Paint mPaint;
+	private String buffer;
+	
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+	public StringBlock(String s, int h, int l)
+	{
+		str    =s;
+		length =l;
+		height =h;
+		len    = str.length();
+		
+		mPaint = new Paint();
+		buffer = new String();
+		
+		mPaint.setTextAlign(Align.LEFT);
+	    mPaint.setAntiAlias(true);
+	    mPaint.setFakeBoldText(true);
+	    
+	    size = computeOptimalSize();
+	}
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	public void draw(Canvas c, int x,int y, int color)
+	{
+		String tmp;
+	    int begin=0, end=0;
+	    int delta = (height-realheight)/2;
+	    
+	    mPaint.setColor(color);
+	    mPaint.setTextSize(size);
+		
+	    while( end>=0 && end<len )
+	      {
+	      end = getLine(str,size,begin,length);
+
+	      if( end>=0 )
+	        {
+	        if( str.charAt(begin) == '\n' ) begin++;
+
+	        if( end>begin )
+	          {
+	          tmp = str.substring(begin,end);
+
+	          if( end<len && str.charAt(end+1) != '\n' )
+	            displayJustified( tmp, size, x, y+delta, length, c);
+	          else  
+	        	c.drawText( tmp, x, y+delta+size, mPaint);  
+	          }
+
+	        y += (begin==end ? size/2 : size);
+	        begin = end;
+	        }
+	      }	
+	}
+	
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+	private void displayJustified(String str, int fontHeight, int x, int y, int length, Canvas c)
+    { 
+		int len       = str.length();
+		int numspaces = retNumSpaces(str);
+    
+		if( str.charAt(len-1) == ' ' ) numspaces--;
+
+		float left=x,w = (numspaces>0 ? (float)(length-mPaint.measureText(str))/numspaces : 0);
+		String tmp;
+		int begin,end=0;
+
+		while( end<len )
+		{
+			begin=end;
+			end = str.indexOf(' ', begin)+1;
+			if( end<=0 ) end = len;
+
+			tmp = str.substring(begin,end);
+			c.drawText( tmp, left, y+fontHeight, mPaint);
+			left+= (mPaint.measureText(tmp)+w);
+		}  
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	private int retNumSpaces(String str)
+    {
+		int begin=0, ret=0;
+
+		while( true )
+		{
+			begin = str.indexOf(' ', begin) +1;
+
+			if( begin>0 ) ret++;
+			else break;
+		}
+
+		return ret;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+	
+	  private int getLine(String text, int fontHeight, int begin, int width)
+	    {
+	    int nearestSpace   = text.indexOf(' ' , begin+1);
+	    int nearestNewline = text.indexOf('\n', begin+1);
+	    int len=0;
+	    
+	    mPaint.setTextSize(fontHeight);
+		
+	    if( nearestNewline>=0 && nearestNewline<nearestSpace ) return nearestNewline;
+	    if( nearestSpace<0 ) return text.length();
+	      
+	    buffer = text.substring(begin,nearestSpace);
+	        
+	    len = (int)mPaint.measureText(buffer);
+
+	    if( len>=width ) return nearestSpace+1;
+	        
+	    int lastSpace = nearestSpace;
+
+	    while( len<width )
+	      {
+	      lastSpace = nearestSpace;
+
+	      nearestNewline = text.indexOf('\n', lastSpace+1);
+	      nearestSpace   = text.indexOf(' ' , lastSpace+1);
+
+	      if( nearestNewline>=0 && nearestNewline<nearestSpace )
+	        {
+	        buffer = text.substring(begin,nearestNewline);
+	        len = (int)mPaint.measureText(buffer);
+	        return len<width ? nearestNewline : lastSpace+1;
+	        }
+	      if( nearestSpace<0 )
+	        {
+	    	buffer = text.substring(begin);      
+	    	len= (int)mPaint.measureText(buffer);
+	    	return len<width ? text.length()  : lastSpace+1;             
+	        }
+
+	      buffer = text.substring(begin,nearestSpace);
+	      len = (int)mPaint.measureText(buffer);
+	      }
+	    return lastSpace+1;
+	    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+	  private int computeOptimalSize()
+	  {
+		  int h=0, trysize=10;
+
+		  while( h<height )  
+			{
+			realheight = h;  
+			h = height(++trysize);
+			}
+  
+		  return trysize-1;
+	  }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+	  
+	  private int height(int trySize)
+	  {
+		  int y=0 , begin=0, end=0;
+		     
+		  while( end>=0 && end<len )
+		  {
+		      end = getLine(str,trySize,begin,length);
+
+		      if( end>=0 )
+		        {
+		        if( str.charAt(begin) == '\n' ) begin++;
+		        y += (begin==end ? trySize/2 : trySize);
+		        begin = end;
+		        }
+		  }
+ 
+		  return y;
+	  }
+		
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// end of RRStringBlock	
+}
diff --git a/distorted-sokoban/src/main/java/org/distorted/keyboard/TextFieldArea.java b/distorted-sokoban/src/main/java/org/distorted/keyboard/TextFieldArea.java
index 2466b62..f32fcfb 100644
--- a/distorted-sokoban/src/main/java/org/distorted/keyboard/TextFieldArea.java
+++ b/distorted-sokoban/src/main/java/org/distorted/keyboard/TextFieldArea.java
@@ -1,4 +1,4 @@
-package org.distorted.sokoban;
+package org.distorted.keyboard;
 
 import android.graphics.Canvas;
 import android.graphics.Paint;
diff --git a/distorted-sokoban/src/main/java/org/distorted/keyboard/TouchKeyboard.java b/distorted-sokoban/src/main/java/org/distorted/keyboard/TouchKeyboard.java
index 2dc71e3..4d10738 100644
--- a/distorted-sokoban/src/main/java/org/distorted/keyboard/TouchKeyboard.java
+++ b/distorted-sokoban/src/main/java/org/distorted/keyboard/TouchKeyboard.java
@@ -1,4 +1,4 @@
-package org.distorted.sokoban;
+package org.distorted.keyboard;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -14,6 +14,8 @@ import android.view.KeyEvent;
 import android.view.MotionEvent;
 import android.view.View;
 
+import org.distorted.sokoban.R;
+
 //import android.util.Log;
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/Sokoban.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/Sokoban.java
deleted file mode 100644
index 27facb5..0000000
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/Sokoban.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.distorted.sokoban;
-
-import android.app.Activity;
-import android.content.Intent;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.google.firebase.analytics.FirebaseAnalytics;
-import com.google.firebase.inappmessaging.FirebaseInAppMessaging;
-
-import org.distorted.messaging.SokobanInAppMessanging;
-
-///////////////////////////////////////////////////////////////////
-
-public class Sokoban extends Activity 
-{
-	private static final String TAG_SPLASH = "SokobanSplash";
-  private int sleepTime=2000;
-  private FirebaseAnalytics mFirebaseAnalytics;
-
-  private class SplashThread extends Thread
-    {
-   private boolean bootup=true;
-		
-		public void run() 
-		{
-			int milis=0;
-			
-			while(bootup)
-			{
-				try
-				{
-					milis+=100;
-					Thread.sleep(100);
-				}
-				catch( InterruptedException ex) {}
-			}
-			
-			if( milis<sleepTime )
-			{
-				try
-				{
-					Thread.sleep(sleepTime-milis);
-				}
-				catch( InterruptedException ex) {}
-			}
-			finish();
-			Intent mainInt = new Intent( getApplicationContext(), SokobanMain.class);     
-			startActivity(mainInt);
-		}
-		public void bootupReady()
-		{
-			bootup=false;
-		}
-    };
-    
-///////////////////////////////////////////////////////////////////
-	
-    public void onCreate(Bundle savedInstanceState) 
-      {
-    	super.onCreate(savedInstanceState);
-
-  	  setContentView(R.layout.splash);
-      sleepTime=2000;
-
-      mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
-      SokobanInAppMessanging listener = new SokobanInAppMessanging();
-
-      FirebaseInAppMessaging.getInstance().addClickListener(listener);
-      }
-
-///////////////////////////////////////////////////////////////////
-
-    public void onStart()
-    {
-    	Log.d( TAG_SPLASH, "onStart");
-    	
-    	super.onStart();
-    	
-    	SplashThread splashThread = new SplashThread();
-    	splashThread.start();
-    	
-    	SokobanLevels.init(this);
-        SokobanLevels sl = SokobanLevels.getInstance();
-        
-    	SokobanCanvas.init(this);
-    	SokobanCanvas.setActivity(this);
-    	
-    	SokobanDatabase.init(this);
-        SokobanTimer.init();
-        SokobanCanvas.setLevels(sl);
-        SokobanRecords.setLevels(sl);
-    	
-        splashThread.bootupReady();
-    }
-
-///////////////////////////////////////////////////////////////////
-// end of file
-}
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanActivity.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanActivity.java
new file mode 100644
index 0000000..9611dba
--- /dev/null
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanActivity.java
@@ -0,0 +1,308 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2016 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Distorted.                                                               //
+//                                                                                               //
+// Distorted is free software: you can redistribute it and/or modify                             //
+// it under the terms of the GNU General Public License as published by                          //
+// the Free Software Foundation, either version 2 of the License, or                             //
+// (at your option) any later version.                                                           //
+//                                                                                               //
+// Distorted is distributed in the hope that it will be useful,                                  //
+// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
+// GNU General Public License for more details.                                                  //
+//                                                                                               //
+// You should have received a copy of the GNU General Public License                             //
+// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                            //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.sokoban;
+
+import android.app.ListActivity;
+import android.os.Build;
+import android.os.Bundle;
+import android.util.DisplayMetrics;
+import android.util.TypedValue;
+import android.view.DisplayCutout;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import helpers.TransparentImageButton;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class SokobanActivity extends ListActivity
+  {
+  private static final String ITEM_IMAGE    = "item_image";
+  private static final String ITEM_TITLE    = "item_title";
+  private static final String ITEM_SUBTITLE = "item_subtitle"; 
+
+  private static final float RATIO_BAR    = 0.10f;
+  private static final float RATIO_INSET  = 0.09f;
+  private static final float MENU_SIZE    = 0.05f;
+
+  public static final int FLAGS =  View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+                                 | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+                                 | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+                                 | View.SYSTEM_UI_FLAG_FULLSCREEN
+                                 | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
+
+  private static int mScreenWidth, mScreenHeight;
+
+  private int mHeightUpperBar;
+  private int mCurrentApiVersion;
+  private TransparentImageButton mRecordsButton, mExitButton;
+  private TextView mAppName;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+   
+  @Override
+  public void onCreate(Bundle savedInstanceState) 
+    {
+    super.onCreate(savedInstanceState);
+
+    setTheme(R.style.MaterialThemeNoActionBar);
+    setContentView(R.layout.main);
+
+    DisplayMetrics displaymetrics = new DisplayMetrics();
+    getWindowManager().getDefaultDisplay().getRealMetrics(displaymetrics);
+    mScreenWidth =displaymetrics.widthPixels;
+    mScreenHeight=displaymetrics.heightPixels;
+
+    hideNavigationBar();
+    cutoutHack();
+
+    LinearLayout upper = findViewById(R.id.upper_layout);
+    createUpperLayout(upper);
+
+/*
+    final List<Map<String, Object>> data = new ArrayList<>();
+    final SparseArray<Class<? extends Activity>> activityMapping = new SparseArray<>();
+
+    int index=0;
+
+    for( Application app : Application.values() )
+      {
+      final Map<String, Object> item = new HashMap<>();
+      item.put(ITEM_IMAGE, app.icon);
+      item.put(ITEM_TITLE, (index+1)+". "+getText(app.title));
+      item.put(ITEM_SUBTITLE, getText(app.subtitle));
+      data.add(item);
+      activityMapping.put(index++, app.activity);
+      }
+
+    final SimpleAdapter dataAdapter = new SimpleAdapter( this,
+                                                         data,
+                                                         R.layout.toc_item,
+                                                         new String[] {ITEM_IMAGE, ITEM_TITLE, ITEM_SUBTITLE},
+                                                         new int[] {R.id.Image, R.id.Title, R.id.SubTitle}  );
+    setListAdapter(dataAdapter);
+      
+    getListView().setOnItemClickListener(new OnItemClickListener()
+      {
+      @Override
+      public void onItemClick(AdapterView<?> parent, View view, int position, long id)
+        {
+        final Class<? extends Activity> activityToLaunch = activityMapping.get(position);
+            
+        if (activityToLaunch != null)
+          {
+          final Intent launchIntent = new Intent(SokobanActivity.this, activityToLaunch);
+          startActivity(launchIntent);
+          }
+        }
+      });
+
+ */
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onAttachedToWindow()
+    {
+    super.onAttachedToWindow();
+
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+      {
+      DisplayCutout cutout = getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();
+      int insetHeight = cutout!=null ? cutout.getSafeInsetTop() : 0;
+      LinearLayout layoutHid = findViewById(R.id.hiddenBar);
+      ViewGroup.LayoutParams paramsHid = layoutHid.getLayoutParams();
+      paramsHid.height = (int)(insetHeight*RATIO_INSET);
+      layoutHid.setLayoutParams(paramsHid);
+      mHeightUpperBar += paramsHid.height;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  @Override
+  public void onWindowFocusChanged(boolean hasFocus)
+    {
+    super.onWindowFocusChanged(hasFocus);
+
+    if(mCurrentApiVersion >= Build.VERSION_CODES.KITKAT && hasFocus)
+      {
+      getWindow().getDecorView().setSystemUiVisibility(FLAGS);
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void createUpperLayout(LinearLayout upper)
+    {
+    mHeightUpperBar = (int)(mScreenHeight*RATIO_BAR);
+    ViewGroup.LayoutParams paramsTop = upper.getLayoutParams();
+    paramsTop.height = mHeightUpperBar;
+    upper.setLayoutParams(paramsTop);
+
+    setupRecordsButton();
+    upper.addView(mRecordsButton);
+    setupAppName();
+    upper.addView(mAppName);
+    setupExitButton();
+    upper.addView(mExitButton);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupRecordsButton()
+    {
+    final int icon = getDrawable(R.drawable.ui_records_s,R.drawable.ui_records_m, R.drawable.ui_records_b, R.drawable.ui_records_h);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mRecordsButton = new TransparentImageButton(this, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
+
+    mRecordsButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View view)
+        {
+
+        }
+      });
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupExitButton()
+    {
+    final int icon = getDrawable(R.drawable.ui_exit_s,R.drawable.ui_exit_m, R.drawable.ui_exit_b, R.drawable.ui_exit_h);
+    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
+    mExitButton = new TransparentImageButton(this, icon, TransparentImageButton.GRAVITY_MIDDLE, params);
+
+    mExitButton.setOnClickListener( new View.OnClickListener()
+      {
+      @Override
+      public void onClick(View view)
+        {
+        finish();
+        }
+      });
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void setupAppName()
+    {
+    int titleSize = (int)(mScreenWidth*MENU_SIZE);
+    mAppName = new TextView(this);
+    mAppName.setText(R.string.app_name);
+    mAppName.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void hideNavigationBar()
+    {
+    mCurrentApiVersion = Build.VERSION.SDK_INT;
+
+    if(mCurrentApiVersion >= Build.VERSION_CODES.KITKAT)
+      {
+      final View decorView = getWindow().getDecorView();
+      decorView.setSystemUiVisibility(FLAGS);
+
+      decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener()
+        {
+        @Override
+        public void onSystemUiVisibilityChange(int visibility)
+          {
+          if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
+            {
+            decorView.setSystemUiVisibility(FLAGS);
+            }
+          }
+        });
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// do not avoid cutouts
+
+  private void cutoutHack()
+    {
+    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
+      {
+      getWindow().getAttributes().layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getHeightUpperBar()
+    {
+    return mHeightUpperBar;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getScreenWidthInPixels()
+    {
+    return mScreenWidth;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public int getScreenHeightInPixels()
+    {
+    return mScreenHeight;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static int getDrawableSize()
+    {
+    if( mScreenHeight<1000 )
+      {
+      return 0;
+      }
+    if( mScreenHeight<1600 )
+      {
+      return 1;
+      }
+    if( mScreenHeight<1900 )
+      {
+      return 2;
+      }
+    return 3;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static int getDrawable(int small, int medium, int big, int huge)
+    {
+    int size = getDrawableSize();
+
+    switch(size)
+      {
+      case 0 : return small;
+      case 1 : return medium;
+      case 2 : return big;
+      default: return huge;
+      }
+    }
+  }
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanCanvas.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanCanvas.java
index 67ead8c..f5c0553 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanCanvas.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanCanvas.java
@@ -75,8 +75,7 @@ public class SokobanCanvas extends SurfaceView implements SurfaceHolder.Callback
 	private GraphicsThread mThread;
 	public  static String mVersionStr="";
 	private Paint mPaint = new Paint();
-	private static int isKorean;
-	
+
     private class GraphicsThread extends Thread 
     {
         private SurfaceHolder mSurfaceHolder;
@@ -191,9 +190,8 @@ public class SokobanCanvas extends SurfaceView implements SurfaceHolder.Callback
 		Log.d(TAG_CANVAS, "init");
 		
 		Resources res = act.getResources();
-		isKorean = res.getInteger(R.integer.is_korean);
-		
-	    if( scrWidth<=0 || scrHeight<=0 )
+
+	  if( scrWidth<=0 || scrHeight<=0 )
 		  {
 		  DisplayMetrics dm = new DisplayMetrics();
 		  act.getWindowManager().getDefaultDisplay().getMetrics(dm);
@@ -453,13 +451,7 @@ public class SokobanCanvas extends SurfaceView implements SurfaceHolder.Callback
 	  
 	public static String getIso()
 	{
-		if( isKorean==1 )
-		  {
-		  return "kr";
-		  }
-		else
-		  {
-          String ret="";
+     String ret="";
 		
 		  TelephonyManager tM =((TelephonyManager) mAct.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE));
 		
@@ -474,7 +466,6 @@ public class SokobanCanvas extends SurfaceView implements SurfaceHolder.Callback
 		    }
 		
 		  return ret;
-		  }		
 	}
 	
 ///////////////////////////////////////////////////////////////////
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanDatabase.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanDatabase.java
index 7b0a63c..252e2f8 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanDatabase.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanDatabase.java
@@ -6,6 +6,7 @@ import android.provider.Settings.Secure;
 import android.util.Log;
 import android.app.Activity;
 
+import java.lang.ref.WeakReference;
 import java.util.Map;
 
 ///////////////////////////////////////////////////////////////////
@@ -29,9 +30,8 @@ public class SokobanDatabase
 	private static String iso = null;
 	 
 	private static SokobanLevels mLevels;
-	private static SokobanDatabase rms =null;
-	
-	private static Context  context;
+	private static SokobanDatabase mThis =null;
+	private final WeakReference<Context> mContext;
 	
 
 	private static final String[] bl = new String[]
@@ -631,7 +631,7 @@ public class SokobanDatabase
 
 	private SokobanDatabase( Context co )
 	{
-	    context= co;
+	    mContext = new WeakReference<>(co);
 	    
 	    mLevels = SokobanLevels.getInstance();
 	    numrunnings = 0;
@@ -643,7 +643,7 @@ public class SokobanDatabase
 	    
 	    for(int i=0; i<BUILTIN_LEVELS; i++)
 	      {
-	      int xlen = Integer.valueOf(bl[2*i]).intValue();
+	      int xlen = Integer.parseInt(bl[2*i]);
 	      SokobanLevel sl = new SokobanLevel( null, null, INVALID, INVALID, null, false,xlen, bl[2*i+1]);
 	      mLevels.addLevel(sl,i);
 	      }
@@ -652,7 +652,7 @@ public class SokobanDatabase
 	    
 	    try
 		  {
-		  SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
+		  SharedPreferences settings = co.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
 		  readPreferences(settings);
 		  }
 		catch( Exception ex )
@@ -1012,7 +1012,8 @@ public class SokobanDatabase
 		
 		try
 		  {
-		  String s = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);	
+		  Context co = mContext.get();
+		  String s = Secure.getString(co.getContentResolver(), Secure.ANDROID_ID);
 		  ret = s!=null ? s.hashCode():0;
 		  }
 		catch(Exception ex)
@@ -1026,11 +1027,11 @@ public class SokobanDatabase
 
 ///////////////////////////////////////////////////////////////////
 	
-	public static boolean saveValues()
+	public boolean saveValues()
 	    {
 		//Log.e(TAG_DB, "saveValues: "+finishedBootup);
 		
-	    if( finishedBootup==false ) return false;
+	    if( !finishedBootup ) return false;
 
 	    boolean ret = false;
 	   
@@ -1040,7 +1041,8 @@ public class SokobanDatabase
 	    
 	    try
 	      {
-          SharedPreferences settings = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
+	        Context co = mContext.get();
+          SharedPreferences settings = co.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE);
           SharedPreferences.Editor editor = settings.edit();
 	      
           editor.putString("1", username);
@@ -1112,7 +1114,7 @@ public class SokobanDatabase
 
 	public static void init(Activity act)
 	{
-		rms = new SokobanDatabase((Context)act);
+	  if( mThis==null ) mThis = new SokobanDatabase((Context)act);
 	}
 
 ///////////////////////////////////////////////////////////////////
@@ -1201,7 +1203,7 @@ public class SokobanDatabase
 
 	public static SokobanDatabase getInstance()
 	{
-		return rms;
+		return mThis;
 	}
 
 ///////////////////////////////////////////////////////////////////
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevels.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevels.java
index fe6bca8..b061fc0 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevels.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanLevels.java
@@ -133,8 +133,8 @@ public class SokobanLevels
       mPaint = new Paint();
       mPaint.setStyle(Style.FILL);
       
-      mLevels = new Vector<SokobanLevel>();
-      mFlags  = new Vector<Flag>();
+      mLevels = new Vector<>();
+      mFlags  = new Vector<>();
       
       createImages();
       
@@ -146,7 +146,7 @@ public class SokobanLevels
 
   public static void init(Activity act)
   {
-	  if( scrWidth<=0 || scrHeight<=0 )
+	if( scrWidth<=0 || scrHeight<=0 )
 		{
 		DisplayMetrics dm = new DisplayMetrics();
 		act.getWindowManager().getDefaultDisplay().getMetrics(dm);
@@ -155,17 +155,17 @@ public class SokobanLevels
 		scrHeight= Math.max(dm.widthPixels,dm.heightPixels);
 		}
 		
-      levels = new SokobanLevels((Context)act);
+    levels = new SokobanLevels((Context)act);
   }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   private void createImages()
   {
-      NinePatchDrawable play,pack,dpck,levl, dpck_small, pack_small, dialog, dlgred;
+    NinePatchDrawable play,pack,dpck,levl, dpck_small, pack_small, dialog, dlgred;
 	  Canvas c;
 	  
-      try
+    try
       {
     	  play = (NinePatchDrawable)res.getDrawable(R.drawable.play);
     	  pack = (NinePatchDrawable)res.getDrawable(R.drawable.pack);
@@ -176,8 +176,7 @@ public class SokobanLevels
     	  dpck_small = (NinePatchDrawable)res.getDrawable(R.drawable.dpck_small);
     	  
     	  dialog     = (NinePatchDrawable)res.getDrawable(R.drawable.dialog);
-          dlgred     = (NinePatchDrawable)res.getDrawable(R.drawable.dialog_clicked);
-    	  
+        dlgred     = (NinePatchDrawable)res.getDrawable(R.drawable.dialog_clicked);
       }
       catch( Exception ex ) { Log.e(TAG_LEVELS, "Failed to create 9Patches!"); return; }
 
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMain.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMain.java
index c2dda4f..9eebaae 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMain.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMain.java
@@ -5,6 +5,11 @@ import android.os.Bundle;
 import android.util.Log;
 import android.view.ViewGroup;
 
+import com.google.firebase.analytics.FirebaseAnalytics;
+import com.google.firebase.inappmessaging.FirebaseInAppMessaging;
+
+import org.distorted.messaging.SokobanInAppMessanging;
+
 ///////////////////////////////////////////////////////////////////
 
 public class SokobanMain extends Activity 
@@ -12,25 +17,30 @@ public class SokobanMain extends Activity
 	private static final String TAG_MAIN = "SokobanMain";
 	private SokobanCanvas rrc=null;
 	private int runningTime = -1;
-	
+	private FirebaseAnalytics mFirebaseAnalytics;
+
 ///////////////////////////////////////////////////////////////////
 	
-    public void onCreate(Bundle savedInstanceState) 
+  public void onCreate(Bundle savedInstanceState)
     {
-    	super.onCreate(savedInstanceState);
-    	Log.d( TAG_MAIN, "onCreate");
-    	initCanvas();
-	}
+    super.onCreate(savedInstanceState);
+    Log.d( TAG_MAIN, "onCreate");
+    initCanvas();
+
+    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
+    SokobanInAppMessanging listener = new SokobanInAppMessanging();
+    FirebaseInAppMessaging.getInstance().addClickListener(listener);
+	  }
 
 ///////////////////////////////////////////////////////////////////
 
 	public void onStart() 
-	{	
+	  {
 		super.onStart();
 		Log.d( TAG_MAIN, "onStart");
 		if( !SokobanCanvas.isCreated() ) initCanvas();
 		if( rrc!=null ) SokobanCanvas.setRepaint();
-	}
+	  }
 
 ///////////////////////////////////////////////////////////////////
 
@@ -40,7 +50,8 @@ public class SokobanMain extends Activity
 		
 		if( SokobanCanvas.getDestroy() )
 		  {
-          SokobanDatabase.saveValues();
+		      SokobanDatabase db = SokobanDatabase.getInstance();
+          db.saveValues();
           if( rrc!=null ) rrc.deallocate();
           System.gc();
           }
@@ -102,7 +113,14 @@ public class SokobanMain extends Activity
 		  }
 		else setContentView(R.layout.error);
 	}
-	
+
+///////////////////////////////////////////////////////////////////
+
+  public FirebaseAnalytics getAnalytics()
+		{
+		return mFirebaseAnalytics;
+		}
+
 ///////////////////////////////////////////////////////////////////
 // end of file
 }
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMenu.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMenu.java
index 62fcdcf..516eeb4 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMenu.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanMenu.java
@@ -13,6 +13,9 @@ import android.graphics.Rect;
 import android.content.Context;
 import android.content.res.Resources;
 
+import org.distorted.keyboard.StringBlock;
+import org.distorted.keyboard.TouchKeyboard;
+
 //import android.util.Log;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -57,7 +60,7 @@ public final class SokobanMenu implements TouchKeyboard.VirtualKeyboardListener
   private int dialogX,dialogY0,dialogY1,dialogY2,dialogY3,dialogM;
   private TouchKeyboard tkb = null;
   private static int nameChangeAction =ACTION_NONE;
-  private SokobanStringBlock blockHelptext;
+  private StringBlock blockHelptext;
 
   private int softkeyState = SOFT_NOT;
   private int comeBackState=SokobanCanvas.STATE_MAIN;
@@ -780,7 +783,7 @@ public final class SokobanMenu implements TouchKeyboard.VirtualKeyboardListener
     if( blockHelptext==null )
       {
       int helpHeight  = dialogY0-3*gap-mFontH-sFontH;
-      blockHelptext   = new SokobanStringBlock( strHelptxt, helpHeight, len-2*gap);
+      blockHelptext   = new StringBlock( strHelptxt, helpHeight, len-2*gap);
       }
     blockHelptext.draw(c,(scrWidth-len)/2+gap,(scrHeight-dialogY0)/2+mFontH+sFontH+2*gap, SokobanCanvas.COLOR_BLACK);
     }
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecords.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecords.java
index 756e28e..46fddbe 100644
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecords.java
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanRecords.java
@@ -26,7 +26,6 @@ public class SokobanRecords implements Runnable
 
 	private static boolean mRunning;
 	private static boolean mDirtyRecords;
-	private static Thread mNetworkThrd = null;
 	private static int mode;
 
 	private static int lv;
@@ -97,9 +96,8 @@ public class SokobanRecords implements Runnable
 	    if( !mRunning )
 	      {
 	      mRunning = true;
-	      mNetworkThrd = new Thread(this);
-	      mNetworkThrd.start();
-
+	      Thread networkThrd = new Thread(this);
+	      networkThrd.start();
 	      return true;
 	      }
 
@@ -321,7 +319,7 @@ public class SokobanRecords implements Runnable
 	  private void fillLevelsData( String data )
 	    {
         int len = data.length();
-        int begin=-1 ,end = -1;
+        int begin=-1 ,end;
 
         while( begin<len )
           {
@@ -348,11 +346,11 @@ public class SokobanRecords implements Runnable
           {
           try
             {
-            int level= Integer.valueOf( row.substring(   0,s1) ).intValue();
+            int level= Integer.parseInt( row.substring(   0,s1) );
             String n = row.substring(s1+1,s2);
             String c = row.substring(s2+1,s3);
-       //   int rows = Integer.valueOf( row.substring(s3+1,s4) ).intValue();
-            int cols = Integer.valueOf( row.substring(s4+1,s5) ).intValue();
+       //   int rows = Integer.parseInt( row.substring(s3+1,s4) );
+            int cols = Integer.parseInt( row.substring(s4+1,s5) );
             String p = row.substring(s5+1,s6);
 
             SokobanLevel sl = new SokobanLevel(n,c,SokobanDatabase.INVALID, SokobanDatabase.INVALID,null,false,cols,p);
@@ -368,7 +366,7 @@ public class SokobanRecords implements Runnable
 	  private void fillData( String data )
         {
         int len = data.length();
-        int begin=-1 ,end = -1;
+        int begin=-1 ,end;
 
         while( begin<len )
           {
@@ -397,10 +395,10 @@ public class SokobanRecords implements Runnable
           {
           try
             {
-            int l = Integer.valueOf( row.substring(   0,s1) ).intValue();
-            int m = Integer.valueOf( row.substring(s1+1,s2) ).intValue();
-            int t = Integer.valueOf( row.substring(s2+1,s3) ).intValue();
-            int p = Integer.valueOf( row.substring(s3+1,s4) ).intValue();
+            int l = Integer.parseInt(row.substring(   0,s1));
+            int m = Integer.parseInt(row.substring(s1+1,s2));
+            int t = Integer.parseInt(row.substring(s2+1,s3));
+            int p = Integer.parseInt(row.substring(s3+1,s4));
             String n = row.substring(s4+1,s5);
             String c = row.substring(s5+1,s6);
 
@@ -423,7 +421,7 @@ public class SokobanRecords implements Runnable
 
 	  public void downloadRecords()
         {
-        if( mDirtyRecords==true )
+        if( mDirtyRecords )
           {
           mode = DOWNLOADR;
           name = SokobanDatabase.getName();
@@ -488,7 +486,7 @@ public class SokobanRecords implements Runnable
         {
         if( s==null ) return "";
 
-        StringBuffer sbuf = new StringBuffer();
+        StringBuilder sbuf = new StringBuilder();
         int len = s.length();
 
         for (int i = 0; i < len; i++) 
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanSplash.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanSplash.java
new file mode 100644
index 0000000..e5e3675
--- /dev/null
+++ b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanSplash.java
@@ -0,0 +1,90 @@
+package org.distorted.sokoban;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+import com.google.firebase.analytics.FirebaseAnalytics;
+import com.google.firebase.inappmessaging.FirebaseInAppMessaging;
+
+import org.distorted.messaging.SokobanInAppMessanging;
+
+///////////////////////////////////////////////////////////////////
+
+public class SokobanSplash extends Activity
+{
+	private int sleepTime=2000;
+
+  private class SplashThread extends Thread
+    {
+    private boolean bootup=true;
+		
+		public void run() 
+		  {
+			int milis=0;
+			
+			while(bootup)
+			  {
+				try
+				  {
+					milis+=100;
+					Thread.sleep(100);
+				  }
+				catch( InterruptedException ex) { }
+			  }
+			
+			if( milis<sleepTime )
+			  {
+				try
+				  {
+					Thread.sleep(sleepTime-milis);
+				  }
+				catch( InterruptedException ex) { }
+			  }
+
+			finish();
+			Intent mainInt = new Intent( getApplicationContext(), SokobanActivity.class);
+			startActivity(mainInt);
+		  }
+		public void bootupReady()
+		{
+			bootup=false;
+		}
+    };
+    
+///////////////////////////////////////////////////////////////////
+	
+  public void onCreate(Bundle savedInstanceState)
+    {
+    super.onCreate(savedInstanceState);
+  	setContentView(R.layout.splash);
+    sleepTime=2000;
+    }
+
+///////////////////////////////////////////////////////////////////
+
+  public void onStart()
+    {
+    super.onStart();
+    	
+    SplashThread splashThread = new SplashThread();
+    splashThread.start();
+    	
+    SokobanLevels.init(this);
+    SokobanLevels sl = SokobanLevels.getInstance();
+        
+    SokobanCanvas.init(this);
+    SokobanCanvas.setActivity(this);
+    	
+    SokobanDatabase.init(this);
+    SokobanTimer.init();
+    SokobanCanvas.setLevels(sl);
+    SokobanRecords.setLevels(sl);
+
+    splashThread.bootupReady();
+    }
+
+///////////////////////////////////////////////////////////////////
+// end of file
+}
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanStringBlock.java b/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanStringBlock.java
deleted file mode 100644
index 2e171a1..0000000
--- a/distorted-sokoban/src/main/java/org/distorted/sokoban/SokobanStringBlock.java
+++ /dev/null
@@ -1,201 +0,0 @@
-package org.distorted.sokoban;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Paint.Align;
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-public class SokobanStringBlock 
-{
-	//private static final String TAG_BLOCK="SokobanStringBlock";
-	
-	private String str;
-	private int height,length;
-	private int realheight;
-	private int size, len;
-	private Paint mPaint;
-	private String buffer;
-	
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-	public SokobanStringBlock(String s, int h, int l)
-	{
-		str    =s;
-		length =l;
-		height =h;
-		len    = str.length();
-		
-		mPaint = new Paint();
-		buffer = new String();
-		
-		mPaint.setTextAlign(Align.LEFT);
-	    mPaint.setAntiAlias(true);
-	    mPaint.setFakeBoldText(true);
-	    
-	    size = computeOptimalSize();
-	}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-	
-	public void draw(Canvas c, int x,int y, int color)
-	{
-		String tmp;
-	    int begin=0, end=0;
-	    int delta = (height-realheight)/2;
-	    
-	    mPaint.setColor(color);
-	    mPaint.setTextSize(size);
-		
-	    while( end>=0 && end<len )
-	      {
-	      end = getLine(str,size,begin,length);
-
-	      if( end>=0 )
-	        {
-	        if( str.charAt(begin) == '\n' ) begin++;
-
-	        if( end>begin )
-	          {
-	          tmp = str.substring(begin,end);
-
-	          if( end<len && str.charAt(end+1) != '\n' )
-	            displayJustified( tmp, size, x, y+delta, length, c);
-	          else  
-	        	c.drawText( tmp, x, y+delta+size, mPaint);  
-	          }
-
-	        y += (begin==end ? size/2 : size);
-	        begin = end;
-	        }
-	      }	
-	}
-	
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-	private void displayJustified(String str, int fontHeight, int x, int y, int length, Canvas c)
-    { 
-		int len       = str.length();
-		int numspaces = retNumSpaces(str);
-    
-		if( str.charAt(len-1) == ' ' ) numspaces--;
-
-		float left=x,w = (numspaces>0 ? (float)(length-mPaint.measureText(str))/numspaces : 0);
-		String tmp;
-		int begin,end=0;
-
-		while( end<len )
-		{
-			begin=end;
-			end = str.indexOf(' ', begin)+1;
-			if( end<=0 ) end = len;
-
-			tmp = str.substring(begin,end);
-			c.drawText( tmp, left, y+fontHeight, mPaint);
-			left+= (mPaint.measureText(tmp)+w);
-		}  
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-	
-	private int retNumSpaces(String str)
-    {
-		int begin=0, ret=0;
-
-		while( true )
-		{
-			begin = str.indexOf(' ', begin) +1;
-
-			if( begin>0 ) ret++;
-			else break;
-		}
-
-		return ret;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-	
-	  private int getLine(String text, int fontHeight, int begin, int width)
-	    {
-	    int nearestSpace   = text.indexOf(' ' , begin+1);
-	    int nearestNewline = text.indexOf('\n', begin+1);
-	    int len=0;
-	    
-	    mPaint.setTextSize(fontHeight);
-		
-	    if( nearestNewline>=0 && nearestNewline<nearestSpace ) return nearestNewline;
-	    if( nearestSpace<0 ) return text.length();
-	      
-	    buffer = text.substring(begin,nearestSpace);
-	        
-	    len = (int)mPaint.measureText(buffer);
-
-	    if( len>=width ) return nearestSpace+1;
-	        
-	    int lastSpace = nearestSpace;
-
-	    while( len<width )
-	      {
-	      lastSpace = nearestSpace;
-
-	      nearestNewline = text.indexOf('\n', lastSpace+1);
-	      nearestSpace   = text.indexOf(' ' , lastSpace+1);
-
-	      if( nearestNewline>=0 && nearestNewline<nearestSpace )
-	        {
-	        buffer = text.substring(begin,nearestNewline);
-	        len = (int)mPaint.measureText(buffer);
-	        return len<width ? nearestNewline : lastSpace+1;
-	        }
-	      if( nearestSpace<0 )
-	        {
-	    	buffer = text.substring(begin);      
-	    	len= (int)mPaint.measureText(buffer);
-	    	return len<width ? text.length()  : lastSpace+1;             
-	        }
-
-	      buffer = text.substring(begin,nearestSpace);
-	      len = (int)mPaint.measureText(buffer);
-	      }
-	    return lastSpace+1;
-	    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-	  private int computeOptimalSize()
-	  {
-		  int h=0, trysize=10;
-
-		  while( h<height )  
-			{
-			realheight = h;  
-			h = height(++trysize);
-			}
-  
-		  return trysize-1;
-	  }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-	  
-	  private int height(int trySize)
-	  {
-		  int y=0 , begin=0, end=0;
-		     
-		  while( end>=0 && end<len )
-		  {
-		      end = getLine(str,trySize,begin,length);
-
-		      if( end>=0 )
-		        {
-		        if( str.charAt(begin) == '\n' ) begin++;
-		        y += (begin==end ? trySize/2 : trySize);
-		        begin = end;
-		        }
-		  }
- 
-		  return y;
-	  }
-		
-///////////////////////////////////////////////////////////////////////////////////////////////////
-// end of RRStringBlock	
-}
diff --git a/distorted-sokoban/src/main/res/drawable-hdpi/grb.jpg b/distorted-sokoban/src/main/res/drawable-hdpi/grb.jpg
deleted file mode 100644
index fed7dc8..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-hdpi/grb.jpg and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-hdpi/icon_korean.png b/distorted-sokoban/src/main/res/drawable-hdpi/icon_korean.png
deleted file mode 100644
index f149efc..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-hdpi/icon_korean.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-hdpi/icon_playbook.png b/distorted-sokoban/src/main/res/drawable-hdpi/icon_playbook.png
deleted file mode 100644
index 21f90d4..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-hdpi/icon_playbook.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/afg.png b/distorted-sokoban/src/main/res/drawable-nodpi/afg.png
deleted file mode 100644
index 2d83227..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/afg.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/alb.png b/distorted-sokoban/src/main/res/drawable-nodpi/alb.png
deleted file mode 100644
index 54f2407..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/alb.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/alg.png b/distorted-sokoban/src/main/res/drawable-nodpi/alg.png
deleted file mode 100644
index c98c9eb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/alg.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/and.png b/distorted-sokoban/src/main/res/drawable-nodpi/and.png
deleted file mode 100644
index 7aaaf16..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/and.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/arg.png b/distorted-sokoban/src/main/res/drawable-nodpi/arg.png
deleted file mode 100644
index 234d14d..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/arg.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/arm.png b/distorted-sokoban/src/main/res/drawable-nodpi/arm.png
deleted file mode 100644
index ad4008e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/arm.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/aus.png b/distorted-sokoban/src/main/res/drawable-nodpi/aus.png
deleted file mode 100644
index 6b04be9..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/aus.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/aut.png b/distorted-sokoban/src/main/res/drawable-nodpi/aut.png
deleted file mode 100644
index a0bd158..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/aut.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/aze.png b/distorted-sokoban/src/main/res/drawable-nodpi/aze.png
deleted file mode 100644
index 1c41b05..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/aze.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bah.png b/distorted-sokoban/src/main/res/drawable-nodpi/bah.png
deleted file mode 100644
index c41dbed..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bah.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ban.png b/distorted-sokoban/src/main/res/drawable-nodpi/ban.png
deleted file mode 100644
index 04d5218..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ban.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bel.png b/distorted-sokoban/src/main/res/drawable-nodpi/bel.png
deleted file mode 100644
index f72586c..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bel.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bhu.png b/distorted-sokoban/src/main/res/drawable-nodpi/bhu.png
deleted file mode 100644
index 5850970..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bhu.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bir.png b/distorted-sokoban/src/main/res/drawable-nodpi/bir.png
deleted file mode 100644
index 1422b1c..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bir.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/blr.png b/distorted-sokoban/src/main/res/drawable-nodpi/blr.png
deleted file mode 100644
index 34a10c7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/blr.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/blz.png b/distorted-sokoban/src/main/res/drawable-nodpi/blz.png
deleted file mode 100644
index e0d5aab..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/blz.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bol.png b/distorted-sokoban/src/main/res/drawable-nodpi/bol.png
deleted file mode 100644
index bf72279..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bol.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bos.png b/distorted-sokoban/src/main/res/drawable-nodpi/bos.png
deleted file mode 100644
index 86fa653..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bos.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bra.png b/distorted-sokoban/src/main/res/drawable-nodpi/bra.png
deleted file mode 100644
index 240fea3..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bra.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bru.png b/distorted-sokoban/src/main/res/drawable-nodpi/bru.png
deleted file mode 100644
index c43f70b..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bru.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/bul.png b/distorted-sokoban/src/main/res/drawable-nodpi/bul.png
deleted file mode 100644
index d488f2e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/bul.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/can.png b/distorted-sokoban/src/main/res/drawable-nodpi/can.png
deleted file mode 100644
index c6c01c9..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/can.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cey.png b/distorted-sokoban/src/main/res/drawable-nodpi/cey.png
deleted file mode 100644
index 4e4cfab..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cey.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/chi.png b/distorted-sokoban/src/main/res/drawable-nodpi/chi.png
deleted file mode 100644
index 6a92eb0..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/chi.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/chn.png b/distorted-sokoban/src/main/res/drawable-nodpi/chn.png
deleted file mode 100644
index 4aef943..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/chn.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/col.png b/distorted-sokoban/src/main/res/drawable-nodpi/col.png
deleted file mode 100644
index d3b1f76..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/col.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cos.png b/distorted-sokoban/src/main/res/drawable-nodpi/cos.png
deleted file mode 100644
index 9edd60d..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cos.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cro.png b/distorted-sokoban/src/main/res/drawable-nodpi/cro.png
deleted file mode 100644
index c843463..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cro.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cub.png b/distorted-sokoban/src/main/res/drawable-nodpi/cub.png
deleted file mode 100644
index 1708014..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cub.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cyp.png b/distorted-sokoban/src/main/res/drawable-nodpi/cyp.png
deleted file mode 100644
index 038dd75..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cyp.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/cze.png b/distorted-sokoban/src/main/res/drawable-nodpi/cze.png
deleted file mode 100644
index a359daf..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/cze.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/den.png b/distorted-sokoban/src/main/res/drawable-nodpi/den.png
deleted file mode 100644
index 646acbe..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/den.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/dom.png b/distorted-sokoban/src/main/res/drawable-nodpi/dom.png
deleted file mode 100644
index ebcb9af..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/dom.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ecu.png b/distorted-sokoban/src/main/res/drawable-nodpi/ecu.png
deleted file mode 100644
index e5ffbbd..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ecu.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/egy.png b/distorted-sokoban/src/main/res/drawable-nodpi/egy.png
deleted file mode 100644
index 0352973..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/egy.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/esp.png b/distorted-sokoban/src/main/res/drawable-nodpi/esp.png
deleted file mode 100644
index 7bda8f9..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/esp.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/est.png b/distorted-sokoban/src/main/res/drawable-nodpi/est.png
deleted file mode 100644
index ba8738d..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/est.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/fin.png b/distorted-sokoban/src/main/res/drawable-nodpi/fin.png
deleted file mode 100644
index 8c1f704..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/fin.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/fra.png b/distorted-sokoban/src/main/res/drawable-nodpi/fra.png
deleted file mode 100644
index f9dc3e7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/fra.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/geo.png b/distorted-sokoban/src/main/res/drawable-nodpi/geo.png
deleted file mode 100644
index e14132e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/geo.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ger.png b/distorted-sokoban/src/main/res/drawable-nodpi/ger.png
deleted file mode 100644
index 9de865f..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ger.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/gre.png b/distorted-sokoban/src/main/res/drawable-nodpi/gre.png
deleted file mode 100644
index 7ef08fb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/gre.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/gua.png b/distorted-sokoban/src/main/res/drawable-nodpi/gua.png
deleted file mode 100644
index 6ca3f4e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/gua.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/gum.png b/distorted-sokoban/src/main/res/drawable-nodpi/gum.png
deleted file mode 100644
index 3625608..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/gum.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/guy.png b/distorted-sokoban/src/main/res/drawable-nodpi/guy.png
deleted file mode 100644
index fbf082e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/guy.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/hai.png b/distorted-sokoban/src/main/res/drawable-nodpi/hai.png
deleted file mode 100644
index 74633b0..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/hai.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/hk.png b/distorted-sokoban/src/main/res/drawable-nodpi/hk.png
deleted file mode 100644
index 4f59b03..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/hk.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/hon.png b/distorted-sokoban/src/main/res/drawable-nodpi/hon.png
deleted file mode 100644
index 502f340..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/hon.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/hun.png b/distorted-sokoban/src/main/res/drawable-nodpi/hun.png
deleted file mode 100644
index ad2f913..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/hun.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ina.png b/distorted-sokoban/src/main/res/drawable-nodpi/ina.png
deleted file mode 100644
index 497a5c2..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ina.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ind.png b/distorted-sokoban/src/main/res/drawable-nodpi/ind.png
deleted file mode 100644
index 549b167..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ind.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/irl.png b/distorted-sokoban/src/main/res/drawable-nodpi/irl.png
deleted file mode 100644
index f19e962..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/irl.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/irn.png b/distorted-sokoban/src/main/res/drawable-nodpi/irn.png
deleted file mode 100644
index b5eba7e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/irn.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/irq.png b/distorted-sokoban/src/main/res/drawable-nodpi/irq.png
deleted file mode 100644
index 005aee7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/irq.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/isl.png b/distorted-sokoban/src/main/res/drawable-nodpi/isl.png
deleted file mode 100644
index 66cca16..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/isl.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/isr.png b/distorted-sokoban/src/main/res/drawable-nodpi/isr.png
deleted file mode 100644
index d705a21..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/isr.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ita.png b/distorted-sokoban/src/main/res/drawable-nodpi/ita.png
deleted file mode 100644
index eee4b34..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ita.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/jam.png b/distorted-sokoban/src/main/res/drawable-nodpi/jam.png
deleted file mode 100644
index 98be5eb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/jam.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/jap.png b/distorted-sokoban/src/main/res/drawable-nodpi/jap.png
deleted file mode 100644
index 6a2cfd6..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/jap.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/jor.png b/distorted-sokoban/src/main/res/drawable-nodpi/jor.png
deleted file mode 100644
index 0ccb7a3..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/jor.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/kaz.png b/distorted-sokoban/src/main/res/drawable-nodpi/kaz.png
deleted file mode 100644
index 7107ce3..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/kaz.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/kor.png b/distorted-sokoban/src/main/res/drawable-nodpi/kor.png
deleted file mode 100644
index e633b32..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/kor.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/kuw.png b/distorted-sokoban/src/main/res/drawable-nodpi/kuw.png
deleted file mode 100644
index 6d1af47..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/kuw.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/kyr.png b/distorted-sokoban/src/main/res/drawable-nodpi/kyr.png
deleted file mode 100644
index ada941b..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/kyr.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lao.png b/distorted-sokoban/src/main/res/drawable-nodpi/lao.png
deleted file mode 100644
index 7deb33a..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lao.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lat.png b/distorted-sokoban/src/main/res/drawable-nodpi/lat.png
deleted file mode 100644
index 2c0fb61..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lat.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/leb.png b/distorted-sokoban/src/main/res/drawable-nodpi/leb.png
deleted file mode 100644
index 8e6b0a9..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/leb.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lib.png b/distorted-sokoban/src/main/res/drawable-nodpi/lib.png
deleted file mode 100644
index bcdb258..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lib.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lie.png b/distorted-sokoban/src/main/res/drawable-nodpi/lie.png
deleted file mode 100644
index fb04261..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lie.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lit.png b/distorted-sokoban/src/main/res/drawable-nodpi/lit.png
deleted file mode 100644
index 3cd22d8..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lit.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/lux.png b/distorted-sokoban/src/main/res/drawable-nodpi/lux.png
deleted file mode 100644
index 9ee38ef..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/lux.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mac.png b/distorted-sokoban/src/main/res/drawable-nodpi/mac.png
deleted file mode 100644
index a471cf2..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mac.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mal.png b/distorted-sokoban/src/main/res/drawable-nodpi/mal.png
deleted file mode 100644
index 71ea0b7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mal.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mco.png b/distorted-sokoban/src/main/res/drawable-nodpi/mco.png
deleted file mode 100644
index 24cb3f3..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mco.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mda.png b/distorted-sokoban/src/main/res/drawable-nodpi/mda.png
deleted file mode 100644
index 86540bc..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mda.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mex.png b/distorted-sokoban/src/main/res/drawable-nodpi/mex.png
deleted file mode 100644
index ac97ec7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mex.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/miq.png b/distorted-sokoban/src/main/res/drawable-nodpi/miq.png
deleted file mode 100644
index 070a55b..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/miq.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mld.png b/distorted-sokoban/src/main/res/drawable-nodpi/mld.png
deleted file mode 100644
index 0988276..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mld.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mly.png b/distorted-sokoban/src/main/res/drawable-nodpi/mly.png
deleted file mode 100644
index baa5524..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mly.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mna.png b/distorted-sokoban/src/main/res/drawable-nodpi/mna.png
deleted file mode 100644
index bcf28dd..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mna.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mnt.png b/distorted-sokoban/src/main/res/drawable-nodpi/mnt.png
deleted file mode 100644
index 969a65c..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mnt.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mon.png b/distorted-sokoban/src/main/res/drawable-nodpi/mon.png
deleted file mode 100644
index f8f36cd..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mon.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/mor.png b/distorted-sokoban/src/main/res/drawable-nodpi/mor.png
deleted file mode 100644
index 0141c38..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/mor.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ned.png b/distorted-sokoban/src/main/res/drawable-nodpi/ned.png
deleted file mode 100644
index c84fcfb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ned.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/nep.png b/distorted-sokoban/src/main/res/drawable-nodpi/nep.png
deleted file mode 100644
index bc74fae..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/nep.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/nic.png b/distorted-sokoban/src/main/res/drawable-nodpi/nic.png
deleted file mode 100644
index eeef391..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/nic.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/nig.png b/distorted-sokoban/src/main/res/drawable-nodpi/nig.png
deleted file mode 100644
index 05c98cb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/nig.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/nor.png b/distorted-sokoban/src/main/res/drawable-nodpi/nor.png
deleted file mode 100644
index 29b3df1..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/nor.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/nz.png b/distorted-sokoban/src/main/res/drawable-nodpi/nz.png
deleted file mode 100644
index 15fc4f1..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/nz.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/omn.png b/distorted-sokoban/src/main/res/drawable-nodpi/omn.png
deleted file mode 100644
index b6abf4a..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/omn.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/pak.png b/distorted-sokoban/src/main/res/drawable-nodpi/pak.png
deleted file mode 100644
index e0d97bb..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/pak.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/pan.png b/distorted-sokoban/src/main/res/drawable-nodpi/pan.png
deleted file mode 100644
index afb4c06..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/pan.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/pap.png b/distorted-sokoban/src/main/res/drawable-nodpi/pap.png
deleted file mode 100644
index a3c0bb7..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/pap.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/par.png b/distorted-sokoban/src/main/res/drawable-nodpi/par.png
deleted file mode 100644
index f610919..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/par.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/per.png b/distorted-sokoban/src/main/res/drawable-nodpi/per.png
deleted file mode 100644
index 8360c4c..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/per.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/phi.png b/distorted-sokoban/src/main/res/drawable-nodpi/phi.png
deleted file mode 100644
index 3d5ccae..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/phi.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/pol.png b/distorted-sokoban/src/main/res/drawable-nodpi/pol.png
deleted file mode 100644
index 3e98f4c..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/pol.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/por.png b/distorted-sokoban/src/main/res/drawable-nodpi/por.png
deleted file mode 100644
index 540115e..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/por.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/prk.png b/distorted-sokoban/src/main/res/drawable-nodpi/prk.png
deleted file mode 100644
index c719fae..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/prk.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/qat.png b/distorted-sokoban/src/main/res/drawable-nodpi/qat.png
deleted file mode 100644
index 5c8ce2f..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/qat.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/rom.png b/distorted-sokoban/src/main/res/drawable-nodpi/rom.png
deleted file mode 100644
index 2c2f864..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/rom.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/rus.png b/distorted-sokoban/src/main/res/drawable-nodpi/rus.png
deleted file mode 100644
index 317ed07..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/rus.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/sal.png b/distorted-sokoban/src/main/res/drawable-nodpi/sal.png
deleted file mode 100644
index 0d8e918..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/sal.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/sar.png b/distorted-sokoban/src/main/res/drawable-nodpi/sar.png
deleted file mode 100644
index 03cff07..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/sar.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/sin.png b/distorted-sokoban/src/main/res/drawable-nodpi/sin.png
deleted file mode 100644
index f0dd79d..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/sin.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/slo.png b/distorted-sokoban/src/main/res/drawable-nodpi/slo.png
deleted file mode 100644
index 2b9ac6a..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/slo.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/sma.png b/distorted-sokoban/src/main/res/drawable-nodpi/sma.png
deleted file mode 100644
index a214a39..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/sma.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/srb.png b/distorted-sokoban/src/main/res/drawable-nodpi/srb.png
deleted file mode 100644
index 36a8808..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/srb.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/sur.png b/distorted-sokoban/src/main/res/drawable-nodpi/sur.png
deleted file mode 100644
index c11073a..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/sur.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/svk.png b/distorted-sokoban/src/main/res/drawable-nodpi/svk.png
deleted file mode 100644
index 76ed967..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/svk.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/swe.png b/distorted-sokoban/src/main/res/drawable-nodpi/swe.png
deleted file mode 100644
index 3e4af23..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/swe.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/swi.png b/distorted-sokoban/src/main/res/drawable-nodpi/swi.png
deleted file mode 100644
index 86f858b..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/swi.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/syr.png b/distorted-sokoban/src/main/res/drawable-nodpi/syr.png
deleted file mode 100644
index 64bf2de..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/syr.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/tha.png b/distorted-sokoban/src/main/res/drawable-nodpi/tha.png
deleted file mode 100644
index 00236d9..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/tha.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/tjk.png b/distorted-sokoban/src/main/res/drawable-nodpi/tjk.png
deleted file mode 100644
index dc77671..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/tjk.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/tkm.png b/distorted-sokoban/src/main/res/drawable-nodpi/tkm.png
deleted file mode 100644
index 033c031..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/tkm.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/tun.png b/distorted-sokoban/src/main/res/drawable-nodpi/tun.png
deleted file mode 100644
index 3b4541a..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/tun.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/tur.png b/distorted-sokoban/src/main/res/drawable-nodpi/tur.png
deleted file mode 100644
index 1a2d7a6..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/tur.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/twn.png b/distorted-sokoban/src/main/res/drawable-nodpi/twn.png
deleted file mode 100644
index 7344986..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/twn.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/uae.png b/distorted-sokoban/src/main/res/drawable-nodpi/uae.png
deleted file mode 100644
index c6bbf02..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/uae.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_b.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_b.png
new file mode 100644
index 0000000..2c9187f
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_b.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_h.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_h.png
new file mode 100644
index 0000000..cd89f7f
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_h.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_m.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_m.png
new file mode 100644
index 0000000..d2a0a88
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_m.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_s.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_s.png
new file mode 100644
index 0000000..c5ced8a
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_exit_s.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_b.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_b.png
new file mode 100644
index 0000000..be7885c
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_b.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_h.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_h.png
new file mode 100644
index 0000000..3836be6
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_h.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_m.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_m.png
new file mode 100644
index 0000000..ec28017
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_m.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_s.png b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_s.png
new file mode 100644
index 0000000..c0afa31
Binary files /dev/null and b/distorted-sokoban/src/main/res/drawable-nodpi/ui_records_s.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/uk.png b/distorted-sokoban/src/main/res/drawable-nodpi/uk.png
deleted file mode 100644
index 5d5c608..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/uk.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ukr.png b/distorted-sokoban/src/main/res/drawable-nodpi/ukr.png
deleted file mode 100644
index be02497..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ukr.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/unk.png b/distorted-sokoban/src/main/res/drawable-nodpi/unk.png
index ff7a8d5..e69de29 100644
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/unk.png and b/distorted-sokoban/src/main/res/drawable-nodpi/unk.png differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/uru.png b/distorted-sokoban/src/main/res/drawable-nodpi/uru.png
deleted file mode 100644
index 0b55892..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/uru.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/usa.png b/distorted-sokoban/src/main/res/drawable-nodpi/usa.png
deleted file mode 100644
index 3990d13..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/usa.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/uzb.png b/distorted-sokoban/src/main/res/drawable-nodpi/uzb.png
deleted file mode 100644
index d2c1859..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/uzb.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/ven.png b/distorted-sokoban/src/main/res/drawable-nodpi/ven.png
deleted file mode 100644
index 8924e94..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/ven.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/vie.png b/distorted-sokoban/src/main/res/drawable-nodpi/vie.png
deleted file mode 100644
index b0d5f59..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/vie.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/yem.png b/distorted-sokoban/src/main/res/drawable-nodpi/yem.png
deleted file mode 100644
index fc80d02..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/yem.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable-nodpi/za.png b/distorted-sokoban/src/main/res/drawable-nodpi/za.png
deleted file mode 100644
index a5348ff..0000000
Binary files a/distorted-sokoban/src/main/res/drawable-nodpi/za.png and /dev/null differ
diff --git a/distorted-sokoban/src/main/res/drawable/icon_border.xml b/distorted-sokoban/src/main/res/drawable/icon_border.xml
new file mode 100644
index 0000000..ff2888f
--- /dev/null
+++ b/distorted-sokoban/src/main/res/drawable/icon_border.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape 
+	xmlns:android="http://schemas.android.com/apk/res/android">	
+	<stroke 
+		android:width="1dp" 
+		android:color="#FFFFFF" />
+	<padding 
+		android:left="1dp" 
+		android:top="1dp" 
+		android:right="1dp"
+    	android:bottom="1dp" />
+</shape>
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/res/drawable/tab_background.xml b/distorted-sokoban/src/main/res/drawable/tab_background.xml
new file mode 100644
index 0000000..dbff81a
--- /dev/null
+++ b/distorted-sokoban/src/main/res/drawable/tab_background.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <item android:drawable="@drawable/tab_background_selected" android:state_selected="true" />
+    <item android:drawable="@drawable/tab_background_unselected" android:state_selected="false" android:state_focused="false" android:state_pressed="false" />
+</selector>
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/res/drawable/tab_background_selected.xml b/distorted-sokoban/src/main/res/drawable/tab_background_selected.xml
new file mode 100644
index 0000000..de60829
--- /dev/null
+++ b/distorted-sokoban/src/main/res/drawable/tab_background_selected.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+    <solid android:color="@color/grey"/>
+</shape>
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/res/drawable/tab_background_unselected.xml b/distorted-sokoban/src/main/res/drawable/tab_background_unselected.xml
new file mode 100644
index 0000000..842d787
--- /dev/null
+++ b/distorted-sokoban/src/main/res/drawable/tab_background_unselected.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" >
+    <solid android:color="@color/dark_grey"/>
+</shape>
\ No newline at end of file
diff --git a/distorted-sokoban/src/main/res/layout/grb.xml b/distorted-sokoban/src/main/res/layout/grb.xml
deleted file mode 100644
index b8f528a..0000000
--- a/distorted-sokoban/src/main/res/layout/grb.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-  xmlns:android="http://schemas.android.com/apk/res/android"
-  android:layout_width="fill_parent"
-  android:layout_height="fill_parent"
-  android:gravity="center"
-  android:background="#FFFFFF">
-  <ImageView 
-      android:id="@+id/grbimage"
-      android:src="@drawable/grb"
-      android:layout_gravity="center"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_centerHorizontal="true"/>
-</RelativeLayout>
diff --git a/distorted-sokoban/src/main/res/layout/main.xml b/distorted-sokoban/src/main/res/layout/main.xml
new file mode 100644
index 0000000..9cd14c9
--- /dev/null
+++ b/distorted-sokoban/src/main/res/layout/main.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+ <LinearLayout 
+ 	xmlns:android="http://schemas.android.com/apk/res/android"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:id="@+id/hiddenBar"
+ 	    android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="1dp"/>
+
+    <LinearLayout
+        android:id="@+id/upper_layout"
+ 	    android:orientation="horizontal"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"/>
+
+    <ListView
+     	android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+ </LinearLayout>
diff --git a/distorted-sokoban/src/main/res/layout/toc_item.xml b/distorted-sokoban/src/main/res/layout/toc_item.xml
new file mode 100644
index 0000000..9e7efcd
--- /dev/null
+++ b/distorted-sokoban/src/main/res/layout/toc_item.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+	xmlns:android="http://schemas.android.com/apk/res/android"
+	android:layout_width="match_parent"	
+	android:layout_height="wrap_content"
+	android:orientation="horizontal"
+	android:paddingTop="4dp"
+	android:paddingBottom="4dp">
+
+   	<ImageView
+   		android:id="@+id/Image"
+   		android:layout_width="wrap_content"
+   		android:layout_height="wrap_content"
+   		android:layout_margin="8dp"
+   		android:background="@drawable/icon_border"/>
+
+   	<LinearLayout
+   		android:layout_width="0dp"
+ 		android:layout_height="wrap_content"
+ 		android:layout_weight="1"
+ 		android:orientation="vertical"
+ 		android:layout_gravity="center_vertical">
+		<TextView 
+    		android:id="@+id/Title" 
+    		android:layout_width="match_parent" 
+    		android:layout_height="wrap_content"
+    		android:textStyle="bold"/>
+   		<TextView 
+    		android:id="@+id/SubTitle" 
+    		android:layout_width="wrap_content" 
+    		android:layout_height="wrap_content"/>	       
+ 	</LinearLayout>    
+</LinearLayout>
diff --git a/distorted-sokoban/src/main/res/values-ko/strings.xml b/distorted-sokoban/src/main/res/values-ko/strings.xml
deleted file mode 100644
index 3796e9e..0000000
--- a/distorted-sokoban/src/main/res/values-ko/strings.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <integer name="is_korean">1</integer>
-    <string name="app_name">Sokoban</string>
-    <string name="splash">ThreeDCell presents</string>
-    <string name="error">실행 에러!!</string>
-    <string name="email">sokoban@koltunski.pl</string>
-    <string name="level">레벨</string>
-    <string name="author">개발자:</string>
-    <string name="questions">질문하기?</string>
-    <string name="yourbest">베스트 스코어:</string>
-    <string name="worldsbest">세계 베스트 스코어:</string>
-    <string name="helptxt">노란사각형의 상자를 파란색으로 표시된 곳으로 이동시키는 게임입니다. 상자를 밀수만 있고 당길 수는 없습니다.\n\n레벨을 만들 수도 있습니다. (옵션 -> 새로운 레벨 만들기) 그리고 다른사람이 만든 레벨을 플레이 할 수 있습니다. 즐거운 시간되세요!</string>
-    <string name="newr">새 기록</string>
-    <string name="subm">온라인 등록?</string>
-    <string name="moves">이동</string>
-    <string name="seconds">초</string> 
-    <string name="solved">완료</string>
-    <string name="options">옵션</string>
-    <string name="solvenl">새 레벨 하기</string>
-    <string name="submitnl">새레벨 등록하기</string> 
-    <string name="first">먼저</string> 
-    <string name="choose">이름을 선택하세요</string>
-    <string name="submitted">등록됨</string>
-    <string name="successfully">성공적으로</string>
-    <string name="ok">Ok</string>
-    <string name="back">뒤로</string>
-    <string name="yes">예</string>
-    <string name="no">아니오</string>
-    <string name="exit">나가기</string> 
-    <string name="done">완료</string>
-    <string name="solve">풀기</string>
-    <string name="submit">등록</string>          
-    <string name="abort">나가기</string>          
-    <string name="downloaded">다운로드</string>
-    <string name="downloading">다운로드...</string>
-    <string name="help">도움말</string>   
-    <string name="records">기록</string>
-    <string name="fts">실패하였습니다</string>  
-    <string name="iat">이미 존재합니다</string>  
-    <string name="tagain">다시 시도 해주세요</string>  
-    <string name="submitting">등록</string>  
-    <string name="noper">이용권한이 없습니다</string>  
-    <string name="tun">네트워크 사용에</string>  
-    <string name="leaderboard">명예의 전당</string>  
-    <string name="failed">실패</string>  
-    <string name="dlevels">레벨 다운로드</string>  
-    <string name="ntaken">이름이 존재합니다</string>  
-    <string name="cname">이름을 선택하세요</string>  
-    <string name="cnl">새 레벨 만들기</string>           
-    <string name="ftd">다운로드 실패</string>     
-    <string name="newlevels">새 레벨</string>     
-    <string name="newlevel">1개의 새 레벨</string>     
-    <string name="nonewlevels">새로운 레벨 없음</string>     
-    <string name="downloaded2">다운로드됨</string>     
-    <string name="solveit">이제 풀어보세요</string>     
-    <string name="ywl">(다른사람이</string>     
-    <string name="ots">먼저 풀지 못한 레벨을</string>     
-    <string name="ul">등록하세요)</string>     
-    <string name="incorrect">레벨 불일치:</string>     
-    <string name="pnts">플레이어는</string>     
-    <string name="oaes">빈 자리에 위치해야 합니다</string>     
-    <string name="pa">플레이 지역에</string>  
-    <string name="id">접속할 수 없습니다</string>     
-    <string name="ncf">찾을 수 없습니다</string>     
-    <string name="lisa">레벨이 이미 완료되었습니다</string>     
-    <string name="nocd">숫자가</string>     
-    <string name="netn">일치하지 않습니다</string>     
-    <string name="ods">스퀘어를 확인하세요</string>
-</resources>
diff --git a/distorted-sokoban/src/main/res/values/colors.xml b/distorted-sokoban/src/main/res/values/colors.xml
new file mode 100644
index 0000000..e58b481
--- /dev/null
+++ b/distorted-sokoban/src/main/res/values/colors.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="colorPrimary">#008577</color>
+    <color name="colorPrimaryDark">#00574B</color>
+    <color name="colorAccent">#D81B60</color>
+    <color name="red">#ffff0000</color>
+    <color name="green">#ff00bb00</color>
+    <color name="dark_grey">#ff222222</color>
+    <color name="grey">#ff333333</color>
+    <color name="light_grey">#ff555555</color>
+    <color name="medium_grey">#ff444444</color>
+    <color name="black">#ff010101</color>
+    <color name="white">#ffffffff</color>
+</resources>
diff --git a/distorted-sokoban/src/main/res/values/strings.xml b/distorted-sokoban/src/main/res/values/strings.xml
index b2a23b0..87fb29f 100644
--- a/distorted-sokoban/src/main/res/values/strings.xml
+++ b/distorted-sokoban/src/main/res/values/strings.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <integer name="is_korean">0</integer>
     <string name="app_name">Magic Sokoban</string>
     <string name="splash">ThreeDCell presents</string>
     <string name="error">Startup error!!</string>
diff --git a/distorted-sokoban/src/main/res/values/styles.xml b/distorted-sokoban/src/main/res/values/styles.xml
new file mode 100644
index 0000000..51b0278
--- /dev/null
+++ b/distorted-sokoban/src/main/res/values/styles.xml
@@ -0,0 +1,44 @@
+<resources>
+
+    <!-- Base application theme. -->
+    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
+        <!-- Customize your theme here. -->
+        <item name="colorPrimary">@color/colorPrimary</item>
+        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
+        <item name="colorAccent">@color/colorAccent</item>
+    </style>
+
+    <style name="CustomActivityThemeNoActionBar" parent="@style/Theme.AppCompat.NoActionBar">
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+    </style>
+
+   <style name="MaterialThemeNoActionBar" parent="@style/Theme.MaterialComponents.NoActionBar">
+        <item name="tabBackground">@drawable/tab_background</item>
+        <item name="tabIndicatorHeight">0dp</item>
+        <item name="android:windowNoTitle">true</item>
+        <item name="android:windowActionBar">false</item>
+        <item name="android:windowFullscreen">true</item>
+        <item name="android:windowContentOverlay">@null</item>
+        <item name="materialThemeOverlay">@style/ButtonStyleTextColor</item>
+        <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
+        <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
+   </style>
+
+   <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
+      <item name="android:textColor">#ffffff</item>
+   </style>
+
+   <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
+      <item name="android:textColor">#ffffff</item>
+   </style>
+
+   <style name="ButtonStyleTextColor">
+      <item name="colorOnPrimary">@color/white</item>
+      <item name="colorOnSecondary">@color/dark_grey</item>
+      <item name="colorOnSurface">@color/light_grey</item>
+   </style>
+
+</resources>
