/* * 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.defaultprojectcreators; import android.content.Context; import android.util.Log; import org.catrobat.catroid.ProjectManager; import org.catrobat.catroid.R; import org.catrobat.catroid.common.Constants; import org.catrobat.catroid.common.LookData; import org.catrobat.catroid.common.ScreenValues; import org.catrobat.catroid.common.SoundInfo; import org.catrobat.catroid.content.Project; import org.catrobat.catroid.content.Script; import org.catrobat.catroid.content.SingleSprite; import org.catrobat.catroid.content.Sprite; import org.catrobat.catroid.content.StartScript; import org.catrobat.catroid.content.WhenScript; import org.catrobat.catroid.content.bricks.ForeverBrick; import org.catrobat.catroid.content.bricks.GlideToBrick; import org.catrobat.catroid.content.bricks.LoopEndlessBrick; import org.catrobat.catroid.content.bricks.NextLookBrick; import org.catrobat.catroid.content.bricks.PlaceAtBrick; import org.catrobat.catroid.content.bricks.PlaySoundBrick; import org.catrobat.catroid.content.bricks.WaitBrick; import org.catrobat.catroid.formulaeditor.Formula; import org.catrobat.catroid.formulaeditor.FormulaElement; import org.catrobat.catroid.formulaeditor.Functions; import org.catrobat.catroid.io.StorageHandler; import org.catrobat.catroid.soundrecorder.SoundRecorder; import org.catrobat.catroid.stage.StageListener; import org.catrobat.catroid.ui.fragment.SpriteFactory; import org.catrobat.catroid.utils.ImageEditing; import org.catrobat.catroid.utils.UtilFile; import java.io.File; import java.io.IOException; public class DefaultProjectCreatorDefault extends DefaultProjectCreator { private static final String TAG = DefaultProjectCreatorDefault.class.getSimpleName(); private static SpriteFactory spriteFactory = new SpriteFactory(); public DefaultProjectCreatorDefault() { standardProjectNameID = R.string.default_project_name; } @Override public Project createDefaultProject(String projectName, Context context, boolean landscapeMode) throws IOException, IllegalArgumentException { if (StorageHandler.getInstance().projectExists(projectName)) { throw new IllegalArgumentException("Project with name '" + projectName + "' already exists!"); } String birdLookName = context.getString(R.string.default_project_sprites_bird_name); String birdWingUpLookName = context.getString(R.string.default_project_sprites_bird_name_wing_up); String birdWingDownLookName = context.getString(R.string.default_project_sprites_bird_name_wing_down); String cloudSpriteName1 = context.getString(R.string.default_project_cloud_sprite_name_1); String cloudSpriteName2 = context.getString(R.string.default_project_cloud_sprite_name_2); String backgroundName = context.getString(R.string.default_project_background_name); String cloudName = context.getString(R.string.default_project_cloud_name); String tweet1 = context.getString(R.string.default_project_sprites_tweet_1); String tweet2 = context.getString(R.string.default_project_sprites_tweet_2); Project defaultProject = new Project(context, projectName, landscapeMode); String sceneName = defaultProject.getDefaultScene().getName(); defaultProject.setDeviceData(context); // density anywhere here StorageHandler.getInstance().saveProject(defaultProject); ProjectManager.getInstance().setProject(defaultProject); File backgroundFile; File cloudFile; if (landscapeMode) { backgroundImageScaleFactor = ImageEditing.calculateScaleFactorToScreenSize( R.drawable.default_project_background_landscape, context); cloudFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, backgroundName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_clouds_landscape, context, true, backgroundImageScaleFactor); backgroundFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, backgroundName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_background_landscape, context, true, backgroundImageScaleFactor); } else { backgroundImageScaleFactor = ImageEditing.calculateScaleFactorToScreenSize( R.drawable.default_project_background_portrait, context); backgroundFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, backgroundName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_background_portrait, context, true, backgroundImageScaleFactor); cloudFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, backgroundName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_clouds_portrait, context, true, backgroundImageScaleFactor); } File birdWingUpFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, birdWingUpLookName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_bird_wing_up, context, true, backgroundImageScaleFactor); File birdWingDownFile = UtilFile.copyImageFromResourceIntoProject(projectName, sceneName, birdWingDownLookName + Constants.IMAGE_STANDARD_EXTENSION, R.drawable.default_project_bird_wing_down, context, true, backgroundImageScaleFactor); try { File soundFile1 = UtilFile.copySoundFromResourceIntoProject(projectName, sceneName, tweet1 + SoundRecorder.RECORDING_EXTENSION, R.raw.default_project_tweet_1, context, true); File soundFile2 = UtilFile.copySoundFromResourceIntoProject(projectName, sceneName, tweet2 + SoundRecorder.RECORDING_EXTENSION, R.raw.default_project_tweet_2, context, true); UtilFile.copyFromResourceIntoProject(projectName, sceneName, ".", StageListener .SCREENSHOT_AUTOMATIC_FILE_NAME, R.drawable.default_project_screenshot, context, false); Log.i(TAG, String.format("createAndSaveDefaultProject(%s) %s created%n %s created%n %s created%n %s " + "created%n %s", projectName, backgroundFile.getName(), birdWingUpFile.getName(), birdWingDownFile.getName(), soundFile1.getName(), soundFile2.getName())); LookData backgroundLookData = new LookData(backgroundName, backgroundFile.getName()); Sprite backgroundSprite = defaultProject.getDefaultScene().getSpriteList().get(0); backgroundSprite.getLookDataList().add(backgroundLookData); LookData birdWingUpLookData = new LookData(birdWingUpLookName, birdWingUpFile.getName()); LookData birdWingDownLookData = new LookData(birdWingDownLookName, birdWingDownFile.getName()); LookData cloudLookData = new LookData(cloudName, cloudFile.getName()); SoundInfo soundInfo1 = new SoundInfo(tweet1, soundFile1.getName()); SoundInfo soundInfo2 = new SoundInfo(tweet2, soundFile2.getName()); ProjectManager.getInstance().getFileChecksumContainer().addChecksum(soundInfo1.getChecksum(), soundInfo1.getAbsolutePath()); ProjectManager.getInstance().getFileChecksumContainer().addChecksum(soundInfo2.getChecksum(), soundInfo2.getAbsolutePath()); ProjectManager.getInstance().getFileChecksumContainer().addChecksum(birdWingUpLookData.getChecksum(), birdWingUpLookData.getAbsolutePath()); ProjectManager.getInstance().getFileChecksumContainer().addChecksum(birdWingDownLookData.getChecksum(), birdWingDownLookData.getAbsolutePath()); ProjectManager.getInstance().getFileChecksumContainer().addChecksum(cloudLookData.getChecksum(), cloudLookData.getAbsolutePath()); Sprite cloudSprite1 = spriteFactory.newInstance(SingleSprite.class.getSimpleName(), cloudSpriteName1); Sprite cloudSprite2 = spriteFactory.newInstance(SingleSprite.class.getSimpleName(), cloudSpriteName2); cloudSprite1.getLookDataList().add(cloudLookData); cloudSprite2.getLookDataList().add(cloudLookData.clone()); Script cloudSpriteScript1 = new StartScript(); Script cloudSpriteScript2 = new StartScript(); PlaceAtBrick placeAtBrick1 = new PlaceAtBrick(0, 0); PlaceAtBrick placeAtBrick2 = new PlaceAtBrick(ScreenValues.SCREEN_WIDTH, 0); PlaceAtBrick placeAtBrick3 = new PlaceAtBrick(ScreenValues.SCREEN_WIDTH, 0); PlaceAtBrick placeAtBrick4 = new PlaceAtBrick(ScreenValues.SCREEN_WIDTH, 0); PlaceAtBrick placeAtBrick5 = new PlaceAtBrick(ScreenValues.SCREEN_WIDTH, 0); cloudSpriteScript1.addBrick(placeAtBrick1); cloudSpriteScript2.addBrick(placeAtBrick2); GlideToBrick glideToBrick1 = new GlideToBrick(-ScreenValues.SCREEN_WIDTH, 0, 5000); cloudSpriteScript1.addBrick(glideToBrick1); cloudSpriteScript1.addBrick(placeAtBrick3); ForeverBrick foreverBrick = new ForeverBrick(); cloudSpriteScript1.addBrick(foreverBrick); cloudSpriteScript2.addBrick(foreverBrick); GlideToBrick glideToBrick2 = new GlideToBrick(-ScreenValues.SCREEN_WIDTH, 0, 10000); cloudSpriteScript1.addBrick(glideToBrick2); cloudSpriteScript1.addBrick(placeAtBrick4); cloudSpriteScript2.addBrick(glideToBrick2); cloudSpriteScript2.addBrick(placeAtBrick5); LoopEndlessBrick loopEndlessBrick = new LoopEndlessBrick(foreverBrick); cloudSpriteScript1.addBrick(loopEndlessBrick); cloudSprite1.addScript(cloudSpriteScript1); cloudSpriteScript2.addBrick(loopEndlessBrick); cloudSprite2.addScript(cloudSpriteScript2); defaultProject.getDefaultScene().addSprite(cloudSprite1); defaultProject.getDefaultScene().addSprite(cloudSprite2); Sprite birdSprite = spriteFactory.newInstance(SingleSprite.class.getSimpleName(), birdLookName); birdSprite.getLookDataList().add(birdWingUpLookData); birdSprite.getLookDataList().add(birdWingDownLookData); birdSprite.getSoundList().add(soundInfo1); birdSprite.getSoundList().add(soundInfo2); Script birdStartScript = new StartScript(); Script birdStartScriptTwo = new StartScript(); ForeverBrick foreverBrickBird = new ForeverBrick(); ForeverBrick foreverBrickTwo = new ForeverBrick(); birdStartScript.addBrick(foreverBrickBird); birdStartScriptTwo.addBrick(foreverBrickTwo); FormulaElement randomElement = new FormulaElement(FormulaElement.ElementType.FUNCTION, Functions.RAND.toString(), null); randomElement.setLeftChild(new FormulaElement(FormulaElement.ElementType.NUMBER, "-300", randomElement)); randomElement.setRightChild(new FormulaElement(FormulaElement.ElementType.NUMBER, "300", randomElement)); Formula randomGlide1 = new Formula(randomElement); FormulaElement randomElement2 = new FormulaElement(FormulaElement.ElementType.FUNCTION, Functions.RAND.toString(), null); randomElement2.setLeftChild(new FormulaElement(FormulaElement.ElementType.NUMBER, "-200", randomElement)); randomElement2.setRightChild(new FormulaElement(FormulaElement.ElementType.NUMBER, "200", randomElement)); Formula randomGlide2 = new Formula(randomElement2); GlideToBrick glideToBrickBird = new GlideToBrick(randomGlide1, randomGlide2, new Formula(1)); birdStartScript.addBrick(glideToBrickBird); NextLookBrick nextLookBrickBird = new NextLookBrick(); WaitBrick waitBrick = new WaitBrick(200); birdStartScriptTwo.addBrick(nextLookBrickBird); birdStartScriptTwo.addBrick(waitBrick); LoopEndlessBrick loopEndlessBrickBird = new LoopEndlessBrick(foreverBrickBird); LoopEndlessBrick loopEndlessBrickTwo = new LoopEndlessBrick(foreverBrickTwo); birdStartScript.addBrick(loopEndlessBrickBird); birdStartScriptTwo.addBrick(loopEndlessBrickTwo); birdSprite.addScript(birdStartScript); birdSprite.addScript(birdStartScriptTwo); WhenScript whenScriptBird = new WhenScript(); PlaySoundBrick playSoundBrickBird = new PlaySoundBrick(); playSoundBrickBird.setSoundInfo(soundInfo1); whenScriptBird.addBrick(playSoundBrickBird); birdSprite.addScript(whenScriptBird); defaultProject.getDefaultScene().addSprite(birdSprite); } catch (IllegalArgumentException illegalArgumentException) { throw new IOException(TAG, illegalArgumentException); } StorageHandler.getInstance().saveProject(defaultProject); return defaultProject; } }