diff --git a/app/build.gradle b/app/build.gradle
index 3901b18..685d671 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,6 @@
apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion compileSdk
@@ -21,6 +23,7 @@ android {
dependencies {
implementation "com.android.support:appcompat-v7:$support_library_version"
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation project(':easypermissions')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 1a3388f..ac2f13f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -11,6 +11,9 @@
+
+
+
+
+
diff --git a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java
deleted file mode 100644
index 94eaf9d..0000000
--- a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package pub.devrel.easypermissions.sample;
-
-import android.Manifest;
-import android.content.Intent;
-import android.os.Bundle;
-import android.support.annotation.NonNull;
-import android.support.v7.app.AppCompatActivity;
-import android.util.Log;
-import android.view.View;
-import android.widget.Toast;
-
-import java.util.List;
-
-import pub.devrel.easypermissions.AfterPermissionGranted;
-import pub.devrel.easypermissions.AppSettingsDialog;
-import pub.devrel.easypermissions.EasyPermissions;
-
-public class MainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
-
- private static final String TAG = "MainActivity";
- private static final String[] LOCATION_AND_CONTACTS =
- {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS};
-
- private static final int RC_CAMERA_PERM = 123;
- private static final int RC_LOCATION_CONTACTS_PERM = 124;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
-
- // Button click listener that will request one permission.
- findViewById(R.id.button_camera).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- cameraTask();
- }
- });
-
- // Button click listener that will request two permissions.
- findViewById(R.id.button_location_and_contacts).setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- locationAndContactsTask();
- }
- });
- }
-
- private boolean hasCameraPermission() {
- return EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA);
- }
-
- private boolean hasLocationAndContactsPermissions() {
- return EasyPermissions.hasPermissions(this, LOCATION_AND_CONTACTS);
- }
-
- private boolean hasSmsPermission() {
- return EasyPermissions.hasPermissions(this, Manifest.permission.READ_SMS);
- }
-
- @AfterPermissionGranted(RC_CAMERA_PERM)
- public void cameraTask() {
- if (hasCameraPermission()) {
- // Have permission, do the thing!
- Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show();
- } else {
- // Ask for one permission
- EasyPermissions.requestPermissions(
- this,
- getString(R.string.rationale_camera),
- RC_CAMERA_PERM,
- Manifest.permission.CAMERA);
- }
- }
-
- @AfterPermissionGranted(RC_LOCATION_CONTACTS_PERM)
- public void locationAndContactsTask() {
- if (hasLocationAndContactsPermissions()) {
- // Have permissions, do the thing!
- Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show();
- } else {
- // Ask for both permissions
- EasyPermissions.requestPermissions(
- this,
- getString(R.string.rationale_location_contacts),
- RC_LOCATION_CONTACTS_PERM,
- LOCATION_AND_CONTACTS);
- }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode,
- @NonNull String[] permissions,
- @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-
- // EasyPermissions handles the request result.
- EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
- }
-
- @Override
- public void onPermissionsGranted(int requestCode, @NonNull List perms) {
- Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size());
- }
-
- @Override
- public void onPermissionsDenied(int requestCode, @NonNull List perms) {
- Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size());
-
- // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
- // This will display a dialog directing them to enable the permission in app settings.
- if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
- new AppSettingsDialog.Builder(this).build().show();
- }
- }
-
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
-
- if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
- String yes = getString(R.string.yes);
- String no = getString(R.string.no);
-
- // Do something after user returned from app settings screen, like showing a Toast.
- Toast.makeText(
- this,
- getString(R.string.returned_from_app_settings_to_activity,
- hasCameraPermission() ? yes : no,
- hasLocationAndContactsPermissions() ? yes : no,
- hasSmsPermission() ? yes : no),
- Toast.LENGTH_LONG)
- .show();
- }
- }
-}
diff --git a/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.kt b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.kt
new file mode 100644
index 0000000..d20ea1e
--- /dev/null
+++ b/app/src/main/java/pub/devrel/easypermissions/sample/MainActivity.kt
@@ -0,0 +1,155 @@
+/*
+ * Copyright Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package pub.devrel.easypermissions.sample
+
+import android.Manifest
+import android.content.Intent
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.util.Log
+import android.view.View
+import android.widget.Toast
+import com.mgsoftware.kotlinapp.DialogFragmentCallback
+import kotlinx.android.synthetic.main.activity_main.*
+
+import pub.devrel.easypermissions.AfterPermissionGranted
+import pub.devrel.easypermissions.AppSettingDialogFragment
+import pub.devrel.easypermissions.AppSettingsDialog
+import pub.devrel.easypermissions.EasyPermissions
+
+class MainActivity : AppCompatActivity(), EasyPermissions.PermissionCallbacks, DialogFragmentCallback {
+ val RC_APP_SETTING_DIALOG = 125
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ button_test.setOnClickListener({
+ val config = Bundle()
+ config.putInt(AppSettingDialogFragment.KEY_THEME_RED_ID, android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth)
+ config.putString(AppSettingDialogFragment.KEY_POSITIVE_BUTTON_TEXT, "settings")
+ AppSettingDialogFragment.newInstance(RC_APP_SETTING_DIALOG, config).show(supportFragmentManager, AppSettingDialogFragment::class.java.name)
+ })
+
+ // Button click listener that will request one permission.
+ findViewById(R.id.button_camera).setOnClickListener { cameraTask() }
+
+ // Button click listener that will request two permissions.
+ findViewById(R.id.button_location_and_contacts).setOnClickListener { locationAndContactsTask() }
+ }
+
+ private fun hasCameraPermission(): Boolean {
+ return EasyPermissions.hasPermissions(this, Manifest.permission.CAMERA)
+ }
+
+ private fun hasLocationAndContactsPermissions(): Boolean {
+ return EasyPermissions.hasPermissions(this, *LOCATION_AND_CONTACTS)
+ }
+
+ private fun hasSmsPermission(): Boolean {
+ return EasyPermissions.hasPermissions(this, Manifest.permission.READ_SMS)
+ }
+
+ @AfterPermissionGranted(RC_CAMERA_PERM)
+ fun cameraTask() {
+ if (hasCameraPermission()) {
+ // Have permission, do the thing!
+ Toast.makeText(this, "TODO: Camera things", Toast.LENGTH_LONG).show()
+ } else {
+ // Ask for one permission
+ EasyPermissions.requestPermissions(
+ this,
+ getString(R.string.rationale_camera),
+ RC_CAMERA_PERM,
+ Manifest.permission.CAMERA)
+ }
+ }
+
+ @AfterPermissionGranted(RC_LOCATION_CONTACTS_PERM)
+ fun locationAndContactsTask() {
+ if (hasLocationAndContactsPermissions()) {
+ // Have permissions, do the thing!
+ Toast.makeText(this, "TODO: Location and Contacts things", Toast.LENGTH_LONG).show()
+ } else {
+ // Ask for both permissions
+ EasyPermissions.requestPermissions(
+ this,
+ getString(R.string.rationale_location_contacts),
+ RC_LOCATION_CONTACTS_PERM,
+ *LOCATION_AND_CONTACTS)
+ }
+ }
+
+ override fun onRequestPermissionsResult(requestCode: Int,
+ permissions: Array,
+ grantResults: IntArray) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+
+ // EasyPermissions handles the request result.
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
+ }
+
+ override fun onPermissionsGranted(requestCode: Int, perms: List) {
+ Log.d(TAG, "onPermissionsGranted:" + requestCode + ":" + perms.size)
+ }
+
+ override fun onPermissionsDenied(requestCode: Int, perms: List) {
+ Log.d(TAG, "onPermissionsDenied:" + requestCode + ":" + perms.size)
+
+ // (Optional) Check whether the user denied any permissions and checked "NEVER ASK AGAIN."
+ // This will display a dialog directing them to enable the permission in app settings.
+ if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) {
+ AppSettingsDialog.Builder(this).build().show()
+ }
+ }
+
+ public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
+ super.onActivityResult(requestCode, resultCode, data)
+
+ if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE) {
+ val yes = getString(R.string.yes)
+ val no = getString(R.string.no)
+
+ // Do something after user returned from app settings screen, like showing a Toast.
+ Toast.makeText(
+ this,
+ getString(R.string.returned_from_app_settings_to_activity,
+ if (hasCameraPermission()) yes else no,
+ if (hasLocationAndContactsPermissions()) yes else no,
+ if (hasSmsPermission()) yes else no),
+ Toast.LENGTH_LONG)
+ .show()
+ }
+ }
+
+ override fun onDialogResult(requestCode: Int, resultCode: Int, data: Bundle?) {
+ when(requestCode) {
+ RC_APP_SETTING_DIALOG -> {
+
+ }
+ }
+
+ }
+
+ companion object {
+
+ private val TAG = "MainActivity"
+ private val LOCATION_AND_CONTACTS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_CONTACTS)
+
+ private const val RC_CAMERA_PERM = 123
+ private const val RC_LOCATION_CONTACTS_PERM = 124
+ }
+}
diff --git a/app/src/main/java/pub/devrel/easypermissions/sample/MyMainActivity.java b/app/src/main/java/pub/devrel/easypermissions/sample/MyMainActivity.java
new file mode 100644
index 0000000..92423cc
--- /dev/null
+++ b/app/src/main/java/pub/devrel/easypermissions/sample/MyMainActivity.java
@@ -0,0 +1,111 @@
+package pub.devrel.easypermissions.sample;
+
+import android.Manifest;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+
+import com.mgsoftware.kotlinapp.DialogFragmentCallback;
+
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+import pub.devrel.easypermissions.AppSettingDialogFragment;
+import pub.devrel.easypermissions.EasyPermissions;
+import pub.devrel.easypermissions.PermissionRequest;
+import pub.devrel.easypermissions.helper.PermissionHelper;
+
+public class MyMainActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks, DialogFragmentCallback, PermissionHelper.Callback {
+ private static final String TAG = "MainActivity";
+
+ private static final String[] REQUESTED_PERMISSIONS_ON_START = {
+ Manifest.permission.CAMERA,
+ Manifest.permission.RECORD_AUDIO,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
+ Manifest.permission.ACCESS_FINE_LOCATION
+ };
+
+ private static final int RC_REQUIRED_PERM = 125;
+ private static final int RC_APP_SETTING_DIALOG = 126;
+
+ // In this case prevent showing dialogs under android permission dialog
+ private boolean waiting = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_my_main);
+ Log.d(TAG, "onCreate() called with: savedInstanceState = [" + savedInstanceState + "]");
+
+ waiting = hasCurrentPermissionsRequest(savedInstanceState);
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ if (!EasyPermissions.hasPermissions(this, REQUESTED_PERMISSIONS_ON_START)) {
+ if (!waiting) {
+ if (!isShowing(getSupportFragmentManager(), AppSettingDialogFragment.Companion.getTAG())) {
+ PermissionRequest request = new PermissionRequest.Builder(this,
+ RC_REQUIRED_PERM,
+ REQUESTED_PERMISSIONS_ON_START)
+ .setRationale("my_rationale")
+ .build();
+ EasyPermissions.requestPermissions(request);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ waiting = false;
+ EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
+ }
+
+ @Override
+ public void onPermissionsGranted(int requestCode, @NonNull List perms) {
+
+ }
+
+ @Override
+ public void onPermissionsDenied(int requestCode, @NonNull List perms) {
+ if (!EasyPermissions.hasPermissions(this, REQUESTED_PERMISSIONS_ON_START)) {
+ if (!isShowing(getSupportFragmentManager(), AppSettingDialogFragment.Companion.getTAG())) {
+ Bundle config = new Bundle();
+ config.putInt(AppSettingDialogFragment.Companion.getKEY_THEME_RED_ID(), android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth);
+ config.putString(AppSettingDialogFragment.Companion.getKEY_POSITIVE_BUTTON_TEXT(), "my_settings");
+ AppSettingDialogFragment.Companion.newInstance(RC_APP_SETTING_DIALOG, config).show(getSupportFragmentManager(), AppSettingDialogFragment.Companion.getTAG());
+ }
+ }
+ }
+
+ @Override
+ public void onDialogResult(int requestCode, int resultCode, @Nullable Bundle data) {
+ if(requestCode == AppSettingDialogFragment.Companion.getDEFAULT_SETTINGS_REQ_CODE()) {
+ if(resultCode == DialogFragmentCallback.Companion.getRESULT_CANCEL()) {
+ // TODO
+ }
+ }
+ }
+
+ @Override
+ public void onAndroidRequestPermissionsCalled() {
+ waiting = true;
+ }
+
+ private boolean hasCurrentPermissionsRequest(Bundle savedInstanceState) {
+ return savedInstanceState != null && savedInstanceState.getBoolean("android:hasCurrentPermissionsRequest", false);
+ }
+
+ private boolean isShowing(FragmentManager fragmentManager, String tag) {
+ Fragment fragment = fragmentManager.findFragmentByTag(tag);
+ return fragment != null;
+
+ }
+}
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index b93dcf2..a496ab8 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -10,23 +10,29 @@
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
+
+
+ android:text="@string/camera"/>
+ android:text="@string/location_and_contacts"/>
+ tools:layout="@layout/fragment_main"/>
diff --git a/app/src/main/res/layout/activity_my_main.xml b/app/src/main/res/layout/activity_my_main.xml
new file mode 100644
index 0000000..45aecaa
--- /dev/null
+++ b/app/src/main/res/layout/activity_my_main.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/build.gradle b/build.gradle
index c2ec530..58bd5cc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,4 +1,5 @@
buildscript {
+ ext.kotlin_version = '1.2.10'
repositories {
jcenter()
google()
@@ -7,6 +8,7 @@ buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
@@ -33,7 +35,7 @@ ext {
bintrayOrg = 'easygoogle'
- support_library_version = '27.0.1'
+ support_library_version = '27.0.2'
compileSdk = 27
targetSdk = 27
diff --git a/easypermissions/build.gradle b/easypermissions/build.gradle
index 73731e5..582ff75 100644
--- a/easypermissions/build.gradle
+++ b/easypermissions/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
android {
compileSdkVersion compileSdk
@@ -25,6 +26,8 @@ dependencies {
testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:3.5.1'
+
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
}
apply from: 'bintray.gradle'
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/AbstractDialogFragment.kt b/easypermissions/src/main/java/pub/devrel/easypermissions/AbstractDialogFragment.kt
new file mode 100644
index 0000000..210187b
--- /dev/null
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/AbstractDialogFragment.kt
@@ -0,0 +1,58 @@
+package com.mgsoftware.kotlinapp
+
+import android.content.Context
+import android.content.DialogInterface
+import android.os.Bundle
+import android.support.v4.app.DialogFragment
+
+open class AbstractDialogFragment : DialogFragment() {
+ companion object {
+ val KEY_REQUEST_CODE = "request_code"
+
+ fun newInstance(requestCode: Int): AbstractDialogFragment {
+ val fragment = AbstractDialogFragment()
+ val args = Bundle()
+ args.putInt(KEY_REQUEST_CODE, requestCode)
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var requestCode: Int = 0
+ private var resultCode = DialogFragmentCallback.RESULT_CANCEL
+ private var data: Bundle? = null
+
+ private var callback: DialogFragmentCallback? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ requestCode = arguments!!.getInt(KEY_REQUEST_CODE)
+ }
+
+ override fun onAttach(context: Context) {
+ super.onAttach(context)
+ // Verify that the host activity implements the callback interface
+ try {
+ // Instantiate the NoticeDialogListener so we can send events to the host
+ callback = context as DialogFragmentCallback
+ } catch (e: ClassCastException) {
+ // The activity doesn't implement the interface, throw exception
+ throw ClassCastException(context.toString() + " must implement Callback")
+ }
+
+ }
+
+ override fun onDismiss(dialog: DialogInterface?) {
+ super.onDismiss(dialog)
+ if (callback != null)
+ callback!!.onDialogResult(requestCode, resultCode, data)
+ }
+
+ protected fun setResultCode(resultCode: Int) {
+ this.resultCode = resultCode
+ }
+
+ protected fun setData(data: Bundle) {
+ this.data = data
+ }
+}
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingDialogFragment.kt b/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingDialogFragment.kt
new file mode 100644
index 0000000..82ee871
--- /dev/null
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingDialogFragment.kt
@@ -0,0 +1,85 @@
+package pub.devrel.easypermissions
+
+import android.app.Dialog
+import android.content.DialogInterface
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.provider.Settings
+import android.support.annotation.StyleRes
+import android.support.v7.app.AlertDialog
+import com.mgsoftware.kotlinapp.AbstractDialogFragment
+import com.mgsoftware.kotlinapp.DialogFragmentCallback
+
+/**
+ * Created by Mariusz
+ */
+class AppSettingDialogFragment : AbstractDialogFragment() {
+
+ @StyleRes
+ private var mThemeResId: Int? = 0
+ private var mTitle: String? = ""
+ private var mRationale: String? = ""
+ private var mPositiveButtonText: String? = ""
+ private var mNegativeButtonText: String? = ""
+
+ val positiveListener: DialogInterface.OnClickListener = DialogInterface.OnClickListener { _, _ ->
+ activity?.startActivityForResult(
+ Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
+ .setData(Uri.fromParts("package", context?.packageName, null)),
+ DEFAULT_SETTINGS_REQ_CODE)
+ setResultCode(DialogFragmentCallback.RESULT_OK)
+ }
+
+ val negativeListener: DialogInterface.OnClickListener = DialogInterface.OnClickListener { _, _ ->
+ setResultCode(DialogFragmentCallback.RESULT_CANCEL)
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val config = arguments?.getBundle(KEY_CONFIG)
+ mThemeResId = config?.getInt(KEY_THEME_RED_ID)
+ mTitle = config?.getString(KEY_TITLE, getString(R.string.title_settings_dialog))
+ mRationale = config?.getString(KEY_RATIONALE, getString(R.string.rationale_ask_again))
+ mPositiveButtonText = config?.getString(KEY_POSITIVE_BUTTON_TEXT, getString(android.R.string.ok))
+ mNegativeButtonText = config?.getString(KEY_NEGATIVE_BUTTON_TEXT, getString(android.R.string.cancel))
+ }
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val builder: AlertDialog.Builder
+ builder = if (mThemeResId!! > 0) {
+ AlertDialog.Builder(context!!, mThemeResId!!)
+ } else {
+ AlertDialog.Builder(context!!)
+ }
+ return builder
+ .setCancelable(false)
+ .setTitle(mTitle)
+ .setMessage(mRationale)
+ .setPositiveButton(mPositiveButtonText, positiveListener)
+ .setNegativeButton(mNegativeButtonText, negativeListener)
+ .show()
+ }
+
+ companion object {
+ val TAG = "AppSettingDialogFragment"
+ val DEFAULT_SETTINGS_REQ_CODE = 16061
+
+ private val KEY_CONFIG = "config"
+
+ val KEY_THEME_RED_ID = "themeResId"
+ val KEY_TITLE = "title"
+ val KEY_RATIONALE = "rationale"
+ val KEY_POSITIVE_BUTTON_TEXT = "positiveButtonText"
+ val KEY_NEGATIVE_BUTTON_TEXT = "negativeButtonText"
+
+ fun newInstance(requestCode: Int, config: Bundle): AppSettingDialogFragment {
+ val fragment = AppSettingDialogFragment()
+ val args = Bundle()
+ args.putInt(AbstractDialogFragment.KEY_REQUEST_CODE, requestCode)
+ args.putBundle(KEY_CONFIG, config)
+ fragment.arguments = args
+ return fragment
+ }
+ }
+}
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/DialogFragmentCallback.kt b/easypermissions/src/main/java/pub/devrel/easypermissions/DialogFragmentCallback.kt
new file mode 100644
index 0000000..bc0aa06
--- /dev/null
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/DialogFragmentCallback.kt
@@ -0,0 +1,12 @@
+package com.mgsoftware.kotlinapp
+
+import android.os.Bundle
+
+interface DialogFragmentCallback {
+ fun onDialogResult(requestCode: Int, resultCode: Int, data: Bundle?)
+
+ companion object {
+ val RESULT_CANCEL = 0
+ val RESULT_OK = -1
+ }
+}
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java
index 8cefc34..bfc14e3 100644
--- a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java
@@ -53,12 +53,18 @@ public void onClick(DialogInterface dialog, int which) {
if (mHost instanceof Fragment) {
PermissionHelper.newInstance((Fragment) mHost).directRequestPermissions(
mConfig.requestCode, mConfig.permissions);
+ if(mHost instanceof PermissionHelper.Callback)
+ ((PermissionHelper.Callback) mHost).onAndroidRequestPermissionsCalled();
} else if (mHost instanceof android.app.Fragment) {
PermissionHelper.newInstance((android.app.Fragment) mHost).directRequestPermissions(
mConfig.requestCode, mConfig.permissions);
+ if(mHost instanceof PermissionHelper.Callback)
+ ((PermissionHelper.Callback) mHost).onAndroidRequestPermissionsCalled();
} else if (mHost instanceof Activity) {
PermissionHelper.newInstance((Activity) mHost).directRequestPermissions(
mConfig.requestCode, mConfig.permissions);
+ if(mHost instanceof PermissionHelper.Callback)
+ ((PermissionHelper.Callback) mHost).onAndroidRequestPermissionsCalled();
} else {
throw new RuntimeException("Host must be an Activity or Fragment!");
}
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java
index 8e88a73..a7bcdf0 100644
--- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java
@@ -1,5 +1,6 @@
package pub.devrel.easypermissions.helper;
+import android.app.Fragment;
import android.app.FragmentManager;
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
@@ -24,8 +25,11 @@ public void showRequestPermissionRationale(@NonNull String rationale,
@StyleRes int theme,
int requestCode,
@NonNull String... perms) {
+ FragmentManager fm = getFragmentManager();
+ Fragment fragment = fm.findFragmentByTag(RationaleDialogFragment.TAG);
+ if (fragment != null) return;
RationaleDialogFragment
.newInstance(positiveButton, negativeButton, rationale, theme, requestCode, perms)
- .showAllowingStateLoss(getFragmentManager(), RationaleDialogFragment.TAG);
+ .showAllowingStateLoss(fm, RationaleDialogFragment.TAG);
}
}
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java
index 11952e1..ff34101 100644
--- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseSupportPermissionsHelper.java
@@ -2,6 +2,7 @@
import android.support.annotation.NonNull;
import android.support.annotation.StyleRes;
+import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import pub.devrel.easypermissions.RationaleDialogFragmentCompat;
@@ -24,6 +25,9 @@ public void showRequestPermissionRationale(@NonNull String rationale,
@StyleRes int theme,
int requestCode,
@NonNull String... perms) {
+ FragmentManager fm = getSupportFragmentManager();
+ Fragment fragment = fm.findFragmentByTag(RationaleDialogFragmentCompat.TAG);
+ if (fragment != null) return;
RationaleDialogFragmentCompat
.newInstance(rationale, positiveButton, negativeButton, theme, requestCode, perms)
.showAllowingStateLoss(getSupportFragmentManager(), RationaleDialogFragmentCompat.TAG);
diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java
index e278120..c58d085 100644
--- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java
+++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java
@@ -76,6 +76,8 @@ public void requestPermissions(@NonNull String rationale,
rationale, positiveButton, negativeButton, theme, requestCode, perms);
} else {
directRequestPermissions(requestCode, perms);
+ if(mHost instanceof Callback)
+ ((Callback) mHost).onAndroidRequestPermissionsCalled();
}
}
@@ -102,6 +104,10 @@ public T getHost() {
return mHost;
}
+ public interface Callback {
+ void onAndroidRequestPermissionsCalled();
+ }
+
// ============================================================================
// Public abstract methods
// ============================================================================