Project

General

Profile

Download (9.28 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 7ff3cacb leszek
import org.distorted.helpers.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 3a768e35 leszek
import org.distorted.objectlib.solvers.verifiers.ImplementedVerifierList;
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 3a768e35 leszek
  private final int mNumSolvers;
43 7ee8337b leszek
  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 d7f9a1a7 leszek
    int[] solverOrdinals= ImplementedVerifierList.getSolverOrdinals(mUpperName);
85 3a768e35 leszek
    mNumSolvers = solverOrdinals==null ? 0 : solverOrdinals.length;
86 fcf7320f Leszek Koltunski
    mExtrasOrdinal = -1;
87
88 920cbdf9 leszek
    mObjectVersion = meta.objectVersion();
89
    mExtrasVersion = meta.extrasVersion();
90 804293f0 Leszek Koltunski
    }
91 84d746d7 Leszek Koltunski
92 314e9ff0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
93
94
  RubikObject(RubikObjectList.DownloadedObject object)
95
    {
96 7bb30586 leszek
    if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "new downloaded RubikObject "+object.shortName+" added");
97 84d746d7 Leszek Koltunski
98
    mLowerName     = object.shortName;
99 f611dc3e Leszek Koltunski
    mUpperName     = object.shortName.toUpperCase(Locale.ENGLISH);
100 84d746d7 Leszek Koltunski
    mNumScramble   = object.numScrambles;
101 e9e744f7 Leszek Koltunski
    mPrice         = object.price;
102
    mIsFree        = mPrice==0;
103 0effd5a9 leszek
    mObjectVersion = object.objectVersion;
104
    mExtrasVersion = object.extrasVersion;
105 ff4a2a13 leszek
    mDifficulty    = object.difficulty;
106
    mCategory      = object.category;
107
    mYear          = object.year;
108
    mAuthor        = object.author;
109 988e3d33 leszek
    mAdjColors     = object.adjColors;
110 740fade2 leszek
    mObjectIndex   = -1;
111 84d746d7 Leszek Koltunski
112 d36d8517 Leszek Koltunski
    mPatterns      = null;
113
    mExtrasOrdinal = -1;
114 3a768e35 leszek
    mNumSolvers    = 0;
115 7ee8337b leszek
    mObjectOrdinal = -1;
116
    mIsLocal       = true;
117 314e9ff0 Leszek Koltunski
118 84d746d7 Leszek Koltunski
    mMeshID        =  0;
119 b525bc12 leszek
    mJsonID        = object.object ? -1 : 0;
120
    mExtrasID      = object.extras ? -1 : 0;
121
    mIconID        = object.icon   ? -1 : 0;
122 314e9ff0 Leszek Koltunski
    }
123 804293f0 Leszek Koltunski
124 314e9ff0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
125
126 84d746d7 Leszek Koltunski
  public boolean updateObject(RubikObjectList.DownloadedObject object)
127 314e9ff0 Leszek Koltunski
    {
128 84d746d7 Leszek Koltunski
    boolean changed = false;
129 314e9ff0 Leszek Koltunski
130 0effd5a9 leszek
    if( object.objectVersion>mObjectVersion )
131 84d746d7 Leszek Koltunski
      {
132 7bb30586 leszek
      if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" main JSON");
133 84d746d7 Leszek Koltunski
134 0effd5a9 leszek
      mObjectVersion= object.objectVersion;
135
      mNumScramble  = object.numScrambles;
136 84d746d7 Leszek Koltunski
      mMeshID =  0;
137
      mJsonID = -1;
138
      changed = true;
139
      }
140
141 0effd5a9 leszek
    if( object.extrasVersion>mExtrasVersion )
142 84d746d7 Leszek Koltunski
      {
143 7bb30586 leszek
      if( RubikObjectList.SHOW_DOWNLOADED_DEBUG ) android.util.Log.e("D", "Updating RubikObject's "+object.shortName+" extras JSON");
144 84d746d7 Leszek Koltunski
145 0effd5a9 leszek
      mExtrasVersion = object.extrasVersion;
146 84d746d7 Leszek Koltunski
      mExtrasID = -1;
147
      changed = true;
148
      }
149
150
    return changed;
151 314e9ff0 Leszek Koltunski
    }
152 84d746d7 Leszek Koltunski
153 eb985085 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155 8f200211 leszek
  private Drawable createIconDrawable(Activity act)
156 eb985085 Leszek Koltunski
    {
157 84d746d7 Leszek Koltunski
    if( mIconID>0 )
158
      {
159 8f200211 leszek
      return AppCompatResources.getDrawable(act,mIconID);
160 84d746d7 Leszek Koltunski
      }
161
    else
162
      {
163
      RubikFiles files = RubikFiles.getInstance();
164
      Bitmap bmp = files.getIcon(act,mLowerName+".png");
165 8f200211 leszek
      if( bmp==null ) return AppCompatResources.getDrawable(act,R.drawable.unknown_icon);
166
      else            return new BitmapDrawable(act.getResources(), bmp);
167 84d746d7 Leszek Koltunski
      }
168 eb985085 Leszek Koltunski
    }
169
170 804293f0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
171
172 a7d8c3cd Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
173
// PUBLIC API
174
175 eb985085 Leszek Koltunski
  public void setIconTo(Activity act,ImageButton button)
176 314e9ff0 Leszek Koltunski
    {
177 8f200211 leszek
    Drawable icon = createIconDrawable(act);
178
    button.setBackground(icon);
179 314e9ff0 Leszek Koltunski
    }
180
181
///////////////////////////////////////////////////////////////////////////////////////////////////
182
183 eb985085 Leszek Koltunski
  public void setIconTo(Activity act,ImageView view)
184 314e9ff0 Leszek Koltunski
    {
185 8f200211 leszek
    Drawable icon = createIconDrawable(act);
186
    view.setImageDrawable(icon);
187 314e9ff0 Leszek Koltunski
    }
188
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190
191
  public InputStream getObjectStream(Activity act)
192 a7d8c3cd Leszek Koltunski
    {
193 84d746d7 Leszek Koltunski
    if( mJsonID>0 )
194 314e9ff0 Leszek Koltunski
      {
195
      Resources res = act.getResources();
196
      return res.openRawResource(mJsonID);
197
      }
198 84d746d7 Leszek Koltunski
    if( mJsonID<0 )
199
      {
200
      RubikFiles files = RubikFiles.getInstance();
201
      return files.openFile(act,mLowerName+"_object.json");
202
      }
203
204 314e9ff0 Leszek Koltunski
    return null;
205 a7d8c3cd Leszek Koltunski
    }
206
207
///////////////////////////////////////////////////////////////////////////////////////////////////
208
209 314e9ff0 Leszek Koltunski
  public InputStream getMeshStream(Activity act)
210 a7d8c3cd Leszek Koltunski
    {
211 84d746d7 Leszek Koltunski
    if( mMeshID>0 )
212 314e9ff0 Leszek Koltunski
      {
213
      Resources res = act.getResources();
214
      return res.openRawResource(mMeshID);
215
      }
216 84d746d7 Leszek Koltunski
217 314e9ff0 Leszek Koltunski
    return null;
218 a7d8c3cd Leszek Koltunski
    }
219
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221
222 314e9ff0 Leszek Koltunski
  public InputStream getExtrasStream(Activity act)
223 a7d8c3cd Leszek Koltunski
    {
224 84d746d7 Leszek Koltunski
    if( mExtrasID>0 )
225 314e9ff0 Leszek Koltunski
      {
226
      Resources res = act.getResources();
227
      return res.openRawResource(mExtrasID);
228
      }
229 84d746d7 Leszek Koltunski
    if( mExtrasID<0 )
230
      {
231
      RubikFiles files = RubikFiles.getInstance();
232
      return files.openFile(act,mLowerName+"_extras.json");
233
      }
234
235 314e9ff0 Leszek Koltunski
    return null;
236 a7d8c3cd Leszek Koltunski
    }
237
238 ff4a2a13 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
239
240 3a768e35 leszek
  public int getCategory()                  { return mCategory; }
241
  public int getIndex()                     { return mObjectIndex; }
242
  public float getDifficulty()              { return mDifficulty; }
243
  public int getYearOfInvention()           { return mYear; }
244
  public String getAuthor()                 { return mAuthor; }
245
  public boolean hasExtras()                { return mExtrasID!=0; }
246
  public int numSolvers()                   { return mNumSolvers; }
247
  public int getObjectOrdinal()             { return mObjectOrdinal; }
248
  public boolean isLocal()                  { return mIsLocal; }
249
  public boolean hasPatterns()              { return mPatterns!=null; }
250
  public String[][] getPatterns()           { return mPatterns; }
251
  public String getLowerName()              { return mLowerName; }
252
  public String getUpperName()              { return mUpperName; }
253
  public int getNumScramble()               { return mNumScramble; }
254
  public int getPrice()                     { return mPrice; }
255
  public boolean isFree()                   { return (!RubikObjectList.USE_IAP || mIsFree); }
256
  public void markFree()                    { mIsFree=true; }
257
  public int getObjectVersion()             { return mObjectVersion; }
258
  public int getExtrasVersion()             { return mExtrasVersion; }
259
  public void setExtrasOrdinal(int ordinal) { mExtrasOrdinal = ordinal; }
260
  public int getExtrasOrdinal()             { return mExtrasOrdinal; }
261
  public boolean supportsAdjustableColors() { return mAdjColors; }
262 a7d8c3cd Leszek Koltunski
}