Compare commits
2 Commits
x
...
00e7a7f392
| Author | SHA1 | Date | |
|---|---|---|---|
| 00e7a7f392 | |||
| ea0d6d5fa6 |
2
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
.settings
|
.settings
|
||||||
|
.DS_store
|
||||||
.gradle
|
.gradle
|
||||||
.idea
|
.idea
|
||||||
bin
|
bin
|
||||||
@@ -8,6 +9,7 @@ nbandroid
|
|||||||
private
|
private
|
||||||
build
|
build
|
||||||
app/src/main/res/values/version.xml
|
app/src/main/res/values/version.xml
|
||||||
|
app/release
|
||||||
compiler/compiler.obj
|
compiler/compiler.obj
|
||||||
compiler/compiler.exe
|
compiler/compiler.exe
|
||||||
compiler/test/compiler.exe
|
compiler/test/compiler.exe
|
||||||
|
|||||||
1
app/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
112
app/build.gradle
@@ -1,11 +1,15 @@
|
|||||||
apply plugin: 'com.android.application'
|
plugins {
|
||||||
|
id 'com.android.application'
|
||||||
|
}
|
||||||
|
|
||||||
|
apply plugin: "androidx.navigation.safeargs"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Creates version.xml
|
// Creates version.xml
|
||||||
//
|
//
|
||||||
task createVersionXML {
|
task createVersionXML {
|
||||||
doLast {
|
doLast {
|
||||||
def versionP = 'git describe --tags --long --dirty=-x --abbrev=8'
|
def versionP = 'git describe --tags --long --dirty=-x --always --abbrev=8'
|
||||||
.execute()
|
.execute()
|
||||||
versionP.waitFor()
|
versionP.waitFor()
|
||||||
def version = versionP.text.trim()
|
def version = versionP.text.trim()
|
||||||
@@ -25,7 +29,7 @@ task createVersionXML {
|
|||||||
versionFile.println( '<string name="git_version">' << version << '</string>' )
|
versionFile.println( '<string name="git_version">' << version << '</string>' )
|
||||||
versionFile.println( '<string name="git_hash">' << githash << '</string>' )
|
versionFile.println( '<string name="git_hash">' << githash << '</string>' )
|
||||||
versionFile.println( '<string name="build_date">' << builddate << '</string>' )
|
versionFile.println( '<string name="build_date">' << builddate << '</string>' )
|
||||||
versionFile.println( '<string name="version_code">0x00010002</string>' )
|
versionFile.println( '<string name="version_code">0x00010001</string>' )
|
||||||
versionFile.println( '</resources>' )
|
versionFile.println( '</resources>' )
|
||||||
versionFile.close()
|
versionFile.close()
|
||||||
}
|
}
|
||||||
@@ -35,72 +39,64 @@ preBuild.dependsOn createVersionXML
|
|||||||
//
|
//
|
||||||
// Convert SVG images from art directory into PNG files.
|
// Convert SVG images from art directory into PNG files.
|
||||||
//
|
//
|
||||||
task generateDrawablesFromArt {
|
//task generateDrawablesFromArt {
|
||||||
|
// doLast {
|
||||||
doLast {
|
// def buildDir = (new File(project.buildDir,'art')).toString()
|
||||||
def indir = "app/src/main/art"
|
// def p = ('make -C app/src/main/art RES=../res TMP='+buildDir).execute()
|
||||||
def outdir = "../res"
|
// p.consumeProcessOutput()
|
||||||
|
// p.waitFor()
|
||||||
String backslash= System.getProperty("file.separator")
|
// if ( p.exitValue() )
|
||||||
def buildDir = (new File(project.buildDir,'art')).toString()
|
// throw new GradleException("Generation of art failed.")
|
||||||
buildDir = buildDir.replace(backslash,"/")
|
// }
|
||||||
def cmd = "make -C ${indir} RES=${outdir} TMP=${buildDir}"
|
//}
|
||||||
println cmd
|
//preBuild.dependsOn generateDrawablesFromArt
|
||||||
def p = cmd.execute()
|
|
||||||
p.consumeProcessOutput(System.err,System.err)
|
|
||||||
p.waitFor()
|
|
||||||
if ( p.exitValue() )
|
|
||||||
throw new GradleException("Generation of art failed.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preBuild.dependsOn generateDrawablesFromArt
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 10
|
compileSdk 31
|
||||||
buildToolsVersion "21.1.1"
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.vostan.sokoban"
|
applicationId "org.vostan.banvor"
|
||||||
minSdkVersion 10
|
minSdk 21
|
||||||
targetSdkVersion 14
|
targetSdk 31
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
|
||||||
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
apply from: new File(getRootDir(),'/.secret.gradle')
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
runProguard true
|
minifyEnabled false
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
signingConfig signingConfigs.sokoban_release
|
|
||||||
}
|
|
||||||
|
|
||||||
debug {
|
|
||||||
applicationIdSuffix ".debug"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
compileOptions {
|
||||||
sourceSets {
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
/*
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
main {
|
}
|
||||||
java.srcDirs = ['src']
|
buildFeatures {
|
||||||
|
viewBinding true
|
||||||
resources.srcDirs = ['src']
|
|
||||||
aidl.srcDirs = ['src']
|
|
||||||
|
|
||||||
renderscript.srcDirs = ['src']
|
|
||||||
|
|
||||||
res.srcDirs = ['res']
|
|
||||||
assets.srcDirs = ['assets']
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
debug {
|
|
||||||
main.manifest.srcFile "src/main/AndroidManifest-debug.xml"
|
|
||||||
}
|
|
||||||
androidTest.setRoot("src/tests")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//repositories {}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compile 'com.android.support:support-v4:18.0.0'
|
def nav_version = "2.3.5"
|
||||||
|
|
||||||
|
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||||
|
implementation 'com.google.android.material:material:1.4.0'
|
||||||
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
|
||||||
|
testImplementation 'junit:junit:4.+'
|
||||||
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||||
|
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||||
|
|
||||||
|
// Java language implementation
|
||||||
|
implementation "androidx.navigation:navigation-fragment:$nav_version"
|
||||||
|
implementation "androidx.navigation:navigation-ui:$nav_version"
|
||||||
|
// Feature module Support
|
||||||
|
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"
|
||||||
|
// Testing Navigation
|
||||||
|
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
|
||||||
|
// Jetpack Compose Integration
|
||||||
|
implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
16
app/proguard-rules.pro
vendored
@@ -1,17 +1,21 @@
|
|||||||
# Add project specific ProGuard rules here.
|
# Add project specific ProGuard rules here.
|
||||||
# By default, the flags in this file are appended to flags specified
|
# You can control the set of applied configuration files using the
|
||||||
# in C:\Program Files (x86)\Android\android-sdk/tools/proguard/proguard-android.txt
|
# proguardFiles setting in build.gradle.
|
||||||
# You can edit the include path and order by changing the proguardFiles
|
|
||||||
# directive in build.gradle.
|
|
||||||
#
|
#
|
||||||
# For more details, see
|
# For more details, see
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
# Add any project specific keep options here:
|
|
||||||
|
|
||||||
# If your project uses WebView with JS, uncomment the following
|
# If your project uses WebView with JS, uncomment the following
|
||||||
# and specify the fully qualified class name to the JavaScript interface
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
# class:
|
# class:
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
# public *;
|
# public *;
|
||||||
#}
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
import androidx.test.platform.app.InstrumentationRegistry;
|
||||||
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instrumented test, which will execute on an Android device.
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class ExampleInstrumentedTest {
|
||||||
|
@Test
|
||||||
|
public void useAppContext() {
|
||||||
|
// Context of the app under test.
|
||||||
|
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
|
||||||
|
assertEquals("org.vostan.banvor", appContext.getPackageName());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.vostan.sokoban"
|
package="org.vostan.sokoban"
|
||||||
android:versionCode="0x00010002"
|
android:versionCode="@string/version_code"
|
||||||
android:versionName="@string/git_version">
|
android:versionName="@string/git_version">
|
||||||
<uses-sdk android:minSdkVersion="10"
|
<uses-sdk android:minSdkVersion="10"
|
||||||
android:targetSdkVersion="14"/>
|
android:targetSdkVersion="14"/>
|
||||||
|
|||||||
@@ -1,30 +1,24 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.vostan.sokoban"
|
package="org.vostan.banvor"
|
||||||
android:versionCode="0x00010001"
|
android:versionName="@string/git_version">
|
||||||
android:versionName="@string/git_version">
|
|
||||||
<uses-sdk android:minSdkVersion="10"
|
<application
|
||||||
android:targetSdkVersion="14"/>
|
android:name=".App"
|
||||||
<application android:label="@string/app_name"
|
android:icon="@drawable/icon"
|
||||||
android:icon="@drawable/icon"
|
android:label="@string/app_name"
|
||||||
android:name="org.vostan.sokoban.App"
|
android:roundIcon="@drawable/icon"
|
||||||
android:theme="@android:style/Theme">
|
android:theme="@style/Theme.Banvor">
|
||||||
<activity android:name="org.vostan.sokoban.menu.MainActivity"
|
<activity
|
||||||
android:label="@string/app_name"
|
android:name=".WelcomeActivity"
|
||||||
android:configChanges="keyboardHidden|orientation"
|
android:exported="true"
|
||||||
android:screenOrientation="portrait" >
|
android:label="@string/title_activity_welcome"
|
||||||
|
>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="org.vostan.sokoban.play.PlayActivity"
|
|
||||||
android:label="@string/play_activity"
|
|
||||||
android:configChanges="keyboardHidden|orientation"
|
|
||||||
android:screenOrientation="portrait" >
|
|
||||||
<meta-data
|
|
||||||
android:name="android.support.PARENT_ACTIVITY"
|
|
||||||
android:value="org.vostan.sokoban.MainMenu" />
|
|
||||||
</activity>
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
//apply plugin: 'com.android.application'
|
|
||||||
|
|
||||||
class svg2png extends DefaultTask {
|
|
||||||
|
|
||||||
String input
|
|
||||||
String output
|
|
||||||
int width
|
|
||||||
int hight
|
|
||||||
def layers
|
|
||||||
|
|
||||||
def layerOnOff( def layer ) {
|
|
||||||
def t = '-u "//*/svg:g[@inkscape:label=\\"'+layer.key+'\\"]/@style"'
|
|
||||||
if ( layer.value )
|
|
||||||
return t + ' -v display:inline'
|
|
||||||
else
|
|
||||||
return t + ' -v display:none'
|
|
||||||
}
|
|
||||||
|
|
||||||
def configSVG( def svg, def layers ) {
|
|
||||||
def cfg = 'xmlstarlet ed -P -N svg=http://www.w3.org/2000/svg '
|
|
||||||
for ( layer in layers ) {
|
|
||||||
cfg += layerOnOff( layer ) + ' '
|
|
||||||
}
|
|
||||||
return cfg + svg
|
|
||||||
}
|
|
||||||
|
|
||||||
def configPNG( def png, def h, def w ) {
|
|
||||||
def cfg = 'imagemagick -background none -resize '+w+'x'+h+' - ' + png
|
|
||||||
}
|
|
||||||
|
|
||||||
def exportPNG( def svg, def svgLayerCfg, def png, def h, def w ) {
|
|
||||||
def svgProc = configSVG( svg, svgLayerCfg ).execute()
|
|
||||||
def pngProc =
|
|
||||||
configPNG( png, h, w ).
|
|
||||||
execute()
|
|
||||||
svgProc.pipeTo( pngProc )
|
|
||||||
|
|
||||||
pngProc.consumeProcessOutput()
|
|
||||||
pngProc.waitForOrKill(10000)
|
|
||||||
|
|
||||||
if ( svgProc.exitValue() )
|
|
||||||
throw new GradleException("Failed to generate svg.")
|
|
||||||
if ( pngProc.exitValue() )
|
|
||||||
throw new GradleException("Failed to generate png.")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSet {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Creates version.xml
|
|
||||||
//
|
|
||||||
task buildIcon {
|
|
||||||
|
|
||||||
//from(file('srcDir'))
|
|
||||||
//into(buildDir)
|
|
||||||
|
|
||||||
doLast {
|
|
||||||
|
|
||||||
def sizes = [ 'ldpi':[36,36],
|
|
||||||
'mdpi':[48,48],
|
|
||||||
'hdpi':[72,72],
|
|
||||||
'xhdpi':[96,96] ]
|
|
||||||
|
|
||||||
def sizes2= [ 'ldpi':[22,36],
|
|
||||||
'mdpi':[29,48],
|
|
||||||
'hdpi':[43,72],
|
|
||||||
'xhdpi':[58,96] ]
|
|
||||||
|
|
||||||
def sizes3= [ '':[500,500] ]
|
|
||||||
|
|
||||||
/*
|
|
||||||
def files = [
|
|
||||||
( "icon.svg", "icon.png", [ 'Debug':false ], sizes ),
|
|
||||||
( "icon.svg", "icon_debug.png", [ 'Debug':true ], sizes ),
|
|
||||||
|
|
||||||
( "buttons.svg", "reset.png", [ 'Reset Smooth':true ], sizes ),
|
|
||||||
( "buttons.svg", "undo.png", [ 'Undo Smooth':true ], sizes ),
|
|
||||||
( "buttons.svg", "next.png", [ 'Next Smooth':true ], sizes2 ),
|
|
||||||
( "buttons.svg", "prev.png", [ 'Prev Smooth':true ], sizes2 ),
|
|
||||||
|
|
||||||
( "lock.svg", "lock.png", [ 'lock':true ], sizes2 ),
|
|
||||||
( "lock.svg", "unlock.png", [ 'unlock':true ], sizes2 ),
|
|
||||||
( "lock.svg", "unlocking.png", [ 'locking':true ], sizes2 ),
|
|
||||||
|
|
||||||
( "bingo.svg", "bingo.png", [], sizes3 ),
|
|
||||||
( "box.svg", "box.png", [], sizes3 ),
|
|
||||||
( "floor.svg", "floor.png", [ 'Goal':false ], sizes3 ),
|
|
||||||
( "floor.svg", "goal.png", [ 'Goal':true ], sizes3 ),
|
|
||||||
( "wall.svg", "wall.png", [], sizes3 ),
|
|
||||||
( "worker.svg", "worker.png", [ 'Hands':false ], sizes3 ),
|
|
||||||
( "worker.svg", "worker_select.png", [ 'Hands':true ], sizes3 ),
|
|
||||||
|
|
||||||
( "splash.svg", "splash.png", [], ['':[500:800]] )
|
|
||||||
]
|
|
||||||
*/
|
|
||||||
// for ( s in sizes ) {
|
|
||||||
// exportPNG( "icon.svg",icon,s.key+"_icon.png",s.value[0],s.value[1])
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
51
app/src/main/java/org/vostan/banvor/App.java
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.vostan.banvor.game.State;
|
||||||
|
import org.vostan.banvor.model.PuzzleContainer;
|
||||||
|
import org.vostan.banvor.model.IPuzzleSource;
|
||||||
|
|
||||||
|
public class App extends Application
|
||||||
|
{
|
||||||
|
public static final String TAG = "Sokoban";
|
||||||
|
public static final String PREFS = "org.dyndns.vahagn.sokoban.prefs";
|
||||||
|
public static final int MIN_LEVEL = 1;
|
||||||
|
|
||||||
|
private static App mApp = null;
|
||||||
|
protected State gameState;
|
||||||
|
protected SharedPreferences prefs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onCreate()
|
||||||
|
{
|
||||||
|
super.onCreate();
|
||||||
|
mApp = this;
|
||||||
|
|
||||||
|
PuzzleContainer pc = new PuzzleContainer();
|
||||||
|
gameState = new State(pc);
|
||||||
|
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
|
||||||
|
|
||||||
|
gameState.loadState(prefs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void storeGameState(){
|
||||||
|
gameState.storeState(prefs.edit());
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is a singleton object.
|
||||||
|
//
|
||||||
|
public static App theApp() {
|
||||||
|
return mApp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public State state(){
|
||||||
|
return gameState;
|
||||||
|
}
|
||||||
|
}
|
||||||
147
app/src/main/java/org/vostan/banvor/PuzzleBoardFragment.java
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import android.app.AlertDialog;
|
||||||
|
import android.app.Dialog;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.fragment.app.DialogFragment;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import org.vostan.banvor.board.PuzzleControl;
|
||||||
|
import org.vostan.banvor.databinding.FragmentPuzzleBoardBinding;
|
||||||
|
import org.vostan.banvor.game.State;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PuzzleBoardFragment extends Fragment
|
||||||
|
{
|
||||||
|
private FragmentPuzzleBoardBinding binding;
|
||||||
|
private State gameState;
|
||||||
|
private PuzzleControl mPuzzleView;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
gameState = theApp().state();
|
||||||
|
binding = FragmentPuzzleBoardBinding.inflate(inflater, container, false);
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
int gameLevel = PuzzleBoardFragmentArgs.fromBundle(getArguments()).getLevel();
|
||||||
|
gameState.setCurrentLevel(gameLevel);
|
||||||
|
|
||||||
|
initAndShowCurrentPuzzle();
|
||||||
|
|
||||||
|
binding.gameBoard.setPuzzleControlLister(new PuzzleControl.PuzzleControlLister() {
|
||||||
|
@Override
|
||||||
|
public void onSolved() {
|
||||||
|
PuzzleBoardFragment.this.onSolved();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLongPress() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTouch() {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.btnPrev.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
gameState.setCurrentLevel(gameState.getCurrentLevel()-1);
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.btnNext.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
gameState.setCurrentLevel(gameState.getCurrentLevel()+1);
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.btnReset.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.btnUndo.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
createNextLevelDialog(new DialogInterface.OnClickListener(){
|
||||||
|
public void onClick(DialogInterface d, int w){
|
||||||
|
gameState.advanceCurrentLevel();
|
||||||
|
initAndShowCurrentPuzzle();
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initAndShowCurrentPuzzle() {
|
||||||
|
int gameLevel = gameState.getCurrentLevel();
|
||||||
|
binding.levelNumber.setText(Integer.toString(gameLevel));
|
||||||
|
binding.gameBoard.setPuzzle(gameState.getCurrentPuzzle());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onSolved(){
|
||||||
|
//
|
||||||
|
// Since the puzzle is solved, we need to unlock next level if still locked.
|
||||||
|
//
|
||||||
|
gameState.levelSolved(gameState.getCurrentLevel());
|
||||||
|
//
|
||||||
|
// Bring a dialog for user to choose to continue or stop.
|
||||||
|
//
|
||||||
|
// DialogFragment df = new DialogFragment() {
|
||||||
|
// public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
// return createNextLevelDialog(new DialogInterface.OnClickListener(){
|
||||||
|
// public void onClick(DialogInterface d, int w){
|
||||||
|
// gameState.advanceCurrentLevel();
|
||||||
|
// initAndShowCurrentPuzzle();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// df.show(getChildFragmentManager(), null);
|
||||||
|
createNextLevelDialog(new DialogInterface.OnClickListener(){
|
||||||
|
public void onClick(DialogInterface d, int w){
|
||||||
|
gameState.advanceCurrentLevel();
|
||||||
|
initAndShowCurrentPuzzle();
|
||||||
|
}
|
||||||
|
}).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
super.onDestroyView();
|
||||||
|
binding = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Dialog createNextLevelDialog(DialogInterface.OnClickListener listener){
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Congratulations! You Won!");
|
||||||
|
builder.setMessage( "Would you like to try the next puzzle?" );
|
||||||
|
builder.setPositiveButton("Yes, please.", listener);
|
||||||
|
// Create the AlertDialog object and return it
|
||||||
|
Dialog dlg = builder.create();
|
||||||
|
dlg.setCancelable(true);
|
||||||
|
return dlg;
|
||||||
|
}
|
||||||
|
}
|
||||||
197
app/src/main/java/org/vostan/banvor/PuzzleListFragment.java
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Color;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.navigation.fragment.NavHostFragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import android.widget.AdapterView;
|
||||||
|
import android.widget.BaseAdapter;
|
||||||
|
import android.widget.GridView;
|
||||||
|
import android.widget.ImageView;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import org.vostan.banvor.databinding.FragmentPuzzleListBinding;
|
||||||
|
import org.vostan.banvor.game.State;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class PuzzlesAdapter extends BaseAdapter
|
||||||
|
{
|
||||||
|
private State gameState;
|
||||||
|
private Context context;
|
||||||
|
private int icon_size;
|
||||||
|
private int text_size;
|
||||||
|
private int text_x;
|
||||||
|
private int text_y;
|
||||||
|
private Bitmap lock_icon;
|
||||||
|
private Bitmap unlock_icon;
|
||||||
|
private Paint paint;
|
||||||
|
|
||||||
|
public PuzzlesAdapter(Context c)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
|
||||||
|
gameState = theApp().state();
|
||||||
|
context = c;
|
||||||
|
icon_size = (int)c.getResources().getDimension(R.dimen.puzzle_list_icon_size);
|
||||||
|
text_size = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_size);
|
||||||
|
text_x = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_x_coord);
|
||||||
|
text_y = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_y_coord);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Load locked icon
|
||||||
|
//
|
||||||
|
Bitmap lock_icon_tmp = BitmapFactory.decodeResource( c.getResources(), R.drawable.lock );
|
||||||
|
lock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas lock_canvas = new Canvas(lock_icon);
|
||||||
|
lock_canvas.drawBitmap(lock_icon_tmp,
|
||||||
|
new Rect(0,0,lock_icon_tmp.getWidth()-1,lock_icon_tmp.getHeight()-1),
|
||||||
|
new Rect(0,0, icon_size, icon_size),
|
||||||
|
null);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Load unlock icon
|
||||||
|
//
|
||||||
|
Bitmap unlock_icon_tmp = BitmapFactory.decodeResource( c.getResources(), R.drawable.unlock );
|
||||||
|
unlock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas unlock_canvas = new Canvas(unlock_icon);
|
||||||
|
unlock_canvas.drawBitmap(unlock_icon_tmp,
|
||||||
|
new Rect(0,0,unlock_icon_tmp.getWidth()-1,unlock_icon_tmp.getHeight()-1),
|
||||||
|
new Rect(0,0,icon_size, icon_size),
|
||||||
|
null);
|
||||||
|
|
||||||
|
paint = new Paint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount()
|
||||||
|
{
|
||||||
|
return gameState.getPuzzleCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getItem(int position)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPositionLevel(int position)
|
||||||
|
{
|
||||||
|
return position+1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getItemId(int position)
|
||||||
|
{
|
||||||
|
return getPositionLevel(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
// create a new ImageView for each item referenced by the Adapter
|
||||||
|
@Override
|
||||||
|
public View getView(int position, View convertView, ViewGroup parent)
|
||||||
|
{
|
||||||
|
ImageView imageView;
|
||||||
|
if (convertView == null)
|
||||||
|
{ // if it's not recycled, initialize some attributes
|
||||||
|
imageView = new ImageView(context);
|
||||||
|
imageView.setLayoutParams(new GridView.LayoutParams(icon_size, icon_size));
|
||||||
|
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
imageView = (ImageView) convertView;
|
||||||
|
|
||||||
|
imageView.setImageBitmap(getIcon(position));
|
||||||
|
return imageView;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Bitmap getIcon(int position)
|
||||||
|
{
|
||||||
|
paint.setColor( Color.WHITE );
|
||||||
|
paint.setTextSize( text_size );
|
||||||
|
paint.setTextAlign(Paint.Align.RIGHT);
|
||||||
|
|
||||||
|
int level = getPositionLevel(position);
|
||||||
|
Bitmap icon = ( gameState.isLocked(level) )
|
||||||
|
? lock_icon.copy(Bitmap.Config.ARGB_8888,true)
|
||||||
|
: unlock_icon.copy(Bitmap.Config.ARGB_8888,true);
|
||||||
|
|
||||||
|
Canvas canvas = new Canvas(icon);
|
||||||
|
canvas.drawText( Integer.toString(level), text_x, text_y, paint);
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PuzzleListFragment extends Fragment
|
||||||
|
{
|
||||||
|
private FragmentPuzzleListBinding binding;
|
||||||
|
private PuzzlesAdapter puzzleGridAdapter;
|
||||||
|
private State gameState;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
gameState = theApp().state();
|
||||||
|
binding = FragmentPuzzleListBinding.inflate(inflater, container, false);
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
puzzleGridAdapter = new PuzzlesAdapter(getActivity());
|
||||||
|
binding.puzzleGrid.setAdapter(puzzleGridAdapter);
|
||||||
|
|
||||||
|
binding.puzzleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
|
||||||
|
int level = puzzleGridAdapter.getPositionLevel(position);
|
||||||
|
if (!gameState.isLocked(level)){
|
||||||
|
PuzzleListFragmentDirections.ActionPuzzleListFragmentToPuzzleBoardFragment action =
|
||||||
|
PuzzleListFragmentDirections.actionPuzzleListFragmentToPuzzleBoardFragment();
|
||||||
|
action.setLevel(level);
|
||||||
|
NavHostFragment.findNavController(PuzzleListFragment.this)
|
||||||
|
.navigate(action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onResume()
|
||||||
|
{
|
||||||
|
super.onResume();
|
||||||
|
if ( binding != null && binding.puzzleGrid != null ) {
|
||||||
|
puzzleGridAdapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView () {
|
||||||
|
super.onDestroyView();
|
||||||
|
binding = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
77
app/src/main/java/org/vostan/banvor/WelcomeActivity.java
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
|
||||||
|
import androidx.navigation.NavController;
|
||||||
|
import androidx.navigation.Navigation;
|
||||||
|
import androidx.navigation.ui.AppBarConfiguration;
|
||||||
|
import androidx.navigation.ui.NavigationUI;
|
||||||
|
|
||||||
|
import org.vostan.banvor.databinding.ActivityWelcomeBinding;
|
||||||
|
|
||||||
|
public class WelcomeActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
private AppBarConfiguration appBarConfiguration;
|
||||||
|
private ActivityWelcomeBinding binding;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
binding = ActivityWelcomeBinding.inflate(getLayoutInflater());
|
||||||
|
setContentView(binding.getRoot());
|
||||||
|
|
||||||
|
// setSupportActionBar(binding.toolbar);
|
||||||
|
|
||||||
|
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_welcome);
|
||||||
|
|
||||||
|
// appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
|
||||||
|
// NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
|
||||||
|
|
||||||
|
// binding.fab.setOnClickListener(new View.OnClickListener() {
|
||||||
|
// @Override
|
||||||
|
// public void onClick(View view) {
|
||||||
|
// Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
|
||||||
|
// .setAction("Action", null).show();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// // Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
//// getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
// // Handle action bar item clicks here. The action bar will
|
||||||
|
// // automatically handle clicks on the Home/Up button, so long
|
||||||
|
// // as you specify a parent activity in AndroidManifest.xml.
|
||||||
|
// int id = item.getItemId();
|
||||||
|
//
|
||||||
|
// //noinspection SimplifiableIfStatement
|
||||||
|
// if (id == R.id.puzzle_grid) {
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return super.onOptionsItemSelected(item);
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onSupportNavigateUp() {
|
||||||
|
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_welcome);
|
||||||
|
return NavigationUI.navigateUp(navController, appBarConfiguration)
|
||||||
|
|| super.onSupportNavigateUp();
|
||||||
|
}
|
||||||
|
}
|
||||||
68
app/src/main/java/org/vostan/banvor/WelcomeFragment.java
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
import androidx.navigation.fragment.NavHostFragment;
|
||||||
|
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
//import android.widget.Button;
|
||||||
|
//import android.widget.TextView;
|
||||||
|
//import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import org.vostan.banvor.databinding.FragmentWelcomeBinding;
|
||||||
|
import org.vostan.banvor.game.State;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class WelcomeFragment extends Fragment
|
||||||
|
{
|
||||||
|
private FragmentWelcomeBinding binding;
|
||||||
|
private State gameState;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
gameState = theApp().state();
|
||||||
|
binding = FragmentWelcomeBinding.inflate(inflater, container, false);
|
||||||
|
return binding.getRoot();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
binding.btnContinue.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
WelcomeFragmentDirections.ActionWelcomeFragmentToPuzzleBoardFragment action =
|
||||||
|
WelcomeFragmentDirections.actionWelcomeFragmentToPuzzleBoardFragment();
|
||||||
|
action.setLevel(gameState.getCurrentLevel());
|
||||||
|
NavHostFragment.findNavController(WelcomeFragment.this)
|
||||||
|
.navigate(action);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
binding.btnPuzzles.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
NavHostFragment.findNavController(WelcomeFragment.this)
|
||||||
|
.navigate(R.id.action_WelcomeFragment_to_PuzzleListFragment);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroyView() {
|
||||||
|
super.onDestroyView();
|
||||||
|
binding = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
* To change this template, choose Tools | Templates
|
* To change this template, choose Tools | Templates
|
||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
package org.vostan.sokoban.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.support.v4.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -13,92 +13,6 @@ import java.util.LinkedList;
|
|||||||
*/
|
*/
|
||||||
public class Animator implements Runnable
|
public class Animator implements Runnable
|
||||||
{
|
{
|
||||||
protected PuzzleView view;
|
|
||||||
protected LinkedList<Action> actions = new LinkedList<Action>();
|
|
||||||
protected boolean stop;
|
|
||||||
protected int step;
|
|
||||||
protected Action currentAction;
|
|
||||||
protected AnimationLister theLister;
|
|
||||||
|
|
||||||
public interface AnimationLister
|
|
||||||
{
|
|
||||||
public void onAnimationEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Animator( PuzzleView v)
|
|
||||||
{
|
|
||||||
view = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAnimationLister( AnimationLister lister )
|
|
||||||
{
|
|
||||||
theLister = lister;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void queue( Action a )
|
|
||||||
{
|
|
||||||
actions.addLast(a);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void play()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If no actions exist then nothing to do.
|
|
||||||
//
|
|
||||||
if ( actions.size() == 0 )
|
|
||||||
return;
|
|
||||||
//
|
|
||||||
// Get the first action an play it.
|
|
||||||
//
|
|
||||||
stop = false;
|
|
||||||
step = 0;
|
|
||||||
currentAction = actions.removeFirst();
|
|
||||||
ViewCompat.postOnAnimation(view, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop()
|
|
||||||
{
|
|
||||||
stop = true;
|
|
||||||
view.removeCallbacks(this);
|
|
||||||
if ( theLister != null )
|
|
||||||
theLister.onAnimationEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear()
|
|
||||||
{
|
|
||||||
actions.clear();
|
|
||||||
currentAction = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
if ( currentAction == null )
|
|
||||||
return;
|
|
||||||
else if ( currentAction.steps > step )
|
|
||||||
{
|
|
||||||
currentAction.intermediate(this,step);
|
|
||||||
step++;
|
|
||||||
ViewCompat.postOnAnimation(view, this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
currentAction.last(this);
|
|
||||||
step = 0;
|
|
||||||
currentAction = null;
|
|
||||||
if ( !stop && actions.size() > 0 )
|
|
||||||
{
|
|
||||||
currentAction = actions.removeFirst();
|
|
||||||
step = 0;
|
|
||||||
ViewCompat.postOnAnimation(view, this);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ( theLister != null )
|
|
||||||
theLister.onAnimationEnd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static abstract class Action
|
public static abstract class Action
|
||||||
{
|
{
|
||||||
public int steps;
|
public int steps;
|
||||||
@@ -205,4 +119,90 @@ public class Animator implements Runnable
|
|||||||
public void last( Animator ap )
|
public void last( Animator ap )
|
||||||
{}
|
{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected PuzzleView view;
|
||||||
|
protected LinkedList<Action> actions = new LinkedList<Action>();
|
||||||
|
protected boolean stop;
|
||||||
|
protected int step;
|
||||||
|
protected Action currentAction;
|
||||||
|
protected AnimationLister theLister;
|
||||||
|
|
||||||
|
public interface AnimationLister
|
||||||
|
{
|
||||||
|
public void onAnimationEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Animator( PuzzleView v)
|
||||||
|
{
|
||||||
|
view = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAnimationLister( AnimationLister lister )
|
||||||
|
{
|
||||||
|
theLister = lister;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void queue( Action a )
|
||||||
|
{
|
||||||
|
actions.addLast(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void play()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If no actions exist then nothing to do.
|
||||||
|
//
|
||||||
|
if ( actions.size() == 0 )
|
||||||
|
return;
|
||||||
|
//
|
||||||
|
// Get the first action an play it.
|
||||||
|
//
|
||||||
|
stop = false;
|
||||||
|
step = 0;
|
||||||
|
currentAction = actions.removeFirst();
|
||||||
|
ViewCompat.postOnAnimation(view, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop()
|
||||||
|
{
|
||||||
|
stop = true;
|
||||||
|
view.removeCallbacks(this);
|
||||||
|
if ( theLister != null )
|
||||||
|
theLister.onAnimationEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clear()
|
||||||
|
{
|
||||||
|
actions.clear();
|
||||||
|
currentAction = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
if ( currentAction == null )
|
||||||
|
return;
|
||||||
|
else if ( currentAction.steps > step )
|
||||||
|
{
|
||||||
|
currentAction.intermediate(this,step);
|
||||||
|
step++;
|
||||||
|
ViewCompat.postOnAnimation(view, this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentAction.last(this);
|
||||||
|
step = 0;
|
||||||
|
currentAction = null;
|
||||||
|
if ( !stop && actions.size() > 0 )
|
||||||
|
{
|
||||||
|
currentAction = actions.removeFirst();
|
||||||
|
step = 0;
|
||||||
|
ViewCompat.postOnAnimation(view, this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( theLister != null )
|
||||||
|
theLister.onAnimationEnd();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
package org.vostan.sokoban.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import android.support.v4.app.FragmentActivity;
|
import androidx.fragment.app.FragmentActivity;
|
||||||
|
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.animation.Animation;
|
import android.view.animation.Animation;
|
||||||
@@ -13,11 +15,11 @@ import android.view.animation.AnimationUtils;
|
|||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import org.vostan.sokoban.App;
|
import org.vostan.banvor.App;
|
||||||
|
|
||||||
import static org.vostan.sokoban.App.theApp;
|
import static org.vostan.banvor.App.theApp;
|
||||||
import org.vostan.sokoban.R;
|
import org.vostan.banvor.R;
|
||||||
import org.vostan.sokoban.Puzzle;
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
public class PlayActivity extends FragmentActivity
|
public class PlayActivity extends FragmentActivity
|
||||||
implements PuzzleControl.PuzzleControlLister
|
implements PuzzleControl.PuzzleControlLister
|
||||||
@@ -41,16 +43,17 @@ public class PlayActivity extends FragmentActivity
|
|||||||
//
|
//
|
||||||
// Create and set up the puzzle_view.
|
// Create and set up the puzzle_view.
|
||||||
//
|
//
|
||||||
puzzle_view = new PuzzleControl( this );
|
// puzzle_view = new PuzzleControl(this, new AttributeSet() {
|
||||||
|
// });
|
||||||
setContentView( puzzle_view );
|
setContentView( puzzle_view );
|
||||||
puzzle_view.setPuzzleControlLister( this );
|
puzzle_view.setPuzzleControlLister( this );
|
||||||
//
|
//
|
||||||
// Create action bar.
|
// Create action bar.
|
||||||
//
|
//
|
||||||
FrameLayout rootLayout = (FrameLayout)findViewById(android.R.id.content);
|
FrameLayout rootLayout = (FrameLayout)findViewById(android.R.id.content);
|
||||||
View.inflate(this, R.layout.puzzle_view_title, rootLayout);
|
View.inflate(this, R.layout.fragment_puzzle_board, rootLayout);
|
||||||
title_text = (TextView)findViewById(R.id.title_text);
|
title_text = (TextView)findViewById(R.id.level_text);
|
||||||
title_view = findViewById(R.id.puzzle_view_title_layout);
|
// title_view = findViewById(R.id.puzzle_view_title_layout);
|
||||||
//
|
//
|
||||||
// Load the puzzle.
|
// Load the puzzle.
|
||||||
//
|
//
|
||||||
@@ -62,9 +65,9 @@ public class PlayActivity extends FragmentActivity
|
|||||||
//
|
//
|
||||||
// Advance current level and achieved level.
|
// Advance current level and achieved level.
|
||||||
//
|
//
|
||||||
final int nextl = theApp().getCurrentLevel()+1;
|
final int nextl = theApp().state().getCurrentLevel()+1;
|
||||||
theApp().advanceAchivedLevel(nextl);
|
// theApp().state().(nextl);
|
||||||
theApp().setCurrentLevel(nextl);
|
theApp().state().setCurrentLevel(nextl);
|
||||||
//
|
//
|
||||||
// Bring a dialog for user to choose to continue or stop.
|
// Bring a dialog for user to choose to continue or stop.
|
||||||
//
|
//
|
||||||
@@ -130,12 +133,12 @@ public class PlayActivity extends FragmentActivity
|
|||||||
title_view.setVisibility(View.INVISIBLE);
|
title_view.setVisibility(View.INVISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onReset( View v )
|
public boolean onReset( View v )
|
||||||
{
|
{
|
||||||
while ( puzzle.isUndoable() )
|
while ( puzzle.isUndoable() )
|
||||||
puzzle.restore();
|
puzzle.restore();
|
||||||
puzzle_view.invalidate();
|
puzzle_view.invalidate();
|
||||||
//return true;
|
return true;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Go to previouse puzzle.
|
// Go to previouse puzzle.
|
||||||
@@ -146,9 +149,9 @@ public class PlayActivity extends FragmentActivity
|
|||||||
// If current level is less than achived level the move to next
|
// If current level is less than achived level the move to next
|
||||||
// puzzle.
|
// puzzle.
|
||||||
//
|
//
|
||||||
if ( theApp().getCurrentLevel() > App.MIN_LEVEL )
|
if ( theApp().state().getCurrentLevel() > App.MIN_LEVEL )
|
||||||
{
|
{
|
||||||
theApp().setCurrentLevel( theApp().getCurrentLevel()-1 );
|
theApp().state().setCurrentLevel( theApp().state().getCurrentLevel()-1 );
|
||||||
loadCurrentPuzzle();
|
loadCurrentPuzzle();
|
||||||
puzzle_view.invalidate();
|
puzzle_view.invalidate();
|
||||||
}
|
}
|
||||||
@@ -163,9 +166,9 @@ public class PlayActivity extends FragmentActivity
|
|||||||
// If current level is less than achived level the move to next
|
// If current level is less than achived level the move to next
|
||||||
// puzzle.
|
// puzzle.
|
||||||
//
|
//
|
||||||
if ( theApp().getCurrentLevel() < theApp().getAchivedLevel() )
|
if ( theApp().state().getCurrentLevel() < theApp().state().getHighestSolvedLevel() )
|
||||||
{
|
{
|
||||||
theApp().setCurrentLevel( theApp().getCurrentLevel()+1 );
|
theApp().state().setCurrentLevel( theApp().state().getCurrentLevel()+1 );
|
||||||
loadCurrentPuzzle();
|
loadCurrentPuzzle();
|
||||||
puzzle_view.invalidate();
|
puzzle_view.invalidate();
|
||||||
|
|
||||||
@@ -175,27 +178,27 @@ public class PlayActivity extends FragmentActivity
|
|||||||
//
|
//
|
||||||
// Undo last action.
|
// Undo last action.
|
||||||
//
|
//
|
||||||
public void onUndo( View v )
|
public boolean onUndo( View v )
|
||||||
{
|
{
|
||||||
if ( puzzle.isUndoable() )
|
if ( puzzle.isUndoable() )
|
||||||
{
|
{
|
||||||
puzzle.restore();
|
puzzle.restore();
|
||||||
puzzle_view.invalidate();
|
puzzle_view.invalidate();
|
||||||
// return true;
|
return true;
|
||||||
}
|
}
|
||||||
//else
|
else
|
||||||
// return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadCurrentPuzzle()
|
private void loadCurrentPuzzle()
|
||||||
{
|
{
|
||||||
puzzle = theApp().getCurrentPuzzle();
|
puzzle = theApp().state().getCurrentPuzzle();
|
||||||
puzzle_view.setPuzzle(puzzle);
|
puzzle_view.setPuzzle(puzzle);
|
||||||
updateTitle();
|
updateTitle();
|
||||||
}
|
}
|
||||||
public void updateTitle()
|
public void updateTitle()
|
||||||
{
|
{
|
||||||
String title = "Level " + new Integer(theApp().getCurrentLevel()).toString();
|
String title = "Level " + new Integer(theApp().state().getCurrentLevel()).toString();
|
||||||
setTitle(title);
|
setTitle(title);
|
||||||
}
|
}
|
||||||
public void setTitle(CharSequence title)
|
public void setTitle(CharSequence title)
|
||||||
@@ -2,14 +2,17 @@
|
|||||||
* To change this template, choose Tools | Templates
|
* To change this template, choose Tools | Templates
|
||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
package org.vostan.sokoban.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.ScaleGestureDetector;
|
import android.view.ScaleGestureDetector;
|
||||||
import org.vostan.sokoban.Puzzle;
|
|
||||||
|
import org.vostan.banvor.game.PuzzleLogic;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
//import android.support.v4.view.GestureDetectorCompat;
|
//import android.support.v4.view.GestureDetectorCompat;
|
||||||
|
|
||||||
@@ -39,9 +42,9 @@ public class PuzzleControl extends PuzzleView
|
|||||||
public void onTouch();
|
public void onTouch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PuzzleControl(Context c)
|
public PuzzleControl(Context c, AttributeSet attributeSet)
|
||||||
{
|
{
|
||||||
super(c);
|
super(c,attributeSet);
|
||||||
logic = new PuzzleLogic();
|
logic = new PuzzleLogic();
|
||||||
animator = new Animator( this );
|
animator = new Animator( this );
|
||||||
animator.setAnimationLister(this);
|
animator.setAnimationLister(this);
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.vostan.sokoban.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
@@ -9,13 +9,15 @@ import android.graphics.Paint;
|
|||||||
import android.graphics.Point;
|
import android.graphics.Point;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import android.support.v4.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
import org.vostan.sokoban.Puzzle;
|
import org.vostan.banvor.model.Puzzle;
|
||||||
import static org.vostan.sokoban.Puzzle.*;
|
import static org.vostan.banvor.model.Puzzle.*;
|
||||||
import org.vostan.sokoban.R;
|
import org.vostan.banvor.R;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
@@ -38,9 +40,9 @@ public class PuzzleView extends View
|
|||||||
private Rect tile_src = new Rect();
|
private Rect tile_src = new Rect();
|
||||||
private RectF tile_dest = new RectF();
|
private RectF tile_dest = new RectF();
|
||||||
|
|
||||||
public PuzzleView(Context context)
|
public PuzzleView(Context context, AttributeSet attributeSet)
|
||||||
{
|
{
|
||||||
super(context);
|
super(context, attributeSet);
|
||||||
setFocusable(true);
|
setFocusable(true);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -53,24 +55,22 @@ public class PuzzleView extends View
|
|||||||
// a.recycle();
|
// a.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPuzzle( Puzzle p )
|
public void setPuzzle( Puzzle p ){
|
||||||
{
|
|
||||||
puzzle = p;
|
puzzle = p;
|
||||||
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
|
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
|
||||||
viewport.set(board);
|
viewport.set(board);
|
||||||
tile_size.set(0,0);
|
tile_size.set(0,0);
|
||||||
calcTransforms();
|
calcTransforms();
|
||||||
initTiles();
|
initTiles();
|
||||||
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Puzzle getPuzzle()
|
public Puzzle getPuzzle(){
|
||||||
{
|
|
||||||
return puzzle;
|
return puzzle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onSizeChanged(int w, int h, int oldw, int oldh)
|
protected void onSizeChanged(int w, int h, int oldw, int oldh){
|
||||||
{
|
|
||||||
screen.set(0, 0, w, h);
|
screen.set(0, 0, w, h);
|
||||||
tile_size.set(0,0);
|
tile_size.set(0,0);
|
||||||
calcTransforms();
|
calcTransforms();
|
||||||
@@ -78,8 +78,7 @@ public class PuzzleView extends View
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void scaleViewport( float focusX, float focusY, float scale )
|
public void scaleViewport( float focusX, float focusY, float scale ){
|
||||||
{
|
|
||||||
float left = scale*(focusX - screen.left);
|
float left = scale*(focusX - screen.left);
|
||||||
float right = scale*(screen.right - focusX);
|
float right = scale*(screen.right - focusX);
|
||||||
float top = scale*(focusY - screen.top);
|
float top = scale*(focusY - screen.top);
|
||||||
@@ -91,14 +90,12 @@ public class PuzzleView extends View
|
|||||||
ViewCompat.postInvalidateOnAnimation(this);
|
ViewCompat.postInvalidateOnAnimation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scaleViewportDone()
|
public void scaleViewportDone(){
|
||||||
{
|
|
||||||
//initTiles();
|
//initTiles();
|
||||||
ViewCompat.postInvalidateOnAnimation(this);
|
ViewCompat.postInvalidateOnAnimation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scrollViewport( float distanceX, float distanceY )
|
public void scrollViewport( float distanceX, float distanceY ){
|
||||||
{
|
|
||||||
viewport.set( screen.left+distanceX,
|
viewport.set( screen.left+distanceX,
|
||||||
screen.top+distanceY,
|
screen.top+distanceY,
|
||||||
screen.right+distanceX,
|
screen.right+distanceX,
|
||||||
@@ -338,7 +335,7 @@ public class PuzzleView extends View
|
|||||||
}
|
}
|
||||||
private Bitmap createWorkerTile()
|
private Bitmap createWorkerTile()
|
||||||
{
|
{
|
||||||
Bitmap tmp = BitmapFactory.decodeResource( getResources(), R.drawable.worker );
|
Bitmap tmp = BitmapFactory.decodeResource( getResources(), R.drawable.worker);
|
||||||
Bitmap bitmap = Bitmap.createBitmap(tile_size.x, tile_size.y, Bitmap.Config.ARGB_8888);
|
Bitmap bitmap = Bitmap.createBitmap(tile_size.x, tile_size.y, Bitmap.Config.ARGB_8888);
|
||||||
Canvas canvas = new Canvas(bitmap);
|
Canvas canvas = new Canvas(bitmap);
|
||||||
canvas.drawBitmap(tmp,
|
canvas.drawBitmap(tmp,
|
||||||
@@ -2,15 +2,16 @@
|
|||||||
* To change this template, choose Tools | Templates
|
* To change this template, choose Tools | Templates
|
||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
package org.vostan.sokoban.play;
|
package org.vostan.banvor.game;
|
||||||
|
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import org.vostan.sokoban.Puzzle;
|
|
||||||
|
import org.vostan.banvor.board.Animator;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author vahagnk
|
|
||||||
*/
|
*/
|
||||||
public class PuzzleLogic
|
public class PuzzleLogic
|
||||||
{
|
{
|
||||||
134
app/src/main/java/org/vostan/banvor/game/State.java
Normal file
@@ -0,0 +1,134 @@
|
|||||||
|
package org.vostan.banvor.game;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import org.vostan.banvor.model.IPuzzleSource;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
|
public class State {
|
||||||
|
public static final String TAG = "Sokoban.Sate";
|
||||||
|
public static final String CUR_LEVEL = "current_level";
|
||||||
|
public static final String HIGH_LEVEL = "highest_unlocked_level";
|
||||||
|
|
||||||
|
protected IPuzzleSource mPuzzleSource;
|
||||||
|
protected int mCurrentLevel;
|
||||||
|
protected int mHighestUnlockedLevel;
|
||||||
|
public static final int MIN_LEVEL = 1;
|
||||||
|
protected int mMaxLevel;
|
||||||
|
|
||||||
|
public State(@NonNull IPuzzleSource ps){
|
||||||
|
mPuzzleSource = ps;
|
||||||
|
mCurrentLevel = 0;
|
||||||
|
mHighestUnlockedLevel = 0;
|
||||||
|
mMaxLevel = mPuzzleSource.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// These are to save the game state and restore it.
|
||||||
|
//
|
||||||
|
public void storeState(@NonNull SharedPreferences.Editor prefs){
|
||||||
|
prefs.putInt(CUR_LEVEL, mCurrentLevel);
|
||||||
|
prefs.putInt(HIGH_LEVEL, mHighestUnlockedLevel);
|
||||||
|
prefs.apply();
|
||||||
|
if ( !prefs.commit() ) {
|
||||||
|
Log.d(TAG, "prefs.edit().commit() failed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadState(@NonNull SharedPreferences prefs){
|
||||||
|
mCurrentLevel = prefs.getInt(CUR_LEVEL, MIN_LEVEL);
|
||||||
|
mHighestUnlockedLevel = prefs.getInt(HIGH_LEVEL, MIN_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Provide amount of puzzles.
|
||||||
|
//
|
||||||
|
public final int getPuzzleCount()
|
||||||
|
{
|
||||||
|
return mPuzzleSource.getCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Puzzles.
|
||||||
|
//
|
||||||
|
public Puzzle getPuzzle(int level )
|
||||||
|
{
|
||||||
|
return mPuzzleSource.getPuzzle( level-1 );
|
||||||
|
}
|
||||||
|
public Puzzle getCurrentPuzzle()
|
||||||
|
{
|
||||||
|
return getPuzzle( getCurrentLevel() );
|
||||||
|
}
|
||||||
|
public Puzzle getPrevPuzzle()
|
||||||
|
{
|
||||||
|
if ( mCurrentLevel != MIN_LEVEL ) {
|
||||||
|
return getPuzzle(getCurrentLevel() - 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Puzzle getNextPuzzle()
|
||||||
|
{
|
||||||
|
if ( mCurrentLevel != mHighestUnlockedLevel) {
|
||||||
|
return getPuzzle(getCurrentLevel() + 1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Level Unlock logic
|
||||||
|
//
|
||||||
|
public Boolean isLocked(int level){
|
||||||
|
return level > mHighestUnlockedLevel;
|
||||||
|
}
|
||||||
|
private void unlockLevel( int l )
|
||||||
|
{
|
||||||
|
if ( l > mMaxLevel){
|
||||||
|
l = mMaxLevel;
|
||||||
|
}
|
||||||
|
if ( l > mHighestUnlockedLevel) {
|
||||||
|
mHighestUnlockedLevel = l;
|
||||||
|
}
|
||||||
|
theApp().storeGameState();
|
||||||
|
}
|
||||||
|
public void levelSolved(int l){
|
||||||
|
unlockLevel(l+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Provide highest solved puzzle.
|
||||||
|
//
|
||||||
|
public final int getHighestSolvedLevel(){
|
||||||
|
return mHighestUnlockedLevel;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Provide last played puzzle.
|
||||||
|
//
|
||||||
|
public final int getCurrentLevel(){
|
||||||
|
return mCurrentLevel;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Set the current puzzle level.
|
||||||
|
//
|
||||||
|
public void setCurrentLevel( int l ) {
|
||||||
|
if ( l > mHighestUnlockedLevel){
|
||||||
|
l = MIN_LEVEL;
|
||||||
|
}
|
||||||
|
else if ( l < MIN_LEVEL ) {
|
||||||
|
l = mHighestUnlockedLevel;
|
||||||
|
}
|
||||||
|
mCurrentLevel = l;
|
||||||
|
theApp().storeGameState();
|
||||||
|
}
|
||||||
|
public void advanceCurrentLevel(){
|
||||||
|
setCurrentLevel(mCurrentLevel+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
6
app/src/main/java/org/vostan/banvor/model/Coord.java
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
public class Coord {
|
||||||
|
public int x;
|
||||||
|
public int y;
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
public interface IPuzzleSource {
|
||||||
|
public int getCount();
|
||||||
|
public Puzzle getPuzzle( int i );
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.vostan.sokoban;
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
//import java.lang.Exception;
|
//import java.lang.Exception;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -7,7 +7,7 @@ import android.util.Log;
|
|||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import static org.vostan.sokoban.App.TAG;
|
import static org.vostan.banvor.App.TAG;
|
||||||
|
|
||||||
public class Puzzle
|
public class Puzzle
|
||||||
{
|
{
|
||||||
@@ -1,12 +1,13 @@
|
|||||||
package org.vostan.sokoban;
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import static org.vostan.sokoban.App.theApp;
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
import org.vostan.sokoban.R;
|
import org.vostan.banvor.R;
|
||||||
|
|
||||||
public class PuzzleContainer
|
public class PuzzleContainer implements IPuzzleSource
|
||||||
{
|
{
|
||||||
protected int count;
|
protected int count;
|
||||||
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
package org.vostan.sokoban;
|
|
||||||
|
|
||||||
import android.app.Application;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class App extends Application
|
|
||||||
{
|
|
||||||
public static final String TAG = "Sokoban";
|
|
||||||
public static final String PREFS = "org.dyndns.vahagn.sokoban.prefs";
|
|
||||||
public static final int MIN_LEVEL = 1;
|
|
||||||
|
|
||||||
private static App mApp = null;
|
|
||||||
protected PuzzleContainer pc;
|
|
||||||
protected int current_level;
|
|
||||||
protected int achieved_level;
|
|
||||||
protected int max_level;
|
|
||||||
protected SharedPreferences prefs;
|
|
||||||
protected SharedPreferences.Editor prefsEdit;
|
|
||||||
|
|
||||||
/*
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onCreate()
|
|
||||||
{
|
|
||||||
super.onCreate();
|
|
||||||
mApp = this;
|
|
||||||
pc = new PuzzleContainer();
|
|
||||||
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
|
|
||||||
prefsEdit = prefs.edit();
|
|
||||||
max_level = pc.getCount();
|
|
||||||
current_level = prefs.getInt("current_level", MIN_LEVEL);
|
|
||||||
achieved_level = prefs.getInt("achieved_level", MIN_LEVEL+10);
|
|
||||||
prefsEdit.apply();
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// This is a singleton object.
|
|
||||||
//
|
|
||||||
public static App theApp()
|
|
||||||
{
|
|
||||||
return mApp;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Puzzles.
|
|
||||||
//
|
|
||||||
public Puzzle getPuzzle( int level )
|
|
||||||
{
|
|
||||||
return pc.getPuzzle( level-1 );
|
|
||||||
}
|
|
||||||
public Puzzle getCurrentPuzzle()
|
|
||||||
{
|
|
||||||
return getPuzzle( getCurrentLevel() );
|
|
||||||
}
|
|
||||||
public Puzzle getPrevPuzzle()
|
|
||||||
{
|
|
||||||
if ( current_level != MIN_LEVEL )
|
|
||||||
return getPuzzle( getCurrentLevel()-1 );
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
public Puzzle getNextPuzzle()
|
|
||||||
{
|
|
||||||
if ( current_level != achieved_level )
|
|
||||||
return getPuzzle( getCurrentLevel()+1 );
|
|
||||||
else
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Provide amount of puzzles.
|
|
||||||
//
|
|
||||||
public final int getPuzzleCount()
|
|
||||||
{
|
|
||||||
return max_level;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Provide highest solved puzzle.
|
|
||||||
//
|
|
||||||
public final int getAchivedLevel()
|
|
||||||
{
|
|
||||||
return achieved_level;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Provide last played puzzle.
|
|
||||||
//
|
|
||||||
public final int getCurrentLevel()
|
|
||||||
{
|
|
||||||
return current_level;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Set the current puzzle level.
|
|
||||||
//
|
|
||||||
public void setCurrentLevel( int l )
|
|
||||||
{
|
|
||||||
if ( l > achieved_level )
|
|
||||||
l = MIN_LEVEL;
|
|
||||||
if ( l < MIN_LEVEL )
|
|
||||||
l = achieved_level;
|
|
||||||
if ( l != current_level )
|
|
||||||
{
|
|
||||||
current_level = l;
|
|
||||||
prefsEdit.putInt("current_level", current_level);
|
|
||||||
prefsEdit.apply();
|
|
||||||
if ( !prefs.edit().commit() )
|
|
||||||
Log.d(TAG, "prefs.edit().commit() failed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Set achieved level.
|
|
||||||
//
|
|
||||||
public void advanceAchivedLevel( int l )
|
|
||||||
{
|
|
||||||
if ( l > max_level )
|
|
||||||
l = max_level;
|
|
||||||
if ( l > achieved_level )
|
|
||||||
{
|
|
||||||
achieved_level = l;
|
|
||||||
prefsEdit.putInt("achieved_level", achieved_level);
|
|
||||||
prefsEdit.apply();
|
|
||||||
if ( !prefs.edit().commit() )
|
|
||||||
Log.d(TAG, "prefs.edit().commit() failed.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
package org.vostan.sokoban.menu;
|
|
||||||
|
|
||||||
import org.vostan.sokoban.play.PlayActivity;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.FragmentActivity;
|
|
||||||
import android.support.v4.app.FragmentManager;
|
|
||||||
import android.support.v4.app.FragmentTransaction;
|
|
||||||
import android.view.Window;
|
|
||||||
|
|
||||||
import org.vostan.sokoban.R;
|
|
||||||
import static org.vostan.sokoban.App.theApp;
|
|
||||||
|
|
||||||
public class MainActivity extends FragmentActivity
|
|
||||||
{
|
|
||||||
protected final String TAG = "SokobanMenu";
|
|
||||||
protected final String LEVEL= "org.dyndns.vahagn.sokoban.LEVEL";
|
|
||||||
protected MainFragment mainFragment;
|
|
||||||
protected PuzzleListFragment puzzleListFragment;
|
|
||||||
protected float puzzleListXScroll;
|
|
||||||
protected float puzzleListXScrollMax;
|
|
||||||
|
|
||||||
/** Called when the activity is first created. */
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
|
||||||
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.main_activity);
|
|
||||||
|
|
||||||
mainFragment = new MainFragment();
|
|
||||||
puzzleListFragment = new PuzzleListFragment();
|
|
||||||
puzzleListFragment.setOnPuzzleListAction(new PuzzleListFragment.OnPuzzleListAction() {
|
|
||||||
public boolean onPuzzleGridDown() {
|
|
||||||
return onPuzzleGridDown1();
|
|
||||||
}
|
|
||||||
public boolean onPuzzleGridXScroll(float x) {
|
|
||||||
return onPuzzleGridXScroll1(x);
|
|
||||||
}
|
|
||||||
public void onPuzzleLevelClicked(int level) {
|
|
||||||
onPuzzleClicked1(level);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
puzzleListXScrollMax = getWindowManager().getDefaultDisplay().getWidth();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Set initila fragment.
|
|
||||||
//
|
|
||||||
FragmentManager fragmentManager = getSupportFragmentManager();
|
|
||||||
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
|
|
||||||
fragmentTransaction.add(R.id.fragment_container, mainFragment);
|
|
||||||
// fragmentTransaction.add(R.id.fragment_container, puzzleListFragment);
|
|
||||||
fragmentTransaction.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
//@Override
|
|
||||||
public void onConfigurationChanged()
|
|
||||||
{
|
|
||||||
// super.onConfigurationChanged();
|
|
||||||
// setContentView(R.layout-l.menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onStartCurrentPuzzle(View v)
|
|
||||||
{
|
|
||||||
Intent intent = new Intent(this, PlayActivity.class);
|
|
||||||
startActivity( intent );
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPuzzleListShow(View v)
|
|
||||||
{
|
|
||||||
getSupportFragmentManager()
|
|
||||||
.beginTransaction()
|
|
||||||
.setCustomAnimations(R.animator.fragment_slide_left_enter,
|
|
||||||
R.animator.fragment_slide_left_exit)
|
|
||||||
.replace(R.id.fragment_container, puzzleListFragment)
|
|
||||||
.commit();
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onPuzzleGridDown1()
|
|
||||||
{
|
|
||||||
puzzleListXScroll = 0;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onPuzzleGridXScroll1( float x )
|
|
||||||
{
|
|
||||||
puzzleListXScroll += x;
|
|
||||||
/*
|
|
||||||
getSupportFragmentManager()
|
|
||||||
.beginTransaction()
|
|
||||||
.setCustomAnimations(R.animator.fragment_slide_right_enter,
|
|
||||||
R.animator.fragment_slide_right_exit)
|
|
||||||
.commit();
|
|
||||||
*/
|
|
||||||
if ( -puzzleListXScroll/puzzleListXScrollMax > 0.5 )
|
|
||||||
{
|
|
||||||
getSupportFragmentManager()
|
|
||||||
.beginTransaction()
|
|
||||||
.setCustomAnimations(R.animator.fragment_slide_right_enter,
|
|
||||||
R.animator.fragment_slide_right_exit)
|
|
||||||
.replace(R.id.fragment_container, mainFragment)
|
|
||||||
.commit();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPuzzleClicked1( int level )
|
|
||||||
{
|
|
||||||
if ( level <= theApp().getAchivedLevel() )
|
|
||||||
{
|
|
||||||
theApp().setCurrentLevel(level);
|
|
||||||
Intent intent = new Intent(this, PlayActivity.class);
|
|
||||||
startActivity( intent );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.vostan.sokoban.menu;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.Button;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import static org.vostan.sokoban.App.theApp;
|
|
||||||
import org.vostan.sokoban.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author vahagnk
|
|
||||||
*/
|
|
||||||
public class MainFragment extends Fragment
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle)
|
|
||||||
{
|
|
||||||
super.onCreate(icicle);
|
|
||||||
View v = inflater.inflate(R.layout.main_fragment, container, false);
|
|
||||||
if ( theApp().getAchivedLevel() == 1 )
|
|
||||||
((Button)v.findViewById(R.id.btn_start)).setText(R.string.btn_start_begin);
|
|
||||||
//
|
|
||||||
// Set Footer.
|
|
||||||
//
|
|
||||||
String str = getString(R.string.copyright) + "\n"
|
|
||||||
+getString(R.string.version_tag) + " " + getString(R.string.git_version);
|
|
||||||
((TextView)v.findViewById(R.id.footer_txt)).setText(str);
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.vostan.sokoban.menu;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.graphics.BitmapFactory;
|
|
||||||
import android.graphics.Canvas;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.graphics.Paint;
|
|
||||||
import android.graphics.Rect;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.util.TypedValue;
|
|
||||||
import android.view.GestureDetector;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.BaseAdapter;
|
|
||||||
import android.widget.GridView;
|
|
||||||
import android.widget.ImageView;
|
|
||||||
|
|
||||||
import org.vostan.sokoban.R;
|
|
||||||
|
|
||||||
import static org.vostan.sokoban.App.theApp;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class PuzzleListFragment extends Fragment
|
|
||||||
{
|
|
||||||
protected GridView puzzleGrid;
|
|
||||||
protected PuzzlesAdapter puzzleGridAdapter;
|
|
||||||
protected GestureDetector gridViewXScrollDetector;
|
|
||||||
protected OnPuzzleListAction actionListener;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These are events which the fragments delegates to activity.
|
|
||||||
*/
|
|
||||||
public interface OnPuzzleListAction
|
|
||||||
{
|
|
||||||
public boolean onPuzzleGridDown();
|
|
||||||
public boolean onPuzzleGridXScroll( float x );
|
|
||||||
public void onPuzzleLevelClicked( int level );
|
|
||||||
}
|
|
||||||
public void setOnPuzzleListAction( OnPuzzleListAction l )
|
|
||||||
{
|
|
||||||
actionListener = l;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle)
|
|
||||||
{
|
|
||||||
super.onCreate(icicle);
|
|
||||||
View v = inflater.inflate(R.layout.puzzle_list_fragment, container, false);
|
|
||||||
//
|
|
||||||
// Configure GridView.
|
|
||||||
//
|
|
||||||
puzzleGrid = (GridView)v.findViewById(R.id.puzzle_grid);
|
|
||||||
puzzleGridAdapter = new PuzzlesAdapter(getActivity());
|
|
||||||
puzzleGrid.setAdapter( puzzleGridAdapter );
|
|
||||||
puzzleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
||||||
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
|
|
||||||
{
|
|
||||||
onPuzzleClicked(v,(int)id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
puzzleGrid.setOnTouchListener( new View.OnTouchListener() {
|
|
||||||
public boolean onTouch(View view, MotionEvent me) {
|
|
||||||
gridViewXScrollDetector.onTouchEvent( me );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
gridViewXScrollDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
|
|
||||||
public boolean onDown(MotionEvent e) {
|
|
||||||
return (actionListener!=null) ? actionListener.onPuzzleGridDown() : false;
|
|
||||||
}
|
|
||||||
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) {
|
|
||||||
return (actionListener!=null) ? actionListener.onPuzzleGridXScroll(dx) : false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume()
|
|
||||||
{
|
|
||||||
super.onResume();
|
|
||||||
if ( puzzleGrid != null )
|
|
||||||
puzzleGridAdapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onPuzzleClicked(View v, int level )
|
|
||||||
{
|
|
||||||
if (actionListener!=null)
|
|
||||||
actionListener.onPuzzleLevelClicked(level);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PuzzlesAdapter extends BaseAdapter
|
|
||||||
{
|
|
||||||
private Context context;
|
|
||||||
private int icon_size;
|
|
||||||
private int text_x;
|
|
||||||
private int text_y;
|
|
||||||
private Bitmap lock_icon;
|
|
||||||
private Bitmap unlock_icon;
|
|
||||||
private Paint paint;
|
|
||||||
|
|
||||||
public PuzzlesAdapter(Context c)
|
|
||||||
{
|
|
||||||
context = c;
|
|
||||||
icon_size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10, getResources().getDisplayMetrics() );
|
|
||||||
int text_size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 4, getResources().getDisplayMetrics() );
|
|
||||||
text_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 9, getResources().getDisplayMetrics() );
|
|
||||||
text_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 9, getResources().getDisplayMetrics() );
|
|
||||||
|
|
||||||
Bitmap lock_icon_tmp = BitmapFactory.decodeResource( getResources(), R.drawable.lock );
|
|
||||||
lock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
|
|
||||||
Canvas lock_canvas = new Canvas(lock_icon);
|
|
||||||
lock_canvas.drawBitmap(lock_icon_tmp,
|
|
||||||
new Rect(0,0,lock_icon_tmp.getWidth()-1,lock_icon_tmp.getHeight()-1),
|
|
||||||
new Rect(0,0,icon_size, icon_size),
|
|
||||||
null);
|
|
||||||
|
|
||||||
Bitmap unlock_icon_tmp = BitmapFactory.decodeResource( getResources(), R.drawable.unlock );
|
|
||||||
unlock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
|
|
||||||
Canvas unlock_canvas = new Canvas(unlock_icon);
|
|
||||||
unlock_canvas.drawBitmap(unlock_icon_tmp,
|
|
||||||
new Rect(0,0,unlock_icon_tmp.getWidth()-1,unlock_icon_tmp.getHeight()-1),
|
|
||||||
new Rect(0,0,icon_size, icon_size),
|
|
||||||
null);
|
|
||||||
|
|
||||||
paint = new Paint();
|
|
||||||
paint.setColor( Color.WHITE );
|
|
||||||
paint.setTextSize( text_size );
|
|
||||||
paint.setTextAlign(Paint.Align.RIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getCount()
|
|
||||||
{
|
|
||||||
return theApp().getPuzzleCount();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object getItem(int position)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getItemId(int position)
|
|
||||||
{
|
|
||||||
return position+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// create a new ImageView for each item referenced by the Adapter
|
|
||||||
public View getView(int position, View convertView, ViewGroup parent)
|
|
||||||
{
|
|
||||||
ImageView imageView;
|
|
||||||
if (convertView == null)
|
|
||||||
{ // if it's not recycled, initialize some attributes
|
|
||||||
imageView = new ImageView(context);
|
|
||||||
imageView.setLayoutParams(new GridView.LayoutParams(icon_size, icon_size));
|
|
||||||
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
imageView = (ImageView) convertView;
|
|
||||||
|
|
||||||
int id = (int)getItemId(position);
|
|
||||||
Bitmap icon = ( id <= theApp().getAchivedLevel() )
|
|
||||||
? unlock_icon.copy(Bitmap.Config.ARGB_8888,true)
|
|
||||||
: lock_icon.copy(Bitmap.Config.ARGB_8888,true);
|
|
||||||
Canvas canvas = new Canvas(icon);
|
|
||||||
canvas.drawText( Integer.toString(id), text_x, text_y, paint);
|
|
||||||
imageView.setImageBitmap(icon);
|
|
||||||
return imageView;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
30
app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<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">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="85.84757"
|
||||||
|
android:endY="92.4963"
|
||||||
|
android:startX="42.9492"
|
||||||
|
android:startY="49.59793"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#44000000"
|
||||||
|
android:offset="0.0" />
|
||||||
|
<item
|
||||||
|
android:color="#00000000"
|
||||||
|
android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
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"
|
||||||
|
android:strokeWidth="1"
|
||||||
|
android:strokeColor="#00000000" />
|
||||||
|
</vector>
|
||||||
170
app/src/main/res/drawable/ic_launcher_background.xml
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportWidth="108"
|
||||||
|
android:viewportHeight="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="#3DDC84"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeWidth="0.8"
|
||||||
|
android:strokeColor="#33FFFFFF" />
|
||||||
|
</vector>
|
||||||
54
app/src/main/res/layout/activity_welcome.xml
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".WelcomeActivity">
|
||||||
|
|
||||||
|
<!--com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/AppBarOverlay">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:background="?attr/colorPrimary"
|
||||||
|
app:popupTheme="@style/PopupOverlay" />
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout-->
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/content_welcome"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<!--fragment
|
||||||
|
android:id="@+id/welcome_fragment"
|
||||||
|
android:name="org.vostan.banvor.WelcomeFragment"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:defaultNavHost="true"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:navGraph="@layout/fragment_welcome" /-->
|
||||||
|
|
||||||
|
<!--com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||||
|
android:id="@+id/fab"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="bottom|end"
|
||||||
|
android:layout_marginEnd="@dimen/fab_margin"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
app:srcCompat="@android:drawable/ic_dialog_email" /-->
|
||||||
|
|
||||||
|
<!-- <androidx.fragment.app.FragmentContainerView-->
|
||||||
|
<!-- android:id="@+id/fragmentContainerView"-->
|
||||||
|
<!-- android:name="org.vostan.banvor.WelcomeFragment"-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="match_parent" />-->
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
19
app/src/main/res/layout/content_welcome.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/nav_host_fragment_content_welcome"
|
||||||
|
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
app:defaultNavHost="true"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
|
app:layout_constraintLeft_toLeftOf="parent"
|
||||||
|
app:layout_constraintRight_toRightOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:navGraph="@navigation/nav_graph" />
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
118
app/src/main/res/layout/fragment_puzzle_board.xml
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".PuzzleBoardFragment">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/blure"
|
||||||
|
android:orientation="vertical"
|
||||||
|
tools:layout_editor_absoluteX="1dp"
|
||||||
|
tools:layout_editor_absoluteY="1dp">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/level_text"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:paddingLeft="5dp"
|
||||||
|
android:textColor="@color/puzzle_title"
|
||||||
|
android:textScaleX="1"
|
||||||
|
android:textSize="40dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:typeface="normal"
|
||||||
|
android:text="Level"/>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/level_number"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:paddingLeft="10dp"
|
||||||
|
android:textColor="@color/puzzle_title"
|
||||||
|
android:textScaleX="1"
|
||||||
|
android:textSize="40dp"
|
||||||
|
android:textStyle="bold"
|
||||||
|
android:typeface="normal"
|
||||||
|
android:text="XX" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:id="@+id/view"
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:src="@drawable/prev"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:layout_margin="0dp"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:onClick="onPrev"
|
||||||
|
android:id="@+id/btn_prev"/>
|
||||||
|
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:src="@drawable/next"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:layout_margin="0dp"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:id="@+id/btn_next"/>
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_reset"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_margin="0dp"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@drawable/reset" />
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_undo"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_margin="3dp"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:src="@drawable/undo" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- <View-->
|
||||||
|
<!-- android:layout_width="0dp"-->
|
||||||
|
<!-- android:layout_height="match_parent"-->
|
||||||
|
<!-- android:layout_weight="1" />-->
|
||||||
|
|
||||||
|
<org.vostan.banvor.board.PuzzleControl
|
||||||
|
android:id="@+id/game_board"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
51
app/src/main/res/layout/fragment_puzzle_list.xml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/splash"
|
||||||
|
tools:context=".PuzzleListFragment">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
tools:layout_editor_absoluteX="1dp"
|
||||||
|
tools:layout_editor_absoluteY="1dp">
|
||||||
|
|
||||||
|
<!-- <androidx.recyclerview.widget.RecyclerView-->
|
||||||
|
<!-- android:layout_width="match_parent"-->
|
||||||
|
<!-- android:layout_height="match_parent"-->
|
||||||
|
<!-- android:layout_weight="1"-->
|
||||||
|
<!-- android:background="@color/transparent"-->
|
||||||
|
<!-- tools:itemCount="3" />-->
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="20dp"
|
||||||
|
android:layout_weight="2"
|
||||||
|
android:background="@color/transparent" />
|
||||||
|
|
||||||
|
<GridView
|
||||||
|
android:id="@+id/puzzle_grid"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="70dp"
|
||||||
|
android:layout_weight="7"
|
||||||
|
android:verticalSpacing="10dp"
|
||||||
|
android:columnWidth="@dimen/puzzle_list_icon_size"
|
||||||
|
android:numColumns="auto_fit"
|
||||||
|
android:stretchMode="columnWidth"
|
||||||
|
android:gravity="center"
|
||||||
|
android:background="@color/blure"/>
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="10dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="@color/transparent" />
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
107
app/src/main/res/layout/fragment_welcome.xml
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@drawable/splash"
|
||||||
|
tools:context=".WelcomeFragment">
|
||||||
|
|
||||||
|
<!--View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_gravity="top"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center" /-->
|
||||||
|
<!--Button
|
||||||
|
android:id="@+id/btn_start"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
|
||||||
|
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
|
||||||
|
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
|
||||||
|
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:padding="@dimen/main_menu_btn_padding"
|
||||||
|
android:background="@color/main_menu_btn_bg"
|
||||||
|
android:textColor="@color/main_menu_btn_text"
|
||||||
|
android:textSize="@dimen/main_menu_text_size"
|
||||||
|
android:text="@string/btn_start_continue"
|
||||||
|
android:onClick="onStartCurrentPuzzle" /-->
|
||||||
|
<!--Button
|
||||||
|
android:id="@+id/btn_puzzles"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
|
||||||
|
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
|
||||||
|
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
|
||||||
|
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:padding="@dimen/main_menu_btn_padding"
|
||||||
|
android:background="@color/main_menu_btn_bg"
|
||||||
|
android:textColor="@color/main_menu_btn_text"
|
||||||
|
android:textSize="@dimen/main_menu_text_size"
|
||||||
|
android:text="@string/btn_puzzles"
|
||||||
|
android:onClick="onPuzzleListShow" /-->
|
||||||
|
<!--View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:gravity="center" /-->
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
tools:layout_editor_absoluteX="1dp"
|
||||||
|
tools:layout_editor_absoluteY="1dp">
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="10"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_continue"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:background="@color/welcome_btn_bg"
|
||||||
|
android:text="@string/btn_start_continue" />
|
||||||
|
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="10dp"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_puzzles"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:background="@color/welcome_btn_bg"
|
||||||
|
android:text="@string/btn_puzzles" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="?android:attr/listDivider" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/footer_txt"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/git_version"
|
||||||
|
android:textColor="@color/on_primary" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/fragment_container"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent">
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:background="@drawable/splash"
|
|
||||||
android:gravity="center_vertical">
|
|
||||||
<View
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
android:layout_gravity="top"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center" />
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_start"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
|
|
||||||
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
|
|
||||||
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
|
|
||||||
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:padding="@dimen/main_menu_btn_padding"
|
|
||||||
android:background="@color/main_menu_btn_bg"
|
|
||||||
android:textColor="@color/main_menu_btn_text"
|
|
||||||
android:textSize="@dimen/main_menu_text_size"
|
|
||||||
android:text="@string/btn_start_continue"
|
|
||||||
android:onClick="onStartCurrentPuzzle" />
|
|
||||||
<Button
|
|
||||||
android:id="@+id/btn_puzzles"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
|
|
||||||
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
|
|
||||||
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
|
|
||||||
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:padding="@dimen/main_menu_btn_padding"
|
|
||||||
android:background="@color/main_menu_btn_bg"
|
|
||||||
android:textColor="@color/main_menu_btn_text"
|
|
||||||
android:textSize="@dimen/main_menu_text_size"
|
|
||||||
android:text="@string/btn_puzzles"
|
|
||||||
android:onClick="onPuzzleListShow" />
|
|
||||||
<View
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:gravity="center" />
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/footer_txt"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/git_version"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:gravity="center" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent">
|
|
||||||
<GridView
|
|
||||||
android:id="@+id/puzzle_grid"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:horizontalSpacing="2mm"
|
|
||||||
android:verticalSpacing="2mm"
|
|
||||||
android:columnWidth="10mm"
|
|
||||||
android:numColumns="auto_fit"
|
|
||||||
android:stretchMode="columnWidth"
|
|
||||||
android:gravity="center" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:id="@+id/puzzle_view_title_layout"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:background="#60404040"
|
|
||||||
android:layout_height="48dp"
|
|
||||||
android:layout_width="match_parent">
|
|
||||||
<!--ImageButton
|
|
||||||
android:src="@drawable/prev"
|
|
||||||
android:scaleType="fitCenter"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:layout_margin="3dp"
|
|
||||||
android:background="#00000000"
|
|
||||||
android:onClick="onPrev"
|
|
||||||
android:id="@+id/prev_btn"/-->
|
|
||||||
<TextView
|
|
||||||
android:text="Level"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:textSize="40sp"
|
|
||||||
android:paddingLeft="5dp"
|
|
||||||
android:textScaleX="1"
|
|
||||||
android:textColor="#FFE680"
|
|
||||||
android:textStyle="bold"
|
|
||||||
android:typeface="normal"
|
|
||||||
android:gravity="center_vertical"
|
|
||||||
android:id="@+id/title_text"/>
|
|
||||||
<View
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="1"/>
|
|
||||||
<ImageButton
|
|
||||||
android:src="@drawable/undo"
|
|
||||||
android:scaleType="fitCenter"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:layout_margin="3dp"
|
|
||||||
android:background="#00000000"
|
|
||||||
android:onClick="onUndo"
|
|
||||||
android:id="@+id/undo_btn"/>
|
|
||||||
<ImageButton
|
|
||||||
android:src="@drawable/reset"
|
|
||||||
android:scaleType="fitCenter"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:layout_margin="3dp"
|
|
||||||
android:background="#00000000"
|
|
||||||
android:onClick="onReset"
|
|
||||||
android:id="@+id/reset_btn"/>
|
|
||||||
<!--ImageButton
|
|
||||||
android:src="@drawable/next"
|
|
||||||
android:scaleType="fitCenter"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="20dp"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:layout_weight="0"
|
|
||||||
android:layout_margin="3dp"
|
|
||||||
android:background="#00000000"
|
|
||||||
android:onClick="onNext"
|
|
||||||
android:id="@+id/next_btn"/-->
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 982 B |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
41
app/src/main/res/navigation/nav_graph.xml
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/nav_graph"
|
||||||
|
app:startDestination="@id/WelcomeFragment">
|
||||||
|
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/WelcomeFragment"
|
||||||
|
android:name="org.vostan.banvor.WelcomeFragment"
|
||||||
|
android:label="@string/welcome_fragment_label"
|
||||||
|
tools:layout="@layout/fragment_welcome">
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_WelcomeFragment_to_PuzzleListFragment"
|
||||||
|
app:destination="@id/PuzzleListFragment"
|
||||||
|
app:enterAnim="@anim/nav_default_enter_anim"
|
||||||
|
app:exitAnim="@anim/nav_default_exit_anim" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_WelcomeFragment_to_PuzzleBoardFragment"
|
||||||
|
app:destination="@id/PuzzleBoardFragment" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/PuzzleListFragment"
|
||||||
|
android:name="org.vostan.banvor.PuzzleListFragment"
|
||||||
|
android:label="fragment_puzzle_list"
|
||||||
|
tools:layout="@layout/fragment_puzzle_list">
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_PuzzleListFragment_to_PuzzleBoardFragment"
|
||||||
|
app:destination="@id/PuzzleBoardFragment" />
|
||||||
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/PuzzleBoardFragment"
|
||||||
|
android:name="org.vostan.banvor.PuzzleBoardFragment"
|
||||||
|
android:label="fragment_puzzle_board"
|
||||||
|
tools:layout="@layout/fragment_puzzle_board" >
|
||||||
|
<argument
|
||||||
|
android:name="level"
|
||||||
|
app:argType="integer"
|
||||||
|
android:defaultValue="1" />
|
||||||
|
</fragment>
|
||||||
|
</navigation>
|
||||||
3
app/src/main/res/values-land/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
17
app/src/main/res/values-night/themes.xml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/secondary</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/secondary_variant</item>
|
||||||
|
<item name="colorOnPrimary">@color/on_secondary</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/primary</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/primary_variant</item>
|
||||||
|
<item name="colorOnSecondary">@color/on_primary</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:background">@color/secondary_bg</item>
|
||||||
|
</style>
|
||||||
|
</resources>
|
||||||
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">200dp</dimen>
|
||||||
|
</resources>
|
||||||
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -18,6 +18,18 @@
|
|||||||
*/
|
*/
|
||||||
-->
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
<color name="main_menu_btn_bg">#80404040</color>
|
<color name="transparent">#00000000</color>
|
||||||
|
<color name="blure">#80000000</color>
|
||||||
|
<color name="welcome_btn_bg">#40FFFFFF</color>
|
||||||
<color name="main_menu_btn_text">#C0C0C0C0</color>
|
<color name="main_menu_btn_text">#C0C0C0C0</color>
|
||||||
|
<color name="puzzle_title">#FFFFE680</color>
|
||||||
|
|
||||||
|
<color name="primary">#FFC107</color>
|
||||||
|
<color name="primary_bg">#000000</color>
|
||||||
|
<color name="primary_variant">#FF5722</color>
|
||||||
|
<color name="secondary">#913213</color>
|
||||||
|
<color name="secondary_bg">#000000</color>
|
||||||
|
<color name="secondary_variant">#AA6601</color>
|
||||||
|
<color name="on_secondary">#661C17</color>
|
||||||
|
<color name="on_primary">#FF5722</color>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?><!--
|
||||||
<!--
|
|
||||||
/*
|
/*
|
||||||
**
|
**
|
||||||
** Copyright 2008, The Android Open Source Project
|
** Copyright 2008, The Android Open Source Project
|
||||||
@@ -23,4 +22,11 @@
|
|||||||
<dimen name="main_menu_btn_hmargin">10pt</dimen>
|
<dimen name="main_menu_btn_hmargin">10pt</dimen>
|
||||||
<dimen name="main_menu_btn_vmargin">2pt</dimen>
|
<dimen name="main_menu_btn_vmargin">2pt</dimen>
|
||||||
<dimen name="main_menu_btn_padding">10pt</dimen>
|
<dimen name="main_menu_btn_padding">10pt</dimen>
|
||||||
|
<dimen name="fab_margin">16dp</dimen>
|
||||||
|
<dimen name="puzzle_list_icon_size">100dp</dimen>
|
||||||
|
<dimen name="puzzle_list_number_size">50dp</dimen>
|
||||||
|
<!-- Puzzle number is aligned to right of this coordinate. -->
|
||||||
|
<dimen name="puzzle_list_number_x_coord">95dp</dimen>
|
||||||
|
<dimen name="puzzle_list_number_y_coord">95dp</dimen>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
@@ -9,4 +9,9 @@
|
|||||||
<string name="btn_puzzles">Puzzles</string>
|
<string name="btn_puzzles">Puzzles</string>
|
||||||
<string name="version_tag">Version:</string>
|
<string name="version_tag">Version:</string>
|
||||||
<string name="copyright">(c) 2013 Vahagn Khachatryan</string>
|
<string name="copyright">(c) 2013 Vahagn Khachatryan</string>
|
||||||
|
<string name="title_activity_welcome">WelcomeActivity</string>
|
||||||
|
<!-- Strings used for fragments for navigation -->
|
||||||
|
<string name="welcome_fragment_label">Welcome Fragment</string>
|
||||||
|
<string name="puzzle_list_fragment_label">Puzzle List Fragment</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
26
app/src/main/res/values/themes.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
|
<!-- Primary brand color. -->
|
||||||
|
<item name="colorPrimary">@color/primary</item>
|
||||||
|
<item name="colorPrimaryVariant">@color/primary_variant</item>
|
||||||
|
<item name="colorOnPrimary">@color/on_primary</item>
|
||||||
|
<!-- Secondary brand color. -->
|
||||||
|
<item name="colorSecondary">@color/secondary</item>
|
||||||
|
<item name="colorSecondaryVariant">@color/secondary_variant</item>
|
||||||
|
<item name="colorOnSecondary">@color/on_secondary</item>
|
||||||
|
<!-- Status bar color. -->
|
||||||
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:background">@color/primary_bg</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="NoActionBar">
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
|
||||||
|
|
||||||
|
<style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
|
||||||
|
</resources>
|
||||||
17
app/src/test/java/org/vostan/banvor/ExampleUnitTest.java
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example local unit test, which will execute on the development machine (host).
|
||||||
|
*
|
||||||
|
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
|
||||||
|
*/
|
||||||
|
public class ExampleUnitTest {
|
||||||
|
@Test
|
||||||
|
public void addition_isCorrect() {
|
||||||
|
assertEquals(4, 2 + 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
package org.vostan.sokoban.menu;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
|
||||||
import android.test.ActivityInstrumentationTestCase2;
|
|
||||||
import android.widget.Spinner;
|
|
||||||
|
|
||||||
import org.vostan.sokoban.menu.MainActivity;
|
|
||||||
import org.vostan.sokoban.R;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is a simple framework for a test of an Application. See
|
|
||||||
* {@link android.test.ApplicationTestCase ApplicationTestCase} for more information on
|
|
||||||
* how to write and extend Application tests.
|
|
||||||
*
|
|
||||||
* <p>To run this test, you can type:
|
|
||||||
* adb shell am instrument -w \
|
|
||||||
* -e class com.example.android.activityinstrumentation.MainActivityTest \
|
|
||||||
* quux.tests/android.test.InstrumentationTestRunner
|
|
||||||
*
|
|
||||||
* <p>Individual tests are defined as any method beginning with 'test'.
|
|
||||||
*
|
|
||||||
* <p>ActivityInstrumentationTestCase2 allows these tests to run alongside a running
|
|
||||||
* copy of the application under inspection. Calling getActivity() will return a
|
|
||||||
* handle to this activity (launching it if needed).
|
|
||||||
*/
|
|
||||||
public class MainActivityTest
|
|
||||||
extends ActivityInstrumentationTestCase2<MainActivity> {
|
|
||||||
|
|
||||||
MainActivity mActivity;
|
|
||||||
|
|
||||||
public MainActivityTest() {
|
|
||||||
super("org.vostan.sokoban.menu.MainActivity", MainActivity.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setUp() throws Exception {
|
|
||||||
mActivity = getActivity();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test to make sure that spinner values are persisted across activity restarts.
|
|
||||||
*
|
|
||||||
* <p>Launches the main activity, sets a spinner value, closes the activity, then relaunches
|
|
||||||
* that activity. Checks to make sure that the spinner values match what we set them to.
|
|
||||||
*/
|
|
||||||
// BEGIN_INCLUDE (test_name)
|
|
||||||
public void testSpinnerValuePersistedBetweenLaunches() {
|
|
||||||
/*
|
|
||||||
// END_INCLUDE (test_name)
|
|
||||||
final int TEST_SPINNER_POSITION_1 = MainActivity.WEATHER_PARTLY_CLOUDY;
|
|
||||||
|
|
||||||
// BEGIN_INCLUDE (launch_activity)
|
|
||||||
// Launch the activity
|
|
||||||
Activity activity = getActivity();
|
|
||||||
// END_INCLUDE (launch_activity)
|
|
||||||
|
|
||||||
// BEGIN_INCLUDE (write_to_ui)
|
|
||||||
// Set spinner to test position 1
|
|
||||||
final Spinner spinner1 = (Spinner) activity.findViewById(R.id.spinner);
|
|
||||||
activity.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Attempts to manipulate the UI must be performed on a UI thread.
|
|
||||||
// Calling this outside runOnUiThread() will cause an exception.
|
|
||||||
//
|
|
||||||
// You could also use @UiThreadTest, but activity lifecycle methods
|
|
||||||
// cannot be called if this annotation is used.
|
|
||||||
spinner1.requestFocus();
|
|
||||||
spinner1.setSelection(TEST_SPINNER_POSITION_1);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// END_INCLUDE (write_to_ui)
|
|
||||||
|
|
||||||
// BEGIN_INCLUDE (relaunch_activity)
|
|
||||||
// Close the activity
|
|
||||||
activity.finish();
|
|
||||||
setActivity(null); // Required to force creation of a new activity
|
|
||||||
|
|
||||||
// Relaunch the activity
|
|
||||||
activity = this.getActivity();
|
|
||||||
// END_INCLUDE (relaunch_activity)
|
|
||||||
|
|
||||||
// BEGIN_INCLUDE (check_results)
|
|
||||||
// Verify that the spinner was saved at position 1
|
|
||||||
final Spinner spinner2 = (Spinner) activity.findViewById(R.id.spinner);
|
|
||||||
int currentPosition = spinner2.getSelectedItemPosition();
|
|
||||||
assertEquals(TEST_SPINNER_POSITION_1, currentPosition);
|
|
||||||
// END_INCLUDE (check_results)
|
|
||||||
|
|
||||||
// Since this is a stateful test, we need to make sure that the activity isn't simply
|
|
||||||
// echoing a previously-stored value that (coincidently) matches position 1
|
|
||||||
final int TEST_SPINNER_POSITION_2 = MainActivity.WEATHER_SNOW;
|
|
||||||
|
|
||||||
// Set spinner to test position 2
|
|
||||||
activity.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
spinner2.requestFocus();
|
|
||||||
spinner2.setSelection(TEST_SPINNER_POSITION_2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Close the activity
|
|
||||||
activity.finish();
|
|
||||||
setActivity(null);
|
|
||||||
|
|
||||||
// Relaunch the activity
|
|
||||||
activity = this.getActivity();
|
|
||||||
|
|
||||||
// Verify that the spinner was saved at position 2
|
|
||||||
final Spinner spinner3 = (Spinner) activity.findViewById(R.id.spinner);
|
|
||||||
currentPosition = spinner3.getSelectedItemPosition();
|
|
||||||
assertEquals(TEST_SPINNER_POSITION_2, currentPosition);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
17
build.gradle
@@ -1,15 +1,20 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
buildscript {
|
buildscript {
|
||||||
repositories {
|
repositories {
|
||||||
jcenter()
|
google()
|
||||||
|
mavenCentral()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:0.13.2'
|
classpath "com.android.tools.build:gradle:7.0.2"
|
||||||
|
|
||||||
|
def nav_version = "2.3.5"
|
||||||
|
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
|
||||||
|
|
||||||
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
// in the individual module build.gradle files
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
task clean(type: Delete) {
|
||||||
repositories {
|
delete rootProject.buildDir
|
||||||
jcenter()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
19
gradle.properties
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Project-wide Gradle settings.
|
||||||
|
# IDE (e.g. Android Studio) users:
|
||||||
|
# Gradle settings configured through the IDE *will override*
|
||||||
|
# any settings specified in this file.
|
||||||
|
# For more details on how to configure your build environment visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/build_environment.html
|
||||||
|
# Specifies the JVM arguments used for the daemon process.
|
||||||
|
# The setting is particularly useful for tweaking memory settings.
|
||||||
|
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
||||||
|
# When configured, Gradle will run in incubating parallel mode.
|
||||||
|
# This option should only be used with decoupled projects. More details, visit
|
||||||
|
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
|
||||||
|
# org.gradle.parallel=true
|
||||||
|
# AndroidX package structure to make it clearer which packages are bundled with the
|
||||||
|
# Android operating system, and which are packaged with your app"s APK
|
||||||
|
# https://developer.android.com/topic/libraries/support-library/androidx-rn
|
||||||
|
android.useAndroidX=true
|
||||||
|
# Automatically convert third-party libraries to use AndroidX
|
||||||
|
android.enableJetifier=true
|
||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
6
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,6 @@
|
|||||||
#Wed Apr 10 15:27:10 PDT 2013
|
#Mon Sep 20 22:54:36 BST 2021
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|||||||
149
gradlew
vendored
@@ -1,4 +1,20 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
#
|
||||||
|
# Copyright 2015 the original author or authors.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
##
|
||||||
@@ -6,47 +22,6 @@
|
|||||||
##
|
##
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
DEFAULT_JVM_OPTS=""
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
|
||||||
APP_BASE_NAME=`basename "$0"`
|
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
|
||||||
MAX_FD="maximum"
|
|
||||||
|
|
||||||
warn ( ) {
|
|
||||||
echo "$*"
|
|
||||||
}
|
|
||||||
|
|
||||||
die ( ) {
|
|
||||||
echo
|
|
||||||
echo "$*"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
|
||||||
cygwin=false
|
|
||||||
msys=false
|
|
||||||
darwin=false
|
|
||||||
case "`uname`" in
|
|
||||||
CYGWIN* )
|
|
||||||
cygwin=true
|
|
||||||
;;
|
|
||||||
Darwin* )
|
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# For Cygwin, ensure paths are in UNIX format before anything is touched.
|
|
||||||
if $cygwin ; then
|
|
||||||
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
# Attempt to set APP_HOME
|
||||||
# Resolve links: $0 may be a link
|
# Resolve links: $0 may be a link
|
||||||
PRG="$0"
|
PRG="$0"
|
||||||
@@ -61,12 +36,53 @@ while [ -h "$PRG" ] ; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
SAVED="`pwd`"
|
SAVED="`pwd`"
|
||||||
cd "`dirname \"$PRG\"`/" >&-
|
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||||
APP_HOME="`pwd -P`"
|
APP_HOME="`pwd -P`"
|
||||||
cd "$SAVED" >&-
|
cd "$SAVED" >/dev/null
|
||||||
|
|
||||||
|
APP_NAME="Gradle"
|
||||||
|
APP_BASE_NAME=`basename "$0"`
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
|
MAX_FD="maximum"
|
||||||
|
|
||||||
|
warn () {
|
||||||
|
echo "$*"
|
||||||
|
}
|
||||||
|
|
||||||
|
die () {
|
||||||
|
echo
|
||||||
|
echo "$*"
|
||||||
|
echo
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# OS specific support (must be 'true' or 'false').
|
||||||
|
cygwin=false
|
||||||
|
msys=false
|
||||||
|
darwin=false
|
||||||
|
nonstop=false
|
||||||
|
case "`uname`" in
|
||||||
|
CYGWIN* )
|
||||||
|
cygwin=true
|
||||||
|
;;
|
||||||
|
Darwin* )
|
||||||
|
darwin=true
|
||||||
|
;;
|
||||||
|
MINGW* )
|
||||||
|
msys=true
|
||||||
|
;;
|
||||||
|
NONSTOP* )
|
||||||
|
nonstop=true
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
# Determine the Java command to use to start the JVM.
|
# Determine the Java command to use to start the JVM.
|
||||||
if [ -n "$JAVA_HOME" ] ; then
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
@@ -90,7 +106,7 @@ location of your Java installation."
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
|
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
MAX_FD_LIMIT=`ulimit -H -n`
|
||||||
if [ $? -eq 0 ] ; then
|
if [ $? -eq 0 ] ; then
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||||
@@ -110,11 +126,13 @@ if $darwin; then
|
|||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# For Cygwin, switch paths to Windows format before running java
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
if $cygwin ; then
|
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||||
|
|
||||||
|
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
# We build the pattern for arguments to be converted via cygpath
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||||
SEP=""
|
SEP=""
|
||||||
@@ -138,27 +156,30 @@ if $cygwin ; then
|
|||||||
else
|
else
|
||||||
eval `echo args$i`="\"$arg\""
|
eval `echo args$i`="\"$arg\""
|
||||||
fi
|
fi
|
||||||
i=$((i+1))
|
i=`expr $i + 1`
|
||||||
done
|
done
|
||||||
case $i in
|
case $i in
|
||||||
(0) set -- ;;
|
0) set -- ;;
|
||||||
(1) set -- "$args0" ;;
|
1) set -- "$args0" ;;
|
||||||
(2) set -- "$args0" "$args1" ;;
|
2) set -- "$args0" "$args1" ;;
|
||||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
3) set -- "$args0" "$args1" "$args2" ;;
|
||||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
|
# Escape application args
|
||||||
function splitJvmOpts() {
|
save () {
|
||||||
JVM_OPTS=("$@")
|
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||||
|
echo " "
|
||||||
}
|
}
|
||||||
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
|
APP_ARGS=`save "$@"`
|
||||||
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
|
|
||||||
|
|
||||||
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
|
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||||
|
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
||||||
|
|||||||
53
gradlew.bat
vendored
@@ -1,3 +1,19 @@
|
|||||||
|
@rem
|
||||||
|
@rem Copyright 2015 the original author or authors.
|
||||||
|
@rem
|
||||||
|
@rem Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
@rem you may not use this file except in compliance with the License.
|
||||||
|
@rem You may obtain a copy of the License at
|
||||||
|
@rem
|
||||||
|
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@rem
|
||||||
|
@rem Unless required by applicable law or agreed to in writing, software
|
||||||
|
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
@rem See the License for the specific language governing permissions and
|
||||||
|
@rem limitations under the License.
|
||||||
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%" == "" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@@ -8,20 +24,23 @@
|
|||||||
@rem Set local scope for the variables with windows NT shell
|
@rem Set local scope for the variables with windows NT shell
|
||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
|
||||||
set DEFAULT_JVM_OPTS=
|
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%" == "" set DIRNAME=.
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
|
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||||
|
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||||
|
|
||||||
|
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||||
|
|
||||||
@rem Find java.exe
|
@rem Find java.exe
|
||||||
if defined JAVA_HOME goto findJavaFromJavaHome
|
if defined JAVA_HOME goto findJavaFromJavaHome
|
||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto init
|
if "%ERRORLEVEL%" == "0" goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
@@ -35,7 +54,7 @@ goto fail
|
|||||||
set JAVA_HOME=%JAVA_HOME:"=%
|
set JAVA_HOME=%JAVA_HOME:"=%
|
||||||
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||||
|
|
||||||
if exist "%JAVA_EXE%" goto init
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
echo.
|
echo.
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||||
@@ -45,34 +64,14 @@ echo location of your Java installation.
|
|||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
:init
|
|
||||||
@rem Get command-line arguments, handling Windowz variants
|
|
||||||
|
|
||||||
if not "%OS%" == "Windows_NT" goto win9xME_args
|
|
||||||
if "%@eval[2+2]" == "4" goto 4NT_args
|
|
||||||
|
|
||||||
:win9xME_args
|
|
||||||
@rem Slurp the command line arguments.
|
|
||||||
set CMD_LINE_ARGS=
|
|
||||||
set _SKIP=2
|
|
||||||
|
|
||||||
:win9xME_args_slurp
|
|
||||||
if "x%~1" == "x" goto execute
|
|
||||||
|
|
||||||
set CMD_LINE_ARGS=%*
|
|
||||||
goto execute
|
|
||||||
|
|
||||||
:4NT_args
|
|
||||||
@rem Get arguments from the 4NT Shell from JP Software
|
|
||||||
set CMD_LINE_ARGS=%$
|
|
||||||
|
|
||||||
:execute
|
:execute
|
||||||
@rem Setup the command line
|
@rem Setup the command line
|
||||||
|
|
||||||
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||||
|
|
||||||
|
|
||||||
@rem Execute Gradle
|
@rem Execute Gradle
|
||||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
|
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
|
||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
|
|||||||
@@ -1 +1,10 @@
|
|||||||
|
dependencyResolutionManagement {
|
||||||
|
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
mavenCentral()
|
||||||
|
jcenter() // Warning: this repository is going to shut down soon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rootProject.name = "banvor"
|
||||||
include ':app'
|
include ':app'
|
||||||
|
|||||||