Skip to content
This repository has been archived by the owner on Sep 3, 2023. It is now read-only.

Commit

Permalink
0.2.4
Browse files Browse the repository at this point in the history
  • Loading branch information
afollestad committed Jun 26, 2016
1 parent 332a1c9 commit 7afd56f
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 28 deletions.
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ Add this to your module's `build.gradle` file:
```gradle
dependencies {
// ... other dependencies
compile 'com.afollestad:assent:0.2.3')
compile 'com.afollestad:assent:0.2.4'
}
```

Expand Down
4 changes: 2 additions & 2 deletions library/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ apply plugin: 'com.android.library'
ext {
PUBLISH_GROUP_ID = 'com.afollestad'
PUBLISH_ARTIFACT_ID = 'assent'
PUBLISH_VERSION = '0.2.3'
PUBLISH_VERSION = '0.2.4'
TARGET_SDK = 24
BUILD_TOOLS = "24.0.0"
GOOGLE_LIBS = "24.0.0"
Expand All @@ -16,7 +16,7 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion TARGET_SDK
versionCode 7
versionCode 8
versionName PUBLISH_VERSION
}
lintOptions {
Expand Down
70 changes: 51 additions & 19 deletions library/src/main/java/com/afollestad/assent/Assent.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.afollestad.assent;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.IntRange;
Expand All @@ -20,7 +19,8 @@ public class Assent extends AssentBase {

private static Assent mAssent;
private Activity mActivity;
private Fragment mFragment;
private android.app.Fragment mAppFragment;
private android.support.v4.app.Fragment mSupportFragment;
private final HashMap<String, CallbackStack> mRequestQueue;

private Assent() {
Expand All @@ -34,16 +34,29 @@ private static Assent instance() {
return mAssent;
}

public static void setFragment(@Nullable Fragment from, @Nullable Fragment context) {
public static void setFragment(@Nullable android.app.Fragment from, @Nullable android.app.Fragment context) {
if (context == null) {
final Fragment current = instance().mFragment;
final android.app.Fragment current = instance().mAppFragment;
if (current != null && from != null && from.getClass().getName().equals(current.getClass().getName())) {
instance().mFragment = null;
// LOG("Fragment set to (null)");
instance().mAppFragment = null;
instance().mSupportFragment = null;
}
} else {
instance().mFragment = context;
// LOG("Fragment set to %s", context.getClass().getSimpleName());
instance().mAppFragment = context;
instance().mSupportFragment = null;
}
}

public static void setFragment(@Nullable android.support.v4.app.Fragment from, @Nullable android.support.v4.app.Fragment context) {
if (context == null) {
final android.support.v4.app.Fragment current = instance().mSupportFragment;
if (current != null && from != null && from.getClass().getName().equals(current.getClass().getName())) {
instance().mAppFragment = null;
instance().mSupportFragment = null;
}
} else {
instance().mAppFragment = null;
instance().mSupportFragment = context;
}
}

Expand All @@ -52,18 +65,18 @@ public static void setActivity(@NonNull Activity from, @Nullable Activity contex
final Activity current = instance().mActivity;
if (current != null && from.getClass().getName().equals(current.getClass().getName())) {
instance().mActivity = null;
instance().mFragment = null;
// LOG("Activity set to (null)");
instance().mAppFragment = null;
instance().mSupportFragment = null;
}
} else {
instance().mActivity = context;
// LOG("Activity set to %s", context.getClass().getSimpleName());
}
}

private static void invalidateContext() {
if ((instance().mActivity == null || instance().mActivity.isFinishing()) &&
(instance().mFragment == null || instance().mFragment.getActivity() == null)) {
(instance().mAppFragment == null || instance().mAppFragment.getActivity() == null) &&
(instance().mSupportFragment == null || instance().mSupportFragment.getActivity() == null)) {
throw new IllegalStateException("You must set an Activity or Fragment to Assent.");
}
}
Expand All @@ -81,6 +94,7 @@ public static void handleResult(@NonNull String[] permissions, @NonNull int[] gr
LOG("No callback stack found for key %s, there are %d total callback stacks.", cacheKey, requestQueue().size());
return;
}

final PermissionResultSet result = PermissionResultSet.create(permissions, grantResults);
callbackStack.sendResult(result);
requestQueue().remove(cacheKey);
Expand All @@ -92,10 +106,13 @@ public static void handleResult(@NonNull String[] permissions, @NonNull int[] gr
LOG("Callback stack %s was already executed, skipping.", entry.getKey());
continue;
}

LOG("Executing callback stack %s...", entry.getKey());
final Assent ins = instance();
if (ins.mFragment != null && ins.mFragment.getActivity() != null)
entry.getValue().execute(ins.mFragment);
if (ins.mAppFragment != null && ins.mAppFragment.getActivity() != null)
entry.getValue().execute(ins.mAppFragment);
else if (ins.mSupportFragment != null && ins.mSupportFragment.getActivity() != null)
entry.getValue().execute(ins.mSupportFragment);
else entry.getValue().execute(ins.mActivity);
}
}
Expand All @@ -104,8 +121,14 @@ public static void handleResult(@NonNull String[] permissions, @NonNull int[] gr

public static boolean isPermissionGranted(@NonNull String permission) {
invalidateContext();
final Context context = instance().mFragment != null && instance().mFragment.getActivity() != null ?
instance().mFragment.getActivity() : instance().mActivity;
final Context context;
if (instance().mAppFragment != null) {
context = instance().mAppFragment.getActivity();
} else if (instance().mSupportFragment != null) {
context = instance().mSupportFragment.getActivity();
} else {
context = instance().mActivity;
}
return context != null && ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
}

Expand All @@ -129,12 +152,14 @@ public static void requestPermissions(final @NonNull Object target,
LOG("Requesting permissions %s with target %s", join(permissions), target.getClass().getName());
final Method[] methods = target.getClass().getDeclaredMethods();
Method annotatedMethod = null;

for (Method m : methods) {
AfterPermissionResult annotation = m.getAnnotation(AfterPermissionResult.class);
if (annotation == null) continue;
else if (!arraysEqual(permissions, annotation.permissions())) continue;
annotatedMethod = m;
}

if (annotatedMethod == null)
throw new IllegalStateException(String.format("No AfterPermissionResult annotated methods found in %s with a matching permission set.", target.getClass().getName()));
else if (annotatedMethod.getParameterTypes().length != 1)
Expand Down Expand Up @@ -165,21 +190,28 @@ public static void requestPermissions(@NonNull AssentCallback callback,
synchronized (requestQueue()) {
final String cacheKey = getCacheKey(permissions);
CallbackStack callbackStack = requestQueue().get(cacheKey);

if (callbackStack != null) {
callbackStack.setRequestCode(requestCode);
callbackStack.push(callback);
LOG("Pushed callback to EXISTING stack %s... stack size: %d", cacheKey, callbackStack.size());
} else {
callbackStack = new CallbackStack(requestCode, permissions);
callbackStack.push(callback);

final boolean startNow = requestQueue().size() == 0;
requestQueue().put(cacheKey, callbackStack);
LOG("Added NEW callback stack %s", cacheKey);

if (startNow) {
LOG("Executing new permission stack now.");
if (instance().mFragment != null && instance().mFragment.getActivity() != null)
callbackStack.execute(instance().mFragment);
else callbackStack.execute(instance().mActivity);
if (instance().mAppFragment != null && instance().mAppFragment.getActivity() != null) {
callbackStack.execute(instance().mAppFragment);
} else if (instance().mSupportFragment != null && instance().mSupportFragment.getActivity() != null) {
callbackStack.execute(instance().mSupportFragment);
} else {
callbackStack.execute(instance().mActivity);
}
} else {
LOG("New permission stack will be executed later.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,4 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
requestCode, AssentBase.join(permissions), AssentBase.join(grantResults));
Assent.handleResult(permissions, grantResults);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.afollestad.assent;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v13.app.FragmentCompat;
import android.support.v4.app.Fragment;

/**
* @author Aidan Follestad (afollestad)
*/
public class AssentSupportFragment extends Fragment implements FragmentCompat.OnRequestPermissionsResultCallback {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Assent.setFragment(this, this);
}

@Override
public void onResume() {
super.onResume();
Assent.setFragment(this, this);
}

@Override
public void onPause() {
super.onPause();
if (getActivity() != null && getActivity().isFinishing())
Assent.setFragment(this, null);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
AssentBase.LOG("AssentFragment", "onRequestPermissionsResult(): %d, %s, %s",
requestCode, AssentBase.join(permissions), AssentBase.join(grantResults));
Assent.handleResult(permissions, grantResults);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.afollestad.assent;

import android.app.Activity;
import android.app.Fragment;
import android.support.annotation.NonNull;
import android.support.v13.app.FragmentCompat;
import android.support.v4.app.ActivityCompat;
Expand Down Expand Up @@ -46,7 +45,12 @@ public void execute(@NonNull Activity context) {
ActivityCompat.requestPermissions(context, mPermissions, mRequestCode);
}

public void execute(@NonNull Fragment context) {
public void execute(@NonNull android.support.v4.app.Fragment context) {
mExecuted = true;
context.requestPermissions(mPermissions, mRequestCode);
}

public void execute(@NonNull android.app.Fragment context) {
mExecuted = true;
FragmentCompat.requestPermissions(context, mPermissions, mRequestCode);
}
Expand Down
4 changes: 2 additions & 2 deletions sample/build.gradle
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apply plugin: 'com.android.application'

ext {
PUBLISH_VERSION = "0.2.3"
PUBLISH_VERSION = "0.2.4"
TARGET_SDK = 24
BUILD_TOOLS = "24.0.0"
GOOGLE_LIBS = "24.0.0"
Expand All @@ -15,7 +15,7 @@ android {
applicationId "com.afollestad.assentsample"
minSdkVersion 14
targetSdkVersion TARGET_SDK
versionCode 7
versionCode 8
versionName PUBLISH_VERSION
}
lintOptions {
Expand Down

0 comments on commit 7afd56f

Please sign in to comment.