1 /*
2  * Copyright (C) 2015 The Android Open Source Project
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 package com.android.packageinstaller.permission.utils;
17 
18 import android.Manifest;
19 import android.app.AlertDialog;
20 import android.content.ActivityNotFoundException;
21 import android.content.Context;
22 import android.content.DialogInterface;
23 import android.content.DialogInterface.OnClickListener;
24 import android.content.Intent;
25 import android.location.LocationManager;
26 import android.provider.Settings;
27 import android.util.Log;
28 
29 import androidx.annotation.NonNull;
30 
31 import com.android.permissioncontroller.R;
32 
33 public class LocationUtils {
34 
35     public static final String LOCATION_PERMISSION = Manifest.permission_group.LOCATION;
36 
37     private static final String TAG = LocationUtils.class.getSimpleName();
38 
showLocationDialog(final Context context, CharSequence label)39     public static void showLocationDialog(final Context context, CharSequence label) {
40         new AlertDialog.Builder(context)
41                 .setIcon(R.drawable.ic_dialog_alert_material)
42                 .setTitle(android.R.string.dialog_alert_title)
43                 .setMessage(context.getString(R.string.location_warning, label))
44                 .setNegativeButton(R.string.ok, null)
45                 .setPositiveButton(R.string.location_settings, new OnClickListener() {
46                     @Override
47                     public void onClick(DialogInterface dialog, int which) {
48                         context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
49                     }
50                 })
51                 .show();
52     }
53 
54     /** Start the settings page for the location controller extra package. */
startLocationControllerExtraPackageSettings(@onNull Context context)55     public static void startLocationControllerExtraPackageSettings(@NonNull Context context) {
56         try {
57             context.startActivity(new Intent(
58                         Settings.ACTION_LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS));
59             return;
60         } catch (ActivityNotFoundException e) {
61             // In rare cases where location controller extra package is set, but
62             // no activity exists to handle the location controller extra package settings
63             // intent, log an error instead of crashing permission controller.
64             Log.e(TAG, "No activity to handle "
65                         + "android.settings.LOCATION_CONTROLLER_EXTRA_PACKAGE_SETTINGS");
66         }
67     }
68 
isLocationEnabled(Context context)69     public static boolean isLocationEnabled(Context context) {
70         return context.getSystemService(LocationManager.class).isLocationEnabled();
71     }
72 
isLocationGroupAndProvider(Context context, String groupName, String packageName)73     public static boolean isLocationGroupAndProvider(Context context, String groupName,
74             String packageName) {
75         return LOCATION_PERMISSION.equals(groupName)
76                 && context.getSystemService(LocationManager.class).isProviderPackage(packageName);
77     }
78 
isLocationGroupAndControllerExtraPackage(@onNull Context context, @NonNull String groupName, @NonNull String packageName)79     public static boolean isLocationGroupAndControllerExtraPackage(@NonNull Context context,
80             @NonNull String groupName, @NonNull String packageName) {
81         return LOCATION_PERMISSION.equals(groupName)
82                 && packageName.equals(context.getSystemService(LocationManager.class)
83                         .getExtraLocationControllerPackage());
84     }
85 
86     /** Returns whether the location controller extra package is enabled. */
isExtraLocationControllerPackageEnabled(Context context)87     public static boolean isExtraLocationControllerPackageEnabled(Context context) {
88         try {
89             return context.getSystemService(LocationManager.class)
90                     .isExtraLocationControllerPackageEnabled();
91         } catch (Exception e) {
92             return false;
93         }
94 
95     }
96 }
97