Project

General

Profile

« Previous | Next » 

Revision 598de3ee

Added by Leszek Koltunski almost 3 years ago

add possible scrolling to the 'object' popup in case the grid of objects does not fit on the screen.

View differences:

src/main/java/org/distorted/effects/objectchange/ObjectChangeEffect.java
50 50
      }
51 51
    }
52 52

  
53
  private static int NUM_EFFECTS = Type.values().length;
53
  private static final int NUM_EFFECTS = Type.values().length;
54 54
  private static final int NUM_PHASES  = 2;
55 55
  private static final int FAKE_EFFECT_ID  = -1;
56 56
  private static final Type[] types;
......
68 68

  
69 69
  private EffectController mController;
70 70
  private int mDuration;
71
  private int[] mEffectReturned;
72
  private int[] mCubeEffectNumber, mNodeEffectNumber;
73
  private int[] mEffectFinished;
74
  private boolean[] mPhaseActive;
71
  private final int[] mEffectReturned;
72
  private final int[] mCubeEffectNumber, mNodeEffectNumber;
73
  private final int[] mEffectFinished;
74
  private final boolean[] mPhaseActive;
75 75

  
76 76
  TwistyObject[] mObject;
77 77
  DistortedScreen mScreen;
src/main/java/org/distorted/main/RubikActivity.java
86 86
    public static final int FLAGS2=  View.SYSTEM_UI_FLAG_LAYOUT_STABLE
87 87
                                   | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
88 88

  
89
    private static final float RATIO_BAR  = 0.10f;
90
    private static final float RATIO_INSET= 0.08f;
91

  
89 92
    private boolean mJustStarted;
90 93
    private FirebaseAnalytics mFirebaseAnalytics;
91 94
    private static int mScreenWidth, mScreenHeight;
92 95
    private boolean mPolicyAccepted, mIsChinese;
93 96
    private int mCurrentApiVersion;
97
    private int mHeightUpperBar, mHeightLowerBar;
94 98

  
95 99
///////////////////////////////////////////////////////////////////////////////////////////////////
96 100

  
......
116 120

  
117 121
      hideNavigationBar();
118 122
      cutoutHack();
123
      computeBarHeights();
119 124
      // askForPermissions();
120 125
      }
121 126

  
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128
// this does not include possible insets
129

  
130
    private void computeBarHeights()
131
      {
132
      float height = getScreenHeightInPixels();
133
      int barHeight = (int)(height*RATIO_BAR);
134
      mHeightLowerBar = barHeight;
135
      mHeightUpperBar = barHeight;
136
      }
137

  
122 138
///////////////////////////////////////////////////////////////////////////////////////////////////
123 139

  
124 140
    private void hideNavigationBar()
......
159 175

  
160 176
        LinearLayout layoutHid = findViewById(R.id.hiddenBar);
161 177
        ViewGroup.LayoutParams paramsHid = layoutHid.getLayoutParams();
162
        paramsHid.height = (int)(0.8f*insetHeight);
178
        paramsHid.height = (int)(insetHeight*RATIO_INSET);
163 179
        layoutHid.setLayoutParams(paramsHid);
180
        mHeightUpperBar += paramsHid.height;
164 181
        }
165 182

  
166
      final float RATIO = 0.10f;
167 183
      float height = getScreenHeightInPixels();
168 184

  
169 185
      LinearLayout layoutTop = findViewById(R.id.upperBar);
170 186
      LinearLayout layoutBot = findViewById(R.id.lowerBar);
171 187

  
172 188
      ViewGroup.LayoutParams paramsTop = layoutTop.getLayoutParams();
173
      paramsTop.height = (int)(height*RATIO);
189
      paramsTop.height = (int)(height*RATIO_BAR);
174 190
      layoutTop.setLayoutParams(paramsTop);
175 191
      ViewGroup.LayoutParams paramsBot = layoutBot.getLayoutParams();
176
      paramsBot.height = (int)(height*RATIO);
192
      paramsBot.height = (int)(height*RATIO_BAR);
177 193
      layoutBot.setLayoutParams(paramsBot);
178 194
      }
179 195

  
......
380 396
      return mFirebaseAnalytics;
381 397
      }
382 398

  
399
///////////////////////////////////////////////////////////////////////////////////////////////////
400

  
401
    public int getHeightUpperBar()
402
      {
403
      return mHeightUpperBar;
404
      }
405

  
406
///////////////////////////////////////////////////////////////////////////////////////////////////
407

  
408
    public int getHeightLowerBar()
409
      {
410
      return mHeightLowerBar;
411
      }
412

  
383 413
///////////////////////////////////////////////////////////////////////////////////////////////////
384 414

  
385 415
    public TwistyObject getObject()
src/main/java/org/distorted/screens/RubikScreenPlay.java
32 32
import android.widget.ImageButton;
33 33
import android.widget.LinearLayout;
34 34
import android.widget.PopupWindow;
35
import android.widget.ScrollView;
35 36

  
36 37
import org.distorted.control.RubikControl;
37 38
import org.distorted.dialogs.RubikDialogAbout;
......
72 73
  private int mObjectSize, mMenuLayoutWidth, mMenuLayoutHeight, mPlayLayoutWidth;
73 74
  private int mLevelValue;
74 75
  private float mButtonSize, mMenuItemSize, mMenuTextSize;
75
  private int mColCount, mRowCount;
76
  private int mColCount, mRowCount, mMaxRowCount;
76 77
  private LinearLayout mPlayLayout;
77 78

  
78 79
///////////////////////////////////////////////////////////////////////////////////////////////////
......
87 88
  void enterScreen(final RubikActivity act)
88 89
    {
89 90
    float width = act.getScreenWidthInPixels();
91
    float height= act.getScreenHeightInPixels();
90 92

  
91 93
    mMenuTextSize = width*RubikActivity.MENU_MED_TEXT_SIZE;
92 94
    mButtonSize   = width*RubikActivity.BUTTON_TEXT_SIZE;
......
99 101
    LinearLayout layoutTop = act.findViewById(R.id.upperBar);
100 102
    layoutTop.removeAllViews();
101 103

  
102
    setupObjectWindow(act,width);
104
    setupObjectWindow(act,width,height);
103 105
    setupObjectButton(act,width);
104 106
    layoutTop.addView(mObjButton);
105 107

  
......
128 130
      @Override
129 131
      public void onClick(View view)
130 132
        {
131
        if(act.getPreRender().isUINotBlocked())
133
        if( mObjectPopup!=null && act.getPreRender().isUINotBlocked())
132 134
          {
133
          if( mObjectPopup==null )
134
            {
135
            // I completely don't understand it, but Firebase says occasionally mObjectPopup is null here. Recreate.
136
            float width = act.getScreenWidthInPixels();
137
            setupObjectWindow(act,width);
138
            }
139

  
140
          mObjectPopup.setFocusable(false);
141
          mObjectPopup.update();
135
          int rowCount = Math.min(mMaxRowCount,mRowCount);
142 136

  
143 137
          View popupView = mObjectPopup.getContentView();
144 138
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
145 139

  
146 140
          mObjectPopup.showAsDropDown(view, margin, margin);
147
          mObjectPopup.update(view, mObjectSize*mColCount, mObjectSize*mRowCount);
148

  
141
          mObjectPopup.update(view, mObjectSize*mColCount, mObjectSize*rowCount);
149 142
          mObjectPopup.setFocusable(true);
150 143
          mObjectPopup.update();
151 144
          }
......
165 158
      @Override
166 159
      public void onClick(View view)
167 160
        {
168
        if(act.getPreRender().isUINotBlocked())
161
        if( mPlayPopup!=null && act.getPreRender().isUINotBlocked())
169 162
          {
170
          if( mPlayPopup==null )
171
            {
172
            // I completely don't understand it, but Firebase says occasionally mPlayPopup is null here. Recreate.
173
            float width = act.getScreenWidthInPixels();
174
            setupPlayWindow(act,width);
175
            }
176

  
177
          mPlayPopup.setFocusable(false);
178
          mPlayPopup.update();
179

  
180 163
          View popupView = mPlayPopup.getContentView();
181 164
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
182 165

  
......
206 189
      @Override
207 190
      public void onClick(View view)
208 191
        {
209
        if(act.getPreRender().isUINotBlocked())
192
        if( mMenuPopup!=null && act.getPreRender().isUINotBlocked())
210 193
          {
211
          if( mMenuPopup==null )
212
            {
213
            // I completely don't understand it, but Firebase says occasionally mMenuPopup is null here. Recreate.
214
            float width = act.getScreenWidthInPixels();
215
            setupMenuWindow(act,width);
216
            }
217

  
218
          mMenuPopup.setFocusable(false);
219
          mMenuPopup.update();
220

  
221 194
          View popupView = mMenuPopup.getContentView();
222 195
          popupView.setSystemUiVisibility(RubikActivity.FLAGS);
223 196

  
224 197
          mMenuPopup.showAsDropDown(view, (int)(-width/12), margin, Gravity.CENTER);
225 198
          mMenuPopup.update(view, mMenuLayoutWidth, mMenuLayoutHeight);
226 199
          mMenuPopup.setFocusable(true);
227
          mMenuPopup.update();
228 200
          }
229 201
        }
230 202
      });
......
232 204

  
233 205
///////////////////////////////////////////////////////////////////////////////////////////////////
234 206

  
235
  private void setupObjectWindow(final RubikActivity act, final float width)
207
  private void setupObjectWindow(final RubikActivity act, final float width, final float height)
236 208
    {
237
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
238
    final View layout = layoutInflater.inflate(R.layout.popup_objects, null);
239
    GridLayout objectGrid = layout.findViewById(R.id.objectGrid);
209
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube2,R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2);
210

  
211
    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon);
212
    int cubeWidth = bd.getIntrinsicWidth();
213
    int margin = (int)(width*RubikActivity.LARGE_MARGIN);
214
    mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
215
    int upperBarHeight  = act.getHeightUpperBar();
216
    mMaxRowCount = (int)((height-upperBarHeight)/mObjectSize);
217
    GridLayout objectGrid = new GridLayout(act);
218
    mObjectPopup = new PopupWindow(act);
219
    mObjectPopup.setFocusable(true);
220

  
221
    if( mMaxRowCount<mRowCount )
222
      {
223
      ScrollView scrollView = new ScrollView(act);
224
      scrollView.addView(objectGrid);
225
      mObjectPopup.setContentView(scrollView);
226
      }
227
    else
228
      {
229
      mObjectPopup.setContentView(objectGrid);
230
      }
240 231

  
241 232
    int[] indices = ObjectList.getIndices();
242 233

  
......
258 249
      colSpecs[col] = GridLayout.spec(col);
259 250
      }
260 251

  
261
    mObjectPopup = new PopupWindow(act);
262
    mObjectPopup.setContentView(layout);
263
    mObjectPopup.setFocusable(true);
264
    int icon = RubikActivity.getDrawable(R.drawable.ui_small_cube2,R.drawable.ui_medium_cube2, R.drawable.ui_big_cube2, R.drawable.ui_huge_cube2);
265

  
266
    BitmapDrawable bd = (BitmapDrawable) act.getResources().getDrawable(icon);
267
    int cubeWidth = bd.getIntrinsicWidth();
268
    int margin = (int)(width*RubikActivity.LARGE_MARGIN);
269
    mObjectSize = (int)(cubeWidth + 2*margin + 0.5f);
270

  
271 252
    for(int object=0; object< ObjectList.NUM_OBJECTS; object++)
272 253
      {
273 254
      final ObjectList list = ObjectList.getObject(object);
......
574 555

  
575 556
          if(pre.isUINotBlocked())
576 557
            {
577
            mPlayPopup.dismiss();
558
            if( mPlayPopup!=null ) mPlayPopup.dismiss();
578 559
            mLevelValue = level;
579 560
            pre.scrambleObject(scrambles);
580 561
            }
src/main/res/layout/popup_objects.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
3
   android:id="@+id/objectGrid"
4
   android:layout_width="wrap_content"
5
   android:layout_height="wrap_content">
6
</GridLayout>

Also available in: Unified diff