package shts.jp.android.nogifeed.activities; import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.annotation.IntDef; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringDef; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import icepick.Icepick; import icepick.State; import permissions.dispatcher.NeedsPermission; import permissions.dispatcher.OnPermissionDenied; import permissions.dispatcher.OnShowRationale; import permissions.dispatcher.PermissionRequest; import permissions.dispatcher.PermissionUtils; import permissions.dispatcher.RuntimePermissions; import shts.jp.android.nogifeed.R; @RuntimePermissions public class PermissionRequireActivity extends AppCompatActivity { @IntDef(Type.DOWNLOAD) @Retention(RetentionPolicy.SOURCE) public @interface Type { int DOWNLOAD = 0; } @StringDef(ExtraKey.DOWNLOAD) @Retention(RetentionPolicy.SOURCE) public @interface ExtraKey { String TYPE = "type"; String DOWNLOAD = "urlList"; } @State ArrayList<String> urlList; public static Intent getDownloadStartIntent(@NonNull Context context, @NonNull String url) { ArrayList<String> urlList = new ArrayList<>(); urlList.add(url); return getDownloadStartIntent(context, urlList); } public static Intent getDownloadStartIntent(@NonNull Context context, @NonNull ArrayList<String> urlList) { Intent intent = new Intent(context, PermissionRequireActivity.class); intent.putExtra(ExtraKey.TYPE, Type.DOWNLOAD); intent.putStringArrayListExtra(ExtraKey.DOWNLOAD, urlList); return intent; } @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { Icepick.restoreInstanceState(this, savedInstanceState); } else { urlList = getIntent().getStringArrayListExtra(ExtraKey.DOWNLOAD); } PermissionRequireActivityPermissionsDispatcher.requestWithCheck(this); } @Override protected void onSaveInstanceState(Bundle outState) { Icepick.saveInstanceState(this, outState); super.onSaveInstanceState(outState); } @NeedsPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) void request() { Intent intent = new Intent(); intent.putStringArrayListExtra(ExtraKey.DOWNLOAD, urlList); setResult(RESULT_OK, intent); finish(); } @OnPermissionDenied(Manifest.permission.WRITE_EXTERNAL_STORAGE) void onStoragePermissionDenied() { finish(); } @OnShowRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE) void showRationalForStrage(final PermissionRequest request) { showRationalDialog(request); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // 1つでも許可されないパーミッションがあった場合はActivityを終了させる if (!PermissionUtils.verifyPermissions(grantResults)) { finish(); } PermissionRequireActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults); } private void showRationalDialog(final PermissionRequest request) { new AlertDialog.Builder(this) .setMessage(R.string.permission_require_dialog_message) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.proceed(); } }) .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { request.cancel(); finish(); } }) .setCancelable(false) .show(); } }