1 /*
2  * Copyright (C) 2014 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 
17 package com.example.android.wearable.geofencing;
18 
19 import static com.example.android.wearable.geofencing.Constants.INVALID_FLOAT_VALUE;
20 import static com.example.android.wearable.geofencing.Constants.INVALID_INT_VALUE;
21 import static com.example.android.wearable.geofencing.Constants.INVALID_LONG_VALUE;
22 import static com.example.android.wearable.geofencing.Constants.KEY_EXPIRATION_DURATION;
23 import static com.example.android.wearable.geofencing.Constants.KEY_LATITUDE;
24 import static com.example.android.wearable.geofencing.Constants.KEY_LONGITUDE;
25 import static com.example.android.wearable.geofencing.Constants.KEY_PREFIX;
26 import static com.example.android.wearable.geofencing.Constants.KEY_RADIUS;
27 import static com.example.android.wearable.geofencing.Constants.KEY_TRANSITION_TYPE;
28 
29 import android.content.Context;
30 import android.content.SharedPreferences;
31 
32 /**
33  * Storage for geofence values, implemented in SharedPreferences.
34  */
35 public class SimpleGeofenceStore {
36 
37     // The SharedPreferences object in which geofences are stored.
38     private final SharedPreferences mPrefs;
39     // The name of the SharedPreferences.
40     private static final String SHARED_PREFERENCES = "SharedPreferences";
41 
42     /**
43      * Create the SharedPreferences storage with private access only.
44      */
SimpleGeofenceStore(Context context)45     public SimpleGeofenceStore(Context context) {
46         mPrefs = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
47     }
48 
49     /**
50      * Returns a stored geofence by its id, or returns null if it's not found.
51      * @param id The ID of a stored geofence.
52      * @return A SimpleGeofence defined by its center and radius, or null if the ID is invalid.
53      */
getGeofence(String id)54     public SimpleGeofence getGeofence(String id) {
55         // Get the latitude for the geofence identified by id, or INVALID_FLOAT_VALUE if it doesn't
56         // exist (similarly for the other values that follow).
57         double lat = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_LATITUDE),
58                 INVALID_FLOAT_VALUE);
59         double lng = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_LONGITUDE),
60                 INVALID_FLOAT_VALUE);
61         float radius = mPrefs.getFloat(getGeofenceFieldKey(id, KEY_RADIUS),
62                 INVALID_FLOAT_VALUE);
63         long expirationDuration =
64                 mPrefs.getLong(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION),
65                         INVALID_LONG_VALUE);
66         int transitionType = mPrefs.getInt(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE),
67                 INVALID_INT_VALUE);
68         // If none of the values is incorrect, return the object.
69         if (lat != INVALID_FLOAT_VALUE
70                 && lng != INVALID_FLOAT_VALUE
71                 && radius != INVALID_FLOAT_VALUE
72                 && expirationDuration != INVALID_LONG_VALUE
73                 && transitionType != INVALID_INT_VALUE) {
74             return new SimpleGeofence(id, lat, lng, radius, expirationDuration, transitionType);
75         }
76         // Otherwise, return null.
77         return null;
78     }
79 
80     /**
81      * Save a geofence.
82      * @param geofence The SimpleGeofence with the values you want to save in SharedPreferences.
83      */
setGeofence(String id, SimpleGeofence geofence)84     public void setGeofence(String id, SimpleGeofence geofence) {
85         // Get a SharedPreferences editor instance. Among other things, SharedPreferences
86         // ensures that updates are atomic and non-concurrent.
87         SharedPreferences.Editor prefs = mPrefs.edit();
88         // Write the Geofence values to SharedPreferences.
89         prefs.putFloat(getGeofenceFieldKey(id, KEY_LATITUDE), (float) geofence.getLatitude());
90         prefs.putFloat(getGeofenceFieldKey(id, KEY_LONGITUDE), (float) geofence.getLongitude());
91         prefs.putFloat(getGeofenceFieldKey(id, KEY_RADIUS), geofence.getRadius());
92         prefs.putLong(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION),
93                 geofence.getExpirationDuration());
94         prefs.putInt(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE),
95                 geofence.getTransitionType());
96         // Commit the changes.
97         prefs.commit();
98     }
99 
100     /**
101      * Remove a flattened geofence object from storage by removing all of its keys.
102      */
clearGeofence(String id)103     public void clearGeofence(String id) {
104         SharedPreferences.Editor prefs = mPrefs.edit();
105         prefs.remove(getGeofenceFieldKey(id, KEY_LATITUDE));
106         prefs.remove(getGeofenceFieldKey(id, KEY_LONGITUDE));
107         prefs.remove(getGeofenceFieldKey(id, KEY_RADIUS));
108         prefs.remove(getGeofenceFieldKey(id, KEY_EXPIRATION_DURATION));
109         prefs.remove(getGeofenceFieldKey(id, KEY_TRANSITION_TYPE));
110         prefs.commit();
111     }
112 
113     /**
114      * Given a Geofence object's ID and the name of a field (for example, KEY_LATITUDE), return
115      * the key name of the object's values in SharedPreferences.
116      * @param id The ID of a Geofence object.
117      * @param fieldName The field represented by the key.
118      * @return The full key name of a value in SharedPreferences.
119      */
getGeofenceFieldKey(String id, String fieldName)120     private String getGeofenceFieldKey(String id, String fieldName) {
121         return KEY_PREFIX + "_" + id + "_" + fieldName;
122     }
123 
124 }
125