Skip to content

Make the all the settings calls async #16

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Integer> usedRequestCodes = new ArrayList<>();
private ReactContext reactContext;

public AndroidOpenSettings(ReactApplicationContext reactContext) {
Expand All @@ -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");
}
}
}
}
42 changes: 21 additions & 21 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -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<void>;
const homeSettings: () => Promise<void>;
const appDetailsSettings: () => Promise<void>;
const wifiSettings: () => Promise<void>;
const locationSourceSettings: () => Promise<void>;
const wirelessSettings: () => Promise<void>;
const airplaneModeSettings: () => Promise<void>;
const apnSettings: () => Promise<void>;
const bluetoothSettings: () => Promise<void>;
const dateSettings: () => Promise<void>;
const localeSettings: () => Promise<void>;
const inputMethodSettings: () => Promise<void>;
const displaySettings: () => Promise<void>;
const securitySettings: () => Promise<void>;
const internalStorageSettings: () => Promise<void>;
const memoryCardSettings: () => Promise<void>;
const accessibilitySettings: () => Promise<void>;
const applicationSettings: () => Promise<void>;
const deviceInfoSettings: () => Promise<void>;
const appNotificationSettings: () => Promise<void>;
}
Loading