commit 1b3cbd5b62fb680c1d01acf9c7cb9146417209e4
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Wed May 27 13:12:59 2020 +0100

    Report an Analytics event when a user changes State or Object.

diff --git a/src/main/java/org/distorted/main/RubikActivity.java b/src/main/java/org/distorted/main/RubikActivity.java
index e4a7fa9d..e09f7469 100644
--- a/src/main/java/org/distorted/main/RubikActivity.java
+++ b/src/main/java/org/distorted/main/RubikActivity.java
@@ -25,6 +25,8 @@ import android.preference.PreferenceManager;
 import androidx.appcompat.app.AppCompatActivity;
 import android.view.View;
 
+import com.google.firebase.analytics.FirebaseAnalytics;
+
 import org.distorted.dialogs.RubikDialogAbout;
 import org.distorted.dialogs.RubikDialogScores;
 import org.distorted.dialogs.RubikDialogEffects;
@@ -43,6 +45,7 @@ import org.distorted.states.RubikStatePlay;
 public class RubikActivity extends AppCompatActivity
 {
     private boolean mJustStarted;
+    private FirebaseAnalytics mFirebaseAnalytics;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -54,6 +57,7 @@ public class RubikActivity extends AppCompatActivity
       setContentView(R.layout.main);
 
       mJustStarted = true;
+      mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
       }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -174,6 +178,13 @@ public class RubikActivity extends AppCompatActivity
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // PUBLIC API
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+    public FirebaseAnalytics getAnalytics()
+      {
+      return mFirebaseAnalytics;
+      }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
     public RubikObject getObject()
diff --git a/src/main/java/org/distorted/states/RubikState.java b/src/main/java/org/distorted/states/RubikState.java
index 978a0e90..bc8e6d89 100644
--- a/src/main/java/org/distorted/states/RubikState.java
+++ b/src/main/java/org/distorted/states/RubikState.java
@@ -20,6 +20,10 @@
 package org.distorted.states;
 
 import android.content.SharedPreferences;
+import android.os.Bundle;
+
+import com.google.firebase.analytics.FirebaseAnalytics;
+
 import org.distorted.main.RubikActivity;
 import static org.distorted.main.RubikSurfaceView.*;
 
@@ -113,6 +117,15 @@ public enum RubikState
     {
     if( next!=null )
       {
+      FirebaseAnalytics analytics = act.getAnalytics();
+
+      if( analytics!=null )
+        {
+        Bundle bundle = new Bundle();
+        bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, next.toString());
+        analytics.logEvent(FirebaseAnalytics.Event.LEVEL_START, bundle);
+        }
+
       if( mCurrState!=null ) mCurrState.leaveState(act);
       next.enterState(act);
       mCurrState = next;
diff --git a/src/main/java/org/distorted/states/RubikStatePlay.java b/src/main/java/org/distorted/states/RubikStatePlay.java
index 4394cf32..c29854bd 100644
--- a/src/main/java/org/distorted/states/RubikStatePlay.java
+++ b/src/main/java/org/distorted/states/RubikStatePlay.java
@@ -23,6 +23,7 @@ import android.content.Context;
 import android.content.SharedPreferences;
 import android.graphics.drawable.BitmapDrawable;
 import android.os.Build;
+import android.os.Bundle;
 import android.util.DisplayMetrics;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -35,6 +36,8 @@ import android.widget.LinearLayout;
 import android.widget.PopupWindow;
 import androidx.appcompat.widget.AppCompatSpinner;
 
+import com.google.firebase.analytics.FirebaseAnalytics;
+
 import org.distorted.main.R;
 import org.distorted.main.RubikActivity;
 import org.distorted.objects.RubikObjectList;
@@ -280,6 +283,16 @@ public class RubikStatePlay extends RubikStateAbstract implements AdapterView.On
             {
             if( act.getPostRender().canPlay() && RubikState.getCurrentState()==RubikState.PLAY )
               {
+              FirebaseAnalytics analytics = act.getAnalytics();
+
+              if( analytics!=null )
+                {
+                String name = RubikObjectList.getObject(obj).name()+"_"+sizes[size];
+                Bundle bundle = new Bundle();
+                bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name);
+                analytics.logEvent(FirebaseAnalytics.Event.SELECT_ITEM, bundle);
+                }
+
               mObject = obj;
               mSize   = sizes[size];
               act.changeObject(list,sizes[size]);
