99 lines
4.2 KiB
Java
99 lines
4.2 KiB
Java
/**
|
|
* This class is made by Google
|
|
*
|
|
* visit https://codelabs.developers.google.com/codelabs/arcore-cloud-anchors/#4
|
|
*/
|
|
|
|
package it.norangeb.cloudanchors;
|
|
|
|
import android.content.Context;
|
|
import android.util.Log;
|
|
import com.google.firebase.FirebaseApp;
|
|
import com.google.firebase.database.*;
|
|
|
|
/** Helper class for Firebase storage of cloud anchor IDs. */
|
|
class StorageManager {
|
|
|
|
/** Listener for a new Cloud Anchor ID from the Firebase Database. */
|
|
interface CloudAnchorIdListener {
|
|
void onCloudAnchorIdAvailable(String cloudAnchorId);
|
|
}
|
|
|
|
/** Listener for a new short code from the Firebase Database. */
|
|
interface ShortCodeListener {
|
|
void onShortCodeAvailable(Integer shortCode);
|
|
}
|
|
|
|
private static final String TAG = StorageManager.class.getName();
|
|
private static final String KEY_ROOT_DIR = "shared_anchor_codelab_root";
|
|
private static final String KEY_NEXT_SHORT_CODE = "next_short_code";
|
|
private static final String KEY_PREFIX = "anchor;";
|
|
private static final int INITIAL_SHORT_CODE = 142;
|
|
private final DatabaseReference rootRef;
|
|
|
|
StorageManager(Context context) {
|
|
FirebaseApp firebaseApp = FirebaseApp.initializeApp(context);
|
|
rootRef = FirebaseDatabase.getInstance(firebaseApp).getReference().child(KEY_ROOT_DIR);
|
|
DatabaseReference.goOnline();
|
|
}
|
|
|
|
/** Gets a new short code that can be used to store the anchor ID. */
|
|
void nextShortCode(ShortCodeListener listener) {
|
|
// Run a transaction on the node containing the next short code available. This increments the
|
|
// value in the database and retrieves it in one atomic all-or-nothing operation.
|
|
rootRef
|
|
.child(KEY_NEXT_SHORT_CODE)
|
|
.runTransaction(
|
|
new Transaction.Handler() {
|
|
@Override
|
|
public Transaction.Result doTransaction(MutableData currentData) {
|
|
Integer shortCode = currentData.getValue(Integer.class);
|
|
if (shortCode == null) {
|
|
shortCode = INITIAL_SHORT_CODE - 1;
|
|
}
|
|
currentData.setValue(shortCode + 1);
|
|
return Transaction.success(currentData);
|
|
}
|
|
|
|
@Override
|
|
public void onComplete(
|
|
DatabaseError error, boolean committed, DataSnapshot currentData) {
|
|
if (!committed) {
|
|
Log.e(TAG, "Firebase Error", error.toException());
|
|
listener.onShortCodeAvailable(null);
|
|
} else {
|
|
listener.onShortCodeAvailable(currentData.getValue(Integer.class));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/** Stores the cloud anchor ID in the configured Firebase Database. */
|
|
void storeUsingShortCode(int shortCode, String cloudAnchorId) {
|
|
rootRef.child(KEY_PREFIX + shortCode).setValue(cloudAnchorId);
|
|
}
|
|
|
|
/**
|
|
* Retrieves the cloud anchor ID using a short code. Returns an empty string if a cloud anchor ID
|
|
* was not stored for this short code.
|
|
*/
|
|
void getCloudAnchorID(int shortCode, CloudAnchorIdListener listener) {
|
|
rootRef
|
|
.child(KEY_PREFIX + shortCode)
|
|
.addListenerForSingleValueEvent(
|
|
new ValueEventListener() {
|
|
@Override
|
|
public void onDataChange(DataSnapshot dataSnapshot) {
|
|
listener.onCloudAnchorIdAvailable(String.valueOf(dataSnapshot.getValue()));
|
|
}
|
|
|
|
@Override
|
|
public void onCancelled(DatabaseError error) {
|
|
Log.e(TAG, "The database operation for getCloudAnchorID was cancelled.",
|
|
error.toException());
|
|
listener.onCloudAnchorIdAvailable(null);
|
|
}
|
|
});
|
|
}
|
|
}
|