Project

General

Profile

« Previous | Next » 

Revision 40d02f47

Added by Leszek Koltunski about 1 month ago

  • ID 40d02f47b58d01bbf64af7445aeb7e5460fb7357
  • Child a96b9267

Initial commit

View differences:

.gitignore
1
/build
build.gradle
1
plugins {
2
    id 'com.android.application'
3
}
4

  
5
android {
6
    namespace 'org.distorted.phasedsolver'
7
    compileSdk 34
8

  
9
    defaultConfig {
10
        applicationId "org.distorted.phasedsolver"
11
        minSdk 21
12
        targetSdk 34
13
        versionCode 1
14
        versionName "1.0"
15

  
16
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
17
    }
18

  
19
    buildTypes {
20
        release {
21
            minifyEnabled false
22
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
23
        }
24
    }
25
    compileOptions {
26
        sourceCompatibility JavaVersion.VERSION_1_8
27
        targetCompatibility JavaVersion.VERSION_1_8
28
    }
29
}
30

  
31
dependencies {
32
    api project(':distorted-objectlib')
33
    implementation project(':distorted-os-android')
34
    implementation ('androidx.preference:preference:1.2.1')
35
}
36

  
proguard-rules.pro
1
# Add project specific ProGuard rules here.
2
# You can control the set of applied configuration files using the
3
# proguardFiles setting in build.gradle.
4
#
5
# For more details, see
6
#   http://developer.android.com/guide/developing/tools/proguard.html
7

  
8
# If your project uses WebView with JS, uncomment the following
9
# and specify the fully qualified class name to the JavaScript interface
10
# class:
11
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12
#   public *;
13
#}
14

  
15
# Uncomment this to preserve the line number information for
16
# debugging stack traces.
17
#-keepattributes SourceFile,LineNumberTable
18

  
19
# If you keep the line number information, uncomment this to
20
# hide the original source file name.
21
#-renamesourcefileattribute SourceFile
src/main/AndroidManifest.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3

  
4
    <uses-feature android:glEsVersion="0x00030000" android:required="true" />
5
    <uses-feature android:name="android.hardware.faketouch" android:required="true" />
6

  
7
    <supports-screens android:largeScreens="true" android:xlargeScreens="true" />
8

  
9
    <application
10
        android:allowBackup="true"
11
        android:icon="@mipmap/ic_launcher"
12
        android:label="@string/app_name"
13
        android:supportsRtl="true"
14
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
15

  
16
        <activity android:name="org.distorted.phasedsolver.SolverActivity" android:exported="true" android:screenOrientation="portrait">
17
            <intent-filter>
18
                <action android:name="android.intent.action.MAIN" />
19
                <category android:name="android.intent.category.LAUNCHER" />
20
            </intent-filter>
21
        </activity>
22
    </application>
23
</manifest>
src/main/java/org/distorted/phasedsolver/SolverActivity.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 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.phasedsolver;
11

  
12
import static org.distorted.objectlib.main.TwistyObject.MODE_NORM;
13

  
14
import android.app.Activity;
15
import android.content.SharedPreferences;
16
import android.os.Bundle;
17
import android.view.View;
18
import androidx.preference.PreferenceManager;
19

  
20
import org.distorted.library.main.DistortedLibrary;
21
import org.distorted.objectlib.main.InitAssets;
22
import org.distorted.objectlib.main.ObjectControl;
23
import org.distorted.objectlib.metadata.ListObjects;
24
import org.distorted.os.OSInterface;
25

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

  
28
public class SolverActivity extends Activity
29
{
30
    private InitAssets mAsset;
31
    private SharedPreferences mPreferences;
32

  
33
///////////////////////////////////////////////////////////////////////////////////////////////////
34

  
35
    @Override
36
    protected void onCreate(Bundle icicle) 
37
      {
38
      super.onCreate(icicle);
39
      mPreferences = PreferenceManager.getDefaultSharedPreferences(this);
40
      DistortedLibrary.onCreate();
41
      setContentView(R.layout.mainlayout);
42
      SolverSurfaceView view = findViewById(R.id.solverView);
43
      OSInterface os = view.getInterface();
44
      mAsset = new InitAssets(null,null,os);
45
      }
46

  
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48
    
49
    @Override
50
    protected void onPause() 
51
      {
52
      super.onPause();
53
      SolverSurfaceView view = findViewById(R.id.solverView);
54
      view.onPause();
55
      DistortedLibrary.onPause();
56

  
57
      savePreferences();
58
      }
59

  
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
    
62
    @Override
63
    protected void onResume() 
64
      {
65
      super.onResume();
66
      SolverSurfaceView view = findViewById(R.id.solverView);
67
      view.onResume();
68
      DistortedLibrary.onResume();
69

  
70
      restorePreferences();
71

  
72
      ObjectControl control = getControl();
73
      control.changeObject( ListObjects.CUBE_3.ordinal(), MODE_NORM, mAsset);
74
      }
75
    
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77
    
78
    @Override
79
    protected void onDestroy() 
80
      {
81
      DistortedLibrary.onDestroy();
82
      super.onDestroy();
83
      }
84

  
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86

  
87
    private ObjectControl getControl()
88
      {
89
      SolverSurfaceView view = findViewById(R.id.solverView);
90
      return view.getObjectControl();
91
      }
92

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

  
95
    private void savePreferences()
96
      {
97
      SharedPreferences.Editor editor = mPreferences.edit();
98
      SolverSurfaceView view = findViewById(R.id.solverView);
99
      OSInterface os = view.getInterface();
100
      os.setEditor(editor);
101
      view.getObjectControl().savePreferences();
102

  
103
      editor.apply();
104
      }
105

  
106
///////////////////////////////////////////////////////////////////////////////////////////////////
107

  
108
    private void restorePreferences()
109
      {
110
      SolverSurfaceView view = findViewById(R.id.solverView);
111
      OSInterface os = view.getInterface();
112
      os.setPreferences(mPreferences);
113
      view.getObjectControl().restorePreferences();
114
      }
115

  
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117

  
118
    public void Reset(View v)
119
      {
120

  
121
      }
122

  
123
///////////////////////////////////////////////////////////////////////////////////////////////////
124

  
125
    public void Solve(View v)
126
      {
127

  
128
      }
129

  
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131

  
132
    public void Left(View v)
133
      {
134

  
135
      }
136

  
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138

  
139
    public void Right(View v)
140
      {
141

  
142
      }
143
}
src/main/java/org/distorted/phasedsolver/SolverObjectLibInterface.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 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.phasedsolver;
11

  
12
import org.distorted.objectlib.helpers.ObjectLibInterface;
13

  
14
///////////////////////////////////////////////////////////////////////////////////////////////////
15

  
16
public class SolverObjectLibInterface implements ObjectLibInterface
17
{
18
  public void onWinEffectFinished(long startTime, long endTime, String debug, int scrambleNum) { }
19
  public void onScrambleEffectFinished() { }
20
  public void onBeginRotation() { }
21
  public void onSolved() { }
22
  public void onObjectCreated(long time) { }
23
  public void onRemoveRotation(int axis, int row, int angle) { }
24
  public void failedToDrag() { }
25
  public void reportBlockProblem(int type, int place, long pause, long resume, long time) { }
26
  public void reportProblem(String problem, boolean reportException) {}
27

  
28
  public void onReplaceModeDown(int cubit, int face) { }
29
  public void onReplaceModeUp() { }
30
  public void reportJSONError(String error, int ordinal) { }
31
}
src/main/java/org/distorted/phasedsolver/SolverRenderer.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 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.phasedsolver;
11

  
12
import android.content.res.Resources;
13
import android.opengl.GLSurfaceView;
14

  
15
import org.distorted.library.effect.EffectType;
16
import org.distorted.library.effect.PostprocessEffectBorder;
17
import org.distorted.library.effect.VertexEffectQuaternion;
18
import org.distorted.library.effect.VertexEffectRotate;
19
import org.distorted.library.main.DistortedLibrary;
20
import org.distorted.library.main.DistortedScreen;
21
import org.distorted.library.mesh.MeshBase;
22
import org.distorted.objectlib.effects.BaseEffect;
23
import org.distorted.objectlib.main.ObjectControl;
24

  
25
import java.io.InputStream;
26

  
27
import javax.microedition.khronos.egl.EGLConfig;
28
import javax.microedition.khronos.opengles.GL10;
29

  
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

  
32
class SolverRenderer implements GLSurfaceView.Renderer, DistortedLibrary.LibraryUser
33
{
34
    static final float BRIGHTNESS = 0.30f;
35

  
36
    private final SolverSurfaceView mView;
37
    private final DistortedScreen mScreen;
38
    private final Resources mResources;
39

  
40
///////////////////////////////////////////////////////////////////////////////////////////////////
41

  
42
    SolverRenderer(SolverSurfaceView v)
43
      {
44
      mView = v;
45
      mResources = v.getResources();
46
      mScreen = new DistortedScreen();
47
      mScreen.glClearColor(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS, 1.0f);
48
      }
49

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

  
52
    DistortedScreen getScreen()
53
      {
54
      return mScreen;
55
      }
56

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

  
59
    public void onDrawFrame(GL10 glUnused) 
60
      {
61
      long time = System.currentTimeMillis();
62
      mView.getObjectControl().preRender();
63
      mScreen.render(time);
64
      }
65

  
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
    
68
    public void onSurfaceChanged(GL10 glUnused, int width, int height) 
69
      {
70
      mScreen.resize(width,height);
71
      mView.setScreenSize(width,height);
72
      }
73

  
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75
    
76
    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) 
77
      {
78
      DistortedLibrary.setMax(EffectType.VERTEX,ObjectControl.MAX_QUATS+1);
79
      MeshBase.setMaxEffComponents(ObjectControl.MAX_MOVING_PARTS);
80

  
81
      VertexEffectRotate.enable();
82
      VertexEffectQuaternion.enable();
83
      PostprocessEffectBorder.enable();
84
      BaseEffect.Type.enableEffects();
85

  
86
      DistortedLibrary.onSurfaceCreated(this);
87
      }
88

  
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

  
91
    public void distortedException(Exception ex)
92
      {
93
      android.util.Log.e("Solver", ex.getMessage() );
94
      }
95

  
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

  
98
    public InputStream localFile(int fileID)
99
      {
100
      return mResources.openRawResource(fileID);
101
      }
102

  
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

  
105
    public void logMessage(String message)
106
      {
107
      android.util.Log.e("Solver", message );
108
      }
109
}
src/main/java/org/distorted/phasedsolver/SolverSurfaceView.java
1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2024 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.phasedsolver;
11

  
12
import static org.distorted.objectlib.main.ObjectControl.MODE_ROTATE;
13

  
14
import android.app.ActivityManager;
15
import android.content.Context;
16
import android.content.pm.ConfigurationInfo;
17
import android.opengl.GLSurfaceView;
18
import android.util.AttributeSet;
19
import android.view.MotionEvent;
20

  
21
import org.distorted.objectlib.main.ObjectControl;
22
import org.distorted.objectlib.main.TwistyObjectNode;
23
import org.distorted.os.OSInterface;
24

  
25
///////////////////////////////////////////////////////////////////////////////////////////////////
26

  
27
class SolverSurfaceView extends GLSurfaceView
28
{
29
    private ObjectControl mObjectController;
30
    private OSInterface mInterface;
31
    private SolverRenderer mRenderer;
32
    private int mScreenWidth;
33
    private boolean mCreated;
34

  
35
///////////////////////////////////////////////////////////////////////////////////////////////////
36

  
37
    void setScreenSize(int width, int height)
38
      {
39
      mScreenWidth = width;
40
      mObjectController.setScreenSizeAndScaling(width,height, Math.min(width,height) );
41

  
42
      if( !mCreated )
43
        {
44
        mCreated = true;
45
        mObjectController.createNode(width,height);
46
        TwistyObjectNode objectNode = mObjectController.getNode();
47
        mRenderer.getScreen().attach(objectNode);
48
        }
49
      }
50

  
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

  
53
    int getScreenWidth()
54
      {
55
      return mScreenWidth;
56
      }
57

  
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59

  
60
    ObjectControl getObjectControl()
61
      {
62
      return mObjectController;
63
      }
64

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

  
67
    OSInterface getInterface()
68
      {
69
      return mInterface;
70
      }
71

  
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73

  
74
    SolverRenderer getRenderer()
75
      {
76
      return mRenderer;
77
      }
78

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

  
81
    public SolverSurfaceView(Context context, AttributeSet attrs)
82
      {
83
      super(context,attrs);
84

  
85
      mCreated = false;
86

  
87
      if(!isInEditMode())
88
        {
89
        SolverActivity act = (SolverActivity)context;
90
        SolverObjectLibInterface ref = new SolverObjectLibInterface();
91
        mInterface = new OSInterface(act,ref);
92
        mObjectController = new ObjectControl(mInterface);
93

  
94
        mRenderer = new SolverRenderer(this);
95
        final ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
96
        final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
97
        int esVersion = configurationInfo.reqGlEsVersion>>16;
98
        setEGLContextClientVersion(esVersion);
99
        setRenderer(mRenderer);
100
        }
101
      }
102

  
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

  
105
    @Override
106
    public void onPause()
107
      {
108
      super.onPause();
109
      mObjectController.onPause();
110
      }
111

  
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113

  
114
    @Override
115
    public void onResume()
116
      {
117
      super.onResume();
118
      mObjectController.onResume();
119
      }
120

  
121
///////////////////////////////////////////////////////////////////////////////////////////////////
122

  
123
    @Override
124
    public boolean onTouchEvent(MotionEvent event)
125
      {
126
      mInterface.setMotionEvent(event);
127
      return mObjectController.onTouchEvent(MODE_ROTATE);
128
      }
129
}
130

  
src/main/res/drawable-v24/ic_launcher_foreground.xml
1
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2
    xmlns:aapt="http://schemas.android.com/aapt"
3
    android:width="108dp"
4
    android:height="108dp"
5
    android:viewportWidth="108"
6
    android:viewportHeight="108">
7
    <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
8
        <aapt:attr name="android:fillColor">
9
            <gradient
10
                android:endX="85.84757"
11
                android:endY="92.4963"
12
                android:startX="42.9492"
13
                android:startY="49.59793"
14
                android:type="linear">
15
                <item
16
                    android:color="#44000000"
17
                    android:offset="0.0" />
18
                <item
19
                    android:color="#00000000"
20
                    android:offset="1.0" />
21
            </gradient>
22
        </aapt:attr>
23
    </path>
24
    <path
25
        android:fillColor="#FFFFFF"
26
        android:fillType="nonZero"
27
        android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
28
        android:strokeWidth="1"
29
        android:strokeColor="#00000000" />
30
</vector>
src/main/res/drawable/ic_launcher_background.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<vector xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:width="108dp"
4
    android:height="108dp"
5
    android:viewportWidth="108"
6
    android:viewportHeight="108">
7
    <path
8
        android:fillColor="#3DDC84"
9
        android:pathData="M0,0h108v108h-108z" />
10
    <path
11
        android:fillColor="#00000000"
12
        android:pathData="M9,0L9,108"
13
        android:strokeWidth="0.8"
14
        android:strokeColor="#33FFFFFF" />
15
    <path
16
        android:fillColor="#00000000"
17
        android:pathData="M19,0L19,108"
18
        android:strokeWidth="0.8"
19
        android:strokeColor="#33FFFFFF" />
20
    <path
21
        android:fillColor="#00000000"
22
        android:pathData="M29,0L29,108"
23
        android:strokeWidth="0.8"
24
        android:strokeColor="#33FFFFFF" />
25
    <path
26
        android:fillColor="#00000000"
27
        android:pathData="M39,0L39,108"
28
        android:strokeWidth="0.8"
29
        android:strokeColor="#33FFFFFF" />
30
    <path
31
        android:fillColor="#00000000"
32
        android:pathData="M49,0L49,108"
33
        android:strokeWidth="0.8"
34
        android:strokeColor="#33FFFFFF" />
35
    <path
36
        android:fillColor="#00000000"
37
        android:pathData="M59,0L59,108"
38
        android:strokeWidth="0.8"
39
        android:strokeColor="#33FFFFFF" />
40
    <path
41
        android:fillColor="#00000000"
42
        android:pathData="M69,0L69,108"
43
        android:strokeWidth="0.8"
44
        android:strokeColor="#33FFFFFF" />
45
    <path
46
        android:fillColor="#00000000"
47
        android:pathData="M79,0L79,108"
48
        android:strokeWidth="0.8"
49
        android:strokeColor="#33FFFFFF" />
50
    <path
51
        android:fillColor="#00000000"
52
        android:pathData="M89,0L89,108"
53
        android:strokeWidth="0.8"
54
        android:strokeColor="#33FFFFFF" />
55
    <path
56
        android:fillColor="#00000000"
57
        android:pathData="M99,0L99,108"
58
        android:strokeWidth="0.8"
59
        android:strokeColor="#33FFFFFF" />
60
    <path
61
        android:fillColor="#00000000"
62
        android:pathData="M0,9L108,9"
63
        android:strokeWidth="0.8"
64
        android:strokeColor="#33FFFFFF" />
65
    <path
66
        android:fillColor="#00000000"
67
        android:pathData="M0,19L108,19"
68
        android:strokeWidth="0.8"
69
        android:strokeColor="#33FFFFFF" />
70
    <path
71
        android:fillColor="#00000000"
72
        android:pathData="M0,29L108,29"
73
        android:strokeWidth="0.8"
74
        android:strokeColor="#33FFFFFF" />
75
    <path
76
        android:fillColor="#00000000"
77
        android:pathData="M0,39L108,39"
78
        android:strokeWidth="0.8"
79
        android:strokeColor="#33FFFFFF" />
80
    <path
81
        android:fillColor="#00000000"
82
        android:pathData="M0,49L108,49"
83
        android:strokeWidth="0.8"
84
        android:strokeColor="#33FFFFFF" />
85
    <path
86
        android:fillColor="#00000000"
87
        android:pathData="M0,59L108,59"
88
        android:strokeWidth="0.8"
89
        android:strokeColor="#33FFFFFF" />
90
    <path
91
        android:fillColor="#00000000"
92
        android:pathData="M0,69L108,69"
93
        android:strokeWidth="0.8"
94
        android:strokeColor="#33FFFFFF" />
95
    <path
96
        android:fillColor="#00000000"
97
        android:pathData="M0,79L108,79"
98
        android:strokeWidth="0.8"
99
        android:strokeColor="#33FFFFFF" />
100
    <path
101
        android:fillColor="#00000000"
102
        android:pathData="M0,89L108,89"
103
        android:strokeWidth="0.8"
104
        android:strokeColor="#33FFFFFF" />
105
    <path
106
        android:fillColor="#00000000"
107
        android:pathData="M0,99L108,99"
108
        android:strokeWidth="0.8"
109
        android:strokeColor="#33FFFFFF" />
110
    <path
111
        android:fillColor="#00000000"
112
        android:pathData="M19,29L89,29"
113
        android:strokeWidth="0.8"
114
        android:strokeColor="#33FFFFFF" />
115
    <path
116
        android:fillColor="#00000000"
117
        android:pathData="M19,39L89,39"
118
        android:strokeWidth="0.8"
119
        android:strokeColor="#33FFFFFF" />
120
    <path
121
        android:fillColor="#00000000"
122
        android:pathData="M19,49L89,49"
123
        android:strokeWidth="0.8"
124
        android:strokeColor="#33FFFFFF" />
125
    <path
126
        android:fillColor="#00000000"
127
        android:pathData="M19,59L89,59"
128
        android:strokeWidth="0.8"
129
        android:strokeColor="#33FFFFFF" />
130
    <path
131
        android:fillColor="#00000000"
132
        android:pathData="M19,69L89,69"
133
        android:strokeWidth="0.8"
134
        android:strokeColor="#33FFFFFF" />
135
    <path
136
        android:fillColor="#00000000"
137
        android:pathData="M19,79L89,79"
138
        android:strokeWidth="0.8"
139
        android:strokeColor="#33FFFFFF" />
140
    <path
141
        android:fillColor="#00000000"
142
        android:pathData="M29,19L29,89"
143
        android:strokeWidth="0.8"
144
        android:strokeColor="#33FFFFFF" />
145
    <path
146
        android:fillColor="#00000000"
147
        android:pathData="M39,19L39,89"
148
        android:strokeWidth="0.8"
149
        android:strokeColor="#33FFFFFF" />
150
    <path
151
        android:fillColor="#00000000"
152
        android:pathData="M49,19L49,89"
153
        android:strokeWidth="0.8"
154
        android:strokeColor="#33FFFFFF" />
155
    <path
156
        android:fillColor="#00000000"
157
        android:pathData="M59,19L59,89"
158
        android:strokeWidth="0.8"
159
        android:strokeColor="#33FFFFFF" />
160
    <path
161
        android:fillColor="#00000000"
162
        android:pathData="M69,19L69,89"
163
        android:strokeWidth="0.8"
164
        android:strokeColor="#33FFFFFF" />
165
    <path
166
        android:fillColor="#00000000"
167
        android:pathData="M79,19L79,89"
168
        android:strokeWidth="0.8"
169
        android:strokeColor="#33FFFFFF" />
170
</vector>
src/main/res/layout/mainlayout.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:id="@+id/relativeLayout"
4
    android:layout_width="match_parent"
5
    android:layout_height="match_parent" >
6

  
7
    <org.distorted.phasedsolver.SolverSurfaceView
8
        android:id="@+id/solverView"
9
        android:layout_width="match_parent"
10
        android:layout_height="match_parent"
11
        android:layout_alignParentStart="true"
12
        android:layout_alignParentTop="true"/>
13

  
14
    <LinearLayout
15
        android:id="@+id/upperBar"
16
        android:layout_alignParentTop="true"
17
        android:layout_width="match_parent"
18
        android:layout_height="80dp"
19
        android:gravity="center"
20
        android:orientation="horizontal"
21
        android:background="@android:color/transparent">
22

  
23
        <Button
24
            android:id="@+id/solverReset"
25
            android:layout_width="0dp"
26
            android:layout_height="match_parent"
27
            android:layout_weight="1.0"
28
            android:gravity="center_vertical|center"
29
            android:text="@string/reset"
30
            android:onClick="Reset"
31
            android:textAppearance="?android:attr/textAppearanceMedium"
32
            android:layout_gravity="center_vertical"/>
33

  
34
        <Button
35
            android:id="@+id/solverSolve"
36
            android:layout_width="0dp"
37
            android:layout_height="match_parent"
38
            android:layout_weight="1.0"
39
            android:gravity="center_vertical|center"
40
            android:text="@string/solve"
41
            android:onClick="Solve"
42
            android:textAppearance="?android:attr/textAppearanceMedium"
43
            android:layout_gravity="center_vertical"/>
44

  
45
    </LinearLayout>
46

  
47
    <LinearLayout
48
        android:id="@+id/lowerBar"
49
        android:layout_alignParentBottom="true"
50
        android:layout_width="match_parent"
51
        android:layout_height="80dp"
52
        android:orientation="horizontal"
53
        android:background="@android:color/transparent">
54

  
55
        <ImageButton
56
            android:id="@+id/solverLeft"
57
            android:background="@drawable/ui_left"
58
            android:layout_width="0dp"
59
            android:layout_height="match_parent"
60
            android:layout_weight="1.0"
61
            android:gravity="center_vertical|center"
62
            android:onClick="Left"
63
            android:layout_gravity="center_vertical"/>
64

  
65
        <TextView
66
            android:id="@+id/solverText"
67
            android:layout_width="0dp"
68
            android:layout_height="match_parent"
69
            android:layout_weight="4.0"/>
70

  
71
        <ImageButton
72
            android:id="@+id/solverRight"
73
            android:background="@drawable/ui_right"
74
            android:layout_width="0dp"
75
            android:layout_height="match_parent"
76
            android:layout_weight="1.0"
77
            android:gravity="center_vertical|center"
78
            android:onClick="Right"
79
            android:layout_gravity="center_vertical"/>
80
    </LinearLayout>
81

  
82
</RelativeLayout>
src/main/res/mipmap-anydpi-v26/ic_launcher.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
3
    <background android:drawable="@drawable/ic_launcher_background" />
4
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
5
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
6
</adaptive-icon>
src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
3
    <background android:drawable="@drawable/ic_launcher_background" />
4
    <foreground android:drawable="@drawable/ic_launcher_foreground" />
5
    <monochrome android:drawable="@drawable/ic_launcher_foreground" />
6
</adaptive-icon>
src/main/res/values/colors.xml
1
<?xml version="1.0" encoding="utf-8"?>
2
<resources>
3
    <color name="colorPrimary">#008577</color>
4
    <color name="colorPrimaryDark">#00574B</color>
5
    <color name="colorAccent">#D81B60</color>
6
    <color name="red">#ffff0000</color>
7
    <color name="dark_grey">#ff222222</color>
8
    <color name="grey">#ff333333</color>
9
    <color name="light_grey">#ff555555</color>
10
    <color name="black">#ff010101</color>
11
    <color name="white">#ffffffff</color>
12
</resources>
src/main/res/values/strings.xml
1
<resources>
2
    <string name="app_name">Phased Solver</string>
3
    <string name="solve">Solve</string>
4
    <string name="reset">Reset</string>
5
</resources>

Also available in: Unified diff