Java tutorial
// Copyright 2015 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 io.v.android.apps.account_manager; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.widget.ListView; import android.widget.Toast; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import java.util.ArrayList; import java.util.List; import io.v.v23.security.Constants; import io.v.v23.security.VCertificate; import io.v.v23.verror.VException; import io.v.v23.vom.VomUtil; import io.v.v23.security.Caveat; import io.v.v23.uniqueid.Id; /** * Displays a single certificate. */ public class CertificateDisplayActivity extends PreferenceActivity { public static final String TAG = "BlessingDetailsDisplay"; public static final String EXTRA_CERTIFICATE_VOM = "EXTRA_CERTIFICATE_VOM"; private static final String NAME_TITLE = "Name"; private static final String PUBLIC_KEY_TITLE = "Public Key"; private static final String CAVEATS_TITLE = "Caveats"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); byte[] certificateVom = getIntent().getByteArrayExtra(EXTRA_CERTIFICATE_VOM); VCertificate certificate = null; try { certificate = (VCertificate) VomUtil.decode(certificateVom, VCertificate.class); } catch (Exception e) { handleError("Couldn't display certificate: " + e); return; } PreferenceScreen prefScreen = getPreferenceManager().createPreferenceScreen(this); ListView listView = new ListView(this); prefScreen.bind(listView); PreferenceCategory nameCategory = new PreferenceCategory(this); nameCategory.setTitle(NAME_TITLE); prefScreen.addPreference(nameCategory); Preference namePref = new Preference(this); namePref.setTitle(certificate.getExtension()); namePref.setEnabled(false); nameCategory.addPreference(namePref); PreferenceCategory publicKeyCategory = new PreferenceCategory(this); publicKeyCategory.setTitle(PUBLIC_KEY_TITLE); prefScreen.addPreference(publicKeyCategory); // Display the fields of the certificate Preference publicKeyPreference = new Preference(this); publicKeyPreference.setSummary(VomUtil.bytesToHexString(certificate.getPublicKey()).toString()); publicKeyPreference.setEnabled(false); publicKeyCategory.addPreference(publicKeyPreference); PreferenceCategory caveatsCategory = new PreferenceCategory(this); caveatsCategory.setTitle(CAVEATS_TITLE); prefScreen.addPreference(caveatsCategory); for (Caveat caveat : certificate.getCaveats()) { String caveatDescription = caveatText(caveat); Preference caveatPreference = new Preference(this); caveatPreference.setSummary(caveatDescription); caveatPreference.setEnabled(true); caveatsCategory.addPreference(caveatPreference); } setPreferenceScreen(prefScreen); } /** * Returns a human-readable description of a caveat. * * @param caveat the caveat to be examined * @return a human-readable description of the caveat */ public static String caveatText(Caveat caveat) { Id caveatId = caveat.getId(); if (caveatId.equals(Constants.CONST_CAVEAT.getId())) { return "Const Caveat"; } else if (caveatId.equals(Constants.EXPIRY_CAVEAT.getId())) { String ret = "Expiry Caveat: "; try { DateTime expiry = expiryCaveatPayload(caveat); ret += expiry.toString(DateTimeFormat.mediumDateTime()); } catch (VException e) { android.util.Log.e(TAG, "Error parsing expiry caveat payload: " + e); ret += "Could not get expiry time"; } return ret; } else if (caveatId.equals(Constants.METHOD_CAVEAT.getId())) { String ret = "Method Caveat: "; try { List<String> methods = methodCaveatPayload(caveat); for (String name : methods) { ret += name + "\n"; } } catch (VException e) { android.util.Log.e(TAG, "Error parsing method caveat payload: " + e); ret += "Could not get method names"; } return ret; } else if (caveatId.equals(Constants.PEER_BLESSINGS_CAVEAT.getId())) { return "Peer Blessings Caveat"; } else if (caveatId.equals(Constants.PUBLIC_KEY_THIRD_PARTY_CAVEAT.getId())) { return "Public Key Third Party Caveat"; } else { return "Unknown Caveat"; } } /** * Returns expiry time that the caveat restricts the blessing usage to. * * @param caveat the caveat to be examined. * @return expiry time * @throws VException if the given caveat is not a method caveat, or if there * was a problem getting the method names */ public static DateTime expiryCaveatPayload(Caveat caveat) throws VException { Object param = VomUtil.decode(caveat.getParamVom()); if (param == null) { param = new DateTime(0); } if (!(param instanceof DateTime)) { throw new VException(String.format("Caveat param %s of wrong type: want %s", param, DateTime.class)); } return (DateTime) param; } /** * Returns method names that the caveat restricts the blessing usage to. * * @param caveat the caveat to be examined. * @return list of methods that the blessing is valid for * @throws VException if the given caveat is not a method caveat, or if there * was a problem getting the method names */ public static List<String> methodCaveatPayload(Caveat caveat) throws VException { Object param = VomUtil.decode(caveat.getParamVom()); if (param == null) { param = new ArrayList<String>(); } if (!(param instanceof List<?>)) { throw new VException(String.format("Caveat param %s of wrong type: want List<?>", param)); } try { return (List<String>) param; } catch (Exception e) { throw new VException(String.format("Caveat param %s of wrong type: want List<String>", param)); } } private void handleError(String error) { String msg = "Caveat display error: " + error; android.util.Log.e(TAG, msg); Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); } }