11package com .peacecorps .pcsa ;
22
3+ import android .Manifest ;
4+ import android .content .DialogInterface ;
35import android .content .Intent ;
46import android .content .IntentFilter ;
57import android .content .SharedPreferences ;
8+ import android .content .pm .PackageManager ;
9+ import android .net .Uri ;
10+ import android .os .Build ;
611import android .os .Bundle ;
712import android .preference .PreferenceManager ;
13+ import android .provider .Settings ;
14+ import android .support .annotation .NonNull ;
15+ import android .support .annotation .RequiresApi ;
816import android .support .v4 .app .Fragment ;
917import android .support .v4 .app .FragmentActivity ;
1018import android .support .v4 .app .FragmentManager ;
1119import android .support .v4 .view .GravityCompat ;
1220import android .support .v4 .widget .DrawerLayout ;
1321import android .support .v7 .app .ActionBarDrawerToggle ;
22+ import android .support .v7 .app .AlertDialog ;
1423import android .support .v7 .app .AppCompatActivity ;
1524import android .support .v7 .widget .Toolbar ;
1625import android .util .Log ;
4049import com .peacecorps .pcsa .support_services .ConfidentialityFragment ;
4150import com .peacecorps .pcsa .support_services .MythbustersFragment ;
4251
43- import java .lang .reflect .Array ;
4452import java .util .ArrayList ;
4553import java .util .Arrays ;
4654import java .util .HashMap ;
5058
5159public 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}
0 commit comments