blob: fc8540c29882c4de8f678f39ad44d70b58bea408 [file] [log] [blame]
// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package v.io.diceroller;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Iterator;
import java.util.Random;
import io.v.syncbase.Collection;
import io.v.syncbase.Database;
import io.v.syncbase.Syncbase;
import io.v.syncbase.WatchChange;
import io.v.syncbase.android.SyncbaseAndroid;
import io.v.syncbase.exception.SyncbaseException;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "DiceRoller";
private static final String RESULT_KEY = "result";
private static final String CLOUD_NAME =
"/(dev.v.io:r:vprod:service:mounttabled)@ns.dev.v.io:8101/sb/syncbased-24204641";
private static final String CLOUD_ADMIN = "dev.v.io:r:allocator:us:x:syncbased-24204641";
private static final String MOUNT_POINT = "/ns.dev.v.io:8101/tmp/diceroller/users";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Syncbase.Options options = Syncbase.Options.cloudBuilder(
SyncbaseAndroid.defaultRootDir(this), CLOUD_NAME, CLOUD_ADMIN)
.setMountPoint(MOUNT_POINT)
.build();
Syncbase.init(options);
} catch (SyncbaseException e) {
Log.e(TAG, e.toString());
}
SyncbaseAndroid.login(this, new LoginCallback());
}
@Override
protected void onDestroy() {
Syncbase.shutdown();
super.onDestroy();
}
private class LoginCallback implements Syncbase.LoginCallback {
@Override
public void onSuccess() {
Log.i(TAG, "LoginCallback: onSuccess");
try {
final Collection userdata = Syncbase.database().getUserdataCollection();
// On dice roll, put a random number into the userdata collection under RESULT_KEY.
final Button button = (Button) findViewById(R.id.buttonRoll);
if (button == null) {
Log.e(TAG, "Resource not found: " + R.id.buttonRoll);
} else {
button.setEnabled(true);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int randomNumber = new Random().nextInt(6) + 1;
try {
userdata.put(RESULT_KEY, randomNumber);
} catch (SyncbaseException e) {
Log.e(TAG, e.toString());
}
}
});
}
Syncbase.database().addWatchChangeHandler(new Database.WatchChangeHandler() {
@Override
public void onInitialState(Iterator<WatchChange> values) {
onChange(values);
}
@Override
public void onChangeBatch(Iterator<WatchChange> changes) {
onChange(changes);
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError: " + e.toString());
}
private void onChange(Iterator<WatchChange> changes) {
while (changes.hasNext()) {
WatchChange watchChange = changes.next();
Log.i(TAG, watchChange.toString());
if (watchChange.getCollectionId().getName().equals(
Syncbase.USERDATA_NAME) &&
watchChange.getEntityType() == WatchChange.EntityType.ROW &&
watchChange.getChangeType() == WatchChange.ChangeType.PUT &&
watchChange.getRowKey().equals(RESULT_KEY)) {
try {
updateResult(watchChange.getValue(Integer.class));
} catch (SyncbaseException e) {
Log.e(TAG, e.toString());
}
}
}
}
});
} catch (SyncbaseException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "LoginCallback: onError: " + e.toString());
}
}
private void updateResult(final int newValue) {
Log.i(TAG, "newValue: " + newValue);
final TextView result = (TextView) findViewById(R.id.textViewResult);
result.setText(String.valueOf(newValue));
}
}