Compare commits
1 Commits
v2
...
00e7a7f392
| Author | SHA1 | Date | |
|---|---|---|---|
| 00e7a7f392 |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
.settings
|
||||
.DS_store
|
||||
.gradle
|
||||
.idea
|
||||
bin
|
||||
@@ -8,6 +9,7 @@ nbandroid
|
||||
private
|
||||
build
|
||||
app/src/main/res/values/version.xml
|
||||
app/release
|
||||
compiler/compiler.obj
|
||||
compiler/compiler.exe
|
||||
compiler/test/compiler.exe
|
||||
|
||||
@@ -2,12 +2,14 @@ plugins {
|
||||
id 'com.android.application'
|
||||
}
|
||||
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
//
|
||||
// Creates version.xml
|
||||
//
|
||||
task createVersionXML {
|
||||
doLast {
|
||||
def versionP = 'git describe --tags --long --dirty=-x --abbrev=8'
|
||||
def versionP = 'git describe --tags --long --dirty=-x --always --abbrev=8'
|
||||
.execute()
|
||||
versionP.waitFor()
|
||||
def version = versionP.text.trim()
|
||||
@@ -72,13 +74,29 @@ android {
|
||||
sourceCompatibility JavaVersion.VERSION_1_8
|
||||
targetCompatibility JavaVersion.VERSION_1_8
|
||||
}
|
||||
buildFeatures {
|
||||
viewBinding true
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
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"
|
||||
}
|
||||
|
||||
|
||||
@@ -2,30 +2,23 @@
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.vostan.banvor"
|
||||
android:versionName="@string/git_version">
|
||||
<!--uses-sdk android:minSdkVersion="10"
|
||||
android:targetSdkVersion="14"/-->
|
||||
<application android:label="@string/app_name"
|
||||
|
||||
<application
|
||||
android:name=".App"
|
||||
android:icon="@drawable/icon"
|
||||
android:roundIcon="@drawable/icon"
|
||||
android:name="org.vostan.banvor.App"
|
||||
android:theme="@android:style/Theme">
|
||||
<activity android:name="org.vostan.banvor.menu.MainActivity"
|
||||
android:label="@string/app_name"
|
||||
android:configChanges="keyboardHidden|orientation"
|
||||
android:screenOrientation="portrait"
|
||||
android:exported="true">
|
||||
android:roundIcon="@drawable/icon"
|
||||
android:theme="@style/Theme.Banvor">
|
||||
<activity
|
||||
android:name=".WelcomeActivity"
|
||||
android:exported="true"
|
||||
android:label="@string/title_activity_welcome"
|
||||
>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
<activity android:name="org.vostan.banvor.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.banvor.MainMenu" />
|
||||
</activity>
|
||||
</application>
|
||||
|
||||
</manifest>
|
||||
@@ -4,6 +4,10 @@ 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";
|
||||
@@ -11,12 +15,8 @@ public class App extends Application
|
||||
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 State gameState;
|
||||
protected SharedPreferences prefs;
|
||||
protected SharedPreferences.Editor prefsEdit;
|
||||
|
||||
/*
|
||||
*
|
||||
@@ -26,98 +26,26 @@ public class App extends Application
|
||||
{
|
||||
super.onCreate();
|
||||
mApp = this;
|
||||
pc = new PuzzleContainer();
|
||||
|
||||
PuzzleContainer pc = new PuzzleContainer();
|
||||
gameState = new State(pc);
|
||||
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);
|
||||
|
||||
gameState.loadState(prefs);
|
||||
}
|
||||
|
||||
public void storeGameState(){
|
||||
gameState.storeState(prefs.edit());
|
||||
}
|
||||
|
||||
//
|
||||
// This is a singleton object.
|
||||
//
|
||||
public static App theApp()
|
||||
{
|
||||
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.");
|
||||
}
|
||||
|
||||
public State state(){
|
||||
return gameState;
|
||||
}
|
||||
}
|
||||
|
||||
147
app/src/main/java/org/vostan/banvor/PuzzleBoardFragment.java
Normal file
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
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
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
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,7 +2,7 @@
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.vostan.banvor.play;
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import androidx.core.view.ViewCompat;
|
||||
import java.util.LinkedList;
|
||||
@@ -13,92 +13,6 @@ import java.util.LinkedList;
|
||||
*/
|
||||
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 int steps;
|
||||
@@ -205,4 +119,90 @@ public class Animator implements Runnable
|
||||
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,4 +1,4 @@
|
||||
package org.vostan.banvor.play;
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.app.Dialog;
|
||||
@@ -6,6 +6,8 @@ import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.Window;
|
||||
import android.view.animation.Animation;
|
||||
@@ -17,7 +19,7 @@ import org.vostan.banvor.App;
|
||||
|
||||
import static org.vostan.banvor.App.theApp;
|
||||
import org.vostan.banvor.R;
|
||||
import org.vostan.banvor.Puzzle;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
public class PlayActivity extends FragmentActivity
|
||||
implements PuzzleControl.PuzzleControlLister
|
||||
@@ -41,16 +43,17 @@ public class PlayActivity extends FragmentActivity
|
||||
//
|
||||
// Create and set up the puzzle_view.
|
||||
//
|
||||
puzzle_view = new PuzzleControl( this );
|
||||
// puzzle_view = new PuzzleControl(this, new AttributeSet() {
|
||||
// });
|
||||
setContentView( puzzle_view );
|
||||
puzzle_view.setPuzzleControlLister( this );
|
||||
//
|
||||
// Create action bar.
|
||||
//
|
||||
FrameLayout rootLayout = (FrameLayout)findViewById(android.R.id.content);
|
||||
View.inflate(this, R.layout.puzzle_view_title, rootLayout);
|
||||
title_text = (TextView)findViewById(R.id.title_text);
|
||||
title_view = findViewById(R.id.puzzle_view_title_layout);
|
||||
View.inflate(this, R.layout.fragment_puzzle_board, rootLayout);
|
||||
title_text = (TextView)findViewById(R.id.level_text);
|
||||
// title_view = findViewById(R.id.puzzle_view_title_layout);
|
||||
//
|
||||
// Load the puzzle.
|
||||
//
|
||||
@@ -62,9 +65,9 @@ public class PlayActivity extends FragmentActivity
|
||||
//
|
||||
// Advance current level and achieved level.
|
||||
//
|
||||
final int nextl = theApp().getCurrentLevel()+1;
|
||||
theApp().advanceAchivedLevel(nextl);
|
||||
theApp().setCurrentLevel(nextl);
|
||||
final int nextl = theApp().state().getCurrentLevel()+1;
|
||||
// theApp().state().(nextl);
|
||||
theApp().state().setCurrentLevel(nextl);
|
||||
//
|
||||
// Bring a dialog for user to choose to continue or stop.
|
||||
//
|
||||
@@ -146,9 +149,9 @@ public class PlayActivity extends FragmentActivity
|
||||
// If current level is less than achived level the move to next
|
||||
// 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();
|
||||
puzzle_view.invalidate();
|
||||
}
|
||||
@@ -163,9 +166,9 @@ public class PlayActivity extends FragmentActivity
|
||||
// If current level is less than achived level the move to next
|
||||
// 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();
|
||||
puzzle_view.invalidate();
|
||||
|
||||
@@ -189,13 +192,13 @@ public class PlayActivity extends FragmentActivity
|
||||
|
||||
private void loadCurrentPuzzle()
|
||||
{
|
||||
puzzle = theApp().getCurrentPuzzle();
|
||||
puzzle = theApp().state().getCurrentPuzzle();
|
||||
puzzle_view.setPuzzle(puzzle);
|
||||
updateTitle();
|
||||
}
|
||||
public void updateTitle()
|
||||
{
|
||||
String title = "Level " + new Integer(theApp().getCurrentLevel()).toString();
|
||||
String title = "Level " + new Integer(theApp().state().getCurrentLevel()).toString();
|
||||
setTitle(title);
|
||||
}
|
||||
public void setTitle(CharSequence title)
|
||||
@@ -2,14 +2,17 @@
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.vostan.banvor.play;
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Point;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import org.vostan.banvor.Puzzle;
|
||||
|
||||
import org.vostan.banvor.game.PuzzleLogic;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
//import android.support.v4.view.GestureDetectorCompat;
|
||||
|
||||
@@ -39,9 +42,9 @@ public class PuzzleControl extends PuzzleView
|
||||
public void onTouch();
|
||||
}
|
||||
|
||||
public PuzzleControl(Context c)
|
||||
public PuzzleControl(Context c, AttributeSet attributeSet)
|
||||
{
|
||||
super(c);
|
||||
super(c,attributeSet);
|
||||
logic = new PuzzleLogic();
|
||||
animator = new Animator( this );
|
||||
animator.setAnimationLister(this);
|
||||
@@ -1,4 +1,4 @@
|
||||
package org.vostan.banvor.play;
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
@@ -10,11 +10,13 @@ import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import static java.lang.Math.*;
|
||||
|
||||
import org.vostan.banvor.Puzzle;
|
||||
import static org.vostan.banvor.Puzzle.*;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
import static org.vostan.banvor.model.Puzzle.*;
|
||||
import org.vostan.banvor.R;
|
||||
|
||||
/**
|
||||
@@ -38,9 +40,9 @@ public class PuzzleView extends View
|
||||
private Rect tile_src = new Rect();
|
||||
private RectF tile_dest = new RectF();
|
||||
|
||||
public PuzzleView(Context context)
|
||||
public PuzzleView(Context context, AttributeSet attributeSet)
|
||||
{
|
||||
super(context);
|
||||
super(context, attributeSet);
|
||||
setFocusable(true);
|
||||
|
||||
//
|
||||
@@ -53,24 +55,22 @@ public class PuzzleView extends View
|
||||
// a.recycle();
|
||||
}
|
||||
|
||||
public void setPuzzle( Puzzle p )
|
||||
{
|
||||
public void setPuzzle( Puzzle p ){
|
||||
puzzle = p;
|
||||
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
|
||||
viewport.set(board);
|
||||
tile_size.set(0,0);
|
||||
calcTransforms();
|
||||
initTiles();
|
||||
invalidate();
|
||||
}
|
||||
|
||||
public Puzzle getPuzzle()
|
||||
{
|
||||
public Puzzle getPuzzle(){
|
||||
return puzzle;
|
||||
}
|
||||
|
||||
@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);
|
||||
tile_size.set(0,0);
|
||||
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 right = scale*(screen.right - focusX);
|
||||
float top = scale*(focusY - screen.top);
|
||||
@@ -91,14 +90,12 @@ public class PuzzleView extends View
|
||||
ViewCompat.postInvalidateOnAnimation(this);
|
||||
}
|
||||
|
||||
public void scaleViewportDone()
|
||||
{
|
||||
public void scaleViewportDone(){
|
||||
//initTiles();
|
||||
ViewCompat.postInvalidateOnAnimation(this);
|
||||
}
|
||||
|
||||
public void scrollViewport( float distanceX, float distanceY )
|
||||
{
|
||||
public void scrollViewport( float distanceX, float distanceY ){
|
||||
viewport.set( screen.left+distanceX,
|
||||
screen.top+distanceY,
|
||||
screen.right+distanceX,
|
||||
@@ -2,15 +2,16 @@
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.vostan.banvor.play;
|
||||
package org.vostan.banvor.game;
|
||||
|
||||
import static java.lang.Math.*;
|
||||
import java.util.Arrays;
|
||||
import org.vostan.banvor.Puzzle;
|
||||
|
||||
import org.vostan.banvor.board.Animator;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author vahagnk
|
||||
*/
|
||||
public class PuzzleLogic
|
||||
{
|
||||
134
app/src/main/java/org/vostan/banvor/game/State.java
Normal file
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);
|
||||
}
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
package org.vostan.banvor.menu;
|
||||
|
||||
import org.vostan.banvor.play.PlayActivity;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.view.View;
|
||||
import android.os.Bundle;
|
||||
//import androidx.fragment.app.Fragment;
|
||||
//support.v4.app.FragmentActivity;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
import android.view.Window;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import org.vostan.banvor.R;
|
||||
import static org.vostan.banvor.App.theApp;
|
||||
|
||||
public class MainActivity extends AppCompatActivity
|
||||
{
|
||||
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.banvor.menu;
|
||||
|
||||
import android.os.Bundle;
|
||||
import androidx.fragment.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.banvor.App.theApp;
|
||||
import org.vostan.banvor.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.banvor.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 androidx.fragment.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.banvor.R;
|
||||
|
||||
import static org.vostan.banvor.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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
6
app/src/main/java/org/vostan/banvor/model/Coord.java
Normal file
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.banvor;
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
//import java.lang.Exception;
|
||||
import java.io.*;
|
||||
@@ -1,12 +1,13 @@
|
||||
package org.vostan.banvor;
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import static org.vostan.banvor.App.theApp;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
import org.vostan.banvor.R;
|
||||
|
||||
public class PuzzleContainer
|
||||
public class PuzzleContainer implements IPuzzleSource
|
||||
{
|
||||
protected int count;
|
||||
|
||||
54
app/src/main/res/layout/activity_welcome.xml
Normal file
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
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
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
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
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="40dp"
|
||||
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>
|
||||
|
||||
41
app/src/main/res/navigation/nav_graph.xml
Normal file
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
3
app/src/main/res/values-land/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
||||
@@ -1,16 +1,17 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_200</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/black</item>
|
||||
<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/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<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
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
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
||||
<resources>
|
||||
<dimen name="fab_margin">48dp</dimen>
|
||||
</resources>
|
||||
@@ -18,13 +18,18 @@
|
||||
*/
|
||||
-->
|
||||
<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="purple_200">#FFBB86FC</color>
|
||||
<color name="purple_500">#FF6200EE</color>
|
||||
<color name="purple_700">#FF3700B3</color>
|
||||
<color name="teal_200">#FF03DAC5</color>
|
||||
<color name="teal_700">#FF018786</color>
|
||||
<color name="black">#FF000000</color>
|
||||
<color name="white">#FFFFFFFF</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>
|
||||
|
||||
@@ -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
|
||||
@@ -23,4 +22,11 @@
|
||||
<dimen name="main_menu_btn_hmargin">10pt</dimen>
|
||||
<dimen name="main_menu_btn_vmargin">2pt</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>
|
||||
@@ -9,4 +9,9 @@
|
||||
<string name="btn_puzzles">Puzzles</string>
|
||||
<string name="version_tag">Version:</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>
|
||||
|
||||
@@ -1,16 +1,26 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||
<!-- Base application theme. -->
|
||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||
<!-- Primary brand color. -->
|
||||
<item name="colorPrimary">@color/purple_500</item>
|
||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
||||
<item name="colorOnPrimary">@color/white</item>
|
||||
<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/teal_200</item>
|
||||
<item name="colorSecondaryVariant">@color/teal_700</item>
|
||||
<item name="colorOnSecondary">@color/black</item>
|
||||
<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>
|
||||
@@ -7,6 +7,9 @@ buildscript {
|
||||
dependencies {
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user