3 Commits
v2 ... x

8 changed files with 247 additions and 19 deletions

View File

@@ -25,7 +25,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">0x00010001</string>' ) versionFile.println( '<string name="version_code">0x00010002</string>' )
versionFile.println( '</resources>' ) versionFile.println( '</resources>' )
versionFile.close() versionFile.close()
} }
@@ -36,10 +36,18 @@ 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()
String backslash= System.getProperty("file.separator")
def buildDir = (new File(project.buildDir,'art')).toString()
buildDir = buildDir.replace(backslash,"/")
def cmd = "make -C ${indir} RES=${outdir} TMP=${buildDir}"
println cmd
def p = cmd.execute()
p.consumeProcessOutput(System.err,System.err)
p.waitFor() p.waitFor()
if ( p.exitValue() ) if ( p.exitValue() )
throw new GradleException("Generation of art failed.") throw new GradleException("Generation of art failed.")
@@ -60,7 +68,7 @@ android {
buildTypes { buildTypes {
release { release {
runProguard true runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.sokoban_release signingConfig signingConfigs.sokoban_release
} }

View File

@@ -1,11 +1,8 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here. # Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified # By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt # in C:\Program Files (x86)\Android\android-sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard # You can edit the include path and order by changing the proguardFiles
# include property in project.properties. # 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

View File

@@ -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="@string/version_code" android:versionCode="0x00010002"
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"/>

View File

@@ -0,0 +1,107 @@
//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])
// }
}
}

View File

@@ -32,6 +32,7 @@ public class App extends Application
max_level = pc.getCount(); max_level = pc.getCount();
current_level = prefs.getInt("current_level", MIN_LEVEL); current_level = prefs.getInt("current_level", MIN_LEVEL);
achieved_level = prefs.getInt("achieved_level", MIN_LEVEL+10); achieved_level = prefs.getInt("achieved_level", MIN_LEVEL+10);
prefsEdit.apply();
} }
// //
// This is a singleton object. // This is a singleton object.

View File

@@ -130,12 +130,12 @@ public class PlayActivity extends FragmentActivity
title_view.setVisibility(View.INVISIBLE); title_view.setVisibility(View.INVISIBLE);
} }
public boolean onReset( View v ) public void 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.
@@ -175,16 +175,16 @@ public class PlayActivity extends FragmentActivity
// //
// Undo last action. // Undo last action.
// //
public boolean onUndo( View v ) public void 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()

View File

@@ -22,7 +22,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_weight="0" android:layout_weight="0"
android:textSize="40dp" android:textSize="40sp"
android:paddingLeft="5dp" android:paddingLeft="5dp"
android:textScaleX="1" android:textScaleX="1"
android:textColor="#FFE680" android:textColor="#FFE680"

View File

@@ -0,0 +1,115 @@
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);
*/
}
}