Project

General

Profile

Download (14.5 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / external / RubikScores.java @ 1eac2fbc

1 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 1c327853 Leszek Koltunski
// Magic Cube is proprietary software licensed under an EULA which you should have received      //
7
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html        //
8 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10 acabdd83 Leszek Koltunski
package org.distorted.external;
11 f0e87514 Leszek Koltunski
12 a7d8c3cd Leszek Koltunski
import java.util.HashMap;
13 3f7a4363 Leszek Koltunski
import java.util.UUID;
14
15 82ce8e64 Leszek Koltunski
import android.content.Context;
16 f0e87514 Leszek Koltunski
import android.content.SharedPreferences;
17 82ce8e64 Leszek Koltunski
import android.telephony.TelephonyManager;
18 1c90c64a Leszek Koltunski
19 25445dcf Leszek Koltunski
import com.google.firebase.crashlytics.FirebaseCrashlytics;
20
21 3f7a4363 Leszek Koltunski
import org.distorted.main.BuildConfig;
22 a7d8c3cd Leszek Koltunski
import org.distorted.objects.RubikObject;
23
import org.distorted.objects.RubikObjectList;
24 0c233a9a Leszek Koltunski
import org.distorted.screens.RubikScreenPlay;
25 f0e87514 Leszek Koltunski
26 5bda8973 Leszek Koltunski
import static org.distorted.objectlib.main.ObjectType.MAX_SCRAMBLES;
27 00fcfefa Leszek Koltunski
import static org.distorted.screens.RubikScreenPlay.LEVELS_SHOWN;
28 d433b50e Leszek Koltunski
29 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
30 82ce8e64 Leszek Koltunski
// hold my own scores, and some other statistics.
31 f0e87514 Leszek Koltunski
32
public class RubikScores
33
  {
34 0c233a9a Leszek Koltunski
  public static final int RECORD_FIRST   = 0;
35
  public static final int RECORD_NEW     = 1;
36
  public static final int RECORD_NOT_NEW = 2;
37
38 5bda8973 Leszek Koltunski
  public static final int MAX_RECORD = 10;
39 a7d8c3cd Leszek Koltunski
  public static final int MULT = 1000000;
40 1c90c64a Leszek Koltunski
  public static final long NO_RECORD = Long.MAX_VALUE;
41 714292f1 Leszek Koltunski
  private static RubikScores mThis;
42
43 82ce8e64 Leszek Koltunski
  private String mName, mCountry;
44 c3ffcf58 Leszek Koltunski
  private boolean mNameIsVerified;
45
  private int mNumRuns;
46
  private int mNumPlays;
47 59aee296 Leszek Koltunski
  private int mNumWins;
48 82ce8e64 Leszek Koltunski
  private int mDeviceID;
49 0c233a9a Leszek Koltunski
  private int mNumStars;
50 f0e87514 Leszek Koltunski
51 a7d8c3cd Leszek Koltunski
  private static class MapValue
52
    {
53
    long record;
54
    boolean submitted;
55
56
    MapValue(long rec,int sub)
57
      {
58
      record    = rec;
59
      submitted = sub!=0;
60
      }
61
    }
62
63
  private final HashMap<Integer,MapValue> mMap;
64
65 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
66
67 714292f1 Leszek Koltunski
  private RubikScores()
68 f0e87514 Leszek Koltunski
    {
69 a7d8c3cd Leszek Koltunski
    mMap = new HashMap<>();
70 c3ffcf58 Leszek Koltunski
71 f895e77a Leszek Koltunski
    mName = "";
72 82ce8e64 Leszek Koltunski
    mCountry = "un";
73
74 c3ffcf58 Leszek Koltunski
    mNameIsVerified = false;
75 82ce8e64 Leszek Koltunski
76 59aee296 Leszek Koltunski
    mNumPlays= -1;
77
    mNumRuns = -1;
78
    mDeviceID= -1;
79
    mNumWins =  0;
80 0c233a9a Leszek Koltunski
    mNumStars=  0;
81 f0e87514 Leszek Koltunski
    }
82
83 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
84
85
  private int mapKey(int object,int level)
86
    {
87
    return object*MULT + level;
88
    }
89
90 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
91
92
  private int privateGetDeviceID()
93
    {
94
    int id;
95
96
    try
97
      {
98
      String s = UUID.randomUUID().toString();
99 874c37b1 Leszek Koltunski
      id = s.hashCode();
100 17f9a695 Leszek Koltunski
      }
101
    catch(Exception ex)
102
      {
103
      id = 0;
104
      android.util.Log.e("scores", "Exception in getDeviceID()");
105
      }
106
107
    return id<0 ? -id : id;
108
    }
109
110
///////////////////////////////////////////////////////////////////////////////////////////////////
111 e06e1b7e Leszek Koltunski
112
  synchronized void successfulSubmit()
113
    {
114
    mNameIsVerified = true;
115
116 a7d8c3cd Leszek Koltunski
    for(int key: mMap.keySet())
117
      {
118
      MapValue value = mMap.get(key);
119
      if( value!=null ) value.submitted = true;
120
      }
121 e06e1b7e Leszek Koltunski
    }
122
123 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
124
125 e06e1b7e Leszek Koltunski
  int getDeviceID()
126 714292f1 Leszek Koltunski
    {
127 e06e1b7e Leszek Koltunski
    return mDeviceID;
128
    }
129 714292f1 Leszek Koltunski
130 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
131
132 e06e1b7e Leszek Koltunski
  synchronized boolean thereAreUnsubmittedRecords()
133 f0e87514 Leszek Koltunski
    {
134 a7d8c3cd Leszek Koltunski
    for(int key: mMap.keySet())
135
      {
136
      MapValue value = mMap.get(key);
137
      if( value!=null && !value.submitted && value.record<NO_RECORD) return true;
138
      }
139 c3ffcf58 Leszek Koltunski
140 e06e1b7e Leszek Koltunski
    return false;
141 f0e87514 Leszek Koltunski
    }
142
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144
145 e06e1b7e Leszek Koltunski
  synchronized String getRecordList(String strObj, String strLvl, String strTim)
146 f0e87514 Leszek Koltunski
    {
147 e06e1b7e Leszek Koltunski
    StringBuilder builderObj = new StringBuilder();
148
    StringBuilder builderLvl = new StringBuilder();
149
    StringBuilder builderTim = new StringBuilder();
150
    boolean first = true;
151 f0e87514 Leszek Koltunski
152 a7d8c3cd Leszek Koltunski
    for(int key: mMap.keySet())
153 f0e87514 Leszek Koltunski
      {
154 a7d8c3cd Leszek Koltunski
      MapValue value = mMap.get(key);
155 f0e87514 Leszek Koltunski
156 a7d8c3cd Leszek Koltunski
      if( value!=null && !value.submitted && value.record<NO_RECORD)
157 f0e87514 Leszek Koltunski
        {
158 a7d8c3cd Leszek Koltunski
        if( !first )
159 f0e87514 Leszek Koltunski
          {
160 a7d8c3cd Leszek Koltunski
          builderObj.append(',');
161
          builderLvl.append(',');
162
          builderTim.append(',');
163
          }
164
        first=false;
165 7ac0ee88 Leszek Koltunski
166 a7d8c3cd Leszek Koltunski
        RubikObject object = RubikObjectList.getObject(key/MULT);
167
168
        if( object!=null )
169
          {
170 84d746d7 Leszek Koltunski
          builderObj.append(object.getUpperName());
171 a7d8c3cd Leszek Koltunski
          builderLvl.append(key%MULT);
172
          builderTim.append(value.record);
173 f0e87514 Leszek Koltunski
          }
174
        }
175
      }
176 c3ffcf58 Leszek Koltunski
177 e06e1b7e Leszek Koltunski
    return strObj+builderObj.toString()+strLvl+builderLvl.toString()+strTim+builderTim.toString();
178
    }
179 82ce8e64 Leszek Koltunski
180 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
181
// Public API
182 ee4e7896 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
183
184
  public boolean isVerified()
185
    {
186
    return mNameIsVerified;
187
    }
188
189 c3ffcf58 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
190
191 e06e1b7e Leszek Koltunski
  public int getNumPlays()
192 c3ffcf58 Leszek Koltunski
    {
193 e06e1b7e Leszek Koltunski
    return mNumPlays;
194 c3ffcf58 Leszek Koltunski
    }
195
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197
198 e06e1b7e Leszek Koltunski
  public int getNumRuns()
199 c3ffcf58 Leszek Koltunski
    {
200 e06e1b7e Leszek Koltunski
    return mNumRuns;
201 c3ffcf58 Leszek Koltunski
    }
202
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
205 e06e1b7e Leszek Koltunski
  public String getName()
206 c3ffcf58 Leszek Koltunski
    {
207 e06e1b7e Leszek Koltunski
    return mName;
208
    }
209 1c90c64a Leszek Koltunski
210 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
211
212
  public String getCountry()
213
    {
214
    return mCountry;
215 1c90c64a Leszek Koltunski
    }
216
217 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
218
219 e06e1b7e Leszek Koltunski
  public void incrementNumPlays()
220 286d73ae Leszek Koltunski
    {
221 e06e1b7e Leszek Koltunski
    mNumPlays++;
222
    }
223 286d73ae Leszek Koltunski
224 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
225 82ce8e64 Leszek Koltunski
226 e06e1b7e Leszek Koltunski
  public void incrementNumRuns()
227
    {
228
    mNumRuns++;
229
    }
230 82ce8e64 Leszek Koltunski
231 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
232 82ce8e64 Leszek Koltunski
233 59aee296 Leszek Koltunski
  public int incrementNumWins()
234 e06e1b7e Leszek Koltunski
    {
235 59aee296 Leszek Koltunski
    mNumWins++;
236
    return mNumWins;
237 e06e1b7e Leszek Koltunski
    }
238
239 0c233a9a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
240
241
  public void changeNumStars(int stars)
242
    {
243
    mNumStars += stars;
244
    }
245
246
///////////////////////////////////////////////////////////////////////////////////////////////////
247
248
  public int getNumStars()
249
    {
250
    return mNumStars;
251
    }
252
253 00fcfefa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
254
255
  public void correctNumStars()
256
    {
257
    int numObjects = RubikObjectList.getNumObjects();
258
259
    for(int obj=0; obj<numObjects; obj++)
260
      {
261
      for(int level=0; level<=RubikScreenPlay.LEVELS_SHOWN; level++)
262
        {
263
        if( isSolved(obj,level) )
264
          {
265
          int numStars = computeNumStars(level+1);
266
          mNumStars += numStars;
267
          }
268
        }
269
      }
270
    }
271
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273
274
  public int computeNumStars(int level)
275
    {
276
    return level>=LEVELS_SHOWN ? 50 : level;
277
    }
278
279 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
280
281
  public void setName(String newName)
282
    {
283
    mName = newName;
284 82ce8e64 Leszek Koltunski
    }
285
286 d7e539d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
287
288 0c233a9a Leszek Koltunski
  public synchronized int setRecord(int object, int level, long record)
289 a7d8c3cd Leszek Koltunski
    {
290 83018ac4 Leszek Koltunski
    int key = mapKey(object,level);
291 a7d8c3cd Leszek Koltunski
    MapValue oldValue = mMap.get(key);
292
293
    if( oldValue==null )
294
      {
295
      MapValue value = new MapValue(record,0);
296
      mMap.put(key,value);
297 0c233a9a Leszek Koltunski
      return RECORD_FIRST;
298 a7d8c3cd Leszek Koltunski
      }
299
300
    long oldRecord = oldValue.record;
301
302
    if( oldRecord>record)
303
      {
304
      MapValue value = new MapValue(record,0);
305
      mMap.put(key,value);
306 0c233a9a Leszek Koltunski
      return RECORD_NEW;
307 a7d8c3cd Leszek Koltunski
      }
308
309 0c233a9a Leszek Koltunski
    return RECORD_NOT_NEW;
310 a7d8c3cd Leszek Koltunski
    }
311 0c233a9a Leszek Koltunski
312 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
313
314
  public synchronized long getRecord(int object, int level)
315
    {
316
    int key = mapKey(object,level);
317
    MapValue value = mMap.get(key);
318
    return value!=null ? value.record : NO_RECORD;
319
    }
320
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322
323
  public synchronized boolean isSolved(int object, int level)
324 d7e539d0 Leszek Koltunski
    {
325 a7d8c3cd Leszek Koltunski
    int key = mapKey(object,level);
326
    MapValue value = mMap.get(key);
327
    return value!=null && value.record<NO_RECORD;
328 d7e539d0 Leszek Koltunski
    }
329
330 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
331
332 e06e1b7e Leszek Koltunski
  public void setCountry(Context context)
333 714292f1 Leszek Koltunski
    {
334 e06e1b7e Leszek Koltunski
    TelephonyManager tM =((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));
335 714292f1 Leszek Koltunski
336 e06e1b7e Leszek Koltunski
    if( tM!=null )
337 714292f1 Leszek Koltunski
      {
338 e06e1b7e Leszek Koltunski
      mCountry = tM.getSimCountryIso();
339
340
      if( mCountry==null || mCountry.length()<=1 )
341
        {
342
        mCountry = tM.getNetworkCountryIso();
343
        }
344 714292f1 Leszek Koltunski
      }
345
346 e06e1b7e Leszek Koltunski
    // Special case: Dominicana. Its ISO-3166-alpha-2 country code is 'do' which we can't have here
347
    // because we later on map this to a resource name (the flag) and 'do' is a reserved Java keyword
348
    // and can't be a resource name.
349
350
    if( mCountry.equals("do") ) mCountry = "dm";
351 714292f1 Leszek Koltunski
    }
352 c3ffcf58 Leszek Koltunski
353 c8249cf6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
354
355
  public void setCountry(String country)
356
    {
357
    mCountry = country;
358
359
    if( mCountry.equals("do") ) mCountry = "dm";  // see above
360
    }
361
362 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
363
364 e06e1b7e Leszek Koltunski
  public static RubikScores getInstance()
365 286d73ae Leszek Koltunski
    {
366 9333086d Leszek Koltunski
    if( mThis==null ) mThis = new RubikScores();
367 e06e1b7e Leszek Koltunski
    return mThis;
368 286d73ae Leszek Koltunski
    }
369
370 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
371
372 e06e1b7e Leszek Koltunski
  public synchronized void savePreferences(SharedPreferences.Editor editor)
373 17f9a695 Leszek Koltunski
    {
374 a7d8c3cd Leszek Koltunski
    int numObjects = RubikObjectList.getNumObjects();
375 e06e1b7e Leszek Koltunski
    StringBuilder builder = new StringBuilder();
376 1c90c64a Leszek Koltunski
377 5bda8973 Leszek Koltunski
    for(int level=0; level<=MAX_RECORD; level++)
378 e06e1b7e Leszek Koltunski
      {
379
      builder.setLength(0);
380 1c90c64a Leszek Koltunski
381 a7d8c3cd Leszek Koltunski
      for(int object=0; object<numObjects; object++)
382 e06e1b7e Leszek Koltunski
        {
383 a7d8c3cd Leszek Koltunski
        int key = mapKey(object,level);
384
        RubikObject obj = RubikObjectList.getObject(object);
385
        MapValue value = mMap.get(key);
386
387
        if( obj!=null && value!=null && value.record<NO_RECORD )
388
          {
389 84d746d7 Leszek Koltunski
          builder.append(obj.getUpperName());
390 a7d8c3cd Leszek Koltunski
          builder.append("=");
391
          builder.append(value.record);
392
          builder.append(",");
393
          builder.append(value.submitted ? 1:0 );
394
          builder.append(" ");
395
          }
396 e06e1b7e Leszek Koltunski
        }
397 c3ffcf58 Leszek Koltunski
398 e06e1b7e Leszek Koltunski
      editor.putString("scores_record"+level, builder.toString());
399
      }
400 c3ffcf58 Leszek Koltunski
401 e06e1b7e Leszek Koltunski
    editor.putString("scores_name"  , mName  );
402
    editor.putBoolean("scores_isVerified", mNameIsVerified);
403
    editor.putInt("scores_numPlays", mNumPlays);
404 59aee296 Leszek Koltunski
    editor.putInt("scores_numRuns" , mNumRuns );
405 e06e1b7e Leszek Koltunski
    editor.putInt("scores_deviceid", mDeviceID);
406 0c233a9a Leszek Koltunski
    editor.putInt("scores_review"  , mNumWins );   // legacy name
407
    editor.putInt("scores_numStars", mNumStars );
408 c3ffcf58 Leszek Koltunski
    }
409
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411
412 e06e1b7e Leszek Koltunski
  public synchronized void restorePreferences(SharedPreferences preferences)
413 c3ffcf58 Leszek Koltunski
    {
414 9333086d Leszek Koltunski
    String recordStr, subStr, nameStr, timeStr, submStr, errorStr="";
415 5bda8973 Leszek Koltunski
    int start, end, equals, comma, ordinal, subm;
416 e06e1b7e Leszek Koltunski
    long time;
417 25445dcf Leszek Koltunski
    boolean thereWasError = false;
418 a7d8c3cd Leszek Koltunski
    int numObjects = RubikObjectList.getNumObjects();
419 c3ffcf58 Leszek Koltunski
420 5bda8973 Leszek Koltunski
    for(int level=0; level<=MAX_SCRAMBLES; level++)
421 e06e1b7e Leszek Koltunski
      {
422 5bda8973 Leszek Koltunski
      recordStr = preferences.getString("scores_record"+level, null);
423
      if( recordStr==null ) continue;
424 e06e1b7e Leszek Koltunski
      start = end = 0;
425 c3ffcf58 Leszek Koltunski
426 e06e1b7e Leszek Koltunski
      while( end!=-1 )
427
        {
428
        end = recordStr.indexOf(" ", start);
429 4895fff6 Leszek Koltunski
430 e06e1b7e Leszek Koltunski
        if( end==-1 ) subStr = recordStr.substring(start);
431
        else          subStr = recordStr.substring(start,end);
432 4895fff6 Leszek Koltunski
433 e06e1b7e Leszek Koltunski
        start = end+1;
434 4895fff6 Leszek Koltunski
435 e06e1b7e Leszek Koltunski
        equals = subStr.indexOf("=");
436 9333086d Leszek Koltunski
        comma  = subStr.indexOf(",");
437 4895fff6 Leszek Koltunski
438 9333086d Leszek Koltunski
        if( equals>=0 && comma>=0 )
439 4c0cd600 Leszek Koltunski
          {
440 9333086d Leszek Koltunski
          nameStr = subStr.substring(0,equals);
441 e06e1b7e Leszek Koltunski
          timeStr = subStr.substring(equals+1,comma);
442
          submStr = subStr.substring(comma+1);
443
444 5bda8973 Leszek Koltunski
          ordinal = RubikObjectList.getOrdinal(nameStr);
445 e06e1b7e Leszek Koltunski
446 5bda8973 Leszek Koltunski
          if( ordinal>=0 && ordinal<numObjects )
447 4895fff6 Leszek Koltunski
            {
448 e06e1b7e Leszek Koltunski
            time = Long.parseLong(timeStr);
449
            subm = Integer.parseInt(submStr);
450
451 7ac0ee88 Leszek Koltunski
            if( subm>=0 && subm<=1 )
452 e06e1b7e Leszek Koltunski
              {
453 a7d8c3cd Leszek Koltunski
              MapValue value = new MapValue(time,subm);
454 5bda8973 Leszek Koltunski
              int key = mapKey(ordinal,level);
455 a7d8c3cd Leszek Koltunski
              mMap.put(key,value);
456 e06e1b7e Leszek Koltunski
              }
457
            else
458
              {
459 9333086d Leszek Koltunski
              errorStr += ("error1: subm="+subm+" obj: "+nameStr+"\n");
460 25445dcf Leszek Koltunski
              thereWasError= true;
461 e06e1b7e Leszek Koltunski
              }
462
            }
463
          else
464
            {
465 5bda8973 Leszek Koltunski
            errorStr += ("error2: object="+ordinal+" obj: "+nameStr+"\n");
466 25445dcf Leszek Koltunski
            thereWasError = true;
467 4895fff6 Leszek Koltunski
            }
468 4c0cd600 Leszek Koltunski
          }
469 e06e1b7e Leszek Koltunski
        }
470 4895fff6 Leszek Koltunski
      }
471
472 e06e1b7e Leszek Koltunski
    mName           = preferences.getString("scores_name"  , "" );
473
    mNameIsVerified = preferences.getBoolean("scores_isVerified", false);
474
    mNumPlays       = preferences.getInt("scores_numPlays", 0);
475
    mNumRuns        = preferences.getInt("scores_numRuns" , 0);
476
    mDeviceID       = preferences.getInt("scores_deviceid",-1);
477 59aee296 Leszek Koltunski
    mNumWins        = preferences.getInt("scores_review"  , 0);
478 0c233a9a Leszek Koltunski
    mNumStars       = preferences.getInt("scores_numStars", 0);
479 e06e1b7e Leszek Koltunski
480
    if( mDeviceID==-1 ) mDeviceID = privateGetDeviceID();
481 25445dcf Leszek Koltunski
482
    if( thereWasError ) recordDBError(errorStr);
483
    }
484
485 0c233a9a Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
486
487
  public int numberOfSolvedMAXes()
488
    {
489
    int numObjects = RubikObjectList.getNumObjects();
490
    int ret=0, level = RubikScreenPlay.LEVELS_SHOWN;
491
492
    for(int obj=0; obj<numObjects; obj++)
493
      {
494
      if( isSolved(obj,level) ) ret++;
495
      }
496
497
    return ret;
498
    }
499
500 25445dcf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
501
502
  public void recordDBError(String message)
503
    {
504
    if( BuildConfig.DEBUG )
505
      {
506
      android.util.Log.e("scores", message);
507
      }
508
    else
509
      {
510
      Exception ex = new Exception(message);
511
      FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
512
      crashlytics.setCustomKey("scores" , message);
513
      crashlytics.recordException(ex);
514
      }
515 4895fff6 Leszek Koltunski
    }
516 f0e87514 Leszek Koltunski
  }