Project

General

Profile

« Previous | Next » 

Revision 55e6be1d

Added by Leszek Koltunski over 3 years ago

Abstract the part that controls the 'Locked' and 'Back Moves' buttons from the two activities: the main one and the tutorial one.
This code had been duplicated there.

View differences:

src/main/java/org/distorted/effects/EffectController.java
19 19

  
20 20
package org.distorted.effects;
21 21

  
22
import org.distorted.helpers.MovesFinished;
22 23
import org.distorted.library.message.EffectListener;
23 24
import org.distorted.main.RubikPreRender;
24 25
import org.distorted.objects.TwistyObject;
......
27 28

  
28 29
public interface EffectController extends EffectListener
29 30
  {
30
  void addRotation(RubikPreRender.ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration);
31
  void addRotation(MovesFinished listener, int axis, int rowBitmap, int angle, long duration);
31 32
  TwistyObject getOldObject();
32 33
  TwistyObject getObject();
33 34
  int getNumScrambles();
src/main/java/org/distorted/effects/scramble/ScrambleEffect.java
20 20
package org.distorted.effects.scramble;
21 21

  
22 22
import org.distorted.effects.BaseEffect;
23
import org.distorted.helpers.MovesFinished;
23 24
import org.distorted.library.effect.Effect;
24 25
import org.distorted.library.main.DistortedEffects;
25 26
import org.distorted.library.main.DistortedScreen;
......
34 35

  
35 36
///////////////////////////////////////////////////////////////////////////////////////////////////
36 37

  
37
public abstract class ScrambleEffect extends BaseEffect implements EffectListener, RubikPreRender.ActionFinishedListener
38
public abstract class ScrambleEffect extends BaseEffect implements EffectListener, MovesFinished
38 39
{
39 40
  public enum Type
40 41
    {
src/main/java/org/distorted/helpers/MovesAndLockController.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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
package org.distorted.helpers;
21

  
22
import android.view.View;
23
import android.widget.ImageButton;
24
import android.widget.LinearLayout;
25

  
26
import org.distorted.main.R;
27
import org.distorted.main.RubikActivity;
28

  
29
import java.util.ArrayList;
30

  
31
///////////////////////////////////////////////////////////////////////////////////////////////////
32

  
33
public class MovesAndLockController implements MovesFinished
34
  {
35
  private static final int MILLIS_PER_DEGREE = 6;
36

  
37
  private static class Move
38
    {
39
    private final int mAxis, mRow, mAngle;
40

  
41
    Move(int axis, int row, int angle)
42
      {
43
      mAxis = axis;
44
      mRow  = row;
45
      mAngle= angle;
46
      }
47
    }
48

  
49
  private ArrayList<Move> mMoves;
50
  private boolean mCanPrevMove;
51
  private TwistyPreRender mPre;
52
  private ImageButton mPrevButton, mLockButton;
53

  
54
///////////////////////////////////////////////////////////////////////////////////////////////////
55
// PUBLIC API
56

  
57
  public MovesAndLockController()
58
    {
59
    mCanPrevMove = true;
60

  
61
    if( mMoves==null ) mMoves = new ArrayList<>();
62
    else               mMoves.clear();
63
    }
64

  
65
///////////////////////////////////////////////////////////////////////////////////////////////////
66

  
67
  public void toggleLock(TwistyActivity act)
68
    {
69
    act.toggleLock();
70
    mLockButton.setImageResource(getLockIcon(act));
71
    }
72

  
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74

  
75
  public int getLockIcon(TwistyActivity act)
76
    {
77
    if( act.retLocked() )
78
      {
79
      return RubikActivity.getDrawable(R.drawable.ui_small_locked,R.drawable.ui_medium_locked, R.drawable.ui_big_locked, R.drawable.ui_huge_locked);
80
      }
81
    else
82
      {
83
      return RubikActivity.getDrawable(R.drawable.ui_small_unlocked,R.drawable.ui_medium_unlocked, R.drawable.ui_big_unlocked, R.drawable.ui_huge_unlocked);
84
      }
85
    }
86

  
87
//////////////////////////////////////////////////////////////////////////////////////////////////
88

  
89
  public void backMove(TwistyPreRender pre)
90
    {
91
    if( mCanPrevMove )
92
      {
93
      int numMoves = mMoves.size();
94

  
95
      if( numMoves>0 )
96
        {
97
        Move move   = mMoves.remove(numMoves-1);
98
        int axis    = move.mAxis;
99
        int row     = (1<<move.mRow);
100
        int angle   = move.mAngle;
101
        int duration= Math.abs(angle)*MILLIS_PER_DEGREE;
102

  
103
        if( angle!=0 )
104
          {
105
          mCanPrevMove = false;
106
          mPre = pre;
107
          pre.blockTouch();
108
          pre.addRotation(this, axis, row, -angle, duration);
109
          }
110
        else
111
          {
112
          android.util.Log.e("solution", "error: trying to back move of angle 0");
113
          }
114
        }
115
      }
116
    }
117

  
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119

  
120
  public void addMove(int axis, int row, int angle)
121
    {
122
    mMoves.add(new Move(axis,row,angle));
123
    }
124

  
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126

  
127
  public void onActionFinished(final long effectID)
128
    {
129
    mCanPrevMove = true;
130
    mPre.unblockTouch();
131
    }
132

  
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134

  
135
  public void clearMoves()
136
    {
137
    mMoves.clear();
138
    }
139

  
140
///////////////////////////////////////////////////////////////////////////////////////////////////
141

  
142
  public void setupPrevButton(final TwistyActivity act, final float width)
143
    {
144
    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);
145
    mPrevButton = new TransparentImageButton(act, icon, width, LinearLayout.LayoutParams.MATCH_PARENT);
146

  
147
    mPrevButton.setOnClickListener( new View.OnClickListener()
148
      {
149
      @Override
150
      public void onClick(View v)
151
        {
152
        TwistyPreRender pre = act.getTwistyPreRender();
153
        backMove(pre);
154
        }
155
      });
156
    }
157

  
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

  
160
  public void setupLockButton(final TwistyActivity act, final float width)
161
    {
162
    final int icon = getLockIcon(act);
163
    mLockButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
164

  
165
    mLockButton.setOnClickListener( new View.OnClickListener()
166
      {
167
      @Override
168
      public void onClick(View v)
169
        {
170
        toggleLock(act);
171
        }
172
      });
173
    }
174

  
175
///////////////////////////////////////////////////////////////////////////////////////////////////
176

  
177
  public void setLockState(final TwistyActivity act)
178
    {
179
    act.runOnUiThread(new Runnable()
180
      {
181
      @Override
182
      public void run()
183
        {
184
        if( mLockButton!=null )
185
          mLockButton.setImageResource(getLockIcon(act));
186
        }
187
      });
188
    }
189

  
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

  
192
  public ImageButton getPrevButton()
193
    {
194
    return mPrevButton;
195
    }
196

  
197
///////////////////////////////////////////////////////////////////////////////////////////////////
198

  
199
  public ImageButton getLockButton()
200
    {
201
    return mLockButton;
202
    }
203
  }
src/main/java/org/distorted/helpers/MovesFinished.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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
package org.distorted.helpers;
21

  
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

  
24
public interface MovesFinished
25
  {
26
  void onActionFinished(long effectID);
27
  }
src/main/java/org/distorted/helpers/TransparentButton.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.helpers;
21

  
22
import android.annotation.SuppressLint;
23
import android.content.Context;
24
import android.util.TypedValue;
25
import android.widget.LinearLayout;
26

  
27
import org.distorted.main.RubikActivity;
28

  
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

  
31
@SuppressLint("ViewConstructor")
32
public class TransparentButton extends androidx.appcompat.widget.AppCompatButton
33
{
34
   public TransparentButton(Context context, int resId, float size, float scrWidth)
35
      {
36
      super(context);
37

  
38
      final int padding = (int)(scrWidth*RubikActivity.PADDING);
39
      final int margin  = (int)(scrWidth*RubikActivity.MARGIN);
40

  
41
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
42
      params.topMargin    = margin;
43
      params.bottomMargin = margin;
44
      params.leftMargin   = margin;
45
      params.rightMargin  = margin;
46

  
47
      setLayoutParams(params);
48
      setPadding(padding,0,padding,0);
49
      setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
50
      setText(resId);
51

  
52
      TypedValue outValue = new TypedValue();
53
      context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
54
      setBackgroundResource(outValue.resourceId);
55
      }
56
}
src/main/java/org/distorted/helpers/TransparentImageButton.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.helpers;
21

  
22
import android.annotation.SuppressLint;
23
import android.content.Context;
24
import android.util.TypedValue;
25
import android.widget.LinearLayout;
26

  
27
import org.distorted.main.RubikActivity;
28

  
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

  
31
@SuppressLint("ViewConstructor")
32
public class TransparentImageButton extends androidx.appcompat.widget.AppCompatImageButton
33
{
34
  public TransparentImageButton(Context context, int icon, float scrWidth, int butWidth)
35
      {
36
      super(context);
37

  
38
      final int padding = (int)(scrWidth*RubikActivity.PADDING);
39
      final int margin  = (int)(scrWidth*RubikActivity.MARGIN);
40

  
41
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(butWidth,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
42

  
43
      params.topMargin    = margin;
44
      params.bottomMargin = margin;
45
      params.leftMargin   = margin;
46
      params.rightMargin  = margin;
47

  
48
      setLayoutParams(params);
49
      setPadding(padding,0,padding,0);
50
      setImageResource(icon);
51

  
52
      TypedValue outValue = new TypedValue();
53
      context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
54
      setBackgroundResource(outValue.resourceId);
55
      }
56
}
src/main/java/org/distorted/helpers/TwistyActivity.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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
package org.distorted.helpers;
21

  
22
import androidx.appcompat.app.AppCompatActivity;
23

  
24
import org.distorted.screens.ScreenList;
25

  
26
///////////////////////////////////////////////////////////////////////////////////////////////////
27

  
28
abstract public class TwistyActivity extends AppCompatActivity
29
  {
30
  boolean mIsLocked, mRemLocked;
31

  
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

  
34
  public abstract TwistyPreRender getTwistyPreRender();
35

  
36
///////////////////////////////////////////////////////////////////////////////////////////////////
37

  
38
  public boolean retLocked()
39
      {
40
      return mIsLocked;
41
      }
42

  
43
///////////////////////////////////////////////////////////////////////////////////////////////////
44

  
45
  public void toggleLock()
46
      {
47
      mIsLocked = !mIsLocked;
48
      }
49

  
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

  
52
  public void unlock()
53
    {
54
    mIsLocked = false;
55
    }
56

  
57
///////////////////////////////////////////////////////////////////////////////////////////////////
58

  
59
  public boolean isLocked()
60
    {
61
    ScreenList state = ScreenList.getCurrentScreen();
62

  
63
    if( state== ScreenList.PLAY || state== ScreenList.READ || state== ScreenList.SOLV )
64
      {
65
      return mIsLocked;
66
      }
67

  
68
    return false;
69
    }
70

  
71
///////////////////////////////////////////////////////////////////////////////////////////////////
72

  
73
  public void setLock()
74
    {
75
    mRemLocked = mIsLocked;
76
    mIsLocked = true;
77
    }
78

  
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80

  
81
  public void unsetLock()
82
    {
83
    mIsLocked = mRemLocked;
84
    }
85
  }
src/main/java/org/distorted/helpers/TwistyPreRender.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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
package org.distorted.helpers;
21

  
22
///////////////////////////////////////////////////////////////////////////////////////////////////
23

  
24
public interface TwistyPreRender
25
  {
26
  void blockTouch();
27
  void unblockTouch();
28
  void blockEverything();
29
  void unblockEverything();
30
  void addRotation(MovesFinished listener, int axis, int rowBitmap, int angle, long duration);
31
  void solveObject();
32
  }
src/main/java/org/distorted/main/RubikActivity.java
25 25
import android.os.Bundle;
26 26
import android.os.LocaleList;
27 27
import android.preference.PreferenceManager;
28
import androidx.appcompat.app.AppCompatActivity;
29 28

  
30 29
import android.util.DisplayMetrics;
31 30
import android.view.DisplayCutout;
......
39 38
import org.distorted.dialogs.RubikDialogError;
40 39
import org.distorted.dialogs.RubikDialogPrivacy;
41 40
import org.distorted.effects.BaseEffect;
41
import org.distorted.helpers.TwistyActivity;
42
import org.distorted.helpers.TwistyPreRender;
42 43
import org.distorted.library.main.DistortedLibrary;
43 44

  
44 45
import org.distorted.library.main.DistortedScreen;
......
54 55

  
55 56
///////////////////////////////////////////////////////////////////////////////////////////////////
56 57

  
57
public class RubikActivity extends AppCompatActivity
58
public class RubikActivity extends TwistyActivity
58 59
{
59 60
    public static final float PADDING             = 0.01f;
60 61
    public static final float MARGIN              = 0.004f;
......
88 89
    private static int mScreenWidth, mScreenHeight;
89 90
    private boolean mPolicyAccepted, mIsChinese;
90 91
    private int mCurrentApiVersion;
91
    private boolean mIsLocked, mRemLocked;
92 92

  
93 93
///////////////////////////////////////////////////////////////////////////////////////////////////
94 94

  
......
110 110
      mScreenHeight=displaymetrics.heightPixels;
111 111

  
112 112
      mIsChinese = localeIsChinese();
113
      mIsLocked = false;
113
      unlock();
114 114

  
115 115
      hideNavigationBar();
116 116
      cutoutHack();
......
402 402
      return view.getPreRender();
403 403
      }
404 404

  
405
///////////////////////////////////////////////////////////////////////////////////////////////////
406

  
407
    public TwistyPreRender getTwistyPreRender()
408
      {
409
      RubikSurfaceView view = findViewById(R.id.rubikSurfaceView);
410
      return view.getPreRender();
411
      }
412

  
405 413
///////////////////////////////////////////////////////////////////////////////////////////////////
406 414

  
407 415
    public RubikSurfaceView getSurfaceView()
......
561 569
      return view.isVertical();
562 570
      }
563 571

  
564
///////////////////////////////////////////////////////////////////////////////////////////////////
565

  
566
    public void toggleLock()
567
      {
568
      mIsLocked = !mIsLocked;
569
      }
570

  
571
///////////////////////////////////////////////////////////////////////////////////////////////////
572

  
573
    public boolean isLocked()
574
      {
575
      ScreenList state = ScreenList.getCurrentScreen();
576

  
577
      if( state== ScreenList.PLAY || state== ScreenList.READ || state== ScreenList.SOLV )
578
        {
579
        return mIsLocked;
580
        }
581

  
582
      return false;
583
      }
584

  
585 572
///////////////////////////////////////////////////////////////////////////////////////////////////
586 573

  
587 574
    public void blockEverything()
588 575
      {
589
      mRemLocked = mIsLocked;
590
      mIsLocked = true;
576
      setLock();
591 577

  
592
      RubikPreRender pre = getPreRender();
578
      TwistyPreRender pre = getPreRender();
593 579
      pre.blockEverything();
594 580

  
595 581
      RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
......
600 586

  
601 587
    public void unblockEverything()
602 588
      {
603
      mIsLocked = mRemLocked;
589
      unsetLock();
604 590

  
605
      RubikPreRender pre = getPreRender();
591
      TwistyPreRender pre = getPreRender();
606 592
      pre.unblockEverything();
607 593

  
608 594
      RubikScreenPlay play = (RubikScreenPlay) ScreenList.PLAY.getScreenClass();
609 595
      play.setLockState(this);
610 596
      }
611 597

  
612
///////////////////////////////////////////////////////////////////////////////////////////////////
613

  
614
    public boolean retLocked()
615
      {
616
      return mIsLocked;
617
      }
618

  
619 598
///////////////////////////////////////////////////////////////////////////////////////////////////
620 599

  
621 600
    public void switchTutorial(String url, ObjectList object, int size)
src/main/java/org/distorted/main/RubikPreRender.java
39 39
import org.distorted.effects.BaseEffect;
40 40
import org.distorted.effects.EffectController;
41 41
import org.distorted.effects.scramble.ScrambleEffect;
42
import org.distorted.helpers.MovesFinished;
43
import org.distorted.helpers.TwistyPreRender;
42 44
import org.distorted.objects.TwistyObject;
43 45
import org.distorted.objects.ObjectList;
44 46
import org.distorted.network.RubikScores;
......
48 50

  
49 51
///////////////////////////////////////////////////////////////////////////////////////////////////
50 52

  
51
public class RubikPreRender implements EffectController
53
public class RubikPreRender implements EffectController, TwistyPreRender
52 54
  {
53
  public interface ActionFinishedListener
54
    {
55
    void onActionFinished(long effectID);
56
    }
57

  
58 55
  private final RubikSurfaceView mView;
59 56
  private boolean mFinishRotation, mRemoveRotation, mRemovePatternRotation, mAddRotation,
60 57
                  mSetQuat, mChangeObject, mSetupObject, mSolveObject, mScrambleObject,
......
74 71
  private int mScrambleObjectNum;
75 72
  private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
76 73
  private long mAddRotationDuration;
77
  private ActionFinishedListener mAddActionListener;
74
  private MovesFinished mAddActionListener;
78 75
  private long mAddRotationID, mRemoveRotationID;
79 76
  private int mCubit, mFace, mNewColor;
80 77
  private int mNearestAngle;
......
602 599
// PUBLIC API
603 600
///////////////////////////////////////////////////////////////////////////////////////////////////
604 601

  
605
  public void addRotation(ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration)
602
  public void addRotation(MovesFinished listener, int axis, int rowBitmap, int angle, long duration)
606 603
    {
607 604
    mAddRotation = true;
608 605

  
src/main/java/org/distorted/patterns/RubikPattern.java
19 19

  
20 20
package org.distorted.patterns;
21 21

  
22
import org.distorted.helpers.MovesFinished;
22 23
import org.distorted.main.RubikPreRender;
23 24

  
24 25
import java.util.ArrayList;
......
192 193

  
193 194
///////////////////////////////////////////////////////////////////////////////////////////////////
194 195

  
195
  private static class Pattern implements RubikPreRender.ActionFinishedListener
196
  private static class Pattern implements MovesFinished
196 197
    {
197 198
    private final String nameStr;
198 199
    private String moveStr;
src/main/java/org/distorted/screens/RubikScreenBase.java
19 19

  
20 20
package org.distorted.screens;
21 21

  
22
import android.view.View;
23 22
import android.widget.ImageButton;
24 23
import android.widget.LinearLayout;
25 24

  
25
import org.distorted.helpers.MovesAndLockController;
26 26
import org.distorted.main.R;
27 27
import org.distorted.main.RubikActivity;
28
import org.distorted.main.RubikPreRender;
29

  
30
import java.util.ArrayList;
31 28

  
32 29
///////////////////////////////////////////////////////////////////////////////////////////////////
33 30

  
34
abstract class RubikScreenBase extends RubikScreenAbstract implements RubikPreRender.ActionFinishedListener
31
abstract class RubikScreenBase extends RubikScreenAbstract
35 32
  {
36
  private static final int MILLIS_PER_DEGREE = 6;
37

  
38
  private ImageButton mPrevButton, mLockButton;
39
  private boolean mCanPrevMove;
40
  private RubikPreRender mPre;
41

  
42
  private static class Move
43
    {
44
    private final int mAxis, mRow, mAngle;
45

  
46
    Move(int axis, int row, int angle)
47
      {
48
      mAxis = axis;
49
      mRow  = row;
50
      mAngle= angle;
51
      }
52
    }
53

  
54
  ArrayList<Move> mMoves;
55

  
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

  
58
  private void backMove(RubikPreRender pre)
59
    {
60
    if( mCanPrevMove )
61
      {
62
      int numMoves = mMoves.size();
63

  
64
      if( numMoves>0 )
65
        {
66
        RubikScreenBase.Move move = mMoves.remove(numMoves-1);
67
        int axis  = move.mAxis;
68
        int row   = (1<<move.mRow);
69
        int angle = move.mAngle;
70
        int duration= Math.abs(angle)*MILLIS_PER_DEGREE;
71

  
72
        if( angle!=0 )
73
          {
74
          mCanPrevMove = false;
75
          mPre = pre;
76
          pre.blockTouch();
77
          pre.addRotation(this, axis, row, -angle, duration);
78
          }
79
        else
80
          {
81
          android.util.Log.e("solution", "error: trying to back move of angle 0");
82
          }
83
        }
84
      }
85
    }
86

  
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88

  
89
  private void toggleLock(RubikActivity act)
90
    {
91
    act.toggleLock();
92
    mLockButton.setImageResource(getLockIcon(act));
93
    }
94

  
95
///////////////////////////////////////////////////////////////////////////////////////////////////
96

  
97
  private int getLockIcon(RubikActivity act)
98
    {
99
    if( act.retLocked() )
100
      {
101
      return RubikActivity.getDrawable(R.drawable.ui_small_locked,R.drawable.ui_medium_locked, R.drawable.ui_big_locked, R.drawable.ui_huge_locked);
102
      }
103
    else
104
      {
105
      return RubikActivity.getDrawable(R.drawable.ui_small_unlocked,R.drawable.ui_medium_unlocked, R.drawable.ui_big_unlocked, R.drawable.ui_huge_unlocked);
106
      }
107
    }
33
  MovesAndLockController mController;
108 34

  
109 35
///////////////////////////////////////////////////////////////////////////////////////////////////
110 36

  
111 37
  void createBottomPane(final RubikActivity act, float width, ImageButton button)
112 38
    {
113
    mCanPrevMove = true;
114

  
115
    if( mMoves==null ) mMoves = new ArrayList<>();
116
    else               mMoves.clear();
39
    if( mController==null ) mController = new MovesAndLockController();
117 40

  
118 41
    LinearLayout layoutBot = act.findViewById(R.id.lowerBar);
119 42
    layoutBot.removeAllViews();
......
127 50
    LinearLayout layoutRight = new LinearLayout(act);
128 51
    layoutRight.setLayoutParams(params);
129 52

  
130
    setupPrevButton(act,width);
131
    layoutLeft.addView(mPrevButton);
132
    setupLockButton(act,width);
133
    layoutMid.addView(mLockButton);
53
    mController.setupPrevButton(act,width);
54
    layoutLeft.addView(mController.getPrevButton());
55
    mController.setupLockButton(act,width);
56
    layoutMid.addView(mController.getLockButton());
134 57
    layoutRight.addView(button);
135 58

  
136 59
    layoutBot.addView(layoutLeft);
......
138 61
    layoutBot.addView(layoutRight);
139 62
    }
140 63

  
141
///////////////////////////////////////////////////////////////////////////////////////////////////
142

  
143
  void setupLockButton(final RubikActivity act, final float width)
144
    {
145
    final int icon = getLockIcon(act);
146
    mLockButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
147

  
148
    mLockButton.setOnClickListener( new View.OnClickListener()
149
      {
150
      @Override
151
      public void onClick(View v)
152
        {
153
        toggleLock(act);
154
        }
155
      });
156
    }
157

  
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

  
160
  void setupPrevButton(final RubikActivity act, final float width)
161
    {
162
    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);
163
    mPrevButton = new TransparentImageButton(act, icon, width,LinearLayout.LayoutParams.MATCH_PARENT);
164

  
165
    mPrevButton.setOnClickListener( new View.OnClickListener()
166
      {
167
      @Override
168
      public void onClick(View v)
169
        {
170
        RubikPreRender pre = act.getPreRender();
171
        backMove(pre);
172
        }
173
      });
174
    }
175

  
176 64
///////////////////////////////////////////////////////////////////////////////////////////////////
177 65

  
178 66
  public void setLockState(final RubikActivity act)
179 67
    {
180
    act.runOnUiThread(new Runnable()
181
      {
182
      @Override
183
      public void run()
184
        {
185
        if( mLockButton!=null )
186
          mLockButton.setImageResource(getLockIcon(act));
187
        }
188
      });
68
    mController.setLockState(act);
189 69
    }
190 70

  
191 71
///////////////////////////////////////////////////////////////////////////////////////////////////
192 72

  
193 73
  public void addMove(int axis, int row, int angle)
194 74
    {
195
    mMoves.add(new Move(axis,row,angle));
196
    }
197

  
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199

  
200
  public void onActionFinished(final long effectID)
201
    {
202
    mCanPrevMove = true;
203
    mPre.unblockTouch();
75
    mController.addMove(axis,row,angle);
204 76
    }
205 77
  }
src/main/java/org/distorted/screens/RubikScreenDone.java
31 31

  
32 32
import org.distorted.dialogs.RubikDialogNewRecord;
33 33
import org.distorted.dialogs.RubikDialogSolved;
34
import org.distorted.helpers.TransparentImageButton;
34 35
import org.distorted.main.R;
35 36
import org.distorted.main.RubikActivity;
36 37

  
src/main/java/org/distorted/screens/RubikScreenPattern.java
31 31
import android.widget.TextView;
32 32

  
33 33
import org.distorted.dialogs.RubikDialogPattern;
34
import org.distorted.helpers.TransparentImageButton;
34 35
import org.distorted.main.R;
35 36
import org.distorted.main.RubikActivity;
36 37
import org.distorted.main.RubikPreRender;
src/main/java/org/distorted/screens/RubikScreenPlay.java
37 37
import org.distorted.dialogs.RubikDialogPattern;
38 38
import org.distorted.dialogs.RubikDialogScores;
39 39
import org.distorted.dialogs.RubikDialogTutorial;
40
import org.distorted.helpers.TransparentButton;
41
import org.distorted.helpers.TransparentImageButton;
40 42
import org.distorted.main.R;
41 43
import org.distorted.main.RubikActivity;
42 44
import org.distorted.main.RubikPreRender;
......
291 293
              mSize   = sizes[index];
292 294
              act.changeObject(list,sizes[index], true);
293 295
              adjustLevels(act);
294
              mMoves.clear();
296
              mController.clearMoves();
295 297
              }
296 298

  
297 299
            mObjectPopup.dismiss();
......
426 428
      public void onClick(View v)
427 429
        {
428 430
        act.getPreRender().solveObject();
429
        mMoves.clear();
431
        mController.clearMoves();
430 432
        }
431 433
      });
432 434
    }
src/main/java/org/distorted/screens/RubikScreenReady.java
27 27
import android.widget.LinearLayout;
28 28
import android.widget.TextView;
29 29

  
30
import org.distorted.helpers.TransparentImageButton;
30 31
import org.distorted.main.R;
31 32
import org.distorted.main.RubikActivity;
32 33

  
src/main/java/org/distorted/screens/RubikScreenSolution.java
28 28
import android.widget.LinearLayout;
29 29
import android.widget.TextView;
30 30

  
31
import org.distorted.helpers.MovesFinished;
32
import org.distorted.helpers.TransparentImageButton;
31 33
import org.distorted.main.R;
32 34
import org.distorted.main.RubikActivity;
33 35
import org.distorted.main.RubikPreRender;
......
36 38

  
37 39
///////////////////////////////////////////////////////////////////////////////////////////////////
38 40

  
39
public class RubikScreenSolution extends RubikScreenAbstract implements RubikPreRender.ActionFinishedListener
41
public class RubikScreenSolution extends RubikScreenAbstract implements MovesFinished
40 42
  {
41 43
  private static final int MILLIS_PER_DEGREE = 6;
42 44

  
src/main/java/org/distorted/screens/RubikScreenSolver.java
32 32
import android.widget.LinearLayout;
33 33

  
34 34
import org.distorted.dialogs.RubikDialogSolverError;
35
import org.distorted.helpers.TransparentImageButton;
35 36
import org.distorted.main.R;
36 37
import org.distorted.main.RubikActivity;
37 38
import org.distorted.main.RubikPreRender;
src/main/java/org/distorted/screens/RubikScreenSolving.java
27 27
import android.widget.LinearLayout;
28 28
import android.widget.TextView;
29 29

  
30
import org.distorted.helpers.TransparentImageButton;
30 31
import org.distorted.main.R;
31 32
import org.distorted.main.RubikActivity;
32 33
import org.distorted.objects.ObjectList;
src/main/java/org/distorted/screens/TransparentButton.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.screens;
21

  
22
import android.annotation.SuppressLint;
23
import android.content.Context;
24
import android.util.TypedValue;
25
import android.widget.LinearLayout;
26

  
27
import org.distorted.main.RubikActivity;
28

  
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

  
31
@SuppressLint("ViewConstructor")
32
public class TransparentButton extends androidx.appcompat.widget.AppCompatButton
33
{
34
   public TransparentButton(Context context, int resId, float size, float scrWidth)
35
      {
36
      super(context);
37

  
38
      final int padding = (int)(scrWidth*RubikActivity.PADDING);
39
      final int margin  = (int)(scrWidth*RubikActivity.MARGIN);
40

  
41
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT, 1.0f);
42
      params.topMargin    = margin;
43
      params.bottomMargin = margin;
44
      params.leftMargin   = margin;
45
      params.rightMargin  = margin;
46

  
47
      setLayoutParams(params);
48
      setPadding(padding,0,padding,0);
49
      setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
50
      setText(resId);
51

  
52
      TypedValue outValue = new TypedValue();
53
      context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
54
      setBackgroundResource(outValue.resourceId);
55
      }
56
}
src/main/java/org/distorted/screens/TransparentImageButton.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
package org.distorted.screens;
21

  
22
import android.annotation.SuppressLint;
23
import android.content.Context;
24
import android.util.TypedValue;
25
import android.widget.LinearLayout;
26

  
27
import org.distorted.main.RubikActivity;
28

  
29
///////////////////////////////////////////////////////////////////////////////////////////////////
30

  
31
@SuppressLint("ViewConstructor")
32
public class TransparentImageButton extends androidx.appcompat.widget.AppCompatImageButton
33
{
34
  public TransparentImageButton(Context context, int icon, float scrWidth, int butWidth)
35
      {
36
      super(context);
37

  
38
      final int padding = (int)(scrWidth*RubikActivity.PADDING);
39
      final int margin  = (int)(scrWidth*RubikActivity.MARGIN);
40

  
41
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(butWidth,LinearLayout.LayoutParams.MATCH_PARENT,1.0f);
42

  
43
      params.topMargin    = margin;
44
      params.bottomMargin = margin;
45
      params.leftMargin   = margin;
46
      params.rightMargin  = margin;
47

  
48
      setLayoutParams(params);
49
      setPadding(padding,0,padding,0);
50
      setImageResource(icon);
51

  
52
      TypedValue outValue = new TypedValue();
53
      context.getTheme().resolveAttribute(android.R.attr.selectableItemBackgroundBorderless, outValue, true);
54
      setBackgroundResource(outValue.resourceId);
55
      }
56
}
src/main/java/org/distorted/tutorials/TutorialActivity.java
28 28
import android.webkit.WebView;
29 29
import android.widget.LinearLayout;
30 30

  
31
import androidx.appcompat.app.AppCompatActivity;
32

  
33 31
import com.google.firebase.analytics.FirebaseAnalytics;
34 32

  
35 33
import org.distorted.dialogs.RubikDialogError;
34
import org.distorted.helpers.TwistyActivity;
35
import org.distorted.helpers.TwistyPreRender;
36 36
import org.distorted.library.main.DistortedLibrary;
37 37
import org.distorted.main.R;
38 38
import org.distorted.objects.ObjectList;
39 39
import org.distorted.objects.TwistyObject;
40
import org.distorted.screens.ScreenList;
41 40

  
42 41
import static org.distorted.main.RubikRenderer.BRIGHTNESS;
43 42

  
44 43
///////////////////////////////////////////////////////////////////////////////////////////////////
45 44

  
46
public class TutorialActivity extends AppCompatActivity
45
public class TutorialActivity extends TwistyActivity
47 46
{
48 47
    private static final String URL = "https://www.youtube.com/embed/";
49 48

  
......
56 55
                                   | View.SYSTEM_UI_FLAG_FULLSCREEN
57 56
                                   | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
58 57

  
59
    public static final int FLAGS2=  View.SYSTEM_UI_FLAG_LAYOUT_STABLE
60
                                   | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
61

  
62
    private boolean mIsLocked;
63 58
    private FirebaseAnalytics mFirebaseAnalytics;
64 59
    private static int mScreenWidth, mScreenHeight;
65 60
    private int mCurrentApiVersion;
......
87 82
        mObjectSize    = b.getInt("siz");
88 83
        }
89 84

  
90
      mIsLocked = false;
85
      unlock();
91 86
      mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
92 87

  
93 88
      DisplayMetrics displaymetrics = new DisplayMetrics();
......
153 148
      mState.createRightPane(this,width);
154 149

  
155 150
      WebView videoView = findViewById(R.id.tutorialVideoView);
156
      mWebView = new TutorialWebView(this,videoView);
151
      mWebView = new TutorialWebView(videoView);
157 152
      mWebView.load(URL+mURL);
158 153
      }
159 154

  
......
285 280
      return view.getPreRender();
286 281
      }
287 282

  
283
///////////////////////////////////////////////////////////////////////////////////////////////////
284

  
285
    public TwistyPreRender getTwistyPreRender()
286
      {
287
      TutorialSurfaceView view = findViewById(R.id.tutorialSurfaceView);
288
      return view.getPreRender();
289
      }
290

  
288 291
///////////////////////////////////////////////////////////////////////////////////////////////////
289 292

  
290 293
    public static int getDrawableSize()
......
327 330
      TutorialSurfaceView view = findViewById(R.id.tutorialSurfaceView);
328 331
      return view.isVertical();
329 332
      }
330

  
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332

  
333
    public void toggleLock()
334
      {
335
      mIsLocked = !mIsLocked;
336
      }
337

  
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339

  
340
    public boolean isLocked()
341
      {
342
      ScreenList state = ScreenList.getCurrentScreen();
343

  
344
      if( state== ScreenList.PLAY || state== ScreenList.READ || state== ScreenList.SOLV )
345
        {
346
        return mIsLocked;
347
        }
348

  
349
      return false;
350
      }
351

  
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

  
354
    public boolean retLocked()
355
      {
356
      return mIsLocked;
357
      }
358 333
}
src/main/java/org/distorted/tutorials/TutorialPreRender.java
24 24

  
25 25
import org.distorted.effects.BaseEffect;
26 26
import org.distorted.effects.EffectController;
27
import org.distorted.helpers.MovesFinished;
28
import org.distorted.helpers.TwistyPreRender;
27 29
import org.distorted.objects.ObjectList;
28 30
import org.distorted.objects.TwistyObject;
29
import org.distorted.main.RubikPreRender.ActionFinishedListener;
30
import org.distorted.network.RubikScores;
31 31

  
32 32
///////////////////////////////////////////////////////////////////////////////////////////////////
33 33

  
34
public class TutorialPreRender implements EffectController
34
public class TutorialPreRender implements EffectController, TwistyPreRender
35 35
  {
36
  private ActionFinishedListener mAddActionListener;
36
  private MovesFinished mAddActionListener;
37 37
  private final TutorialSurfaceView mView;
38 38
  private boolean mFinishRotation, mRemoveRotation, mAddRotation,
39 39
                  mSetQuat, mChangeObject, mSetupObject, mSolveObject, mScrambleObject,
40 40
                  mInitializeObject, mResetAllTextureMaps, mRemovePatternRotation;
41
  private boolean mCanPlay, mCanRotate;
41
  private boolean mUIBlocked, mTouchBlocked;
42 42
  private boolean mIsSolved;
43 43
  private ObjectList mNextObject;
44 44
  private int mNextSize;
45 45
  private long mRotationFinishedID;
46 46
  private int mScreenWidth;
47
  private int[][] mNextMoves;
48 47
  private TwistyObject mOldObject, mNewObject;
49 48
  private int mAddRotationAxis, mAddRotationRowBitmap, mAddRotationAngle;
50 49
  private long mAddRotationDuration;
......
67 66
    mSolveObject    = false;
68 67
    mScrambleObject = false;
69 68

  
70
    mCanRotate      = true;
71
    mCanPlay        = true;
69
    unblockEverything();
70

  
72 71
    mOldObject      = null;
73 72
    mNewObject      = null;
74 73

  
......
80 79

  
81 80
///////////////////////////////////////////////////////////////////////////////////////////////////
82 81

  
83
  private void createObjectNow(ObjectList object, int size, int[][] moves)
82
  private void createObjectNow(ObjectList object, int size)
84 83
    {
85 84
    if( mOldObject!=null ) mOldObject.releaseResources();
86 85
    mOldObject = mNewObject;
......
88 87
    Context con = mView.getContext();
89 88
    Resources res = con.getResources();
90 89

  
91
    mNewObject = object.create(size, mView.getQuat(), moves, res, mScreenWidth);
90
    mNewObject = object.create(size, mView.getQuat(), null, res, mScreenWidth);
92 91

  
93 92
    if( mNewObject!=null )
94 93
      {
......
114 113
      }
115 114
    catch( Exception ex )
116 115
      {
117
      mCanPlay  = true;
118
      mCanRotate= true;
116
      android.util.Log.e("renderer", "exception starting effect: "+ex.getMessage());
117
      unblockEverything();
119 118
      }
120 119
    }
121 120

  
......
143 142
    mNewObject.removeRotationNow();
144 143

  
145 144
    boolean solved = mNewObject.isSolved();
146

  
147
    if( solved && !mIsSolved )
148
      {
149
      doEffectNow( BaseEffect.Type.WIN );
150
      }
151
    else
152
      {
153
      mCanPlay = true;
154
      }
145
    unblockEverything();
146
    if( solved && !mIsSolved ) doEffectNow( BaseEffect.Type.WIN );
155 147

  
156 148
    mIsSolved = solved;
157 149
    }
......
173 165

  
174 166
    if( mAddRotationID==0 ) // failed to add effect - should never happen
175 167
      {
176
      mCanPlay  = true;
177
      mCanRotate= true;
168
      unblockEverything();
178 169
      }
179 170
    }
180 171

  
......
183 174
  private void finishRotationNow()
184 175
    {
185 176
    mFinishRotation = false;
186
    mCanPlay        = false;
177
    blockEverything();
187 178
    mRotationFinishedID = mNewObject.finishRotationNow(this, mNearestAngle);
188 179

  
189 180
    if( mRotationFinishedID==0 ) // failed to add effect - should never happen
190 181
      {
191
      mCanPlay = true;
182
      unblockEverything();
192 183
      }
193 184
    }
194 185

  
......
200 191

  
201 192
    if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
202 193
      {
203
      mCanPlay  = false;
204
      createObjectNow(mNextObject, mNextSize, null);
194
      blockEverything();
195
      createObjectNow(mNextObject, mNextSize);
205 196
      doEffectNow( BaseEffect.Type.SIZECHANGE );
206 197
      }
207 198
    }
......
214 205

  
215 206
    if ( mNewObject==null || mNewObject.getObjectList()!=mNextObject || mNewObject.getNumLayers()!=mNextSize)
216 207
      {
217
      mCanPlay  = false;
218
      createObjectNow(mNextObject, mNextSize, mNextMoves);
208
      blockEverything();
209
      createObjectNow(mNextObject, mNextSize);
219 210
      doEffectNow( BaseEffect.Type.SIZECHANGE );
220 211
      }
221 212
    else
222 213
      {
223
      mNewObject.initializeObject(mNextMoves);
214
      mNewObject.initializeObject(null);
224 215
      }
225 216
    }
226 217

  
227 218
///////////////////////////////////////////////////////////////////////////////////////////////////
228 219

  
229
  private void solveObjectNow()
220
  private void scrambleObjectNow()
230 221
    {
231
    mSolveObject = false;
232
    mCanPlay     = false;
233
    doEffectNow( BaseEffect.Type.SOLVE );
222
    mScrambleObject = false;
223
    mIsSolved       = false;
224
    blockEverything();
225
    doEffectNow( BaseEffect.Type.SCRAMBLE );
234 226
    }
235 227

  
236 228
///////////////////////////////////////////////////////////////////////////////////////////////////
237 229

  
238
  private void scrambleObjectNow()
230
  private void solveObjectNow()
239 231
    {
240
    mScrambleObject = false;
241
    mCanPlay        = false;
242
    mCanRotate      = false;
243
    mIsSolved       = false;
244

  
245
    doEffectNow( BaseEffect.Type.SCRAMBLE );
232
    mSolveObject = false;
233
    blockEverything();
234
    doEffectNow( BaseEffect.Type.SOLVE );
246 235
    }
247 236

  
248 237
///////////////////////////////////////////////////////////////////////////////////////////////////
......
250 239
  private void initializeObjectNow()
251 240
    {
252 241
    mInitializeObject = false;
253
    mNewObject.initializeObject(mNextMoves);
242
    mNewObject.initializeObject(null);
254 243
    }
255 244

  
256 245
///////////////////////////////////////////////////////////////////////////////////////////////////
......
333 322
// PUBLIC API
334 323
///////////////////////////////////////////////////////////////////////////////////////////////////
335 324

  
336
  public void addRotation(ActionFinishedListener listener, int axis, int rowBitmap, int angle, long duration)
325
  boolean isTouchBlocked()
326
    {
327
    return mTouchBlocked;
328
    }
329

  
330
///////////////////////////////////////////////////////////////////////////////////////////////////
331

  
332
  public boolean isUINotBlocked()
333
    {
334
    return !mUIBlocked;
335
    }
336

  
337
///////////////////////////////////////////////////////////////////////////////////////////////////
338

  
339
  public void blockEverything()
340
    {
341
    mUIBlocked   = true;
342
    mTouchBlocked= true;
343
    }
344

  
345
///////////////////////////////////////////////////////////////////////////////////////////////////
346

  
347
  public void blockTouch()
348
    {
349
    mTouchBlocked= true;
350
    }
351

  
352
///////////////////////////////////////////////////////////////////////////////////////////////////
353

  
354
  public void unblockEverything()
355
    {
356
    mUIBlocked   = false;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff