Project

General

Profile

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

phasedsolver / src / main / java / org / distorted / phasedsolver / SolverActivity.java @ 96f22b9b

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.algsolvers.*;
28
import org.distorted.objectlib.algsolvers.implemented.PhasedSolverList;
29
import org.distorted.objectlib.algsolvers.implemented.SolverAbstract;
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.os.OSInterface;
34

    
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

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

    
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

    
52
  @Override
53
  protected void onCreate(Bundle icicle)
54
    {
55
    super.onCreate(icicle);
56
    mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
57
    DistortedLibrary.onCreate();
58
    setContentView(R.layout.mainlayout);
59
    SolverSurfaceView view = findViewById(R.id.solverView);
60
    OSInterface os = view.getInterface();
61
    mAsset = new InitAssets(null, null, os);
62
    mText = findViewById(R.id.solverMoves);
63
    mMoves = "";
64
    mNumMoves = 0;
65
    Spinner objectSpinner = findViewById(R.id.solverSpinner);
66
    objectSpinner.setOnItemSelectedListener(this);
67

    
68
    mCurrSolver = 0;
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
    String[] phaseNames = createSolver();
75

    
76
    mLowerPane = new SolverLowerPane(this,phaseNames);
77
    }
78

    
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80

    
81
  @Override
82
  protected void onPause()
83
    {
84
    super.onPause();
85
    SolverSurfaceView view = findViewById(R.id.solverView);
86
    view.onPause();
87
    DistortedLibrary.onPause();
88

    
89
    savePreferences();
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93

    
94
  @Override
95
  protected void onResume()
96
    {
97
    super.onResume();
98
    SolverSurfaceView view = findViewById(R.id.solverView);
99
    view.onResume();
100
    DistortedLibrary.onResume();
101

    
102
    restorePreferences();
103

    
104
    int ordinal = getObjectOrdinal();
105
    ObjectControl control = getControl();
106
    control.changeObject(ordinal, MODE_NORM, mAsset);
107
    }
108

    
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110

    
111
  @Override
112
  protected void onDestroy()
113
    {
114
    DistortedLibrary.onDestroy();
115
    super.onDestroy();
116
    }
117

    
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119

    
120
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
121
    {
122
    if( parent.getId()==R.id.solverSpinner && mCurrSolver!=pos )
123
      {
124
      mCurrSolver = pos;
125
      String[] phaseNames = createSolver();
126
      mLowerPane.updateNames(this,phaseNames);
127
      int ordinal = getObjectOrdinal();
128
      ObjectControl control = getControl();
129
      control.changeObject(ordinal, MODE_NORM, mAsset);
130
      }
131
    }
132

    
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

    
135
    public void onNothingSelected(AdapterView<?> parent) { }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

    
139
  private String[] createSolverNames()
140
    {
141
    int num = PhasedSolverList.NUM_OBJECTS;
142
    String[] ret = new String[num];
143
    for(int s=0; s<num; s++) ret[s] = PhasedSolverList.getName(s);
144
    return ret;
145
    }
146

    
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148

    
149
  private int getObjectOrdinal()
150
    {
151
    return PhasedSolverList.getPuzzleOrdinal(mCurrSolver);
152
    }
153

    
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155

    
156
  private String[] createSolver()
157
    {
158
    mSolver = PhasedSolverList.create(mCurrSolver);
159

    
160
    if( mSolver!=null )
161
      {
162
      mObject = mSolver.getObject();
163

    
164
      int numPhases = mSolver.getNumPhases();
165
      String[] names = new String[numPhases];
166
      for(int p=0; p<numPhases; p++) names[p] = mSolver.getPhaseName(p);
167

    
168
      return names;
169
      }
170
    return new String[] {"NONE"};
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  public void Left(View v)       { mLowerPane.backMove(this); }
176
  public void Right(View v)      { mLowerPane.nextMove(this); }
177
  public void PhaseLeft(View v)  { mLowerPane.backPhase(this); }
178
  public void PhaseRight(View v) { mLowerPane.nextPhase(this); }
179

    
180
///////////////////////////////////////////////////////////////////////////////////////////////////
181

    
182
  ObjectControl getControl()
183
    {
184
    SolverSurfaceView view = findViewById(R.id.solverView);
185
    return view.getObjectControl();
186
    }
187

    
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

    
190
  private void savePreferences()
191
    {
192
    SharedPreferences.Editor editor = mPreferences.edit();
193
    SolverSurfaceView view = findViewById(R.id.solverView);
194
    OSInterface os = view.getInterface();
195
    os.setEditor(editor);
196
    view.getObjectControl().savePreferences();
197

    
198
    editor.apply();
199
    }
200

    
201
///////////////////////////////////////////////////////////////////////////////////////////////////
202

    
203
  private void restorePreferences()
204
    {
205
    SolverSurfaceView view = findViewById(R.id.solverView);
206
    OSInterface os = view.getInterface();
207
    os.setPreferences(mPreferences);
208
    view.getObjectControl().restorePreferences();
209
    }
210

    
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212

    
213
  public void receiveSolution(int[] solution, int phase)
214
    {
215
    if( solution==null )
216
      {
217
      String message = "Phase "+phase+": FAIL";
218
      Toast.makeText(this,message,Toast.LENGTH_LONG).show();
219
      }
220
    else
221
      {
222
      int numMoves = solution[0];
223
      int[][] moves = new int[numMoves][];
224
      int index = 0;
225

    
226
      for(int m=1; m<=numMoves; m++)
227
        moves[index++] = mObject.findMove(solution[m]);
228

    
229
      mLowerPane.setSolution(this, moves, phase, mSolver.getSubPhases(phase));
230
      }
231

    
232
    long time = System.currentTimeMillis();
233
    long diff = time - mTime;
234
    mTime = time;
235

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

    
239
///////////////////////////////////////////////////////////////////////////////////////////////////
240

    
241
  public void Solve(View v)
242
    {
243
    TwistyObject object = getControl().getObject();
244
    int numCubits = 26;
245
    int[] qi = new int[numCubits];
246
    for(int i=0; i<numCubits; i++) qi[i] = object.getCubitQuatIndex(i);
247
    final SolutionListener listener = this;
248
    mTime = System.currentTimeMillis();
249

    
250
    runOnUiThread(new Runnable()
251
      {
252
      @Override
253
      public void run()
254
        {
255
        mSolver.solution(listener, qi);
256
        }
257
      });
258
    }
259

    
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261

    
262
  public void Scramble(View v)
263
    {
264
    ObjectControl control = getControl();
265
    control.fastScrambleObject(1000,20);
266
    mLowerPane.clearMoves(this);
267

    
268
    mNumMoves = 0;
269
    mMoves = "";
270
    mText.setText(mMoves);
271
    }
272

    
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274

    
275
  public void Reset(View v)
276
    {
277
    ObjectControl control = getControl();
278
    control.solveObject();
279
    mLowerPane.clearMoves(this);
280

    
281
    mNumMoves = 0;
282
    mMoves = "";
283
    mText.setText(mMoves);
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  void addMove(int axis, int row, int angle)
289
    {
290
    int move = mObject.findMove(axis,row,angle);
291
    mMoves += (" "+move);
292
    mNumMoves++;
293

    
294
    if( mNumMoves>10 )
295
      {
296
      int space = mMoves.indexOf(' ');
297
      mMoves = mMoves.substring(space+1);
298
      mNumMoves--;
299
      }
300

    
301
    runOnUiThread(new Runnable()
302
      {
303
      @Override
304
      public void run() { mText.setText(mMoves); }
305
      });
306
    }
307
}
(1-1/5)