commit dca3888a5ac677deb9c3ec8d6e128f24aa6db0e5
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Tue Sep 29 12:02:14 2020 +0100

    1) report all solved levels to Analytics
    2) automatically dismiss the NewRecord and Solved dialogs when one backs from the Done state.

diff --git a/src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java b/src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java
index 1ebe8c59..4782fbc4 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogNewRecord.java
@@ -183,4 +183,11 @@ public class RubikDialogNewRecord extends AppCompatDialogFragment
 
     return dialog;
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getDialogTag()
+    {
+    return "DialogNewRecord";
+    }
   }
diff --git a/src/main/java/org/distorted/dialogs/RubikDialogSolved.java b/src/main/java/org/distorted/dialogs/RubikDialogSolved.java
index c6a954b7..4af6821a 100644
--- a/src/main/java/org/distorted/dialogs/RubikDialogSolved.java
+++ b/src/main/java/org/distorted/dialogs/RubikDialogSolved.java
@@ -117,4 +117,11 @@ public class RubikDialogSolved extends AppCompatDialogFragment
 
     return dialog;
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public static String getDialogTag()
+    {
+    return "DialogSolved";
+    }
   }
diff --git a/src/main/java/org/distorted/main/RubikPreRender.java b/src/main/java/org/distorted/main/RubikPreRender.java
index 3e759218..38cbed91 100644
--- a/src/main/java/org/distorted/main/RubikPreRender.java
+++ b/src/main/java/org/distorted/main/RubikPreRender.java
@@ -24,6 +24,8 @@ import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.os.Bundle;
 
+import com.google.firebase.analytics.FirebaseAnalytics;
+
 import org.distorted.dialogs.RubikDialogNewRecord;
 import org.distorted.dialogs.RubikDialogSolved;
 import org.distorted.effects.BaseEffect;
@@ -31,6 +33,7 @@ import org.distorted.library.message.EffectListener;
 import org.distorted.objects.TwistyObject;
 import org.distorted.objects.ObjectList;
 import org.distorted.scores.RubikScores;
+import org.distorted.states.RubikStatePlay;
 import org.distorted.states.StateList;
 import org.distorted.states.RubikStateSolving;
 
@@ -323,6 +326,32 @@ public class RubikPreRender implements EffectListener
     mView.setQuat();
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void reportRecord()
+    {
+    RubikStatePlay play = (RubikStatePlay) StateList.PLAY.getStateClass();
+    RubikScores scores = RubikScores.getInstance();
+
+    int object      = play.getObject();
+    int size        = play.getSize();
+    int level       = play.getLevel();
+    ObjectList list = ObjectList.getObject(object);
+    String name     = scores.getName();
+
+    String record = list.name()+"_"+size+" level "+level+" time "+mNewRecord+" isNew: "+mIsNewRecord+" name: "+name;
+
+    final RubikActivity act = (RubikActivity)mView.getContext();
+    FirebaseAnalytics analytics = act.getAnalytics();
+
+    if( analytics!=null )
+      {
+      Bundle bundle = new Bundle();
+      bundle.putString(FirebaseAnalytics.Param.LEVEL, record);
+      analytics.logEvent(FirebaseAnalytics.Event.LEVEL_END, bundle);
+      }
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 //
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -557,17 +586,19 @@ public class RubikPreRender implements EffectListener
               Bundle bundle = new Bundle();
               bundle.putLong("time", mNewRecord );
 
+              reportRecord();
+
               if( mIsNewRecord )
                 {
                 RubikDialogNewRecord dialog = new RubikDialogNewRecord();
                 dialog.setArguments(bundle);
-                dialog.show( act.getSupportFragmentManager(), null);
+                dialog.show( act.getSupportFragmentManager(), RubikDialogNewRecord.getDialogTag() );
                 }
               else
                 {
                 RubikDialogSolved dialog = new RubikDialogSolved();
                 dialog.setArguments(bundle);
-                dialog.show( act.getSupportFragmentManager(), null);
+                dialog.show( act.getSupportFragmentManager(), RubikDialogSolved.getDialogTag() );
                 }
 
               act.runOnUiThread(new Runnable()
diff --git a/src/main/java/org/distorted/states/RubikStateDone.java b/src/main/java/org/distorted/states/RubikStateDone.java
index 0b439f4c..b9e06ac4 100644
--- a/src/main/java/org/distorted/states/RubikStateDone.java
+++ b/src/main/java/org/distorted/states/RubikStateDone.java
@@ -27,6 +27,10 @@ import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import androidx.fragment.app.FragmentManager;
+
+import org.distorted.dialogs.RubikDialogNewRecord;
+import org.distorted.dialogs.RubikDialogSolved;
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 
@@ -90,6 +94,7 @@ public class RubikStateDone extends RubikStateAbstract
       public void onClick(View v)
         {
         StateList.goBack(act);
+        dismissDialogs(act);
         }
       });
 
@@ -111,4 +116,16 @@ public class RubikStateDone extends RubikStateAbstract
     {
 
     }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  private void dismissDialogs(RubikActivity act)
+    {
+    FragmentManager mana = act.getSupportFragmentManager();
+    RubikDialogNewRecord diag1 = (RubikDialogNewRecord) mana.findFragmentByTag(RubikDialogNewRecord.getDialogTag());
+    RubikDialogSolved    diag2 = (RubikDialogSolved   ) mana.findFragmentByTag(RubikDialogSolved.getDialogTag());
+
+    if( diag1 !=null ) diag1.dismiss();
+    if( diag2 !=null ) diag2.dismiss();
+    }
   }
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index f1692766..a7d1f7f3 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -713,7 +713,7 @@ public class RubikStatePlay extends RubikStateAbstract implements RubikPreRender
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  int getLevel()
+  public int getLevel()
     {
     return mLevelValue;
     }
