RNPermissionsModule.java 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package com.reactnativecommunity.rnpermissions;
  2. import android.Manifest;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.net.Uri;
  7. import android.provider.Settings;
  8. import android.support.v4.app.NotificationManagerCompat;
  9. import com.facebook.react.bridge.Arguments;
  10. import com.facebook.react.bridge.Promise;
  11. import com.facebook.react.bridge.ReactApplicationContext;
  12. import com.facebook.react.bridge.ReactContextBaseJavaModule;
  13. import com.facebook.react.bridge.ReactMethod;
  14. import com.facebook.react.bridge.ReadableArray;
  15. import com.facebook.react.bridge.WritableArray;
  16. import com.facebook.react.bridge.WritableMap;
  17. import com.facebook.react.module.annotations.ReactModule;
  18. import java.util.Map;
  19. @ReactModule(name = RNPermissionsModule.MODULE_NAME)
  20. public class RNPermissionsModule extends ReactContextBaseJavaModule {
  21. private static final String ERROR_INVALID_ACTIVITY = "E_INVALID_ACTIVITY";
  22. public static final String MODULE_NAME = "RNPermissions";
  23. private static final String SETTING_NAME = "@RNPermissions:NonRequestables";
  24. private final SharedPreferences sharedPrefs;
  25. public RNPermissionsModule(ReactApplicationContext reactContext) {
  26. super(reactContext);
  27. sharedPrefs = reactContext.getSharedPreferences(SETTING_NAME, Context.MODE_PRIVATE);
  28. }
  29. @Override
  30. public String getName() {
  31. return MODULE_NAME;
  32. }
  33. @ReactMethod
  34. public void isAvailable(final String permission, final Promise promise) {
  35. String fieldName = permission.substring(permission.lastIndexOf('.') + 1);
  36. try {
  37. Manifest.permission.class.getField(fieldName);
  38. promise.resolve(true);
  39. } catch (NoSuchFieldException e) {
  40. promise.resolve(false);
  41. }
  42. }
  43. @ReactMethod
  44. public void setNonRequestable(final String permission, final Promise promise) {
  45. promise.resolve(sharedPrefs.edit().putBoolean(permission, true).commit());
  46. }
  47. @ReactMethod
  48. public void getNonRequestables(final Promise promise) {
  49. WritableArray result = Arguments.createArray();
  50. Map<String, ?> entries = sharedPrefs.getAll();
  51. for (Map.Entry<String, ?> entry : entries.entrySet()) {
  52. result.pushString(entry.getKey());
  53. }
  54. promise.resolve(result);
  55. }
  56. @ReactMethod
  57. public void openSettings(final Promise promise) {
  58. try {
  59. final ReactApplicationContext reactContext = getReactApplicationContext();
  60. final Intent intent = new Intent();
  61. intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
  62. intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  63. intent.setData(Uri.fromParts("package", reactContext.getPackageName(), null));
  64. reactContext.startActivity(intent);
  65. promise.resolve(true);
  66. } catch (Exception e) {
  67. promise.reject(ERROR_INVALID_ACTIVITY, e);
  68. }
  69. }
  70. private WritableMap internalCheckNotifications() {
  71. final ReactApplicationContext reactContext = getReactApplicationContext();
  72. final boolean enabled = NotificationManagerCompat.from(reactContext).areNotificationsEnabled();
  73. final WritableMap map = Arguments.createMap();
  74. final WritableMap settings = Arguments.createMap();
  75. if (enabled) {
  76. map.putString("status", "granted");
  77. } else {
  78. map.putString("status", "blocked");
  79. }
  80. map.putMap("settings", settings);
  81. return map;
  82. }
  83. @ReactMethod
  84. public void checkNotifications(final Promise promise) {
  85. promise.resolve(internalCheckNotifications());
  86. }
  87. @ReactMethod
  88. public void requestNotifications(ReadableArray options, final Promise promise) {
  89. promise.resolve(internalCheckNotifications());
  90. }
  91. }