Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObject.java @ master

1 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 f05e0259 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 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.objects;
11
12 314e9ff0 Leszek Koltunski
import java.io.InputStream;
13 f611dc3e Leszek Koltunski
import java.util.Locale;
14 314e9ff0 Leszek Koltunski
15
import android.app.Activity;
16
import android.content.res.Resources;
17 84d746d7 Leszek Koltunski
import android.graphics.Bitmap;
18
import android.graphics.drawable.BitmapDrawable;
19 eb985085 Leszek Koltunski
import android.graphics.drawable.Drawable;
20 314e9ff0 Leszek Koltunski
import android.widget.ImageButton;
21
import android.widget.ImageView;
22
23 bd9776f6 Leszek Koltunski
import androidx.appcompat.content.res.AppCompatResources;
24
25 84d746d7 Leszek Koltunski
import org.distorted.external.RubikFiles;
26 90288e23 Leszek Koltunski
import org.distorted.main.R;
27 eb9263dd leszek
import org.distorted.objectlib.metadata.ListObjects;
28 920cbdf9 leszek
import org.distorted.objectlib.metadata.Metadata;
29 71897466 Leszek Koltunski
import org.distorted.objectlib.patterns.RubikPatternList;
30 b42c8399 leszek
import org.distorted.solvers.ImplementedSolversList;
31 a7d8c3cd Leszek Koltunski
32 d433b50e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
33
34 a7d8c3cd Leszek Koltunski
public class RubikObject
35
{
36 1ba56d95 Leszek Koltunski
  public static final int FAST_SCRAMBLES = 80;
37
38 84d746d7 Leszek Koltunski
  private final String mLowerName, mUpperName;
39 6e3fcb91 Leszek Koltunski
  private final int mIconID;
40 a7d8c3cd Leszek Koltunski
  private final String[][] mPatterns;
41 bd9776f6 Leszek Koltunski
  private final int mPrice;
42 7ee8337b leszek
  private final int mSolverOrdinal;
43
  private final int mObjectOrdinal;
44
  private final boolean mIsLocal;
45 ff4a2a13 leszek
  private final int mCategory, mYear;
46
  private final float mDifficulty;
47
  private final String mAuthor;
48 988e3d33 leszek
  private final boolean mAdjColors;
49 a7d8c3cd Leszek Koltunski
50 73709b89 Leszek Koltunski
  private boolean mIsFree;
51 84d746d7 Leszek Koltunski
  private int mJsonID, mMeshID, mExtrasID;
52 0effd5a9 leszek
  private int mObjectVersion, mExtrasVersion;
53 84d746d7 Leszek Koltunski
  private int mNumScramble;
54 fcf7320f Leszek Koltunski
  private int mExtrasOrdinal;
55 f12e4de9 Leszek Koltunski
56 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
57
58 eb9263dd leszek
  RubikObject(ListObjects type)
59 a7d8c3cd Leszek Koltunski
    {
60 920cbdf9 leszek
    Metadata meta = type.getMetadata();
61 7ee8337b leszek
    mObjectOrdinal= type.ordinal();
62 d36d8517 Leszek Koltunski
63 84d746d7 Leszek Koltunski
    mUpperName   = type.name();
64 5e048300 Leszek Koltunski
    mLowerName   = type.name().toLowerCase(Locale.ENGLISH);
65 920cbdf9 leszek
    mNumScramble = meta.numScrambles();
66
    mPrice       = meta.price();
67 e9e744f7 Leszek Koltunski
    mIsFree      = mPrice==0;
68 920cbdf9 leszek
    mIconID      = meta.icon();
69 eb9263dd leszek
    mJsonID      = meta.objectJson();
70
    mMeshID      = meta.mesh();
71
    mExtrasID    = meta.extrasJson();
72 ff4a2a13 leszek
    mDifficulty  = meta.getDifficulty();
73
    mCategory    = meta.getCategory();
74
    mYear        = meta.getYearOfInvention();
75
    mAuthor      = meta.getAuthor();
76 7ee8337b leszek
    mIsLocal     = false;
77 988e3d33 leszek
    mAdjColors   = meta.supportsAdjustableStickerColors();
78 a7d8c3cd Leszek Koltunski
79 7ee8337b leszek
    int patternOrdinal  = RubikPatternList.getOrdinal(mObjectOrdinal);
80 a7d8c3cd Leszek Koltunski
    mPatterns = RubikPatternList.getPatterns(patternOrdinal);
81 f12e4de9 Leszek Koltunski
82 7ee8337b leszek
    mSolverOrdinal = ImplementedSolversList.getSolverOrdinal(mObjectOrdinal);
83 fcf7320f Leszek Koltunski
    mExtrasOrdinal = -1;
84
85 920cbdf9 leszek
    mObjectVersion = meta.objectVersion();
86
    mExtrasVersion = meta.extrasVersion();
87 804293f0 Leszek Koltunski
    }
88 84d746d7 Leszek Koltunski
89 314e9ff0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
90
91
  RubikObject(RubikObjectList.DownloadedObject object)
92
    {
93 7bb30586 leszek
    if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "new downloaded RubikObject "+object.shortName+" added");
94 84d746d7 Leszek Koltunski
95
    mLowerName     = object.shortName;
96 f611dc3e Leszek Koltunski
    mUpperName     = object.shortName.toUpperCase(Locale.ENGLISH);
97 84d746d7 Leszek Koltunski
    mNumScramble   = object.numScrambles;
98 e9e744f7 Leszek Koltunski
    mPrice         = object.price;
99
    mIsFree        = mPrice==0;
100 0effd5a9 leszek
    mObjectVersion = object.objectVersion;
101
    mExtrasVersion = object.extrasVersion;
102 ff4a2a13 leszek
    mDifficulty    = object.difficulty;
103
    mCategory      = object.category;
104
    mYear          = object.year;
105
    mAuthor        = object.author;
106 988e3d33 leszek
    mAdjColors     = object.adjColors;
107 84d746d7 Leszek Koltunski
108 d36d8517 Leszek Koltunski
    mPatterns      = null;
109
    mExtrasOrdinal = -1;
110 b42c8399 leszek
    mSolverOrdinal = -1;
111 7ee8337b leszek
    mObjectOrdinal = -1;
112
    mIsLocal       = true;
113 314e9ff0 Leszek Koltunski
114 84d746d7 Leszek Koltunski
    mMeshID        =  0;
115 b525bc12 leszek
    mJsonID        = object.object ? -1 : 0;
116
    mExtrasID      = object.extras ? -1 : 0;
117
    mIconID        = object.icon   ? -1 : 0;
118 314e9ff0 Leszek Koltunski
    }
119 804293f0 Leszek Koltunski
120 314e9ff0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
121
122 84d746d7 Leszek Koltunski
  public boolean updateObject(RubikObjectList.DownloadedObject object)
123 314e9ff0 Leszek Koltunski
    {
124 84d746d7 Leszek Koltunski
    boolean changed = false;
125 314e9ff0 Leszek Koltunski
126 0effd5a9 leszek
    if( object.objectVersion>mObjectVersion )
127 84d746d7 Leszek Koltunski
      {
128 7bb30586 leszek
      if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" main JSON");
129 84d746d7 Leszek Koltunski
130 0effd5a9 leszek
      mObjectVersion= object.objectVersion;
131
      mNumScramble  = object.numScrambles;
132 84d746d7 Leszek Koltunski
      mMeshID =  0;
133
      mJsonID = -1;
134
      changed = true;
135
      }
136
137 0effd5a9 leszek
    if( object.extrasVersion>mExtrasVersion )
138 84d746d7 Leszek Koltunski
      {
139 7bb30586 leszek
      if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" extras JSON");
140 84d746d7 Leszek Koltunski
141 0effd5a9 leszek
      mExtrasVersion = object.extrasVersion;
142 84d746d7 Leszek Koltunski
      mExtrasID = -1;
143
      changed = true;
144
      }
145
146
    return changed;
147 314e9ff0 Leszek Koltunski
    }
148 84d746d7 Leszek Koltunski
149 eb985085 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
150
151 8f200211 leszek
  private Drawable createIconDrawable(Activity act)
152 eb985085 Leszek Koltunski
    {
153 84d746d7 Leszek Koltunski
    if( mIconID>0 )
154
      {
155 8f200211 leszek
      return AppCompatResources.getDrawable(act,mIconID);
156 84d746d7 Leszek Koltunski
      }
157
    else
158
      {
159
      RubikFiles files = RubikFiles.getInstance();
160
      Bitmap bmp = files.getIcon(act,mLowerName+".png");
161 8f200211 leszek
      if( bmp==null ) return AppCompatResources.getDrawable(act,R.drawable.unknown_icon);
162
      else            return new BitmapDrawable(act.getResources(), bmp);
163 84d746d7 Leszek Koltunski
      }
164 eb985085 Leszek Koltunski
    }
165
166 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
167
168 fcf7320f Leszek Koltunski
  public void setExtrasOrdinal(int ordinal)
169 804293f0 Leszek Koltunski
    {
170 fcf7320f Leszek Koltunski
    mExtrasOrdinal = ordinal;
171 804293f0 Leszek Koltunski
    }
172
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174
175 fcf7320f Leszek Koltunski
  public int getExtrasOrdinal()
176 804293f0 Leszek Koltunski
    {
177 fcf7320f Leszek Koltunski
    return mExtrasOrdinal;
178 f12e4de9 Leszek Koltunski
    }
179
180 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
181
// PUBLIC API
182
183 84d746d7 Leszek Koltunski
  public String getLowerName()
184
    {
185
    return mLowerName;
186
    }
187
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190
  public String getUpperName()
191 a7d8c3cd Leszek Koltunski
    {
192 84d746d7 Leszek Koltunski
    return mUpperName;
193 a7d8c3cd Leszek Koltunski
    }
194
195
///////////////////////////////////////////////////////////////////////////////////////////////////
196
197 804293f0 Leszek Koltunski
  public int getNumScramble()
198 a7d8c3cd Leszek Koltunski
    {
199 804293f0 Leszek Koltunski
    return mNumScramble;
200 a7d8c3cd Leszek Koltunski
    }
201
202 298f3977 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
203 e9e744f7 Leszek Koltunski
204
  public int getPrice()
205
    {
206
    return mPrice;
207
    }
208
209
///////////////////////////////////////////////////////////////////////////////////////////////////
210 298f3977 Leszek Koltunski
211
  public boolean isFree()
212
    {
213 7bb30586 leszek
    return (!RubikObjectList.USE_IAP || mIsFree);
214 298f3977 Leszek Koltunski
    }
215
216 73709b89 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
217
218
  public void markFree()
219
    {
220 e9e744f7 Leszek Koltunski
    mIsFree=true;
221 73709b89 Leszek Koltunski
    }
222
223 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
224
225 0effd5a9 leszek
  public int getObjectVersion()
226 eb985085 Leszek Koltunski
    {
227 0effd5a9 leszek
    return mObjectVersion;
228 eb985085 Leszek Koltunski
    }
229
230
///////////////////////////////////////////////////////////////////////////////////////////////////
231
232 0effd5a9 leszek
  public int getExtrasVersion()
233 eb985085 Leszek Koltunski
    {
234 0effd5a9 leszek
    return mExtrasVersion;
235 eb985085 Leszek Koltunski
    }
236
237 988e3d33 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
238
239
  public boolean supportsAdjustableColors()
240
    {
241
    return mAdjColors;
242
    }
243
244 eb985085 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
245
246
  public void setIconTo(Activity act,ImageButton button)
247 314e9ff0 Leszek Koltunski
    {
248 8f200211 leszek
    Drawable icon = createIconDrawable(act);
249
    button.setBackground(icon);
250 314e9ff0 Leszek Koltunski
    }
251
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254 eb985085 Leszek Koltunski
  public void setIconTo(Activity act,ImageView view)
255 314e9ff0 Leszek Koltunski
    {
256 8f200211 leszek
    Drawable icon = createIconDrawable(act);
257
    view.setImageDrawable(icon);
258 314e9ff0 Leszek Koltunski
    }
259
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
262
  public InputStream getObjectStream(Activity act)
263 a7d8c3cd Leszek Koltunski
    {
264 84d746d7 Leszek Koltunski
    if( mJsonID>0 )
265 314e9ff0 Leszek Koltunski
      {
266
      Resources res = act.getResources();
267
      return res.openRawResource(mJsonID);
268
      }
269 84d746d7 Leszek Koltunski
    if( mJsonID<0 )
270
      {
271
      RubikFiles files = RubikFiles.getInstance();
272
      return files.openFile(act,mLowerName+"_object.json");
273
      }
274
275 314e9ff0 Leszek Koltunski
    return null;
276 a7d8c3cd Leszek Koltunski
    }
277
278
///////////////////////////////////////////////////////////////////////////////////////////////////
279
280 314e9ff0 Leszek Koltunski
  public InputStream getMeshStream(Activity act)
281 a7d8c3cd Leszek Koltunski
    {
282 84d746d7 Leszek Koltunski
    if( mMeshID>0 )
283 314e9ff0 Leszek Koltunski
      {
284
      Resources res = act.getResources();
285
      return res.openRawResource(mMeshID);
286
      }
287 84d746d7 Leszek Koltunski
288 314e9ff0 Leszek Koltunski
    return null;
289 a7d8c3cd Leszek Koltunski
    }
290
291
///////////////////////////////////////////////////////////////////////////////////////////////////
292
293 314e9ff0 Leszek Koltunski
  public InputStream getExtrasStream(Activity act)
294 a7d8c3cd Leszek Koltunski
    {
295 84d746d7 Leszek Koltunski
    if( mExtrasID>0 )
296 314e9ff0 Leszek Koltunski
      {
297
      Resources res = act.getResources();
298
      return res.openRawResource(mExtrasID);
299
      }
300 84d746d7 Leszek Koltunski
    if( mExtrasID<0 )
301
      {
302
      RubikFiles files = RubikFiles.getInstance();
303
      return files.openFile(act,mLowerName+"_extras.json");
304
      }
305
306 314e9ff0 Leszek Koltunski
    return null;
307 a7d8c3cd Leszek Koltunski
    }
308
309 ff4a2a13 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
310
311
  public int getCategory()
312
    {
313
    return mCategory;
314
    }
315
316
///////////////////////////////////////////////////////////////////////////////////////////////////
317
318
  public float getDifficulty()
319
    {
320
    return mDifficulty;
321
    }
322
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324
325
  public int getYearOfInvention()
326
    {
327
    return mYear;
328
    }
329
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331
332
  public String getAuthor()
333
    {
334
    return mAuthor;
335
    }
336
337 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
338
339 314e9ff0 Leszek Koltunski
  public boolean hasExtras()
340 804293f0 Leszek Koltunski
    {
341 314e9ff0 Leszek Koltunski
    return mExtrasID!=0;
342 804293f0 Leszek Koltunski
    }
343
344 b42c8399 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
345
346
  public boolean hasSolver()
347
    {
348
    return mSolverOrdinal>=0;
349
    }
350
351
///////////////////////////////////////////////////////////////////////////////////////////////////
352
353
  public int getSolverOrdinal()
354
    {
355
    return mSolverOrdinal;
356
    }
357
358 7ee8337b leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
359
360
  public int getObjectOrdinal()
361
    {
362
    return mObjectOrdinal;
363
    }
364
365
///////////////////////////////////////////////////////////////////////////////////////////////////
366
367
  public boolean isLocal()
368
    {
369
    return mIsLocal;
370
    }
371
372 b42c8399 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
373
374
  public boolean hasPatterns()
375
    {
376
    return mPatterns!=null;
377
    }
378
379 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
380
381
  public String[][] getPatterns()
382
    {
383
    return mPatterns;
384
    }
385
}