/*
* Copyright (c) 2016 Google Inc.
*
* 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.google.samples.apps.iosched.util;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import com.firebase.client.Firebase;
import com.google.samples.apps.iosched.BuildConfig;
import java.util.zip.CRC32;
import static com.google.samples.apps.iosched.util.LogUtils.LOGI;
import static com.google.samples.apps.iosched.util.LogUtils.makeLogTag;
/**
* Utility methods for setting up and interacting with a Firebase account associated with a user
* account. TODO: instead of passing Context, pass SharedPreferences to methods. See b/27809306.
*/
public class FirebaseUtils {
private static final String TAG = makeLogTag(AccountUtils.class);
// These names are are prefixes; the account is appended to them.
public static final String PREFIX_PREF_FIREBASE_UID = "firebase_uid_";
public static final String PREFIX_PREF_FIREBASE_URL = "firebase_url_";
// These names are used to build paths to Firebase child nodes.
public static final String FIREBASE_NODE_USERS = "users";
public static final String FIREBASE_NODE_DATA = "data";
public static final String FIREBASE_NODE_GCM_KEY = "gcm_key";
public static final String FIREBASE_NODE_VIEWED_VIDEOS = "viewed_videos";
public static final String FIREBASE_NODE_MY_SESSIONS = "my_sessions";
public static final String FIREBASE_NODE_IN_SCHEDULE = "in_schedule";
public static final String FIREBASE_NODE_TIMESTAMP = "timestamp";
public static final String FIREBASE_NODE_FEEDBACK_SUBMITTED_SESSIONS =
"feedback_submitted_sessions";
public static final String FIREBASE_NODE_LAST_ACTIVITY_TIMESTAMP = "last_activity_timestamp";
/**
* @param context Context used to lookup {@link SharedPreferences}.
* @return The user id (UID) generated by Firebase.
*/
@NonNull
public static String getFirebaseUid(final Context context) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getString(
AccountUtils.makeAccountSpecificPrefKey(context, PREFIX_PREF_FIREBASE_UID), "");
}
/**
* Stores the UID generated by Firebase in {@link SharedPreferences}.
*
* @param context Context used to lookup {@link SharedPreferences}.
* @param uid The user id (UID) generated by Firebase.
*/
public static void setFirebaseUid(final Context context, final String accountName,
final String uid) {
LOGI(TAG, "Saving Firebase UID for accountName " + accountName);
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().putString(
AccountUtils.makeAccountSpecificPrefKey(context, PREFIX_PREF_FIREBASE_UID),
uid).apply();
}
/**
* Retrieves the Firebase url associated with the current account stored in {@link
* SharedPreferences}.
*
* @param context Context used to lookup {@link SharedPreferences}.
* @param accountName The account name associated with the chosen user account.
* @return The Firebase UID associated with the current account.
*/
public static String getFirebaseUrl(Context context, String accountName) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
return sp.getString(
AccountUtils.makeAccountSpecificPrefKey(accountName,
PREFIX_PREF_FIREBASE_URL), "");
}
/**
* Calculates the Firebase url associated with an account id generated by calling {@link
* com.google.android.gms.auth.GoogleAuthUtil#getAccountId(Context, String)}.
*
* @param context Context used to lookup {@link SharedPreferences}.
* @param accountId The account ID associated with the currently chosen account.
*/
public static void setFirebaseUrl(Context context, String accountId) {
String[] firebaseUrls = BuildConfig.FIREBASE_URLS;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
CRC32 crc = new CRC32();
crc.update(accountId.getBytes());
int index = (int) (crc.getValue() % firebaseUrls.length);
LOGI(TAG, "Selected Firebase db # " + index);
sp.edit().putString(
AccountUtils.makeAccountSpecificPrefKey(context, PREFIX_PREF_FIREBASE_URL),
firebaseUrls[index]).apply();
}
/**
* Builds and returns the Firebase reference for storing the user data with the currently chosen
* account. TODO: a factory method should not be in a utils file. Remove. See b/27809307.
*/
@NonNull
public static Firebase getDataUIDRef(Context context, String accountName) {
return new Firebase(getFirebaseUrl(context, accountName))
.child(FIREBASE_NODE_DATA)
.child(FirebaseUtils.getFirebaseUid(context));
}
/**
* Returns the child path (relative to Firebase root) where all user data except the user's last
* activity timestamp is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
@NonNull
public static String getDataChildPath(String uid) {
return FIREBASE_NODE_DATA + "/" + uid + "/";
}
/**
* Returns the child path (relative to Firebase root) where the user's last activity timestamp
* is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
@NonNull
public static String getUsersChildPath(String uid) {
return FIREBASE_NODE_USERS + "/" + uid + "/";
}
/**
* Returns the child path (relative to Firebase root) where the gcm key is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
public static String getGcmKeyChildPath(String uid) {
return getDataChildPath(uid) + FIREBASE_NODE_GCM_KEY + "/";
}
/**
* Returns the child path (relative to Firebase root) where the user's last activity timestamp
* is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
public static String getLastActivityTimestampChildPath(String uid) {
return getUsersChildPath(uid) + FIREBASE_NODE_LAST_ACTIVITY_TIMESTAMP + "/";
}
/**
* Returns the Firebase child path (relative to Firebase root) where a user's viewed videos are
* stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
public static String getViewedVideosChildPath(String uid) {
return getDataChildPath(uid) + FIREBASE_NODE_VIEWED_VIDEOS + "/";
}
/**
* Returns the Firebase child path (relative to Firebase root) where data for a specific viewed
* video is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
* @param videoId The ID of the video that the user watched.
*/
public static String getViewedVideoChildPath(String uid, String videoId) {
return getViewedVideosChildPath(uid) + videoId + "/";
}
/**
* Returns the Firebase child path (relative to Firebase root) where a user's starred sessions
* are stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
public static String getStarredSessionsChildPath(String uid) {
return getDataChildPath(uid) + FIREBASE_NODE_MY_SESSIONS + "/";
}
/**
* Returns the Firebase child path (relative to the user data ref) where data for a specific
* starred session is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
* @param sessionId The ID of the session that was starred.
*/
public static String getStarredSessionChildPath(String uid, String sessionId) {
return getStarredSessionsChildPath(uid) + sessionId + "/";
}
/**
* Returns the Firebase child path (relative to the user data ref) where the in-schedule status
* for a specific starred session is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
* @param sessionId The ID of the session that was starred.
*/
public static String getStarredSessionInScheduleChildPath(String uid, String sessionId) {
return getStarredSessionChildPath(uid, sessionId) + FIREBASE_NODE_IN_SCHEDULE + "/";
}
/**
* Returns the Firebase child path (relative to the user data ref) where the timestamp for a
* specific starred session is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
* @param sessionId The ID of the session that was starred.
*/
public static String getStarredSessionTimestampChildPath(String uid, String sessionId) {
return getStarredSessionChildPath(uid, sessionId) + FIREBASE_NODE_TIMESTAMP + "/";
}
/**
* Returns the Firebase child path (relative to the user data ref) where a user's feedback
* submitted sessions are stored.
*
* @param uid The Firebase user ID associated with the chosen account.
*/
public static String getFeedbackSubmittedSessionsChildPath(String uid) {
return getDataChildPath(uid) + FIREBASE_NODE_FEEDBACK_SUBMITTED_SESSIONS + "/";
}
/**
* Returns the Firebase child path (relative the user data ref) where data where a specific
* feedback submitted session is stored.
*
* @param uid The Firebase user ID associated with the chosen account.
* @param sessionId The ID of the session for which feedback was provided.
*/
public static String getFeedbackSubmittedSessionChildPath(String uid, String sessionId) {
return getFeedbackSubmittedSessionsChildPath(uid) + sessionId + "/";
}
}