Skip to content

Commit

Permalink
Fix bug WRITE_EXTERNAL_STORAGE permission missing
Browse files Browse the repository at this point in the history
  • Loading branch information
daohoangson committed Feb 24, 2017
1 parent e36861c commit f7d24ca
Show file tree
Hide file tree
Showing 5 changed files with 121 additions and 4 deletions.
3 changes: 1 addition & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package com.xfrocks.api.androiddemo.common;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;

public class AndroidPermissions {
// https://gist.github.com/gotev/67c300c563bdf68a502c

private final Context mContext;
private final String[] mRequiredPermissions;
private final ArrayList<String> mPermissionsToRequest = new ArrayList<>();

public AndroidPermissions(Context context, String... requiredPermissions) {
mContext = context;
mRequiredPermissions = requiredPermissions;
}

public boolean needRequesting() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
return false;
}

mPermissionsToRequest.clear();

for (String permission : mRequiredPermissions) {
if (ContextCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
mPermissionsToRequest.add(permission);
}
}

return !mPermissionsToRequest.isEmpty();

}

public void requestPermissions(Fragment fragment, int requestCode) {
String[] permissions = mPermissionsToRequest.toArray(new String[mPermissionsToRequest.size()]);
fragment.requestPermissions(permissions, requestCode);
}

public boolean areAllRequiredPermissionsGranted(String[] permissions, int[] grantResults) {
if (permissions == null || permissions.length == 0
|| grantResults == null || grantResults.length == 0) {
return false;
}

LinkedHashMap<String, Integer> perms = new LinkedHashMap<>();

for (int i = 0; i < permissions.length; i++) {
if (!perms.containsKey(permissions[i])
|| (perms.containsKey(permissions[i]) && perms.get(permissions[i]) == PackageManager.PERMISSION_DENIED))
perms.put(permissions[i], grantResults[i]);
}

for (Map.Entry<String, Integer> entry : perms.entrySet()) {
if (entry.getValue() != PackageManager.PERMISSION_GRANTED) {
return false;
}
}

return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.lang.reflect.Array;

public class ArrayUtils {
class ArrayUtils {
public static <T> T[] concat(T[] first, T[] second, Class<T> type) {
int len1 = first.length;
int len2 = second.length;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import java.lang.reflect.Field;

public class ReflectionUtils {
class ReflectionUtils {

public static Field[] getFieldsUpTo(@NonNull Class<?> type, @Nullable Class<?> exclusiveParent) {
// https://github.com/dancerjohn/LibEx/blob/master/libex/src/main/java/org/libex/reflect/ReflectionUtils.java
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.xfrocks.api.androiddemo.discussion;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
Expand All @@ -27,6 +29,7 @@
import com.bumptech.glide.request.target.SimpleTarget;
import com.xfrocks.api.androiddemo.App;
import com.xfrocks.api.androiddemo.R;
import com.xfrocks.api.androiddemo.common.AndroidPermissions;
import com.xfrocks.api.androiddemo.common.ApiConstants;
import com.xfrocks.api.androiddemo.common.ChooserIntent;
import com.xfrocks.api.androiddemo.common.model.ApiAccessToken;
Expand All @@ -48,6 +51,8 @@
public class QuickReplyFragment extends Fragment {

private static final int RC_PICK_FILE = 1;
private static final int RC_ATTEMPT_ATTACH = 2;
private static final int RC_ATTEMPT_CAMERA = 3;

private LinearLayout mExtra;
private ImageButton mAttach;
Expand All @@ -58,9 +63,17 @@ public class QuickReplyFragment extends Fragment {
private ApiDiscussion mDiscussion;
private Listener mListener;

private AndroidPermissions mUploadPermissions;
private AttachmentsAdapter mPendingAttachments;
private String mPendingMessage;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mUploadPermissions = new AndroidPermissions(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Expand Down Expand Up @@ -137,6 +150,24 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);

switch (requestCode) {
case RC_ATTEMPT_ATTACH:
if (mUploadPermissions.areAllRequiredPermissionsGranted(permissions, grantResults)) {
attemptAttachStep2();
}
break;
case RC_ATTEMPT_CAMERA:
if (mUploadPermissions.areAllRequiredPermissionsGranted(permissions, grantResults)) {
attemptCameraStep2();
}
break;
}
}

void setup(ApiDiscussion discussion, Listener listener) {
mDiscussion = discussion;
mListener = listener;
Expand Down Expand Up @@ -210,11 +241,29 @@ private void toggleExtraPanel() {
}

private void attemptAttach() {
if (mUploadPermissions.needRequesting()) {
mUploadPermissions.requestPermissions(this, RC_ATTEMPT_ATTACH);
return;
}

attemptAttachStep2();
}

private void attemptAttachStep2() {
Intent chooserIntent = ChooserIntent.create(getContext(), R.string.pick_file_to_attach, "*/*");
startActivityForResult(chooserIntent, RC_PICK_FILE);
}

private void attemptCamera() {
if (mUploadPermissions.needRequesting()) {
mUploadPermissions.requestPermissions(this, RC_ATTEMPT_CAMERA);
return;
}

attemptCameraStep2();
}

private void attemptCameraStep2() {
Intent[] cameraIntents = ChooserIntent.buildCameraIntents(getContext());
if (cameraIntents.length == 0) {
// TODO: device without camera?
Expand Down

0 comments on commit f7d24ca

Please sign in to comment.