| /* |
| * Copyright 2015 Google Inc. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.xyztouristattractions.ui; |
| |
| import android.Manifest; |
| import android.content.pm.PackageManager; |
| import android.os.Bundle; |
| import android.support.design.widget.Snackbar; |
| import android.support.v4.app.ActivityCompat; |
| import android.support.v7.app.AlertDialog; |
| import android.support.v7.app.AppCompatActivity; |
| import android.view.Menu; |
| import android.view.MenuItem; |
| import android.view.View; |
| import android.widget.Toast; |
| |
| import com.example.android.xyztouristattractions.R; |
| import com.example.android.xyztouristattractions.common.Utils; |
| import com.example.android.xyztouristattractions.service.UtilityService; |
| |
| /** |
| * The main tourist attraction activity screen which contains a list of |
| * attractions sorted by distance. |
| */ |
| public class AttractionListActivity extends AppCompatActivity implements |
| ActivityCompat.OnRequestPermissionsResultCallback { |
| |
| private static final int PERMISSION_REQ = 0; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| |
| if (savedInstanceState == null) { |
| getSupportFragmentManager().beginTransaction() |
| .add(R.id.container, new AttractionListFragment()) |
| .commit(); |
| } |
| |
| // Check fine location permission has been granted |
| if (!Utils.checkFineLocationPermission(this)) { |
| // See if user has denied permission in the past |
| if (ActivityCompat.shouldShowRequestPermissionRationale( |
| this, Manifest.permission.ACCESS_FINE_LOCATION)) { |
| // Show a simple snackbar explaining the request instead |
| showPermissionSnackbar(); |
| } else { |
| // Otherwise request permission from user |
| if (savedInstanceState == null) { |
| requestFineLocationPermission(); |
| } |
| } |
| } else { |
| // Otherwise permission is granted (which is always the case on pre-M devices) |
| fineLocationPermissionGranted(); |
| } |
| } |
| |
| @Override |
| protected void onResume() { |
| super.onResume(); |
| UtilityService.requestLocation(this); |
| } |
| |
| @Override |
| public boolean onCreateOptionsMenu(Menu menu) { |
| // Inflate the menu; this adds items to the action bar if it is present. |
| getMenuInflater().inflate(R.menu.main, menu); |
| return true; |
| } |
| |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| // Handle action bar item clicks here. The action bar will |
| // automatically handle clicks on the Home/Up button, so long |
| // as you specify a parent activity in AndroidManifest.xml. |
| switch (item.getItemId()) { |
| case R.id.test_notification: |
| UtilityService.triggerWearTest(this, false); |
| showDebugDialog(R.string.action_test_notification, |
| R.string.action_test_notification_dialog); |
| return true; |
| case R.id.test_microapp: |
| UtilityService.triggerWearTest(this, true); |
| showDebugDialog(R.string.action_test_microapp, |
| R.string.action_test_microapp_dialog); |
| return true; |
| case R.id.test_toggle_geofence: |
| boolean geofenceEnabled = Utils.getGeofenceEnabled(this); |
| Utils.storeGeofenceEnabled(this, !geofenceEnabled); |
| Toast.makeText(this, geofenceEnabled ? |
| "Debug: Geofencing trigger disabled" : |
| "Debug: Geofencing trigger enabled", Toast.LENGTH_SHORT).show(); |
| return true; |
| } |
| return super.onOptionsItemSelected(item); |
| } |
| |
| /** |
| * Permissions request result callback |
| */ |
| @Override |
| public void onRequestPermissionsResult( |
| int requestCode, String[] permissions, int[] grantResults) { |
| switch (requestCode) { |
| case PERMISSION_REQ: |
| if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { |
| fineLocationPermissionGranted(); |
| } |
| } |
| } |
| |
| /** |
| * Request the fine location permission from the user |
| */ |
| private void requestFineLocationPermission() { |
| ActivityCompat.requestPermissions(this, |
| new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQ); |
| } |
| |
| /** |
| * Run when fine location permission has been granted |
| */ |
| private void fineLocationPermissionGranted() { |
| UtilityService.addGeofences(this); |
| UtilityService.requestLocation(this); |
| } |
| |
| /** |
| * Show a permission explanation snackbar |
| */ |
| private void showPermissionSnackbar() { |
| Snackbar.make( |
| findViewById(R.id.container), R.string.permission_explanation, Snackbar.LENGTH_LONG) |
| .setAction(R.string.permission_explanation_action, new View.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| requestFineLocationPermission(); |
| } |
| }) |
| .show(); |
| } |
| |
| /** |
| * Show a basic debug dialog to provide more info on the built-in debug |
| * options. |
| */ |
| private void showDebugDialog(int titleResId, int bodyResId) { |
| AlertDialog.Builder builder = new AlertDialog.Builder(this) |
| .setTitle(titleResId) |
| .setMessage(bodyResId) |
| .setPositiveButton(android.R.string.ok, null); |
| builder.create().show(); |
| } |
| } |