Project

General

Profile

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

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

1 40d02f47 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 be803eb3 leszek
import android.widget.AdapterView;
19
import android.widget.ArrayAdapter;
20
import android.widget.Spinner;
21 eb0369a7 leszek
import android.widget.TextView;
22 573c7ef7 leszek
import android.widget.Toast;
23
24 40d02f47 leszek
import androidx.preference.PreferenceManager;
25
26
import org.distorted.library.main.DistortedLibrary;
27 d2d4316a leszek
import org.distorted.objectlib.algsolvers.*;
28 e8d06619 leszek
import org.distorted.objectlib.algsolvers.implemented.PhasedSolverList;
29 be803eb3 leszek
import org.distorted.objectlib.algsolvers.implemented.SolverAbstract;
30 40d02f47 leszek
import org.distorted.objectlib.main.InitAssets;
31
import org.distorted.objectlib.main.ObjectControl;
32 a96b9267 leszek
import org.distorted.objectlib.main.TwistyObject;
33 40d02f47 leszek
import org.distorted.os.OSInterface;
34
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36
37 be803eb3 leszek
public class SolverActivity extends Activity implements SolutionListener, AdapterView.OnItemSelectedListener
38 40d02f47 leszek
{
39 573c7ef7 leszek
  private InitAssets mAsset;
40
  private SharedPreferences mPreferences;
41
  private SolverLowerPane mLowerPane;
42 eb0369a7 leszek
  private TextView mText;
43
  private SolvedObject mObject;
44
  private String mMoves;
45 6aed3662 leszek
  private int mNumMoves;
46 be803eb3 leszek
  private int mCurrSolver;
47
  private SolverAbstract mSolver;
48 222938b7 leszek
  private long mTime;
49 696c5dd1 leszek
50 40d02f47 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
51
52 573c7ef7 leszek
  @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 eb0369a7 leszek
    mText = findViewById(R.id.solverMoves);
63
    mMoves = "";
64 6aed3662 leszek
    mNumMoves = 0;
65 be803eb3 leszek
    Spinner objectSpinner = findViewById(R.id.solverSpinner);
66
    objectSpinner.setOnItemSelectedListener(this);
67 2c567b1f leszek
68 be803eb3 leszek
    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 4d2a5fd3 leszek
74 be803eb3 leszek
    String[] phaseNames = createSolver();
75 4d2a5fd3 leszek
76 be803eb3 leszek
    mLowerPane = new SolverLowerPane(this,phaseNames);
77 573c7ef7 leszek
    }
78 40d02f47 leszek
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80
81 573c7ef7 leszek
  @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 40d02f47 leszek
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93
94 573c7ef7 leszek
  @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 be803eb3 leszek
    int ordinal = getObjectOrdinal();
105 573c7ef7 leszek
    ObjectControl control = getControl();
106 be803eb3 leszek
    control.changeObject(ordinal, MODE_NORM, mAsset);
107 573c7ef7 leszek
    }
108 40d02f47 leszek
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110 573c7ef7 leszek
111
  @Override
112
  protected void onDestroy()
113
    {
114
    DistortedLibrary.onDestroy();
115
    super.onDestroy();
116
    }
117 40d02f47 leszek
118 be803eb3 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 e8d06619 leszek
    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 be803eb3 leszek
    }
146
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148
149
  private int getObjectOrdinal()
150
    {
151 e8d06619 leszek
    return PhasedSolverList.getPuzzleOrdinal(mCurrSolver);
152 be803eb3 leszek
    }
153
154
///////////////////////////////////////////////////////////////////////////////////////////////////
155
156
  private String[] createSolver()
157
    {
158 e8d06619 leszek
    mSolver = PhasedSolverList.create(mCurrSolver);
159 be803eb3 leszek
160 e8d06619 leszek
    if( mSolver!=null )
161
      {
162
      mObject = mSolver.getObject();
163 be803eb3 leszek
164 e8d06619 leszek
      int numPhases = mSolver.getNumPhases();
165
      String[] names = new String[numPhases];
166
      for(int p=0; p<numPhases; p++) names[p] = mSolver.getPhaseName(p);
167 be803eb3 leszek
168 e8d06619 leszek
      return names;
169
      }
170
    return new String[] {"NONE"};
171 be803eb3 leszek
    }
172
173 4d2a5fd3 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 40d02f47 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
181
182 573c7ef7 leszek
  ObjectControl getControl()
183
    {
184
    SolverSurfaceView view = findViewById(R.id.solverView);
185
    return view.getObjectControl();
186
    }
187 40d02f47 leszek
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190 573c7ef7 leszek
  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 40d02f47 leszek
198 573c7ef7 leszek
    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 40d02f47 leszek
211
///////////////////////////////////////////////////////////////////////////////////////////////////
212
213 222938b7 leszek
  public void receiveSolution(int[] solution, int phase)
214 573c7ef7 leszek
    {
215 222938b7 leszek
    if( solution==null )
216 40d02f47 leszek
      {
217 222938b7 leszek
      String message = "Phase "+phase+": FAIL";
218
      Toast.makeText(this,message,Toast.LENGTH_LONG).show();
219 40d02f47 leszek
      }
220 222938b7 leszek
    else
221 40d02f47 leszek
      {
222 222938b7 leszek
      int numMoves = solution[0];
223
      int[][] moves = new int[numMoves][];
224 4d2a5fd3 leszek
      int index = 0;
225 573c7ef7 leszek
226
      for(int m=1; m<=numMoves; m++)
227 222938b7 leszek
        moves[index++] = mObject.findMove(solution[m]);
228
229 96f22b9b leszek
      mLowerPane.setSolution(this, moves, phase, mSolver.getSubPhases(phase));
230 40d02f47 leszek
      }
231
232 222938b7 leszek
    long time = System.currentTimeMillis();
233
    long diff = time - mTime;
234
    mTime = time;
235
236 16af2881 leszek
    System.out.println("Phase "+phase+" solved in "+diff+"ms. Moves: "+(solution==null ? 0:solution[0]));
237 573c7ef7 leszek
    }
238
239 eb0369a7 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
240
241 222938b7 leszek
  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 eb0369a7 leszek
      {
252 222938b7 leszek
      @Override
253
      public void run()
254 a96b9267 leszek
        {
255 be803eb3 leszek
        mSolver.solution(listener, qi);
256 222938b7 leszek
        }
257
      });
258
    }
259 40d02f47 leszek
260 7c1b6441 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
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 573c7ef7 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275 222938b7 leszek
  public void Reset(View v)
276
    {
277
    ObjectControl control = getControl();
278
    control.solveObject();
279
    mLowerPane.clearMoves(this);
280 eb0369a7 leszek
281 222938b7 leszek
    mNumMoves = 0;
282
    mMoves = "";
283
    mText.setText(mMoves);
284
    }
285 eb0369a7 leszek
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287
288 222938b7 leszek
  void addMove(int axis, int row, int angle)
289
    {
290
    int move = mObject.findMove(axis,row,angle);
291
    mMoves += (" "+move);
292
    mNumMoves++;
293 6aed3662 leszek
294 222938b7 leszek
    if( mNumMoves>10 )
295
      {
296
      int space = mMoves.indexOf(' ');
297
      mMoves = mMoves.substring(space+1);
298
      mNumMoves--;
299 573c7ef7 leszek
      }
300 222938b7 leszek
301 2ba3c690 leszek
    runOnUiThread(new Runnable()
302
      {
303
      @Override
304
      public void run() { mText.setText(mMoves); }
305
      });
306 222938b7 leszek
    }
307 40d02f47 leszek
}