1
1
package com .peacecorps .pcsa ;
2
2
3
+ import android .Manifest ;
4
+ import android .content .DialogInterface ;
3
5
import android .content .Intent ;
4
6
import android .content .IntentFilter ;
5
7
import android .content .SharedPreferences ;
8
+ import android .content .pm .PackageManager ;
9
+ import android .net .Uri ;
10
+ import android .os .Build ;
6
11
import android .os .Bundle ;
7
12
import android .preference .PreferenceManager ;
13
+ import android .provider .Settings ;
14
+ import android .support .annotation .NonNull ;
15
+ import android .support .annotation .RequiresApi ;
8
16
import android .support .v4 .app .Fragment ;
9
17
import android .support .v4 .app .FragmentActivity ;
10
18
import android .support .v4 .app .FragmentManager ;
11
19
import android .support .v4 .view .GravityCompat ;
12
20
import android .support .v4 .widget .DrawerLayout ;
13
21
import android .support .v7 .app .ActionBarDrawerToggle ;
22
+ import android .support .v7 .app .AlertDialog ;
14
23
import android .support .v7 .app .AppCompatActivity ;
15
24
import android .support .v7 .widget .Toolbar ;
16
25
import android .util .Log ;
40
49
import com .peacecorps .pcsa .support_services .ConfidentialityFragment ;
41
50
import com .peacecorps .pcsa .support_services .MythbustersFragment ;
42
51
43
- import java .lang .reflect .Array ;
44
52
import java .util .ArrayList ;
45
53
import java .util .Arrays ;
46
54
import java .util .HashMap ;
50
58
51
59
public class MainActivity extends AppCompatActivity {
52
60
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 ;
53
67
private Toolbar toolbar ;
54
68
private DrawerLayout mDrawer ;
55
69
private NavDrawerListAdapter listAdapter ;
56
70
private ExpandableListView expListView ;
57
71
private List <String > listDataHeader ;
58
- public static boolean refreshList = false ;
59
72
private HashMap <String , List <String >> listDataChild ;
60
- private static final String TAG = MainActivity .class .getSimpleName ();
61
- public static String FRAGMENT_TAG = MainActivityFragment .TAG ;
62
73
private FragmentManager fragmentManager = getSupportFragmentManager ();
63
- SharedPreferences sharedPreferences ;
64
- private int lastExpandedGroup =-1 ;
74
+ private int lastExpandedGroup = -1 ;
65
75
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
+ }
66
110
67
111
@ Override
68
112
protected void onCreate (Bundle savedInstanceState ) {
69
113
super .onCreate (savedInstanceState );
70
114
setContentView (R .layout .activity_main );
71
- if (savedInstanceState != null )
72
- {
115
+ if (savedInstanceState != null ) {
73
116
/*
74
117
* Check if instance of the required fragment is available
75
118
* in the backstack and swap it into the container
76
119
*/
77
120
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 );
80
123
}
81
- }
82
- else
83
- {
124
+ } else {
84
125
Fragment mainActivityFragment = new MainActivityFragment ();
85
- swapFragmentIn (this ,mainActivityFragment ,MainActivityFragment .TAG ,false );
126
+ swapFragmentIn (this , mainActivityFragment , MainActivityFragment .TAG , false );
86
127
}
87
128
sharedPreferences = PreferenceManager .getDefaultSharedPreferences (this );
88
- toolbar = (Toolbar )findViewById (R .id .toolbar );
129
+ toolbar = (Toolbar ) findViewById (R .id .toolbar );
89
130
setSupportActionBar (toolbar );
90
- mDrawer = (DrawerLayout )findViewById (R .id .drawer_layout );
131
+ mDrawer = (DrawerLayout ) findViewById (R .id .drawer_layout );
91
132
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle (
92
133
this , mDrawer , toolbar , R .string .navigation_drawer_open , R .string .navigation_drawer_close );
93
134
mDrawer .setDrawerListener (toggle );
@@ -261,50 +302,16 @@ public boolean onChildClick(ExpandableListView parent, View v, int groupPosition
261
302
});
262
303
}
263
304
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
-
298
305
/**
299
306
* Populating the expandable list of the Navigation Drawer
300
307
*/
301
308
private void prepareListData () {
302
309
303
310
listDataChild = new HashMap <String , List <String >>();
304
311
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 );
308
315
listDataHeader .add (lastElement );
309
316
310
317
List <String > getHelpNow = new ArrayList <>();
@@ -339,20 +346,19 @@ public void onBackPressed() {
339
346
@ Override
340
347
protected void onPause () {
341
348
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 {
344
351
unregisterReceiver (CircleOfTrustFragment .sentReceiver );
345
- }catch (IllegalArgumentException e ){
346
- Log .e (TAG ,"Not registered" );
352
+ } catch (IllegalArgumentException e ) {
353
+ Log .e (TAG , "Not registered" );
347
354
}
348
355
}
349
356
350
357
@ Override
351
358
protected void onResume () {
352
359
super .onResume ();
353
360
registerReceiver (CircleOfTrustFragment .sentReceiver , new IntentFilter (CircleOfTrustFragment .SENT ));
354
- if (refreshList )
355
- {
361
+ if (refreshList ) {
356
362
refreshList = false ;
357
363
prepareListData ();
358
364
listAdapter = new NavDrawerListAdapter (this , listDataHeader , listDataChild );
@@ -377,4 +383,90 @@ public boolean onOptionsItemSelected(MenuItem item) {
377
383
}
378
384
return true ;
379
385
}
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
+ }
380
472
}
0 commit comments