Project

General

Profile

« Previous | Next » 

Revision daedd473

Added by Leszek Koltunski about 7 hours ago

progress with remembering solves: properly abstract out saving/restoring the Object State to/from JSON to the objlib.

View differences:

src/main/java/org/distorted/helpers/RubikRememberedSolves.java
13 13

  
14 14
import org.distorted.library.type.Static4D;
15 15
import org.distorted.main.MainObjectPopup;
16
import org.distorted.objectlib.main.TwistyObject;
16 17
import org.json.JSONArray;
17 18
import org.json.JSONException;
18 19
import org.json.JSONObject;
......
56 57

  
57 58
///////////////////////////////////////////////////////////////////////////////////////////////////
58 59

  
59
  private JSONObject createData(int elapsed, Static4D rot, int[] quats) throws JSONException
60
  private JSONObject createData(int elapsed, Static4D rot, TwistyObject object) throws JSONException
60 61
    {
61 62
    JSONObject data = new JSONObject();
62 63
    data.put("time",System.currentTimeMillis());
......
65 66
    data.put("rot1", rot.get1() );
66 67
    data.put("rot2", rot.get2() );
67 68
    data.put("rot3", rot.get3() );
68
    JSONArray qs = new JSONArray();
69
    for(int q:quats) qs.put(q);
70
    data.put("quats", qs);
69
    JSONObject state = object.generateObjectState();
70
    data.put("objState", state);
71 71

  
72 72
    return data;
73 73
    }
......
100 100

  
101 101
///////////////////////////////////////////////////////////////////////////////////////////////////
102 102

  
103
  private String addInfo(InputStream stream, int level, int elapsed, Static4D rot, int[] quats)
103
  private String addInfo(InputStream stream, int level, int elapsed, Static4D rot, TwistyObject object)
104 104
    {
105 105
    if( stream!=null )
106 106
      {
......
109 109
        String contents = readContents(stream);
110 110
        JSONArray levels = new JSONArray(contents);
111 111
        JSONArray lvl = levels.getJSONArray(level);
112
        JSONObject data = createData(elapsed,rot,quats);
112
        JSONObject data = createData(elapsed,rot,object);
113 113
        if( lvl.length()>=MAXSOLVES || level==0) lvl.remove(0);
114 114
        lvl.put(data);
115 115
        return levels.toString();
......
129 129

  
130 130
          if( l==level )
131 131
            {
132
            JSONObject data = createData(elapsed,rot,quats);
132
            JSONObject data = createData(elapsed,rot,object);
133 133
            save.put(data);
134 134
            }
135 135
          levels.put(save);
......
181 181

  
182 182
///////////////////////////////////////////////////////////////////////////////////////////////////
183 183

  
184
  public int[] getQuats(JSONObject object) throws JSONException
184
  public JSONObject getObjectState(JSONObject object) throws JSONException
185 185
    {
186
    JSONArray quats = object.getJSONArray("quats");
187
    int len = quats.length();
188
    int[] ret = new int[len];
189
    for(int i=0; i<len; i++)  ret[i] = quats.getInt(i);
190
    return ret;
186
    return object.getJSONObject("objState");
191 187
    }
192 188

  
193 189
///////////////////////////////////////////////////////////////////////////////////////////////////
......
240 236

  
241 237
///////////////////////////////////////////////////////////////////////////////////////////////////
242 238

  
243
  public void rememberSolve(Activity act, String objname, int level, int elapsed, Static4D rot, int[] quats)
239
  public void rememberSolve(Activity act, String objname, int level, int elapsed, Static4D rot, TwistyObject object)
244 240
    {
245 241
    String filename  = objname.toLowerCase()+"_solves.json";
246 242
    RubikFiles files = RubikFiles.getInstance();
247 243
    InputStream input= files.openFile(act,filename);
248
    String contents  = addInfo(input,level,elapsed,rot,quats);
244
    String contents  = addInfo(input,level,elapsed,rot,object);
249 245
    File file        = new File(act.getFilesDir(), filename);
250 246

  
251 247
    try( FileOutputStream fos = new FileOutputStream(file) )
src/main/java/org/distorted/main/MainActivity.java
48 48
import org.distorted.play.PlayActivity;
49 49
import org.distorted.solvers.SolverActivity;
50 50
import org.distorted.tutorials.TutorialActivity;
51
import org.json.JSONArray;
51

  
52
import org.json.JSONObject;
52 53

  
53 54
///////////////////////////////////////////////////////////////////////////////////////////////////
54 55

  
......
338 339

  
339 340
///////////////////////////////////////////////////////////////////////////////////////////////////
340 341

  
341
    public void switchToPlay(RubikObject object, int ordinal, int scrambles, int level, int elapsed, Static4D rot, int[] quats)
342
    public void switchToPlay(RubikObject object, int ordinal, int scrambles, int level, int elapsed, Static4D rot, JSONObject objState)
342 343
      {
343 344
      boolean local = object.isLocal();
344 345
      String name = local ? object.getLowerName() : object.getUpperName();
......
353 354

  
354 355
      if( rot!=null )
355 356
        {
356
        intent.putExtra("rot0", rot.get0() );
357
        intent.putExtra("rot1", rot.get1() );
358
        intent.putExtra("rot2", rot.get2() );
359
        intent.putExtra("rot3", rot.get3() );
357
        intent.putExtra("r0", rot.get0() );
358
        intent.putExtra("r1", rot.get1() );
359
        intent.putExtra("r2", rot.get2() );
360
        intent.putExtra("r3", rot.get3() );
360 361
        }
361
      if( quats!=null )
362
      if( objState!=null )
362 363
        {
363
        intent.putExtra("quats", quats);
364
        intent.putExtra("objstate", objState.toString() );
364 365
        }
365 366

  
366 367
      startActivity(intent);
src/main/java/org/distorted/main/MainObjectPopup.java
298 298
                {
299 299
                JSONObject obj = json.getJSONObject(0);
300 300
                Static4D rotQuat = solves.getRotQuat(obj);
301
                int[] quats = solves.getQuats(obj);
302
                act.switchToPlay(object,mObjectOrdinal,scrambles,ll,1,rotQuat,quats);
301
                JSONObject objState = solves.getObjectState(obj);
302
                act.switchToPlay(object,mObjectOrdinal,scrambles,ll,1,rotQuat,objState);
303 303
                }
304 304
              catch(JSONException jex)
305 305
                {
src/main/java/org/distorted/main/MainSolvesPopup.java
90 90
        long time = solves.getTime(object);
91 91
        int elapsed = solves.getElapsed(object);
92 92
        Static4D rotQuat = solves.getRotQuat(object);
93
        int[] quats = solves.getQuats(object);
94
        View pane = createOldPane(act, time, elapsed, rotQuat, quats, pL, pT);
93
        JSONObject objState = solves.getObjectState(object);
94
        View pane = createOldPane(act, time, elapsed, rotQuat, objState, pL, pT);
95 95
        mLayout.addView(pane);
96 96
        }
97 97
      }
......
122 122

  
123 123
///////////////////////////////////////////////////////////////////////////////////////////////////
124 124

  
125
  private View createOldPane(MainActivity act, long time, int elapsed, Static4D rot, int[] quats,
125
  private View createOldPane(MainActivity act, long time, int elapsed, Static4D rot, JSONObject objState,
126 126
                             LinearLayout.LayoutParams pView, LinearLayout.LayoutParams pText)
127 127
    {
128 128
    View view = act.getLayoutInflater().inflate(R.layout.dialog_solve_old_pane, null);
......
168 168
        public void onClick(View v)
169 169
          {
170 170
          mPopup.dismiss();
171
          act.switchToPlay(mObject,mObjectOrdinal,mNumScrambles,mLevel, elapsed, rot, quats);
171
          act.switchToPlay(mObject,mObjectOrdinal,mNumScrambles,mLevel, elapsed, rot, objState);
172 172
          }
173 173
        });
174 174

  
src/main/java/org/distorted/play/PlayActivity.java
39 39
import org.distorted.objects.RubikObject;
40 40
import org.distorted.objects.RubikObjectList;
41 41
import org.distorted.os.OSInterface;
42
import org.json.JSONException;
43
import org.json.JSONObject;
42 44

  
43 45
///////////////////////////////////////////////////////////////////////////////////////////////////
44 46

  
......
55 57
    private int mNumScrambles;
56 58
    private int mElapsed;
57 59
    private Static4D mRotQuat;
58
    private int[] mQuats;
60
    private JSONObject mObjectState;
59 61
    private boolean mObjectLocal, mModeResume;
60 62
    private int mObjectOrdinal;
61 63
    private int mLevel;
......
88 90

  
89 91
        if( mElapsed>0 )
90 92
          {
91
          float r0 = b.getFloat("rot0");
92
          float r1 = b.getFloat("rot1");
93
          float r2 = b.getFloat("rot2");
94
          float r3 = b.getFloat("rot3");
93
          float r0 = b.getFloat("r0");
94
          float r1 = b.getFloat("r1");
95
          float r2 = b.getFloat("r2");
96
          float r3 = b.getFloat("r3");
95 97
          mRotQuat = new Static4D(r0,r1,r2,r3);
96
          mQuats = b.getIntArray("quats");
98
          String state = b.getString("objstate");
99

  
100
          try
101
            {
102
            mObjectState = new JSONObject(state);
103
            }
104
          catch(JSONException jex)
105
            {
106
            android.util.Log.e("D", "PlayActivity: exception unpacking object state: "+jex.getMessage() );
107
            }
97 108
          }
98 109
        }
99 110
      else
......
105 116
        mObjectOrdinal = 0;
106 117
        mElapsed = 0;
107 118
        mRotQuat = null;
108
        mQuats = null;
119
        mObjectState = null;
109 120
        }
110 121

  
111 122
      mModeFree = (mLevel<0);
......
190 201

  
191 202
        if( !mObjectName.isEmpty() )
192 203
          {
193
          changeIfDifferent(mObjectName, mObjectLocal, mObjectOrdinal, control, mQuats);
204
          changeIfDifferent(mObjectName, mObjectLocal, mObjectOrdinal, control, mObjectState);
194 205
          }
195 206

  
196 207
        control.setRotateOnCreation(false);
......
289 300

  
290 301
///////////////////////////////////////////////////////////////////////////////////////////////////
291 302

  
292
    private void changeIfDifferent(String name, boolean local, int ordinal, ObjectControl control, int[] initQuats)
303
    private void changeIfDifferent(String name, boolean local, int ordinal, ObjectControl control, JSONObject state)
293 304
      {
294 305
      if( local )
295 306
        {
......
297 308
        int iconMode = TwistyObject.MODE_NORM;
298 309
        InputStream jsonStream = files.openFile(this, name+"_object.json");
299 310
        InitAssets asset = new InitAssets(jsonStream, null, null);
300
        control.changeIfDifferent(ordinal, name, iconMode, asset, initQuats);
311
        control.changeIfDifferent(ordinal, name, iconMode, asset, state);
301 312
        }
302 313
      else
303 314
        {
......
308 319
        PlayView view = findViewById(R.id.playView);
309 320
        OSInterface os = view.getInterface();
310 321
        InitAssets asset = new InitAssets(jsonStream, meshStream, os);
311
        control.changeIfDifferent(ordinal, name, iconMode, asset, initQuats);
322
        control.changeIfDifferent(ordinal, name, iconMode, asset, state);
312 323
        }
313 324
      }
314 325

  
......
351 362

  
352 363
      int level = mLevel==LEVELS_SHOWN ? mLevel : mLevel+1;
353 364
      String name = object.getShortName();
354
      int numCubits = object.getNumCubits();
355
      int[] quats = new int[numCubits];
356
      for(int c=0; c<numCubits; c++) quats[c] = object.getCubitQuatIndex(c);
357 365
      Static4D rotQuat = control.getQuat();
358 366
      Activity act = this;
359 367

  
......
362 370
        public void run()
363 371
          {
364 372
          RubikRememberedSolves solves = RubikRememberedSolves.getInstance();
365
          solves.rememberSolve(act,name,level,time,rotQuat,quats);
373
          solves.rememberSolve(act,name,level,time,rotQuat,object);
366 374
          }
367 375
        };
368 376

  

Also available in: Unified diff