Project

General

Profile

Download (24.1 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / states / RubikStatePlay.java @ 7403cdfa

1 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 1f9772f3 Leszek Koltunski
package org.distorted.states;
21 211b48f2 Leszek Koltunski
22 4c0cd600 Leszek Koltunski
import android.content.Context;
23 211b48f2 Leszek Koltunski
import android.content.SharedPreferences;
24 4c0cd600 Leszek Koltunski
import android.graphics.drawable.BitmapDrawable;
25 9439f455 Leszek Koltunski
import android.os.Build;
26 e03e0352 Leszek Koltunski
import android.os.Bundle;
27 dfbb340a Leszek Koltunski
import android.util.DisplayMetrics;
28 e3c74c0f Leszek Koltunski
import android.util.TypedValue;
29 4c0cd600 Leszek Koltunski
import android.view.Gravity;
30 211b48f2 Leszek Koltunski
import android.view.LayoutInflater;
31
import android.view.View;
32 9513f213 Leszek Koltunski
import android.view.ViewGroup;
33 85b09df4 Leszek Koltunski
import android.widget.AdapterView;
34
import android.widget.ArrayAdapter;
35 211b48f2 Leszek Koltunski
import android.widget.Button;
36 e07c48a2 Leszek Koltunski
import android.widget.GridLayout;
37 211b48f2 Leszek Koltunski
import android.widget.ImageButton;
38
import android.widget.LinearLayout;
39 4c0cd600 Leszek Koltunski
import android.widget.PopupWindow;
40 e3c74c0f Leszek Koltunski
import android.widget.TextView;
41
42 9513f213 Leszek Koltunski
import androidx.annotation.NonNull;
43 66e777b0 Leszek Koltunski
import androidx.appcompat.widget.AppCompatSpinner;
44 211b48f2 Leszek Koltunski
45 e03e0352 Leszek Koltunski
import org.distorted.dialogs.RubikDialogAbout;
46
import org.distorted.dialogs.RubikDialogScores;
47 1f9772f3 Leszek Koltunski
import org.distorted.main.R;
48
import org.distorted.main.RubikActivity;
49 15846fe4 Leszek Koltunski
import org.distorted.main.RubikPreRender;
50
import org.distorted.objects.RubikObject;
51 1f9772f3 Leszek Koltunski
import org.distorted.objects.RubikObjectList;
52 211b48f2 Leszek Koltunski
53 15846fe4 Leszek Koltunski
import java.util.ArrayList;
54
55 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
56
57 15846fe4 Leszek Koltunski
public class RubikStatePlay extends RubikStateAbstract implements AdapterView.OnItemSelectedListener,
58
                                                                  RubikPreRender.ActionFinishedListener
59 211b48f2 Leszek Koltunski
  {
60 15846fe4 Leszek Koltunski
  private static final int DURATION_MILLIS = 750;
61 85b09df4 Leszek Koltunski
  private static final int DEF_LEVEL =  1;
62
  public  static final int DEF_OBJECT= RubikObjectList.CUBE.ordinal();
63
  public  static final int DEF_SIZE  =  3;
64 211b48f2 Leszek Koltunski
65 e03e0352 Leszek Koltunski
  private static int[] BUTTON_LABELS = { R.string.scores, R.string.patterns, R.string.solver, R.string.about };
66
  private static final int NUM_BUTTONS = BUTTON_LABELS.length;
67
68 15846fe4 Leszek Koltunski
  private ImageButton mObjButton, mMenuButton, mPrevButton, mSolveButton;
69
  private Button mPlayButton;
70 e03e0352 Leszek Koltunski
  private PopupWindow mObjectPopup, mMenuPopup;
71 4888e97c Leszek Koltunski
  private int mObject = DEF_OBJECT;
72
  private int mSize   = DEF_SIZE;
73 e07c48a2 Leszek Koltunski
  private int mObjectSize, mMenuLayoutWidth, mMenuLayoutHeight;
74
  private GridLayout mObjectGrid;
75 8e3898c8 Leszek Koltunski
  private AppCompatSpinner mLevelSpinner;
76
  private ArrayAdapter<String> mSpinnerAdapter;
77 85b09df4 Leszek Koltunski
  private int mLevelValue;
78 dfbb340a Leszek Koltunski
  private int mBarHeight;
79 e07c48a2 Leszek Koltunski
  private float mButtonSize, mMenuItemSize, mMenuTextSize;
80
  private int mColCount, mRowCount;
81 211b48f2 Leszek Koltunski
82 15846fe4 Leszek Koltunski
  private ArrayList<Move> mMoves;
83
  private boolean mCanPrevMove;
84
85
  private static class Move
86
    {
87
    private int mAxis, mRow, mAngle;
88
89
    Move(int axis, int row, int angle)
90
      {
91
      mAxis = axis;
92
      mRow  = row;
93
      mAngle= angle;
94
      }
95
    }
96
97 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
98
99 329c0aeb Leszek Koltunski
  void leaveState(RubikActivity act)
100 211b48f2 Leszek Koltunski
    {
101 85b09df4 Leszek Koltunski
102 211b48f2 Leszek Koltunski
    }
103
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106 a6d3b158 Leszek Koltunski
  void enterState(final RubikActivity act)
107 211b48f2 Leszek Koltunski
    {
108 e3c74c0f Leszek Koltunski
    float width = act.getScreenWidthInPixels();
109 88fb92ba Leszek Koltunski
    mMenuTextSize = width*RubikActivity.MENU_MEDIUM_TEXT_SIZE;
110
    mButtonSize   = width*RubikActivity.BUTTON_TEXT_SIZE;
111
    mMenuItemSize = width*RubikActivity.MENU_ITEM_SIZE;
112 e3c74c0f Leszek Koltunski
113 15846fe4 Leszek Koltunski
    mCanPrevMove = true;
114
115
    if( mMoves==null ) mMoves = new ArrayList<>();
116
    else               mMoves.clear();
117
118 e07c48a2 Leszek Koltunski
    mRowCount = RubikObjectList.getRowCount();
119
    mColCount = RubikObjectList.getColumnCount();
120
121 211b48f2 Leszek Koltunski
    // TOP ////////////////////////////
122 7289fd6c Leszek Koltunski
    LinearLayout layoutTop = act.findViewById(R.id.upperBar);
123 211b48f2 Leszek Koltunski
    layoutTop.removeAllViews();
124 85b09df4 Leszek Koltunski
125 b376bfd7 Leszek Koltunski
    setupObjectWindow(act,width);
126 ad0c8e0e Leszek Koltunski
    setupObjectButton(act,width);
127 85b09df4 Leszek Koltunski
    layoutTop.addView(mObjButton);
128 ad0c8e0e Leszek Koltunski
    setupLevelSpinner(act,width);
129 85b09df4 Leszek Koltunski
    layoutTop.addView(mLevelSpinner);
130 ad0c8e0e Leszek Koltunski
    setupPlayButton(act,width);
131 85b09df4 Leszek Koltunski
    layoutTop.addView(mPlayButton);
132 211b48f2 Leszek Koltunski
133
    // BOT ////////////////////////////
134 4c0cd600 Leszek Koltunski
    LinearLayout layoutLeft = act.findViewById(R.id.mainBarLeft);
135
    layoutLeft.removeAllViews();
136 4888e97c Leszek Koltunski
137 ad0c8e0e Leszek Koltunski
    setupPrevButton(act,width);
138 15846fe4 Leszek Koltunski
    layoutLeft.addView(mPrevButton);
139 ad0c8e0e Leszek Koltunski
    setupSolveButton(act,width);
140 31227bf6 Leszek Koltunski
    layoutLeft.addView(mSolveButton);
141 769d7b9f Leszek Koltunski
142 4c0cd600 Leszek Koltunski
    LinearLayout layoutRight = act.findViewById(R.id.mainBarRight);
143
    layoutRight.removeAllViews();
144 31227bf6 Leszek Koltunski
145 b376bfd7 Leszek Koltunski
    setupMenuWindow(act,width);
146 ad0c8e0e Leszek Koltunski
    setupMenuButton(act,width);
147 15846fe4 Leszek Koltunski
    layoutRight.addView(mMenuButton);
148 769d7b9f Leszek Koltunski
    }
149 211b48f2 Leszek Koltunski
150 769d7b9f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
151 4c0cd600 Leszek Koltunski
152 ad0c8e0e Leszek Koltunski
  private void setupObjectButton(final RubikActivity act, final float width)
153 769d7b9f Leszek Koltunski
    {
154 e07c48a2 Leszek Koltunski
    final int padding = (int)(width*RubikActivity.PADDING);
155
    final int margin  = (int)(width*RubikActivity.MARGIN);
156
    final int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_menu,R.drawable.ui_medium_cube_menu, R.drawable.ui_big_cube_menu, R.drawable.ui_huge_cube_menu);
157 ad0c8e0e Leszek Koltunski
158
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
159
    params.topMargin    = margin;
160
    params.bottomMargin = margin;
161
    params.leftMargin   = margin;
162
    params.rightMargin  = margin;
163
164 769d7b9f Leszek Koltunski
    mObjButton = new ImageButton(act);
165 ad0c8e0e Leszek Koltunski
    mObjButton.setLayoutParams(params);
166 769d7b9f Leszek Koltunski
    mObjButton.setPadding(padding,0,padding,0);
167 f6a9c538 Leszek Koltunski
    mObjButton.setImageResource(icon);
168 769d7b9f Leszek Koltunski
169
    mObjButton.setOnClickListener( new View.OnClickListener()
170
      {
171
      @Override
172
      public void onClick(View view)
173 4c0cd600 Leszek Koltunski
        {
174 5a4d4fba Leszek Koltunski
        if( act.getPreRender().canPlay() )
175 a42e25a6 Leszek Koltunski
          {
176
          boolean vertical = act.isVertical();
177 e07c48a2 Leszek Koltunski
          mObjectGrid.setOrientation(vertical ? GridLayout.VERTICAL:GridLayout.HORIZONTAL);
178 fa679111 Leszek Koltunski
          mObjectPopup.showAsDropDown(view, margin, margin, Gravity.LEFT);
179 9439f455 Leszek Koltunski
180 fa679111 Leszek Koltunski
          int layhei = mObjectSize * (vertical? mRowCount:mColCount);
181
          int laywid = mObjectSize * (vertical? mColCount:mRowCount);
182
          mObjectPopup.update(view, laywid, layhei);
183 a42e25a6 Leszek Koltunski
          }
184 769d7b9f Leszek Koltunski
        }
185
      });
186
    }
187 4c0cd600 Leszek Koltunski
188 85b09df4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
189
190 ad0c8e0e Leszek Koltunski
  private void setupLevelSpinner(final RubikActivity act, final float width)
191 85b09df4 Leszek Koltunski
    {
192 ad0c8e0e Leszek Koltunski
    int padding = (int)(width*RubikActivity.PADDING);
193
    int margin  = (int)(width*RubikActivity.MARGIN);
194 31a9f38d Leszek Koltunski
    int spin = RubikActivity.getDrawable(R.drawable.ui_small_spinner,R.drawable.ui_big_spinner, R.drawable.ui_big_spinner, R.drawable.ui_huge_spinner);
195 f6a9c538 Leszek Koltunski
196 ad0c8e0e Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
197
    params.topMargin    = margin;
198
    params.bottomMargin = margin;
199
    params.leftMargin   = margin;
200
    params.rightMargin  = margin;
201 85b09df4 Leszek Koltunski
202 8e3898c8 Leszek Koltunski
    mLevelSpinner = new AppCompatSpinner(act);
203 ad0c8e0e Leszek Koltunski
    mLevelSpinner.setLayoutParams(params);
204 15846fe4 Leszek Koltunski
    mLevelSpinner.setPadding(padding,0,padding,0);
205 f6a9c538 Leszek Koltunski
    mLevelSpinner.setBackgroundResource(spin);
206 85b09df4 Leszek Koltunski
    mLevelSpinner.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
207
208
    mLevelSpinner.setOnItemSelectedListener(this);
209 8e3898c8 Leszek Koltunski
    int sizeIndex = RubikObjectList.getSizeIndex(mObject,mSize);
210
    int maxLevel = RubikObjectList.getMaxLevel(mObject, sizeIndex);
211
    String[] levels = new String[maxLevel];
212 85b09df4 Leszek Koltunski
213 8e3898c8 Leszek Koltunski
    for(int i=0; i<maxLevel; i++)
214 85b09df4 Leszek Koltunski
      {
215
      levels[i] = act.getString(R.string.lv_placeholder,i+1);
216
      }
217
218 c7f9e82d Leszek Koltunski
    if( mLevelValue>maxLevel ) mLevelValue=1;
219
220 9513f213 Leszek Koltunski
    mSpinnerAdapter = new ArrayAdapter<String>(act, android.R.layout.simple_spinner_item, levels)
221
      {
222
      @NonNull
223
      public View getView(int position, View convertView, @NonNull ViewGroup parent)
224
        {
225
        View v = super.getView(position, convertView, parent);
226
        TextView tv = ((TextView) v);
227
        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
228
        return v;
229
        }
230
      };
231
232 8e3898c8 Leszek Koltunski
    mSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
233
    mLevelSpinner.setAdapter(mSpinnerAdapter);
234 85b09df4 Leszek Koltunski
    mLevelSpinner.setSelection(mLevelValue-1);
235
    }
236
237
///////////////////////////////////////////////////////////////////////////////////////////////////
238
239 ad0c8e0e Leszek Koltunski
  private void setupPlayButton(final RubikActivity act, final float width)
240 85b09df4 Leszek Koltunski
    {
241 ad0c8e0e Leszek Koltunski
    int padding = (int)(width*RubikActivity.PADDING);
242
    int margin  = (int)(width*RubikActivity.MARGIN);
243
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.2f);
244
    params.topMargin    = margin;
245
    params.bottomMargin = margin;
246
    params.leftMargin   = margin;
247
    params.rightMargin  = margin;
248
249 85b09df4 Leszek Koltunski
    mPlayButton = new Button(act);
250 ad0c8e0e Leszek Koltunski
    mPlayButton.setLayoutParams(params);
251 85b09df4 Leszek Koltunski
    mPlayButton.setPadding(padding,0,padding,0);
252 e3c74c0f Leszek Koltunski
    mPlayButton.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
253 85b09df4 Leszek Koltunski
    mPlayButton.setText(R.string.play);
254
255
    mPlayButton.setOnClickListener( new View.OnClickListener()
256
      {
257
      @Override
258
      public void onClick(View v)
259
        {
260 5a4d4fba Leszek Koltunski
        act.getPreRender().scrambleObject(mLevelValue);
261 85b09df4 Leszek Koltunski
        }
262
      });
263
    }
264
265 e31abc1e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
266
267 ad0c8e0e Leszek Koltunski
  private void setupMenuButton(final RubikActivity act, final float width)
268 e31abc1e Leszek Koltunski
    {
269 ad0c8e0e Leszek Koltunski
    int padding = (int)(width*RubikActivity.PADDING);
270
    int margin  = (int)(width*RubikActivity.MARGIN);
271 31a9f38d Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_menu,R.drawable.ui_medium_menu, R.drawable.ui_big_menu, R.drawable.ui_huge_menu);
272 f6a9c538 Leszek Koltunski
273 ad0c8e0e Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
274
    params.topMargin    = margin;
275
    params.bottomMargin = margin;
276
    params.leftMargin   = margin;
277
    params.rightMargin  = margin;
278
279 e03e0352 Leszek Koltunski
    mMenuButton = new ImageButton(act);
280 ad0c8e0e Leszek Koltunski
    mMenuButton.setLayoutParams(params);
281 e03e0352 Leszek Koltunski
    mMenuButton.setPadding(padding,0,padding,0);
282 f6a9c538 Leszek Koltunski
    mMenuButton.setImageResource(icon);
283 e31abc1e Leszek Koltunski
284 e03e0352 Leszek Koltunski
    mMenuButton.setOnClickListener( new View.OnClickListener()
285 e31abc1e Leszek Koltunski
      {
286
      @Override
287
      public void onClick(View view)
288
        {
289 e03e0352 Leszek Koltunski
        if( act.getPreRender().canPlay() )
290
          {
291 dfbb340a Leszek Koltunski
          if( mBarHeight<=0 )
292
            {
293
            DisplayMetrics displaymetrics = new DisplayMetrics();
294
            act.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
295
            mBarHeight=displaymetrics.heightPixels/10;
296
            }
297
298
          mMenuPopup.showAsDropDown(view, 0, -mMenuLayoutHeight-mBarHeight, Gravity.LEFT);
299 74b08185 Leszek Koltunski
          mMenuPopup.update(view, mMenuLayoutWidth, mMenuLayoutHeight);
300 e03e0352 Leszek Koltunski
          }
301 e31abc1e Leszek Koltunski
        }
302
      });
303
    }
304
305 85b09df4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
306
307 ad0c8e0e Leszek Koltunski
  private void setupSolveButton(final RubikActivity act, final float width)
308 85b09df4 Leszek Koltunski
    {
309 ad0c8e0e Leszek Koltunski
    int padding  = (int)(width*RubikActivity.PADDING);
310
    int margin   = (int)(width*RubikActivity.MARGIN);
311 15846fe4 Leszek Koltunski
    int widthBut = (int)(width/6);
312 31a9f38d Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_solve,R.drawable.ui_medium_cube_solve, R.drawable.ui_big_cube_solve, R.drawable.ui_huge_cube_solve);
313 f6a9c538 Leszek Koltunski
314 ad0c8e0e Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
315
    params.topMargin    = margin;
316
    params.bottomMargin = margin;
317
    params.leftMargin   = margin;
318
    params.rightMargin  = margin;
319
320 15846fe4 Leszek Koltunski
    mSolveButton = new ImageButton(act);
321 ad0c8e0e Leszek Koltunski
    mSolveButton.setLayoutParams(params);
322 85b09df4 Leszek Koltunski
    mSolveButton.setPadding(padding,0,padding,0);
323 f6a9c538 Leszek Koltunski
    mSolveButton.setImageResource(icon);
324 85b09df4 Leszek Koltunski
325
    mSolveButton.setOnClickListener( new View.OnClickListener()
326
      {
327
      @Override
328
      public void onClick(View v)
329
        {
330 5a4d4fba Leszek Koltunski
        act.getPreRender().solveObject();
331 5b893eee Leszek Koltunski
        mMoves.clear();
332 85b09df4 Leszek Koltunski
        }
333
      });
334
    }
335
336 769d7b9f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
337 4c0cd600 Leszek Koltunski
338 ad0c8e0e Leszek Koltunski
  private void setupPrevButton(final RubikActivity act, final float width)
339 769d7b9f Leszek Koltunski
    {
340 ad0c8e0e Leszek Koltunski
    int padding  = (int)(width*RubikActivity.PADDING);
341
    int margin   = (int)(width*RubikActivity.MARGIN);
342 15846fe4 Leszek Koltunski
    int widthBut = (int)(width/6);
343 31a9f38d Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube_back,R.drawable.ui_medium_cube_back, R.drawable.ui_big_cube_back, R.drawable.ui_huge_cube_back);
344 f6a9c538 Leszek Koltunski
345 ad0c8e0e Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(widthBut, LinearLayout.LayoutParams.MATCH_PARENT);
346
    params.topMargin    = margin;
347
    params.bottomMargin = margin;
348
    params.leftMargin   = margin;
349
    params.rightMargin  = margin;
350
351 15846fe4 Leszek Koltunski
    mPrevButton = new ImageButton(act);
352 ad0c8e0e Leszek Koltunski
    mPrevButton.setLayoutParams(params);
353 15846fe4 Leszek Koltunski
    mPrevButton.setPadding(padding,0,padding,0);
354 f6a9c538 Leszek Koltunski
    mPrevButton.setImageResource(icon);
355 15846fe4 Leszek Koltunski
356
    mPrevButton.setOnClickListener( new View.OnClickListener()
357 a6d3b158 Leszek Koltunski
      {
358
      @Override
359
      public void onClick(View v)
360
        {
361 15846fe4 Leszek Koltunski
        RubikPreRender pre = act.getPreRender();
362
        backMove(pre);
363 a6d3b158 Leszek Koltunski
        }
364
      });
365 211b48f2 Leszek Koltunski
    }
366
367 4c0cd600 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
368
369 ad0c8e0e Leszek Koltunski
  private void setupObjectWindow(final RubikActivity act, final float width)
370 4c0cd600 Leszek Koltunski
    {
371 769d7b9f Leszek Koltunski
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
372
    final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
373 e07c48a2 Leszek Koltunski
    mObjectGrid = layout.findViewById(R.id.objectGrid);
374
375
    int[] indices = RubikObjectList.getIndices();
376
377
    GridLayout.Spec[] rowSpecs = new GridLayout.Spec[mRowCount];
378
    GridLayout.Spec[] colSpecs = new GridLayout.Spec[mColCount];
379
380
    mObjectGrid.setColumnCount(mColCount);
381
    mObjectGrid.setRowCount(mRowCount);
382
383 fa679111 Leszek Koltunski
    int[] nextInColumn = new int[mColCount];
384
385 e07c48a2 Leszek Koltunski
    for(int row=0; row<mRowCount; row++)
386
      {
387
      rowSpecs[row] = GridLayout.spec(row);
388
      }
389
    for(int col=0; col<mColCount; col++)
390
      {
391
      colSpecs[col] = GridLayout.spec(col);
392 fa679111 Leszek Koltunski
      nextInColumn[col] =0;
393 e07c48a2 Leszek Koltunski
      }
394 769d7b9f Leszek Koltunski
395 e03e0352 Leszek Koltunski
    mObjectPopup = new PopupWindow(act);
396
    mObjectPopup.setContentView(layout);
397
    mObjectPopup.setFocusable(true);
398 31a9f38d Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube2,R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2);
399 769d7b9f Leszek Koltunski
400 f6a9c538 Leszek Koltunski
    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon);
401 e07c48a2 Leszek Koltunski
    int cubeWidth = bd.getIntrinsicWidth();
402
    int margin = (int)(width*RubikActivity.LARGE_MARGIN);
403
    mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
404 f6a9c538 Leszek Koltunski
405 769d7b9f Leszek Koltunski
    for(int object=0; object<RubikObjectList.NUM_OBJECTS; object++)
406
      {
407 53f23b64 Leszek Koltunski
      final RubikObjectList list = RubikObjectList.getObject(object);
408
      final int[] sizes = list.getSizes();
409 769d7b9f Leszek Koltunski
      int[] icons = list.getIconIDs();
410
      int len = sizes.length;
411
      final int obj = object;
412 fa679111 Leszek Koltunski
      int col = indices[object];
413 769d7b9f Leszek Koltunski
414
      for(int i=0; i<len; i++)
415
        {
416 e07c48a2 Leszek Koltunski
        final int index = i;
417 769d7b9f Leszek Koltunski
418
        ImageButton button = new ImageButton(act);
419
        button.setBackgroundResource(icons[i]);
420
        button.setOnClickListener( new View.OnClickListener()
421
          {
422
          @Override
423
          public void onClick(View v)
424
            {
425 5a4d4fba Leszek Koltunski
            if( act.getPreRender().canPlay() && RubikState.getCurrentState()==RubikState.PLAY )
426 a42e25a6 Leszek Koltunski
              {
427
              mObject = obj;
428 e07c48a2 Leszek Koltunski
              mSize   = sizes[index];
429
              act.changeObject(list,sizes[index], true);
430 7b7d65ce Leszek Koltunski
              adjustSpinner(act);
431 40c8c5fa Leszek Koltunski
              mMoves.clear();
432 a42e25a6 Leszek Koltunski
              }
433 8e3898c8 Leszek Koltunski
434 e03e0352 Leszek Koltunski
            mObjectPopup.dismiss();
435 769d7b9f Leszek Koltunski
            }
436
          });
437
438 fa679111 Leszek Koltunski
        GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[nextInColumn[col]],colSpecs[col]);
439 e07c48a2 Leszek Koltunski
        params.bottomMargin = margin;
440
        params.topMargin    = margin;
441
        params.leftMargin   = margin;
442
        params.rightMargin  = margin;
443
444 fa679111 Leszek Koltunski
        nextInColumn[col]++;
445
446 e07c48a2 Leszek Koltunski
        mObjectGrid.addView(button, params);
447 769d7b9f Leszek Koltunski
        }
448
      }
449 4c0cd600 Leszek Koltunski
    }
450
451 e03e0352 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
452
453 ad0c8e0e Leszek Koltunski
  private void setupMenuWindow(final RubikActivity act, final float width)
454 e03e0352 Leszek Koltunski
    {
455
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
456 e07c48a2 Leszek Koltunski
    final View layout = layoutInflater.inflate(R.layout.popup_menu, null);
457
    LinearLayout menuLayout = layout.findViewById(R.id.menuGrid);
458 e03e0352 Leszek Koltunski
459
    mMenuPopup = new PopupWindow(act);
460
    mMenuPopup.setContentView(layout);
461
    mMenuPopup.setFocusable(true);
462 ad0c8e0e Leszek Koltunski
    int margin  = (int)(width*RubikActivity.MARGIN);
463
    int padding = (int)(width*RubikActivity.PADDING);
464 e03e0352 Leszek Koltunski
465 ad0c8e0e Leszek Koltunski
    LinearLayout.LayoutParams p0 = new LinearLayout.LayoutParams( (int)width/2 - 2*padding, (int)mMenuItemSize);
466
    p0.setMargins(margin, 0, margin, margin);
467
    LinearLayout.LayoutParams p1 = new LinearLayout.LayoutParams( (int)width/2 - 2*padding, (int)mMenuItemSize);
468
    p1.setMargins(margin, margin, margin, margin);
469 e03e0352 Leszek Koltunski
470
    for(int i=0; i<NUM_BUTTONS; i++)
471
      {
472
      final int but = i;
473
      Button button = new Button(act);
474 ad0c8e0e Leszek Koltunski
      button.setLayoutParams(i==0 ? p1:p0);
475 e03e0352 Leszek Koltunski
      button.setText(BUTTON_LABELS[i]);
476 88fb92ba Leszek Koltunski
      button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
477 e03e0352 Leszek Koltunski
478
      button.setOnClickListener( new View.OnClickListener()
479
        {
480
        @Override
481
        public void onClick(View v)
482
          {
483
          mMenuPopup.dismiss();
484
          Action(act,but);
485
          }
486
        });
487
488 e07c48a2 Leszek Koltunski
      menuLayout.addView(button);
489 e03e0352 Leszek Koltunski
      }
490
491 74b08185 Leszek Koltunski
    mMenuLayoutWidth = (int)(width/2);
492 ad0c8e0e Leszek Koltunski
    mMenuLayoutHeight= (int)(margin + NUM_BUTTONS*(mMenuItemSize+margin));
493 e03e0352 Leszek Koltunski
    }
494
495 15846fe4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
496
497
  private void backMove(RubikPreRender pre)
498
    {
499
    if( mCanPrevMove )
500
      {
501
      int numMoves = mMoves.size();
502
503
      if( numMoves>0 )
504
        {
505
        Move move = mMoves.remove(numMoves-1);
506
        RubikObject object = pre.getObject();
507
508
        int axis  = move.mAxis;
509
        int row   = (1<<move.mRow);
510
        int angle = move.mAngle;
511
        int numRot= Math.abs(angle*object.getBasicAngle()/360);
512
513
        if( angle!=0 )
514
          {
515
          mCanPrevMove = false;
516
          pre.addRotation(this, axis, row, -angle, numRot*DURATION_MILLIS);
517
          }
518
        else
519
          {
520
          android.util.Log.e("solution", "error: trying to back move of angle 0");
521
          }
522
        }
523
      }
524
    }
525 e03e0352 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
526
527
  private void Action(RubikActivity act, int button)
528
    {
529
    switch(button)
530
      {
531
      case 0: RubikStatePlay play = (RubikStatePlay) RubikState.PLAY.getStateClass();
532
              int object = play.getObject();
533
              int size   = play.getSize();
534
              int sizeIndex = RubikObjectList.getSizeIndex(object,size);
535
536
              Bundle bundle = new Bundle();
537
              bundle.putInt("tab", RubikObjectList.pack(object,sizeIndex) );
538
              bundle.putBoolean("submitting", false);
539
540
              RubikDialogScores scores = new RubikDialogScores();
541
              scores.setArguments(bundle);
542
              scores.show(act.getSupportFragmentManager(), null);
543
              break;
544
      case 1: RubikState.switchState(act,RubikState.PATT);
545
              break;
546
      case 2: RubikState.switchState(act,RubikState.SVER);
547
              break;
548
      case 3: RubikDialogAbout diag = new RubikDialogAbout();
549
              diag.show(act.getSupportFragmentManager(), null);
550
              break;
551
      }
552
    }
553
554 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
555
556
  public void savePreferences(SharedPreferences.Editor editor)
557
    {
558 85b09df4 Leszek Koltunski
    editor.putInt("statePlay_level" , mLevelValue);
559 4888e97c Leszek Koltunski
    editor.putInt("statePlay_object", mObject);
560
    editor.putInt("statePlay_size"  , mSize);
561 4c0cd600 Leszek Koltunski
562 e03e0352 Leszek Koltunski
    if( mObjectPopup!=null )
563
      {
564
      mObjectPopup.dismiss();
565
      mObjectPopup = null;
566
      }
567
568
    if( mMenuPopup!=null )
569 4c0cd600 Leszek Koltunski
      {
570 e03e0352 Leszek Koltunski
      mMenuPopup.dismiss();
571
      mMenuPopup = null;
572 4c0cd600 Leszek Koltunski
      }
573 211b48f2 Leszek Koltunski
    }
574
575
///////////////////////////////////////////////////////////////////////////////////////////////////
576
577
  public void restorePreferences(SharedPreferences preferences)
578
    {
579 85b09df4 Leszek Koltunski
    mLevelValue = preferences.getInt("statePlay_level" , DEF_LEVEL );
580
    mObject     = preferences.getInt("statePlay_object", DEF_OBJECT);
581
    mSize       = preferences.getInt("statePlay_size"  , DEF_SIZE  );
582 211b48f2 Leszek Koltunski
    }
583
584 53f23b64 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
585
586 7b7d65ce Leszek Koltunski
  public boolean setObjectAndSize(RubikActivity act, RubikObjectList obj, int size)
587 53f23b64 Leszek Koltunski
    {
588 7b7d65ce Leszek Koltunski
    if( mObject!=obj.ordinal() || mSize != size )
589
      {
590
      boolean success = false;
591 53f23b64 Leszek Koltunski
592 7b7d65ce Leszek Koltunski
      for( int s: obj.getSizes() )
593
        if( s==size )
594
          {
595
          success = true;
596
          break;
597
          }
598
599
      if( success )
600 53f23b64 Leszek Koltunski
        {
601 7b7d65ce Leszek Koltunski
        mObject = obj.ordinal();
602
        mSize   = size;
603 5f8c532e Leszek Koltunski
604
        if( mLevelSpinner!=null ) adjustSpinner(act);
605 53f23b64 Leszek Koltunski
        }
606
607 7b7d65ce Leszek Koltunski
      return success;
608
      }
609
610
    return true;
611
    }
612
613
///////////////////////////////////////////////////////////////////////////////////////////////////
614
615
  private void adjustSpinner(RubikActivity act)
616
    {
617
    int sizeIndex = RubikObjectList.getSizeIndex(mObject,mSize);
618
    int maxLevel  = RubikObjectList.getMaxLevel(mObject, sizeIndex);
619
    String[] levels = new String[maxLevel];
620
621
    for(int i=0; i<maxLevel; i++)
622 53f23b64 Leszek Koltunski
      {
623 7b7d65ce Leszek Koltunski
      levels[i] = act.getString(R.string.lv_placeholder,i+1);
624 53f23b64 Leszek Koltunski
      }
625
626 011fcfe0 Leszek Koltunski
    mSpinnerAdapter = new ArrayAdapter<String>(act, android.R.layout.simple_spinner_item, levels)
627
      {
628
      @NonNull
629
      public View getView(int position, View convertView, @NonNull ViewGroup parent)
630
        {
631
        View v = super.getView(position, convertView, parent);
632
        TextView tv = ((TextView) v);
633
        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
634
        return v;
635
        }
636
      };
637
638 7b7d65ce Leszek Koltunski
    mSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
639
    mLevelSpinner.setAdapter(mSpinnerAdapter);
640 53f23b64 Leszek Koltunski
    }
641
642 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
643
644 85b09df4 Leszek Koltunski
  int getLevel()
645 211b48f2 Leszek Koltunski
    {
646 85b09df4 Leszek Koltunski
    return mLevelValue;
647 211b48f2 Leszek Koltunski
    }
648
649 15846fe4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
650
651
  public void addMove(int axis, int row, int angle)
652
    {
653
    mMoves.add(new Move(axis,row,angle));
654
    }
655
656 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
657
658 4888e97c Leszek Koltunski
  public int getObject()
659 211b48f2 Leszek Koltunski
    {
660 4888e97c Leszek Koltunski
    return mObject;
661 211b48f2 Leszek Koltunski
    }
662
663
///////////////////////////////////////////////////////////////////////////////////////////////////
664
665 4888e97c Leszek Koltunski
  public int getSize()
666 211b48f2 Leszek Koltunski
    {
667 4888e97c Leszek Koltunski
    return mSize;
668
    }
669 85b09df4 Leszek Koltunski
670
///////////////////////////////////////////////////////////////////////////////////////////////////
671
672
  public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
673
    {
674
    mLevelValue = pos+1;
675
    }
676
677
///////////////////////////////////////////////////////////////////////////////////////////////////
678
679
  public void onNothingSelected(AdapterView<?> parent) { }
680 15846fe4 Leszek Koltunski
681
///////////////////////////////////////////////////////////////////////////////////////////////////
682
683
  public void onActionFinished(final long effectID)
684
    {
685
    mCanPrevMove = true;
686
    }
687 211b48f2 Leszek Koltunski
  }