| // 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.content.Context; |
| 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.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| 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.exception.SyncbaseException; |
| |
| public class MainActivity extends AppCompatActivity { |
| private static final String TAG = "DiceRoller"; |
| private static final String RESULT_KEY = "result"; |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| setContentView(R.layout.activity_main); |
| |
| try { |
| Syncbase.Options options = new Syncbase.Options(); |
| List<String> mountpoints = new ArrayList<>(); |
| mountpoints.add("/ns.dev.v.io:8101/tmp/diceroller/users"); |
| options.mountPoints = mountpoints; |
| |
| // TODO(alexfandrianto): Write an Android helper in HLAPI to determine this location. |
| // https://github.com/vanadium/issues/issues/1384 |
| options.rootDir = getDir("syncbase", Context.MODE_PRIVATE).getAbsolutePath(); |
| |
| // TODO(alexfandrianto): Disabled until we set up a cloud. |
| // https://github.com/vanadium/issues/issues/1357 |
| options.disableSyncgroupPublishing = true; |
| Syncbase.init(options); |
| } catch (SyncbaseException e) { |
| Log.e(TAG, e.toString()); |
| } |
| |
| Syncbase.loginAndroid(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)); |
| } |
| } |