/* * This code is in the public domain. */ package org.geometerplus.android.fbreader.api; import java.util.ArrayList; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; public abstract class PluginApi { public static final String ACTION_REGISTER = "android.fbreader.action.plugin.REGISTER"; public static final String ACTION_RUN = "android.fbreader.action.plugin.RUN"; public static abstract class PluginInfo extends BroadcastReceiver { public static final String KEY = "actions"; public void onReceive(Context context, Intent intent) { final List<ActionInfo> newActions = implementedActions(context); if (newActions != null) { final Bundle bundle = getResultExtras(true); ArrayList<ActionInfo> actions = bundle.<ActionInfo>getParcelableArrayList(KEY); if (actions == null) { actions = new ArrayList<ActionInfo>(); } actions.addAll(newActions); bundle.putParcelableArrayList(KEY, actions); } } protected abstract List<ActionInfo> implementedActions(Context context); } public static abstract class ActionInfo implements Parcelable { protected static final int TYPE_MENU_OBSOLETE = 1; protected static final int TYPE_MENU = 2; private final String myId; protected ActionInfo(Uri id) { myId = id.toString(); } protected abstract int getType(); public Uri getId() { return Uri.parse(myId); } public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(getType()); parcel.writeString(myId); } public static final Creator<ActionInfo> CREATOR = new Creator<ActionInfo>() { public ActionInfo createFromParcel(Parcel parcel) { switch (parcel.readInt()) { case TYPE_MENU_OBSOLETE: return new MenuActionInfo( Uri.parse(parcel.readString()), parcel.readString(), Integer.MAX_VALUE ); case TYPE_MENU: return new MenuActionInfo( Uri.parse(parcel.readString()), parcel.readString(), parcel.readInt() ); default: return null; } } public ActionInfo[] newArray(int size) { return new ActionInfo[size]; } }; } public static class MenuActionInfo extends ActionInfo implements Comparable<MenuActionInfo> { public final String MenuItemName; public final int Weight; public MenuActionInfo(Uri id, String menuItemName, int weight) { super(id); MenuItemName = menuItemName; Weight = weight; } @Override protected int getType() { return TYPE_MENU; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeString(MenuItemName); parcel.writeInt(Weight); } public int compareTo(MenuActionInfo info) { return Weight - info.Weight; } } }