Project

General

Profile

« Previous | Next » 

Revision b42c8399

Added by Leszek Koltunski 8 months ago

Major progress with version 2.0.0.

View differences:

src/main/AndroidManifest.xml
20 20
            android:value="${crashlyticsCollectionEnabled}"
21 21
        />
22 22

  
23
        <activity android:name="org.distorted.main.MainActivity" android:exported="true" android:screenOrientation="portrait">
23
        <activity android:name="org.distorted.main.MainActivity"
24
                  android:exported="true"
25
                  android:screenOrientation="portrait"
26
                  android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation">
24 27
            <intent-filter>
25 28
                <action android:name="android.intent.action.MAIN" />
26 29
                <category android:name="android.intent.category.LAUNCHER" />
src/main/java/org/distorted/main/MainActivity.java
13 13
import android.content.SharedPreferences;
14 14
import android.content.pm.PackageInfo;
15 15
import android.content.pm.PackageManager;
16
import android.content.res.Configuration;
16 17
import android.os.Build;
17 18
import android.os.Bundle;
18 19
import android.util.DisplayMetrics;
......
25 26
import android.widget.ScrollView;
26 27
import android.widget.TextView;
27 28

  
29
import androidx.annotation.NonNull;
28 30
import androidx.appcompat.app.AppCompatActivity;
29 31
import androidx.preference.PreferenceManager;
30 32

  
......
57 59
                                   | View.SYSTEM_UI_FLAG_FULLSCREEN
58 60
                                   | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
59 61

  
60
    private static final float RATIO_INSET= 0.09f;
61

  
62 62
    private boolean mJustStarted;
63 63
    private FirebaseAnalytics mFirebaseAnalytics;
64
    private static int mScreenWidth, mScreenHeight;
65 64
    private int mCurrentApiVersion;
66
    private int mHeightUpperBar;
67 65
    private String mOldVersion, mCurrVersion;
68 66
    private int mSolverIndex;
67
    private int mScreenWidth;
69 68
    private TextView mBubbleUpdates;
70 69
    private int mNumUpdates;
71 70
    private MainScrollGrid mGrid;
......
83 82
      mJustStarted = true;
84 83
      mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);
85 84

  
86
      DisplayMetrics displaymetrics = new DisplayMetrics();
87
      getWindowManager().getDefaultDisplay().getRealMetrics(displaymetrics);
88
      mScreenWidth =displaymetrics.widthPixels;
89
      mScreenHeight=displaymetrics.heightPixels;
90

  
91 85
      cutoutHack();
92 86
      computeHeights();
93 87

  
......
111 105

  
112 106
    private void computeHeights()
113 107
      {
114
      int barHeight    = (int)(mScreenHeight*RATIO_BAR);
115
      int scrollHeight = (int)(mScreenHeight*(1-2*RATIO_BAR));
116
      mHeightUpperBar  = barHeight;
117

  
108
      LinearLayout.LayoutParams pU = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, RATIO_BAR);
118 109
      LinearLayout layoutTop = findViewById(R.id.upperBar);
119
      ViewGroup.LayoutParams paramsTop = layoutTop.getLayoutParams();
120
      paramsTop.height = barHeight;
121
      layoutTop.setLayoutParams(paramsTop);
122

  
123
      LinearLayout layoutBot = findViewById(R.id.lowerBar);
124
      ViewGroup.LayoutParams paramsBot = layoutBot.getLayoutParams();
125
      paramsBot.height = barHeight;
126
      layoutBot.setLayoutParams(paramsBot);
110
      layoutTop.setLayoutParams(pU);
127 111

  
112
      LinearLayout.LayoutParams pS = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1-2*RATIO_BAR);
128 113
      ScrollView scroll = findViewById(R.id.objectScroll);
129
      ViewGroup.LayoutParams paramsScroll = scroll.getLayoutParams();
130
      paramsScroll.height = scrollHeight;
131
      scroll.setLayoutParams(paramsScroll);
114
      scroll.setLayoutParams(pS);
115

  
116
      LinearLayout.LayoutParams pL = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, RATIO_BAR);
117
      LinearLayout layoutBot = findViewById(R.id.lowerBar);
118
      layoutBot.setLayoutParams(pL);
132 119
      }
133 120

  
134 121
///////////////////////////////////////////////////////////////////////////////////////////////////
......
164 151
      {
165 152
      super.onAttachedToWindow();
166 153

  
154
      getWindowWidth(getResources().getConfiguration());
155
      mGrid = new MainScrollGrid();
156
      mGrid.createGrid(this,mScreenWidth);
157

  
167 158
      if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.P )
168 159
        {
169 160
        DisplayCutout cutout = getWindow().getDecorView().getRootWindowInsets().getDisplayCutout();
170 161
        int insetHeight = cutout!=null ? cutout.getSafeInsetTop() : 0;
171 162

  
172
        LinearLayout layoutHid = findViewById(R.id.hiddenBar);
173
        ViewGroup.LayoutParams paramsHid = layoutHid.getLayoutParams();
174
        paramsHid.height = (int)(insetHeight*RATIO_INSET);
175
        layoutHid.setLayoutParams(paramsHid);
176
        mHeightUpperBar += paramsHid.height;
163
        if( insetHeight>0 )
164
          {
165
          LinearLayout.LayoutParams pH = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, RATIO_BAR);
166
          LinearLayout layoutHid = findViewById(R.id.hiddenBar);
167
          layoutHid.setLayoutParams(pH);
168

  
169
          LinearLayout.LayoutParams pS = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0, 1-3*RATIO_BAR);
170
          ScrollView scroll = findViewById(R.id.objectScroll);
171
          scroll.setLayoutParams(pS);
172
          }
177 173
        }
178 174
      }
179 175

  
......
188 184
        }
189 185
      }
190 186

  
187
///////////////////////////////////////////////////////////////////////////////////////////////////
188

  
189
    private void getWindowWidth(Configuration conf)
190
      {
191
      int dpi = getResources().getDisplayMetrics().densityDpi;
192
      float conv = ((float) dpi/DisplayMetrics.DENSITY_DEFAULT);
193

  
194
      mScreenWidth = (int) (conf.screenWidthDp*conv + 0.5f);
195
      }
196

  
191 197
///////////////////////////////////////////////////////////////////////////////////////////////////
192 198

  
193 199
    @Override
......
201 207
        }
202 208
      }
203 209

  
210
///////////////////////////////////////////////////////////////////////////////////////////////////
211

  
212
    @Override
213
    public void onConfigurationChanged(@NonNull Configuration conf)
214
      {
215
      super.onConfigurationChanged(conf);
216

  
217
      getWindowWidth(conf);
218
      mGrid.updateGrid(this,mScreenWidth);
219
      }
220

  
204 221
///////////////////////////////////////////////////////////////////////////////////////////////////
205 222
    
206 223
    @Override
......
229 246
      network.signUpForUpdates(this);
230 247
      network.downloadUpdates(this);
231 248

  
232
      mGrid = new MainScrollGrid();
233
      mGrid.createGrid(this,mScreenWidth,mScreenHeight);
234

  
235 249
      if( mJustStarted )
236 250
        {
237 251
        mJustStarted = false;
......
312 326
        }
313 327
      }
314 328

  
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316
// PUBLIC API
317 329
///////////////////////////////////////////////////////////////////////////////////////////////////
318 330

  
319
    public FirebaseAnalytics getAnalytics()
331
    private void updateBubble(int num)
320 332
      {
321
      return mFirebaseAnalytics;
322
      }
323

  
324
///////////////////////////////////////////////////////////////////////////////////////////////////
333
      runOnUiThread(new Runnable()
334
        {
335
        @Override
336
        public void run()
337
          {
338
          mNumUpdates = num;
325 339

  
326
    public int getHeightUpperBar()
327
      {
328
      return mHeightUpperBar;
340
          if( num>0 )
341
            {
342
            String shownNum = String.valueOf(num);
343
            mBubbleUpdates.setText(shownNum);
344
            mBubbleUpdates.setVisibility(View.VISIBLE);
345
            int height = (int)(0.05f*mScreenWidth);
346
            mBubbleUpdates.setTextSize(TypedValue.COMPLEX_UNIT_PX,height);
347
            }
348
          else
349
            {
350
            mBubbleUpdates.setVisibility(View.INVISIBLE);
351
            }
352
          }
353
        });
329 354
      }
330 355

  
331 356
///////////////////////////////////////////////////////////////////////////////////////////////////
332

  
333
    public int getScreenWidthInPixels()
334
      {
335
      return mScreenWidth;
336
      }
337

  
357
// PUBLIC API
338 358
///////////////////////////////////////////////////////////////////////////////////////////////////
339 359

  
340
    public int getScreenHeightInPixels()
360
    public FirebaseAnalytics getAnalytics()
341 361
      {
342
      return mScreenHeight;
362
      return mFirebaseAnalytics;
343 363
      }
344 364

  
345 365
///////////////////////////////////////////////////////////////////////////////////////////////////
......
436 456
      diag.show(getSupportFragmentManager(), RubikDialogCreators.getDialogTag() );
437 457
      }
438 458

  
439
///////////////////////////////////////////////////////////////////////////////////////////////////
440

  
441
    public void updateBubble(int num)
442
      {
443
      runOnUiThread(new Runnable()
444
        {
445
        @Override
446
        public void run()
447
          {
448
          mNumUpdates = num;
449

  
450
          if( num>0 )
451
            {
452
            String shownNum = String.valueOf(num);
453
            mBubbleUpdates.setText(shownNum);
454
            mBubbleUpdates.setVisibility(View.VISIBLE);
455
            int height = (int)(0.05f*mScreenWidth);
456
            mBubbleUpdates.setTextSize(TypedValue.COMPLEX_UNIT_PX,height);
457
            }
458
          else
459
            {
460
            mBubbleUpdates.setVisibility(View.INVISIBLE);
461
            }
462
          }
463
        });
464
      }
465

  
466 459
///////////////////////////////////////////////////////////////////////////////////////////////////
467 460

  
468 461
    public void receiveUpdate(RubikUpdates updates)
......
477 470
      {
478 471
      mNumUpdates--;
479 472
      updateBubble(mNumUpdates);
480
      mGrid.updateGrid(this,mScreenWidth,mScreenHeight);
473
      mGrid.updateGrid(this,mScreenWidth);
481 474
      }
482 475

  
483 476
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/main/MainObjectPopup.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// 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
///////////////////////////////////////////////////////////////////////////////////////////////////
9

  
10
package org.distorted.main;
11

  
12
import static android.view.View.GONE;
13

  
14
import android.app.Activity;
15
import android.content.Context;
16
import android.util.TypedValue;
17
import android.view.Gravity;
18
import android.view.LayoutInflater;
19
import android.view.View;
20
import android.widget.Button;
21
import android.widget.LinearLayout;
22
import android.widget.PopupWindow;
23
import android.widget.TextView;
24

  
25
import org.distorted.objects.RubikObject;
26
import org.distorted.objects.RubikObjectList;
27

  
28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

  
30
public class MainObjectPopup
31
  {
32
  private static final float MENU_TEXT_SIZE= 0.024f;
33
  private static final float MENU_MARGIN   = 0.008f;
34
  private static final float BUTTON_HEIGHT = 0.150f;
35
  private static final float MENU_WIDTH    = 0.550f;
36

  
37
  public static final int LEVELS_SHOWN = 8;
38

  
39
  private final PopupWindow mPopup;
40
  private final int mMenuTextSize;
41

  
42
///////////////////////////////////////////////////////////////////////////////////////////////////
43

  
44
  MainObjectPopup(Activity act, int ordinal, int width, int height)
45
    {
46
    LayoutInflater layoutInflater = (LayoutInflater)act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
47
    final View layout = layoutInflater.inflate(R.layout.object_popup, null);
48
    mPopup = new PopupWindow(act);
49
    mPopup.setContentView(layout);
50
    mPopup.setFocusable(true);
51

  
52
    mMenuTextSize = (int)(height*MENU_TEXT_SIZE);
53
    int padding   = (int)(height*MENU_MARGIN);
54
    int marginH   = padding/2;
55
    int marginV   =-padding/4;
56
    layout.setPadding(padding,0,padding,0);
57
    int levelHeight = (int)(width*BUTTON_HEIGHT);
58

  
59
    RubikObject object = RubikObjectList.getObject(ordinal);
60

  
61
    Button b1 = layout.findViewById(R.id.objectSolver);
62

  
63
    if( object!=null && object.hasSolver() )
64
      {
65
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
66
      params.setMargins(marginH,marginV,marginH,marginV);
67
      b1.setLayoutParams(params);
68
      b1.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
69
      b1.setOnClickListener(new View.OnClickListener()
70
        {
71
        @Override
72
        public void onClick(View v)
73
          {
74

  
75
          }
76
        });
77
      }
78
    else b1.setVisibility(GONE);
79

  
80
    Button b2 = layout.findViewById(R.id.objectPattern);
81

  
82
    if( object!=null && object.hasPatterns() )
83
      {
84
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
85
      params.setMargins(marginH,marginV,marginH,marginV);
86
      b2.setLayoutParams(params);
87
      b2.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
88
      b2.setOnClickListener(new View.OnClickListener()
89
        {
90
        @Override
91
        public void onClick(View v)
92
          {
93

  
94
          }
95
        });
96
      }
97
    else b2.setVisibility(GONE);
98

  
99
    Button b3 = layout.findViewById(R.id.objectTutorial);
100

  
101
    if( object!=null && object.hasExtras() )
102
      {
103
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
104
      params.setMargins(marginH,marginV,marginH,marginV);
105
      b3.setLayoutParams(params);
106
      b3.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
107
      b3.setOnClickListener(new View.OnClickListener()
108
        {
109
        @Override
110
        public void onClick(View v)
111
          {
112

  
113
          }
114
        });
115
      }
116
    else b3.setVisibility(GONE);
117

  
118
    Button b4 = layout.findViewById(R.id.objectInfo);
119

  
120
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,levelHeight);
121
    params.setMargins(marginH,marginV,marginH,marginV);
122
    b4.setLayoutParams(params);
123
    b4.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
124
    b4.setOnClickListener( new View.OnClickListener()
125
      {
126
      @Override
127
      public void onClick(View v)
128
        {
129

  
130
        }
131
      });
132

  
133
    TextView levels = layout.findViewById(R.id.objectLevels);
134
    levels.setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
135

  
136
    setupLevelButtons(act,object,layout,width,padding,marginH);
137
    }
138

  
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140

  
141
  private void setupLevelButtons(Activity act, RubikObject object, View layout, int width,int padding, int margin)
142
    {
143
    int layoutWidth = (int)(width*MENU_WIDTH);
144
    int levelHeight = (int)(width*BUTTON_HEIGHT);
145
    int levelWidth  = (layoutWidth-4*padding)/3;
146

  
147
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(levelWidth,levelHeight);
148
    params.setMargins(margin,-margin,margin,-margin);
149

  
150
    Button[] level = new Button[LEVELS_SHOWN+1];
151

  
152
    level[0] = layout.findViewById(R.id.level0);
153
    level[1] = layout.findViewById(R.id.level1);
154
    level[2] = layout.findViewById(R.id.level2);
155
    level[3] = layout.findViewById(R.id.level3);
156
    level[4] = layout.findViewById(R.id.level4);
157
    level[5] = layout.findViewById(R.id.level5);
158
    level[6] = layout.findViewById(R.id.level6);
159
    level[7] = layout.findViewById(R.id.level7);
160
    level[8] = layout.findViewById(R.id.levelM);
161

  
162
    int numScramble = object==null ? 1 : object.getNumScramble();
163
    int min = Math.min(numScramble,LEVELS_SHOWN);
164

  
165
    if( numScramble>=1 && numScramble<=7 )
166
      {
167
      level[numScramble].setText(R.string.levelM);
168
      for(int i=numScramble+1; i<=8; i++) level[i].setVisibility(GONE);
169
      }
170

  
171
    for(int i=0; i<=min; i++)
172
      {
173
      final int ii = i;
174
      level[i].setTextSize(TypedValue.COMPLEX_UNIT_PX, mMenuTextSize);
175
      level[i].setLayoutParams(params);
176
      level[i].setPadding(0,0,0,0);
177
      level[i].setOnClickListener( new View.OnClickListener()
178
        {
179
        @Override
180
        public void onClick(View v)
181
          {
182

  
183
          }
184
        });
185
      }
186
    }
187

  
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189

  
190
  void show(View v)
191
    {
192
    View popupView = mPopup.getContentView();
193
    popupView.setSystemUiVisibility(MainActivity.FLAGS);
194
    mPopup.showAtLocation(v, Gravity.CENTER, 0, 0);
195
    }
196
  }
197

  
src/main/java/org/distorted/main/MainScrollGrid.java
9 9

  
10 10
package org.distorted.main;
11 11

  
12
import android.app.Activity;
13
import android.util.DisplayMetrics;
12 14
import android.view.View;
13 15
import android.widget.GridLayout;
14 16
import android.widget.ImageButton;
15 17

  
16 18
import org.distorted.helpers.PopupCreator;
17
import org.distorted.main_old.RubikActivity;
18 19
import org.distorted.objects.RubikObject;
19 20
import org.distorted.objects.RubikObjectList;
20 21

  
......
22 23

  
23 24
public class MainScrollGrid
24 25
  {
25
  public static final int NUM_COLUMNS  = 5;
26
  public static final int   NUM_COLUMNS  = 5;
27
  public static final float POPUP_PADDING= 0.035f;
28
  public static final float POPUP_MARGIN = 0.024f;
26 29

  
27 30
///////////////////////////////////////////////////////////////////////////////////////////////////
28 31

  
29
  public void createGrid(final MainActivity act, int scrW, int scrH)
32
  void createGrid(final Activity act, int windowWidth)
30 33
    {
31 34
    int numObjects = RubikObjectList.getNumObjects();
32 35
    int rowCount   = (numObjects + NUM_COLUMNS-1) / NUM_COLUMNS;
33 36
    int colCount   = NUM_COLUMNS;
34
    int objectSize = scrW / NUM_COLUMNS;
35
    int margin     = (int)(scrH*RubikActivity.POPUP_MARGIN);
36
    int padding    = (int)(scrH*RubikActivity.POPUP_PADDING);
37
    int objectSize = windowWidth / NUM_COLUMNS;
38
    int margin     = (int)(windowWidth*POPUP_MARGIN);
39
    int padding    = (int)(windowWidth*POPUP_PADDING);
37 40
    int cubeSize   = objectSize - 2*margin;
38 41

  
39 42
    GridLayout objectGrid = act.findViewById(R.id.objectGrid);
43
    objectGrid.removeAllViews();
44

  
40 45
    PopupCreator.createObjectGrid(objectGrid,act,rowCount,colCount,numObjects,margin,cubeSize,padding);
41 46

  
47
    DisplayMetrics displaymetrics = new DisplayMetrics();
48
    act.getWindowManager().getDefaultDisplay().getRealMetrics(displaymetrics);
49

  
42 50
    for(int child=0; child<numObjects; child++)
43 51
      {
44 52
      final RubikObject obj = RubikObjectList.getObject(child);
......
51 59
        @Override
52 60
        public void onClick(View v)
53 61
          {
54
          android.util.Log.e("D", "object "+ordinal+" clicked!");
62
          int w = displaymetrics.widthPixels;
63
          int h = displaymetrics.heightPixels;
64
          MainObjectPopup popup = new MainObjectPopup(act,ordinal,w,h);
65
          popup.show(v);
55 66
          }
56 67
        });
57 68
      }
......
59 70

  
60 71
///////////////////////////////////////////////////////////////////////////////////////////////////
61 72

  
62
  public void updateGrid(final MainActivity act, int scrW, int scrH)
73
  void updateGrid(final Activity act, int scrW)
63 74
    {
64 75
    act.runOnUiThread(new Runnable()
65 76
      {
66 77
      @Override
67 78
      public void run()
68 79
        {
69
        createGrid(act,scrW,scrH);
80
        createGrid(act,scrW);
70 81
        }
71 82
      });
72 83
    }
src/main/java/org/distorted/objects/RubikObject.java
29 29
import org.distorted.main_old.RubikActivity;
30 30
import org.distorted.objectlib.main.ObjectType;
31 31
import org.distorted.objectlib.patterns.RubikPatternList;
32
import org.distorted.solvers.ImplementedSolversList;
32 33

  
33 34
import static org.distorted.objectlib.main.TwistyObject.MESH_NICE;
34 35
import static org.distorted.main_old.RubikActivity.SHOW_DOWNLOADED_DEBUG;
......
50 51
  private int mNumScramble;
51 52
  private int mMeshState;
52 53
  private int mExtrasOrdinal;
54
  private int mSolverOrdinal;
53 55

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

  
......
70 72
    int patternOrdinal  = RubikPatternList.getOrdinal(ordinal);
71 73
    mPatterns = RubikPatternList.getPatterns(patternOrdinal);
72 74

  
75
    mSolverOrdinal = ImplementedSolversList.getSolverOrdinal(ordinal);
76

  
73 77
    mMeshState = MESH_NICE;
74 78
    mExtrasOrdinal = -1;
75 79

  
......
94 98
    mPatterns      = null;
95 99
    mMeshState     = MESH_NICE;
96 100
    mExtrasOrdinal = -1;
101
    mSolverOrdinal = -1;
97 102

  
98 103
    mMeshID        =  0;
99 104
    mJsonID        = -1;
......
304 309
    return mExtrasID!=0;
305 310
    }
306 311

  
312
///////////////////////////////////////////////////////////////////////////////////////////////////
313

  
314
  public boolean hasSolver()
315
    {
316
    return mSolverOrdinal>=0;
317
    }
318

  
319
///////////////////////////////////////////////////////////////////////////////////////////////////
320

  
321
  public int getSolverOrdinal()
322
    {
323
    return mSolverOrdinal;
324
    }
325

  
326
///////////////////////////////////////////////////////////////////////////////////////////////////
327

  
328
  public boolean hasPatterns()
329
    {
330
    return mPatterns!=null;
331
    }
332

  
307 333
///////////////////////////////////////////////////////////////////////////////////////////////////
308 334

  
309 335
  public String[][] getPatterns()
src/main/java/org/distorted/screens/RubikScreenPlay.java
596 596
///////////////////////////////////////////////////////////////////////////////////////////////////
597 597
// work around lame bugs in Android's version <= 10 pop-up and split-screen modes
598 598

  
599
  private void displayPopup(RubikActivity act, View view, PopupWindow window, int w, int h, int xoff, int yoff)
599
  private void displayPopup(Activity act, View view, PopupWindow window, int w, int h, int xoff, int yoff)
600 600
    {
601 601
    View topLayout = act.findViewById(R.id.relativeLayout);
602 602
    boolean isFullScreen;
src/main/java/org/distorted/solvers/ImplementedSolversList.java
53 53

  
54 54
///////////////////////////////////////////////////////////////////////////////////////////////////
55 55

  
56
  public static ImplementedSolversList getSolver(int ordinal)
56
  public static ImplementedSolversList getSolver(int solverOrdinal)
57 57
    {
58
    return objects[ordinal];
58
    return objects[solverOrdinal];
59
    }
60

  
61
///////////////////////////////////////////////////////////////////////////////////////////////////
62

  
63
  public static int getSolverOrdinal(int objectOrdinal)
64
    {
65
    for(int o=0; o<NUM_OBJECTS; o++)
66
      if( objects[o].mObject==objectOrdinal ) return o;
67

  
68
    return -1;
59 69
    }
60 70

  
61 71
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/res/layout/new_main.xml
3 3
    android:id="@+id/relativeLayout"
4 4
    android:layout_width="match_parent"
5 5
    android:layout_height="match_parent"
6
    android:weightSum="1.0"
6 7
    android:orientation="vertical">
7 8

  
8 9
    <LinearLayout
9 10
        android:id="@+id/hiddenBar"
10 11
        android:layout_width="match_parent"
11
        android:layout_height="wrap_content"
12
        android:layout_height="0dp"
13
        android:layout_weight="0.00"
12 14
        android:gravity="center"
13 15
        android:orientation="horizontal"
14 16
        android:background="@color/dark_grey">
......
17 19
    <LinearLayout
18 20
        android:id="@+id/upperBar"
19 21
        android:layout_width="match_parent"
20
        android:layout_height="wrap_content"
22
        android:layout_height="0dp"
23
        android:layout_weight="0.08"
21 24
        android:gravity="center"
22 25
        android:weightSum="1.0"
23 26
        android:orientation="horizontal"
......
77 80
    <ScrollView
78 81
        android:id="@+id/objectScroll"
79 82
        android:layout_width="match_parent"
80
        android:layout_height="wrap_content"
83
        android:layout_height="0dp"
84
        android:layout_weight="0.84"
81 85
        android:background="@color/grey">
82 86

  
83 87
        <GridLayout
......
91 95
    <LinearLayout
92 96
        android:id="@+id/lowerBar"
93 97
        android:layout_width="match_parent"
94
        android:layout_height="wrap_content"
98
        android:layout_height="0dp"
99
        android:layout_weight="0.08"
95 100
        android:orientation="horizontal"
96 101
        android:background="@color/dark_grey">
97 102

  
src/main/res/layout/object_popup.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<LinearLayout 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
   android:gravity="center"
7
    android:layout_marginTop="0dp"
8
    android:layout_marginBottom="0dp"
9
    android:padding="0dp"
10
   android:orientation="vertical">
11

  
12
   <Button
13
      android:id="@+id/objectSolver"
14
      android:text="@string/object_solver"
15
      android:layout_width="match_parent"
16
      android:layout_height="wrap_content"
17
      android:paddingRight="10dp"
18
      android:paddingLeft="10dp"
19
      android:singleLine="true"
20
      android:backgroundTint="@color/dark_grey"
21
      android:gravity="center"/>
22

  
23
   <Button
24
      android:id="@+id/objectPattern"
25
      android:text="@string/object_pattern"
26
      android:layout_width="match_parent"
27
      android:layout_height="wrap_content"
28
      android:paddingRight="10dp"
29
      android:paddingLeft="10dp"
30
      android:singleLine="true"
31
      android:backgroundTint="@color/dark_grey"
32
      android:gravity="center"/>
33

  
34
   <Button
35
      android:id="@+id/objectTutorial"
36
      android:text="@string/object_tutorial"
37
      android:layout_width="match_parent"
38
      android:layout_height="wrap_content"
39
      android:paddingRight="10dp"
40
      android:paddingLeft="10dp"
41
      android:singleLine="true"
42
      android:backgroundTint="@color/dark_grey"
43
      android:gravity="center"/>
44

  
45
   <Button
46
        android:id="@+id/objectInfo"
47
        android:text="@string/object_info"
48
        android:layout_width="match_parent"
49
        android:layout_height="wrap_content"
50
        android:paddingRight="10dp"
51
        android:paddingLeft="10dp"
52
        android:singleLine="true"
53
        android:backgroundTint="@color/dark_grey"
54
        android:gravity="center"/>
55

  
56
   <TextView
57
       android:id="@+id/objectLevels"
58
       android:layout_width="match_parent"
59
       android:text="@string/levels"
60
       android:layout_height="wrap_content"
61
       android:gravity="center"/>
62

  
63
   <LinearLayout
64
        android:layout_width="match_parent"
65
        android:layout_height="wrap_content"
66
        android:gravity="left"
67
        android:orientation="horizontal">
68

  
69
        <Button
70
           android:id="@+id/level0"
71
           android:text="@string/level0"
72
           android:layout_width="wrap_content"
73
           android:layout_height="wrap_content"
74
           android:paddingRight="10dp"
75
           android:paddingLeft="10dp"
76
           android:backgroundTint="@color/dark_grey"/>
77
        <Button
78
           android:id="@+id/level1"
79
           android:text="@string/level1"
80
           android:layout_width="wrap_content"
81
           android:layout_height="wrap_content"
82
           android:paddingRight="10dp"
83
           android:paddingLeft="10dp"
84
           android:backgroundTint="@color/dark_grey"/>
85
        <Button
86
           android:id="@+id/level2"
87
           android:text="@string/level2"
88
           android:layout_width="wrap_content"
89
           android:layout_height="wrap_content"
90
           android:paddingRight="10dp"
91
           android:paddingLeft="10dp"
92
           android:backgroundTint="@color/dark_grey"/>
93
   </LinearLayout>
94

  
95
   <LinearLayout
96
        android:layout_width="match_parent"
97
        android:layout_height="wrap_content"
98
        android:gravity="left"
99
        android:orientation="horizontal">
100

  
101
        <Button
102
           android:id="@+id/level3"
103
           android:text="@string/level3"
104
           android:layout_width="wrap_content"
105
           android:layout_height="wrap_content"
106
           android:paddingRight="10dp"
107
           android:paddingLeft="10dp"
108
           android:backgroundTint="@color/dark_grey"/>
109
        <Button
110
           android:id="@+id/level4"
111
           android:text="@string/level4"
112
           android:layout_width="wrap_content"
113
           android:layout_height="wrap_content"
114
           android:paddingRight="10dp"
115
           android:paddingLeft="10dp"
116
           android:backgroundTint="@color/dark_grey"/>
117
        <Button
118
           android:id="@+id/level5"
119
           android:text="@string/level5"
120
           android:layout_width="wrap_content"
121
           android:layout_height="wrap_content"
122
           android:paddingRight="10dp"
123
           android:paddingLeft="10dp"
124
           android:backgroundTint="@color/dark_grey"/>
125
   </LinearLayout>
126

  
127
   <LinearLayout
128
        android:layout_width="match_parent"
129
        android:layout_height="wrap_content"
130
        android:gravity="left"
131
        android:orientation="horizontal">
132

  
133
        <Button
134
           android:id="@+id/level6"
135
           android:text="@string/level6"
136
           android:layout_width="wrap_content"
137
           android:layout_height="wrap_content"
138
           android:paddingRight="10dp"
139
           android:paddingLeft="10dp"
140
           android:backgroundTint="@color/dark_grey"/>
141
        <Button
142
           android:id="@+id/level7"
143
           android:text="@string/level7"
144
           android:layout_width="wrap_content"
145
           android:layout_height="wrap_content"
146
           android:paddingRight="10dp"
147
           android:paddingLeft="10dp"
148
           android:backgroundTint="@color/dark_grey"/>
149
        <Button
150
           android:id="@+id/levelM"
151
           android:text="@string/levelM"
152
           android:layout_width="wrap_content"
153
           android:layout_height="wrap_content"
154
           android:paddingRight="10dp"
155
           android:paddingLeft="10dp"
156
           android:backgroundTint="@color/dark_grey"/>
157
   </LinearLayout>
158
</LinearLayout>
src/main/res/values-de/strings.xml
54 54
    <string name="email">Melden Sie einen Fehler, schlagen Sie eine Funktion vor:</string>
55 55
    <string name="exit_app">App beenden?</string>
56 56

  
57
    <string name="object_solver">Löser</string>
58
    <string name="object_pattern">Muster</string>
59
    <string name="object_tutorial">Tutorials</string>
60
    <string name="object_info">Info</string>
61

  
57 62
    <string name="stars">Sterne</string>
58 63
    <string name="scores">Highscores</string>
59 64
    <string name="patterns">Hübsche Muster</string>
60 65
    <string name="control">Den Würfel steuern</string>
61 66
    <string name="solver">Löser</string>
62
    <string name="tutorials">Lernprogrammen</string>
67
    <string name="tutorials">Tutorials</string>
63 68
    <string name="about">Über die App</string>
64 69
    <string name="bandaged">Bandaged</string>
65 70

  
src/main/res/values-es/strings.xml
54 54
    <string name="email">Reportar un error, sugerir una función:</string>
55 55
    <string name="exit_app">¿Salir de la aplicación?</string>
56 56

  
57
    <string name="object_solver">Solucionador</string>
58
    <string name="object_pattern">Patrones</string>
59
    <string name="object_tutorial">Tutoriales</string>
60
    <string name="object_info">Información</string>
61

  
57 62
    <string name="stars">Estrellas</string>
58 63
    <string name="scores">Leaderboard</string>
59 64
    <string name="patterns">Patrones</string>
src/main/res/values-fr/strings.xml
54 54
    <string name="email">Signaler un bug, suggérer une fonctionnalité :</string>
55 55
    <string name="exit_app">Quitter l\'application ?</string>
56 56

  
57
    <string name="object_solver">Solveur</string>
58
    <string name="object_pattern">Motifs</string>
59
    <string name="object_tutorial">Tutoriels</string>
60
    <string name="object_info">Info</string>
61

  
57 62
    <string name="stars">Étoiles</string>
58 63
    <string name="scores">Meilleurs scores</string>
59 64
    <string name="patterns">Jolis motifs</string>
src/main/res/values-ja/strings.xml
54 54
    <string name="email">バグを報告し、機能を提案してください:</string>
55 55
    <string name="exit_app">アプリを終了しますか?</string>
56 56

  
57
    <string name="object_solver">ソルバー</string>
58
    <string name="object_pattern">パターン</string>
59
    <string name="object_tutorial">チュートリアル</string>
60
    <string name="object_info">情報</string>
61

  
57 62
    <string name="stars">星</string>
58 63
    <string name="scores">ハイスコア</string>
59 64
    <string name="patterns">プリティパターン</string>
src/main/res/values-ko/strings.xml
54 54
    <string name="email">버그 신고, 기능 제안:</string>
55 55
    <string name="exit_app">앱을 종료하시겠습니까?</string>
56 56

  
57
    <string name="object_solver">솔버</string>
58
    <string name="object_pattern">패턴</string>
59
    <string name="object_tutorial">튜토리얼</string>
60
    <string name="object_info">정보</string>
61

  
57 62
    <string name="stars">별</string>
58 63
    <string name="scores">고득점</string>
59 64
    <string name="patterns">예쁜 패턴</string>
src/main/res/values-pl/strings.xml
54 54
    <string name="email">Zaraportuj błąd, zadaj pytanie:</string>
55 55
    <string name="exit_app">Wyjść z apki?</string>
56 56

  
57
    <string name="object_solver">Rozwiązywacz</string>
58
    <string name="object_pattern">Wzory</string>
59
    <string name="object_tutorial">Tutoriale</string>
60
    <string name="object_info">Info</string>
61

  
57 62
    <string name="stars">Gwiazdki</string>
58 63
    <string name="scores">Lista najlepszych</string>
59 64
    <string name="patterns">Piękne Wzory</string>
src/main/res/values-ru/strings.xml
54 54
    <string name="email">Сообщить об ошибке, задать вопрос:</string>
55 55
    <string name="exit_app">Выйти из приложения?</string>
56 56

  
57
    <string name="object_solver">Решатель</string>
58
    <string name="object_pattern">Узоры</string>
59
    <string name="object_tutorial">Учебники</string>
60
    <string name="object_info">Инфо</string>
61

  
57 62
    <string name="stars">Звезды</string>
58 63
    <string name="scores">Высокие баллы</string>
59 64
    <string name="patterns">Красивые узоры</string>
src/main/res/values-zh-rCN/strings.xml
54 54
    <string name="email">报告错误,提出问题:</string>
55 55
    <string name="exit_app">退出应用程序?</string>
56 56

  
57
    <string name="object_solver">求解器</string>
58
    <string name="object_pattern">图案</string>
59
    <string name="object_tutorial">教程</string>
60
    <string name="object_info">信息</string>
61

  
57 62
    <string name="stars">星星</string>
58 63
    <string name="scores">高分</string>
59 64
    <string name="patterns">模式</string>
src/main/res/values-zh-rTW/strings.xml
54 54
    <string name="email">报告错误,提出问题:</string>
55 55
    <string name="exit_app">退出應用程式?</string>
56 56

  
57
    <string name="object_solver">求解器</string>
58
    <string name="object_pattern">圖案</string>
59
    <string name="object_tutorial">教學</string>
60
    <string name="object_info">資訊</string>
61

  
57 62
    <string name="stars">星星</string>
58 63
    <string name="scores">高分</string>
59 64
    <string name="patterns">模式</string>
src/main/res/values/strings.xml
71 71
    <string name="buy_string1">You have %1$d stars.</string>
72 72
    <string name="buy_string2">Earn stars by solving puzzles. You can also buy stars.</string>
73 73

  
74
    <string name="object_solver">Solver</string>
75
    <string name="object_pattern">Patterns</string>
76
    <string name="object_tutorial">Tutorials</string>
77
    <string name="object_info">Info</string>
78

  
79
    <string name="level0" translatable="false">0</string>
74 80
    <string name="level1" translatable="false">1</string>
75 81
    <string name="level2" translatable="false">2</string>
76 82
    <string name="level3" translatable="false">3</string>

Also available in: Unified diff