Skip to content

Commit

Permalink
feat(android): "requestPermissions" and Geolocation APIs return Promise
Browse files Browse the repository at this point in the history
  • Loading branch information
drauggres authored and sgtcoolguy committed Dec 9, 2020
1 parent ea75a0f commit 971e71e
Show file tree
Hide file tree
Showing 7 changed files with 258 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollObject;
import org.appcelerator.kroll.KrollPromise;
import org.appcelerator.kroll.KrollRuntime;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
Expand Down Expand Up @@ -684,40 +686,48 @@ public boolean hasPermission(Object permissionObject)
}

@Kroll.method
public void requestPermissions(Object permissionObject,
@Kroll.argument(optional = true) KrollFunction permissionCallback)
public KrollPromise<KrollDict> requestPermissions(final Object permissionObject,
@Kroll.argument(optional = true) final KrollFunction permissionCallback)
{
if (Build.VERSION.SDK_INT >= 23) {
ArrayList<String> permissions = new ArrayList<String>();
if (permissionObject instanceof String) {
permissions.add((String) permissionObject);
} else if (permissionObject instanceof Object[]) {
for (Object permission : (Object[]) permissionObject) {
if (permission instanceof String) {
permissions.add((String) permission);
// TODO: Create a subclass of Promise that takes in KrollFunction callback and "this" KrollObject
// to fire the callback when we resolve/reject?
final KrollObject callbackThisObject = getKrollObject();
return KrollPromise.create((promise) -> {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissions = new ArrayList<String>();
if (permissionObject instanceof String) {
permissions.add((String) permissionObject);
} else if (permissionObject instanceof Object[]) {
for (Object permission : (Object[]) permissionObject) {
if (permission instanceof String) {
permissions.add((String) permission);
}
}
}
}
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
ArrayList<String> filteredPermissions = new ArrayList<String>();
for (String permission : permissions) {
if (currentActivity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
continue;
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
List<String> filteredPermissions = new ArrayList<String>();
for (String permission : permissions) {
if (currentActivity.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED) {
continue;
}
filteredPermissions.add(permission);
}
if (filteredPermissions.size() > 0) {
TiBaseActivity.registerPermissionRequestCallback(REQUEST_CODE, permissionCallback,
callbackThisObject, promise);
currentActivity.requestPermissions(filteredPermissions.toArray(
new String[filteredPermissions.size()]), REQUEST_CODE);
return;
}
filteredPermissions.add(permission);
}
if (filteredPermissions.size() > 0) {
TiBaseActivity.registerPermissionRequestCallback(REQUEST_CODE, permissionCallback, getKrollObject());
currentActivity.requestPermissions(filteredPermissions.toArray(new String[filteredPermissions.size()]),
REQUEST_CODE);
return;
// FIXME: If we're not on API level 23+, shouldn't we reject/error?
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
if (permissionCallback != null) {
permissionCallback.callAsync(callbackThisObject, response);
}
}
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
if (permissionCallback != null) {
permissionCallback.callAsync(getKrollObject(), response);
}
promise.resolve(response);
});
}

@Kroll.method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollObject;
import org.appcelerator.kroll.KrollPromise;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.titanium.TiBaseActivity;
Expand Down Expand Up @@ -126,21 +128,26 @@ public boolean hasCalendarPermissions()
}

@Kroll.method
public void requestCalendarPermissions(@Kroll.argument(optional = true) KrollFunction permissionCallback)
public KrollPromise<KrollDict> requestCalendarPermissions(
@Kroll.argument(optional = true) final KrollFunction permissionCallback)
{
if (hasCalendarPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(getKrollObject(), response);
return;
}

TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_CALENDAR, permissionCallback,
getKrollObject());
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(
new String[] { Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR },
TiC.PERMISSION_CODE_CALENDAR);
final KrollObject callbackThisObject = getKrollObject();
return KrollPromise.create((promise) -> {
if (hasCalendarPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(callbackThisObject, response);
promise.resolve(response);
return;
}

TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_CALENDAR, permissionCallback,
callbackThisObject, promise);
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(
new String[] { Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR },
TiC.PERMISSION_CODE_CALENDAR);
});
}

@Kroll.method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollObject;
import org.appcelerator.kroll.KrollPromise;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
Expand Down Expand Up @@ -76,21 +78,26 @@ public boolean hasContactsPermissions()
}

@Kroll.method
public void requestContactsPermissions(@Kroll.argument(optional = true) KrollFunction permissionCallback)
public KrollPromise<KrollDict> requestContactsPermissions(
@Kroll.argument(optional = true) final KrollFunction permissionCallback)
{
if (hasContactsPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(getKrollObject(), response);
return;
}
final KrollObject callbackThisObject = getKrollObject();
return KrollPromise.create((promise) -> {
if (hasContactsPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(callbackThisObject, response);
promise.resolve(response);
return;
}

TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_CONTACTS, permissionCallback,
getKrollObject());
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(
new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS },
TiC.PERMISSION_CODE_CONTACTS);
TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_CONTACTS, permissionCallback,
callbackThisObject, promise);
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(
new String[] { Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS },
TiC.PERMISSION_CODE_CONTACTS);
});
}

@Kroll.method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.kroll.KrollInvocation;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollObject;
import org.appcelerator.kroll.KrollPromise;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
import org.appcelerator.titanium.io.TiFileFactory;
Expand Down Expand Up @@ -113,23 +115,28 @@ private boolean hasStoragePermissions()
}

@Kroll.method
public void requestStoragePermissions(@Kroll.argument(optional = true) KrollFunction permissionCallback)
public KrollPromise<KrollDict> requestStoragePermissions(
@Kroll.argument(optional = true) final KrollFunction permissionCallback)
{
if (hasStoragePermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(getKrollObject(), response);
return;
}
final KrollObject callbackThisObject = getKrollObject();
return KrollPromise.create((promise) -> {
if (hasStoragePermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCallback.callAsync(callbackThisObject, response);
promise.resolve(response);
return;
}

String[] permissions = new String[] {
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
};
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_EXTERNAL_STORAGE, permissionCallback,
getKrollObject());
currentActivity.requestPermissions(permissions, TiC.PERMISSION_CODE_EXTERNAL_STORAGE);
String[] permissions = new String[] {
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
};
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_EXTERNAL_STORAGE,
permissionCallback, callbackThisObject, promise);
currentActivity.requestPermissions(permissions, TiC.PERMISSION_CODE_EXTERNAL_STORAGE);
});
}

@Kroll.method
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollObject;
import org.appcelerator.kroll.KrollPromise;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.KrollRuntime;
import org.appcelerator.kroll.annotations.Kroll;
Expand Down Expand Up @@ -508,28 +510,35 @@ public boolean hasLocationPermissions()

@SuppressLint("NewApi")
@Kroll.method
public void requestLocationPermissions(@Kroll.argument(optional = true) Object type,
@Kroll.argument(optional = true) KrollFunction permissionCallback)
{
KrollFunction permissionCB;
if (type instanceof KrollFunction && permissionCallback == null) {
permissionCB = (KrollFunction) type;
} else {
permissionCB = permissionCallback;
}
public KrollPromise<KrollDict> requestLocationPermissions(@Kroll.argument(optional = true) final Object type,
@Kroll.argument(optional = true) final KrollFunction permissionCallback)
{
final KrollObject callbackThisObject = getKrollObject();
return KrollPromise.create((promise) -> {
KrollFunction permissionCB;
if (type instanceof KrollFunction && permissionCallback == null) {
permissionCB = (KrollFunction) type;
} else {
permissionCB = permissionCallback;
}

// already have permissions, fall through
if (hasLocationPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
permissionCB.callAsync(getKrollObject(), response);
return;
}
// already have permissions, fall through
if (hasLocationPermissions()) {
KrollDict response = new KrollDict();
response.putCodeAndMessage(0, null);
if (permissionCB != null) {
permissionCB.callAsync(callbackThisObject, response);
}
promise.resolve(response);
return;
}

TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_LOCATION, permissionCB, getKrollObject());
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
TiC.PERMISSION_CODE_LOCATION);
TiBaseActivity.registerPermissionRequestCallback(TiC.PERMISSION_CODE_LOCATION, permissionCB,
callbackThisObject, promise);
Activity currentActivity = TiApplication.getInstance().getCurrentActivity();
currentActivity.requestPermissions(new String[] { Manifest.permission.ACCESS_FINE_LOCATION },
TiC.PERMISSION_CODE_LOCATION);
});
}

/**
Expand Down Expand Up @@ -710,9 +719,12 @@ public void getCurrentPosition(KrollFunction callback)
* for the specified address if available
*/
@Kroll.method
public void forwardGeocoder(String address, KrollFunction callback)
public KrollPromise<KrollDict> forwardGeocoder(final String address,
@Kroll.argument(optional = true) final KrollFunction callback)
{
tiLocation.forwardGeocode(address, createGeocodeResponseHandler(callback));
return KrollPromise.create((promise) -> {
tiLocation.forwardGeocode(address, createGeocodeResponseHandler(callback, promise));
});
}

/**
Expand All @@ -725,9 +737,12 @@ public void forwardGeocoder(String address, KrollFunction callback)
* for the specified latitude and longitude if available
*/
@Kroll.method
public void reverseGeocoder(double latitude, double longitude, KrollFunction callback)
public KrollPromise<KrollDict> reverseGeocoder(double latitude, double longitude,
@Kroll.argument(optional = true) final KrollFunction callback)
{
tiLocation.reverseGeocode(latitude, longitude, createGeocodeResponseHandler(callback));
return KrollPromise.create((promise) -> {
tiLocation.reverseGeocode(latitude, longitude, createGeocodeResponseHandler(callback, promise));
});
}

/**
Expand All @@ -738,7 +753,8 @@ public void reverseGeocoder(double latitude, double longitude, KrollFunction cal
* once the geocode response is ready
* @return the geocode response handler
*/
private GeocodeResponseHandler createGeocodeResponseHandler(final KrollFunction callback)
private GeocodeResponseHandler createGeocodeResponseHandler(final KrollFunction callback,
final KrollPromise<KrollDict> promise)
{
final GeolocationModule geolocationModule = this;

Expand All @@ -747,6 +763,10 @@ private GeocodeResponseHandler createGeocodeResponseHandler(final KrollFunction
public void handleGeocodeResponse(KrollDict geocodeResponse)
{
geocodeResponse.put(TiC.EVENT_PROPERTY_SOURCE, geolocationModule);
promise.resolve(geocodeResponse);
if (callback == null) {
return;
}
callback.call(getKrollObject(), new Object[] { geocodeResponse });
}
};
Expand Down
Loading

0 comments on commit 971e71e

Please sign in to comment.