Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright 2015 Google Inc. All rights reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.xyztouristattractions.ui;
     18 
     19 import android.Manifest;
     20 import android.content.pm.PackageManager;
     21 import android.os.Bundle;
     22 import android.support.design.widget.Snackbar;
     23 import android.support.v4.app.ActivityCompat;
     24 import android.support.v7.app.AlertDialog;
     25 import android.support.v7.app.AppCompatActivity;
     26 import android.view.Menu;
     27 import android.view.MenuItem;
     28 import android.view.View;
     29 import android.widget.Toast;
     30 
     31 import com.example.android.xyztouristattractions.R;
     32 import com.example.android.xyztouristattractions.common.Utils;
     33 import com.example.android.xyztouristattractions.service.UtilityService;
     34 
     35 /**
     36  * The main tourist attraction activity screen which contains a list of
     37  * attractions sorted by distance.
     38  */
     39 public class AttractionListActivity extends AppCompatActivity implements
     40         ActivityCompat.OnRequestPermissionsResultCallback {
     41 
     42     private static final int PERMISSION_REQ = 0;
     43 
     44     @Override
     45     protected void onCreate(Bundle savedInstanceState) {
     46         super.onCreate(savedInstanceState);
     47         setContentView(R.layout.activity_main);
     48 
     49         if (savedInstanceState == null) {
     50             getSupportFragmentManager().beginTransaction()
     51                     .add(R.id.container, new AttractionListFragment())
     52                     .commit();
     53         }
     54 
     55         // Check fine location permission has been granted
     56         if (!Utils.checkFineLocationPermission(this)) {
     57             // See if user has denied permission in the past
     58             if (ActivityCompat.shouldShowRequestPermissionRationale(
     59                     this, Manifest.permission.ACCESS_FINE_LOCATION)) {
     60                 // Show a simple snackbar explaining the request instead
     61                 showPermissionSnackbar();
     62             } else {
     63                 // Otherwise request permission from user
     64                 if (savedInstanceState == null) {
     65                     requestFineLocationPermission();
     66                 }
     67             }
     68         } else {
     69             // Otherwise permission is granted (which is always the case on pre-M devices)
     70             fineLocationPermissionGranted();
     71         }
     72     }
     73 
     74     @Override
     75     protected void onResume() {
     76         super.onResume();
     77         UtilityService.requestLocation(this);
     78     }
     79 
     80     @Override
     81     public boolean onCreateOptionsMenu(Menu menu) {
     82         // Inflate the menu; this adds items to the action bar if it is present.
     83         getMenuInflater().inflate(R.menu.main, menu);
     84         return true;
     85     }
     86 
     87     @Override
     88     public boolean onOptionsItemSelected(MenuItem item) {
     89         // Handle action bar item clicks here. The action bar will
     90         // automatically handle clicks on the Home/Up button, so long
     91         // as you specify a parent activity in AndroidManifest.xml.
     92         switch (item.getItemId()) {
     93             case R.id.test_notification:
     94                 UtilityService.triggerWearTest(this, false);
     95                 showDebugDialog(R.string.action_test_notification,
     96                         R.string.action_test_notification_dialog);
     97                 return true;
     98             case R.id.test_microapp:
     99                 UtilityService.triggerWearTest(this, true);
    100                 showDebugDialog(R.string.action_test_microapp,
    101                         R.string.action_test_microapp_dialog);
    102                 return true;
    103             case R.id.test_toggle_geofence:
    104                 boolean geofenceEnabled = Utils.getGeofenceEnabled(this);
    105                 Utils.storeGeofenceEnabled(this, !geofenceEnabled);
    106                 Toast.makeText(this, geofenceEnabled ?
    107                         "Debug: Geofencing trigger disabled" :
    108                         "Debug: Geofencing trigger enabled", Toast.LENGTH_SHORT).show();
    109                 return true;
    110         }
    111         return super.onOptionsItemSelected(item);
    112     }
    113 
    114     /**
    115      * Permissions request result callback
    116      */
    117     @Override
    118     public void onRequestPermissionsResult(
    119             int requestCode, String[] permissions, int[] grantResults) {
    120         switch (requestCode) {
    121             case PERMISSION_REQ:
    122                 if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    123                     fineLocationPermissionGranted();
    124                 }
    125         }
    126     }
    127 
    128     /**
    129      * Request the fine location permission from the user
    130      */
    131     private void requestFineLocationPermission() {
    132         ActivityCompat.requestPermissions(this,
    133                 new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQ);
    134     }
    135 
    136     /**
    137      * Run when fine location permission has been granted
    138      */
    139     private void fineLocationPermissionGranted() {
    140         UtilityService.addGeofences(this);
    141         UtilityService.requestLocation(this);
    142     }
    143 
    144     /**
    145      * Show a permission explanation snackbar
    146      */
    147     private void showPermissionSnackbar() {
    148         Snackbar.make(
    149                 findViewById(R.id.container), R.string.permission_explanation, Snackbar.LENGTH_LONG)
    150                 .setAction(R.string.permission_explanation_action, new View.OnClickListener() {
    151                     @Override
    152                     public void onClick(View v) {
    153                         requestFineLocationPermission();
    154                     }
    155                 })
    156                 .show();
    157     }
    158 
    159     /**
    160      * Show a basic debug dialog to provide more info on the built-in debug
    161      * options.
    162      */
    163     private void showDebugDialog(int titleResId, int bodyResId) {
    164         AlertDialog.Builder builder = new AlertDialog.Builder(this)
    165                 .setTitle(titleResId)
    166                 .setMessage(bodyResId)
    167                 .setPositiveButton(android.R.string.ok, null);
    168         builder.create().show();
    169     }
    170 }
    171