Project

General

Profile

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

magiccube / src / main / java / org / distorted / network / RubikScores.java @ 8ab435b9

1 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 6a083c6a Leszek Koltunski
package org.distorted.network;
21 f0e87514 Leszek Koltunski
22 3f7a4363 Leszek Koltunski
import java.util.UUID;
23
24 82ce8e64 Leszek Koltunski
import android.content.Context;
25 f0e87514 Leszek Koltunski
import android.content.SharedPreferences;
26 82ce8e64 Leszek Koltunski
import android.telephony.TelephonyManager;
27 1c90c64a Leszek Koltunski
28 25445dcf Leszek Koltunski
import com.google.firebase.crashlytics.FirebaseCrashlytics;
29
30 318c0a7d Leszek Koltunski
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
31 8ab435b9 Leszek Koltunski
import static org.distorted.screens.RubikScreenPlay.MAX_LEVEL;
32 f0e87514 Leszek Koltunski
33 318c0a7d Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
34 82ce8e64 Leszek Koltunski
35 3f7a4363 Leszek Koltunski
import org.distorted.main.BuildConfig;
36 f0e87514 Leszek Koltunski
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38 82ce8e64 Leszek Koltunski
// hold my own scores, and some other statistics.
39 f0e87514 Leszek Koltunski
40
public class RubikScores
41
  {
42 1c90c64a Leszek Koltunski
  public static final long NO_RECORD = Long.MAX_VALUE;
43 714292f1 Leszek Koltunski
  private static RubikScores mThis;
44
45 7ac0ee88 Leszek Koltunski
  private final long[][] mRecords;
46
  private final int [][] mSubmitted;
47 286d73ae Leszek Koltunski
48 82ce8e64 Leszek Koltunski
  private String mName, mCountry;
49 c3ffcf58 Leszek Koltunski
  private boolean mNameIsVerified;
50
  private int mNumRuns;
51
  private int mNumPlays;
52 59aee296 Leszek Koltunski
  private int mNumWins;
53 82ce8e64 Leszek Koltunski
  private int mDeviceID;
54 f0e87514 Leszek Koltunski
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56
57 714292f1 Leszek Koltunski
  private RubikScores()
58 f0e87514 Leszek Koltunski
    {
59 7ac0ee88 Leszek Koltunski
    mRecords   = new long[NUM_OBJECTS][MAX_LEVEL];
60
    mSubmitted = new int [NUM_OBJECTS][MAX_LEVEL];
61 f0e87514 Leszek Koltunski
62 9333086d Leszek Koltunski
    for(int object=0; object<NUM_OBJECTS; object++)
63
      for(int level=0; level<MAX_LEVEL; level++)
64 7ac0ee88 Leszek Koltunski
        {
65 9333086d Leszek Koltunski
        mRecords[object][level]   = NO_RECORD;
66
        mSubmitted[object][level] = 0;
67 7ac0ee88 Leszek Koltunski
        }
68 c3ffcf58 Leszek Koltunski
69 f895e77a Leszek Koltunski
    mName = "";
70 82ce8e64 Leszek Koltunski
    mCountry = "un";
71
72 c3ffcf58 Leszek Koltunski
    mNameIsVerified = false;
73 82ce8e64 Leszek Koltunski
74 59aee296 Leszek Koltunski
    mNumPlays= -1;
75
    mNumRuns = -1;
76
    mDeviceID= -1;
77
    mNumWins =  0;
78 f0e87514 Leszek Koltunski
    }
79
80 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
81
82
  private int privateGetDeviceID()
83
    {
84
    int id;
85
86
    try
87
      {
88
      String s = UUID.randomUUID().toString();
89 874c37b1 Leszek Koltunski
      id = s.hashCode();
90 17f9a695 Leszek Koltunski
      }
91
    catch(Exception ex)
92
      {
93
      id = 0;
94
      android.util.Log.e("scores", "Exception in getDeviceID()");
95
      }
96
97
    return id<0 ? -id : id;
98
    }
99
100
///////////////////////////////////////////////////////////////////////////////////////////////////
101 e06e1b7e Leszek Koltunski
102
  synchronized void successfulSubmit()
103
    {
104
    mNameIsVerified = true;
105
106 9333086d Leszek Koltunski
    for(int object=0; object<NUM_OBJECTS; object++)
107
      for(int level=0; level<MAX_LEVEL; level++)
108 7ac0ee88 Leszek Koltunski
        {
109 9333086d Leszek Koltunski
        mSubmitted[object][level]=1;
110 7ac0ee88 Leszek Koltunski
        }
111 e06e1b7e Leszek Koltunski
    }
112
113 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
114
115 e06e1b7e Leszek Koltunski
  int getDeviceID()
116 714292f1 Leszek Koltunski
    {
117 e06e1b7e Leszek Koltunski
    return mDeviceID;
118
    }
119 714292f1 Leszek Koltunski
120 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
121
122 e06e1b7e Leszek Koltunski
  synchronized boolean thereAreUnsubmittedRecords()
123 f0e87514 Leszek Koltunski
    {
124 e06e1b7e Leszek Koltunski
    for(int object=0; object<NUM_OBJECTS; object++)
125 7ac0ee88 Leszek Koltunski
      for(int level=0; level<MAX_LEVEL; level++)
126
        {
127
        if( mSubmitted[object][level]==0 && mRecords[object][level]<NO_RECORD ) return true;
128
        }
129 c3ffcf58 Leszek Koltunski
130 e06e1b7e Leszek Koltunski
    return false;
131 f0e87514 Leszek Koltunski
    }
132
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134
135 e06e1b7e Leszek Koltunski
  synchronized String getRecordList(String strObj, String strLvl, String strTim)
136 f0e87514 Leszek Koltunski
    {
137 e06e1b7e Leszek Koltunski
    StringBuilder builderObj = new StringBuilder();
138
    StringBuilder builderLvl = new StringBuilder();
139
    StringBuilder builderTim = new StringBuilder();
140
    boolean first = true;
141 f0e87514 Leszek Koltunski
142 e06e1b7e Leszek Koltunski
    for(int object=0; object<NUM_OBJECTS; object++)
143 f0e87514 Leszek Koltunski
      {
144 318c0a7d Leszek Koltunski
      String name = ObjectType.getObject(object).name();
145 f0e87514 Leszek Koltunski
146 7ac0ee88 Leszek Koltunski
      for(int level=0; level<MAX_LEVEL; level++)
147 f0e87514 Leszek Koltunski
        {
148 7ac0ee88 Leszek Koltunski
        if( mSubmitted[object][level]==0 && mRecords[object][level]<NO_RECORD )
149 f0e87514 Leszek Koltunski
          {
150 7ac0ee88 Leszek Koltunski
          if( !first )
151 f0e87514 Leszek Koltunski
            {
152 7ac0ee88 Leszek Koltunski
            builderObj.append(',');
153
            builderLvl.append(',');
154
            builderTim.append(',');
155
            }
156 9333086d Leszek Koltunski
          first=false;
157 7ac0ee88 Leszek Koltunski
158
          builderObj.append(name);
159
          builderLvl.append(level);
160
          builderTim.append(mRecords[object][level]);
161 f0e87514 Leszek Koltunski
          }
162
        }
163
      }
164 c3ffcf58 Leszek Koltunski
165 e06e1b7e Leszek Koltunski
    return strObj+builderObj.toString()+strLvl+builderLvl.toString()+strTim+builderTim.toString();
166
    }
167 82ce8e64 Leszek Koltunski
168 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
169
// Public API
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171
172 7ac0ee88 Leszek Koltunski
  public synchronized long getRecord(int obj, int level)
173 e06e1b7e Leszek Koltunski
    {
174 7ac0ee88 Leszek Koltunski
    return (obj>=0 && obj<NUM_OBJECTS && level>=0 && level<MAX_LEVEL) ? mRecords[obj][level] : -1;
175 f0e87514 Leszek Koltunski
    }
176
177 ee4e7896 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
178
179
  public boolean isVerified()
180
    {
181
    return mNameIsVerified;
182
    }
183
184 c3ffcf58 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
185
186 e06e1b7e Leszek Koltunski
  public int getNumPlays()
187 c3ffcf58 Leszek Koltunski
    {
188 e06e1b7e Leszek Koltunski
    return mNumPlays;
189 c3ffcf58 Leszek Koltunski
    }
190
191
///////////////////////////////////////////////////////////////////////////////////////////////////
192
193 e06e1b7e Leszek Koltunski
  public int getNumRuns()
194 c3ffcf58 Leszek Koltunski
    {
195 e06e1b7e Leszek Koltunski
    return mNumRuns;
196 c3ffcf58 Leszek Koltunski
    }
197
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199
200 e06e1b7e Leszek Koltunski
  public String getName()
201 c3ffcf58 Leszek Koltunski
    {
202 e06e1b7e Leszek Koltunski
    return mName;
203
    }
204 1c90c64a Leszek Koltunski
205 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
206
207
  public String getCountry()
208
    {
209
    return mCountry;
210 1c90c64a Leszek Koltunski
    }
211
212 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
213
214 e06e1b7e Leszek Koltunski
  public void incrementNumPlays()
215 286d73ae Leszek Koltunski
    {
216 e06e1b7e Leszek Koltunski
    mNumPlays++;
217
    }
218 286d73ae Leszek Koltunski
219 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
220 82ce8e64 Leszek Koltunski
221 e06e1b7e Leszek Koltunski
  public void incrementNumRuns()
222
    {
223
    mNumRuns++;
224
    }
225 82ce8e64 Leszek Koltunski
226 e06e1b7e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
227 82ce8e64 Leszek Koltunski
228 59aee296 Leszek Koltunski
  public int incrementNumWins()
229 e06e1b7e Leszek Koltunski
    {
230 59aee296 Leszek Koltunski
    mNumWins++;
231
    return mNumWins;
232 e06e1b7e Leszek Koltunski
    }
233
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235
236
  public void setName(String newName)
237
    {
238
    mName = newName;
239 82ce8e64 Leszek Koltunski
    }
240
241 d7e539d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
242
243 7ac0ee88 Leszek Koltunski
  public synchronized boolean isSolved(int obj, int level)
244 d7e539d0 Leszek Koltunski
    {
245 7ac0ee88 Leszek Koltunski
    return obj>=0 && obj<NUM_OBJECTS && level>=0 && level<MAX_LEVEL && mRecords[obj][level]<NO_RECORD;
246 d7e539d0 Leszek Koltunski
    }
247
248 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
249
250 e06e1b7e Leszek Koltunski
  public void setCountry(Context context)
251 714292f1 Leszek Koltunski
    {
252 e06e1b7e Leszek Koltunski
    TelephonyManager tM =((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));
253 714292f1 Leszek Koltunski
254 e06e1b7e Leszek Koltunski
    if( tM!=null )
255 714292f1 Leszek Koltunski
      {
256 e06e1b7e Leszek Koltunski
      mCountry = tM.getSimCountryIso();
257
258
      if( mCountry==null || mCountry.length()<=1 )
259
        {
260
        mCountry = tM.getNetworkCountryIso();
261
        }
262 714292f1 Leszek Koltunski
      }
263
264 e06e1b7e Leszek Koltunski
    // Special case: Dominicana. Its ISO-3166-alpha-2 country code is 'do' which we can't have here
265
    // because we later on map this to a resource name (the flag) and 'do' is a reserved Java keyword
266
    // and can't be a resource name.
267
268
    if( mCountry.equals("do") ) mCountry = "dm";
269 714292f1 Leszek Koltunski
    }
270 c3ffcf58 Leszek Koltunski
271 c8249cf6 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
272
273
  public void setCountry(String country)
274
    {
275
    mCountry = country;
276
277
    if( mCountry.equals("do") ) mCountry = "dm";  // see above
278
    }
279
280 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
281
282 e06e1b7e Leszek Koltunski
  public static RubikScores getInstance()
283 286d73ae Leszek Koltunski
    {
284 9333086d Leszek Koltunski
    if( mThis==null ) mThis = new RubikScores();
285 e06e1b7e Leszek Koltunski
    return mThis;
286 286d73ae Leszek Koltunski
    }
287
288 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
289
290 e06e1b7e Leszek Koltunski
  public synchronized void savePreferences(SharedPreferences.Editor editor)
291 17f9a695 Leszek Koltunski
    {
292 e06e1b7e Leszek Koltunski
    StringBuilder builder = new StringBuilder();
293 7ac0ee88 Leszek Koltunski
    String name;
294 1c90c64a Leszek Koltunski
295 e06e1b7e Leszek Koltunski
    for(int level=0; level<MAX_LEVEL; level++)
296
      {
297
      builder.setLength(0);
298 1c90c64a Leszek Koltunski
299 e06e1b7e Leszek Koltunski
      for(int object=0; object<NUM_OBJECTS; object++)
300
        {
301 318c0a7d Leszek Koltunski
        name = ObjectType.getObject(object).name();
302 7ac0ee88 Leszek Koltunski
        builder.append(name);
303
        builder.append("=");
304
        builder.append(mRecords[object][level]);
305
        builder.append(",");
306
        builder.append(mSubmitted[object][level]);
307
        builder.append(" ");
308 e06e1b7e Leszek Koltunski
        }
309 c3ffcf58 Leszek Koltunski
310 e06e1b7e Leszek Koltunski
      editor.putString("scores_record"+level, builder.toString());
311
      }
312 c3ffcf58 Leszek Koltunski
313 e06e1b7e Leszek Koltunski
    editor.putString("scores_name"  , mName  );
314
    editor.putBoolean("scores_isVerified", mNameIsVerified);
315
    editor.putInt("scores_numPlays", mNumPlays);
316 59aee296 Leszek Koltunski
    editor.putInt("scores_numRuns" , mNumRuns );
317 e06e1b7e Leszek Koltunski
    editor.putInt("scores_deviceid", mDeviceID);
318 59aee296 Leszek Koltunski
    editor.putInt("scores_review"  , mNumWins );
319 c3ffcf58 Leszek Koltunski
    }
320
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322
323 e06e1b7e Leszek Koltunski
  public synchronized void restorePreferences(SharedPreferences preferences)
324 c3ffcf58 Leszek Koltunski
    {
325 9333086d Leszek Koltunski
    String recordStr, subStr, nameStr, timeStr, submStr, errorStr="";
326
    int start, end, equals, comma, object, subm;
327 e06e1b7e Leszek Koltunski
    long time;
328 25445dcf Leszek Koltunski
    boolean thereWasError = false;
329 c3ffcf58 Leszek Koltunski
330 e06e1b7e Leszek Koltunski
    for(int level=0; level<MAX_LEVEL; level++)
331
      {
332
      start = end = 0;
333
      recordStr = preferences.getString("scores_record"+level, "");
334 c3ffcf58 Leszek Koltunski
335 e06e1b7e Leszek Koltunski
      while( end!=-1 )
336
        {
337
        end = recordStr.indexOf(" ", start);
338 4895fff6 Leszek Koltunski
339 e06e1b7e Leszek Koltunski
        if( end==-1 ) subStr = recordStr.substring(start);
340
        else          subStr = recordStr.substring(start,end);
341 4895fff6 Leszek Koltunski
342 e06e1b7e Leszek Koltunski
        start = end+1;
343 4895fff6 Leszek Koltunski
344 e06e1b7e Leszek Koltunski
        equals = subStr.indexOf("=");
345 9333086d Leszek Koltunski
        comma  = subStr.indexOf(",");
346 4895fff6 Leszek Koltunski
347 9333086d Leszek Koltunski
        if( equals>=0 && comma>=0 )
348 4c0cd600 Leszek Koltunski
          {
349 9333086d Leszek Koltunski
          nameStr = subStr.substring(0,equals);
350 e06e1b7e Leszek Koltunski
          timeStr = subStr.substring(equals+1,comma);
351
          submStr = subStr.substring(comma+1);
352
353 318c0a7d Leszek Koltunski
          object = ObjectType.getOrdinal(nameStr);
354 e06e1b7e Leszek Koltunski
355
          if( object>=0 && object< NUM_OBJECTS )
356 4895fff6 Leszek Koltunski
            {
357 e06e1b7e Leszek Koltunski
            time = Long.parseLong(timeStr);
358
            subm = Integer.parseInt(submStr);
359
360 7ac0ee88 Leszek Koltunski
            if( subm>=0 && subm<=1 )
361 e06e1b7e Leszek Koltunski
              {
362 7ac0ee88 Leszek Koltunski
              mRecords  [object][level] = time;
363
              mSubmitted[object][level] = subm;
364 e06e1b7e Leszek Koltunski
              }
365
            else
366
              {
367 9333086d Leszek Koltunski
              errorStr += ("error1: subm="+subm+" obj: "+nameStr+"\n");
368 25445dcf Leszek Koltunski
              thereWasError= true;
369 e06e1b7e Leszek Koltunski
              }
370
            }
371
          else
372
            {
373 9333086d Leszek Koltunski
            errorStr += ("error2: object="+object+" obj: "+nameStr+"\n");
374 25445dcf Leszek Koltunski
            thereWasError = true;
375 4895fff6 Leszek Koltunski
            }
376 4c0cd600 Leszek Koltunski
          }
377 e06e1b7e Leszek Koltunski
        }
378 4895fff6 Leszek Koltunski
      }
379
380 e06e1b7e Leszek Koltunski
    mName           = preferences.getString("scores_name"  , "" );
381
    mNameIsVerified = preferences.getBoolean("scores_isVerified", false);
382
    mNumPlays       = preferences.getInt("scores_numPlays", 0);
383
    mNumRuns        = preferences.getInt("scores_numRuns" , 0);
384
    mDeviceID       = preferences.getInt("scores_deviceid",-1);
385 59aee296 Leszek Koltunski
    mNumWins        = preferences.getInt("scores_review"  , 0);
386 e06e1b7e Leszek Koltunski
387
    if( mDeviceID==-1 ) mDeviceID = privateGetDeviceID();
388 25445dcf Leszek Koltunski
389
    if( thereWasError ) recordDBError(errorStr);
390
    }
391
392
///////////////////////////////////////////////////////////////////////////////////////////////////
393
394
  public void recordDBError(String message)
395
    {
396
    if( BuildConfig.DEBUG )
397
      {
398
      android.util.Log.e("scores", message);
399
      }
400
    else
401
      {
402
      Exception ex = new Exception(message);
403
      FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
404
      crashlytics.setCustomKey("scores" , message);
405
      crashlytics.recordException(ex);
406
      }
407 4895fff6 Leszek Koltunski
    }
408
409
///////////////////////////////////////////////////////////////////////////////////////////////////
410
411 7ac0ee88 Leszek Koltunski
  public synchronized boolean setRecord(int object, int level, long timeTaken)
412 4895fff6 Leszek Koltunski
    {
413 7ac0ee88 Leszek Koltunski
    if( object>=0 && object<NUM_OBJECTS && level>=1 && level<=MAX_LEVEL && mRecords[object][level-1]>timeTaken )
414 6570171b Leszek Koltunski
      {
415 7ac0ee88 Leszek Koltunski
      mRecords  [object][level-1] = timeTaken;
416
      mSubmitted[object][level-1] = 0;
417
      return true;
418 6570171b Leszek Koltunski
      }
419 4895fff6 Leszek Koltunski
420 e06e1b7e Leszek Koltunski
    return false;
421 4895fff6 Leszek Koltunski
    }
422 f0e87514 Leszek Koltunski
  }