From 3598624a8e6fa01583720ec676e1f599ac80eb9c Mon Sep 17 00:00:00 2001 From: Zukero Date: Thu, 9 Nov 2017 00:35:22 +0100 Subject: [PATCH] Reimplementation of the inventory context menu. Not complete yet. Android doesn't help... --- .../drawable/ui_blue_submenu_indicator.9.png | Bin 0 -> 388 bytes .../res/layout/custom_menu_item_layout.xml | 8 + AndorsTrail/res/layout/custom_menu_layout.xml | 24 + .../res/layout/custom_menu_submenu_layout.xml | 9 + .../fragment/HeroinfoActivity_Inventory.java | 931 ++++++++------- .../resource/tiles/TileManager.java | 1062 +++++++++-------- .../AndorsTrail/view/CustomMenuInflater.java | 554 +++++++++ 7 files changed, 1600 insertions(+), 988 deletions(-) create mode 100644 AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png create mode 100644 AndorsTrail/res/layout/custom_menu_item_layout.xml create mode 100644 AndorsTrail/res/layout/custom_menu_layout.xml create mode 100644 AndorsTrail/res/layout/custom_menu_submenu_layout.xml create mode 100644 AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java diff --git a/AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png b/AndorsTrail/res/drawable/ui_blue_submenu_indicator.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8d78372fc38ec9bb97f0084960aec4ad7a616e34 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^{6H+o!3HFmxV|j}Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#AvcGpnufogp$$+-HZvrm#5q4VH#M&W$Yo$~E=o-- zNlj5G&n(GMaQE~LNYP7W2a3P&ba4!^IGvo((D0upg&}Q)o7;>7=jK{V&X_SnLN9L5 zi3u|zPbw(r99ytpQD>9NfD{z`zvsKh%y=R9j-5OI zs$Y|qm{tDv*3lg)CxzO6UcUW*@|u~Ajg5+GYHfulC#mwVm#zElzbTE4jjheH`?{b> z1LypcEj$NS{=Bz0nuRw(Nkl_)qvQYNq$CNMJIxXsv(uiaM=Hn7zWqx3LzYX%zyE@+ z1wdn1Odt6q8X6k%6s@xAQBf5tFE3{c3=BNBV~52t_wDNsILpjW+q6lUIjB$RID;F5 XabetMv)GB1puq5S^>bP0l+XkKt`m=e literal 0 HcmV?d00001 diff --git a/AndorsTrail/res/layout/custom_menu_item_layout.xml b/AndorsTrail/res/layout/custom_menu_item_layout.xml new file mode 100644 index 000000000..ac1b75a17 --- /dev/null +++ b/AndorsTrail/res/layout/custom_menu_item_layout.xml @@ -0,0 +1,8 @@ + + diff --git a/AndorsTrail/res/layout/custom_menu_layout.xml b/AndorsTrail/res/layout/custom_menu_layout.xml new file mode 100644 index 000000000..44f0066ef --- /dev/null +++ b/AndorsTrail/res/layout/custom_menu_layout.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/AndorsTrail/res/layout/custom_menu_submenu_layout.xml b/AndorsTrail/res/layout/custom_menu_submenu_layout.xml new file mode 100644 index 000000000..0bad016c8 --- /dev/null +++ b/AndorsTrail/res/layout/custom_menu_submenu_layout.xml @@ -0,0 +1,9 @@ + + diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java index 27ef7591d..6233337ea 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/fragment/HeroinfoActivity_Inventory.java @@ -1,463 +1,468 @@ -package com.gpl.rpg.AndorsTrail.activity.fragment; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.LayoutInflater; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.ImageView; -import android.widget.ListView; -import android.widget.TextView; - -import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; -import com.gpl.rpg.AndorsTrail.Dialogs; -import com.gpl.rpg.AndorsTrail.R; -import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity; -import com.gpl.rpg.AndorsTrail.context.ControllerContext; -import com.gpl.rpg.AndorsTrail.context.WorldContext; -import com.gpl.rpg.AndorsTrail.controller.ItemController; -import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection; -import com.gpl.rpg.AndorsTrail.model.actor.Player; -import com.gpl.rpg.AndorsTrail.model.item.Inventory; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; -import com.gpl.rpg.AndorsTrail.model.item.ItemType; -import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; -import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter; -import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator; - -public final class HeroinfoActivity_Inventory extends Fragment { - - private static final int INTENTREQUEST_ITEMINFO = 3; - private static final int INTENTREQUEST_BULKSELECT_DROP = 11; - - private WorldContext world; - private ControllerContext controllers; - private TileCollection wornTiles; - - private Player player; - private ListView inventoryList; - private ItemContainerAdapter inventoryListAdapter; - private ItemContainerAdapter inventoryWeaponsListAdapter; - private ItemContainerAdapter inventoryArmorListAdapter; - private ItemContainerAdapter inventoryUsableListAdapter; - private ItemContainerAdapter inventoryQuestListAdapter; - private ItemContainerAdapter inventoryOtherListAdapter; - - private TextView heroinfo_stats_gold; - private TextView heroinfo_stats_attack; - private TextView heroinfo_stats_defense; - - private ItemType lastSelectedItem; // Workaround android bug #7139 - - private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length]; - private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length]; - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity()); - if (!app.isInitialized()) return; - this.world = app.getWorld(); - this.controllers = app.getControllerContext(); - this.player = world.model.player; - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false); - - inventoryList = (ListView) v.findViewById(R.id.inventorylist_root); - ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon); - heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold); - heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack); - heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense); - - registerForContextMenu(inventoryList); - inventoryList.setOnItemClickListener(new OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View v, int position, long id) { - // Move this code to separate function? -- Done - ItemType itemType = getSelectedItemType(position); - showInventoryItemInfo(itemType.id); - } - }); - - new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) { - @Override - public void setValue(int value) { - world.model.uiSelections.selectedInventoryCategory = value; - } - @Override - public void selectionChanged(int value) { - reloadShownCategory(value); - } - @Override - public int getValue() { - return world.model.uiSelections.selectedInventoryCategory; - } - }; - new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) { - @Override - public void setValue(int value) { - world.model.uiSelections.selectedInventorySort = value; - } - @Override - public void selectionChanged(int value) { - reloadShownSort(player.inventory); - } - @Override - public int getValue() { - return world.model.uiSelections.selectedInventorySort; - } - }; - - ItemContainer inv = player.inventory; - wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources()); - inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles); - inventoryList.setAdapter(inventoryListAdapter); - - - heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID)); - - setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon); - setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield); - setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head); - setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body); - setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet); - setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck); - setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand); - setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring); - setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring); - - return v; - } - - @Override - public void onStart() { - super.onStart(); - update(); - } - - private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) { - final ImageView imageView = (ImageView) v.findViewById(viewId); - wornItemImage[inventorySlot.ordinal()] = imageView; - defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId; - imageView.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if (player.inventory.isEmptySlot(inventorySlot)) return; - imageView.setClickable(false); // Will be enabled again on update() - showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot); - } - }); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case INTENTREQUEST_ITEMINFO: - if (resultCode != Activity.RESULT_OK) break; - - ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID")); - ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType")); - if (actionType == ItemInfoActivity.ItemInfoAction.unequip) { - Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot")); - controllers.itemController.unequipSlot(itemType, slot); - } else if (actionType == ItemInfoActivity.ItemInfoAction.equip) { - Inventory.WearSlot slot = suggestInventorySlot(itemType); - controllers.itemController.equipItem(itemType, slot); - } else if (actionType == ItemInfoActivity.ItemInfoAction.use) { - controllers.itemController.useItem(itemType); - } - break; - case INTENTREQUEST_BULKSELECT_DROP: - if (resultCode != Activity.RESULT_OK) break; - - int quantity = data.getExtras().getInt("selectedAmount"); - String itemTypeID = data.getExtras().getString("itemTypeID"); - dropItem(itemTypeID, quantity); - break; - } - update(); - } - - private Inventory.WearSlot suggestInventorySlot(ItemType itemType) { - Inventory.WearSlot slot = itemType.category.inventorySlot; - if (player.inventory.isEmptySlot(slot)) return slot; - - if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring; - if (itemType.isOffhandCapableWeapon()) { - ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon); - if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot; - else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield; - } - return slot; - } - - private void dropItem(String itemTypeID, int quantity) { - ItemType itemType = world.itemTypes.getItemType(itemTypeID); - controllers.itemController.dropItem(itemType, quantity); - } - - private void update() { - updateTraits(); - updateWorn(); - updateItemList(); - } - - private void updateTraits() { - heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold)); - - StringBuilder sb = new StringBuilder(10); - ItemController.describeAttackEffect( - player.getAttackChance(), - player.getDamagePotential().current, - player.getDamagePotential().max, - player.getCriticalSkill(), - player.getCriticalMultiplier(), - sb); - heroinfo_stats_attack.setText(sb.toString()); - - sb = new StringBuilder(10); - ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb); - heroinfo_stats_defense.setText(sb.toString()); - } - - private void updateWorn() { - for(Inventory.WearSlot slot : Inventory.WearSlot.values()) { - updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot)); - } - } - - private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) { - if (type != null) { - world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles); - } else { - imageView.setImageResource(resourceIDEmptyImage); - } - imageView.setClickable(true); - } - - private void updateItemList() { - int currentScreen = world.model.uiSelections.selectedInventoryCategory; - if (currentScreen == 0) - inventoryListAdapter.notifyDataSetChanged(); - else - reloadShownCategory(world.model.uiSelections.selectedInventoryCategory); - } - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo); - MenuInflater inflater = getActivity().getMenuInflater(); - switch (v.getId()) { - case R.id.inventorylist_root: - inflater.inflate(R.menu.inventoryitem, menu); - if (type.isUsable()){ - menu.findItem(R.id.inv_menu_use).setVisible(true); - menu.findItem(R.id.inv_menu_assign).setVisible(true); - } - if (type.isEquippable()) { - menu.findItem(R.id.inv_menu_equip).setVisible(true); - if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true); - else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true); - } - break; - } - lastSelectedItem = null; - } - - private ItemType getSelectedItemType(int position) { - int v = world.model.uiSelections.selectedInventoryCategory; - - if (v == 0) { //All items - return inventoryListAdapter.getItem(position).itemType; - }else if (v == 1) { //Weapon items - return inventoryWeaponsListAdapter.getItem(position).itemType; - } else if (v == 2) { //Armor items - return inventoryArmorListAdapter.getItem(position).itemType; - } else if (v == 3) { //Usable items - return inventoryUsableListAdapter.getItem(position).itemType; - } else if (v == 4) { //Quest items - return inventoryQuestListAdapter.getItem(position).itemType; - } else if (v == 5) { //Other items - return inventoryOtherListAdapter.getItem(position).itemType; - } - - // Better than crashing... - return inventoryListAdapter.getItem(position).itemType; - - } - - - private ItemType getSelectedItemType(AdapterContextMenuInfo info) { - return getSelectedItemType(info.position); - } - @Override - public boolean onContextItemSelected(MenuItem item) { - ItemType itemType; - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); - switch (item.getItemId()) { - case R.id.inv_menu_info: - showInventoryItemInfo(getSelectedItemType(info)); - //context.mapController.itemInfo(this, getSelectedItemType(info)); - break; - case R.id.inv_menu_drop: - String itemTypeID = getSelectedItemType(info).id; - int quantity = player.inventory.getItemQuantity(itemTypeID); - if (quantity > 1) { - Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity); - startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP); - } else { - dropItem(itemTypeID, quantity); - } - break; - case R.id.inv_menu_equip: - itemType = getSelectedItemType(info); - controllers.itemController.equipItem(itemType, itemType.category.inventorySlot); - break; - case R.id.inv_menu_equip_offhand: - itemType = getSelectedItemType(info); - if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) { - controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield); - } else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) { - controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring); - } - break; - /*case R.id.inv_menu_unequip: - context.mapController.unequipItem(this, getSelectedItemType(info)); - break;*/ - case R.id.inv_menu_use: - controllers.itemController.useItem(getSelectedItemType(info)); - break; - case R.id.inv_menu_assign: - lastSelectedItem = getSelectedItemType(info); - break; - case R.id.inv_assign_slot1: - controllers.itemController.setQuickItem(lastSelectedItem, 0); - break; - case R.id.inv_assign_slot2: - controllers.itemController.setQuickItem(lastSelectedItem, 1); - break; - case R.id.inv_assign_slot3: - controllers.itemController.setQuickItem(lastSelectedItem, 2); - break; - case R.id.inv_menu_movetop: - player.inventory.sortToTop(getSelectedItemType(info).id); - break; - case R.id.inv_menu_movebottom: - player.inventory.sortToBottom(getSelectedItemType(info).id); - break; - default: - return super.onContextItemSelected(item); - } - update(); - return true; - } - - private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) { - String text; - boolean enabled = true; - - if (world.model.uiSelections.isInCombat) { - int ap = world.model.player.getReequipCost(); - text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap); - if (ap > 0) { - enabled = world.model.player.hasAPs(ap); - } - } else { - text = getResources().getString(R.string.iteminfo_action_unequip); - } - Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot); - startActivityForResult(intent, INTENTREQUEST_ITEMINFO); - } - private void showInventoryItemInfo(String itemTypeID) { - showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID)); - } - private void showInventoryItemInfo(ItemType itemType) { - String text = ""; - int ap = 0; - boolean enabled = true; - ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none; - final boolean isInCombat = world.model.uiSelections.isInCombat; - if (itemType.isEquippable()) { - if (isInCombat) { - ap = world.model.player.getReequipCost(); - text = getResources().getString(R.string.iteminfo_action_equip_ap, ap); - } else { - text = getResources().getString(R.string.iteminfo_action_equip); - } - action = ItemInfoActivity.ItemInfoAction.equip; - } else if (itemType.isUsable()) { - if (isInCombat) { - ap = world.model.player.getUseItemCost(); - text = getResources().getString(R.string.iteminfo_action_use_ap, ap); - } else { - text = getResources().getString(R.string.iteminfo_action_use); - } - action = ItemInfoActivity.ItemInfoAction.use; - } - if (isInCombat && ap > 0) { - enabled = world.model.player.hasAPs(ap); - } - - Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null); - startActivityForResult(intent, INTENTREQUEST_ITEMINFO); - } - - private void reloadShownCategory(int v) { // Apologies about the code duplication, - // just didn't seem to make sense as an array, although I did create a nice array for skill category adapters. - - // Decide which category to show - if (v == 0) { //All items - inventoryList.setAdapter(inventoryListAdapter); - inventoryListAdapter.notifyDataSetChanged(); - } else if (v == 1) { //Weapon items - inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles); - inventoryList.setAdapter(inventoryWeaponsListAdapter); - inventoryWeaponsListAdapter.notifyDataSetChanged(); - } else if (v == 2) { //Armor items - inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles); - inventoryList.setAdapter(inventoryArmorListAdapter); - inventoryArmorListAdapter.notifyDataSetChanged(); - } else if (v == 3) { //Usable items - inventoryUsableListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildUsableItems(), player, wornTiles); - inventoryList.setAdapter(inventoryUsableListAdapter); - inventoryUsableListAdapter.notifyDataSetChanged(); - } else if (v == 4) { //Quest items - inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles); - inventoryList.setAdapter(inventoryQuestListAdapter); - inventoryQuestListAdapter.notifyDataSetChanged(); - } else if (v == 5) { //Other items - inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles); - inventoryList.setAdapter(inventoryOtherListAdapter); - inventoryOtherListAdapter.notifyDataSetChanged(); - } - //updateItemList(); - } - - private void reloadShownSort(Inventory inv) { - int selected = world.model.uiSelections.selectedInventorySort; - - inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player); - - // Currently not functional, perhaps because selection only updates when changed. - if (world.model.uiSelections.oldSortSelection == selected) - world.model.uiSelections.oldSortSelection = 0; - else world.model.uiSelections.oldSortSelection = selected; - updateItemList(); - } - -} +package com.gpl.rpg.AndorsTrail.activity.fragment; + +import java.util.Arrays; + +import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; +import com.gpl.rpg.AndorsTrail.Dialogs; +import com.gpl.rpg.AndorsTrail.R; +import com.gpl.rpg.AndorsTrail.activity.ItemInfoActivity; +import com.gpl.rpg.AndorsTrail.context.ControllerContext; +import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.controller.ItemController; +import com.gpl.rpg.AndorsTrail.model.actor.HeroCollection; +import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.item.Inventory; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; +import com.gpl.rpg.AndorsTrail.model.item.ItemType; +import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection; +import com.gpl.rpg.AndorsTrail.view.CustomMenuInflater; +import com.gpl.rpg.AndorsTrail.view.ItemContainerAdapter; +import com.gpl.rpg.AndorsTrail.view.SpinnerEmulator; + +import android.app.Activity; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; + +public final class HeroinfoActivity_Inventory extends Fragment implements CustomMenuInflater.MenuItemSelectedListener { + + private static final int INTENTREQUEST_ITEMINFO = 3; + private static final int INTENTREQUEST_BULKSELECT_DROP = 11; + + private WorldContext world; + private ControllerContext controllers; + private TileCollection wornTiles; + + private Player player; + private ListView inventoryList; + private ItemContainerAdapter inventoryListAdapter; + private ItemContainerAdapter inventoryWeaponsListAdapter; + private ItemContainerAdapter inventoryArmorListAdapter; + private ItemContainerAdapter inventoryUsableListAdapter; + private ItemContainerAdapter inventoryQuestListAdapter; + private ItemContainerAdapter inventoryOtherListAdapter; + + private TextView heroinfo_stats_gold; + private TextView heroinfo_stats_attack; + private TextView heroinfo_stats_defense; + + private ItemType lastSelectedItem; // Workaround android bug #7139 + + private final ImageView[] wornItemImage = new ImageView[Inventory.WearSlot.values().length]; + private final int[] defaultWornItemImageResourceIDs = new int[Inventory.WearSlot.values().length]; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this.getActivity()); + if (!app.isInitialized()) return; + this.world = app.getWorld(); + this.controllers = app.getControllerContext(); + this.player = world.model.player; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + final View v = inflater.inflate(R.layout.heroinfo_inventory, container, false); + + inventoryList = (ListView) v.findViewById(R.id.inventorylist_root); + ImageView heroicon = (ImageView) v.findViewById(R.id.heroinfo_inventory_heroicon); + heroinfo_stats_gold = (TextView) v.findViewById(R.id.heroinfo_stats_gold); + heroinfo_stats_attack = (TextView) v.findViewById(R.id.heroinfo_stats_attack); + heroinfo_stats_defense = (TextView) v.findViewById(R.id.heroinfo_stats_defense); + + registerForContextMenu(inventoryList); + inventoryList.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View v, int position, long id) { + // Move this code to separate function? -- Done + ItemType itemType = getSelectedItemType(position); + showInventoryItemInfo(itemType.id); + } + }); + inventoryList.setOnItemLongClickListener(new OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { + showContextMenuForItem(getSelectedItemType(position)); + return true; + } + }); + + new SpinnerEmulator(v, R.id.inventorylist_category_filters_button, R.array.inventorylist_category_filters, R.string.heroinfo_inventory_categories) { + @Override + public void setValue(int value) { + world.model.uiSelections.selectedInventoryCategory = value; + } + @Override + public void selectionChanged(int value) { + reloadShownCategory(value); + } + @Override + public int getValue() { + return world.model.uiSelections.selectedInventoryCategory; + } + }; + new SpinnerEmulator(v, R.id.inventorylist_sort_filters_button, R.array.inventorylist_sort_filters, R.string.heroinfo_inventory_sort) { + @Override + public void setValue(int value) { + world.model.uiSelections.selectedInventorySort = value; + } + @Override + public void selectionChanged(int value) { + reloadShownSort(player.inventory); + } + @Override + public int getValue() { + return world.model.uiSelections.selectedInventorySort; + } + }; + + ItemContainer inv = player.inventory; + wornTiles = world.tileManager.loadTilesFor(player.inventory, getResources()); + inventoryListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, inv, player, wornTiles); + inventoryList.setAdapter(inventoryListAdapter); + + + heroicon.setImageResource(HeroCollection.getHeroLargeSprite(player.iconID)); + + setWearSlot(v, Inventory.WearSlot.weapon, R.id.heroinfo_worn_weapon, R.drawable.equip_weapon); + setWearSlot(v, Inventory.WearSlot.shield, R.id.heroinfo_worn_shield, R.drawable.equip_shield); + setWearSlot(v, Inventory.WearSlot.head, R.id.heroinfo_worn_head, R.drawable.equip_head); + setWearSlot(v, Inventory.WearSlot.body, R.id.heroinfo_worn_body, R.drawable.equip_body); + setWearSlot(v, Inventory.WearSlot.feet, R.id.heroinfo_worn_feet, R.drawable.equip_feet); + setWearSlot(v, Inventory.WearSlot.neck, R.id.heroinfo_worn_neck, R.drawable.equip_neck); + setWearSlot(v, Inventory.WearSlot.hand, R.id.heroinfo_worn_hand, R.drawable.equip_hand); + setWearSlot(v, Inventory.WearSlot.leftring, R.id.heroinfo_worn_ringleft, R.drawable.equip_ring); + setWearSlot(v, Inventory.WearSlot.rightring, R.id.heroinfo_worn_ringright, R.drawable.equip_ring); + + return v; + } + + @Override + public void onStart() { + super.onStart(); + update(); + } + + private void setWearSlot(final View v, final Inventory.WearSlot inventorySlot, int viewId, int resourceId) { + final ImageView imageView = (ImageView) v.findViewById(viewId); + wornItemImage[inventorySlot.ordinal()] = imageView; + defaultWornItemImageResourceIDs[inventorySlot.ordinal()] = resourceId; + imageView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (player.inventory.isEmptySlot(inventorySlot)) return; + imageView.setClickable(false); // Will be enabled again on update() + showEquippedItemInfo(player.inventory.getItemTypeInWearSlot(inventorySlot), inventorySlot); + } + }); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + switch (requestCode) { + case INTENTREQUEST_ITEMINFO: + if (resultCode != Activity.RESULT_OK) break; + + ItemType itemType = world.itemTypes.getItemType(data.getExtras().getString("itemTypeID")); + ItemInfoActivity.ItemInfoAction actionType = ItemInfoActivity.ItemInfoAction.valueOf(data.getExtras().getString("actionType")); + if (actionType == ItemInfoActivity.ItemInfoAction.unequip) { + Inventory.WearSlot slot = Inventory.WearSlot.valueOf(data.getExtras().getString("inventorySlot")); + controllers.itemController.unequipSlot(itemType, slot); + } else if (actionType == ItemInfoActivity.ItemInfoAction.equip) { + Inventory.WearSlot slot = suggestInventorySlot(itemType); + controllers.itemController.equipItem(itemType, slot); + } else if (actionType == ItemInfoActivity.ItemInfoAction.use) { + controllers.itemController.useItem(itemType); + } + break; + case INTENTREQUEST_BULKSELECT_DROP: + if (resultCode != Activity.RESULT_OK) break; + + int quantity = data.getExtras().getInt("selectedAmount"); + String itemTypeID = data.getExtras().getString("itemTypeID"); + dropItem(itemTypeID, quantity); + break; + } + update(); + } + + private Inventory.WearSlot suggestInventorySlot(ItemType itemType) { + Inventory.WearSlot slot = itemType.category.inventorySlot; + if (player.inventory.isEmptySlot(slot)) return slot; + + if (slot == Inventory.WearSlot.leftring) return Inventory.WearSlot.rightring; + if (itemType.isOffhandCapableWeapon()) { + ItemType mainWeapon = player.inventory.getItemTypeInWearSlot(Inventory.WearSlot.weapon); + if (mainWeapon != null && mainWeapon.isTwohandWeapon()) return slot; + else if (player.inventory.isEmptySlot(Inventory.WearSlot.shield)) return Inventory.WearSlot.shield; + } + return slot; + } + + private void dropItem(String itemTypeID, int quantity) { + ItemType itemType = world.itemTypes.getItemType(itemTypeID); + controllers.itemController.dropItem(itemType, quantity); + } + + private void update() { + updateTraits(); + updateWorn(); + updateItemList(); + } + + private void updateTraits() { + heroinfo_stats_gold.setText(getResources().getString(R.string.heroinfo_gold, player.inventory.gold)); + + StringBuilder sb = new StringBuilder(10); + ItemController.describeAttackEffect( + player.getAttackChance(), + player.getDamagePotential().current, + player.getDamagePotential().max, + player.getCriticalSkill(), + player.getCriticalMultiplier(), + sb); + heroinfo_stats_attack.setText(sb.toString()); + + sb = new StringBuilder(10); + ItemController.describeBlockEffect(player.getBlockChance(), player.getDamageResistance(), sb); + heroinfo_stats_defense.setText(sb.toString()); + } + + private void updateWorn() { + for(Inventory.WearSlot slot : Inventory.WearSlot.values()) { + updateWornImage(wornItemImage[slot.ordinal()], defaultWornItemImageResourceIDs[slot.ordinal()], player.inventory.getItemTypeInWearSlot(slot)); + } + } + + private void updateWornImage(ImageView imageView, int resourceIDEmptyImage, ItemType type) { + if (type != null) { + world.tileManager.setImageViewTile(getResources(), imageView, type, wornTiles); + } else { + imageView.setImageResource(resourceIDEmptyImage); + } + imageView.setClickable(true); + } + + private void updateItemList() { + int currentScreen = world.model.uiSelections.selectedInventoryCategory; + if (currentScreen == 0) + inventoryListAdapter.notifyDataSetChanged(); + else + reloadShownCategory(world.model.uiSelections.selectedInventoryCategory); + } + +// @Override +// public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {} +// ItemType type = getSelectedItemType((AdapterContextMenuInfo) menuInfo); + + public void showContextMenuForItem(ItemType type) { + MenuInflater inflater = getActivity().getMenuInflater(); + Menu menu = CustomMenuInflater.newMenuInstance(getActivity()); + inflater.inflate(R.menu.inventoryitem, menu); + if (type.isUsable()){ + menu.findItem(R.id.inv_menu_use).setVisible(true); + menu.findItem(R.id.inv_menu_assign).setVisible(true); + } + if (type.isEquippable()) { + menu.findItem(R.id.inv_menu_equip).setVisible(true); + if (type.isOffhandCapableWeapon()) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true); + else if (type.category.inventorySlot == Inventory.WearSlot.leftring) menu.findItem(R.id.inv_menu_equip_offhand).setVisible(true); + } + lastSelectedItem = null; + CustomMenuInflater.showMenuInDialog(getActivity(), menu, world.tileManager.getDrawableForItem(getResources(), type.iconID, world.tileManager.loadTilesFor(Arrays.asList(new Integer[] { type.iconID}), getResources())), type.getName(player), type, this); + } + + private ItemType getSelectedItemType(int position) { + int v = world.model.uiSelections.selectedInventoryCategory; + + if (v == 0) { //All items + return inventoryListAdapter.getItem(position).itemType; + }else if (v == 1) { //Weapon items + return inventoryWeaponsListAdapter.getItem(position).itemType; + } else if (v == 2) { //Armor items + return inventoryArmorListAdapter.getItem(position).itemType; + } else if (v == 3) { //Usable items + return inventoryUsableListAdapter.getItem(position).itemType; + } else if (v == 4) { //Quest items + return inventoryQuestListAdapter.getItem(position).itemType; + } else if (v == 5) { //Other items + return inventoryOtherListAdapter.getItem(position).itemType; + } + + // Better than crashing... + return inventoryListAdapter.getItem(position).itemType; + + } + + + private ItemType getSelectedItemType(AdapterContextMenuInfo info) { + return getSelectedItemType(info.position); + } + + @Override + public void onMenuItemSelected(MenuItem item, Object data) { + ItemType itemType = (ItemType) data; + switch (item.getItemId()) { + case R.id.inv_menu_info: + showInventoryItemInfo(itemType); + //context.mapController.itemInfo(this, getSelectedItemType(info)); + break; + case R.id.inv_menu_drop: + String itemTypeID = itemType.id; + int quantity = player.inventory.getItemQuantity(itemTypeID); + if (quantity > 1) { + Intent intent = Dialogs.getIntentForBulkDroppingInterface(getActivity(), itemTypeID, quantity); + startActivityForResult(intent, INTENTREQUEST_BULKSELECT_DROP); + } else { + dropItem(itemTypeID, quantity); + } + break; + case R.id.inv_menu_equip: + controllers.itemController.equipItem(itemType, itemType.category.inventorySlot); + break; + case R.id.inv_menu_equip_offhand: + if (itemType.category.inventorySlot == Inventory.WearSlot.weapon) { + controllers.itemController.equipItem(itemType, Inventory.WearSlot.shield); + } else if (itemType.category.inventorySlot == Inventory.WearSlot.leftring) { + controllers.itemController.equipItem(itemType, Inventory.WearSlot.rightring); + } + break; + /*case R.id.inv_menu_unequip: + context.mapController.unequipItem(this, getSelectedItemType(info)); + break;*/ + case R.id.inv_menu_use: + controllers.itemController.useItem(itemType); + break; + case R.id.inv_menu_assign: + //lastSelectedItem = itemType; + break; + case R.id.inv_assign_slot1: + controllers.itemController.setQuickItem(itemType, 0); + break; + case R.id.inv_assign_slot2: + controllers.itemController.setQuickItem(itemType, 1); + break; + case R.id.inv_assign_slot3: + controllers.itemController.setQuickItem(itemType, 2); + break; + case R.id.inv_menu_movetop: + player.inventory.sortToTop(itemType.id); + break; + case R.id.inv_menu_movebottom: + player.inventory.sortToBottom(itemType.id); + break; + } + update(); + } + + private void showEquippedItemInfo(ItemType itemType, Inventory.WearSlot inventorySlot) { + String text; + boolean enabled = true; + + if (world.model.uiSelections.isInCombat) { + int ap = world.model.player.getReequipCost(); + text = getResources().getString(R.string.iteminfo_action_unequip_ap, ap); + if (ap > 0) { + enabled = world.model.player.hasAPs(ap); + } + } else { + text = getResources().getString(R.string.iteminfo_action_unequip); + } + Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, ItemInfoActivity.ItemInfoAction.unequip, text, enabled, inventorySlot); + startActivityForResult(intent, INTENTREQUEST_ITEMINFO); + } + private void showInventoryItemInfo(String itemTypeID) { + showInventoryItemInfo(world.itemTypes.getItemType(itemTypeID)); + } + private void showInventoryItemInfo(ItemType itemType) { + String text = ""; + int ap = 0; + boolean enabled = true; + ItemInfoActivity.ItemInfoAction action = ItemInfoActivity.ItemInfoAction.none; + final boolean isInCombat = world.model.uiSelections.isInCombat; + if (itemType.isEquippable()) { + if (isInCombat) { + ap = world.model.player.getReequipCost(); + text = getResources().getString(R.string.iteminfo_action_equip_ap, ap); + } else { + text = getResources().getString(R.string.iteminfo_action_equip); + } + action = ItemInfoActivity.ItemInfoAction.equip; + } else if (itemType.isUsable()) { + if (isInCombat) { + ap = world.model.player.getUseItemCost(); + text = getResources().getString(R.string.iteminfo_action_use_ap, ap); + } else { + text = getResources().getString(R.string.iteminfo_action_use); + } + action = ItemInfoActivity.ItemInfoAction.use; + } + if (isInCombat && ap > 0) { + enabled = world.model.player.hasAPs(ap); + } + + Intent intent = Dialogs.getIntentForItemInfo(getActivity(), itemType.id, action, text, enabled, null); + startActivityForResult(intent, INTENTREQUEST_ITEMINFO); + } + + private void reloadShownCategory(int v) { // Apologies about the code duplication, + // just didn't seem to make sense as an array, although I did create a nice array for skill category adapters. + + // Decide which category to show + if (v == 0) { //All items + inventoryList.setAdapter(inventoryListAdapter); + inventoryListAdapter.notifyDataSetChanged(); + } else if (v == 1) { //Weapon items + inventoryWeaponsListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildWeaponItems(), player, wornTiles); + inventoryList.setAdapter(inventoryWeaponsListAdapter); + inventoryWeaponsListAdapter.notifyDataSetChanged(); + } else if (v == 2) { //Armor items + inventoryArmorListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildArmorItems(), player, wornTiles); + inventoryList.setAdapter(inventoryArmorListAdapter); + inventoryArmorListAdapter.notifyDataSetChanged(); + } else if (v == 3) { //Usable items + inventoryUsableListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildUsableItems(), player, wornTiles); + inventoryList.setAdapter(inventoryUsableListAdapter); + inventoryUsableListAdapter.notifyDataSetChanged(); + } else if (v == 4) { //Quest items + inventoryQuestListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildQuestItems(), player, wornTiles); + inventoryList.setAdapter(inventoryQuestListAdapter); + inventoryQuestListAdapter.notifyDataSetChanged(); + } else if (v == 5) { //Other items + inventoryOtherListAdapter = new ItemContainerAdapter(getActivity(), world.tileManager, player.inventory.buildOtherItems(), player, wornTiles); + inventoryList.setAdapter(inventoryOtherListAdapter); + inventoryOtherListAdapter.notifyDataSetChanged(); + } + //updateItemList(); + } + + private void reloadShownSort(Inventory inv) { + int selected = world.model.uiSelections.selectedInventorySort; + + inventoryListAdapter.reloadShownSort(selected, world.model.uiSelections.oldSortSelection, player.inventory, player); + + // Currently not functional, perhaps because selection only updates when changed. + if (world.model.uiSelections.oldSortSelection == selected) + world.model.uiSelections.oldSortSelection = 0; + else world.model.uiSelections.oldSortSelection = selected; + updateItemList(); + } + +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java index aa7cd8efd..70b6fe9e0 100644 --- a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/tiles/TileManager.java @@ -1,525 +1,537 @@ -package com.gpl.rpg.AndorsTrail.resource.tiles; - -import java.util.HashMap; -import java.util.HashSet; - -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; -import android.os.AsyncTask; -import android.widget.ImageView; -import android.widget.TextView; - -import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; -import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences; -import com.gpl.rpg.AndorsTrail.R; -import com.gpl.rpg.AndorsTrail.context.WorldContext; -import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType; -import com.gpl.rpg.AndorsTrail.model.actor.Monster; -import com.gpl.rpg.AndorsTrail.model.actor.Player; -import com.gpl.rpg.AndorsTrail.model.item.Inventory; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; -import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; -import com.gpl.rpg.AndorsTrail.model.item.ItemType; -import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; -import com.gpl.rpg.AndorsTrail.model.map.MapObject; -import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; -import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; -import com.gpl.rpg.AndorsTrail.model.map.TMXMapTranslator; -import com.gpl.rpg.AndorsTrail.util.L; - -public final class TileManager { - - public static final int BEGIN_ID = 1; - - public static final int CHAR_HERO_0 = BEGIN_ID; - public static final int CHAR_HERO_1 = CHAR_HERO_0+1; - public static final int CHAR_HERO_2 = CHAR_HERO_1+1; - //Default hero - public static final int CHAR_HERO = CHAR_HERO_0; - //Max hero icon ID in this version. - public static final int LAST_HERO = CHAR_HERO_2; - - public static final int iconID_selection_red = CHAR_HERO_2+1; - public static final int iconID_selection_yellow = iconID_selection_red+1; - public static final int iconID_attackselect = iconID_selection_red; - public static final int iconID_moveselect = iconID_selection_yellow; - public static final int iconID_groundbag = iconID_moveselect+1; - public static final int iconID_boxopened = iconID_groundbag+1; - public static final int iconID_boxclosed = iconID_boxopened+1; - public static final int iconID_shop = iconID_groundbag; - public static final int iconID_unassigned_quickslot = iconID_groundbag; - public static final int iconID_selection_blue = iconID_boxclosed+1; - public static final int iconID_selection_purple = iconID_selection_blue+1; - public static final int iconID_selection_green = iconID_selection_purple+1; - - public static final int iconID_splatter_red_1a = iconID_selection_green+1; - public static final int iconID_splatter_red_1b = iconID_splatter_red_1a+1; - public static final int iconID_splatter_red_2a = iconID_splatter_red_1b+1; - public static final int iconID_splatter_red_2b = iconID_splatter_red_2a+1; - public static final int iconID_splatter_brown_1a = iconID_splatter_red_2b+1; - public static final int iconID_splatter_brown_1b = iconID_splatter_brown_1a+1; - public static final int iconID_splatter_brown_2a = iconID_splatter_brown_1b+1; - public static final int iconID_splatter_brown_2b = iconID_splatter_brown_2a+1; - public static final int iconID_splatter_white_1a = iconID_splatter_brown_2b+1; - public static final int iconID_splatter_white_1b = iconID_splatter_white_1a+1; - - public static final int iconID_immunity_overlay = iconID_splatter_white_1b+1; - - - public int tileSize; - public float density; - public float uiIconScale; - - public int viewTileSize; - public float scale; - - - public final TileCache tileCache = new TileCache(); - public final TileCollection preloadedTiles = new TileCollection(116); - public TileCollection currentMapTiles; - public TileCollection adjacentMapTiles; - private final HashSet preloadedTileIDs = new HashSet(); - - - public TileCollection loadTilesFor(HashSet tileIDs, Resources r) { - return tileCache.loadTilesFor(tileIDs, r); - } - - public TileCollection loadTilesFor(ItemContainer container, Resources r) { - return tileCache.loadTilesFor(getTileIDsFor(container), r); - } - - public HashSet getTileIDsFor(ItemContainer container) { - HashSet iconIDs = new HashSet(); - for(ItemEntry i : container.items) { - iconIDs.add(i.itemType.iconID); - } - return iconIDs; - } - - public TileCollection loadTilesFor(Inventory inventory, Resources r) { - HashSet iconIDs = getTileIDsFor(inventory); - for (Inventory.WearSlot slot : Inventory.WearSlot.values()) { - ItemType t = inventory.getItemTypeInWearSlot(slot); - if (t != null) iconIDs.add(t.iconID); - } - return tileCache.loadTilesFor(iconIDs, r); - } - - public TileCollection loadTilesFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world, Resources r) { - HashSet iconIDs = getTileIDsFor(map, tileMap, world); - TileCollection result = tileCache.loadTilesFor(iconIDs, r); - for(int i : preloadedTileIDs) { - result.setBitmap(i, preloadedTiles.getBitmap(i)); - } - return result; - } - - public HashSet getTileIDsFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world) { - HashSet iconIDs = new HashSet(); - for (MonsterSpawnArea a : map.spawnAreas) { - for (String monsterTypeID : a.monsterTypeIDs) { - iconIDs.add(world.monsterTypes.getMonsterType(monsterTypeID).iconID); - } - // Add icons for monsters that are already spawned, but that do not belong to the group of - // monsters that usually spawn here. This could happen if we change the contents of spawn- - // areas in a later release, - for (Monster m : a.monsters) { - iconIDs.add(m.iconID); - } - } - iconIDs.addAll(tileMap.usedTileIDs); - return iconIDs; - } - - public void setDensity(Resources r) { - density = r.getDisplayMetrics().density; - uiIconScale = 100 * density; -// tileSize = (int) (32 * density); - if (density < 1) tileSize = (int) (32 * density); - else tileSize = 32; - } - - public void updatePreferences(AndorsTrailPreferences prefs) { - float densityScaler = 1; - if (density > 1) densityScaler = density; - scale = prefs.scalingFactor * densityScaler; - viewTileSize = (int) (tileSize * prefs.scalingFactor * densityScaler); - } - - - - public void setImageViewTile(Resources res, TextView textView, Monster monster) { setImageViewTileForMonster(res, textView, monster.iconID); } - public void setImageViewTile(Resources res, TextView textView, Player player) { setImageViewTileForPlayer(res, textView, player.iconID); } - public void setImageViewTileForMonster(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, currentMapTiles.getBitmap(iconID)); } - public void setImageViewTileForPlayer(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); } - public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID)); } - public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); } - public void setImageViewTileForUIIcon(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); } - private void setImageViewTile(Resources res, TextView textView, Bitmap b) { - if (density > 1) { - setImageViewTile(textView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true))); - } else { - setImageViewTile(textView, new BitmapDrawable(res, b)); - } - } - public void setImageViewTile(Resources res, TextView textView, Bitmap b, boolean immunityOverlay) { - if (!immunityOverlay) setImageViewTile(res, textView, b); - else { - Drawable[] layers = new Drawable[2]; - if (density > 1) { - layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)); - layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); - } else { - layers[0] = new BitmapDrawable(res, b); - layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); - } - LayerDrawable layered = new LayerDrawable(layers); - setImageViewTile(textView, layered); - } - } - private void setImageViewTile(TextView textView, Drawable d) { - /*if (density > 1) { - ScaleDrawable sd = new ScaleDrawable(d, 0, uiIconScale, uiIconScale); - sd.setLevel(8000); - d.setBounds(0, 0, (int)(tileSize * density), (int)(tileSize * density)); - textView.setCompoundDrawables(sd, null, null, null); - } - else */textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null); - } - - public void setImageViewTileForSingleItemType(Resources res, TextView textView, ItemType itemType) { - final Bitmap icon = tileCache.loadSingleTile(itemType.iconID, res); - setImageViewTile(res, textView, itemType, icon); - } - public void setImageViewTile(Resources res, TextView textView, ItemType itemType, TileCollection itemTileCollection) { - final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID); - setImageViewTile(res, textView, itemType, icon); - } - private void setImageViewTile(Resources res, TextView textView, ItemType itemType, Bitmap icon) { - final int overlayIconID = itemType.getOverlayTileID(); - if (overlayIconID != -1) { - - if (density > 1) { - - setImageViewTile(textView, - new LayerDrawable(new Drawable[] { - new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true)) - ,new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true)) - }) - ); - } else { - setImageViewTile(textView, - new LayerDrawable(new Drawable[] { - new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID)) - ,new BitmapDrawable(res, icon) - }) - ); - } - } else { - setImageViewTile(res, textView, icon); - } - } - - public void setImageViewTile(Resources res, ImageView imageView, Monster monster) { setImageViewTileForMonster(res, imageView, monster.iconID); } - public void setImageViewTile(Resources res, ImageView imageView, Player player) { setImageViewTileForPlayer(res, imageView, player.iconID); } - public void setImageViewTileForMonster(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, currentMapTiles.getBitmap(iconID)); } - public void setImageViewTileForPlayer(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); } -// public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID)); } - public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); } - public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay, String exponent, String index) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay, exponent, index); } - public void setImageViewTileForUIIcon(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); } - public void setImageViewTile(Resources res, ImageView imageView, Bitmap b) { - if (density > 1) { - setImageViewTile(imageView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true))); - } else { - setImageViewTile(imageView, new BitmapDrawable(res, b)); - } - } - public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay) { - setImageViewTile(res, imageView, b, immunityOverlay, null, null); - } - public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay, String exponent, String index) { - if (!immunityOverlay && exponent == null && index == null) setImageViewTile(res, imageView, b); - else { - Drawable[] layers = new Drawable[1+ - (immunityOverlay ? 1 : 0)+ - (exponent != null ? 1 : 0)+ - (index != null ? 1 : 0)]; - int tileWidth; - if (density > 1) { - tileWidth = (int)(tileSize*density); - layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, tileWidth, tileWidth, true)); - } else { - tileWidth = tileSize; - layers[0] = new BitmapDrawable(res, b); - } - int nextIndex = 1; - if (immunityOverlay) { - layers[nextIndex] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); - nextIndex++; - } - if (exponent != null) { - layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, exponent, TextDrawable.Align.TOP_RIGHT); - nextIndex++; - } - if (index != null) { - layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, index, TextDrawable.Align.BOTTOM_RIGHT); - nextIndex++; - } - LayerDrawable layered = new LayerDrawable(layers); - setImageViewTile(imageView, layered); - } - } - - public void setImageViewTile(ImageView imageView, Drawable d) { - imageView.setImageDrawable(d); - } - - public void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, TileCollection itemTileCollection) { - final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID); - setImageViewTile(res, imageView, itemType, icon); - } - public void setImageViewTileWithOverlay(Resources res, ImageView imageView, int overlayIconID, Bitmap icon, boolean overlayAbove) { - if (overlayIconID != -1) { - Drawable overlayDrawable, iconDrawable; - if (density > 1) { - overlayDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true)); - iconDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true)); - } else { - overlayDrawable = new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID)); - iconDrawable = new BitmapDrawable(res, icon); - } - - if (overlayAbove) { - LayerDrawable layered = new LayerDrawable(new Drawable[] { - iconDrawable - ,overlayDrawable - }); - setImageViewTile(imageView, layered); - } else { - LayerDrawable layered = new LayerDrawable(new Drawable[] { - overlayDrawable - ,iconDrawable - }); - setImageViewTile(imageView, layered); - } - } else { - setImageViewTile(res, imageView, icon); - } - } - private void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, Bitmap icon) { - final int overlayIconID = itemType.getOverlayTileID(); - setImageViewTileWithOverlay(res, imageView, overlayIconID, icon, false); - } - - public void loadPreloadedTiles(Resources r) { - int maxTileID = tileCache.getMaxTileID(); - if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { - if (maxTileID > preloadedTiles.maxTileID) { - L.log("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now."); - throw new IndexOutOfBoundsException("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now."); - } - } - for(int i = TileManager.BEGIN_ID; i <= maxTileID; ++i) { - preloadedTileIDs.add(i); - } - tileCache.loadTilesFor(preloadedTileIDs, r, preloadedTiles); - } - - private final HashMap> tileIDsPerMap = new HashMap>(); - private void addTileIDsFor(HashSet dest, String mapName, final Resources res, final WorldContext world) { - HashSet cachedTileIDs = tileIDsPerMap.get(mapName); - if (cachedTileIDs == null) { - PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName); - if (adjacentMap == null) return; - LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap); - cachedTileIDs = getTileIDsFor(adjacentMap, adjacentMapTiles, world); - tileIDsPerMap.put(mapName, cachedTileIDs); - } - dest.addAll(cachedTileIDs); - } - public void cacheAdjacentMaps(final Resources res, final WorldContext world, final PredefinedMap nextMap) { - (new AsyncTask() { - @Override - protected Void doInBackground(Void... arg0) { - adjacentMapTiles = null; - - HashSet adjacentMapNames = new HashSet(); - for (MapObject o : nextMap.eventObjects) { - if (o.type != MapObject.MapObjectType.newmap) continue; - if (o.map == null) continue; - adjacentMapNames.add(o.map); - } - - HashSet tileIDs = new HashSet(); - for (String mapName : adjacentMapNames) { - addTileIDsFor(tileIDs, mapName, res, world); - } - - long freeMemRequired = tileSize * tileSize * tileIDs.size() * 4 /*RGBA_8888*/ * 2 /*Require twice the needed size, to leave room for others*/; - Runtime r = Runtime.getRuntime(); - - if (r.maxMemory() - r.totalMemory() > freeMemRequired) { - adjacentMapTiles = tileCache.loadTilesFor(tileIDs, res); - } - return null; - } - }).execute(); - } - - private static class TextDrawable extends Drawable { - - private String text; - private int size = 15; - private Align align = Align.CENTER; - private Paint mFillPaint; - private Paint mStrokePaint; - private Rect textBounds; - private int cHeight; - private int cWidth; - - public enum Align { - TOP, - TOP_LEFT, - TOP_RIGHT, - CENTER, - LEFT, - RIGHT, - BOTTOM, - BOTTOM_LEFT, - BOTTOM_RIGHT - } - - public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align, int size) { - this.text= text; - this.align = align; - this.size = size; - this.cWidth = cWidth; - this.cHeight = cHeight; - init(res); - } - - public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align) { - this.text= text; - this.align = align; - this.cWidth = cWidth; - this.cHeight = cHeight; - init(res); - } - - public TextDrawable(Resources res, int cWidth, int cHeight, String text) { - this.text= text; - this.cWidth = cWidth; - this.cHeight = cHeight; - init(res); - } - - public void init(Resources res) { - mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - - mFillPaint.setColor(res.getColor(R.color.ui_blue_palette_text_gray_light)); -// mFillPaint.setShadowLayer(5f * res.getDisplayMetrics().scaledDensity, 1, 1, res.getColor(android.R.color.black)); - mFillPaint.setStyle(Paint.Style.FILL); - mFillPaint.setTextSize(size * res.getDisplayMetrics().scaledDensity); - textBounds = new Rect(); - mFillPaint.getTextBounds(text, 0, text.length(), textBounds); - mStrokePaint=new Paint(mFillPaint); -// mStrokePaint.setStyle(Paint.Style.FILL); -// mStrokePaint.setStrokeWidth(1f * res.getDisplayMetrics().scaledDensity); - mStrokePaint.setColor(res.getColor(R.color.ui_blue_palette_blue_mid)); - } - - - - @Override - public void draw(Canvas canvas) { - float x,y; - switch (align) { - case BOTTOM: - case BOTTOM_LEFT: - case BOTTOM_RIGHT: - y = cHeight - textBounds.bottom; - break; - case CENTER: - case LEFT: - case RIGHT: - y = (cHeight - textBounds.height()) / 2; - break; - case TOP: - case TOP_LEFT: - case TOP_RIGHT: - default: - y = 0 - textBounds.top; - break; - } - - switch (align) { - case BOTTOM: - case CENTER: - case TOP: - x = (cWidth - textBounds.width()) / 2; - break; - case BOTTOM_LEFT: - case LEFT: - case TOP_LEFT: - default: - x = 0 - textBounds.left; - break; - case BOTTOM_RIGHT: - case RIGHT: - case TOP_RIGHT: - x = cWidth - textBounds.right; - break; - - } - canvas.drawRect(x, y - textBounds.height(), x + textBounds.width(), y, mStrokePaint); - canvas.drawText(text, x, y, mFillPaint); -// canvas.drawText(text, x, y, mStrokePaint); - } - - @Override - public void setAlpha(int alpha) { - mFillPaint.setAlpha(alpha); -// mStrokePaint.setAlpha(alpha); - } - - @Override - public void setColorFilter(ColorFilter cf) { - mFillPaint.setColorFilter(cf); -// mStrokePaint.setColorFilter(cf); - } - - @Override - public int getOpacity() { - return mFillPaint.getAlpha(); - } - - @Override - public int getIntrinsicWidth() { - return cWidth; - } - - @Override - public int getIntrinsicHeight() { - return cHeight; - } - - @Override - public boolean getPadding(Rect padding) { - padding.bottom = 0; - padding.top = 0; - padding.left = 0; - padding.right = 0; - return false; - } - - } -} +package com.gpl.rpg.AndorsTrail.resource.tiles; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.Rect; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.os.AsyncTask; +import android.widget.ImageView; +import android.widget.TextView; + +import com.gpl.rpg.AndorsTrail.AndorsTrailApplication; +import com.gpl.rpg.AndorsTrail.AndorsTrailPreferences; +import com.gpl.rpg.AndorsTrail.R; +import com.gpl.rpg.AndorsTrail.context.WorldContext; +import com.gpl.rpg.AndorsTrail.model.ability.ActorConditionType; +import com.gpl.rpg.AndorsTrail.model.actor.Monster; +import com.gpl.rpg.AndorsTrail.model.actor.Player; +import com.gpl.rpg.AndorsTrail.model.item.Inventory; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer; +import com.gpl.rpg.AndorsTrail.model.item.ItemContainer.ItemEntry; +import com.gpl.rpg.AndorsTrail.model.item.ItemType; +import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap; +import com.gpl.rpg.AndorsTrail.model.map.MapObject; +import com.gpl.rpg.AndorsTrail.model.map.MonsterSpawnArea; +import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap; +import com.gpl.rpg.AndorsTrail.model.map.TMXMapTranslator; +import com.gpl.rpg.AndorsTrail.util.L; + +public final class TileManager { + + public static final int BEGIN_ID = 1; + + public static final int CHAR_HERO_0 = BEGIN_ID; + public static final int CHAR_HERO_1 = CHAR_HERO_0+1; + public static final int CHAR_HERO_2 = CHAR_HERO_1+1; + //Default hero + public static final int CHAR_HERO = CHAR_HERO_0; + //Max hero icon ID in this version. + public static final int LAST_HERO = CHAR_HERO_2; + + public static final int iconID_selection_red = CHAR_HERO_2+1; + public static final int iconID_selection_yellow = iconID_selection_red+1; + public static final int iconID_attackselect = iconID_selection_red; + public static final int iconID_moveselect = iconID_selection_yellow; + public static final int iconID_groundbag = iconID_moveselect+1; + public static final int iconID_boxopened = iconID_groundbag+1; + public static final int iconID_boxclosed = iconID_boxopened+1; + public static final int iconID_shop = iconID_groundbag; + public static final int iconID_unassigned_quickslot = iconID_groundbag; + public static final int iconID_selection_blue = iconID_boxclosed+1; + public static final int iconID_selection_purple = iconID_selection_blue+1; + public static final int iconID_selection_green = iconID_selection_purple+1; + + public static final int iconID_splatter_red_1a = iconID_selection_green+1; + public static final int iconID_splatter_red_1b = iconID_splatter_red_1a+1; + public static final int iconID_splatter_red_2a = iconID_splatter_red_1b+1; + public static final int iconID_splatter_red_2b = iconID_splatter_red_2a+1; + public static final int iconID_splatter_brown_1a = iconID_splatter_red_2b+1; + public static final int iconID_splatter_brown_1b = iconID_splatter_brown_1a+1; + public static final int iconID_splatter_brown_2a = iconID_splatter_brown_1b+1; + public static final int iconID_splatter_brown_2b = iconID_splatter_brown_2a+1; + public static final int iconID_splatter_white_1a = iconID_splatter_brown_2b+1; + public static final int iconID_splatter_white_1b = iconID_splatter_white_1a+1; + + public static final int iconID_immunity_overlay = iconID_splatter_white_1b+1; + + + public int tileSize; + public float density; + public float uiIconScale; + + public int viewTileSize; + public float scale; + + + public final TileCache tileCache = new TileCache(); + public final TileCollection preloadedTiles = new TileCollection(116); + public TileCollection currentMapTiles; + public TileCollection adjacentMapTiles; + private final HashSet preloadedTileIDs = new HashSet(); + + + public TileCollection loadTilesFor(Collection tileIDs, Resources r) { + return tileCache.loadTilesFor(tileIDs, r); + } + + public TileCollection loadTilesFor(ItemContainer container, Resources r) { + return tileCache.loadTilesFor(getTileIDsFor(container), r); + } + + public HashSet getTileIDsFor(ItemContainer container) { + HashSet iconIDs = new HashSet(); + for(ItemEntry i : container.items) { + iconIDs.add(i.itemType.iconID); + } + return iconIDs; + } + + public TileCollection loadTilesFor(Inventory inventory, Resources r) { + HashSet iconIDs = getTileIDsFor(inventory); + for (Inventory.WearSlot slot : Inventory.WearSlot.values()) { + ItemType t = inventory.getItemTypeInWearSlot(slot); + if (t != null) iconIDs.add(t.iconID); + } + return tileCache.loadTilesFor(iconIDs, r); + } + + public TileCollection loadTilesFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world, Resources r) { + HashSet iconIDs = getTileIDsFor(map, tileMap, world); + TileCollection result = tileCache.loadTilesFor(iconIDs, r); + for(int i : preloadedTileIDs) { + result.setBitmap(i, preloadedTiles.getBitmap(i)); + } + return result; + } + + public HashSet getTileIDsFor(PredefinedMap map, LayeredTileMap tileMap, WorldContext world) { + HashSet iconIDs = new HashSet(); + for (MonsterSpawnArea a : map.spawnAreas) { + for (String monsterTypeID : a.monsterTypeIDs) { + iconIDs.add(world.monsterTypes.getMonsterType(monsterTypeID).iconID); + } + // Add icons for monsters that are already spawned, but that do not belong to the group of + // monsters that usually spawn here. This could happen if we change the contents of spawn- + // areas in a later release, + for (Monster m : a.monsters) { + iconIDs.add(m.iconID); + } + } + iconIDs.addAll(tileMap.usedTileIDs); + return iconIDs; + } + + public void setDensity(Resources r) { + density = r.getDisplayMetrics().density; + uiIconScale = 100 * density; +// tileSize = (int) (32 * density); + if (density < 1) tileSize = (int) (32 * density); + else tileSize = 32; + } + + public void updatePreferences(AndorsTrailPreferences prefs) { + float densityScaler = 1; + if (density > 1) densityScaler = density; + scale = prefs.scalingFactor * densityScaler; + viewTileSize = (int) (tileSize * prefs.scalingFactor * densityScaler); + } + + + + public void setImageViewTile(Resources res, TextView textView, Monster monster) { setImageViewTileForMonster(res, textView, monster.iconID); } + public void setImageViewTile(Resources res, TextView textView, Player player) { setImageViewTileForPlayer(res, textView, player.iconID); } + public void setImageViewTileForMonster(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, currentMapTiles.getBitmap(iconID)); } + public void setImageViewTileForPlayer(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); } + public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID)); } + public void setImageViewTile(Resources res, TextView textView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, textView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); } + public void setImageViewTileForUIIcon(Resources res, TextView textView, int iconID) { setImageViewTile(res, textView, preloadedTiles.getBitmap(iconID)); } + private void setImageViewTile(Resources res, TextView textView, Bitmap b) { + if (density > 1) { + setImageViewTile(textView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true))); + } else { + setImageViewTile(textView, new BitmapDrawable(res, b)); + } + } + public void setImageViewTile(Resources res, TextView textView, Bitmap b, boolean immunityOverlay) { + if (!immunityOverlay) setImageViewTile(res, textView, b); + else { + Drawable[] layers = new Drawable[2]; + if (density > 1) { + layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true)); + layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); + } else { + layers[0] = new BitmapDrawable(res, b); + layers[1] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); + } + LayerDrawable layered = new LayerDrawable(layers); + setImageViewTile(textView, layered); + } + } + private void setImageViewTile(TextView textView, Drawable d) { + /*if (density > 1) { + ScaleDrawable sd = new ScaleDrawable(d, 0, uiIconScale, uiIconScale); + sd.setLevel(8000); + d.setBounds(0, 0, (int)(tileSize * density), (int)(tileSize * density)); + textView.setCompoundDrawables(sd, null, null, null); + } + else */textView.setCompoundDrawablesWithIntrinsicBounds(d, null, null, null); + } + + public void setImageViewTileForSingleItemType(Resources res, TextView textView, ItemType itemType) { + final Bitmap icon = tileCache.loadSingleTile(itemType.iconID, res); + setImageViewTile(res, textView, itemType, icon); + } + public void setImageViewTile(Resources res, TextView textView, ItemType itemType, TileCollection itemTileCollection) { + final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID); + setImageViewTile(res, textView, itemType, icon); + } + private void setImageViewTile(Resources res, TextView textView, ItemType itemType, Bitmap icon) { + final int overlayIconID = itemType.getOverlayTileID(); + if (overlayIconID != -1) { + + if (density > 1) { + + setImageViewTile(textView, + new LayerDrawable(new Drawable[] { + new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true)) + ,new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true)) + }) + ); + } else { + setImageViewTile(textView, + new LayerDrawable(new Drawable[] { + new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID)) + ,new BitmapDrawable(res, icon) + }) + ); + } + } else { + setImageViewTile(res, textView, icon); + } + } + + public void setImageViewTile(Resources res, ImageView imageView, Monster monster) { setImageViewTileForMonster(res, imageView, monster.iconID); } + public void setImageViewTile(Resources res, ImageView imageView, Player player) { setImageViewTileForPlayer(res, imageView, player.iconID); } + public void setImageViewTileForMonster(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, currentMapTiles.getBitmap(iconID)); } + public void setImageViewTileForPlayer(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); } +// public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID)); } + public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay); } + public void setImageViewTile(Resources res, ImageView imageView, ActorConditionType conditionType, boolean immunityOverlay, String exponent, String index) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(conditionType.iconID), immunityOverlay, exponent, index); } + public void setImageViewTileForUIIcon(Resources res, ImageView imageView, int iconID) { setImageViewTile(res, imageView, preloadedTiles.getBitmap(iconID)); } + public void setImageViewTile(Resources res, ImageView imageView, Bitmap b) { + if (density > 1) { + setImageViewTile(imageView, new BitmapDrawable(res, Bitmap.createScaledBitmap(b, (int)(tileSize*density), (int)(tileSize*density), true))); + } else { + setImageViewTile(imageView, new BitmapDrawable(res, b)); + } + } + public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay) { + setImageViewTile(res, imageView, b, immunityOverlay, null, null); + } + public void setImageViewTile(Resources res, ImageView imageView, Bitmap b, boolean immunityOverlay, String exponent, String index) { + if (!immunityOverlay && exponent == null && index == null) setImageViewTile(res, imageView, b); + else { + Drawable[] layers = new Drawable[1+ + (immunityOverlay ? 1 : 0)+ + (exponent != null ? 1 : 0)+ + (index != null ? 1 : 0)]; + int tileWidth; + if (density > 1) { + tileWidth = (int)(tileSize*density); + layers[0] = new BitmapDrawable(res, Bitmap.createScaledBitmap(b, tileWidth, tileWidth, true)); + } else { + tileWidth = tileSize; + layers[0] = new BitmapDrawable(res, b); + } + int nextIndex = 1; + if (immunityOverlay) { + layers[nextIndex] = new BitmapDrawable(res, preloadedTiles.getBitmap(iconID_immunity_overlay)); + nextIndex++; + } + if (exponent != null) { + layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, exponent, TextDrawable.Align.TOP_RIGHT); + nextIndex++; + } + if (index != null) { + layers[nextIndex] = new TextDrawable(res, tileWidth, tileWidth, index, TextDrawable.Align.BOTTOM_RIGHT); + nextIndex++; + } + LayerDrawable layered = new LayerDrawable(layers); + setImageViewTile(imageView, layered); + } + } + + public void setImageViewTile(ImageView imageView, Drawable d) { + imageView.setImageDrawable(d); + } + + public void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, TileCollection itemTileCollection) { + final Bitmap icon = itemTileCollection.getBitmap(itemType.iconID); + setImageViewTile(res, imageView, itemType, icon); + } + public void setImageViewTileWithOverlay(Resources res, ImageView imageView, int overlayIconID, Bitmap icon, boolean overlayAbove) { + if (overlayIconID != -1) { + Drawable overlayDrawable, iconDrawable; + if (density > 1) { + overlayDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(preloadedTiles.getBitmap(overlayIconID), (int)(tileSize*density), (int)(tileSize*density), true)); + iconDrawable = new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true)); + } else { + overlayDrawable = new BitmapDrawable(res, preloadedTiles.getBitmap(overlayIconID)); + iconDrawable = new BitmapDrawable(res, icon); + } + + if (overlayAbove) { + LayerDrawable layered = new LayerDrawable(new Drawable[] { + iconDrawable + ,overlayDrawable + }); + setImageViewTile(imageView, layered); + } else { + LayerDrawable layered = new LayerDrawable(new Drawable[] { + overlayDrawable + ,iconDrawable + }); + setImageViewTile(imageView, layered); + } + } else { + setImageViewTile(res, imageView, icon); + } + } + private void setImageViewTile(Resources res, ImageView imageView, ItemType itemType, Bitmap icon) { + final int overlayIconID = itemType.getOverlayTileID(); + setImageViewTileWithOverlay(res, imageView, overlayIconID, icon, false); + } + + + + public Drawable getDrawableForItem(Resources res, int iconID, TileCollection itemTileCollection) { + final Bitmap icon = itemTileCollection.getBitmap(iconID); + if (density > 1) { + return new BitmapDrawable(res, Bitmap.createScaledBitmap(icon, (int)(tileSize*density), (int)(tileSize*density), true)); + } else { + return new BitmapDrawable(res, icon); + } + } + + public void loadPreloadedTiles(Resources r) { + int maxTileID = tileCache.getMaxTileID(); + if (AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) { + if (maxTileID > preloadedTiles.maxTileID) { + L.log("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now."); + throw new IndexOutOfBoundsException("ERROR: TileManager.preloadedTiles needs to be initialized with at least " + maxTileID + " slots. Application will crash now."); + } + } + for(int i = TileManager.BEGIN_ID; i <= maxTileID; ++i) { + preloadedTileIDs.add(i); + } + tileCache.loadTilesFor(preloadedTileIDs, r, preloadedTiles); + } + + private final HashMap> tileIDsPerMap = new HashMap>(); + private void addTileIDsFor(HashSet dest, String mapName, final Resources res, final WorldContext world) { + HashSet cachedTileIDs = tileIDsPerMap.get(mapName); + if (cachedTileIDs == null) { + PredefinedMap adjacentMap = world.maps.findPredefinedMap(mapName); + if (adjacentMap == null) return; + LayeredTileMap adjacentMapTiles = TMXMapTranslator.readLayeredTileMap(res, tileCache, adjacentMap); + cachedTileIDs = getTileIDsFor(adjacentMap, adjacentMapTiles, world); + tileIDsPerMap.put(mapName, cachedTileIDs); + } + dest.addAll(cachedTileIDs); + } + public void cacheAdjacentMaps(final Resources res, final WorldContext world, final PredefinedMap nextMap) { + (new AsyncTask() { + @Override + protected Void doInBackground(Void... arg0) { + adjacentMapTiles = null; + + HashSet adjacentMapNames = new HashSet(); + for (MapObject o : nextMap.eventObjects) { + if (o.type != MapObject.MapObjectType.newmap) continue; + if (o.map == null) continue; + adjacentMapNames.add(o.map); + } + + HashSet tileIDs = new HashSet(); + for (String mapName : adjacentMapNames) { + addTileIDsFor(tileIDs, mapName, res, world); + } + + long freeMemRequired = tileSize * tileSize * tileIDs.size() * 4 /*RGBA_8888*/ * 2 /*Require twice the needed size, to leave room for others*/; + Runtime r = Runtime.getRuntime(); + + if (r.maxMemory() - r.totalMemory() > freeMemRequired) { + adjacentMapTiles = tileCache.loadTilesFor(tileIDs, res); + } + return null; + } + }).execute(); + } + + private static class TextDrawable extends Drawable { + + private String text; + private int size = 15; + private Align align = Align.CENTER; + private Paint mFillPaint; + private Paint mStrokePaint; + private Rect textBounds; + private int cHeight; + private int cWidth; + + public enum Align { + TOP, + TOP_LEFT, + TOP_RIGHT, + CENTER, + LEFT, + RIGHT, + BOTTOM, + BOTTOM_LEFT, + BOTTOM_RIGHT + } + + public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align, int size) { + this.text= text; + this.align = align; + this.size = size; + this.cWidth = cWidth; + this.cHeight = cHeight; + init(res); + } + + public TextDrawable(Resources res, int cWidth, int cHeight, String text, Align align) { + this.text= text; + this.align = align; + this.cWidth = cWidth; + this.cHeight = cHeight; + init(res); + } + + public TextDrawable(Resources res, int cWidth, int cHeight, String text) { + this.text= text; + this.cWidth = cWidth; + this.cHeight = cHeight; + init(res); + } + + public void init(Resources res) { + mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + mFillPaint.setColor(res.getColor(R.color.ui_blue_palette_text_gray_light)); +// mFillPaint.setShadowLayer(5f * res.getDisplayMetrics().scaledDensity, 1, 1, res.getColor(android.R.color.black)); + mFillPaint.setStyle(Paint.Style.FILL); + mFillPaint.setTextSize(size * res.getDisplayMetrics().scaledDensity); + textBounds = new Rect(); + mFillPaint.getTextBounds(text, 0, text.length(), textBounds); + mStrokePaint=new Paint(mFillPaint); +// mStrokePaint.setStyle(Paint.Style.FILL); +// mStrokePaint.setStrokeWidth(1f * res.getDisplayMetrics().scaledDensity); + mStrokePaint.setColor(res.getColor(R.color.ui_blue_palette_blue_mid)); + } + + + + @Override + public void draw(Canvas canvas) { + float x,y; + switch (align) { + case BOTTOM: + case BOTTOM_LEFT: + case BOTTOM_RIGHT: + y = cHeight - textBounds.bottom; + break; + case CENTER: + case LEFT: + case RIGHT: + y = (cHeight - textBounds.height()) / 2; + break; + case TOP: + case TOP_LEFT: + case TOP_RIGHT: + default: + y = 0 - textBounds.top; + break; + } + + switch (align) { + case BOTTOM: + case CENTER: + case TOP: + x = (cWidth - textBounds.width()) / 2; + break; + case BOTTOM_LEFT: + case LEFT: + case TOP_LEFT: + default: + x = 0 - textBounds.left; + break; + case BOTTOM_RIGHT: + case RIGHT: + case TOP_RIGHT: + x = cWidth - textBounds.right; + break; + + } + canvas.drawRect(x, y - textBounds.height(), x + textBounds.width(), y, mStrokePaint); + canvas.drawText(text, x, y, mFillPaint); +// canvas.drawText(text, x, y, mStrokePaint); + } + + @Override + public void setAlpha(int alpha) { + mFillPaint.setAlpha(alpha); +// mStrokePaint.setAlpha(alpha); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mFillPaint.setColorFilter(cf); +// mStrokePaint.setColorFilter(cf); + } + + @Override + public int getOpacity() { + return mFillPaint.getAlpha(); + } + + @Override + public int getIntrinsicWidth() { + return cWidth; + } + + @Override + public int getIntrinsicHeight() { + return cHeight; + } + + @Override + public boolean getPadding(Rect padding) { + padding.bottom = 0; + padding.top = 0; + padding.left = 0; + padding.right = 0; + return false; + } + + } +} diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java new file mode 100644 index 000000000..b8ae3ddab --- /dev/null +++ b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/view/CustomMenuInflater.java @@ -0,0 +1,554 @@ +package com.gpl.rpg.AndorsTrail.view; + +import java.util.ArrayList; +import java.util.List; + +import com.gpl.rpg.AndorsTrail.R; +import com.gpl.rpg.AndorsTrail.view.CustomDialogFactory.CustomDialog; + +import android.app.Activity; +import android.app.Dialog; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.ActionProvider; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyEvent; +import android.view.Menu; +import android.view.MenuItem; +import android.view.SubMenu; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.TextView; + +public class CustomMenuInflater { + + public interface MenuItemSelectedListener { + public void onMenuItemSelected(MenuItem item, Object data); + } + + public static void showMenuInDialog(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) { + getMenuDialog(activity, menu, icon, title, data, listener).show(); + } + + public static Dialog getMenuDialog(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) { + View v = getMenuView(activity, menu, icon, title, data, listener); + final CustomDialog dialog = CustomDialogFactory.createDialog(activity, title, icon, null, v, false); + v.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + dialog.dismiss(); + } + }); + + return dialog; + } + + public static View getMenuView(Activity activity, Menu menu, Drawable icon, String title, Object data, MenuItemSelectedListener listener ) { + ViewGroup vg = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_layout, null); + MenuItem item; + for (int i = 0; i < menu.size(); i++) { + item = menu.getItem(i); + if (item.isVisible()) { + if (item.hasSubMenu()) { + addMenuItemView(activity, vg, item, data, listener); + } else { + addSubMenuItemView(activity, vg, icon, title, item, data, listener); + } + } + } + return vg; + } + + private static void addMenuItemView(Activity activity, ViewGroup vg, final MenuItem item, final Object data, final MenuItemSelectedListener listener) { + ViewGroup shell = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_item_layout, vg); + TextView tv = (TextView) shell.findViewById(R.id.custom_menu_item_template); + shell.removeView(tv); + tv.setText(item.getTitle()); + tv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + listener.onMenuItemSelected(item, data); + } + }); + vg.addView(tv); + } + + + + private static void addSubMenuItemView(final Activity activity, ViewGroup vg, final Drawable icon, final String title, final MenuItem item, final Object data, final MenuItemSelectedListener listener) { + ViewGroup shell = (ViewGroup) activity.getLayoutInflater().inflate(R.layout.custom_menu_submenu_layout, vg); + TextView tv = (TextView) shell.findViewById(R.id.custom_submenu_item_template); + shell.removeView(tv); + tv.setText(item.getTitle()); + tv.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + showMenuInDialog(activity, item.getSubMenu(), icon, title, data, listener); + } + }); + vg.addView(tv); + } + + + public static Menu newMenuInstance(Context context) { + return new DummyMenu(context); + } + + private static class DummyMenu implements Menu { + + Context context; + List items = new ArrayList(); + + public DummyMenu(Context context) { + this.context = context; + } + + CharSequence title; + @Override + public MenuItem add(CharSequence title) { + MenuItem item = new DummyMenuItem(context, title, -1, null); + items.add(item); + return item; + } + + @Override + public MenuItem add(int titleRes) { + return add(context.getString(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + MenuItem item = new DummyMenuItem(context, title, itemId, null); + items.add(item); + return item; + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return add(groupId, itemId, order, context.getString(titleRes)); + } + + @Override + public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, + Intent intent, int flags, MenuItem[] outSpecificItems) { + return 0; + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + DummySubMenu sm = new DummySubMenu(context, title); + MenuItem item = new DummyMenuItem(context, title, 0, sm); + items.add(item); + return sm; + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return addSubMenu(context.getString(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + DummySubMenu sm = new DummySubMenu(context, title); + MenuItem item = new DummyMenuItem(context, title, itemId, sm); + items.add(item); + return sm; + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return addSubMenu(groupId, itemId, order, context.getString(titleRes)); + } + + @Override + public void clear() { + items.clear(); + } + + @Override + public void close() { + // TODO Auto-generated method stub + + } + + @Override + public MenuItem findItem(int id) { + MenuItem found = null; + for (MenuItem item : items) { + if (item.getItemId() == id) return item; + if (item.hasSubMenu()) { + found = item.getSubMenu().findItem(id); + if (found != null) return found; + } + } + return null; + } + + @Override + public MenuItem getItem(int index) { + return items.get(index); + } + + @Override + public boolean hasVisibleItems() { + for (MenuItem item : items) { + if (item.isVisible()) return true; + } + return false; + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void removeGroup(int groupId) { + // TODO Auto-generated method stub + + } + + @Override + public void removeItem(int id) { + MenuItem found = null; + for (MenuItem item : items) { + if (item.getItemId() == id) found=item; + if (item.hasSubMenu()) { + item.getSubMenu().removeItem(id); + } + } + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + // TODO Auto-generated method stub + + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + // TODO Auto-generated method stub + + } + + @Override + public void setGroupVisible(int group, boolean visible) { + // TODO Auto-generated method stub + + } + + @Override + public void setQwertyMode(boolean isQwerty) { + // TODO Auto-generated method stub + + } + + @Override + public int size() { + return items.size(); + } + + } + + private static class DummyMenuItem implements MenuItem { + + Context context; + CharSequence title; + int id; + DummySubMenu subMenu; + boolean visible; + + public DummyMenuItem(Context context, CharSequence title, int id, DummySubMenu subMenu) { + this.context = context; + this.title = title; + this.id = id; + this.subMenu = subMenu; + if (subMenu != null) subMenu.setItem(this); + } + + @Override + public boolean collapseActionView() { + return false; + } + + @Override + public boolean expandActionView() { + return false; + } + + @Override + public ActionProvider getActionProvider() { + return null; + } + + @Override + public View getActionView() { + return null; + } + + @Override + public char getAlphabeticShortcut() { + return 0; + } + + @Override + public int getGroupId() { + return 0; + } + + @Override + public Drawable getIcon() { + return null; + } + + @Override + public Intent getIntent() { + return null; + } + + @Override + public int getItemId() { + return id; + } + + @Override + public ContextMenuInfo getMenuInfo() { + return null; + } + + @Override + public char getNumericShortcut() { + return 0; + } + + @Override + public int getOrder() { + return 0; + } + + @Override + public SubMenu getSubMenu() { + return subMenu; + } + + @Override + public CharSequence getTitle() { + return title; + } + + @Override + public CharSequence getTitleCondensed() { + return null; + } + + @Override + public boolean hasSubMenu() { + return subMenu != null; + } + + @Override + public boolean isActionViewExpanded() { + return false; + } + + @Override + public boolean isCheckable() { + return false; + } + + @Override + public boolean isChecked() { + return false; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public boolean isVisible() { + return visible; + } + + @Override + public MenuItem setActionProvider(ActionProvider actionProvider) { + return this; + } + + @Override + public MenuItem setActionView(View view) { + return this; + } + + @Override + public MenuItem setActionView(int resId) { + return this; + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + return this; + } + + @Override + public MenuItem setCheckable(boolean checkable) { + return this; + } + + @Override + public MenuItem setChecked(boolean checked) { + return this; + } + + @Override + public MenuItem setEnabled(boolean enabled) { + return this; + } + + @Override + public MenuItem setIcon(Drawable icon) { + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + return this; + } + + @Override + public MenuItem setIntent(Intent intent) { + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + return this; + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + return this; + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + return this; + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + return this; + } + + @Override + public void setShowAsAction(int actionEnum) { + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + return this; + } + + @Override + public MenuItem setTitle(CharSequence title) { + this.title = title; + return this; + } + + @Override + public MenuItem setTitle(int title) { + setTitle(context.getString(title)); + return this; + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + return this; + } + + @Override + public MenuItem setVisible(boolean visible) { + this.visible = visible; + return this; + } + + } + + private static class DummySubMenu extends DummyMenu implements SubMenu { + + CharSequence title; + MenuItem parent; + + public DummySubMenu(Context context, CharSequence title) { + super(context); + this.title = title; + } + + @Override + public void clearHeader() { + } + + public void setItem(MenuItem item) { + this.parent = item; + } + + @Override + public MenuItem getItem() { + return parent; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + return this; + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + return this; + } + + @Override + public SubMenu setHeaderTitle(int titleRes) { + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + return this; + } + + @Override + public SubMenu setIcon(int iconRes) { + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + return this; + } + + + } +}