Skip to content
This repository was archived by the owner on Nov 8, 2018. It is now read-only.

Commit a48533f

Browse files
committed
fix: fixes runtime permissions
Fixes #397
1 parent d1c67d0 commit a48533f

File tree

3 files changed

+168
-61
lines changed

3 files changed

+168
-61
lines changed

app/src/main/java/com/peacecorps/pcsa/MainActivity.java

+151-59
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.peacecorps.pcsa;
22

3+
import android.Manifest;
4+
import android.content.DialogInterface;
35
import android.content.Intent;
46
import android.content.IntentFilter;
57
import android.content.SharedPreferences;
8+
import android.content.pm.PackageManager;
9+
import android.net.Uri;
10+
import android.os.Build;
611
import android.os.Bundle;
712
import android.preference.PreferenceManager;
13+
import android.provider.Settings;
14+
import android.support.annotation.NonNull;
15+
import android.support.annotation.RequiresApi;
816
import android.support.v4.app.Fragment;
917
import android.support.v4.app.FragmentActivity;
1018
import android.support.v4.app.FragmentManager;
1119
import android.support.v4.view.GravityCompat;
1220
import android.support.v4.widget.DrawerLayout;
1321
import android.support.v7.app.ActionBarDrawerToggle;
22+
import android.support.v7.app.AlertDialog;
1423
import android.support.v7.app.AppCompatActivity;
1524
import android.support.v7.widget.Toolbar;
1625
import android.util.Log;
@@ -40,7 +49,6 @@
4049
import com.peacecorps.pcsa.support_services.ConfidentialityFragment;
4150
import com.peacecorps.pcsa.support_services.MythbustersFragment;
4251

43-
import java.lang.reflect.Array;
4452
import java.util.ArrayList;
4553
import java.util.Arrays;
4654
import java.util.HashMap;
@@ -50,44 +58,77 @@
5058

5159
public class MainActivity extends AppCompatActivity {
5260

61+
private static final String TAG = MainActivity.class.getSimpleName();
62+
private static final int PERMISSION_CALLBACK = 100;
63+
private static final int PERMISSION_SETTINGS = 101;
64+
public static boolean refreshList = false;
65+
public static String FRAGMENT_TAG = MainActivityFragment.TAG;
66+
SharedPreferences sharedPreferences;
5367
private Toolbar toolbar;
5468
private DrawerLayout mDrawer;
5569
private NavDrawerListAdapter listAdapter;
5670
private ExpandableListView expListView;
5771
private List<String> listDataHeader;
58-
public static boolean refreshList= false;
5972
private HashMap<String, List<String>> listDataChild;
60-
private static final String TAG = MainActivity.class.getSimpleName();
61-
public static String FRAGMENT_TAG = MainActivityFragment.TAG;
6273
private FragmentManager fragmentManager = getSupportFragmentManager();
63-
SharedPreferences sharedPreferences;
64-
private int lastExpandedGroup=-1;
74+
private int lastExpandedGroup = -1;
6575
private int lastChildExpandedGroup = -1;
76+
private String[] runTimePermissions = new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.SEND_SMS, Manifest.permission.CALL_PHONE, Manifest.permission.READ_CONTACTS};
77+
78+
public static void swapFragmentIn(FragmentActivity activity, Fragment fragment, String TAG, boolean addToBackStack) {
79+
FragmentManager fragmentManager = activity.getSupportFragmentManager();
80+
// Insert the fragment by replacing any existing fragment
81+
FRAGMENT_TAG = TAG;
82+
int animEnter = R.anim.push_down_in;
83+
int animExit = R.anim.push_down_out;
84+
int animPopEnter = R.anim.fade_in;
85+
int animPopExit = R.anim.fade_out;
86+
87+
if (addToBackStack) {
88+
if (TAG.equals(ContactOtherStaff.TAG)) {
89+
animEnter = R.anim.fade_in;
90+
animExit = R.anim.fade_out;
91+
animPopEnter = R.anim.fade_in_back;
92+
animPopExit = R.anim.fade_out_back;
93+
}
94+
fragmentManager.beginTransaction()
95+
.setCustomAnimations(animEnter, animExit, animPopEnter, animPopExit)
96+
.replace(R.id.fragment_container
97+
, fragment, TAG)
98+
.addToBackStack(TAG)
99+
.commit();
100+
} else {
101+
animEnter = R.anim.fade_in;
102+
animExit = R.anim.fade_out;
103+
fragmentManager.beginTransaction()
104+
.setCustomAnimations(animEnter, animExit, animPopEnter, animPopExit)
105+
.replace(R.id.fragment_container
106+
, fragment, TAG)
107+
.commit();
108+
}
109+
}
66110

67111
@Override
68112
protected void onCreate(Bundle savedInstanceState) {
69113
super.onCreate(savedInstanceState);
70114
setContentView(R.layout.activity_main);
71-
if(savedInstanceState != null)
72-
{
115+
if (savedInstanceState != null) {
73116
/*
74117
* Check if instance of the required fragment is available
75118
* in the backstack and swap it into the container
76119
*/
77120
Fragment unknownFragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);
78-
if(unknownFragment != null){
79-
MainActivity.swapFragmentIn(this,unknownFragment,FRAGMENT_TAG,false);
121+
if (unknownFragment != null) {
122+
MainActivity.swapFragmentIn(this, unknownFragment, FRAGMENT_TAG, false);
80123
}
81-
}
82-
else
83-
{
124+
} else {
84125
Fragment mainActivityFragment = new MainActivityFragment();
85-
swapFragmentIn(this,mainActivityFragment,MainActivityFragment.TAG,false);
126+
swapFragmentIn(this, mainActivityFragment, MainActivityFragment.TAG, false);
86127
}
87128
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
88-
toolbar = (Toolbar)findViewById(R.id.toolbar);
129+
toolbar = (Toolbar) findViewById(R.id.toolbar);
89130
setSupportActionBar(toolbar);
90-
mDrawer = (DrawerLayout)findViewById(R.id.drawer_layout);
131+
mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
91132
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
92133
this, mDrawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
93134
mDrawer.setDrawerListener(toggle);
@@ -261,50 +302,16 @@ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition
261302
});
262303
}
263304

264-
public static void swapFragmentIn(FragmentActivity activity, Fragment fragment, String TAG, boolean addToBackStack)
265-
{
266-
FragmentManager fragmentManager = activity.getSupportFragmentManager();
267-
// Insert the fragment by replacing any existing fragment
268-
FRAGMENT_TAG = TAG;
269-
int animEnter = R.anim.push_down_in;
270-
int animExit = R.anim.push_down_out;
271-
int animPopEnter = R.anim.fade_in;
272-
int animPopExit = R.anim.fade_out;
273-
274-
if(addToBackStack){
275-
if (TAG.equals(ContactOtherStaff.TAG)) {
276-
animEnter = R.anim.fade_in;
277-
animExit = R.anim.fade_out;
278-
animPopEnter = R.anim.fade_in_back;
279-
animPopExit = R.anim.fade_out_back;
280-
}
281-
fragmentManager.beginTransaction()
282-
.setCustomAnimations(animEnter, animExit, animPopEnter, animPopExit)
283-
.replace(R.id.fragment_container
284-
, fragment,TAG)
285-
.addToBackStack(TAG)
286-
.commit();
287-
} else {
288-
animEnter = R.anim.fade_in;
289-
animExit = R.anim.fade_out;
290-
fragmentManager.beginTransaction()
291-
.setCustomAnimations(animEnter, animExit, animPopEnter, animPopExit)
292-
.replace(R.id.fragment_container
293-
, fragment,TAG)
294-
.commit();
295-
}
296-
}
297-
298305
/**
299306
* Populating the expandable list of the Navigation Drawer
300307
*/
301308
private void prepareListData() {
302309

303310
listDataChild = new HashMap<String, List<String>>();
304311
listDataHeader = new LinkedList<>(Arrays.asList(getResources().getStringArray(R.array.headers)));
305-
String userName = sharedPreferences.getString(getString(R.string.key_name),"");
306-
String lastElement = listDataHeader.get(listDataHeader.size()-1) + " " + userName.trim();
307-
listDataHeader.remove(listDataHeader.size()-1);
312+
String userName = sharedPreferences.getString(getString(R.string.key_name), "");
313+
String lastElement = listDataHeader.get(listDataHeader.size() - 1) + " " + userName.trim();
314+
listDataHeader.remove(listDataHeader.size() - 1);
308315
listDataHeader.add(lastElement);
309316

310317
List<String> getHelpNow = new ArrayList<>();
@@ -339,20 +346,19 @@ public void onBackPressed() {
339346
@Override
340347
protected void onPause() {
341348
super.onPause();
342-
overridePendingTransition(R.anim.fade_in,R.anim.fade_out);
343-
try{
349+
overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
350+
try {
344351
unregisterReceiver(CircleOfTrustFragment.sentReceiver);
345-
}catch (IllegalArgumentException e){
346-
Log.e(TAG,"Not registered");
352+
} catch (IllegalArgumentException e) {
353+
Log.e(TAG, "Not registered");
347354
}
348355
}
349356

350357
@Override
351358
protected void onResume() {
352359
super.onResume();
353360
registerReceiver(CircleOfTrustFragment.sentReceiver, new IntentFilter(CircleOfTrustFragment.SENT));
354-
if(refreshList)
355-
{
361+
if (refreshList) {
356362
refreshList = false;
357363
prepareListData();
358364
listAdapter = new NavDrawerListAdapter(this, listDataHeader, listDataChild);
@@ -377,4 +383,90 @@ public boolean onOptionsItemSelected(MenuItem item) {
377383
}
378384
return true;
379385
}
386+
387+
@Override
388+
protected void onStart() {
389+
super.onStart();
390+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
391+
requestRunTimePermissions();
392+
}
393+
}
394+
395+
@RequiresApi(23)
396+
@Override
397+
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
398+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
399+
if (requestCode == PERMISSION_CALLBACK) {
400+
boolean showRationale = false;
401+
for (int i = 0, len = permissions.length; i < len; i++) {
402+
if (grantResults[i] == PackageManager.PERMISSION_DENIED) {
403+
showRationale = showRationale || shouldShowRequestPermissionRationale(permissions[i]);
404+
}
405+
}
406+
if (showRationale) {
407+
requestPermissions(permissions, PERMISSION_CALLBACK);
408+
} else if (!areAllRunTimePermissionsGranted(permissions)) {
409+
AlertDialog.Builder builder = new AlertDialog.Builder(this);
410+
builder.setCancelable(false);
411+
builder.setTitle(getString(R.string.permission_dialog_title));
412+
builder.setMessage(getString(R.string.permission_dialog_message));
413+
builder.setPositiveButton(getString(R.string.permission_dialog_positive_button), new DialogInterface.OnClickListener() {
414+
@Override
415+
public void onClick(DialogInterface dialog, int which) {
416+
dialog.cancel();
417+
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
418+
Uri uri = Uri.fromParts("package", getPackageName(), null);
419+
intent.setData(uri);
420+
startActivityForResult(intent, PERMISSION_SETTINGS);
421+
}
422+
});
423+
builder.setNegativeButton(getString(R.string.permission_dialog_negative_button), new DialogInterface.OnClickListener() {
424+
@Override
425+
public void onClick(DialogInterface dialog, int which) {
426+
dialog.cancel();
427+
finish();
428+
}
429+
});
430+
builder.show();
431+
}
432+
}
433+
}
434+
435+
@Override
436+
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
437+
super.onActivityResult(requestCode, resultCode, data);
438+
if (requestCode == PERMISSION_SETTINGS) {
439+
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
440+
if (!areAllRunTimePermissionsGranted(runTimePermissions)) {
441+
Toast.makeText(this, getString(R.string.permission_toast), Toast.LENGTH_SHORT).show();
442+
finish();
443+
}
444+
}
445+
}
446+
}
447+
448+
/**
449+
* Requests run time permissions.
450+
*/
451+
@RequiresApi(23)
452+
private void requestRunTimePermissions() {
453+
if (!areAllRunTimePermissionsGranted(runTimePermissions)) {
454+
requestPermissions(runTimePermissions, PERMISSION_CALLBACK);
455+
}
456+
}
457+
458+
/**
459+
* Checks if all the run time permissions are granted.
460+
*
461+
* @param permissions required permissions.
462+
* @return true if all permissions are granted.
463+
*/
464+
@RequiresApi(23)
465+
private boolean areAllRunTimePermissionsGranted(String[] permissions) {
466+
boolean allPermissionsGranted = true;
467+
for (String permission : permissions) {
468+
allPermissionsGranted = allPermissionsGranted && checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
469+
}
470+
return allPermissionsGranted;
471+
}
380472
}

app/src/main/java/com/peacecorps/pcsa/circle_of_trust/LocationHelper.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public void onProviderDisabled(String provider) {
6363
Log.e(TAG, "Unable to listen to GPS location updates", e);
6464
} catch (NullPointerException e) {
6565
Log.e(TAG, "Unable to get location services", e);
66+
} catch (SecurityException e) {
67+
Log.e(TAG, "No permission for location", e);
6668
}
6769
}
6870
}
@@ -74,7 +76,11 @@ public void onProviderDisabled(String provider) {
7476
public void stopAcquiringLocation() {
7577
if (locationManager != null && locationListener != null) {
7678
// Remove the listener which added by calling #startAcquiringLocation
77-
locationManager.removeUpdates(locationListener);
79+
try {
80+
locationManager.removeUpdates(locationListener);
81+
} catch (SecurityException e) {
82+
Log.e(TAG, "No permission for location", e);
83+
}
7884
}
7985
}
8086

@@ -86,7 +92,11 @@ public void stopAcquiringLocation() {
8692
*/
8793
public Location retrieveLocation(boolean needLastKnown) {
8894
if (lastLocation == null && locationManager != null && needLastKnown) {
89-
lastLocation = locationManager.getLastKnownLocation(LOCATION_PROVIDER);
95+
try {
96+
lastLocation = locationManager.getLastKnownLocation(LOCATION_PROVIDER);
97+
} catch (SecurityException e) {
98+
Log.e(TAG, "No permission for location", e);
99+
}
90100
}
91101
return lastLocation;
92102
}

app/src/main/res/values/strings.xml

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
<!--Common-->
55
<string name="dialog_call">Voice Call</string>
66
<string name="dialog_message">Send Message</string>
7+
<string name="permission_dialog_negative_button">Close App</string>
8+
<string name="permission_dialog_message">This Application Needs Multiple Permissions in order to work correctly.</string>
9+
<string name="permission_dialog_positive_button">Open Settings</string>
10+
<string name="permission_dialog_title">Need Permissions</string>
11+
<string name="permission_toast">Permissions Not Granted</string>
712

813
<!--Activity Titles-->
914
<string name="title_activity_faq">Frequently Asked Questions</string>

0 commit comments

Comments
 (0)