Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedScreen.java @ 4bd09fe2

1 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2 da56b12f Leszek Koltunski
// Copyright 2022 Leszek Koltunski                                                               //
3 9530f6b0 Leszek Koltunski
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6 44fec653 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 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
9
10
package org.distorted.bandaged;
11
12 b9d062cf Leszek Koltunski
import java.lang.ref.WeakReference;
13 d3d639b1 Leszek Koltunski
import java.util.ArrayList;
14
15 f404152d Leszek Koltunski
import android.annotation.SuppressLint;
16 20b60ad9 Leszek Koltunski
import android.app.Activity;
17 b9d062cf Leszek Koltunski
import android.content.SharedPreferences;
18 7cb8d4b0 Leszek Koltunski
import android.graphics.Bitmap;
19 39176a1f Leszek Koltunski
import android.util.TypedValue;
20 9530f6b0 Leszek Koltunski
import android.view.View;
21 b9d062cf Leszek Koltunski
import android.view.ViewGroup;
22
import android.widget.AdapterView;
23
import android.widget.ArrayAdapter;
24 7cb8d4b0 Leszek Koltunski
import android.widget.ImageView;
25 9530f6b0 Leszek Koltunski
import android.widget.LinearLayout;
26 b9d062cf Leszek Koltunski
import android.widget.Spinner;
27 39176a1f Leszek Koltunski
import android.widget.TextView;
28 9530f6b0 Leszek Koltunski
29 a41e3c94 Leszek Koltunski
import org.distorted.external.RubikFiles;
30 9530f6b0 Leszek Koltunski
import org.distorted.helpers.TransparentImageButton;
31
import org.distorted.main.R;
32 7da27d2b leszek
import org.distorted.objectlib.bandaged.LocallyBandagedList;
33 ca280c3f Leszek Koltunski
34 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 7ee8337b leszek
public class BandagedScreen implements AdapterView.OnItemSelectedListener
37 9530f6b0 Leszek Koltunski
{
38 7ee8337b leszek
  private WeakReference<BandagedActivity> mAct;
39 9530f6b0 Leszek Koltunski
  private TransparentImageButton mBackButton, mResetButton, mDoneButton;
40 e48ad1af Leszek Koltunski
  private LinearLayout mObjectView;
41 b9d062cf Leszek Koltunski
  private int mNumObjects, mX, mY, mZ;
42 7ee8337b leszek
  private final ArrayList<BandagedObjectView> mViews;
43 b9d062cf Leszek Koltunski
  private Spinner mSpinnerX, mSpinnerY, mSpinnerZ;
44
  private boolean mSpinnersReady;
45 39176a1f Leszek Koltunski
  private float mTextSize;
46 7da27d2b leszek
  private final int mOrdinal;
47
  private final int mDimension;
48
  private final int mMaxSupported;
49 b3786da4 leszek
  private final int mMinSupported;
50 9530f6b0 Leszek Koltunski
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52
53 7ee8337b leszek
  public BandagedScreen(int ordinal)
54 9530f6b0 Leszek Koltunski
    {
55 7da27d2b leszek
    mOrdinal      = ordinal;
56 b3786da4 leszek
    mMinSupported = LocallyBandagedList.getMinSupported(ordinal);
57 7da27d2b leszek
    mMaxSupported = LocallyBandagedList.getMaxSupported(ordinal);
58
    mDimension    = LocallyBandagedList.getDimension(ordinal);
59
    mSpinnersReady= false;
60 e48ad1af Leszek Koltunski
    mNumObjects = 0;
61 d3d639b1 Leszek Koltunski
    mViews = new ArrayList<>();
62 9530f6b0 Leszek Koltunski
    }
63
64
///////////////////////////////////////////////////////////////////////////////////////////////////
65
66 7ee8337b leszek
  private void setupBackButton(final BandagedActivity act)
67 9530f6b0 Leszek Koltunski
    {
68
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
69 70688a23 leszek
    mBackButton = new TransparentImageButton(act,R.drawable.ui_smallback,params);
70 9530f6b0 Leszek Koltunski
71
    mBackButton.setOnClickListener( new View.OnClickListener()
72
      {
73
      @Override
74
      public void onClick(View v)
75
        {
76
        act.finish();
77
        }
78
      });
79
    }
80
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83 7ee8337b leszek
  private void setupDoneButton(final BandagedActivity act)
84 9530f6b0 Leszek Koltunski
    {
85
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
86 70688a23 leszek
    mDoneButton = new TransparentImageButton(act,R.drawable.ui_done,params);
87 9530f6b0 Leszek Koltunski
88
    mDoneButton.setOnClickListener( new View.OnClickListener()
89
      {
90
      @Override
91
      public void onClick(View v)
92
        {
93 7ee8337b leszek
        BandagedRenderer renderer = act.getRenderer();
94 72e386ef Leszek Koltunski
        if( !renderer.isBusy() ) renderer.displaySavingDialog();
95 9530f6b0 Leszek Koltunski
        }
96
      });
97
    }
98
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100
101 7ee8337b leszek
  private void setupResetButton(final BandagedActivity act)
102 9530f6b0 Leszek Koltunski
    {
103
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
104 70688a23 leszek
    mResetButton = new TransparentImageButton(act,R.drawable.ui_reset,params);
105 9530f6b0 Leszek Koltunski
106
    mResetButton.setOnClickListener( new View.OnClickListener()
107
      {
108
      @Override
109
      public void onClick(View v)
110
        {
111 7ee8337b leszek
        BandagedRenderer renderer = act.getRenderer();
112 e0b71e6e Leszek Koltunski
        if( !renderer.isBusy() ) renderer.setupReset();
113 9530f6b0 Leszek Koltunski
        }
114
      });
115
    }
116
117 b9d062cf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
118
119
  private String[] createSizes(String mark)
120
    {
121 b3786da4 leszek
    int num = mMaxSupported-mMinSupported+1;
122
    String[] ret = new String[num];
123 b9d062cf Leszek Koltunski
124 b3786da4 leszek
    for(int i=1; i<=num; i++)
125 b9d062cf Leszek Koltunski
      {
126 b3786da4 leszek
      ret[i-1] = mark+" : "+(mMinSupported+i-1);
127 b9d062cf Leszek Koltunski
      }
128
129
    return ret;
130
    }
131
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133
134
  private void changeObject()
135
    {
136
    if( mSpinnersReady )
137
      {
138 7ee8337b leszek
      BandagedActivity act = mAct.get();
139 b3786da4 leszek
      if( act!=null ) act.changeObject(mX+mMinSupported,mY+mMinSupported,mZ+mMinSupported);
140 b9d062cf Leszek Koltunski
      }
141
    }
142
143 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
144
145 7ee8337b leszek
  void onAttachedToWindow(final BandagedActivity act)
146 9530f6b0 Leszek Koltunski
    {
147 b9d062cf Leszek Koltunski
    mAct = new WeakReference<>(act);
148 e48ad1af Leszek Koltunski
    mObjectView = act.findViewById(R.id.bandagedCreatorView);
149 7ee8337b leszek
    mTextSize = act.getScreenHeightInPixels()*BandagedActivity.SPINNER_TEXT_SIZE;
150 e48ad1af Leszek Koltunski
151 b9d062cf Leszek Koltunski
    int width  = act.getScreenWidthInPixels();
152
    int height = act.getScreenHeightInPixels();
153 7bb30586 leszek
    int padding= (int)(height*BandagedActivity.PADDING/3);
154 9530f6b0 Leszek Koltunski
155
    LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
156
    LinearLayout.LayoutParams paramsM = new LinearLayout.LayoutParams(width/2, LinearLayout.LayoutParams.MATCH_PARENT);
157
    LinearLayout.LayoutParams paramsR = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
158
159
    LinearLayout layoutLeft = new LinearLayout(act);
160
    layoutLeft.setLayoutParams(paramsL);
161
    LinearLayout layoutMid  = new LinearLayout(act);
162
    layoutMid.setLayoutParams(paramsM);
163
    LinearLayout layoutRight= new LinearLayout(act);
164
    layoutRight.setLayoutParams(paramsR);
165
166
    setupBackButton(act);
167
    layoutRight.addView(mBackButton);
168
    setupDoneButton(act);
169
    layoutMid.addView(mDoneButton);
170
    setupResetButton(act);
171
    layoutLeft.addView(mResetButton);
172
173
    LinearLayout layout = act.findViewById(R.id.lowerBar);
174
    layout.removeAllViews();
175
    layout.addView(layoutLeft);
176
    layout.addView(layoutMid);
177
    layout.addView(layoutRight);
178 b9d062cf Leszek Koltunski
179
    mSpinnerX = act.findViewById(R.id.bandagedCreatorX);
180
    mSpinnerY = act.findViewById(R.id.bandagedCreatorY);
181
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
182 7da27d2b leszek
183
    if( mDimension>=1 )
184
      {
185
      mSpinnerX.setOnItemSelectedListener(this);
186
      ArrayAdapter<String> adX=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("X"));
187
      mSpinnerX.setAdapter(adX);
188
      ViewGroup.MarginLayoutParams paramsX=(ViewGroup.MarginLayoutParams) mSpinnerX.getLayoutParams();
189
      paramsX.setMargins(0, 0, 2*padding, 0);
190
      }
191
    else
192
      {
193
      mSpinnerX.setVisibility(View.INVISIBLE);
194
      }
195
196
    if( mDimension>=2 )
197
      {
198
      mSpinnerY.setOnItemSelectedListener(this);
199
      ArrayAdapter<String> adY=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Y"));
200
      mSpinnerY.setAdapter(adY);
201
      ViewGroup.MarginLayoutParams paramsY=(ViewGroup.MarginLayoutParams) mSpinnerY.getLayoutParams();
202
      paramsY.setMargins(padding, 0, padding, 0);
203
      }
204
    else
205
      {
206
      mSpinnerY.setVisibility(View.INVISIBLE);
207
      }
208
209
    if( mDimension>=3 )
210
      {
211
      mSpinnerZ.setOnItemSelectedListener(this);
212
      ArrayAdapter<String> adZ=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z"));
213
      mSpinnerZ.setAdapter(adZ);
214
      ViewGroup.MarginLayoutParams paramsZ=(ViewGroup.MarginLayoutParams) mSpinnerZ.getLayoutParams();
215
      paramsZ.setMargins(2*padding, 0, 0, 0);
216
      }
217
    else
218
      {
219
      mSpinnerZ.setVisibility(View.INVISIBLE);
220
      }
221 9530f6b0 Leszek Koltunski
    }
222 e48ad1af Leszek Koltunski
223 a41e3c94 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
224
225
  boolean objectDoesntExist(String name)
226
    {
227 7ee8337b leszek
    for( BandagedObjectView view : mViews )
228 a41e3c94 Leszek Koltunski
      {
229
      String viewName = view.getName();
230
      if( viewName.equals(name) ) return false;
231
      }
232
233
    return true;
234
    }
235
236
///////////////////////////////////////////////////////////////////////////////////////////////////
237
238 7ee8337b leszek
  private void addObjects(BandagedActivity act, String objectString)
239 a41e3c94 Leszek Koltunski
    {
240
    if( objectString.length()>0 )
241
      {
242
      String[] objects = objectString.split(" ");
243
      RubikFiles files = RubikFiles.getInstance();
244
245
      for(String object : objects)
246
        {
247
        if( objectDoesntExist(object) )
248
          {
249
          addObject(act, object);
250
          Bitmap bmp = files.getIcon(act, object + ".png");
251
          iconCreationDone(act, bmp);
252
          }
253
        }
254
      }
255
    }
256
257 e48ad1af Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
258
259 7ee8337b leszek
  void addObject(BandagedActivity act, String name)
260 e48ad1af Leszek Koltunski
    {
261 7ee8337b leszek
    BandagedObjectView view = new BandagedObjectView(act,name,mNumObjects==0);
262 e48ad1af Leszek Koltunski
    LinearLayout pane = view.getPane();
263
    mObjectView.addView(pane);
264
    mNumObjects++;
265 d3d639b1 Leszek Koltunski
    mViews.add(view);
266
    }
267
268
///////////////////////////////////////////////////////////////////////////////////////////////////
269
270 7ee8337b leszek
  void deleteObject(BandagedActivity act, String name)
271 d3d639b1 Leszek Koltunski
    {
272
    for(int v=0; v<mNumObjects; v++)
273
      {
274 7ee8337b leszek
      BandagedObjectView view = mViews.get(v);
275 66cbab36 Leszek Koltunski
      String viewName = view.getName();
276 d3d639b1 Leszek Koltunski
277 66cbab36 Leszek Koltunski
      if( viewName.equals(name) )
278 d3d639b1 Leszek Koltunski
        {
279
        LinearLayout pane = view.getPane();
280
        mObjectView.removeView(pane);
281
        mViews.remove(view);
282
        mNumObjects--;
283
284
        if( v==0 && mNumObjects>0 )
285
          {
286 7ee8337b leszek
          BandagedObjectView v2 = mViews.get(v);
287 d3d639b1 Leszek Koltunski
          LinearLayout p2 = v2.getPane();
288 35e32f0c Leszek Koltunski
          int height = act.getScreenHeightInPixels();
289 7ee8337b leszek
          LinearLayout.LayoutParams params = BandagedObjectView.createPaneParams(height,true,act.isRTL());
290 d3d639b1 Leszek Koltunski
          p2.setLayoutParams(params);
291
          }
292
293
        break;
294
        }
295
      }
296 e48ad1af Leszek Koltunski
    }
297 7cb8d4b0 Leszek Koltunski
298
///////////////////////////////////////////////////////////////////////////////////////////////////
299
300 20b60ad9 Leszek Koltunski
  void iconCreationDone(Activity act, Bitmap bmp)
301 7cb8d4b0 Leszek Koltunski
    {
302
    int numChildren = mObjectView.getChildCount();
303
304 83e021c5 Leszek Koltunski
    if( numChildren>0 )
305 7cb8d4b0 Leszek Koltunski
      {
306 83e021c5 Leszek Koltunski
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
307
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
308
309
      if( view!=null )
310 20b60ad9 Leszek Koltunski
        {
311 83e021c5 Leszek Koltunski
        act.runOnUiThread(new Runnable()
312
          {
313
          @Override
314
          public void run()
315 20b60ad9 Leszek Koltunski
          {
316
          view.setImageBitmap(bmp);
317
          }
318 83e021c5 Leszek Koltunski
          });
319
        }
320
      else
321
        {
322
        android.util.Log.e("D", "ImageView not found!");
323
        }
324 7cb8d4b0 Leszek Koltunski
      }
325
    }
326 a41e3c94 Leszek Koltunski
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328
329 b9d062cf Leszek Koltunski
  private String generateObjectStrings()
330 a41e3c94 Leszek Koltunski
    {
331 576afdf9 Leszek Koltunski
    StringBuilder result = new StringBuilder();
332 a41e3c94 Leszek Koltunski
    int numViews = mViews.size();
333
334
    for( int v=0; v<numViews; v++ )
335
      {
336 7ee8337b leszek
      BandagedObjectView view = mViews.get(v);
337 a41e3c94 Leszek Koltunski
      String name = view.getName();
338 576afdf9 Leszek Koltunski
      if( v>0 ) result.append(' ');
339
      result.append(name);
340 a41e3c94 Leszek Koltunski
      }
341
342 576afdf9 Leszek Koltunski
    return result.toString();
343 a41e3c94 Leszek Koltunski
    }
344 b9d062cf Leszek Koltunski
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346
347 f404152d Leszek Koltunski
    @SuppressLint("SuspiciousIndentation")
348 b9d062cf Leszek Koltunski
    @Override
349
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
350
      {
351
      int spinnerID = parent.getId();
352
353 9685735b Leszek Koltunski
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
354 39176a1f Leszek Koltunski
355 576afdf9 Leszek Koltunski
           if( spinnerID==R.id.bandagedCreatorX ) mX = pos;
356
      else if( spinnerID==R.id.bandagedCreatorY ) mY = pos;
357
      else if( spinnerID==R.id.bandagedCreatorZ ) mZ = pos;
358 b9d062cf Leszek Koltunski
359
      changeObject();
360
      }
361
362
///////////////////////////////////////////////////////////////////////////////////////////////////
363
364
    @Override
365
    public void onNothingSelected(AdapterView<?> parent) { }
366
367 7da27d2b leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
368
369
    private String generateObjectKey()
370
      {
371
      return mOrdinal==0 ? "bandagedObjects" : "bandagedObjects"+mOrdinal;
372
      }
373
374 b9d062cf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
375
376
    public void savePreferences(SharedPreferences.Editor editor)
377
      {
378
      String objects = generateObjectStrings();
379 7da27d2b leszek
      editor.putString(generateObjectKey(), objects );
380 b9d062cf Leszek Koltunski
381 7da27d2b leszek
      editor.putInt("bandagedX"+mOrdinal, mX);
382
      editor.putInt("bandagedY"+mOrdinal, mY);
383
      editor.putInt("bandagedZ"+mOrdinal, mZ);
384 b9d062cf Leszek Koltunski
      }
385
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387
388 7ee8337b leszek
    public void restorePreferences(BandagedActivity act, SharedPreferences preferences)
389 b9d062cf Leszek Koltunski
      {
390 7da27d2b leszek
      String objects = preferences.getString(generateObjectKey(),"");
391 b9d062cf Leszek Koltunski
      addObjects(act,objects);
392
393 7da27d2b leszek
      mX = preferences.getInt("bandagedX"+mOrdinal, 2);
394
      mY = preferences.getInt("bandagedY"+mOrdinal, 2);
395
      mZ = preferences.getInt("bandagedZ"+mOrdinal, 2);
396 b9d062cf Leszek Koltunski
397 b3786da4 leszek
      int max = mMaxSupported-mMinSupported+1;
398
399 cd2d88fb leszek
      if( mX>=max ) mX = 0;//max-1;
400
      if( mY>=max ) mY = 0;//max-1;
401
      if( mZ>=max ) mZ = 0;//max-1;
402 b3786da4 leszek
403 b9d062cf Leszek Koltunski
      mSpinnerX.setSelection(mX);
404
      mSpinnerY.setSelection(mY);
405
      mSpinnerZ.setSelection(mZ);
406
407
      mSpinnersReady = true;
408
      changeObject();
409
      }
410 9530f6b0 Leszek Koltunski
}