/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.common;
import android.content.Context;
import android.widget.ArrayAdapter;
import org.catrobat.catroid.R;
import org.catrobat.catroid.content.BroadcastScript;
import org.catrobat.catroid.content.CollisionScript;
import org.catrobat.catroid.physics.PhysicsCollision;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class MessageContainer {
private static Map<String, List<BroadcastScript>> receiverMap = new HashMap<>();
private static Map<String, List<BroadcastScript>> backupReceiverMap = null;
private static ArrayAdapter<String> messageAdapter = null;
private static Map<String, List<CollisionScript>> collisionReceiverMap = new HashMap<>();
private static int hiddenEntries = 0;
// Suppress default constructor for noninstantiability
private MessageContainer() {
throw new AssertionError();
}
public static void clear() {
receiverMap.clear();
hiddenEntries = 0;
messageAdapter = null;
}
public static void createBackup() {
backupReceiverMap = receiverMap;
receiverMap = new HashMap<>();
}
public static void clearBackup() {
backupReceiverMap = null;
messageAdapter = null;
}
public static void restoreBackup() {
receiverMap = backupReceiverMap;
backupReceiverMap = null;
}
public static void addMessage(String message) {
if (message == null || message.isEmpty()) {
return;
}
if (!PhysicsCollision.isCollisionBroadcastMessage(message)) {
if (!receiverMap.containsKey(message)) {
receiverMap.put(message, new ArrayList<BroadcastScript>());
if (message.startsWith(Constants.RASPI_BROADCAST_PREFIX)) {
hiddenEntries++;
} else {
addMessageToAdapter(message);
}
}
} else {
if (!collisionReceiverMap.containsKey(message)) {
collisionReceiverMap.put(message, new ArrayList<CollisionScript>());
}
}
}
public static void addMessage(String message, BroadcastScript script) {
if (message == null || message.isEmpty()) {
return;
}
if (!PhysicsCollision.isCollisionBroadcastMessage(message)) {
addMessage(message);
receiverMap.get(message).add(script);
} else if (script instanceof CollisionScript) {
addMessage(message);
collisionReceiverMap.get(message).add((CollisionScript) script);
}
}
private static void addMessageToAdapter(String message) {
if (messageAdapter != null && (messageAdapter.getPosition(message) < 0)) {
messageAdapter.add(message);
}
}
public static void removeReceiverScript(String message, BroadcastScript script) {
if (message == null || message.isEmpty()) {
return;
}
if (!PhysicsCollision.isCollisionBroadcastMessage(message)) {
if (receiverMap.containsKey(message)) {
receiverMap.get(message).remove(script);
}
} else if (collisionReceiverMap.containsKey(message) && script instanceof CollisionScript) {
CollisionScript collisionScript = (CollisionScript) script;
collisionReceiverMap.get(message).remove(collisionScript);
}
}
public static ArrayAdapter<String> getMessageAdapter(Context context) {
if (messageAdapter == null) {
messageAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item);
messageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
messageAdapter.add(context.getString(R.string.new_broadcast_message));
if (receiverMap.size() == hiddenEntries) {
addMessage(context.getString(R.string.brick_broadcast_default_value));
} else {
for (String message : receiverMap.keySet()) {
if (message.startsWith(Constants.RASPI_BROADCAST_PREFIX)) {
continue;
}
addMessageToAdapter(message);
}
}
}
return messageAdapter;
}
public static int getPositionOfMessageInAdapter(Context context, String message) {
if (messageAdapter == null) {
getMessageAdapter(context);
}
return messageAdapter.getPosition(message);
}
public static String getFirst(Context context) {
return getMessageAdapter(context).getItem(1);
}
public static void removeUnusedMessages(List<String> usedMessages) {
messageAdapter = null;
receiverMap = new HashMap<>();
collisionReceiverMap = new HashMap<>();
hiddenEntries = 0;
for (String message : usedMessages) {
addMessage(message);
}
if (messageAdapter != null) {
Context context = messageAdapter.getContext();
for (int index = 0; index < messageAdapter.getCount(); index++) {
String message = messageAdapter.getItem(index);
if (!message.equals(context.getString(R.string.new_broadcast_message))
&& !usedMessages.contains(message)) {
messageAdapter.remove(message);
}
}
}
}
}