Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikObject.java @ 740fade2

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