[go: nahoru, domu]

Skip to content

Commit

Permalink
chore: Add MyLocationDemoActivity in Kotlin (#239)
Browse files Browse the repository at this point in the history
Includes region tags for:
* maps_check_location_permission_result
* maps_check_location_permission

Also adds PermissionUtils in Kotlin

Also apply following changes to Java version:
* Refactor variables to remove Hungarian notation

Also remove redundant schema from layout
  • Loading branch information
barbeau committed Jun 3, 2020
1 parent b27512a commit a6d24c6
Show file tree
Hide file tree
Showing 9 changed files with 372 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ public class MyLocationDemoActivity extends AppCompatActivity
* Flag indicating whether a requested permission has been denied after returning in
* {@link #onRequestPermissionsResult(int, String[], int[])}.
*/
private boolean mPermissionDenied = false;
private boolean permissionDenied = false;

private GoogleMap mMap;
private GoogleMap map;

@Override
protected void onCreate(Bundle savedInstanceState) {
Expand All @@ -71,11 +71,10 @@ protected void onCreate(Bundle savedInstanceState) {
}

@Override
public void onMapReady(GoogleMap map) {
mMap = map;

mMap.setOnMyLocationButtonClickListener(this);
mMap.setOnMyLocationClickListener(this);
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
map.setOnMyLocationButtonClickListener(this);
map.setOnMyLocationClickListener(this);
enableMyLocation();
}

Expand All @@ -86,8 +85,8 @@ private void enableMyLocation() {
// [START maps_check_location_permission]
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
if (mMap != null) {
mMap.setMyLocationEnabled(true);
if (map != null) {
map.setMyLocationEnabled(true);
}
} else {
// Permission to access the location is missing. Show rationale and request permission
Expand Down Expand Up @@ -124,7 +123,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
// Permission was denied. Display an error message
// [START_EXCLUDE]
// Display the missing permission error dialog when the fragments resume.
mPermissionDenied = true;
permissionDenied = true;
// [END_EXCLUDE]
}
}
Expand All @@ -133,10 +132,10 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if (mPermissionDenied) {
if (permissionDenied) {
// Permission was not granted, display error dialog.
showMissingPermissionError();
mPermissionDenied = false;
permissionDenied = false;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public static class PermissionDeniedDialog extends DialogFragment {

private static final String ARGUMENT_FINISH_ACTIVITY = "finish";

private boolean mFinishActivity = false;
private boolean finishActivity = false;

/**
* Creates a new instance of this dialog and optionally finishes the calling Activity
Expand All @@ -89,7 +89,7 @@ public static PermissionDeniedDialog newInstance(boolean finishActivity) {

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
mFinishActivity = getArguments().getBoolean(ARGUMENT_FINISH_ACTIVITY);
finishActivity = getArguments().getBoolean(ARGUMENT_FINISH_ACTIVITY);

return new AlertDialog.Builder(getActivity())
.setMessage(R.string.location_permission_denied)
Expand All @@ -100,7 +100,7 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (mFinishActivity) {
if (finishActivity) {
Toast.makeText(getActivity(), R.string.permission_required_toast,
Toast.LENGTH_SHORT).show();
getActivity().finish();
Expand All @@ -122,7 +122,7 @@ public static class RationaleDialog extends DialogFragment {

private static final String ARGUMENT_FINISH_ACTIVITY = "finish";

private boolean mFinishActivity = false;
private boolean finishActivity = false;

/**
* Creates a new instance of a dialog displaying the rationale for the use of the location
Expand All @@ -149,7 +149,7 @@ public static RationaleDialog newInstance(int requestCode, boolean finishActivit
public Dialog onCreateDialog(Bundle savedInstanceState) {
Bundle arguments = getArguments();
final int requestCode = arguments.getInt(ARGUMENT_PERMISSION_REQUEST_CODE);
mFinishActivity = arguments.getBoolean(ARGUMENT_FINISH_ACTIVITY);
finishActivity = arguments.getBoolean(ARGUMENT_FINISH_ACTIVITY);

return new AlertDialog.Builder(getActivity())
.setMessage(R.string.permission_rationale_location)
Expand All @@ -161,7 +161,7 @@ public void onClick(DialogInterface dialog, int which) {
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
requestCode);
// Do not finish the Activity while requesting permission.
mFinishActivity = false;
finishActivity = false;
}
})
.setNegativeButton(android.R.string.cancel, null)
Expand All @@ -171,7 +171,7 @@ public void onClick(DialogInterface dialog, int which) {
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
if (mFinishActivity) {
if (finishActivity) {
Toast.makeText(getActivity(),
R.string.permission_required_toast,
Toast.LENGTH_SHORT)
Expand Down
1 change: 0 additions & 1 deletion ApiDemos/java/app/src/gms/res/layout/my_location_demo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
<fragment
android:id="@+id/map"
class="com.google.android.gms.maps.SupportMapFragment"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class DemoDetailsList {
LiteListDemoActivity::class.java),
DemoDetails(R.string.markers_demo_label, R.string.markers_demo_description,
MarkerDemoActivity::class.java),
DemoDetails(R.string.my_location_demo_label, R.string.my_location_demo_details,
MyLocationDemoActivity::class.java),
DemoDetails(R.string.polygon_demo_label, R.string.polygon_demo_details,
PolygonDemoActivity::class.java),
DemoDetails(R.string.polyline_demo_label, R.string.polyline_demo_description,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
// Copyright 2020 Google LLC
//
// 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.kotlindemos

import android.Manifest
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat.OnRequestPermissionsResultCallback
import androidx.core.content.ContextCompat
import com.example.kotlindemos.PermissionUtils.PermissionDeniedDialog.Companion.newInstance
import com.example.kotlindemos.PermissionUtils.isPermissionGranted
import com.example.kotlindemos.PermissionUtils.requestPermission
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.GoogleMap.OnMyLocationButtonClickListener
import com.google.android.gms.maps.GoogleMap.OnMyLocationClickListener
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment

/**
* This demo shows how GMS Location can be used to check for changes to the users location. The
* "My Location" button uses GMS Location to set the blue dot representing the users location.
* Permission for [Manifest.permission.ACCESS_FINE_LOCATION] is requested at run
* time. If the permission has not been granted, the Activity is finished with an error message.
*/
class MyLocationDemoActivity : AppCompatActivity(), OnMyLocationButtonClickListener,
OnMyLocationClickListener, OnMapReadyCallback, OnRequestPermissionsResultCallback {
/**
* Flag indicating whether a requested permission has been denied after returning in
* [.onRequestPermissionsResult].
*/
private var permissionDenied = false
private lateinit var map: GoogleMap
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.my_location_demo)
val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment?
mapFragment?.getMapAsync(this)
}

override fun onMapReady(googleMap: GoogleMap?) {
map = googleMap ?: return
googleMap.setOnMyLocationButtonClickListener(this)
googleMap.setOnMyLocationClickListener(this)
enableMyLocation()
}

/**
* Enables the My Location layer if the fine location permission has been granted.
*/
private fun enableMyLocation() {
if (!::map.isInitialized) return
// [START maps_check_location_permission]
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
map.isMyLocationEnabled = true
} else {
// Permission to access the location is missing. Show rationale and request permission
requestPermission(this, LOCATION_PERMISSION_REQUEST_CODE,
Manifest.permission.ACCESS_FINE_LOCATION, true
)
}
// [END maps_check_location_permission]
}

override fun onMyLocationButtonClick(): Boolean {
Toast.makeText(this, "MyLocation button clicked", Toast.LENGTH_SHORT).show()
// Return false so that we don't consume the event and the default behavior still occurs
// (the camera animates to the user's current position).
return false
}

override fun onMyLocationClick(location: Location) {
Toast.makeText(this, "Current location:\n$location", Toast.LENGTH_LONG).show()
}

// [START maps_check_location_permission_result]
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
if (requestCode != LOCATION_PERMISSION_REQUEST_CODE) {
return
}
if (isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) {
// Enable the my location layer if the permission has been granted.
enableMyLocation()
} else {
// Permission was denied. Display an error message
// [START_EXCLUDE]
// Display the missing permission error dialog when the fragments resume.
permissionDenied = true
// [END_EXCLUDE]
}
}

// [END maps_check_location_permission_result]
override fun onResumeFragments() {
super.onResumeFragments()
if (permissionDenied) {
// Permission was not granted, display error dialog.
showMissingPermissionError()
permissionDenied = false
}
}

/**
* Displays a dialog with error message explaining that the location permission is missing.
*/
private fun showMissingPermissionError() {
newInstance(true).show(supportFragmentManager, "dialog")
}

companion object {
/**
* Request code for location permission request.
*
* @see .onRequestPermissionsResult
*/
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
}
}
Loading

0 comments on commit a6d24c6

Please sign in to comment.