Project

General

Profile

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

magiccube / src / main / java / org / distorted / screens / RubikScreenPlay.java @ 99cedf39

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 fcd5b990 Leszek Koltunski
package org.distorted.screens;
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 255492a0 Leszek Koltunski
import android.os.Build;
26 e03e0352 Leszek Koltunski
import android.os.Bundle;
27 e3c74c0f Leszek Koltunski
import android.util.TypedValue;
28 255492a0 Leszek Koltunski
import android.view.Gravity;
29 211b48f2 Leszek Koltunski
import android.view.LayoutInflater;
30
import android.view.View;
31
import android.widget.Button;
32 e07c48a2 Leszek Koltunski
import android.widget.GridLayout;
33 211b48f2 Leszek Koltunski
import android.widget.ImageButton;
34
import android.widget.LinearLayout;
35 4c0cd600 Leszek Koltunski
import android.widget.PopupWindow;
36 598de3ee Leszek Koltunski
import android.widget.ScrollView;
37 211b48f2 Leszek Koltunski
38 2afc6754 Leszek Koltunski
import org.distorted.objectlib.main.ObjectControl;
39 318c0a7d Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
40 3f7a4363 Leszek Koltunski
41
import org.distorted.main.R;
42
import org.distorted.main.RubikActivity;
43 e03e0352 Leszek Koltunski
import org.distorted.dialogs.RubikDialogAbout;
44 a8576d91 Leszek Koltunski
import org.distorted.dialogs.RubikDialogPattern;
45 e03e0352 Leszek Koltunski
import org.distorted.dialogs.RubikDialogScores;
46 234a7582 Leszek Koltunski
import org.distorted.dialogs.RubikDialogTutorial;
47 55e6be1d Leszek Koltunski
import org.distorted.helpers.TransparentButton;
48
import org.distorted.helpers.TransparentImageButton;
49 6a083c6a Leszek Koltunski
import org.distorted.network.RubikScores;
50 211b48f2 Leszek Koltunski
51 88d28110 Leszek Koltunski
import static org.distorted.objectlib.main.ObjectType.NUM_OBJECTS;
52
53 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
54
55 fcd5b990 Leszek Koltunski
public class RubikScreenPlay extends RubikScreenBase
56 211b48f2 Leszek Koltunski
  {
57 287e91a6 Leszek Koltunski
  public static final int NUM_COLUMNS  = 4;
58 00af5060 Leszek Koltunski
  public static final int LEVELS_SHOWN = 10;
59 8ab435b9 Leszek Koltunski
  public static int MAX_LEVEL;
60
  public static final ObjectType DEF_OBJECT= ObjectType.CUBE_3;
61 211b48f2 Leszek Koltunski
62 7cf2637d Leszek Koltunski
  private static final int[] BUTTON_LABELS = { R.string.scores,
63
                                               R.string.patterns,
64
                                               R.string.solver,
65
                                               R.string.tutorials,
66
                                               R.string.about };
67
68 e03e0352 Leszek Koltunski
  private static final int NUM_BUTTONS = BUTTON_LABELS.length;
69 de62316a Leszek Koltunski
  private static final float LAST_BUTTON = 1.5f;
70 dc78f395 Leszek Koltunski
  private static final int[] mLocation = new int[2];
71 e03e0352 Leszek Koltunski
72 a8576d91 Leszek Koltunski
  private ImageButton mObjButton, mMenuButton, mSolveButton;
73 15846fe4 Leszek Koltunski
  private Button mPlayButton;
74 0254cfd7 Leszek Koltunski
  private PopupWindow mObjectPopup, mMenuPopup, mPlayPopup;
75 8ab435b9 Leszek Koltunski
  private ObjectType mObject = DEF_OBJECT;
76 0254cfd7 Leszek Koltunski
  private int mObjectSize, mMenuLayoutWidth, mMenuLayoutHeight, mPlayLayoutWidth;
77 85b09df4 Leszek Koltunski
  private int mLevelValue;
78 e07c48a2 Leszek Koltunski
  private float mButtonSize, mMenuItemSize, mMenuTextSize;
79 598de3ee Leszek Koltunski
  private int mColCount, mRowCount, mMaxRowCount;
80 0254cfd7 Leszek Koltunski
  private LinearLayout mPlayLayout;
81 255492a0 Leszek Koltunski
  private int mUpperBarHeight;
82
83 8ab435b9 Leszek Koltunski
  static
84
    {
85
    ObjectType[] types = ObjectType.values();
86
    int max = Integer.MIN_VALUE;
87
88
    for (ObjectType type : types)
89
      {
90
      int cur = getDBLevel(type);
91
      if( cur>max ) max = cur;
92
      }
93
94
    MAX_LEVEL = max;
95
    }
96
97 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
98
99 f5da732a Leszek Koltunski
  void leaveScreen(RubikActivity act)
100 211b48f2 Leszek Koltunski
    {
101 85b09df4 Leszek Koltunski
102 211b48f2 Leszek Koltunski
    }
103
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106 f5da732a Leszek Koltunski
  void enterScreen(final RubikActivity act)
107 211b48f2 Leszek Koltunski
    {
108 e3c74c0f Leszek Koltunski
    float width = act.getScreenWidthInPixels();
109 255492a0 Leszek Koltunski
    mUpperBarHeight = act.getHeightUpperBar();
110 a8576d91 Leszek Koltunski
111 eb376d3a Leszek Koltunski
    mMenuTextSize = width*RubikActivity.MENU_MED_TEXT_SIZE;
112 88fb92ba Leszek Koltunski
    mButtonSize   = width*RubikActivity.BUTTON_TEXT_SIZE;
113
    mMenuItemSize = width*RubikActivity.MENU_ITEM_SIZE;
114 e3c74c0f Leszek Koltunski
115 88d28110 Leszek Koltunski
    mRowCount = (NUM_OBJECTS + NUM_COLUMNS-1) / NUM_COLUMNS;
116 287e91a6 Leszek Koltunski
    mColCount = NUM_COLUMNS;
117 e07c48a2 Leszek Koltunski
118 211b48f2 Leszek Koltunski
    // TOP ////////////////////////////
119 7289fd6c Leszek Koltunski
    LinearLayout layoutTop = act.findViewById(R.id.upperBar);
120 211b48f2 Leszek Koltunski
    layoutTop.removeAllViews();
121 85b09df4 Leszek Koltunski
122 ad0c8e0e Leszek Koltunski
    setupObjectButton(act,width);
123 85b09df4 Leszek Koltunski
    layoutTop.addView(mObjButton);
124 0254cfd7 Leszek Koltunski
125
    setupMenuButton(act,width);
126
    layoutTop.addView(mMenuButton);
127
128 2da68298 Leszek Koltunski
    setupPlayButton(act,width);
129 85b09df4 Leszek Koltunski
    layoutTop.addView(mPlayButton);
130 211b48f2 Leszek Koltunski
131 ad0c8e0e Leszek Koltunski
    setupSolveButton(act,width);
132 a8576d91 Leszek Koltunski
    createBottomPane(act,width,mSolveButton);
133 769d7b9f Leszek Koltunski
    }
134 211b48f2 Leszek Koltunski
135 8ab435b9 Leszek Koltunski
//////////////////////////////////////////////////////////////////////////////////////////////////
136 4c0cd600 Leszek Koltunski
137 ad0c8e0e Leszek Koltunski
  private void setupObjectButton(final RubikActivity act, final float width)
138 769d7b9f Leszek Koltunski
    {
139 e07c48a2 Leszek Koltunski
    final int margin  = (int)(width*RubikActivity.MARGIN);
140
    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);
141 dc78f395 Leszek Koltunski
142 da768c35 Leszek Koltunski
    mObjButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
143 769d7b9f Leszek Koltunski
144
    mObjButton.setOnClickListener( new View.OnClickListener()
145
      {
146
      @Override
147
      public void onClick(View view)
148 4c0cd600 Leszek Koltunski
        {
149 2da68298 Leszek Koltunski
        if( mObjectPopup==null )
150
          {
151
          float width = act.getScreenWidthInPixels();
152
          float height= act.getScreenHeightInPixels();
153
          setupObjectWindow(act,width,height);
154
          }
155
156
        if( act.getControl().isUINotBlocked())
157 a42e25a6 Leszek Koltunski
          {
158 598de3ee Leszek Koltunski
          int rowCount = Math.min(mMaxRowCount,mRowCount);
159 c5b4af4a Leszek Koltunski
          View popupView = mObjectPopup.getContentView();
160
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
161 255492a0 Leszek Koltunski
          displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount,margin,margin);
162 c5b4af4a Leszek Koltunski
          }
163 769d7b9f Leszek Koltunski
        }
164
      });
165
    }
166 4c0cd600 Leszek Koltunski
167 85b09df4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
168
169 2da68298 Leszek Koltunski
  private void setupPlayButton(final RubikActivity act, final float width)
170 85b09df4 Leszek Koltunski
    {
171 2da68298 Leszek Koltunski
    final int margin = (int)(width*RubikActivity.MARGIN);
172 d90c55cc Leszek Koltunski
173 da768c35 Leszek Koltunski
    mPlayButton = new TransparentButton(act, R.string.play, mButtonSize, width);
174 85b09df4 Leszek Koltunski
175
    mPlayButton.setOnClickListener( new View.OnClickListener()
176
      {
177
      @Override
178 0254cfd7 Leszek Koltunski
      public void onClick(View view)
179 85b09df4 Leszek Koltunski
        {
180 2da68298 Leszek Koltunski
         if( mPlayPopup==null )
181
          {
182
          float width = act.getScreenWidthInPixels();
183
          setupPlayWindow(act,width);
184
          }
185
186
        if( act.getControl().isUINotBlocked())
187 6e194411 Leszek Koltunski
          {
188 2da68298 Leszek Koltunski
          float height= act.getScreenHeightInPixels();
189
          final int maxHeight= (int)(0.9f*(height-mUpperBarHeight) );
190 c5b4af4a Leszek Koltunski
          View popupView = mPlayPopup.getContentView();
191
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
192 8ab435b9 Leszek Koltunski
          final int dbLevel = getDBLevel(mObject);
193 0a7aa15b Leszek Koltunski
          final int levelsShown = Math.min(dbLevel,LEVELS_SHOWN);
194 d90c55cc Leszek Koltunski
          final int popupHeight = (int)(levelsShown*(mMenuItemSize+margin)+3*margin+mMenuItemSize*(LAST_BUTTON-1.0f));
195 255492a0 Leszek Koltunski
          final int realHeight = Math.min(popupHeight,maxHeight);
196
          displayPopup(act,view,mPlayPopup,mPlayLayoutWidth,realHeight,margin,margin);
197 6fad862b Leszek Koltunski
          }
198 85b09df4 Leszek Koltunski
        }
199
      });
200
    }
201
202 e31abc1e Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
203
204 ad0c8e0e Leszek Koltunski
  private void setupMenuButton(final RubikActivity act, final float width)
205 e31abc1e Leszek Koltunski
    {
206 2da68298 Leszek Koltunski
    final int margin = (int)(width*RubikActivity.MARGIN);
207 0254cfd7 Leszek Koltunski
    final int icon = RubikActivity.getDrawable(R.drawable.ui_small_menu,R.drawable.ui_medium_menu, R.drawable.ui_big_menu, R.drawable.ui_huge_menu);
208 dc78f395 Leszek Koltunski
209 da768c35 Leszek Koltunski
    mMenuButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
210 e31abc1e Leszek Koltunski
211 e03e0352 Leszek Koltunski
    mMenuButton.setOnClickListener( new View.OnClickListener()
212 e31abc1e Leszek Koltunski
      {
213
      @Override
214
      public void onClick(View view)
215
        {
216 2da68298 Leszek Koltunski
        if( mMenuPopup==null )
217
          {
218
          float width = act.getScreenWidthInPixels();
219
          setupMenuWindow(act,width);
220
          }
221
222
        if( act.getControl().isUINotBlocked())
223 e03e0352 Leszek Koltunski
          {
224 c5b4af4a Leszek Koltunski
          View popupView = mMenuPopup.getContentView();
225
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
226 255492a0 Leszek Koltunski
          displayPopup(act,view,mMenuPopup,mMenuLayoutWidth,mMenuLayoutHeight,(int)(-width/12),margin);
227 6fad862b Leszek Koltunski
          }
228 e31abc1e Leszek Koltunski
        }
229
      });
230
    }
231
232 4c0cd600 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
233
234 598de3ee Leszek Koltunski
  private void setupObjectWindow(final RubikActivity act, final float width, final float height)
235 4c0cd600 Leszek Koltunski
    {
236 d4415163 Leszek Koltunski
    int icon = RubikActivity.getDrawable(R.drawable.cube_2s,R.drawable.cube_2m, R.drawable.cube_2b, R.drawable.cube_2h);
237 598de3ee Leszek Koltunski
238
    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon);
239
    int cubeWidth = bd.getIntrinsicWidth();
240
    int margin = (int)(width*RubikActivity.LARGE_MARGIN);
241
    mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
242 255492a0 Leszek Koltunski
    mMaxRowCount = (int)(0.9f*(height-mUpperBarHeight)/mObjectSize);
243 598de3ee Leszek Koltunski
    GridLayout objectGrid = new GridLayout(act);
244
    mObjectPopup = new PopupWindow(act);
245
    mObjectPopup.setFocusable(true);
246
247
    if( mMaxRowCount<mRowCount )
248
      {
249
      ScrollView scrollView = new ScrollView(act);
250
      scrollView.addView(objectGrid);
251
      mObjectPopup.setContentView(scrollView);
252
      }
253
    else
254
      {
255
      mObjectPopup.setContentView(objectGrid);
256
      }
257 e07c48a2 Leszek Koltunski
258
    GridLayout.Spec[] rowSpecs = new GridLayout.Spec[mRowCount];
259
    GridLayout.Spec[] colSpecs = new GridLayout.Spec[mColCount];
260
261 92843d3b Leszek Koltunski
    objectGrid.setColumnCount(mColCount);
262
    objectGrid.setRowCount(mRowCount);
263 e07c48a2 Leszek Koltunski
264 0501a4b8 Leszek Koltunski
    int[] nextInRow = new int[mRowCount];
265 fa679111 Leszek Koltunski
266 e07c48a2 Leszek Koltunski
    for(int row=0; row<mRowCount; row++)
267
      {
268
      rowSpecs[row] = GridLayout.spec(row);
269 0501a4b8 Leszek Koltunski
      nextInRow[row]= 0;
270 e07c48a2 Leszek Koltunski
      }
271
    for(int col=0; col<mColCount; col++)
272
      {
273
      colSpecs[col] = GridLayout.spec(col);
274
      }
275 769d7b9f Leszek Koltunski
276 88d28110 Leszek Koltunski
    for(int object = 0; object< NUM_OBJECTS; object++)
277 769d7b9f Leszek Koltunski
      {
278 7b2a8ef3 Leszek Koltunski
      final ObjectType type = ObjectType.getObject(object);
279 588ace55 Leszek Koltunski
      int iconSize = RubikActivity.getDrawableSize();
280 7b2a8ef3 Leszek Koltunski
      int icons = type.getIconID(iconSize);
281 287e91a6 Leszek Koltunski
      int row = object/NUM_COLUMNS;
282 769d7b9f Leszek Koltunski
283 7ac0ee88 Leszek Koltunski
      ImageButton button = new ImageButton(act);
284
      button.setBackgroundResource(icons);
285
      button.setOnClickListener( new View.OnClickListener()
286 769d7b9f Leszek Koltunski
        {
287 7ac0ee88 Leszek Koltunski
        @Override
288
        public void onClick(View v)
289 769d7b9f Leszek Koltunski
          {
290 2afc6754 Leszek Koltunski
          if( act.getControl().isUINotBlocked() && ScreenList.getCurrentScreen()== ScreenList.PLAY )
291 769d7b9f Leszek Koltunski
            {
292 7b2a8ef3 Leszek Koltunski
            mObject = type;
293
            act.changeObject(type, true);
294 4c9947bd Leszek Koltunski
            if( mPlayLayout!=null ) adjustLevels(act);
295 dd1a65c1 Leszek Koltunski
            mMovesController.clearMoves(act);
296 769d7b9f Leszek Koltunski
            }
297
298 7ac0ee88 Leszek Koltunski
          mObjectPopup.dismiss();
299
          }
300
        });
301 e07c48a2 Leszek Koltunski
302 7ac0ee88 Leszek Koltunski
      GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpecs[row],colSpecs[nextInRow[row]]);
303
      params.bottomMargin = margin;
304
      params.topMargin    = margin;
305
      params.leftMargin   = margin;
306
      params.rightMargin  = margin;
307 fa679111 Leszek Koltunski
308 7ac0ee88 Leszek Koltunski
      nextInRow[row]++;
309
310
      objectGrid.addView(button, params);
311 769d7b9f Leszek Koltunski
      }
312 4c0cd600 Leszek Koltunski
    }
313
314 e03e0352 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
315
316 ad0c8e0e Leszek Koltunski
  private void setupMenuWindow(final RubikActivity act, final float width)
317 e03e0352 Leszek Koltunski
    {
318
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
319 e07c48a2 Leszek Koltunski
    final View layout = layoutInflater.inflate(R.layout.popup_menu, null);
320
    LinearLayout menuLayout = layout.findViewById(R.id.menuGrid);
321 e03e0352 Leszek Koltunski
322
    mMenuPopup = new PopupWindow(act);
323
    mMenuPopup.setContentView(layout);
324
    mMenuPopup.setFocusable(true);
325 ad0c8e0e Leszek Koltunski
    int margin  = (int)(width*RubikActivity.MARGIN);
326
    int padding = (int)(width*RubikActivity.PADDING);
327 e03e0352 Leszek Koltunski
328 0254cfd7 Leszek Koltunski
    mMenuLayoutWidth = (int)(width/2);
329
    mMenuLayoutHeight= (int)(2*margin + NUM_BUTTONS*(mMenuItemSize+margin));
330
331 43162dfb Leszek Koltunski
    LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( mMenuLayoutWidth - 2*padding, (int)mMenuItemSize);
332 e03e0352 Leszek Koltunski
333
    for(int i=0; i<NUM_BUTTONS; i++)
334
      {
335
      final int but = i;
336
      Button button = new Button(act);
337 43162dfb Leszek Koltunski
      button.setLayoutParams(p);
338 e03e0352 Leszek Koltunski
      button.setText(BUTTON_LABELS[i]);
339 88fb92ba Leszek Koltunski
      button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
340 e03e0352 Leszek Koltunski
341
      button.setOnClickListener( new View.OnClickListener()
342
        {
343
        @Override
344
        public void onClick(View v)
345
          {
346
          mMenuPopup.dismiss();
347 0254cfd7 Leszek Koltunski
          MenuAction(act,but);
348 e03e0352 Leszek Koltunski
          }
349
        });
350
351 e07c48a2 Leszek Koltunski
      menuLayout.addView(button);
352 e03e0352 Leszek Koltunski
      }
353 0254cfd7 Leszek Koltunski
    }
354 e03e0352 Leszek Koltunski
355 0254cfd7 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
356
357
  private void setupPlayWindow(final RubikActivity act, final float width)
358
    {
359
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
360
    final View layout = layoutInflater.inflate(R.layout.popup_play, null);
361
    mPlayLayout = layout.findViewById(R.id.playGrid);
362
363
    mPlayLayoutWidth = (int)(width*0.4f);
364
365
    mPlayPopup = new PopupWindow(act);
366
    mPlayPopup.setContentView(layout);
367
    mPlayPopup.setFocusable(true);
368
369
    adjustLevels(act);
370 e03e0352 Leszek Koltunski
    }
371
372
///////////////////////////////////////////////////////////////////////////////////////////////////
373
374 0254cfd7 Leszek Koltunski
  private void MenuAction(RubikActivity act, int button)
375 e03e0352 Leszek Koltunski
    {
376
    switch(button)
377
      {
378 8ab435b9 Leszek Koltunski
      case 0: Bundle sBundle = new Bundle();
379
              sBundle.putInt("tab", mObject.ordinal() );
380 a8576d91 Leszek Koltunski
              sBundle.putBoolean("submitting", false);
381 e03e0352 Leszek Koltunski
              RubikDialogScores scores = new RubikDialogScores();
382 a8576d91 Leszek Koltunski
              scores.setArguments(sBundle);
383 e03e0352 Leszek Koltunski
              scores.show(act.getSupportFragmentManager(), null);
384
              break;
385 234a7582 Leszek Koltunski
      case 1: RubikDialogPattern pDiag = new RubikDialogPattern();
386
              pDiag.show( act.getSupportFragmentManager(), RubikDialogPattern.getDialogTag() );
387 e03e0352 Leszek Koltunski
              break;
388 b2a92941 Leszek Koltunski
      case 2: ScreenList.switchScreen(act, ScreenList.SVER);
389 e03e0352 Leszek Koltunski
              break;
390 b2a92941 Leszek Koltunski
      case 3: RubikDialogTutorial tDiag = new RubikDialogTutorial();
391 234a7582 Leszek Koltunski
              tDiag.show( act.getSupportFragmentManager(), RubikDialogTutorial.getDialogTag() );
392 2971588c Leszek Koltunski
              break;
393 b2a92941 Leszek Koltunski
      case 4: RubikDialogAbout aDiag = new RubikDialogAbout();
394 a8576d91 Leszek Koltunski
              aDiag.show(act.getSupportFragmentManager(), null);
395 e03e0352 Leszek Koltunski
              break;
396
      }
397
    }
398
399 46405bb4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
400
401 a8576d91 Leszek Koltunski
  void setupSolveButton(final RubikActivity act, final float width)
402 46405bb4 Leszek Koltunski
    {
403 a8576d91 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);
404
    mSolveButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
405 46405bb4 Leszek Koltunski
406 a8576d91 Leszek Koltunski
    mSolveButton.setOnClickListener( new View.OnClickListener()
407 46405bb4 Leszek Koltunski
      {
408 a8576d91 Leszek Koltunski
      @Override
409
      public void onClick(View v)
410
        {
411 2afc6754 Leszek Koltunski
        act.getControl().solveObject();
412 dd1a65c1 Leszek Koltunski
        mMovesController.clearMoves(act);
413 a8576d91 Leszek Koltunski
        }
414
      });
415 46405bb4 Leszek Koltunski
    }
416
417 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
418
419
  public void savePreferences(SharedPreferences.Editor editor)
420
    {
421 8ab435b9 Leszek Koltunski
    editor.putString("statePlay_objName", mObject.name() );
422 4c0cd600 Leszek Koltunski
423 e03e0352 Leszek Koltunski
    if( mObjectPopup!=null )
424
      {
425
      mObjectPopup.dismiss();
426
      mObjectPopup = null;
427
      }
428
429
    if( mMenuPopup!=null )
430 4c0cd600 Leszek Koltunski
      {
431 e03e0352 Leszek Koltunski
      mMenuPopup.dismiss();
432
      mMenuPopup = null;
433 4c0cd600 Leszek Koltunski
      }
434 0254cfd7 Leszek Koltunski
435
    if( mPlayPopup!=null )
436
      {
437
      mPlayPopup.dismiss();
438
      mPlayPopup = null;
439
      }
440 211b48f2 Leszek Koltunski
    }
441
442
///////////////////////////////////////////////////////////////////////////////////////////////////
443
444
  public void restorePreferences(SharedPreferences preferences)
445
    {
446 8ab435b9 Leszek Koltunski
    String objName= preferences.getString("statePlay_objName", DEF_OBJECT.name() );
447
    int ordinal = ObjectType.getOrdinal(objName);
448 88d28110 Leszek Koltunski
    mObject = ordinal>=0 && ordinal<NUM_OBJECTS ? ObjectType.values()[ordinal] : DEF_OBJECT;
449 211b48f2 Leszek Koltunski
    }
450
451 53f23b64 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
452
453 318c0a7d Leszek Koltunski
  public boolean setObject(RubikActivity act, ObjectType obj)
454 53f23b64 Leszek Koltunski
    {
455 8ab435b9 Leszek Koltunski
    if( mObject!=obj )
456 7b7d65ce Leszek Koltunski
      {
457 8ab435b9 Leszek Koltunski
      mObject = obj;
458 7ac0ee88 Leszek Koltunski
      if( mPlayLayout!=null ) adjustLevels(act);
459
      return true;
460 7b7d65ce Leszek Koltunski
      }
461
462 7ac0ee88 Leszek Koltunski
    return false;
463 7b7d65ce Leszek Koltunski
    }
464
465
///////////////////////////////////////////////////////////////////////////////////////////////////
466 255492a0 Leszek Koltunski
// work around lame bugs in Android's version <= 10 pop-up and split-screen modes
467
468
  private void displayPopup(RubikActivity act, View view, PopupWindow window, int w, int h, int xoff, int yoff)
469
    {
470
    View topLayout = act.findViewById(R.id.relativeLayout);
471 7ac0ee88 Leszek Koltunski
    boolean isFullScreen;
472 00aa398a Leszek Koltunski
473
    if( topLayout!=null )
474
      {
475
      topLayout.getLocationOnScreen(mLocation);
476 7ac0ee88 Leszek Koltunski
      isFullScreen = (mLocation[1]==0);
477 00aa398a Leszek Koltunski
      }
478
    else
479
      {
480 7ac0ee88 Leszek Koltunski
      isFullScreen = true;
481 00aa398a Leszek Koltunski
      }
482 255492a0 Leszek Koltunski
483 69a271f3 Leszek Koltunski
    try
484 255492a0 Leszek Koltunski
      {
485 69a271f3 Leszek Koltunski
      // if on Android 11 or we are fullscreen
486
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || isFullScreen )
487
        {
488
        window.showAsDropDown(view, xoff, yoff, Gravity.CENTER);
489
        window.update(view, w, h);
490
        }
491
      else  // Android 10 or below in pop-up mode or split-screen mode
492
        {
493
        view.getLocationOnScreen(mLocation);
494
        int width  = view.getWidth();
495
        int height = view.getHeight();
496
        int x = mLocation[0]+(width-w)/2;
497
        int y = mLocation[1]+height+yoff;
498
499
        window.showAsDropDown(view);
500
        window.update(x,y,w,h);
501
        }
502 255492a0 Leszek Koltunski
      }
503 69a271f3 Leszek Koltunski
    catch( IllegalArgumentException iae )
504 255492a0 Leszek Koltunski
      {
505 69a271f3 Leszek Koltunski
      // ignore, this means window is 'not attached to window manager' -
506
      // which most probably is because we are already exiting the app.
507 255492a0 Leszek Koltunski
      }
508
    }
509
510 ae77f661 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
511
512
  public void adjustSolvedIcons()
513
    {
514
    int dbLevel = getDBLevel(mObject);
515
    int numLevel = Math.min(dbLevel, LEVELS_SHOWN);
516
    RubikScores scores = RubikScores.getInstance();
517
518
    for(int i=0; i<numLevel; i++)
519
      {
520
      int level = i<numLevel-1 ? i+1 : dbLevel;
521
      Button button = (Button)mPlayLayout.getChildAt(i);
522
      int icon = scores.isSolved(mObject.ordinal(), level-1) ? R.drawable.ui_solved : R.drawable.ui_notsolved;
523
      button.setCompoundDrawablesWithIntrinsicBounds(icon,0,0,0);
524
      }
525
    }
526
527 255492a0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
528 7b7d65ce Leszek Koltunski
529 0254cfd7 Leszek Koltunski
  private void adjustLevels(final RubikActivity act)
530 7b7d65ce Leszek Koltunski
    {
531 8ab435b9 Leszek Koltunski
    int dbLevel = getDBLevel(mObject);
532 88bad160 Leszek Koltunski
    int numScrambles = mObject.getNumScramble();
533 0a7aa15b Leszek Koltunski
    int numLevel = Math.min(dbLevel, LEVELS_SHOWN);
534 00af5060 Leszek Koltunski
    String[] levels = new String[numLevel];
535 7b7d65ce Leszek Koltunski
536 00af5060 Leszek Koltunski
    for(int i=0; i<numLevel-1; i++)
537 53f23b64 Leszek Koltunski
      {
538 7b7d65ce Leszek Koltunski
      levels[i] = act.getString(R.string.lv_placeholder,i+1);
539 53f23b64 Leszek Koltunski
      }
540
541 4fc7b1e6 Leszek Koltunski
    if( numLevel>0 )
542
      {
543
      levels[numLevel-1] = act.getString(R.string.level_full);
544
      }
545 00af5060 Leszek Koltunski
546 0a7aa15b Leszek Koltunski
    if( mLevelValue>dbLevel || mLevelValue<1 ||
547
       (mLevelValue<dbLevel || mLevelValue>LEVELS_SHOWN ) )
548 00af5060 Leszek Koltunski
      {
549
      mLevelValue=1;
550
      }
551 0254cfd7 Leszek Koltunski
552 de62316a Leszek Koltunski
    float width  = act.getScreenWidthInPixels();
553
    int margin   = (int)(width*RubikActivity.MARGIN);
554
    int padding  = (int)(width*RubikActivity.PADDING);
555
    int butWidth = mPlayLayoutWidth - 2*padding;
556
    int butHeight= (int)mMenuItemSize;
557
    int lastButH = (int)(mMenuItemSize*LAST_BUTTON) ;
558 0254cfd7 Leszek Koltunski
559 de62316a Leszek Koltunski
    LinearLayout.LayoutParams pM = new LinearLayout.LayoutParams( butWidth, butHeight );
560 0254cfd7 Leszek Koltunski
    pM.setMargins(margin, 0, margin, margin);
561 de62316a Leszek Koltunski
    LinearLayout.LayoutParams pT = new LinearLayout.LayoutParams( butWidth, butHeight );
562 0254cfd7 Leszek Koltunski
    pT.setMargins(margin, margin, margin, margin);
563 de62316a Leszek Koltunski
    LinearLayout.LayoutParams pB = new LinearLayout.LayoutParams( butWidth, lastButH  );
564 0254cfd7 Leszek Koltunski
    pB.setMargins(margin, margin, margin, 2*margin);
565
566
    mPlayLayout.removeAllViews();
567
568 d7e539d0 Leszek Koltunski
    RubikScores scores = RubikScores.getInstance();
569
570 00af5060 Leszek Koltunski
    for(int i=0; i<numLevel; i++)
571 011fcfe0 Leszek Koltunski
      {
572 0a7aa15b Leszek Koltunski
      final int level     = i<numLevel-1 ? i+1 : dbLevel;
573
      final int scrambles = i<numLevel-1 ? i+1 : numScrambles;
574 0254cfd7 Leszek Koltunski
      Button button = new Button(act);
575 00af5060 Leszek Koltunski
      button.setLayoutParams(i==0 ? pT : (i==numLevel-1 ? pB : pM));
576 0254cfd7 Leszek Koltunski
      button.setText(levels[i]);
577
      button.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
578
579 8ab435b9 Leszek Koltunski
      int icon = scores.isSolved(mObject.ordinal(), level-1) ? R.drawable.ui_solved : R.drawable.ui_notsolved;
580 d7e539d0 Leszek Koltunski
      button.setCompoundDrawablesWithIntrinsicBounds(icon,0,0,0);
581
582 0254cfd7 Leszek Koltunski
      button.setOnClickListener( new View.OnClickListener()
583 011fcfe0 Leszek Koltunski
        {
584 0254cfd7 Leszek Koltunski
        @Override
585
        public void onClick(View v)
586
          {
587 2afc6754 Leszek Koltunski
          ObjectControl control = act.getControl();
588 6fad862b Leszek Koltunski
589 2afc6754 Leszek Koltunski
          if(control.isUINotBlocked())
590 6fad862b Leszek Koltunski
            {
591 598de3ee Leszek Koltunski
            if( mPlayPopup!=null ) mPlayPopup.dismiss();
592 0a7aa15b Leszek Koltunski
            mLevelValue = level;
593 2afc6754 Leszek Koltunski
            control.scrambleObject(scrambles);
594 6fad862b Leszek Koltunski
            }
595 0254cfd7 Leszek Koltunski
          }
596
        });
597 011fcfe0 Leszek Koltunski
598 0254cfd7 Leszek Koltunski
      mPlayLayout.addView(button);
599
      }
600 53f23b64 Leszek Koltunski
    }
601
602 8ab435b9 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
603
// historically older versions of the app had lower 'maxScrambles' in case of several objects and
604
// those got remembered in the server-side DB already, so we need to keep using them. This function
605
// provides a map between 'maxScramble' of an object and its 'dbLevel'. All new objects will have
606
// those two values the same.
607
608
  public static int getDBLevel(ObjectType object)
609
    {
610
    switch(object)
611
      {
612
      case CUBE_3: return 16;
613
      case CUBE_4: return 20;
614
      case CUBE_5: return 24;
615 3f287c05 Leszek Koltunski
      case PYRA_4: return 15;
616 8ab435b9 Leszek Koltunski
      case PYRA_5: return 20;
617
      case MEGA_5: return 35;
618
      case DIAM_2: return 10;
619
      case DIAM_3: return 18;
620
      case REDI_3: return 14;
621
      case HELI_3: return 18;
622
      case SKEW_3: return 17;
623
      case REX_3 : return 16;
624
      case MIRR_3: return 16;
625 88bad160 Leszek Koltunski
      default    : return object.getNumScramble();
626 8ab435b9 Leszek Koltunski
      }
627
    }
628
629 211b48f2 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
630
631 dca3888a Leszek Koltunski
  public int getLevel()
632 211b48f2 Leszek Koltunski
    {
633 85b09df4 Leszek Koltunski
    return mLevelValue;
634 211b48f2 Leszek Koltunski
    }
635
636
///////////////////////////////////////////////////////////////////////////////////////////////////
637
638 8ab435b9 Leszek Koltunski
  public ObjectType getObject()
639 211b48f2 Leszek Koltunski
    {
640 4888e97c Leszek Koltunski
    return mObject;
641 211b48f2 Leszek Koltunski
    }
642
  }