TBR: reader/android: use the new BlessingsManager API

Update to vanadium-android:1.0.

Use the new BlessingsManager API for getting blessings, which was
introduced in vanadium-android:0.9.

Change-Id: Id8700b23b3dc5979f32fcf0c53cf450c7d9f82a9
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 54ba5da..f05cdc9 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -89,7 +89,7 @@
     compile 'com.google.android.gms:play-services-analytics:8.3.0'
     compile 'org.apache.commons:commons-csv:1.2'
     compile 'org.apache.commons:commons-io:1.3.2'
-    compile 'io.v:vanadium-android:0.8'
+    compile 'io.v:vanadium-android:1.0'
     compile 'io.v:baku-toolkit:0.3.0'
 
     // Required by baku-toolkit.
diff --git a/android/app/src/main/java/io/v/android/apps/reader/DeviceSetChooserActivity.java b/android/app/src/main/java/io/v/android/apps/reader/DeviceSetChooserActivity.java
index 266fa2c..60c79b5 100644
--- a/android/app/src/main/java/io/v/android/apps/reader/DeviceSetChooserActivity.java
+++ b/android/app/src/main/java/io/v/android/apps/reader/DeviceSetChooserActivity.java
@@ -138,9 +138,6 @@
         super.onActivityResult(requestCode, resultCode, data);
 
         Log.i(TAG, String.format("onActivityResult(%d, %d, data) called", requestCode, resultCode));
-        if (getDB().onActivityResult(requestCode, resultCode, data)) {
-            return;
-        }
 
         // Any other activity results would be handled here.
         if (requestCode == CHOOSE_PDF_FILE_REQUEST) {
diff --git a/android/app/src/main/java/io/v/android/apps/reader/PdfViewerActivity.java b/android/app/src/main/java/io/v/android/apps/reader/PdfViewerActivity.java
index d0f65f2..b3e1c1a 100644
--- a/android/app/src/main/java/io/v/android/apps/reader/PdfViewerActivity.java
+++ b/android/app/src/main/java/io/v/android/apps/reader/PdfViewerActivity.java
@@ -557,9 +557,6 @@
         super.onActivityResult(requestCode, resultCode, data);
 
         Log.i(TAG, String.format("onActivityResult(%d, %d, data) called", requestCode, resultCode));
-        if (getDB().onActivityResult(requestCode, resultCode, data)) {
-            return;
-        }
 
         // Any other activity results would be handled here.
         Log.w(TAG, String.format(
diff --git a/android/app/src/main/java/io/v/android/apps/reader/db/DB.java b/android/app/src/main/java/io/v/android/apps/reader/db/DB.java
index 582c304..1dd7aad 100644
--- a/android/app/src/main/java/io/v/android/apps/reader/db/DB.java
+++ b/android/app/src/main/java/io/v/android/apps/reader/db/DB.java
@@ -6,7 +6,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
 
 import io.v.android.apps.reader.model.Listener;
 import io.v.android.apps.reader.vdl.Device;
@@ -57,14 +56,6 @@
     boolean isInitialized();
 
     /**
-     * If init() sent an intent to another Activity, the result must be forwarded
-     * from our app's activity to this method.
-     *
-     * @return true if the requestCode matches an intent sent by this implementation.
-     */
-    boolean onActivityResult(int requestCode, int resultCode, Intent data);
-
-    /**
      * Provides a list of elements that fits well with RecyclerView.Adapter.
      */
     interface DBList<E> {
diff --git a/android/app/src/main/java/io/v/android/apps/reader/db/FakeDB.java b/android/app/src/main/java/io/v/android/apps/reader/db/FakeDB.java
index 43c83b5..e0e55a4 100644
--- a/android/app/src/main/java/io/v/android/apps/reader/db/FakeDB.java
+++ b/android/app/src/main/java/io/v/android/apps/reader/db/FakeDB.java
@@ -6,7 +6,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
 import android.util.Log;
 
 import com.google.common.io.ByteStreams;
@@ -155,12 +154,6 @@
     }
 
     @Override
-    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
-        // Nothing to do.
-        return false;
-    }
-
-    @Override
     public DBList<File> getFileList() {
         return mFileList;
     }
diff --git a/android/app/src/main/java/io/v/android/apps/reader/db/SyncbaseDB.java b/android/app/src/main/java/io/v/android/apps/reader/db/SyncbaseDB.java
index 6a8c650..6959473 100644
--- a/android/app/src/main/java/io/v/android/apps/reader/db/SyncbaseDB.java
+++ b/android/app/src/main/java/io/v/android/apps/reader/db/SyncbaseDB.java
@@ -6,7 +6,6 @@
 
 import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
@@ -16,6 +15,9 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 
 import org.apache.commons.io.FileUtils;
 
@@ -33,8 +35,6 @@
 import io.v.android.apps.reader.vdl.File;
 import io.v.android.libs.security.BlessingsManager;
 import io.v.android.v23.V;
-import io.v.android.v23.services.blessing.BlessingCreationException;
-import io.v.android.v23.services.blessing.BlessingService;
 import io.v.baku.toolkit.VAndroidContextMixin;
 import io.v.baku.toolkit.debug.DebugUtils;
 import io.v.impl.google.naming.NamingUtil;
@@ -50,8 +50,6 @@
 import io.v.v23.security.BlessingPattern;
 import io.v.v23.security.Blessings;
 import io.v.v23.security.VCertificate;
-import io.v.v23.security.VPrincipal;
-import io.v.v23.security.VSecurity;
 import io.v.v23.security.access.AccessList;
 import io.v.v23.security.access.Constants;
 import io.v.v23.security.access.Permissions;
@@ -156,7 +154,7 @@
                 Constants.ADMIN.getValue(), acl,
                 Constants.RESOLVE.getValue(), acl,
                 Constants.DEBUG.getValue(), acl));
-        getBlessings(activity);
+        getBlessings();
     }
 
     @Override
@@ -164,65 +162,22 @@
         return mInitialized;
     }
 
-    private void getBlessings(Activity activity) {
-        Blessings blessings = null;
-        try {
-            // See if there are blessings stored in shared preferences.
-            blessings = BlessingsManager.getBlessings(mContext);
-        } catch (VException e) {
-            handleError("Error getting blessings from shared preferences " + e.getMessage());
-        }
-        if (blessings == null) {
-            // Request new blessings from the account manager via an intent.  This intent
-            // will call back to onActivityResult() which will continue with
-            // configurePrincipal().
-            refreshBlessings(activity);
-            return;
-        }
-        configurePrincipal(blessings);
-    }
+    private void getBlessings() {
+        ListenableFuture<Blessings> blessingsFuture = BlessingsManager
+                .getBlessings(mContext, "VanadiumBlessings", true);
 
-    private void refreshBlessings(Activity activity) {
-        Intent intent = BlessingService.newBlessingIntent(mContext);
-        activity.startActivityForResult(intent,
-                io.v.android.apps.reader.Constants.REQUEST_CODE_SEEK_BLESSINGS);
-    }
-
-    @Override
-    public boolean onActivityResult(int requestCode, int resultCode, Intent data) {
-        if (requestCode == io.v.android.apps.reader.Constants.REQUEST_CODE_SEEK_BLESSINGS) {
-            try {
-                byte[] blessingsVom = BlessingService.extractBlessingReply(resultCode, data);
-                Blessings blessings = (Blessings) VomUtil.decode(blessingsVom, Blessings.class);
-                BlessingsManager.addBlessings(mContext, blessings);
-                Toast.makeText(mContext, "Success", Toast.LENGTH_SHORT).show();
-                configurePrincipal(blessings);
-            } catch (BlessingCreationException e) {
-                handleError("Couldn't create blessing: " + e.getMessage());
-            } catch (VException e) {
-                handleError("Couldn't derive blessing: " + e.getMessage());
+        Futures.addCallback(blessingsFuture, new FutureCallback<Blessings>() {
+            @Override
+            public void onSuccess(Blessings result) {
+                mUsername = mountNameFromBlessings(result);
+                setupLocalSyncbase();
             }
-            return true;
-        }
-        return false;
-    }
 
-    private void configurePrincipal(Blessings blessings) {
-        try {
-            VPrincipal p = V.getPrincipal(mVContext);
-            p.blessingStore().setDefaultBlessings(blessings);
-            p.blessingStore().set(blessings, new BlessingPattern("..."));
-            VSecurity.addToRoots(p, blessings);
-
-            // "<user_email>/android"
-            mUsername = mountNameFromBlessings(blessings);
-        } catch (VException e) {
-            handleError(String.format(
-                    "Couldn't set local blessing %s: %s", blessings, e.getMessage()));
-            return;
-        }
-
-        setupLocalSyncbase();
+            @Override
+            public void onFailure(Throwable t) {
+                handleError("Could not get blessing: " + t.getMessage());
+            }
+        });
     }
 
     private void setupLocalSyncbase() {
@@ -230,7 +185,7 @@
         final String syncbaseName = NamingUtil.join(
                 "users",
                 mUsername,
-                "reader",
+                "android/reader",
                 DeviceInfoFactory.getDevice(mContext).getId(),
                 "syncbase"
         );
@@ -284,7 +239,7 @@
             // "users/<user_email>/reader/cloudsync"
             String cloudsyncName = NamingUtil.join(
                     "users",
-                    NamingUtil.trimSuffix(mUsername, "android"),
+                    mUsername,
                     "reader/cloudsync"
             );
 
@@ -303,7 +258,7 @@
     private void createSyncgroup(Database db) {
         mSyncgroupName = NamingUtil.join(
                 "users",
-                NamingUtil.trimSuffix(mUsername, "android"),
+                mUsername,
                 "reader/cloudsync/%%sync/cloudsync"
         );
 
@@ -319,7 +274,7 @@
                 NamingUtil.join(
                         GLOBAL_MOUNT_TABLE,
                         "users",
-                        NamingUtil.trimSuffix(mUsername, "android"),
+                        mUsername,
                         "reader/rendezvous"
                 )
         );
@@ -452,8 +407,10 @@
     private static String mountNameFromBlessings(Blessings blessings) {
         for (List<VCertificate> chain : blessings.getCertificateChains()) {
             for (VCertificate certificate : Lists.reverse(chain)) {
-                if (certificate.getExtension().contains("@")) {
-                    return certificate.getExtension().replace(':', '/');
+                String ext = certificate.getExtension();
+                if (ext.contains("@")) {
+                    // Return only the user email portion after the app id.
+                    return ext.substring(ext.lastIndexOf(':') + 1);
                 }
             }
         }