diff --git a/android/src/main/java/com/levelasquez/androidopensettings/AndroidOpenSettings.java b/android/src/main/java/com/levelasquez/androidopensettings/AndroidOpenSettings.java index 97f57a9..12277b9 100644 --- a/android/src/main/java/com/levelasquez/androidopensettings/AndroidOpenSettings.java +++ b/android/src/main/java/com/levelasquez/androidopensettings/AndroidOpenSettings.java @@ -1,16 +1,24 @@ package com.levelasquez.androidopensettings; +import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.provider.Settings; +import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.LifecycleEventListener; +import com.facebook.react.bridge.Promise; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; +import java.util.ArrayList; +import java.util.List; + public class AndroidOpenSettings extends ReactContextBaseJavaModule { + private List usedRequestCodes = new ArrayList<>(); private ReactContext reactContext; public AndroidOpenSettings(ReactApplicationContext reactContext) { @@ -24,211 +32,208 @@ public String getName() { } @ReactMethod - public void generalSettings() { + public void generalSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } - + @ReactMethod - public void homeSettings() { + public void homeSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_HOME_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void appDetailsSettings() { + public void appDetailsSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); intent.setData(Uri.parse("package:" + reactContext.getPackageName())); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void wifiSettings() { + public void wifiSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void locationSourceSettings() { + public void locationSourceSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void wirelessSettings() { + public void wirelessSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void airplaneModeSettings() { + public void airplaneModeSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void apnSettings() { + public void apnSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_APN_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void bluetoothSettings() { + public void bluetoothSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void dateSettings() { + public void dateSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_DATE_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void localeSettings() { + public void localeSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void inputMethodSettings() { + public void inputMethodSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_INPUT_METHOD_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void displaySettings() { + public void displaySettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_DISPLAY_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void securitySettings() { + public void securitySettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_SECURITY_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void internalStorageSettings() { + public void internalStorageSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_INTERNAL_STORAGE_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void memoryCardSettings() { + public void memoryCardSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_MEMORY_CARD_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void accessibilitySettings() { + public void accessibilitySettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void applicationSettings() { + public void applicationSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_APPLICATION_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void deviceInfoSettings() { + public void deviceInfoSettings(Promise promise) { Intent intent = new Intent(Settings.ACTION_DEVICE_INFO_SETTINGS); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); - } + + startActivity(intent, promise); } @ReactMethod - public void appNotificationSettings() { + public void appNotificationSettings(Promise promise) { Intent intent = new Intent("android.settings.APP_NOTIFICATION_SETTINGS"); // Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); - //for Android 5-7 + // for Android 5-7 intent.putExtra("app_package", reactContext.getPackageName()); intent.putExtra("app_uid", reactContext.getApplicationInfo().uid); // for Android 8 and above intent.putExtra("android.provider.extra.APP_PACKAGE", reactContext.getPackageName()); // Settings.EXTRA_APP_PACKAGE + startActivity(intent, promise); + } + + private void startActivity(Intent intent, final Promise promise) { if (intent.resolveActivity(reactContext.getPackageManager()) != null) { - reactContext.startActivity(intent); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + + Activity currentActivity = getCurrentActivity(); + final int requestCode = usedRequestCodes.size() == 0 ? 1 + : usedRequestCodes.get(usedRequestCodes.size() - 1) + 1; + + usedRequestCodes.add(requestCode); + + reactContext.addActivityEventListener(new ActivityEventListener() { + @Override + public void onActivityResult(Activity activity, int resultRequestCode, int resultCode, Intent data) { + if (requestCode == resultRequestCode) { + reactContext.removeActivityEventListener(this); + + usedRequestCodes.remove(Integer.valueOf(requestCode)); + + reactContext.addLifecycleEventListener(new LifecycleEventListener() { + boolean hasBeenPaused; + + @Override + public void onHostResume() { + if (hasBeenPaused) { + reactContext.removeLifecycleEventListener(this); + promise.resolve(null); + } + } + + @Override + public void onHostPause() { + hasBeenPaused = true; + } + + @Override + public void onHostDestroy() { + + } + }); + } + } + + @Override + public void onNewIntent(Intent intent) { + } + }); + + if (currentActivity != null) { + currentActivity.startActivityForResult(intent, requestCode); + } else { + promise.reject("2", "Null currentActivity"); + } + } else { + promise.reject("1", "Null return from resolveActivity"); } } -} +} \ No newline at end of file diff --git a/index.d.ts b/index.d.ts index cdb6e2c..ff9dbec 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,22 +1,22 @@ -declare module "react-native-android-open-settings" { - const generalSettings: () => void; - const homeSettings: () => void; - const appDetailsSettings: () => void; - const wifiSettings: () => void; - const locationSourceSettings: () => void; - const wirelessSettings: () => void; - const airplaneModeSettings: () => void; - const apnSettings: () => void; - const bluetoothSettings: () => void; - const dateSettings: () => void; - const localeSettings: () => void; - const inputMethodSettings: () => void; - const displaySettings: () => void; - const securitySettings: () => void; - const internalStorageSettings: () => void; - const memoryCardSettings: () => void; - const accessibilitySettings: () => void; - const applicationSettings: () => void; - const deviceInfoSettings: () => void; - const appNotificationSettings: () => void; +declare module "react-native-android-open-settings-async" { + const generalSettings: () => Promise; + const homeSettings: () => Promise; + const appDetailsSettings: () => Promise; + const wifiSettings: () => Promise; + const locationSourceSettings: () => Promise; + const wirelessSettings: () => Promise; + const airplaneModeSettings: () => Promise; + const apnSettings: () => Promise; + const bluetoothSettings: () => Promise; + const dateSettings: () => Promise; + const localeSettings: () => Promise; + const inputMethodSettings: () => Promise; + const displaySettings: () => Promise; + const securitySettings: () => Promise; + const internalStorageSettings: () => Promise; + const memoryCardSettings: () => Promise; + const accessibilitySettings: () => Promise; + const applicationSettings: () => Promise; + const deviceInfoSettings: () => Promise; + const appNotificationSettings: () => Promise; } diff --git a/index.js b/index.js index 2d6156d..1fc99e3 100644 --- a/index.js +++ b/index.js @@ -2,45 +2,45 @@ import { NativeModules } from 'react-native' const { RNAndroidOpenSettings } = NativeModules -const generalSettings = () => RNAndroidOpenSettings.generalSettings() +const generalSettings = async () => RNAndroidOpenSettings.generalSettings() -const homeSettings = () => RNAndroidOpenSettings.homeSettings() +const homeSettings = async () => RNAndroidOpenSettings.homeSettings() -const appDetailsSettings = () => RNAndroidOpenSettings.appDetailsSettings() +const appDetailsSettings = async () => RNAndroidOpenSettings.appDetailsSettings() -const wifiSettings = () => RNAndroidOpenSettings.wifiSettings() +const wifiSettings = async () => RNAndroidOpenSettings.wifiSettings() -const locationSourceSettings = () => RNAndroidOpenSettings.locationSourceSettings() +const locationSourceSettings = async () => RNAndroidOpenSettings.locationSourceSettings() -const wirelessSettings = () => RNAndroidOpenSettings.wirelessSettings() +const wirelessSettings = async () => RNAndroidOpenSettings.wirelessSettings() -const airplaneModeSettings = () => RNAndroidOpenSettings.airplaneModeSettings() +const airplaneModeSettings = async () => RNAndroidOpenSettings.airplaneModeSettings() -const apnSettings = () => RNAndroidOpenSettings.apnSettings() +const apnSettings = async () => RNAndroidOpenSettings.apnSettings() -const bluetoothSettings = () => RNAndroidOpenSettings.bluetoothSettings() +const bluetoothSettings = async () => RNAndroidOpenSettings.bluetoothSettings() -const dateSettings = () => RNAndroidOpenSettings.dateSettings() +const dateSettings = async () => RNAndroidOpenSettings.dateSettings() -const localeSettings = () => RNAndroidOpenSettings.localeSettings() +const localeSettings = async () => RNAndroidOpenSettings.localeSettings() -const inputMethodSettings = () => RNAndroidOpenSettings.inputMethodSettings() +const inputMethodSettings = async () => RNAndroidOpenSettings.inputMethodSettings() -const displaySettings = () => RNAndroidOpenSettings.displaySettings() +const displaySettings = async () => RNAndroidOpenSettings.displaySettings() -const securitySettings = () => RNAndroidOpenSettings.securitySettings() +const securitySettings = async () => RNAndroidOpenSettings.securitySettings() -const internalStorageSettings = () => RNAndroidOpenSettings.internalStorageSettings() +const internalStorageSettings = async () => RNAndroidOpenSettings.internalStorageSettings() -const memoryCardSettings = () => RNAndroidOpenSettings.memoryCardSettings() +const memoryCardSettings = async () => RNAndroidOpenSettings.memoryCardSettings() -const accessibilitySettings = () => RNAndroidOpenSettings.accessibilitySettings() +const accessibilitySettings = async () => RNAndroidOpenSettings.accessibilitySettings() -const applicationSettings = () => RNAndroidOpenSettings.applicationSettings() +const applicationSettings = async () => RNAndroidOpenSettings.applicationSettings() -const deviceInfoSettings = () => RNAndroidOpenSettings.deviceInfoSettings() +const deviceInfoSettings = async () => RNAndroidOpenSettings.deviceInfoSettings() -const appNotificationSettings = () => RNAndroidOpenSettings.appNotificationSettings() +const appNotificationSettings = async () => RNAndroidOpenSettings.appNotificationSettings() module.exports = { generalSettings,