commit 2d9fc972a38e8ad1bc500cf6a76fb2dcb46975d1
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Fri May 29 19:47:05 2020 +0100

    Add OpenGL Error dialog.

diff --git a/build.gradle b/build.gradle
index e14be207..27b30c51 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,8 +15,8 @@ android {
         applicationId "org.distorted.magic"
         minSdkVersion 21
         targetSdkVersion 29
-        versionCode 7
-        versionName "1.2.0"
+        versionCode 8
+        versionName "1.2.1"
     }
 
     buildTypes {
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogError.java b/src/main/java/org/distorted/dialogs/RubikDialogError.java
new file mode 100644
index 00000000..625f1959
--- /dev/null
+++ b/src/main/java/org/distorted/dialogs/RubikDialogError.java
@@ -0,0 +1,86 @@
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright 2020 Leszek Koltunski                                                               //
+//                                                                                               //
+// This file is part of Magic Cube.                                                              //
+//                                                                                               //
+// Magic Cube 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.                                                           //
+//                                                                                               //
+// Magic Cube 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 Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+package org.distorted.dialogs;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatDialogFragment;
+import androidx.fragment.app.FragmentActivity;
+
+import org.distorted.main.R;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+public class RubikDialogError extends AppCompatDialogFragment
+  {
+  @NonNull
+  @Override
+  public Dialog onCreateDialog(Bundle savedInstanceState)
+    {
+    FragmentActivity act = getActivity();
+    LayoutInflater inflater = act.getLayoutInflater();
+    AlertDialog.Builder builder = new AlertDialog.Builder(act);
+
+    Bundle args = getArguments();
+    String error;
+
+    try
+      {
+      error = args.getString("error");
+      }
+    catch(Exception e)
+      {
+      error = "Error getting error";
+      }
+
+    TextView tv = (TextView) inflater.inflate(R.layout.dialog_title, null);
+    tv.setText(R.string.opengl_error);
+    builder.setCustomTitle(tv);
+
+    final View view = inflater.inflate(R.layout.dialog_error, null);
+    TextView text = view.findViewById(R.id.error_string);
+    text.setText(error);
+
+    builder.setCancelable(true);
+
+    builder.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener()
+      {
+      @Override
+      public void onClick(DialogInterface dialog, int which)
+        {
+
+        }
+      });
+
+    builder.setView(view);
+
+    final Dialog dialog = builder.create();
+    dialog.setCanceledOnTouchOutside(false);
+
+    return dialog;
+    }
+  }
diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index e09f7469..0366f4d7 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -28,6 +28,7 @@ import android.view.View;
 import com.google.firebase.analytics.FirebaseAnalytics;
 
 import org.distorted.dialogs.RubikDialogAbout;
+import org.distorted.dialogs.RubikDialogError;
 import org.distorted.dialogs.RubikDialogScores;
 import org.distorted.dialogs.RubikDialogEffects;
 import org.distorted.effects.BaseEffect;
@@ -176,6 +177,18 @@ public class RubikActivity extends AppCompatActivity
       view.getPostRender().restorePreferences(preferences);
       }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    void OpenGLError(String message)
+      {
+      Bundle bundle = new Bundle();
+      bundle.putString("error", message );
+
+      RubikDialogError errDiag = new RubikDialogError();
+      errDiag.setArguments(bundle);
+      errDiag.show(getSupportFragmentManager(), null);
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/main/RubikRenderer.java b/src/main/java/org/distorted/main/RubikRenderer.java
index 81529b91..497cbba8 100644
--- a/src/main/java/org/distorted/main/RubikRenderer.java
+++ b/src/main/java/org/distorted/main/RubikRenderer.java
@@ -111,6 +111,9 @@ public class RubikRenderer implements GLSurfaceView.Renderer
           crashlytics.setCustomKey("GLSLrenderer"  , renderer);
           crashlytics.recordException(ex);
           }
+
+        RubikActivity act = (RubikActivity)mView.getContext();
+        act.OpenGLError(message);
         }
       }
 
diff --git a/src/main/res/layout/dialog_error.xml b/src/main/res/layout/dialog_error.xml
new file mode 100644
index 00000000..a69f86ff
--- /dev/null
+++ b/src/main/res/layout/dialog_error.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:gravity="center|fill_horizontal"
+    android:layout_marginLeft="10dp"
+    android:layout_marginRight="10dp"
+    android:layout_marginTop="0dp"
+    android:background="@color/grey"
+    android:orientation="vertical">
+
+    <TextView
+        android:id="@+id/error_string"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:gravity="center"
+        android:textSize="24sp"
+        android:layout_marginTop="10dp"
+        android:layout_marginLeft="10dp"
+        android:layout_marginRight="10dp"
+        android:layout_marginBottom="10dp"/>
+</LinearLayout>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index 660e8393..202397b6 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -1,6 +1,7 @@
 <resources>
     <string name="app_name">Magic Cube</string>
     <string name="distorted">DISTORTED</string>
+    <string name="opengl_error">OpenGL error</string>
     <string name="scramble">Scramble</string>
     <string name="solve">Solve</string>
     <string name="exit">Exit</string>
