| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * 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.wearable.geofencing; |
| |
| import static com.example.android.wearable.geofencing.Constants.INVALID_FLOAT_VALUE; |
| import static com.example.android.wearable.geofencing.Constants.INVALID_INT_VALUE; |
| import static com.example.android.wearable.geofencing.Constants.INVALID_LONG_VALUE; |
| import static com.example.android.wearable.geofencing.Constants.KEY_EXPIRATION_DURATION; |
| import static com.example.android.wearable.geofencing.Constants.KEY_LATITUDE; |
| import static com.example.android.wearable.geofencing.Constants.KEY_LONGITUDE; |
| import static com.example.android.wearable.geofencing.Constants.KEY_PREFIX; |
| import static com.example.android.wearable.geofencing.Constants.KEY_RADIUS; |
| import static com.example.android.wearable.geofencing.Constants.KEY_TRANSITION_TYPE; |
| |
| import android.content.Context; |
| import android.content.SharedPreferences; |
| |
| /** |
| * Storage for geofence values, implemented in SharedPreferences. |
| */ |
| public class SimpleGeofenceStore { |
| |
| // The SharedPreferences object in which geofences are stored. |
| private final SharedPreferences mPrefs; |
| // The name of the SharedPreferences. |
| private static final String SHARED_PREFERENCES = "SharedPreferences"; |
| |
| /** |
| * Create the SharedPreferences storage with private access only. |
| */ |
| public SimpleGeofenceStore(Context context) { |
| mPrefs = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE); |
| } |
| |
| /** |
| * Returns a stored geofence by its id, or returns null if it's not found. |
| * @param id The ID of a stored geofence. |
| * @return A SimpleGeofence defined by its center and radius, or null if the ID is invalid. |
| */ |
| public SimpleGeofence getGeofence(String id) { |
| // Get the latitude for the geofence identified by id, or INVALID_FLOAT_VALUE if it doesn't |
| // exist (similarly for the other values that follow). |
| double lat = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_LATITUDE), |
| INVALID_FLOAT_VALUE); |
| double lng = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_LONGITUDE), |
| INVALID_FLOAT_VALUE); |
| float radius = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_RADIUS), |
| INVALID_FLOAT_VALUE); |
| long expirationDuration = |
| mPrefs.getLong(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION), |
| INVALID_LONG_VALUE); |
| int transitionType = mPrefs.getInt(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE), |
| INVALID_INT_VALUE); |
| // If none of the values is incorrect, return the object. |
| if (lat != INVALID_FLOAT_VALUE |
| && lng != INVALID_FLOAT_VALUE |
| && radius != INVALID_FLOAT_VALUE |
| && expirationDuration != INVALID_LONG_VALUE |
| && transitionType != INVALID_INT_VALUE) { |
| return new SimpleGeofence(id, lat, lng, radius, expirationDuration, transitionType); |
| } |
| // Otherwise, return null. |
| return null; |
| } |
| |
| /** |
| * Save a geofence. |
| * @param geofence The SimpleGeofence with the values you want to save in SharedPreferences. |
| */ |
| public void setGeofence(String id, SimpleGeofence geofence) { |
| // Get a SharedPreferences editor instance. Among other things, SharedPreferences |
| // ensures that updates are atomic and non-concurrent. |
| SharedPreferences.Editor prefs = mPrefs.edit(); |
| // Write the Geofence values to SharedPreferences. |
| prefs.putFloat(getGeofenceFieldKey(id, KEY_LATITUDE), (float) geofence.getLatitude()); |
| prefs.putFloat(getGeofenceFieldKey(id, KEY_LONGITUDE), (float) geofence.getLongitude()); |
| prefs.putFloat(getGeofenceFieldKey(id, KEY_RADIUS), geofence.getRadius()); |
| prefs.putLong(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION), |
| geofence.getExpirationDuration()); |
| prefs.putInt(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE), |
| geofence.getTransitionType()); |
| // Commit the changes. |
| prefs.commit(); |
| } |
| |
| /** |
| * Remove a flattened geofence object from storage by removing all of its keys. |
| */ |
| public void clearGeofence(String id) { |
| SharedPreferences.Editor prefs = mPrefs.edit(); |
| prefs.remove(getGeofenceFieldKey(id, KEY_LATITUDE)); |
| prefs.remove(getGeofenceFieldKey(id, KEY_LONGITUDE)); |
| prefs.remove(getGeofenceFieldKey(id, KEY_RADIUS)); |
| prefs.remove(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION)); |
| prefs.remove(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE)); |
| prefs.commit(); |
| } |
| |
| /** |
| * Given a Geofence object's ID and the name of a field (for example, KEY_LATITUDE), return |
| * the key name of the object's values in SharedPreferences. |
| * @param id The ID of a Geofence object. |
| * @param fieldName The field represented by the key. |
| * @return The full key name of a value in SharedPreferences. |
| */ |
| private String getGeofenceFieldKey(String id, String fieldName) { |
| return KEY_PREFIX + "_" + id + "_" + fieldName; |
| } |
| |
| } |