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"> -