Project

General

Profile

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

magiccube / src / main / java / org / distorted / config / ConfigScreen.java @ 7bb30586

1 1237d25d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 9d51b9d6 Leszek Koltunski
// 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 1237d25d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.config;
11
12 97a4ae23 Leszek Koltunski
import android.os.Build;
13
import android.util.TypedValue;
14
import android.view.Gravity;
15 1237d25d Leszek Koltunski
import android.view.View;
16 97a4ae23 Leszek Koltunski
import android.widget.GridLayout;
17 302c76a0 Leszek Koltunski
import android.widget.ImageButton;
18 1237d25d Leszek Koltunski
import android.widget.LinearLayout;
19 97a4ae23 Leszek Koltunski
import android.widget.PopupWindow;
20
import android.widget.ScrollView;
21
import android.widget.TextView;
22
23 432a5f2c Leszek Koltunski
import org.distorted.helpers.PopupCreator;
24 1237d25d Leszek Koltunski
25
import org.distorted.helpers.TransparentImageButton;
26 7bb30586 leszek
import org.distorted.main.MainActivity;
27 1237d25d Leszek Koltunski
import org.distorted.main.R;
28 302c76a0 Leszek Koltunski
import org.distorted.objects.RubikObject;
29 a7d8c3cd Leszek Koltunski
import org.distorted.objects.RubikObjectList;
30 97a4ae23 Leszek Koltunski
31
import static android.view.View.inflate;
32 1237d25d Leszek Koltunski
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34
35
public class ConfigScreen
36
{
37 27401bea Leszek Koltunski
  private static final float TEXT_SIZE = 0.0310f;
38
  private static final float PADDING   = 0.0060f;
39
  private static final float MARGIN    = 0.0024f;
40 6e3fcb91 Leszek Koltunski
  private static final int NUM_COLUMNS = 5;
41 97a4ae23 Leszek Koltunski
  private static final int[] mLocation = new int[2];
42 7bb30586 leszek
  private static final float POPUP_PADDING = 0.028f;
43
  private static final float POPUP_MARGIN  = 0.016f;
44 97a4ae23 Leszek Koltunski
45
  private TransparentImageButton mBackButton, mObjectButton, mPrevButton, mNextButton;
46
  private TextView mMovesText;
47
  private PopupWindow mObjectPopup;
48 74d088c3 Leszek Koltunski
  private ConfigScreenPane mPane;
49 97a4ae23 Leszek Koltunski
  private int mObjectOrdinal;
50
  private int mColCount, mRowCount, mMaxRowCount;
51
  private int mObjectSize;
52
  private int mBarHeight;
53
  private float mButtonSize;
54
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56
57
  private void setupObjectWindow(final ConfigActivity act, final float width, final float height)
58
    {
59 432a5f2c Leszek Koltunski
    int numObjects= RubikObjectList.getNumObjects();
60
    mRowCount = (numObjects + NUM_COLUMNS-1) / NUM_COLUMNS;
61
    mColCount = NUM_COLUMNS;
62
63 27401bea Leszek Koltunski
    int cubeSize  = (int)( (Math.min(width,(int)(height*0.7f))) / 9 );
64 7bb30586 leszek
    int margin    = (int)(height*POPUP_MARGIN);
65
    int padding   = (int)(height*POPUP_PADDING);
66 432a5f2c Leszek Koltunski
    mObjectSize   = (int)(cubeSize + 2*margin + 0.5f);
67
    mMaxRowCount  = (int)((height-mBarHeight)/mObjectSize);
68 97a4ae23 Leszek Koltunski
69
    ScrollView view = (ScrollView)inflate( act, R.layout.popup_object_simple, null);
70
    GridLayout objectGrid = view.findViewById(R.id.objectGrid);
71
72 a88b947f Leszek Koltunski
    PopupCreator.createObjectGrid(objectGrid,act,mRowCount,mColCount,numObjects,margin,cubeSize,padding);
73 a7d8c3cd Leszek Koltunski
74 432a5f2c Leszek Koltunski
    for(int child=0; child<numObjects; child++)
75 97a4ae23 Leszek Koltunski
      {
76 302c76a0 Leszek Koltunski
      final RubikObject obj = RubikObjectList.getObject(child);
77
      View v = objectGrid.getChildAt(child);
78
      ImageButton button = PopupCreator.getButton(obj,v);
79 432a5f2c Leszek Koltunski
      final int ordinal = child;
80 314e9ff0 Leszek Koltunski
81 97a4ae23 Leszek Koltunski
      button.setOnClickListener( new View.OnClickListener()
82
        {
83
        @Override
84
        public void onClick(View v)
85
          {
86 919b830e Leszek Koltunski
          if( mObjectOrdinal!=ordinal )
87 97a4ae23 Leszek Koltunski
            {
88
            mObjectOrdinal = ordinal;
89 280dc794 Leszek Koltunski
            act.changeObject(mObjectOrdinal);
90 a7d8c3cd Leszek Koltunski
            mMovesText.setText(act.getString(R.string.mo_placeholder,mObjectOrdinal+1,numObjects));
91 74d088c3 Leszek Koltunski
            mPane.updatePane(act,mObjectOrdinal);
92 97a4ae23 Leszek Koltunski
            }
93
94
          mObjectPopup.dismiss();
95
          }
96
        });
97
      }
98 432a5f2c Leszek Koltunski
99
    mObjectPopup = new PopupWindow(act);
100
    mObjectPopup.setFocusable(true);
101
    mObjectPopup.setContentView(view);
102 97a4ae23 Leszek Koltunski
    }
103 1237d25d Leszek Koltunski
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106
  private void setupBackButton(final ConfigActivity act)
107
    {
108 97a4ae23 Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
109 70688a23 leszek
    mBackButton = new TransparentImageButton(act,R.drawable.ui_smallback,params);
110 1237d25d Leszek Koltunski
111
    mBackButton.setOnClickListener( new View.OnClickListener()
112
      {
113
      @Override
114
      public void onClick(View v)
115
        {
116
        act.finish();
117
        }
118
      });
119
    }
120
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122
123 27401bea Leszek Koltunski
  private void setupObjectButton(final ConfigActivity act, final int width, final int height)
124 1237d25d Leszek Koltunski
    {
125 27401bea Leszek Koltunski
    final int margin= (int)(height*MARGIN);
126 97a4ae23 Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
127 70688a23 leszek
    mObjectButton = new TransparentImageButton(act,R.drawable.ui_cube_menu,params);
128 97a4ae23 Leszek Koltunski
129
    mObjectButton.setOnClickListener( new View.OnClickListener()
130
      {
131
      @Override
132
      public void onClick(View view)
133
        {
134
        if( mObjectPopup==null )
135
          {
136
          setupObjectWindow(act,width,height);
137
          }
138
139 919b830e Leszek Koltunski
        int rowCount = Math.min(mMaxRowCount,mRowCount);
140
        View popupView = mObjectPopup.getContentView();
141 7bb30586 leszek
        popupView.setSystemUiVisibility(MainActivity.FLAGS);
142 919b830e Leszek Koltunski
        displayPopup(act,view,mObjectPopup,mObjectSize*mColCount,mObjectSize*rowCount+5*margin,margin,margin);
143 97a4ae23 Leszek Koltunski
        }
144
      });
145
    }
146
147
///////////////////////////////////////////////////////////////////////////////////////////////////
148
// work around lame bugs in Android's version <= 10 pop-up and split-screen modes
149
150
  private void displayPopup(ConfigActivity act, View view, PopupWindow window, int w, int h, int xoff, int yoff)
151
    {
152
    View topLayout = act.findViewById(R.id.mainLayout);
153
    boolean isFullScreen;
154
155
    if( topLayout!=null )
156
      {
157
      topLayout.getLocationOnScreen(mLocation);
158
      isFullScreen = (mLocation[1]==0);
159
      }
160
    else
161
      {
162
      isFullScreen = true;
163
      }
164
165
    try
166
      {
167
      // if on Android 11 or we are fullscreen
168
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R || isFullScreen )
169
        {
170
        window.showAsDropDown(view, xoff, yoff, Gravity.CENTER);
171
        window.update(view, w, h);
172
        }
173
      else  // Android 10 or below in pop-up mode or split-screen mode
174
        {
175
        view.getLocationOnScreen(mLocation);
176
        int width  = view.getWidth();
177
        int height = view.getHeight();
178
        int x = mLocation[0]+(width-w)/2;
179
        int y = mLocation[1]+height+yoff;
180
181
        window.showAsDropDown(view);
182
        window.update(x,y,w,h);
183
        }
184
      }
185
    catch( IllegalArgumentException iae )
186
      {
187
      // ignore, this means window is 'not attached to window manager' -
188
      // which most probably is because we are already exiting the app.
189
      }
190 1237d25d Leszek Koltunski
    }
191
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193
194 a7d8c3cd Leszek Koltunski
  private void prevObject(ConfigActivity act, int numObjects)
195 1237d25d Leszek Koltunski
    {
196 97a4ae23 Leszek Koltunski
    mObjectOrdinal--;
197 a7d8c3cd Leszek Koltunski
    if( mObjectOrdinal<0 ) mObjectOrdinal=numObjects-1;
198 97a4ae23 Leszek Koltunski
199 280dc794 Leszek Koltunski
    act.changeObject(mObjectOrdinal);
200 74d088c3 Leszek Koltunski
    mPane.updatePane(act,mObjectOrdinal);
201 97a4ae23 Leszek Koltunski
    }
202
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
205 a7d8c3cd Leszek Koltunski
  private void nextObject(ConfigActivity act, int numObjects)
206 97a4ae23 Leszek Koltunski
    {
207
    mObjectOrdinal++;
208 a7d8c3cd Leszek Koltunski
    if( mObjectOrdinal>=numObjects ) mObjectOrdinal=0;
209 97a4ae23 Leszek Koltunski
210 280dc794 Leszek Koltunski
    act.changeObject(mObjectOrdinal);
211 74d088c3 Leszek Koltunski
    mPane.updatePane(act,mObjectOrdinal);
212 97a4ae23 Leszek Koltunski
    }
213
214
///////////////////////////////////////////////////////////////////////////////////////////////////
215
216
  private void setupPrevButton(final ConfigActivity act)
217
    {
218
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
219 70688a23 leszek
    mPrevButton = new TransparentImageButton(act,R.drawable.ui_left,params);
220 97a4ae23 Leszek Koltunski
221
    mPrevButton.setOnClickListener( new View.OnClickListener()
222
      {
223
      @Override
224
      public void onClick(View v)
225
        {
226 a7d8c3cd Leszek Koltunski
        int numObjects = RubikObjectList.getNumObjects();
227
        prevObject(act,numObjects);
228
        mMovesText.setText(act.getString(R.string.mo_placeholder,mObjectOrdinal+1,numObjects));
229 97a4ae23 Leszek Koltunski
        }
230
      });
231
    }
232
233
///////////////////////////////////////////////////////////////////////////////////////////////////
234
235
  private void setupNextButton(final ConfigActivity act)
236
    {
237
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
238 70688a23 leszek
    mNextButton = new TransparentImageButton(act,R.drawable.ui_right,params);
239 97a4ae23 Leszek Koltunski
240
    mNextButton.setOnClickListener( new View.OnClickListener()
241
      {
242
      @Override
243
      public void onClick(View v)
244
        {
245 a7d8c3cd Leszek Koltunski
        int numObjects = RubikObjectList.getNumObjects();
246
        nextObject(act,numObjects);
247
        mMovesText.setText(act.getString(R.string.mo_placeholder,mObjectOrdinal+1,numObjects));
248 97a4ae23 Leszek Koltunski
        }
249
      });
250
    }
251
252
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254 27401bea Leszek Koltunski
  private void setupTextView(final ConfigActivity act, final float height, int numObjects)
255 97a4ae23 Leszek Koltunski
    {
256 27401bea Leszek Koltunski
    int padding = (int)(height*PADDING);
257
    int margin  = (int)(height*MARGIN);
258 97a4ae23 Leszek Koltunski
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT,2.0f);
259
    params.topMargin    = margin;
260
    params.bottomMargin = margin;
261
    params.leftMargin   = margin;
262
    params.rightMargin  = margin;
263
264
    mMovesText = new TextView(act);
265
    mMovesText.setTextSize(20);
266
    mMovesText.setLayoutParams(params);
267
    mMovesText.setPadding(padding,0,padding,0);
268
    mMovesText.setGravity(Gravity.CENTER);
269
    mMovesText.setTextSize(TypedValue.COMPLEX_UNIT_PX, mButtonSize);
270 a7d8c3cd Leszek Koltunski
    mMovesText.setText(act.getString(R.string.mo_placeholder,mObjectOrdinal+1,numObjects));
271 97a4ae23 Leszek Koltunski
    }
272
273 8bf8fe70 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275 74d088c3 Leszek Koltunski
  void onAttachedToWindow(final ConfigActivity act, final int objectOrdinal)
276 97a4ae23 Leszek Koltunski
    {
277 a7d8c3cd Leszek Koltunski
    int numObjects = RubikObjectList.getNumObjects();
278 97a4ae23 Leszek Koltunski
    int width = act.getScreenWidthInPixels();
279 27401bea Leszek Koltunski
    int height= act.getScreenHeightInPixels();
280 97a4ae23 Leszek Koltunski
    mBarHeight = act.getHeightBar();
281 27401bea Leszek Koltunski
    mButtonSize = height*TEXT_SIZE;
282 97a4ae23 Leszek Koltunski
    mObjectOrdinal = objectOrdinal;
283
284 74d088c3 Leszek Koltunski
    LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
285
    LinearLayout.LayoutParams paramsM = new LinearLayout.LayoutParams(width/2, LinearLayout.LayoutParams.MATCH_PARENT);
286
    LinearLayout.LayoutParams paramsR = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
287 97a4ae23 Leszek Koltunski
288
    LinearLayout layoutLeft = new LinearLayout(act);
289
    layoutLeft.setLayoutParams(paramsL);
290
    LinearLayout layoutMid  = new LinearLayout(act);
291
    layoutMid.setLayoutParams(paramsM);
292
    LinearLayout layoutRight= new LinearLayout(act);
293
    layoutRight.setLayoutParams(paramsR);
294
295 27401bea Leszek Koltunski
    setupObjectButton(act,width,height);
296 97a4ae23 Leszek Koltunski
    setupPrevButton(act);
297
    setupNextButton(act);
298 27401bea Leszek Koltunski
    setupTextView(act,height,numObjects);
299 97a4ae23 Leszek Koltunski
    setupBackButton(act);
300
301
    layoutLeft.addView(mObjectButton);
302
    layoutMid.addView(mPrevButton);
303
    layoutMid.addView(mMovesText);
304
    layoutMid.addView(mNextButton);
305
    layoutRight.addView(mBackButton);
306
307
    LinearLayout layout = act.findViewById(R.id.lowerBar);
308
    layout.removeAllViews();
309
    layout.addView(layoutLeft);
310
    layout.addView(layoutMid);
311
    layout.addView(layoutRight);
312 1237d25d Leszek Koltunski
313 74d088c3 Leszek Koltunski
    mPane = new ConfigScreenPane(act,mObjectOrdinal);
314 1237d25d Leszek Koltunski
    }
315
}