Project

General

Profile

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

phasedsolver / src / main / java / org / distorted / phasedsolver / SolverActivity.java @ 70926209

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////
9

    
10
package org.distorted.phasedsolver;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.MODE_NORM;
13

    
14
import android.app.Activity;
15
import android.content.SharedPreferences;
16
import android.os.Bundle;
17
import android.view.View;
18
import android.widget.AdapterView;
19
import android.widget.ArrayAdapter;
20
import android.widget.Spinner;
21
import android.widget.TextView;
22
import android.widget.Toast;
23

    
24
import androidx.preference.PreferenceManager;
25

    
26
import org.distorted.library.main.DistortedLibrary;
27
import org.distorted.objectlib.helpers.ObjectMove;
28
import org.distorted.objectlib.solvers.implemented.PhasedSolverList;
29
import org.distorted.objectlib.solvers.implemented.PhasedSolverAbstract;
30
import org.distorted.objectlib.main.InitAssets;
31
import org.distorted.objectlib.main.ObjectControl;
32
import org.distorted.objectlib.main.TwistyObject;
33
import org.distorted.objectlib.solvers.algorithmic.SolutionListener;
34
import org.distorted.objectlib.solvers.algorithmic.SolvedObject;
35
import org.distorted.os.OSInterface;
36

    
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38

    
39
public class SolverActivity extends Activity implements SolutionListener, AdapterView.OnItemSelectedListener
40
{
41
  private InitAssets mAsset;
42
  private SharedPreferences mPreferences;
43
  private SolverLowerPane mLowerPane;
44
  private TextView mTextView;
45
  private SolvedObject mObject;
46
  private String mText;
47
  private int mCurrSolver, mCurrMode;
48
  private PhasedSolverAbstract mSolver;
49
  private long mTime;
50

    
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

    
53
  @Override
54
  protected void onCreate(Bundle icicle)
55
    {
56
    super.onCreate(icicle);
57
    mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
58
    DistortedLibrary.onCreate();
59
    setContentView(R.layout.mainlayout);
60
    SolverSurfaceView view = findViewById(R.id.solverView);
61
    OSInterface os = view.getInterface();
62
    mAsset = new InitAssets(null, null, os);
63
    mTextView = findViewById(R.id.solverTextView);
64
    mText = "";
65

    
66
    mCurrSolver = 0;
67
    Spinner objectSpinner = findViewById(R.id.solverSpinner);
68
    objectSpinner.setOnItemSelectedListener(this);
69
    String[] solverNames = createSolverNames();
70
    ArrayAdapter<String> objAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, solverNames);
71
    objAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
72
    objectSpinner.setAdapter(objAdapter);
73

    
74
    mCurrMode = 0;
75
    Spinner modeSpinner = findViewById(R.id.solverMode);
76
    modeSpinner.setOnItemSelectedListener(this);
77
    String[] solverMode = { "MOVE", "CUBIT" };
78
    ArrayAdapter<String> modeAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, solverMode);
79
    modeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
80
    modeSpinner.setAdapter(modeAdapter);
81

    
82
    String[] phaseNames = createSolver();
83
    mLowerPane = new SolverLowerPane(this,phaseNames);
84
    }
85

    
86
///////////////////////////////////////////////////////////////////////////////////////////////////
87

    
88
  @Override
89
  protected void onPause()
90
    {
91
    super.onPause();
92
    SolverSurfaceView view = findViewById(R.id.solverView);
93
    view.onPause();
94
    DistortedLibrary.onPause();
95

    
96
    savePreferences();
97
    }
98

    
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100

    
101
  @Override
102
  protected void onResume()
103
    {
104
    super.onResume();
105
    SolverSurfaceView view = findViewById(R.id.solverView);
106
    view.onResume();
107
    DistortedLibrary.onResume();
108

    
109
    restorePreferences();
110

    
111
    int ordinal = getObjectOrdinal();
112
    ObjectControl control = getControl();
113
    control.changeObject(ordinal, MODE_NORM, mAsset);
114
    }
115

    
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117

    
118
  @Override
119
  protected void onDestroy()
120
    {
121
    DistortedLibrary.onDestroy();
122
    super.onDestroy();
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

    
127
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
128
    {
129
    if( parent.getId()==R.id.solverSpinner && mCurrSolver!=pos )
130
      {
131
      mCurrSolver = pos;
132
      String[] phaseNames = createSolver();
133
      mLowerPane.updateNames(phaseNames);
134
      int ordinal = getObjectOrdinal();
135
      ObjectControl control = getControl();
136
      control.changeObject(ordinal, MODE_NORM, mAsset);
137
      resetTexts();
138
      }
139

    
140
    if( parent.getId()==R.id.solverMode && mCurrMode!=pos )
141
      {
142
      mCurrMode = pos;
143
      resetTexts();
144
      SolverSurfaceView sv = findViewById(R.id.solverView);
145
      sv.switchMode();
146
      }
147
    }
148

    
149
///////////////////////////////////////////////////////////////////////////////////////////////////
150

    
151
  public void onNothingSelected(AdapterView<?> parent) { }
152

    
153
///////////////////////////////////////////////////////////////////////////////////////////////////
154

    
155
  private String[] createSolverNames()
156
    {
157
    int num = PhasedSolverList.NUM_OBJECTS;
158
    String[] ret = new String[num];
159
    for(int s=0; s<num; s++) ret[s] = PhasedSolverList.getName(s);
160
    return ret;
161
    }
162

    
163
///////////////////////////////////////////////////////////////////////////////////////////////////
164

    
165
  private int getObjectOrdinal()
166
    {
167
    return PhasedSolverList.getPuzzleOrdinal(mCurrSolver);
168
    }
169

    
170
///////////////////////////////////////////////////////////////////////////////////////////////////
171

    
172
  private String[] createSolver()
173
    {
174
    mSolver = PhasedSolverList.create(mCurrSolver);
175

    
176
    if( mSolver!=null )
177
      {
178
      mObject = mSolver.getObject();
179

    
180
      int numPhases = mSolver.getNumPhases();
181
      String[] names = new String[numPhases];
182
      for(int p=0; p<numPhases; p++) names[p] = mSolver.getPhaseName(p);
183

    
184
      return names;
185
      }
186
    return new String[] {"NONE"};
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190

    
191
  public void Left(View v)       { mLowerPane.backMove(); }
192
  public void Right(View v)      { mLowerPane.nextMove(); }
193
  public void PhaseLeft(View v)  { mLowerPane.backPhase(); }
194
  public void PhaseRight(View v) { mLowerPane.nextPhase(); }
195

    
196
///////////////////////////////////////////////////////////////////////////////////////////////////
197

    
198
  ObjectControl getControl()
199
    {
200
    SolverSurfaceView view = findViewById(R.id.solverView);
201
    return view.getObjectControl();
202
    }
203

    
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205

    
206
  private void savePreferences()
207
    {
208
    SharedPreferences.Editor editor = mPreferences.edit();
209
    SolverSurfaceView view = findViewById(R.id.solverView);
210
    OSInterface os = view.getInterface();
211
    os.setEditor(editor);
212
    view.getObjectControl().savePreferences();
213

    
214
    editor.apply();
215
    }
216

    
217
///////////////////////////////////////////////////////////////////////////////////////////////////
218

    
219
  private void restorePreferences()
220
    {
221
    SolverSurfaceView view = findViewById(R.id.solverView);
222
    OSInterface os = view.getInterface();
223
    os.setPreferences(mPreferences);
224
    view.getObjectControl().restorePreferences();
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  public void receiveSolution(int[] solution, int phase)
230
    {
231
    if( solution==null )
232
      {
233
      String message = "Phase "+phase+": FAIL";
234
      Toast.makeText(this,message,Toast.LENGTH_LONG).show();
235
      }
236
    else
237
      {
238
      int numMoves = solution[0];
239
      ObjectMove[] moves = new ObjectMove[numMoves];
240
      int index = 0;
241

    
242
      for(int m=1; m<=numMoves; m++)
243
        moves[index++] = mObject.findMove(solution[m]);
244

    
245
      mLowerPane.setSolution(moves, phase, mSolver.getSubPhases(phase));
246
      }
247

    
248
    long time = System.currentTimeMillis();
249
    long diff = time - mTime;
250
    mTime = time;
251

    
252
    System.out.println("Phase "+phase+" solved in "+diff+"ms. Moves: "+(solution==null ? 0:solution[0]));
253
    }
254

    
255
///////////////////////////////////////////////////////////////////////////////////////////////////
256

    
257
  public void Solve(View v)
258
    {
259
    TwistyObject object = getControl().getObject();
260
    int numCubits= object.getNumCubits();
261
    int[] qi = new int[numCubits];
262
    for(int i=0; i<numCubits; i++) qi[i] = object.getCubitQuatIndex(i);
263
    final SolutionListener listener = this;
264
    mTime = System.currentTimeMillis();
265

    
266
    runOnUiThread(new Runnable()
267
      {
268
      @Override public void run() { mSolver.solution(listener, qi); }
269
      });
270
    }
271

    
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273

    
274
  private void resetTexts()
275
    {
276
    mText = "";
277
    mTextView.setText(mText);
278
    }
279

    
280
///////////////////////////////////////////////////////////////////////////////////////////////////
281

    
282
  public void Scramble(View v)
283
    {
284
    ObjectControl control = getControl();
285
    control.fastScrambleObject(20,1000);
286
    mLowerPane.clearMoves();
287
    resetTexts();
288
    }
289

    
290
///////////////////////////////////////////////////////////////////////////////////////////////////
291

    
292
  public void Reset(View v)
293
    {
294
    ObjectControl control = getControl();
295
    control.solveObject();
296
    mLowerPane.clearMoves();
297
    resetTexts();
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301

    
302
  void addSticker(int cubit, int face)
303
    {
304
    if( mCurrMode==1 )
305
      {
306
      mText += ("("+cubit+" "+face+") ");
307

    
308
      while( mText.length()>32 )
309
        {
310
        int space = mText.indexOf(')');
311
        mText = mText.substring(space+1);
312
        }
313

    
314
      runOnUiThread(new Runnable()
315
        {
316
        @Override public void run() { mTextView.setText(mText); }
317
        });
318
      }
319
    }
320

    
321
///////////////////////////////////////////////////////////////////////////////////////////////////
322

    
323
  void addMove(int axis, int rowBitmap, int degrees)
324
    {
325
    if( mCurrMode==0 )
326
      {
327
      int move = mObject.findMove(axis,rowBitmap,degrees);
328
      mText += (" " + move);
329

    
330
      while( mText.length()>28 )
331
        {
332
        int space = mText.indexOf(' ');
333
        mText = mText.substring(space+1);
334
        }
335

    
336
      runOnUiThread(new Runnable()
337
        {
338
        @Override public void run() { mTextView.setText(mText); }
339
        });
340
      }
341
    }
342
}
(1-1/5)