/*
* Copyright (C) 2013 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.geofence;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
/**
* Storage for geofence values, implemented in SharedPreferences.
* For a production app, use a content provider that's synced to the
* web or loads geofence data based on current location.
*/
public class SimpleGeofenceStore {
// The SharedPreferences object in which geofences are stored
private final SharedPreferences mPrefs;
// The name of the resulting SharedPreferences
private static final String SHARED_PREFERENCE_NAME =
MainActivity.class.getSimpleName();
// Create the SharedPreferences storage with private access only
public SimpleGeofenceStore(Context context) {
mPrefs =
context.getSharedPreferences(
SHARED_PREFERENCE_NAME,
Context.MODE_PRIVATE);
}
/**
* Returns a stored geofence by its id, or returns {@code null}
* if it's not found.
*
* @param id The ID of a stored geofence
* @return A geofence defined by its center and radius. See
* {@link SimpleGeofence}
*/
public SimpleGeofence getGeofence(String id) {
/*
* Get the latitude for the geofence identified by id, or GeofenceUtils.INVALID_VALUE
* if it doesn't exist
*/
double lat = mPrefs.getFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_LATITUDE),
GeofenceUtils.INVALID_FLOAT_VALUE);
/*
* Get the longitude for the geofence identified by id, or
* -999 if it doesn't exist
*/
double lng = mPrefs.getFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_LONGITUDE),
GeofenceUtils.INVALID_FLOAT_VALUE);
/*
* Get the radius for the geofence identified by id, or GeofenceUtils.INVALID_VALUE
* if it doesn't exist
*/
float radius = mPrefs.getFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_RADIUS),
GeofenceUtils.INVALID_FLOAT_VALUE);
/*
* Get the expiration duration for the geofence identified by
* id, or GeofenceUtils.INVALID_VALUE if it doesn't exist
*/
long expirationDuration = mPrefs.getLong(
getGeofenceFieldKey(id, GeofenceUtils.KEY_EXPIRATION_DURATION),
GeofenceUtils.INVALID_LONG_VALUE);
/*
* Get the transition type for the geofence identified by
* id, or GeofenceUtils.INVALID_VALUE if it doesn't exist
*/
int transitionType = mPrefs.getInt(
getGeofenceFieldKey(id, GeofenceUtils.KEY_TRANSITION_TYPE),
GeofenceUtils.INVALID_INT_VALUE);
// If none of the values is incorrect, return the object
if (
lat != GeofenceUtils.INVALID_FLOAT_VALUE &&
lng != GeofenceUtils.INVALID_FLOAT_VALUE &&
radius != GeofenceUtils.INVALID_FLOAT_VALUE &&
expirationDuration != GeofenceUtils.INVALID_LONG_VALUE &&
transitionType != GeofenceUtils.INVALID_INT_VALUE) {
// Return a true Geofence object
return new SimpleGeofence(id, lat, lng, radius, expirationDuration, transitionType);
// Otherwise, return null.
} else {
return null;
}
}
/**
* Save a geofence.
* @param geofence The {@link SimpleGeofence} containing 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
*/
Editor editor = mPrefs.edit();
// Write the Geofence values to SharedPreferences
editor.putFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_LATITUDE),
(float) geofence.getLatitude());
editor.putFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_LONGITUDE),
(float) geofence.getLongitude());
editor.putFloat(
getGeofenceFieldKey(id, GeofenceUtils.KEY_RADIUS),
geofence.getRadius());
editor.putLong(
getGeofenceFieldKey(id, GeofenceUtils.KEY_EXPIRATION_DURATION),
geofence.getExpirationDuration());
editor.putInt(
getGeofenceFieldKey(id, GeofenceUtils.KEY_TRANSITION_TYPE),
geofence.getTransitionType());
// Commit the changes
editor.commit();
}
public void clearGeofence(String id) {
// Remove a flattened geofence object from storage by removing all of its keys
Editor editor = mPrefs.edit();
editor.remove(getGeofenceFieldKey(id, GeofenceUtils.KEY_LATITUDE));
editor.remove(getGeofenceFieldKey(id, GeofenceUtils.KEY_LONGITUDE));
editor.remove(getGeofenceFieldKey(id, GeofenceUtils.KEY_RADIUS));
editor.remove(getGeofenceFieldKey(id, GeofenceUtils.KEY_EXPIRATION_DURATION));
editor.remove(getGeofenceFieldKey(id, GeofenceUtils.KEY_TRANSITION_TYPE));
editor.commit();
}
/**
* Given a Geofence object's ID and the name of a field
* (for example, GeofenceUtils.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
GeofenceUtils.KEY_PREFIX +
id +
"_" +
fieldName;
}
}