/* * 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.ui.controller; import android.os.AsyncTask; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.common.Backpack; import org.catrobat.catroid.common.LookData; import org.catrobat.catroid.common.SoundInfo; import org.catrobat.catroid.content.Scene; import org.catrobat.catroid.content.Script; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.content.bricks.Brick; import org.catrobat.catroid.content.bricks.SceneStartBrick; import org.catrobat.catroid.content.bricks.SceneTransitionBrick; import org.catrobat.catroid.content.bricks.UserBrick; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.ui.adapter.LookBaseAdapter; import org.catrobat.catroid.ui.adapter.SoundBaseAdapter; import org.catrobat.catroid.utils.UtilFile; import org.catrobat.catroid.utils.Utils; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; public final class BackPackListManager { private static final BackPackListManager INSTANCE = new BackPackListManager(); private static Backpack backpack; private static SoundBaseAdapter currentSoundAdapter; private static LookBaseAdapter currentLookAdapter; public static BackPackListManager getInstance() { if (backpack == null) { backpack = new Backpack(); } return INSTANCE; } void addLookToBackPack(LookData lookData) { getBackpack().backpackedLooks.add(lookData); } public List<LookData> getBackPackedLooks() { return getBackpack().backpackedLooks; } public void clearBackPackScripts() { getBackpack().backpackedScripts.clear(); getBackpack().hiddenBackpackedScripts.clear(); } public void removeItemFromScriptBackPack(String scriptGroup) { getBackpack().backpackedScripts.remove(scriptGroup); } public ArrayList<String> getBackPackedScriptGroups() { return new ArrayList<>(getBackpack().backpackedScripts.keySet()); } void addScriptToBackPack(String scriptGroup, List<Script> scripts) { getBackpack().backpackedScripts.put(scriptGroup, scripts); } public HashMap<String, List<Script>> getBackPackedScripts() { return getBackpack().backpackedScripts; } public HashMap<String, List<Script>> getAllBackPackedScripts() { HashMap<String, List<Script>> allScripts = new HashMap<>(); allScripts.putAll(getBackpack().backpackedScripts); allScripts.putAll(getBackpack().hiddenBackpackedScripts); return allScripts; } public void clearBackPackUserBricks() { getBackpack().backpackedUserBricks.clear(); } public void removeItemFromUserBrickBackPack(String userBrickGroup) { getBackpack().backpackedUserBricks.remove(userBrickGroup); } public ArrayList<String> getBackPackedUserBrickGroups() { return new ArrayList<>(getBackpack().backpackedUserBricks.keySet()); } public void addUserBrickToBackPack(String userBrickGroup, List<UserBrick> userBricks) { getBackpack().backpackedUserBricks.put(userBrickGroup, userBricks); } public HashMap<String, List<UserBrick>> getBackPackedUserBricks() { return getBackpack().backpackedUserBricks; } public void clearBackPackLooks() { getBackpack().backpackedLooks.clear(); getBackpack().hiddenBackpackedLooks.clear(); } public void removeItemFromLookBackPack(LookData lookData) { getBackpack().backpackedLooks.remove(lookData); } void removeItemFromLookBackPackByLookName(String name) { for (LookData lookData : getBackpack().backpackedLooks) { if (lookData.getLookName().equals(name)) { getBackpack().backpackedLooks.remove(lookData); } } } public List<SoundInfo> getBackPackedSounds() { return getBackpack().backpackedSounds; } public void clearBackPackSounds() { getBackpack().backpackedSounds.clear(); getBackpack().hiddenBackpackedSounds.clear(); } void addSoundToBackPack(SoundInfo soundInfo) { getBackpack().backpackedSounds.add(soundInfo); } void removeItemFromSoundBackPack(SoundInfo currentSoundInfo) { getBackpack().backpackedSounds.remove(currentSoundInfo); } void removeItemFromSoundBackPackBySoundTitle(String title) { for (SoundInfo soundInfo : getBackpack().backpackedSounds) { if (soundInfo.getTitle().equals(title)) { getBackpack().backpackedSounds.remove(soundInfo); } } } public List<Scene> getAllBackpackedScenes() { List<Scene> result = new ArrayList<>(); result.addAll(getBackpack().backpackedScenes); result.addAll(getBackpack().hiddenBackpackedScenes); return result; } public List<Scene> getBackPackedScenes() { return getBackpack().backpackedScenes; } private List<Scene> getHiddenBackPackedScenes() { return getBackpack().hiddenBackpackedScenes; } public Scene getHiddenSceneByName(String name) { for (Scene scene : getBackpack().hiddenBackpackedScenes) { if (scene.getName().equals(name)) { return scene; } } return null; } public void clearBackPackScenes() { getBackpack().backpackedScenes.clear(); } void addSceneToBackPack(Scene scene) { getBackpack().backpackedScenes.add(scene); } void addSceneToHiddenBackpack(Scene scene) { getBackpack().hiddenBackpackedScenes.add(scene); } public void removeItemFromSceneBackPackByName(String title, boolean hidden) { List<Scene> toRemove = new ArrayList<>(); for (Scene scene : getBackpack().backpackedScenes) { if (scene.getName().equals(title)) { toRemove.add(scene); UtilFile.deleteDirectory(new File(Utils.buildBackpackScenePath(scene.getName()))); } } (hidden ? getHiddenBackPackedScenes() : getBackPackedScenes()).removeAll(toRemove); } public List<Sprite> getBackPackedSprites() { return getBackpack().backpackedSprites; } public void clearBackPackSprites() { getBackpack().backpackedSprites.clear(); getBackpack().hiddenBackpackedSprites.clear(); } void addSpriteToBackPack(Sprite sprite) { getBackpack().backpackedSprites.add(sprite); } public void removeItemFromSpriteBackPack(Sprite sprite) { getBackpack().backpackedSprites.remove(sprite); } void removeItemFromSpriteBackPackByName(String name) { List<Sprite> sprites = getBackpack().backpackedSprites; for (int spritePosition = 0; spritePosition < sprites.size(); spritePosition++) { Sprite sprite = getBackpack().backpackedSprites.get(spritePosition); if (sprite.getName().equals(name)) { getBackpack().backpackedSprites.remove(sprite); } } } public List<LookData> getHiddenBackpackedLooks() { return getBackpack().hiddenBackpackedLooks; } void removeItemFromScriptHiddenBackpack(String scriptGroup) { getBackpack().hiddenBackpackedScripts.remove(scriptGroup); } void addScriptToHiddenBackpack(String scriptGroup, List<Script> scripts) { getBackpack().hiddenBackpackedScripts.put(scriptGroup, scripts); } public HashMap<String, List<Script>> getHiddenBackpackedScripts() { return getBackpack().hiddenBackpackedScripts; } public void removeItemFromLookHiddenBackpack(LookData lookData) { getBackpack().hiddenBackpackedLooks.remove(lookData); } public List<SoundInfo> getHiddenBackpackedSounds() { return getBackpack().hiddenBackpackedSounds; } void addSoundToHiddenBackpack(SoundInfo soundInfo) { getBackpack().hiddenBackpackedSounds.add(soundInfo); } public void removeItemFromSoundHiddenBackpack(SoundInfo currentSoundInfo) { getBackpack().hiddenBackpackedSounds.remove(currentSoundInfo); } public List<Sprite> getHiddenBackpackedSprites() { return getBackpack().hiddenBackpackedSprites; } void addSpriteToHiddenBackpack(Sprite sprite) { getBackpack().hiddenBackpackedSprites.add(sprite); } void removeItemFromSpriteHiddenBackpack(Sprite sprite) { getBackpack().hiddenBackpackedSprites.remove(sprite); } boolean backPackedSoundsContain(SoundInfo soundInfo, boolean onlyVisible) { List<SoundInfo> backPackedSounds = onlyVisible ? getBackPackedSounds() : getAllBackPackedSounds(); for (SoundInfo backPackedSound : backPackedSounds) { if (backPackedSound.equals(soundInfo)) { return true; } } return false; } boolean backPackedLooksContain(LookData lookData, boolean onlyVisible) { List<LookData> backPackedLooks = onlyVisible ? getBackPackedLooks() : getAllBackPackedLooks(); for (LookData backPackedLook : backPackedLooks) { if (backPackedLook.equals(lookData)) { return true; } } return false; } boolean backPackedSpritesContains(Sprite sprite, boolean onlyVisible) { List<Sprite> backPackedSprites = onlyVisible ? getBackPackedSprites() : getAllBackPackedSprites(); for (Sprite backPackedSprite : backPackedSprites) { if (backPackedSprite.equals(sprite)) { return true; } } return false; } public boolean backPackedScenesContains(Scene scene, boolean onlyVisible) { List<Scene> toSearch = onlyVisible ? getBackPackedScenes() : getHiddenBackPackedScenes(); for (Scene backPackedScene : toSearch) { if (backPackedScene.getName().equals(scene.getName())) { return true; } } return false; } public ArrayList<String> getAllBackPackedScriptGroups() { ArrayList<String> allScriptGroups = new ArrayList<>(); allScriptGroups.addAll(new ArrayList<>(getBackpack().backpackedScripts.keySet())); allScriptGroups.addAll(new ArrayList<>(getBackpack().backpackedScripts.keySet())); return allScriptGroups; } public List<LookData> getAllBackPackedLooks() { List<LookData> allLooks = new ArrayList<>(); allLooks.addAll(getBackpack().backpackedLooks); allLooks.addAll(getBackpack().hiddenBackpackedLooks); return allLooks; } public List<SoundInfo> getAllBackPackedSounds() { List<SoundInfo> allSounds = new ArrayList<>(); allSounds.addAll(getBackpack().backpackedSounds); allSounds.addAll(getBackpack().hiddenBackpackedSounds); return allSounds; } public List<Sprite> getAllBackPackedSprites() { List<Sprite> allSprites = new ArrayList<>(); allSprites.addAll(getBackpack().backpackedSprites); allSprites.addAll(getBackpack().hiddenBackpackedSprites); return allSprites; } SoundBaseAdapter getCurrentSoundAdapter() { return currentSoundAdapter; } public void setCurrentSoundAdapter(SoundBaseAdapter adapter) { currentSoundAdapter = adapter; } LookBaseAdapter getCurrentLookAdapter() { return currentLookAdapter; } public void setCurrentLookAdapter(LookBaseAdapter currentLookAdapter) { BackPackListManager.currentLookAdapter = currentLookAdapter; } void addLookToHiddenBackPack(LookData newLookData) { getBackpack().hiddenBackpackedLooks.add(newLookData); } public boolean isBackpackEmpty() { return getAllBackPackedLooks().isEmpty() && getAllBackPackedScriptGroups().isEmpty() && getAllBackPackedSounds().isEmpty() && getAllBackPackedSprites().isEmpty(); } public void saveBackpack() { SaveBackpackAsynchronousTask saveTask = new SaveBackpackAsynchronousTask(); saveTask.execute(); } public void loadBackpack() { LoadBackpackAsynchronousTask loadTask = new LoadBackpackAsynchronousTask(); loadTask.execute(); } public Backpack getBackpack() { if (backpack == null) { backpack = new Backpack(); } return backpack; } public static void searchForHiddenScenes(Scene sceneToSearch, ArrayList<Scene> foundScenes, boolean inBackpack) { for (Sprite sprite : sceneToSearch.getSpriteList()) { for (Brick brick : sprite.getListWithAllBricks()) { if (brick instanceof SceneTransitionBrick) { Scene transitionScene; if (inBackpack) { transitionScene = BackPackListManager.getInstance().getHiddenSceneByName(((SceneTransitionBrick) brick).getSceneForTransition()); if (transitionScene == null) { continue; } } else { transitionScene = ProjectManager.getInstance().getCurrentProject().getSceneByName(((SceneTransitionBrick) brick).getSceneForTransition()); if (transitionScene == null) { continue; } } if (!foundScenes.contains(transitionScene)) { foundScenes.add(transitionScene); searchForHiddenScenes(transitionScene, foundScenes, inBackpack); } } if (brick instanceof SceneStartBrick) { Scene startScene; if (inBackpack) { startScene = BackPackListManager.getInstance().getHiddenSceneByName(((SceneStartBrick) brick).getSceneToStart()); if (startScene == null) { continue; } } else { startScene = ProjectManager.getInstance().getCurrentProject().getSceneByName(((SceneStartBrick) brick).getSceneToStart()); if (startScene == null) { continue; } } if (!foundScenes.contains(startScene)) { foundScenes.add(startScene); searchForHiddenScenes(startScene, foundScenes, inBackpack); } } } } } private class SaveBackpackAsynchronousTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { StorageHandler.getInstance().saveBackpack(getBackpack()); return null; } } private class LoadBackpackAsynchronousTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { backpack = StorageHandler.getInstance().loadBackpack(); setBackPackFlags(); ProjectManager.getInstance().checkNestingBrickReferences(false, true); return null; } private void setBackPackFlags() { for (LookData lookData : getAllBackPackedLooks()) { lookData.isBackpackLookData = true; } for (SoundInfo soundInfo : getAllBackPackedSounds()) { soundInfo.setBackpackSoundInfo(true); } for (Sprite sprite : getAllBackPackedSprites()) { sprite.isBackpackObject = true; for (LookData lookData : sprite.getLookDataList()) { lookData.isBackpackLookData = true; } for (SoundInfo soundInfo : sprite.getSoundList()) { soundInfo.setBackpackSoundInfo(true); } } for (Scene scene : getBackPackedScenes()) { scene.isBackPackScene = true; } } } }