Project

General

Profile

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

magiccube / src / main / java / org / distorted / bandaged / BandagedScreen.java @ b6606976

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 7ff3cacb leszek
import org.distorted.helpers.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 e4b7d0f9 leszek
  private TransparentImageButton mBackButton, mResetButton, mUndoButton, 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 e4b7d0f9 leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
100
101
  private void setupUndoButton(final BandagedActivity act)
102
    {
103
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
104
    mUndoButton = new TransparentImageButton(act,R.drawable.ui_left,params);
105
106
    mUndoButton.setOnClickListener( new View.OnClickListener()
107
    {
108
      @Override
109
      public void onClick(View v)
110
        {
111
        BandagedRenderer renderer = act.getRenderer();
112
        if( !renderer.isBusy() ) renderer.setupUndo();
113
        }
114
    });
115
    }
116
117 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
118
119 7ee8337b leszek
  private void setupResetButton(final BandagedActivity act)
120 9530f6b0 Leszek Koltunski
    {
121
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT);
122 70688a23 leszek
    mResetButton = new TransparentImageButton(act,R.drawable.ui_reset,params);
123 9530f6b0 Leszek Koltunski
124
    mResetButton.setOnClickListener( new View.OnClickListener()
125
      {
126
      @Override
127
      public void onClick(View v)
128
        {
129 7ee8337b leszek
        BandagedRenderer renderer = act.getRenderer();
130 e0b71e6e Leszek Koltunski
        if( !renderer.isBusy() ) renderer.setupReset();
131 9530f6b0 Leszek Koltunski
        }
132
      });
133
    }
134
135 b9d062cf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
136
137
  private String[] createSizes(String mark)
138
    {
139 b3786da4 leszek
    int num = mMaxSupported-mMinSupported+1;
140
    String[] ret = new String[num];
141 b9d062cf Leszek Koltunski
142 b3786da4 leszek
    for(int i=1; i<=num; i++)
143 b9d062cf Leszek Koltunski
      {
144 b3786da4 leszek
      ret[i-1] = mark+" : "+(mMinSupported+i-1);
145 b9d062cf Leszek Koltunski
      }
146
147
    return ret;
148
    }
149
150
///////////////////////////////////////////////////////////////////////////////////////////////////
151
152
  private void changeObject()
153
    {
154
    if( mSpinnersReady )
155
      {
156 7ee8337b leszek
      BandagedActivity act = mAct.get();
157 b3786da4 leszek
      if( act!=null ) act.changeObject(mX+mMinSupported,mY+mMinSupported,mZ+mMinSupported);
158 b9d062cf Leszek Koltunski
      }
159
    }
160
161 9530f6b0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
162
163 7ee8337b leszek
  void onAttachedToWindow(final BandagedActivity act)
164 9530f6b0 Leszek Koltunski
    {
165 b9d062cf Leszek Koltunski
    mAct = new WeakReference<>(act);
166 e48ad1af Leszek Koltunski
    mObjectView = act.findViewById(R.id.bandagedCreatorView);
167 7ee8337b leszek
    mTextSize = act.getScreenHeightInPixels()*BandagedActivity.SPINNER_TEXT_SIZE;
168 e48ad1af Leszek Koltunski
169 b9d062cf Leszek Koltunski
    int width  = act.getScreenWidthInPixels();
170
    int height = act.getScreenHeightInPixels();
171 7bb30586 leszek
    int padding= (int)(height*BandagedActivity.PADDING/3);
172 9530f6b0 Leszek Koltunski
173 e4b7d0f9 leszek
    LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
174
    LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
175
    LinearLayout.LayoutParams params3 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
176
    LinearLayout.LayoutParams params4 = new LinearLayout.LayoutParams(width/4, LinearLayout.LayoutParams.MATCH_PARENT);
177 9530f6b0 Leszek Koltunski
178 e4b7d0f9 leszek
    LinearLayout layout1 = new LinearLayout(act);
179
    layout1.setLayoutParams(params1);
180
    LinearLayout layout2 = new LinearLayout(act);
181
    layout2.setLayoutParams(params2);
182
    LinearLayout layout3 = new LinearLayout(act);
183
    layout3.setLayoutParams(params3);
184
    LinearLayout layout4 = new LinearLayout(act);
185
    layout4.setLayoutParams(params4);
186 9530f6b0 Leszek Koltunski
187
    setupBackButton(act);
188 e4b7d0f9 leszek
    layout4.addView(mBackButton);
189 9530f6b0 Leszek Koltunski
    setupDoneButton(act);
190 e4b7d0f9 leszek
    layout3.addView(mDoneButton);
191
    setupUndoButton(act);
192
    layout2.addView(mUndoButton);
193 9530f6b0 Leszek Koltunski
    setupResetButton(act);
194 e4b7d0f9 leszek
    layout1.addView(mResetButton);
195 9530f6b0 Leszek Koltunski
196
    LinearLayout layout = act.findViewById(R.id.lowerBar);
197
    layout.removeAllViews();
198 e4b7d0f9 leszek
    layout.addView(layout1);
199
    layout.addView(layout2);
200
    layout.addView(layout3);
201
    layout.addView(layout4);
202 b9d062cf Leszek Koltunski
203
    mSpinnerX = act.findViewById(R.id.bandagedCreatorX);
204
    mSpinnerY = act.findViewById(R.id.bandagedCreatorY);
205
    mSpinnerZ = act.findViewById(R.id.bandagedCreatorZ);
206 7da27d2b leszek
207
    if( mDimension>=1 )
208
      {
209
      mSpinnerX.setOnItemSelectedListener(this);
210
      ArrayAdapter<String> adX=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("X"));
211
      mSpinnerX.setAdapter(adX);
212
      ViewGroup.MarginLayoutParams paramsX=(ViewGroup.MarginLayoutParams) mSpinnerX.getLayoutParams();
213
      paramsX.setMargins(0, 0, 2*padding, 0);
214
      }
215
    else
216
      {
217
      mSpinnerX.setVisibility(View.INVISIBLE);
218
      }
219
220
    if( mDimension>=2 )
221
      {
222
      mSpinnerY.setOnItemSelectedListener(this);
223
      ArrayAdapter<String> adY=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Y"));
224
      mSpinnerY.setAdapter(adY);
225
      ViewGroup.MarginLayoutParams paramsY=(ViewGroup.MarginLayoutParams) mSpinnerY.getLayoutParams();
226
      paramsY.setMargins(padding, 0, padding, 0);
227
      }
228
    else
229
      {
230
      mSpinnerY.setVisibility(View.INVISIBLE);
231
      }
232
233
    if( mDimension>=3 )
234
      {
235
      mSpinnerZ.setOnItemSelectedListener(this);
236
      ArrayAdapter<String> adZ=new ArrayAdapter<>(act, R.layout.spinner_item, createSizes("Z"));
237
      mSpinnerZ.setAdapter(adZ);
238
      ViewGroup.MarginLayoutParams paramsZ=(ViewGroup.MarginLayoutParams) mSpinnerZ.getLayoutParams();
239
      paramsZ.setMargins(2*padding, 0, 0, 0);
240
      }
241
    else
242
      {
243
      mSpinnerZ.setVisibility(View.INVISIBLE);
244
      }
245 9530f6b0 Leszek Koltunski
    }
246 e48ad1af Leszek Koltunski
247 a41e3c94 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
248
249
  boolean objectDoesntExist(String name)
250
    {
251 7ee8337b leszek
    for( BandagedObjectView view : mViews )
252 a41e3c94 Leszek Koltunski
      {
253
      String viewName = view.getName();
254
      if( viewName.equals(name) ) return false;
255
      }
256
257
    return true;
258
    }
259
260
///////////////////////////////////////////////////////////////////////////////////////////////////
261
262 7ee8337b leszek
  private void addObjects(BandagedActivity act, String objectString)
263 a41e3c94 Leszek Koltunski
    {
264 8477cf44 leszek
    if( !objectString.isEmpty() )
265 a41e3c94 Leszek Koltunski
      {
266
      String[] objects = objectString.split(" ");
267
      RubikFiles files = RubikFiles.getInstance();
268
269
      for(String object : objects)
270
        {
271
        if( objectDoesntExist(object) )
272
          {
273
          addObject(act, object);
274
          Bitmap bmp = files.getIcon(act, object + ".png");
275
          iconCreationDone(act, bmp);
276
          }
277
        }
278
      }
279
    }
280
281 e48ad1af Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
282
283 7ee8337b leszek
  void addObject(BandagedActivity act, String name)
284 e48ad1af Leszek Koltunski
    {
285 7ee8337b leszek
    BandagedObjectView view = new BandagedObjectView(act,name,mNumObjects==0);
286 e48ad1af Leszek Koltunski
    LinearLayout pane = view.getPane();
287
    mObjectView.addView(pane);
288
    mNumObjects++;
289 d3d639b1 Leszek Koltunski
    mViews.add(view);
290
    }
291
292
///////////////////////////////////////////////////////////////////////////////////////////////////
293
294 7ee8337b leszek
  void deleteObject(BandagedActivity act, String name)
295 d3d639b1 Leszek Koltunski
    {
296
    for(int v=0; v<mNumObjects; v++)
297
      {
298 7ee8337b leszek
      BandagedObjectView view = mViews.get(v);
299 66cbab36 Leszek Koltunski
      String viewName = view.getName();
300 d3d639b1 Leszek Koltunski
301 66cbab36 Leszek Koltunski
      if( viewName.equals(name) )
302 d3d639b1 Leszek Koltunski
        {
303
        LinearLayout pane = view.getPane();
304
        mObjectView.removeView(pane);
305
        mViews.remove(view);
306
        mNumObjects--;
307
308
        if( v==0 && mNumObjects>0 )
309
          {
310 7ee8337b leszek
          BandagedObjectView v2 = mViews.get(v);
311 d3d639b1 Leszek Koltunski
          LinearLayout p2 = v2.getPane();
312 35e32f0c Leszek Koltunski
          int height = act.getScreenHeightInPixels();
313 7ee8337b leszek
          LinearLayout.LayoutParams params = BandagedObjectView.createPaneParams(height,true,act.isRTL());
314 d3d639b1 Leszek Koltunski
          p2.setLayoutParams(params);
315
          }
316
317
        break;
318
        }
319
      }
320 e48ad1af Leszek Koltunski
    }
321 7cb8d4b0 Leszek Koltunski
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323
324 20b60ad9 Leszek Koltunski
  void iconCreationDone(Activity act, Bitmap bmp)
325 7cb8d4b0 Leszek Koltunski
    {
326
    int numChildren = mObjectView.getChildCount();
327
328 83e021c5 Leszek Koltunski
    if( numChildren>0 )
329 7cb8d4b0 Leszek Koltunski
      {
330 83e021c5 Leszek Koltunski
      LinearLayout pane = (LinearLayout)mObjectView.getChildAt(numChildren-1);
331
      ImageView view = pane.findViewById(R.id.bandagedCreatorObjectIcon);
332
333
      if( view!=null )
334 20b60ad9 Leszek Koltunski
        {
335 83e021c5 Leszek Koltunski
        act.runOnUiThread(new Runnable()
336
          {
337
          @Override
338
          public void run()
339 20b60ad9 Leszek Koltunski
          {
340
          view.setImageBitmap(bmp);
341
          }
342 83e021c5 Leszek Koltunski
          });
343
        }
344
      else
345
        {
346
        android.util.Log.e("D", "ImageView not found!");
347
        }
348 7cb8d4b0 Leszek Koltunski
      }
349
    }
350 a41e3c94 Leszek Koltunski
351
///////////////////////////////////////////////////////////////////////////////////////////////////
352
353 b9d062cf Leszek Koltunski
  private String generateObjectStrings()
354 a41e3c94 Leszek Koltunski
    {
355 576afdf9 Leszek Koltunski
    StringBuilder result = new StringBuilder();
356 a41e3c94 Leszek Koltunski
    int numViews = mViews.size();
357
358
    for( int v=0; v<numViews; v++ )
359
      {
360 7ee8337b leszek
      BandagedObjectView view = mViews.get(v);
361 a41e3c94 Leszek Koltunski
      String name = view.getName();
362 576afdf9 Leszek Koltunski
      if( v>0 ) result.append(' ');
363
      result.append(name);
364 a41e3c94 Leszek Koltunski
      }
365
366 576afdf9 Leszek Koltunski
    return result.toString();
367 a41e3c94 Leszek Koltunski
    }
368 b9d062cf Leszek Koltunski
369
///////////////////////////////////////////////////////////////////////////////////////////////////
370
371 f404152d Leszek Koltunski
    @SuppressLint("SuspiciousIndentation")
372 b9d062cf Leszek Koltunski
    @Override
373
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id)
374
      {
375
      int spinnerID = parent.getId();
376
377 9685735b Leszek Koltunski
      if( view!=null ) ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
378 39176a1f Leszek Koltunski
379 576afdf9 Leszek Koltunski
           if( spinnerID==R.id.bandagedCreatorX ) mX = pos;
380
      else if( spinnerID==R.id.bandagedCreatorY ) mY = pos;
381
      else if( spinnerID==R.id.bandagedCreatorZ ) mZ = pos;
382 b9d062cf Leszek Koltunski
383
      changeObject();
384
      }
385
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387
388
    @Override
389
    public void onNothingSelected(AdapterView<?> parent) { }
390
391 7da27d2b leszek
///////////////////////////////////////////////////////////////////////////////////////////////////
392
393
    private String generateObjectKey()
394
      {
395
      return mOrdinal==0 ? "bandagedObjects" : "bandagedObjects"+mOrdinal;
396
      }
397
398 b9d062cf Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
399
400
    public void savePreferences(SharedPreferences.Editor editor)
401
      {
402
      String objects = generateObjectStrings();
403 7da27d2b leszek
      editor.putString(generateObjectKey(), objects );
404 b9d062cf Leszek Koltunski
405 7da27d2b leszek
      editor.putInt("bandagedX"+mOrdinal, mX);
406
      editor.putInt("bandagedY"+mOrdinal, mY);
407
      editor.putInt("bandagedZ"+mOrdinal, mZ);
408 b9d062cf Leszek Koltunski
      }
409
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411
412 7ee8337b leszek
    public void restorePreferences(BandagedActivity act, SharedPreferences preferences)
413 b9d062cf Leszek Koltunski
      {
414 7da27d2b leszek
      String objects = preferences.getString(generateObjectKey(),"");
415 b9d062cf Leszek Koltunski
      addObjects(act,objects);
416
417 7da27d2b leszek
      mX = preferences.getInt("bandagedX"+mOrdinal, 2);
418
      mY = preferences.getInt("bandagedY"+mOrdinal, 2);
419
      mZ = preferences.getInt("bandagedZ"+mOrdinal, 2);
420 b9d062cf Leszek Koltunski
421 b3786da4 leszek
      int max = mMaxSupported-mMinSupported+1;
422
423 cd2d88fb leszek
      if( mX>=max ) mX = 0;//max-1;
424
      if( mY>=max ) mY = 0;//max-1;
425
      if( mZ>=max ) mZ = 0;//max-1;
426 b3786da4 leszek
427 b9d062cf Leszek Koltunski
      mSpinnerX.setSelection(mX);
428
      mSpinnerY.setSelection(mY);
429
      mSpinnerZ.setSelection(mZ);
430
431
      mSpinnersReady = true;
432
      changeObject();
433
      }
434 9530f6b0 Leszek Koltunski
}