Update RNDefaultPreferenceModule.java

This commit is contained in:
Marcos Rodriguez Velez 2024-11-20 00:27:27 -04:00
parent 258a3f07a3
commit 6338a1f123

View File

@ -1,190 +1,122 @@
package com.kevinresol.react_native_default_preference;
import android.content.Context;
import androidx.datastore.core.DataStore;
import androidx.datastore.preferences.core.Preferences;
import androidx.datastore.preferences.core.PreferencesKeys;
import androidx.datastore.preferences.preferencesDataStore;
import androidx.datastore.preferences.core.booleanPreferencesKey;
import android.content.SharedPreferences;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import kotlinx.coroutines.CoroutineScope;
import kotlinx.coroutines.Dispatchers;
import kotlinx.coroutines.launch;
import kotlinx.coroutines.flow.first;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import java.util.Map;
public class RNDefaultPreferenceModule extends ReactContextBaseJavaModule {
private String preferencesName;
private final ReactApplicationContext reactContext;
private DataStore<Preferences> dataStore;
private String preferencesName;
public RNDefaultPreferenceModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
this.preferencesName = reactContext.getPackageName() + "_preferences";
this.dataStore = reactContext.createDataStore(preferencesName); // Corrected method call
}
private final ReactApplicationContext reactContext;
@Override
public String getName() {
return "RNDefaultPreference";
}
public RNDefaultPreferenceModule(ReactApplicationContext reactContext) {
super(reactContext);
this.reactContext = reactContext;
this.preferencesName = reactContext.getPackageName() + "_preferences";
}
@ReactMethod
public void setName(String name, Promise promise) {
if (!this.preferencesName.equals(reactContext.getPackageName() + "_preferences")) {
this.preferencesName = name;
this.dataStore = reactContext.createDataStore(name = preferencesName);
}
promise.resolve(null);
}
@Override
public String getName() {
return "RNDefaultPreference";
}
@ReactMethod
public void getName(Promise promise) {
promise.resolve(preferencesName);
}
@ReactMethod
public void get(String key, Promise promise) {
promise.resolve(getPreferences().getString(key, null));
}
@ReactMethod
public void get(String key, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
Preferences preferences = dataStore.data.first();
Preferences.Key<String> stringKey = PreferencesKeys.stringKey(key);
Preferences.Key<Boolean> booleanKey = PreferencesKeys.booleanKey(key);
String stringValue = preferences.get(stringKey);
Boolean booleanValue = preferences.get(booleanKey);
if (stringValue != null) {
promise.resolve(stringValue);
} else if (booleanValue != null) {
promise.resolve(booleanValue);
} else {
promise.resolve(null);
}
}
}
@ReactMethod
public void set(String key, String value, Promise promise) {
getEditor().putString(key, value).commit();
promise.resolve(null);
}
@ReactMethod
public void set(String key, String value, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
Preferences.Key<String> stringKey = PreferencesKeys.stringKey(key);
dataStore.edit { preferences ->
preferences[stringKey] = value;
}
promise.resolve(null);
}
}
@ReactMethod
public void clear(String key, Promise promise) {
getEditor().remove(key).commit();
promise.resolve(null);
}
@ReactMethod
public void setBoolean(String key, boolean value, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
Preferences.Key<Boolean> booleanKey = PreferencesKeys.booleanKey(key);
dataStore.edit { preferences ->
preferences[booleanKey] = value;
}
promise.resolve(null);
}
@ReactMethod
public void getMultiple(ReadableArray keys, Promise promise) {
WritableArray result = Arguments.createArray();
for(int i = 0; i < keys.size(); i++) {
result.pushString(getPreferences().getString(keys.getString(i), null));
}
promise.resolve(result);
}
@ReactMethod
public void clear(String key, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
Preferences.Key<String> dataStoreKey = PreferencesKeys.stringKey(key);
dataStore.edit { preferences ->
preferences.remove(dataStoreKey);
}
promise.resolve(null);
}
@ReactMethod
public void setMultiple(ReadableMap data, Promise promise) {
SharedPreferences.Editor editor = getEditor();
ReadableMapKeySetIterator iter = data.keySetIterator();
while(iter.hasNextKey()) {
String key = iter.nextKey();
editor.putString(key, data.getString(key)).commit();
}
promise.resolve(null);
}
@ReactMethod
public void getMultiple(ReadableArray keys, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
WritableArray result = Arguments.createArray();
Preferences preferences = dataStore.data.first();
for (int i = 0; i < keys.size(); i++) {
String key = keys.getString(i);
Preferences.Key<String> stringKey = PreferencesKeys.stringKey(key);
Preferences.Key<Boolean> booleanKey = PreferencesKeys.booleanKey(key);
String stringValue = preferences[stringKey];
Boolean booleanValue = preferences[booleanKey];
if (stringValue != null) {
result.pushString(stringValue);
} else if (booleanValue != null) {
result.pushBoolean(booleanValue);
} else {
result.pushNull();
}
}
promise.resolve(result);
}
@ReactMethod
public void clearMultiple(ReadableArray keys, Promise promise) {
SharedPreferences.Editor editor = getEditor();
for(int i = 0; i < keys.size(); i++) {
editor.remove(keys.getString(i));
}
editor.commit();
promise.resolve(null);
}
@ReactMethod
public void setMultiple(ReadableMap data, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
dataStore.edit { preferences ->
ReadableMapKeySetIterator iter = data.keySetIterator();
while (iter.hasNextKey()) {
String key = iter.nextKey();
if (data.getType(key) == ReadableType.String) {
Preferences.Key<String> stringKey = PreferencesKeys.stringKey(key);
preferences[stringKey] = data.getString(key);
} else if (data.getType(key) == ReadableType.Boolean) {
Preferences.Key<Boolean> booleanKey = PreferencesKeys.booleanKey(key);
preferences[booleanKey] = data.getBoolean(key);
}
}
}
promise.resolve(null);
}
@ReactMethod
public void getAll(Promise promise) {
WritableMap result = Arguments.createMap();
Map<String, ?> allEntries = getPreferences().getAll();
for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
result.putString(entry.getKey(), entry.getValue().toString());
}
promise.resolve(result);
}
@ReactMethod
public void clearMultiple(ReadableArray keys, Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
dataStore.edit { preferences ->
for (int i = 0; i < keys.size(); i++) {
Preferences.Key<String> dataStoreKey = PreferencesKeys.stringKey(keys.getString(i));
preferences.remove(dataStoreKey);
}
}
promise.resolve(null);
}
@ReactMethod
public void clearAll(Promise promise) {
SharedPreferences.Editor editor = getEditor();
Map<String, ?> allEntries = getPreferences().getAll();
for (Map.Entry<String, ?> entry : allEntries.entrySet()) {
editor.remove(entry.getKey());
}
editor.commit();
promise.resolve(null);
}
@ReactMethod
public void getAll(Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
WritableMap result = Arguments.createMap();
Preferences preferences = dataStore.data.first();
for (Map.Entry<String, ?> entry : preferences.asMap().entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value instanceof String) {
result.putString(key, (String) value);
} else if (value instanceof Boolean) {
result.putBoolean(key, (Boolean) value);
} else {
result.putNull(key);
}
}
promise.resolve(result);
}
}
@ReactMethod
public void setName(String preferencesName, Promise promise) {
this.preferencesName = preferencesName;
promise.resolve(null);
}
@ReactMethod
public void clearAll(Promise promise) {
CoroutineScope(Dispatchers.IO).launch {
dataStore.edit { preferences ->
preferences.clear();
}
promise.resolve(null);
}
}
@ReactMethod
public void getName(Promise promise) {
promise.resolve(preferencesName);
}
private SharedPreferences getPreferences() {
return getReactApplicationContext().getSharedPreferences(preferencesName, Context.MODE_PRIVATE);
}
private SharedPreferences.Editor getEditor() {
return getPreferences().edit();
}
}