diff --git a/app/build.gradle b/app/build.gradle index b9acbd6d..363b6dcd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { } } compileSdkVersion 24 - buildToolsVersion "24.0.0" + buildToolsVersion '25.0.0' defaultConfig { applicationId "jwtc.android.chess" minSdkVersion 11 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index aebf0fbf..c2b488f4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ О приложении

Тим Теннисон: несколько улучшений.

Алессандро Дал Белло, Паоло Страффи: итальянский перевод.

Ильдар Губайдулин: русский перевод.

-

Марселла De Rosa: Испанские и португальские переводы.

-

Стан Zheng: Китайский перевод.

+

Марселья Де Роса: Испанские и португальские переводы.

+

Стан Чжэн: Китайский перевод.

\ No newline at end of file diff --git a/app/src/main/assets/help-ru.html b/app/src/main/assets/help-ru.html index 7e0d5312..7dc43516 100644 --- a/app/src/main/assets/help-ru.html +++ b/app/src/main/assets/help-ru.html @@ -23,8 +23,8 @@

Помощь

Тим Теннисон: несколько улучшений.

Алессандро Дал Белло, Паоло Страффи: итальянский перевод.

Ильдар Губайдулин: русский перевод.

-

Марселла De Rosa: Испанские и португальские переводы.

-

Стан Zheng: Китайский перевод.

+

Марселья Де Роса: Испанские и португальские переводы.

+

Стан Чжэн: Китайский перевод.

Игра

Играйте против Android или используйте шахматную доску для анализа игр. diff --git a/app/src/main/assets/help_practice-ru.html b/app/src/main/assets/help_practice-ru.html index 289a9d34..fec11c57 100644 --- a/app/src/main/assets/help_practice-ru.html +++ b/app/src/main/assets/help_practice-ru.html @@ -15,7 +15,7 @@

Помощь в тренировке

Ваше время и среднее время для каждой позиции указано рядом с доской.
Нажмите кнопку 'Показать' для решения.
Нажмите кнопку 'Далее', чтобы перейти к следующей позиции.
-Иногда может быть найдено несколько решений, но приложение принимает только одно их них. +Иногда может быть найдено несколько решений, но приложение принимает только одно из них.

diff --git a/app/src/main/java/jwtc/android/chess/puzzle/ChessViewPuzzle.java b/app/src/main/java/jwtc/android/chess/puzzle/ChessViewPuzzle.java index b5e0f27c..57bc2505 100644 --- a/app/src/main/java/jwtc/android/chess/puzzle/ChessViewPuzzle.java +++ b/app/src/main/java/jwtc/android/chess/puzzle/ChessViewPuzzle.java @@ -11,6 +11,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.res.Resources; import android.os.Handler; import android.os.Message; import android.text.InputType; @@ -65,7 +66,7 @@ public void handleMessage(Message msg) { _progressDlg.setMessage(_parent.getString(R.string.msg_progress) + String.format(" %d", (_cnt * 100) / _num) + " %"); } else if (msg.what == 3) { _progressDlg.hide(); - _tvPuzzleText.setText("An error occured during install"); + _tvPuzzleText.setText(_parent.getString(R.string.puzzle_error_install)); } } @@ -282,7 +283,7 @@ public void flipBoard() { @Override protected boolean requestMove(int from, int to) { if (_arrPGN.size() <= _jni.getNumBoard() - 1) { - setMessage("(position allready solved)"); + setMessage(_parent.getString(R.string.puzzle_already_solved)); return super.requestMove(from, to); } int move = _arrPGN.get(_jni.getNumBoard() - 1)._move; @@ -307,7 +308,7 @@ protected boolean requestMove(int from, int to) { return true; } else { // check for illegal move - setMessage("Move " + Move.toDbgString(theMove) + (checkIsLegalMove(from, to) ? " is not the expected move" : " is an invalid move")); + setMessage(Move.toDbgString(theMove) + (checkIsLegalMove(from, to) ? _parent.getString(R.string.puzzle_not_correct_move) : _parent.getString(R.string.puzzle_invalid_move))); _imgStatus.setImageResource(R.drawable.indicator_error); m_iFrom = -1; @@ -331,7 +332,7 @@ public void play() { if (_iPos < 1) _iPos = 1; if (_iPos > _num) { - setMessage("You completed all puzzles!!!"); + setMessage(_parent.getString(R.string.puzzle_all_completed)); return; } @@ -398,7 +399,7 @@ public boolean handleClick(int index) { final String[] items = _parent.getResources().getStringArray(R.array.promotionpieces); AlertDialog.Builder builder = new AlertDialog.Builder(_parent); - builder.setTitle("Pick promotion piece"); + builder.setTitle(_parent.getString(R.string.puzzle_pick_promotion)); builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { dialog.dismiss(); diff --git a/app/src/main/java/jwtc/android/chess/tools/FileListView.java b/app/src/main/java/jwtc/android/chess/tools/FileListView.java index 28dc0974..ff1f2c0e 100644 --- a/app/src/main/java/jwtc/android/chess/tools/FileListView.java +++ b/app/src/main/java/jwtc/android/chess/tools/FileListView.java @@ -9,7 +9,9 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.os.Environment; import android.view.Gravity; import android.view.MenuItem; import android.view.View; @@ -38,7 +40,11 @@ public void onCreate(Bundle savedInstanceState) { } private void browseToRoot() { - browseTo(new File("/")); + String sRoot = ""; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + sRoot = Environment.getExternalStorageDirectory().toString(); + } + browseTo(new File(sRoot)); } @Override @@ -165,19 +171,20 @@ private void fill(File[] files) { getResources().getDrawable(R.drawable.navigation_previous_item))); } Drawable currentIcon = null; - for (File currentFile : files){ - if (currentFile.canRead() /*&& (_mode == MODE_IMPORT || _mode == MODE_EXPORT && currentFile.canWrite())*/){ - if (currentFile.isDirectory()) { - currentIcon = getResources().getDrawable(R.drawable.collections_collection); - this.directoryEntries.add(new IconifiedText(currentFile.getPath(), currentIcon)); - }else { - String fileName = currentFile.getName(); - - if(fileNameFilterByMode(fileName)) - { - currentIcon = getResources().getDrawable(R.drawable.navigation_next_item); + if(files != null) { + for (File currentFile : files) { + if (currentFile.canRead() /*&& (_mode == MODE_IMPORT || _mode == MODE_EXPORT && currentFile.canWrite())*/) { + if (currentFile.isDirectory()) { + currentIcon = getResources().getDrawable(R.drawable.collections_collection); this.directoryEntries.add(new IconifiedText(currentFile.getPath(), currentIcon)); - } + } else { + String fileName = currentFile.getName(); + + if (fileNameFilterByMode(fileName)) { + currentIcon = getResources().getDrawable(R.drawable.navigation_next_item); + this.directoryEntries.add(new IconifiedText(currentFile.getPath(), currentIcon)); + } + } } } } diff --git a/app/src/main/java/jwtc/android/chess/tools/pgntool.java b/app/src/main/java/jwtc/android/chess/tools/pgntool.java index c81bbc1a..22d4e8b6 100644 --- a/app/src/main/java/jwtc/android/chess/tools/pgntool.java +++ b/app/src/main/java/jwtc/android/chess/tools/pgntool.java @@ -15,14 +15,19 @@ import jwtc.chess.PGNColumns; import jwtc.chess.algorithm.UCIWrapper; +import android.Manifest; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.database.Cursor; +import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.*; import android.widget.AdapterView; @@ -42,6 +47,7 @@ public class pgntool extends ListActivity { protected static final String MODE_IMPORT_PRACTICE = "import_practice"; protected static final String MODE_IMPORT_PUZZLE = "import_puzzle"; protected static final String MODE_IMPORT_OPENINGDATABASE = "import_openingdatabase"; + protected static final int MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1; protected static final String EXTRA_MODE = "jwtc.android.chess.tools.Mode"; @@ -70,6 +76,11 @@ public void onCreate(Bundle savedInstanceState) { @Override public void onItemClick(AdapterView arg0, View arg1, int arg2, long arg3) { + + if(false == pgntool.this.hasPermission()) { + return; + } + if (arrString[arg2].equals(getString(R.string.pgntool_export_explanation))) { doExport(); @@ -271,6 +282,19 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } + public boolean hasPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { + return true; + } else { + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); + return false; + } + } else { + return true; + } + } + public void doExport() { try { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { diff --git a/app/src/main/res/layout-land/main.xml b/app/src/main/res/layout-land/main.xml index 6f7b0c5c..0d7d5707 100644 --- a/app/src/main/res/layout-land/main.xml +++ b/app/src/main/res/layout-land/main.xml @@ -2,7 +2,7 @@ - - #ff585858 + #ffcccccc + #ff585858 #ffffffff + #ff000000 #ccffffff #ff282828 @@ -93,7 +95,7 @@ sans 2dp 2dp - #ffffff + 14sp \ No newline at end of file diff --git a/app/src/main/res/xml/globalprefs.xml b/app/src/main/res/xml/globalprefs.xml index 75e41bc6..9277c3bb 100644 --- a/app/src/main/res/xml/globalprefs.xml +++ b/app/src/main/res/xml/globalprefs.xml @@ -1,7 +1,7 @@ - + - + - + - +