Project

General

Profile

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

magiccube / src / main / java / org / distorted / scores / RubikScores.java @ eb376d3a

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
package org.distorted.scores;
21
22 82ce8e64 Leszek Koltunski
import android.content.Context;
23 f0e87514 Leszek Koltunski
import android.content.SharedPreferences;
24 82ce8e64 Leszek Koltunski
import android.telephony.TelephonyManager;
25 1c90c64a Leszek Koltunski
26 9c2f0c91 Leszek Koltunski
import org.distorted.objects.ObjectList;
27 f0e87514 Leszek Koltunski
28 82ce8e64 Leszek Koltunski
import java.util.UUID;
29
30 9c2f0c91 Leszek Koltunski
import static org.distorted.objects.ObjectList.MAX_NUM_OBJECTS;
31
import static org.distorted.objects.ObjectList.NUM_OBJECTS;
32
import static org.distorted.objects.ObjectList.MAX_LEVEL;
33 f0e87514 Leszek Koltunski
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35 82ce8e64 Leszek Koltunski
// hold my own scores, and some other statistics.
36 f0e87514 Leszek Koltunski
37
public class RubikScores
38
  {
39 1c90c64a Leszek Koltunski
  public static final long NO_RECORD = Long.MAX_VALUE;
40 714292f1 Leszek Koltunski
  private static RubikScores mThis;
41
42 f0e87514 Leszek Koltunski
  private long[][][] mRecords;
43 286d73ae Leszek Koltunski
  private int [][][] mSubmitted;
44
45 82ce8e64 Leszek Koltunski
  private String mName, mCountry;
46 c3ffcf58 Leszek Koltunski
  private boolean mNameIsVerified;
47
  private int mNumRuns;
48
  private int mNumPlays;
49 82ce8e64 Leszek Koltunski
  private int mDeviceID;
50 f0e87514 Leszek Koltunski
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52
53 714292f1 Leszek Koltunski
  private RubikScores()
54 f0e87514 Leszek Koltunski
    {
55 82d6e038 Leszek Koltunski
    mRecords   = new long[NUM_OBJECTS][MAX_NUM_OBJECTS][MAX_LEVEL];
56
    mSubmitted = new int [NUM_OBJECTS][MAX_NUM_OBJECTS][MAX_LEVEL];
57 f0e87514 Leszek Koltunski
58
    for(int i=0; i<NUM_OBJECTS; i++)
59 82d6e038 Leszek Koltunski
      for(int j=0; j<MAX_NUM_OBJECTS; j++)
60 85b09df4 Leszek Koltunski
        for(int k=0; k<MAX_LEVEL; k++)
61 f0e87514 Leszek Koltunski
          {
62 286d73ae Leszek Koltunski
          mRecords[i][j][k]   = NO_RECORD;
63
          mSubmitted[i][j][k] = 0;
64 f0e87514 Leszek Koltunski
          }
65 c3ffcf58 Leszek Koltunski
66 f895e77a Leszek Koltunski
    mName = "";
67 82ce8e64 Leszek Koltunski
    mCountry = "un";
68
69 c3ffcf58 Leszek Koltunski
    mNameIsVerified = false;
70 82ce8e64 Leszek Koltunski
71 c3ffcf58 Leszek Koltunski
    mNumPlays= -1;
72
    mNumRuns = -1;
73 82ce8e64 Leszek Koltunski
    mDeviceID= -1;
74 f0e87514 Leszek Koltunski
    }
75
76 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
77
78
  private int privateGetDeviceID()
79
    {
80
    int id;
81
82
    try
83
      {
84
      String s = UUID.randomUUID().toString();
85 874c37b1 Leszek Koltunski
      id = s.hashCode();
86 17f9a695 Leszek Koltunski
      }
87
    catch(Exception ex)
88
      {
89
      id = 0;
90
      android.util.Log.e("scores", "Exception in getDeviceID()");
91
      }
92
93
    return id<0 ? -id : id;
94
    }
95
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97
// PUBLIC API
98 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
99
100
  public static RubikScores getInstance()
101
    {
102
    if( mThis==null )
103
      {
104
      mThis = new RubikScores();
105
      }
106
107
    return mThis;
108
    }
109
110 f0e87514 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
111
112 6570171b Leszek Koltunski
  public synchronized void savePreferences(SharedPreferences.Editor editor)
113 f0e87514 Leszek Koltunski
    {
114
    StringBuilder builder = new StringBuilder();
115 9c2f0c91 Leszek Koltunski
    ObjectList list;
116 f0e87514 Leszek Koltunski
    int[] sizes;
117
    int length;
118
119 8e3898c8 Leszek Koltunski
    for(int level=0; level<MAX_LEVEL; level++)
120 f0e87514 Leszek Koltunski
      {
121
      builder.setLength(0);
122
123
      for(int object=0; object<NUM_OBJECTS; object++)
124
        {
125 9c2f0c91 Leszek Koltunski
        list = ObjectList.getObject(object);
126 f0e87514 Leszek Koltunski
        sizes = list.getSizes();
127
        length = sizes.length;
128
129
        for(int size=0; size<length; size++)
130
          {
131
          builder.append(list.name());
132
          builder.append("_");
133
          builder.append(sizes[size]);
134
          builder.append("=");
135 8e3898c8 Leszek Koltunski
          builder.append(mRecords[object][size][level]);
136 286d73ae Leszek Koltunski
          builder.append(",");
137 8e3898c8 Leszek Koltunski
          builder.append(mSubmitted[object][size][level]);
138 f0e87514 Leszek Koltunski
          builder.append(" ");
139
          }
140
        }
141
142 8e3898c8 Leszek Koltunski
      editor.putString("scores_record"+level, builder.toString());
143 f0e87514 Leszek Koltunski
      }
144 c3ffcf58 Leszek Koltunski
145
    editor.putString("scores_name"  , mName  );
146
    editor.putBoolean("scores_isVerified", mNameIsVerified);
147
    editor.putInt("scores_numPlays", mNumPlays);
148
    editor.putInt("scores_numRuns" , mNumRuns);
149 82ce8e64 Leszek Koltunski
    editor.putInt("scores_deviceid", mDeviceID);
150 f0e87514 Leszek Koltunski
    }
151
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
154 6570171b Leszek Koltunski
  public synchronized void restorePreferences(SharedPreferences preferences)
155 f0e87514 Leszek Koltunski
    {
156 286d73ae Leszek Koltunski
    String recordStr, subStr, nameStr, sizeStr, timeStr, submStr;
157
    int start, end, equals, underscore, comma;
158 53f23b64 Leszek Koltunski
    int object, sizeIndex, subm;
159 1c90c64a Leszek Koltunski
    long time;
160 f0e87514 Leszek Koltunski
161 8e3898c8 Leszek Koltunski
    for(int level=0; level<MAX_LEVEL; level++)
162 f0e87514 Leszek Koltunski
      {
163
      start = end = 0;
164 8e3898c8 Leszek Koltunski
      recordStr = preferences.getString("scores_record"+level, "");
165 f0e87514 Leszek Koltunski
166
      while( end!=-1 )
167
        {
168
        end = recordStr.indexOf(" ", start);
169
170
        if( end==-1 ) subStr = recordStr.substring(start);
171
        else          subStr = recordStr.substring(start,end);
172
173
        start = end+1;
174
175
        underscore = subStr.indexOf("_");
176
        equals = subStr.indexOf("=");
177 286d73ae Leszek Koltunski
        comma = subStr.indexOf(",");
178 f0e87514 Leszek Koltunski
179 286d73ae Leszek Koltunski
        if( underscore>=0 && equals>=0 && comma>=0 )
180 f0e87514 Leszek Koltunski
          {
181
          nameStr = subStr.substring(0,underscore);
182
          sizeStr = subStr.substring(underscore+1, equals);
183 286d73ae Leszek Koltunski
          timeStr = subStr.substring(equals+1,comma);
184
          submStr = subStr.substring(comma+1);
185 f0e87514 Leszek Koltunski
186 9c2f0c91 Leszek Koltunski
          object = ObjectList.getOrdinal(nameStr);
187 f0e87514 Leszek Koltunski
188 4c0cd600 Leszek Koltunski
          if( object>=0 && object< NUM_OBJECTS )
189 f0e87514 Leszek Koltunski
            {
190 9c2f0c91 Leszek Koltunski
            sizeIndex = ObjectList.getSizeIndex(object,Integer.parseInt(sizeStr));
191 4c0cd600 Leszek Koltunski
            time = Long.parseLong(timeStr);
192
            subm = Integer.parseInt(submStr);
193
194 82d6e038 Leszek Koltunski
            if( sizeIndex>=0 && sizeIndex<MAX_NUM_OBJECTS && subm>=0 && subm<=1 )
195 4c0cd600 Leszek Koltunski
              {
196 8e3898c8 Leszek Koltunski
              mRecords  [object][sizeIndex][level] = time;
197
              mSubmitted[object][sizeIndex][level] = subm;
198 4c0cd600 Leszek Koltunski
              }
199
            else
200 f0e87514 Leszek Koltunski
              {
201 6570171b Leszek Koltunski
              android.util.Log.e("scores", "error: size="+sizeIndex+" subm="+subm);
202 f0e87514 Leszek Koltunski
              }
203
            }
204
          else
205
            {
206 6570171b Leszek Koltunski
            android.util.Log.e("scores", "error: object="+object);
207 f0e87514 Leszek Koltunski
            }
208
          }
209
        }
210
      }
211 c3ffcf58 Leszek Koltunski
212 f895e77a Leszek Koltunski
    mName           = preferences.getString("scores_name"  , "" );
213 c3ffcf58 Leszek Koltunski
    mNameIsVerified = preferences.getBoolean("scores_isVerified", false);
214
    mNumPlays       = preferences.getInt("scores_numPlays", 0);
215
    mNumRuns        = preferences.getInt("scores_numRuns" , 0);
216 82ce8e64 Leszek Koltunski
    mDeviceID       = preferences.getInt("scores_deviceid",-1);
217
218 17f9a695 Leszek Koltunski
    if( mDeviceID==-1 ) mDeviceID = privateGetDeviceID();
219 f0e87514 Leszek Koltunski
    }
220
221
///////////////////////////////////////////////////////////////////////////////////////////////////
222
223 6570171b Leszek Koltunski
  public synchronized boolean setRecord(int object, int size, int level, long timeTaken)
224 f0e87514 Leszek Koltunski
    {
225 9c2f0c91 Leszek Koltunski
    int maxsize = ObjectList.getObject(object).getSizes().length;
226 f0e87514 Leszek Koltunski
227 8e3898c8 Leszek Koltunski
    if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=1 && level<=MAX_LEVEL )
228 f0e87514 Leszek Koltunski
      {
229 8e3898c8 Leszek Koltunski
      if( mRecords[object][size][level-1]> timeTaken )
230 f0e87514 Leszek Koltunski
        {
231 8e3898c8 Leszek Koltunski
        mRecords  [object][size][level-1] = timeTaken;
232
        mSubmitted[object][size][level-1] = 0;
233 e41e7dc3 Leszek Koltunski
        return true;
234 f0e87514 Leszek Koltunski
        }
235
      }
236 e41e7dc3 Leszek Koltunski
237
    return false;
238 f0e87514 Leszek Koltunski
    }
239 714292f1 Leszek Koltunski
240 c3ffcf58 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
241
242
  public void incrementNumPlays()
243
    {
244
    mNumPlays++;
245
    }
246
247
///////////////////////////////////////////////////////////////////////////////////////////////////
248
249
  public void incrementNumRuns()
250
    {
251
    mNumRuns++;
252
    }
253
254
///////////////////////////////////////////////////////////////////////////////////////////////////
255
256
  public void setName(String newName)
257
    {
258
    mName = newName;
259
    }
260
261
///////////////////////////////////////////////////////////////////////////////////////////////////
262
263 6570171b Leszek Koltunski
  synchronized void successfulSubmit()
264 c3ffcf58 Leszek Koltunski
    {
265
    mNameIsVerified = true;
266 1c90c64a Leszek Koltunski
267 4895fff6 Leszek Koltunski
    for(int i=0; i<NUM_OBJECTS; i++)
268 82d6e038 Leszek Koltunski
      for(int j=0; j<MAX_NUM_OBJECTS; j++)
269 85b09df4 Leszek Koltunski
        for(int k=0; k<MAX_LEVEL; k++)
270 4895fff6 Leszek Koltunski
          {
271
          mSubmitted[i][j][k]=1;
272
          }
273 1c90c64a Leszek Koltunski
    }
274
275 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
276
277 82ce8e64 Leszek Koltunski
  public void setCountry(Context context)
278 286d73ae Leszek Koltunski
    {
279 82ce8e64 Leszek Koltunski
    TelephonyManager tM =((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE));
280 286d73ae Leszek Koltunski
281 82ce8e64 Leszek Koltunski
    if( tM!=null )
282 286d73ae Leszek Koltunski
      {
283 82ce8e64 Leszek Koltunski
      mCountry = tM.getSimCountryIso();
284
285
      if( mCountry==null || mCountry.length()<=1 )
286
        {
287
        mCountry = tM.getNetworkCountryIso();
288
        }
289
      }
290
291
    // Special case: Dominicana. Its ISO-3166-alpha-2 country code is 'do' which we can't have here
292 874c37b1 Leszek Koltunski
    // because we later on map this to a resource name (the flag) and 'do' is a reserved Java keyword
293 82ce8e64 Leszek Koltunski
    // and can't be a resource name.
294
295
    if( mCountry.equals("do") ) mCountry = "dm";
296
    }
297
298 874c37b1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
299
300
  public void setCountry(String country)
301
    {
302
    mCountry = country;
303
304
    if( mCountry.equals("do") ) mCountry = "dm";  // see above
305
    }
306
307 d7e539d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
308
309 6570171b Leszek Koltunski
  public synchronized boolean isSolved(int object, int size, int level)
310 d7e539d0 Leszek Koltunski
    {
311 9c2f0c91 Leszek Koltunski
    int maxsize = ObjectList.getObject(object).getSizes().length;
312 d7e539d0 Leszek Koltunski
313
    if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL )
314
      {
315
      return mRecords[object][size][level]<NO_RECORD;
316
      }
317
318
    return false;
319
    }
320
321 714292f1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
322
323 6570171b Leszek Koltunski
  public synchronized long getRecord(int object, int size, int level)
324 714292f1 Leszek Koltunski
    {
325 9c2f0c91 Leszek Koltunski
    int maxsize = ObjectList.getObject(object).getSizes().length;
326 714292f1 Leszek Koltunski
327 8e3898c8 Leszek Koltunski
    if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL )
328 714292f1 Leszek Koltunski
      {
329 8e3898c8 Leszek Koltunski
      return mRecords[object][size][level];
330 714292f1 Leszek Koltunski
      }
331
332
    return -1;
333
    }
334 c3ffcf58 Leszek Koltunski
335 286d73ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
336
337 6570171b Leszek Koltunski
  public synchronized boolean isSubmitted(int object, int size, int level)
338 286d73ae Leszek Koltunski
    {
339 9c2f0c91 Leszek Koltunski
    int maxsize = ObjectList.getObject(object).getSizes().length;
340 286d73ae Leszek Koltunski
341 8e3898c8 Leszek Koltunski
    if( object>=0 && object<NUM_OBJECTS && size>=0 && size<maxsize && level>=0 && level<MAX_LEVEL )
342 286d73ae Leszek Koltunski
      {
343 8e3898c8 Leszek Koltunski
      return mSubmitted[object][size][level]==1;
344 286d73ae Leszek Koltunski
      }
345
346
    return false;
347
    }
348
349 17f9a695 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
350
351
  int getDeviceID()
352
    {
353
    return mDeviceID;
354
    }
355
356 c3ffcf58 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
357 1c90c64a Leszek Koltunski
358 4895fff6 Leszek Koltunski
  boolean isVerified()
359 1c90c64a Leszek Koltunski
    {
360
    return mNameIsVerified;
361
    }
362
363
///////////////////////////////////////////////////////////////////////////////////////////////////
364 c3ffcf58 Leszek Koltunski
365 4895fff6 Leszek Koltunski
  int getNumPlays()
366 c3ffcf58 Leszek Koltunski
    {
367
    return mNumPlays;
368
    }
369
370
///////////////////////////////////////////////////////////////////////////////////////////////////
371
372 4895fff6 Leszek Koltunski
  int getNumRuns()
373 c3ffcf58 Leszek Koltunski
    {
374
    return mNumRuns;
375
    }
376
377
///////////////////////////////////////////////////////////////////////////////////////////////////
378
379
  public String getName()
380
    {
381
    return mName;
382
    }
383
384
///////////////////////////////////////////////////////////////////////////////////////////////////
385
386 82ce8e64 Leszek Koltunski
  public String getCountry()
387 c3ffcf58 Leszek Koltunski
    {
388 82ce8e64 Leszek Koltunski
    return mCountry;
389 c3ffcf58 Leszek Koltunski
    }
390 4895fff6 Leszek Koltunski
391
///////////////////////////////////////////////////////////////////////////////////////////////////
392
393 6570171b Leszek Koltunski
  synchronized boolean thereAreUnsubmittedRecords()
394 4895fff6 Leszek Koltunski
    {
395 9c2f0c91 Leszek Koltunski
    ObjectList list;
396 4895fff6 Leszek Koltunski
    int length;
397
398
    for(int object=0; object<NUM_OBJECTS; object++)
399
      {
400 9c2f0c91 Leszek Koltunski
      list = ObjectList.getObject(object);
401 17f9a695 Leszek Koltunski
      length = list.getSizes().length;
402 4895fff6 Leszek Koltunski
403
      for(int size=0; size<length; size++)
404 8e3898c8 Leszek Koltunski
        for(int level=0; level<MAX_LEVEL; level++)
405 4c0cd600 Leszek Koltunski
          {
406 8e3898c8 Leszek Koltunski
          if( mSubmitted[object][size][level]==0 && mRecords[object][size][level]<NO_RECORD )
407 4895fff6 Leszek Koltunski
            {
408 17f9a695 Leszek Koltunski
            return true;
409 4895fff6 Leszek Koltunski
            }
410 4c0cd600 Leszek Koltunski
          }
411 4895fff6 Leszek Koltunski
      }
412
413 17f9a695 Leszek Koltunski
    return false;
414 4895fff6 Leszek Koltunski
    }
415
416
///////////////////////////////////////////////////////////////////////////////////////////////////
417
418 6570171b Leszek Koltunski
  synchronized String getRecordList(String strObj, String strLvl, String strTim)
419 4895fff6 Leszek Koltunski
    {
420 6570171b Leszek Koltunski
    ObjectList list;
421
    StringBuilder builderObj = new StringBuilder();
422
    StringBuilder builderLvl = new StringBuilder();
423
    StringBuilder builderTim = new StringBuilder();
424
    boolean first = true;
425
    int[] sizes;
426
    int length;
427 4895fff6 Leszek Koltunski
428 6570171b Leszek Koltunski
    for(int object=0; object<NUM_OBJECTS; object++)
429
      {
430
      list = ObjectList.getObject(object);
431
      sizes = list.getSizes();
432
      length = sizes.length;
433 4895fff6 Leszek Koltunski
434 6570171b Leszek Koltunski
      for(int size=0; size<length; size++)
435
        {
436
        for(int level=0; level<MAX_LEVEL; level++)
437
          {
438
          if( mSubmitted[object][size][level]==0 && mRecords[object][size][level]<NO_RECORD )
439
            {
440
            if( !first )
441
              {
442
              builderObj.append(',');
443
              builderLvl.append(',');
444
              builderTim.append(',');
445
              }
446
            else
447
              {
448
              first=false;
449
              }
450 4895fff6 Leszek Koltunski
451 6570171b Leszek Koltunski
            builderObj.append(list.name());
452
            builderObj.append("_");
453
            builderObj.append(sizes[size]);
454
            builderLvl.append(level);
455
            builderTim.append(mRecords[object][size][level]);
456
            }
457
          }
458
        }
459
      }
460 4895fff6 Leszek Koltunski
461 6570171b Leszek Koltunski
    return strObj+builderObj.toString()+strLvl+builderLvl.toString()+strTim+builderTim.toString();
462 4895fff6 Leszek Koltunski
    }
463 f0e87514 Leszek Koltunski
  }