diff --git a/app/.gitignore b/app/.gitignore
index 796b96d..aa46eb4 100644
--- a/app/.gitignore
+++ b/app/.gitignore
@@ -1 +1,27 @@
-/build
+# Built application files
+/*/build/
+
+# Crashlytics configuations
+com_crashlytics_export_strings.xml
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Gradle generated files
+.gradle/
+
+# Signing files
+.signing/
+
+# User-specific configurations
+.idea/
+*.iml
+
+# OS-specific files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8a28a60..b297740 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -3,6 +3,7 @@
package="io.github.davidbuchanan314.nxloader">
+
+
+
+
-
diff --git a/app/src/main/java/io/github/davidbuchanan314/nxloader/FragmentAbout.java b/app/src/main/java/io/github/davidbuchanan314/nxloader/FragmentAbout.java
index 1b55d7a..a60b88a 100644
--- a/app/src/main/java/io/github/davidbuchanan314/nxloader/FragmentAbout.java
+++ b/app/src/main/java/io/github/davidbuchanan314/nxloader/FragmentAbout.java
@@ -8,6 +8,8 @@
import android.view.ViewGroup;
import android.widget.TextView;
+import io.github.davidbuchanan314.nxloader.utils.Utils;
+
public class FragmentAbout extends Fragment {
public FragmentAbout() {
// Required empty public constructor
diff --git a/app/src/main/java/io/github/davidbuchanan314/nxloader/MainActivity.java b/app/src/main/java/io/github/davidbuchanan314/nxloader/MainActivity.java
index 916087a..6c26e9f 100644
--- a/app/src/main/java/io/github/davidbuchanan314/nxloader/MainActivity.java
+++ b/app/src/main/java/io/github/davidbuchanan314/nxloader/MainActivity.java
@@ -1,5 +1,6 @@
package io.github.davidbuchanan314.nxloader;
+import android.Manifest;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.Service;
@@ -8,8 +9,10 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
+import android.support.annotation.NonNull;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
@@ -25,9 +28,13 @@
import java.util.ArrayList;
import java.util.List;
+import io.github.davidbuchanan314.nxloader.utils.PermissionsUtils;
+import io.github.davidbuchanan314.nxloader.utils.Utils;
+
public class MainActivity extends AppCompatActivity {
private static final int READ_REQUEST_CODE = 42;
+
private FragmentLogs logFragment;
BroadcastReceiver myReceiver;
@@ -61,6 +68,14 @@ protected void onDestroy() {
// primary payload selection button
public void onConfigPrimaryPayloadClick(View view) {
+ if (!PermissionsUtils.checkPermissionGranted(this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
+ PermissionsUtils.showPermissionDialog(this);
+ } else {
+ getPayloadFromStorage();
+ }
+ }
+
+ private void getPayloadFromStorage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
@@ -102,6 +117,17 @@ public void onActivityResult(int requestCode, int resultCode, Intent resultData)
}
}
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ switch (requestCode) {
+ case PermissionsUtils.PERMISSIONS_REQUEST_CODE:
+ if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ getPayloadFromStorage();
+ } else {
+ Toast.makeText(this, R.string.permission_storage_error, Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
// Adapter for the viewpager using FragmentPagerAdapter
// http://www.gadgetsaint.com/android/create-viewpager-tabs-android/
diff --git a/app/src/main/java/io/github/davidbuchanan314/nxloader/PrimaryLoader.java b/app/src/main/java/io/github/davidbuchanan314/nxloader/PrimaryLoader.java
index 24a8517..fa2da30 100644
--- a/app/src/main/java/io/github/davidbuchanan314/nxloader/PrimaryLoader.java
+++ b/app/src/main/java/io/github/davidbuchanan314/nxloader/PrimaryLoader.java
@@ -18,6 +18,8 @@
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import io.github.davidbuchanan314.nxloader.utils.Utils;
+
public class PrimaryLoader implements USBDevHandler {
private static final int RCM_PAYLOAD_ADDR = 0x40010000;
private static final int INTERMEZZO_LOCATION = 0x4001F000;
diff --git a/app/src/main/java/io/github/davidbuchanan314/nxloader/utils/PermissionsUtils.java b/app/src/main/java/io/github/davidbuchanan314/nxloader/utils/PermissionsUtils.java
new file mode 100644
index 0000000..422a29d
--- /dev/null
+++ b/app/src/main/java/io/github/davidbuchanan314/nxloader/utils/PermissionsUtils.java
@@ -0,0 +1,38 @@
+package io.github.davidbuchanan314.nxloader.utils;
+
+import android.Manifest;
+import android.app.Activity;
+import android.content.pm.PackageManager;
+import android.support.v4.app.ActivityCompat;
+import android.support.v4.content.ContextCompat;
+import android.support.v7.app.AlertDialog;
+
+import io.github.davidbuchanan314.nxloader.R;
+
+public class PermissionsUtils {
+
+ public static final int PERMISSIONS_REQUEST_CODE = 125;
+
+ private static void requestPermissions(Activity activity, String[] permissions) {
+ ActivityCompat.requestPermissions(activity, permissions, PERMISSIONS_REQUEST_CODE);
+ }
+
+ public static boolean checkPermissionGranted(Activity activity, String permission) {
+ int result = ContextCompat.checkSelfPermission(activity, permission);
+ return result == PackageManager.PERMISSION_GRANTED;
+ }
+
+ public static void showPermissionDialog(Activity activity) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+ builder.setTitle(R.string.permission_storage_dialog_title);
+ builder.setMessage(R.string.permission_storage_dialog_description);
+
+ AlertDialog storagePermissionDialog = builder.create();
+ storagePermissionDialog.setButton(AlertDialog.BUTTON_POSITIVE, activity.getString(R.string.permission_storage_button), (dialogInterface, i) -> {
+ storagePermissionDialog.dismiss();
+ requestPermissions(activity, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE});
+ });
+
+ storagePermissionDialog.show();
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/github/davidbuchanan314/nxloader/Utils.java b/app/src/main/java/io/github/davidbuchanan314/nxloader/utils/Utils.java
similarity index 97%
rename from app/src/main/java/io/github/davidbuchanan314/nxloader/Utils.java
rename to app/src/main/java/io/github/davidbuchanan314/nxloader/utils/Utils.java
index 5021208..ee3cf99 100644
--- a/app/src/main/java/io/github/davidbuchanan314/nxloader/Utils.java
+++ b/app/src/main/java/io/github/davidbuchanan314/nxloader/utils/Utils.java
@@ -1,4 +1,4 @@
-package io.github.davidbuchanan314.nxloader;
+package io.github.davidbuchanan314.nxloader.utils;
import android.content.Context;
import android.content.Intent;
diff --git a/app/src/main/res/layout/fragment_about.xml b/app/src/main/res/layout/fragment_about.xml
index cdfef26..c9e5bdf 100644
--- a/app/src/main/res/layout/fragment_about.xml
+++ b/app/src/main/res/layout/fragment_about.xml
@@ -1,112 +1,117 @@
-
+ android:fillViewport="true">
-
-
-
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="16dp"
+ android:background="@color/colorBackgroundSecondary"
+ android:elevation="3dp"
+ android:orientation="vertical">
-
+
-
+
-
+
-
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:background="@color/colorBackgroundSecondary"
+ android:elevation="3dp"
+ android:orientation="vertical">
-
+
-
+
-
-
-
+
-
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:background="@color/colorBackgroundSecondary"
+ android:elevation="3dp"
+ android:orientation="vertical">
-
+
+
+
-
\ No newline at end of file
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_config.xml b/app/src/main/res/layout/fragment_config.xml
index 23210c3..df2abb3 100644
--- a/app/src/main/res/layout/fragment_config.xml
+++ b/app/src/main/res/layout/fragment_config.xml
@@ -1,89 +1,95 @@
-
+ android:fillViewport="true">
-
-
-
-
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:layout_marginTop="16dp"
+ android:background="@color/colorBackgroundSecondary"
+ android:elevation="3dp"
+ android:orientation="vertical">
-
+
-
+
-
+
-
+
-
+ android:layout_marginEnd="8dp"
+ android:layout_marginStart="8dp"
+ android:background="@color/colorBackgroundSecondary"
+ android:elevation="3dp"
+ android:orientation="vertical">
-
+
-
+
-
\ No newline at end of file
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index aee9994..c2dcd89 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -11,6 +11,15 @@
Выбрать собственный загрузчик
Восстановить загрузчик по умолчанию на ваш Switch - \"fusee.bin\"
Сбросить настройки
+ Восстановлен загрузчик по умолчанию.
+ Новый загрузчик выбран.
+ Ошибка при выборе нового загрузчика.
+
+
+ Доступ к хранилищу
+ NXLoader нуждается в этом разрешении для получения файлов загрузчика с хранилища вашего устройства.
+ Запросить
+ Не удалось получить доступ к хранилищу. Попробуйте снова запросить разрешение.
О программе
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 8695741..8c50e12 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -11,6 +11,15 @@
Обрати власний завантажувач
Відновити завантажувач за замовчуванням на ваш Switch - \"fusee.bin\"
Скинути налаштування
+ Відновлено завантажувач за замовчуванням.
+ Обрано новий завантажувач.
+ Помилка при виборі нового завантажувача.
+
+
+ Доступ до пам\'яті
+ NXLoader потребує цього дозволу для отримання файлів завантажувача з пам\'яті вашого пристрою.
+ Запросити
+ Не вдається отримати доступ до сховища. Спробуйте знову запросити дозвіл.
Про програму
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1ad90ba..c6d99d9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -17,6 +17,12 @@
New payload selected.
Failed to set new payload.
+
+ Storage permission
+ NXLoader need this permission to get payload files from your device\'s storage.
+ Request
+ Could not access the repository. Try to get permission again.
+
About
Description