/*
* 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.fragment;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.common.BrickValues;
import org.catrobat.catroid.common.MessageContainer;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.content.bricks.AddItemToUserListBrick;
import org.catrobat.catroid.content.bricks.ArduinoSendDigitalValueBrick;
import org.catrobat.catroid.content.bricks.ArduinoSendPWMValueBrick;
import org.catrobat.catroid.content.bricks.AskBrick;
import org.catrobat.catroid.content.bricks.AskSpeechBrick;
import org.catrobat.catroid.content.bricks.Brick;
import org.catrobat.catroid.content.bricks.BroadcastBrick;
import org.catrobat.catroid.content.bricks.BroadcastReceiverBrick;
import org.catrobat.catroid.content.bricks.BroadcastWaitBrick;
import org.catrobat.catroid.content.bricks.CameraBrick;
import org.catrobat.catroid.content.bricks.ChangeBrightnessByNBrick;
import org.catrobat.catroid.content.bricks.ChangeColorByNBrick;
import org.catrobat.catroid.content.bricks.ChangeSizeByNBrick;
import org.catrobat.catroid.content.bricks.ChangeTransparencyByNBrick;
import org.catrobat.catroid.content.bricks.ChangeVariableBrick;
import org.catrobat.catroid.content.bricks.ChangeVolumeByNBrick;
import org.catrobat.catroid.content.bricks.ChangeXByNBrick;
import org.catrobat.catroid.content.bricks.ChangeYByNBrick;
import org.catrobat.catroid.content.bricks.ChooseCameraBrick;
import org.catrobat.catroid.content.bricks.ClearBackgroundBrick;
import org.catrobat.catroid.content.bricks.ClearGraphicEffectBrick;
import org.catrobat.catroid.content.bricks.CloneBrick;
import org.catrobat.catroid.content.bricks.ComeToFrontBrick;
import org.catrobat.catroid.content.bricks.DeleteItemOfUserListBrick;
import org.catrobat.catroid.content.bricks.DeleteThisCloneBrick;
import org.catrobat.catroid.content.bricks.DroneEmergencyBrick;
import org.catrobat.catroid.content.bricks.DroneFlipBrick;
import org.catrobat.catroid.content.bricks.DroneMoveBackwardBrick;
import org.catrobat.catroid.content.bricks.DroneMoveDownBrick;
import org.catrobat.catroid.content.bricks.DroneMoveForwardBrick;
import org.catrobat.catroid.content.bricks.DroneMoveLeftBrick;
import org.catrobat.catroid.content.bricks.DroneMoveRightBrick;
import org.catrobat.catroid.content.bricks.DroneMoveUpBrick;
import org.catrobat.catroid.content.bricks.DroneSwitchCameraBrick;
import org.catrobat.catroid.content.bricks.DroneTakeOffLandBrick;
import org.catrobat.catroid.content.bricks.DroneTurnLeftBrick;
import org.catrobat.catroid.content.bricks.DroneTurnRightBrick;
import org.catrobat.catroid.content.bricks.FlashBrick;
import org.catrobat.catroid.content.bricks.ForeverBrick;
import org.catrobat.catroid.content.bricks.GlideToBrick;
import org.catrobat.catroid.content.bricks.GoNStepsBackBrick;
import org.catrobat.catroid.content.bricks.GoToBrick;
import org.catrobat.catroid.content.bricks.HideBrick;
import org.catrobat.catroid.content.bricks.HideTextBrick;
import org.catrobat.catroid.content.bricks.IfLogicBeginBrick;
import org.catrobat.catroid.content.bricks.IfOnEdgeBounceBrick;
import org.catrobat.catroid.content.bricks.IfThenLogicBeginBrick;
import org.catrobat.catroid.content.bricks.InsertItemIntoUserListBrick;
import org.catrobat.catroid.content.bricks.LegoEv3MotorMoveBrick;
import org.catrobat.catroid.content.bricks.LegoEv3MotorStopBrick;
import org.catrobat.catroid.content.bricks.LegoEv3MotorTurnAngleBrick;
import org.catrobat.catroid.content.bricks.LegoEv3PlayToneBrick;
import org.catrobat.catroid.content.bricks.LegoEv3SetLedBrick;
import org.catrobat.catroid.content.bricks.LegoNxtMotorMoveBrick;
import org.catrobat.catroid.content.bricks.LegoNxtMotorStopBrick;
import org.catrobat.catroid.content.bricks.LegoNxtMotorTurnAngleBrick;
import org.catrobat.catroid.content.bricks.LegoNxtPlayToneBrick;
import org.catrobat.catroid.content.bricks.MoveNStepsBrick;
import org.catrobat.catroid.content.bricks.NextLookBrick;
import org.catrobat.catroid.content.bricks.NoteBrick;
import org.catrobat.catroid.content.bricks.PenDownBrick;
import org.catrobat.catroid.content.bricks.PenUpBrick;
import org.catrobat.catroid.content.bricks.PhiroIfLogicBeginBrick;
import org.catrobat.catroid.content.bricks.PhiroMotorMoveBackwardBrick;
import org.catrobat.catroid.content.bricks.PhiroMotorMoveForwardBrick;
import org.catrobat.catroid.content.bricks.PhiroMotorStopBrick;
import org.catrobat.catroid.content.bricks.PhiroPlayToneBrick;
import org.catrobat.catroid.content.bricks.PhiroRGBLightBrick;
import org.catrobat.catroid.content.bricks.PlaceAtBrick;
import org.catrobat.catroid.content.bricks.PlaySoundAndWaitBrick;
import org.catrobat.catroid.content.bricks.PlaySoundBrick;
import org.catrobat.catroid.content.bricks.PointInDirectionBrick;
import org.catrobat.catroid.content.bricks.PointInDirectionBrick.Direction;
import org.catrobat.catroid.content.bricks.PointToBrick;
import org.catrobat.catroid.content.bricks.PreviousLookBrick;
import org.catrobat.catroid.content.bricks.RaspiIfLogicBeginBrick;
import org.catrobat.catroid.content.bricks.RaspiPwmBrick;
import org.catrobat.catroid.content.bricks.RaspiSendDigitalValueBrick;
import org.catrobat.catroid.content.bricks.RepeatBrick;
import org.catrobat.catroid.content.bricks.RepeatUntilBrick;
import org.catrobat.catroid.content.bricks.ReplaceItemInUserListBrick;
import org.catrobat.catroid.content.bricks.SayBubbleBrick;
import org.catrobat.catroid.content.bricks.SayForBubbleBrick;
import org.catrobat.catroid.content.bricks.SceneStartBrick;
import org.catrobat.catroid.content.bricks.SceneTransitionBrick;
import org.catrobat.catroid.content.bricks.ScriptBrick;
import org.catrobat.catroid.content.bricks.SetBackgroundAndWaitBrick;
import org.catrobat.catroid.content.bricks.SetBackgroundBrick;
import org.catrobat.catroid.content.bricks.SetBrightnessBrick;
import org.catrobat.catroid.content.bricks.SetColorBrick;
import org.catrobat.catroid.content.bricks.SetLookBrick;
import org.catrobat.catroid.content.bricks.SetNfcTagBrick;
import org.catrobat.catroid.content.bricks.SetPenColorBrick;
import org.catrobat.catroid.content.bricks.SetPenSizeBrick;
import org.catrobat.catroid.content.bricks.SetRotationStyleBrick;
import org.catrobat.catroid.content.bricks.SetSizeToBrick;
import org.catrobat.catroid.content.bricks.SetTransparencyBrick;
import org.catrobat.catroid.content.bricks.SetVariableBrick;
import org.catrobat.catroid.content.bricks.SetVolumeToBrick;
import org.catrobat.catroid.content.bricks.SetXBrick;
import org.catrobat.catroid.content.bricks.SetYBrick;
import org.catrobat.catroid.content.bricks.ShowBrick;
import org.catrobat.catroid.content.bricks.ShowTextBrick;
import org.catrobat.catroid.content.bricks.SpeakAndWaitBrick;
import org.catrobat.catroid.content.bricks.SpeakBrick;
import org.catrobat.catroid.content.bricks.StampBrick;
import org.catrobat.catroid.content.bricks.StopAllSoundsBrick;
import org.catrobat.catroid.content.bricks.StopScriptBrick;
import org.catrobat.catroid.content.bricks.ThinkBubbleBrick;
import org.catrobat.catroid.content.bricks.ThinkForBubbleBrick;
import org.catrobat.catroid.content.bricks.TurnLeftBrick;
import org.catrobat.catroid.content.bricks.TurnRightBrick;
import org.catrobat.catroid.content.bricks.UserBrick;
import org.catrobat.catroid.content.bricks.VibrationBrick;
import org.catrobat.catroid.content.bricks.WaitBrick;
import org.catrobat.catroid.content.bricks.WaitUntilBrick;
import org.catrobat.catroid.content.bricks.WhenBackgroundChangesBrick;
import org.catrobat.catroid.content.bricks.WhenBrick;
import org.catrobat.catroid.content.bricks.WhenClonedBrick;
import org.catrobat.catroid.content.bricks.WhenConditionBrick;
import org.catrobat.catroid.content.bricks.WhenNfcBrick;
import org.catrobat.catroid.content.bricks.WhenRaspiPinChangedBrick;
import org.catrobat.catroid.content.bricks.WhenStartedBrick;
import org.catrobat.catroid.content.bricks.WhenTouchDownBrick;
import org.catrobat.catroid.formulaeditor.Formula;
import org.catrobat.catroid.formulaeditor.FormulaElement;
import org.catrobat.catroid.formulaeditor.FormulaElement.ElementType;
import org.catrobat.catroid.formulaeditor.Operators;
import org.catrobat.catroid.formulaeditor.Sensors;
import org.catrobat.catroid.physics.content.bricks.CollisionReceiverBrick;
import org.catrobat.catroid.physics.content.bricks.SetBounceBrick;
import org.catrobat.catroid.physics.content.bricks.SetFrictionBrick;
import org.catrobat.catroid.physics.content.bricks.SetGravityBrick;
import org.catrobat.catroid.physics.content.bricks.SetMassBrick;
import org.catrobat.catroid.physics.content.bricks.SetPhysicsObjectTypeBrick;
import org.catrobat.catroid.physics.content.bricks.SetVelocityBrick;
import org.catrobat.catroid.physics.content.bricks.TurnLeftSpeedBrick;
import org.catrobat.catroid.physics.content.bricks.TurnRightSpeedBrick;
import org.catrobat.catroid.ui.SettingsActivity;
import org.catrobat.catroid.ui.UserBrickScriptActivity;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
public class CategoryBricksFactory {
public List<Brick> getBricks(String category, Sprite sprite, Context context) {
boolean isUserScriptMode = context instanceof UserBrickScriptActivity;
List<Brick> tempList = new LinkedList<>();
List<Brick> toReturn = new ArrayList<>();
if (category.equals(context.getString(R.string.category_event))) {
tempList = setupEventCategoryList(context);
} else if (category.equals(context.getString(R.string.category_control))) {
tempList = setupControlCategoryList(context);
} else if (category.equals(context.getString(R.string.category_motion))) {
tempList = setupMotionCategoryList(sprite, context);
} else if (category.equals(context.getString(R.string.category_sound))) {
tempList = setupSoundCategoryList(context);
} else if (category.equals(context.getString(R.string.category_looks))) {
boolean isBackgroundSprite = sprite.getName().equals(context.getString(R.string.background));
tempList = setupLooksCategoryList(context, isBackgroundSprite);
} else if (category.equals(context.getString(R.string.category_pen))) {
tempList = setupPenCategoryList(sprite);
} else if (category.equals(context.getString(R.string.category_user_bricks))) {
tempList = setupUserBricksCategoryList();
} else if (category.equals(context.getString(R.string.category_data))) {
tempList = setupDataCategoryList(context);
} else if (category.equals(context.getString(R.string.category_lego_nxt))) {
tempList = setupLegoNxtCategoryList();
} else if (category.equals(context.getString(R.string.category_lego_ev3))) {
tempList = setupLegoEv3CategoryList();
} else if (category.equals(context.getString(R.string.category_arduino))) {
tempList = setupArduinoCategoryList();
} else if (category.equals(context.getString(R.string.category_drone))) {
tempList = setupDroneCategoryList();
} else if (category.equals(context.getString(R.string.category_phiro))) {
tempList = setupPhiroProCategoryList();
} else if (category.equals(context.getString(R.string.category_raspi))) {
tempList = setupRaspiCategoryList();
}
for (Brick brick : tempList) {
if (!isUserScriptMode || !(brick instanceof ScriptBrick)) {
toReturn.add(brick);
}
}
return toReturn;
}
private List<Brick> setupEventCategoryList(Context context) {
FormulaElement defaultIf = new FormulaElement(FormulaElement.ElementType.OPERATOR, Operators.SMALLER_THAN.toString(), null);
defaultIf.setLeftChild(new FormulaElement(ElementType.NUMBER, "1", null));
defaultIf.setRightChild(new FormulaElement(ElementType.NUMBER, "2", null));
List<Brick> eventBrickList = new ArrayList<>();
eventBrickList.add(new WhenStartedBrick(null));
eventBrickList.add(new WhenBrick(null));
eventBrickList.add(new WhenTouchDownBrick());
final String broadcastMessage = MessageContainer.getFirst(context);
eventBrickList.add(new BroadcastReceiverBrick(broadcastMessage));
eventBrickList.add(new BroadcastBrick(broadcastMessage));
eventBrickList.add(new BroadcastWaitBrick(broadcastMessage));
eventBrickList.add(new WhenConditionBrick(new Formula(defaultIf)));
eventBrickList.add(new CollisionReceiverBrick("object"));
eventBrickList.add(new WhenBackgroundChangesBrick());
eventBrickList.add(new WhenClonedBrick());
if (SettingsActivity.isNfcSharedPreferenceEnabled(context)) {
eventBrickList.add(new WhenNfcBrick());
}
return eventBrickList;
}
private List<Brick> setupControlCategoryList(Context context) {
FormulaElement defaultIf = new FormulaElement(FormulaElement.ElementType.OPERATOR, Operators.SMALLER_THAN.toString(), null);
defaultIf.setLeftChild(new FormulaElement(ElementType.NUMBER, "1", null));
defaultIf.setRightChild(new FormulaElement(ElementType.NUMBER, "2", null));
List<Brick> controlBrickList = new ArrayList<>();
controlBrickList.add(new WaitBrick(BrickValues.WAIT));
controlBrickList.add(new NoteBrick(context.getString(R.string.brick_note_default_value)));
controlBrickList.add(new ForeverBrick());
controlBrickList.add(new IfLogicBeginBrick(new Formula(defaultIf)));
controlBrickList.add(new IfThenLogicBeginBrick(new Formula(defaultIf)));
controlBrickList.add(new WaitUntilBrick(new Formula(defaultIf)));
controlBrickList.add(new RepeatBrick(BrickValues.REPEAT));
controlBrickList.add(new RepeatUntilBrick(new Formula(defaultIf)));
controlBrickList.add(new SceneTransitionBrick(null));
controlBrickList.add(new SceneStartBrick(null));
if (SettingsActivity.isPhiroSharedPreferenceEnabled(context)) {
controlBrickList.add(new PhiroIfLogicBeginBrick());
}
controlBrickList.add(new StopScriptBrick(BrickValues.STOP_THIS_SCRIPT));
controlBrickList.add(new CloneBrick());
controlBrickList.add(new DeleteThisCloneBrick());
controlBrickList.add(new WhenClonedBrick());
if (SettingsActivity.isNfcSharedPreferenceEnabled(context)) {
controlBrickList.add(new SetNfcTagBrick(context.getString(R.string.brick_set_nfc_tag_default_value)));
}
return controlBrickList;
}
private List<Brick> setupUserBricksCategoryList() {
List<UserBrick> userBrickList = ProjectManager.getInstance().getCurrentSprite().getUserBrickList();
ArrayList<Brick> newList = new ArrayList<>();
// UserBrick userBrickWeAreAddingTo = ProjectManager.getInstance().getCurrentUserBrick();
// if (userBrickWeAreAddingTo != null) {
// // Maintain a Directed Acyclic Graph of UserBrick call order: Don't allow cycles.
// for (UserBrick brick : userBrickList) {
// if (!checkForCycle(brick, userBrickWeAreAddingTo)) {
// newList.add(brick);
// }
// }
// } else {
if (userBrickList != null) {
for (UserBrick brick : userBrickList) {
newList.add(brick);
}
}
// }
return newList;
}
// public boolean checkForCycle(UserBrick currentBrick, UserBrick parentBrick) {
// if (parentBrick.getId() == currentBrick.getId()) {
// return true;
// }
//
// for (Brick childBrick : currentBrick.getDefinitionBrick().getUserScript().getBrickList()) {
// if (childBrick instanceof UserBrick && checkForCycle(((UserBrick) childBrick), parentBrick)) {
// return true;
// }
// }
//
// return false;
// }
private List<Brick> setupMotionCategoryList(Sprite sprite, Context context) {
List<Brick> motionBrickList = new ArrayList<>();
motionBrickList.add(new PlaceAtBrick(BrickValues.X_POSITION, BrickValues.Y_POSITION));
motionBrickList.add(new SetXBrick(BrickValues.X_POSITION));
motionBrickList.add(new SetYBrick(BrickValues.Y_POSITION));
motionBrickList.add(new ChangeXByNBrick(BrickValues.CHANGE_X_BY));
motionBrickList.add(new ChangeYByNBrick(BrickValues.CHANGE_Y_BY));
motionBrickList.add(new GoToBrick(null));
if (!isBackground(sprite)) {
motionBrickList.add(new IfOnEdgeBounceBrick());
}
motionBrickList.add(new MoveNStepsBrick(BrickValues.MOVE_STEPS));
motionBrickList.add(new TurnLeftBrick(BrickValues.TURN_DEGREES));
motionBrickList.add(new TurnRightBrick(BrickValues.TURN_DEGREES));
motionBrickList.add(new PointInDirectionBrick(Direction.RIGHT));
motionBrickList.add(new PointToBrick(null));
motionBrickList.add(new SetRotationStyleBrick());
motionBrickList.add(new GlideToBrick(BrickValues.X_POSITION, BrickValues.Y_POSITION,
BrickValues.GLIDE_SECONDS));
if (!isBackground(sprite)) {
motionBrickList.add(new GoNStepsBackBrick(BrickValues.GO_BACK));
motionBrickList.add(new ComeToFrontBrick());
}
motionBrickList.add(new VibrationBrick(BrickValues.VIBRATE_SECONDS));
motionBrickList.add(new SetPhysicsObjectTypeBrick(BrickValues.PHYSIC_TYPE));
motionBrickList.add(new SetVelocityBrick(BrickValues.PHYSIC_VELOCITY));
motionBrickList.add(new TurnLeftSpeedBrick(BrickValues.PHYSIC_TURN_DEGREES));
motionBrickList.add(new TurnRightSpeedBrick(BrickValues.PHYSIC_TURN_DEGREES));
motionBrickList.add(new SetGravityBrick(BrickValues.PHYSIC_GRAVITY));
motionBrickList.add(new SetMassBrick(BrickValues.PHYSIC_MASS));
motionBrickList.add(new SetBounceBrick(BrickValues.PHYSIC_BOUNCE_FACTOR * 100));
motionBrickList.add(new SetFrictionBrick(BrickValues.PHYSIC_FRICTION * 100));
if (SettingsActivity.isPhiroSharedPreferenceEnabled(context)) {
motionBrickList.add(new PhiroMotorMoveForwardBrick(PhiroMotorMoveForwardBrick.Motor.MOTOR_LEFT,
BrickValues.PHIRO_SPEED));
motionBrickList.add(new PhiroMotorMoveBackwardBrick(PhiroMotorMoveBackwardBrick.Motor.MOTOR_LEFT,
BrickValues.PHIRO_SPEED));
motionBrickList.add(new PhiroMotorStopBrick(PhiroMotorStopBrick.Motor.MOTOR_BOTH));
}
return motionBrickList;
}
private List<Brick> setupSoundCategoryList(Context context) {
List<Brick> soundBrickList = new ArrayList<>();
soundBrickList.add(new PlaySoundBrick());
soundBrickList.add(new PlaySoundAndWaitBrick());
soundBrickList.add(new StopAllSoundsBrick());
soundBrickList.add(new SetVolumeToBrick(BrickValues.SET_VOLUME_TO));
// workaround to set a negative default value for a Brick
float positiveDefaultValueChangeVolumeBy = Math.abs(BrickValues.CHANGE_VOLUME_BY);
FormulaElement defaultValueChangeVolumeBy = new FormulaElement(ElementType.OPERATOR, Operators.MINUS.name(),
null, null, new FormulaElement(ElementType.NUMBER, String.valueOf(positiveDefaultValueChangeVolumeBy),
null)
);
soundBrickList.add(new ChangeVolumeByNBrick(new Formula(defaultValueChangeVolumeBy)));
soundBrickList.add(new SpeakBrick(context.getString(R.string.brick_speak_default_value)));
soundBrickList.add(new SpeakAndWaitBrick(context.getString(R.string.brick_speak_default_value)));
if (SettingsActivity.isPhiroSharedPreferenceEnabled(context)) {
soundBrickList.add(new PhiroPlayToneBrick(PhiroPlayToneBrick.Tone.DO,
BrickValues.PHIRO_DURATION));
}
soundBrickList.add(new AskSpeechBrick(context.getString(R.string.brick_ask_speech_default_question)));
return soundBrickList;
}
private List<Brick> setupLooksCategoryList(Context context, boolean isBackgroundSprite) {
List<Brick> looksBrickList = new ArrayList<>();
if (!isBackgroundSprite) {
looksBrickList.add(new SetLookBrick());
}
looksBrickList.add(new NextLookBrick());
looksBrickList.add(new PreviousLookBrick());
looksBrickList.add(new SetSizeToBrick(BrickValues.SET_SIZE_TO));
looksBrickList.add(new ChangeSizeByNBrick(BrickValues.CHANGE_SIZE_BY));
looksBrickList.add(new HideBrick());
looksBrickList.add(new ShowBrick());
looksBrickList.add(new AskBrick(context.getString(R.string.brick_ask_default_question)));
if (!isBackgroundSprite) {
looksBrickList.add(new SayBubbleBrick(context.getString(R.string.brick_say_bubble_default_value)));
looksBrickList.add(new SayForBubbleBrick(context.getString(R.string.brick_say_bubble_default_value), 1.0f));
looksBrickList.add(new ThinkBubbleBrick(context.getString(R.string.brick_think_bubble_default_value)));
looksBrickList.add(new ThinkForBubbleBrick(context.getString(R.string.brick_think_bubble_default_value), 1.0f));
}
looksBrickList.add(new SetTransparencyBrick(BrickValues.SET_TRANSPARENCY));
looksBrickList.add(new ChangeTransparencyByNBrick(BrickValues.CHANGE_TRANSPARENCY_EFFECT));
looksBrickList.add(new SetBrightnessBrick(BrickValues.SET_BRIGHTNESS_TO));
looksBrickList.add(new ChangeBrightnessByNBrick(BrickValues.CHANGE_BRITHNESS_BY));
looksBrickList.add(new SetColorBrick(BrickValues.SET_COLOR_TO));
looksBrickList.add(new ChangeColorByNBrick(BrickValues.CHANGE_COLOR_BY));
looksBrickList.add(new ClearGraphicEffectBrick());
looksBrickList.add(new WhenBackgroundChangesBrick());
looksBrickList.add(new SetBackgroundBrick());
looksBrickList.add(new SetBackgroundAndWaitBrick());
looksBrickList.add(new CameraBrick());
looksBrickList.add(new ChooseCameraBrick());
looksBrickList.add(new FlashBrick());
if (SettingsActivity.isPhiroSharedPreferenceEnabled(context)) {
looksBrickList.add(new PhiroRGBLightBrick(PhiroRGBLightBrick.Eye.BOTH, BrickValues.PHIRO_VALUE_RED, BrickValues.PHIRO_VALUE_GREEN, BrickValues.PHIRO_VALUE_BLUE));
}
return looksBrickList;
}
private List<Brick> setupPenCategoryList(Sprite sprite) {
List<Brick> penBrickList = new ArrayList<>();
if (!isBackground(sprite)) {
penBrickList.add(new PenDownBrick());
penBrickList.add(new PenUpBrick());
penBrickList.add(new SetPenSizeBrick(4));
penBrickList.add(new SetPenColorBrick(0, 0, 255));
penBrickList.add(new StampBrick());
}
penBrickList.add(new ClearBackgroundBrick());
return penBrickList;
}
private List<Brick> setupDataCategoryList(Context context) {
List<Brick> dataBrickList = new ArrayList<>();
dataBrickList.add(new SetVariableBrick(BrickValues.SET_VARIABLE));
dataBrickList.add(new ChangeVariableBrick(BrickValues.CHANGE_VARIABLE));
dataBrickList.add(new ShowTextBrick(BrickValues.X_POSITION, BrickValues.Y_POSITION));
dataBrickList.add(new HideTextBrick());
dataBrickList.add(new AddItemToUserListBrick(BrickValues.ADD_ITEM_TO_USERLIST));
dataBrickList.add(new DeleteItemOfUserListBrick(BrickValues.DELETE_ITEM_OF_USERLIST));
dataBrickList.add(new InsertItemIntoUserListBrick(BrickValues.INSERT_ITEM_INTO_USERLIST_VALUE, BrickValues.INSERT_ITEM_INTO_USERLIST_INDEX));
dataBrickList.add(new ReplaceItemInUserListBrick(BrickValues.REPLACE_ITEM_IN_USERLIST_VALUE, BrickValues.REPLACE_ITEM_IN_USERLIST_INDEX));
dataBrickList.add(new AskBrick(context.getString(R.string.brick_ask_default_question)));
dataBrickList.add(new AskSpeechBrick(context.getString(R.string.brick_ask_speech_default_question)));
return dataBrickList;
}
private List<Brick> setupLegoNxtCategoryList() {
List<Brick> legoNXTBrickList = new ArrayList<>();
legoNXTBrickList.add(new LegoNxtMotorTurnAngleBrick(LegoNxtMotorTurnAngleBrick.Motor.MOTOR_A,
BrickValues.LEGO_ANGLE));
legoNXTBrickList.add(new LegoNxtMotorStopBrick(LegoNxtMotorStopBrick.Motor.MOTOR_A));
legoNXTBrickList.add(new LegoNxtMotorMoveBrick(LegoNxtMotorMoveBrick.Motor.MOTOR_A,
BrickValues.LEGO_SPEED));
legoNXTBrickList.add(new LegoNxtPlayToneBrick(BrickValues.LEGO_FREQUENCY, BrickValues.LEGO_DURATION));
return legoNXTBrickList;
}
private List<Brick> setupLegoEv3CategoryList() {
List<Brick> legoEV3BrickList = new ArrayList<Brick>();
legoEV3BrickList.add(new LegoEv3MotorTurnAngleBrick(LegoEv3MotorTurnAngleBrick.Motor.MOTOR_A,
BrickValues.LEGO_ANGLE));
legoEV3BrickList.add(new LegoEv3MotorMoveBrick(LegoEv3MotorMoveBrick.Motor.MOTOR_A,
BrickValues.LEGO_SPEED));
legoEV3BrickList.add(new LegoEv3MotorStopBrick(LegoEv3MotorStopBrick.Motor.MOTOR_A));
legoEV3BrickList.add(new LegoEv3PlayToneBrick(BrickValues.LEGO_FREQUENCY, BrickValues.LEGO_DURATION, BrickValues.LEGO_VOLUME));
legoEV3BrickList.add(new LegoEv3SetLedBrick(LegoEv3SetLedBrick.LedStatus.LED_GREEN));
return legoEV3BrickList;
}
private List<Brick> setupDroneCategoryList() {
List<Brick> droneBrickList = new ArrayList<>();
droneBrickList.add(new DroneTakeOffLandBrick());
droneBrickList.add(new DroneFlipBrick());
droneBrickList.add(new DroneEmergencyBrick());
droneBrickList.add(new DroneMoveUpBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneMoveDownBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneMoveLeftBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneMoveRightBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneMoveForwardBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneMoveBackwardBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneTurnLeftBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneTurnRightBrick(BrickValues.DRONE_MOVE_BRICK_DEFAULT_TIME_MILLISECONDS, (int) (BrickValues.DRONE_MOVE_BRICK_DEFAULT_MOVE_POWER_PERCENT * 100)));
droneBrickList.add(new DroneSwitchCameraBrick());
/*
Deprecated
droneBrickList.add(new DroneAdvancedConfigBrick());
*/
// Only for demo purpose
/* droneBrickList.add(new SetTextBrick(BrickValues.X_POSITION, BrickValues.Y_POSITION,
BrickValues.STRING_VALUE));*/
return droneBrickList;
}
private List<Brick> setupPhiroProCategoryList() {
List<Brick> phiroProBrickList = new ArrayList<>();
phiroProBrickList.add(new PhiroMotorMoveForwardBrick(PhiroMotorMoveForwardBrick.Motor.MOTOR_LEFT,
BrickValues.PHIRO_SPEED));
phiroProBrickList.add(new PhiroMotorMoveBackwardBrick(PhiroMotorMoveBackwardBrick.Motor.MOTOR_LEFT,
BrickValues.PHIRO_SPEED));
phiroProBrickList.add(new PhiroMotorStopBrick(PhiroMotorStopBrick.Motor.MOTOR_BOTH));
phiroProBrickList.add(new PhiroPlayToneBrick(PhiroPlayToneBrick.Tone.DO,
BrickValues.PHIRO_DURATION));
phiroProBrickList.add(new PhiroRGBLightBrick(PhiroRGBLightBrick.Eye.BOTH, BrickValues.PHIRO_VALUE_RED, BrickValues.PHIRO_VALUE_GREEN, BrickValues.PHIRO_VALUE_BLUE));
phiroProBrickList.add(new PhiroIfLogicBeginBrick());
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_FRONT_LEFT));
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_FRONT_RIGHT));
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_SIDE_LEFT));
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_SIDE_RIGHT));
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_BOTTOM_LEFT));
phiroProBrickList.add(new SetVariableBrick(Sensors.PHIRO_BOTTOM_RIGHT));
return phiroProBrickList;
}
private List<Brick> setupArduinoCategoryList() {
List<Brick> arduinoBrickList = new ArrayList<>();
arduinoBrickList.add(new ArduinoSendDigitalValueBrick(BrickValues.ARDUINO_DIGITAL_INITIAL_PIN_NUMBER, BrickValues.ARDUINO_DIGITAL_INITIAL_PIN_VALUE));
arduinoBrickList.add(new ArduinoSendPWMValueBrick(BrickValues.ARDUINO_PWM_INITIAL_PIN_NUMBER, BrickValues.ARDUINO_PWM_INITIAL_PIN_VALUE));
return arduinoBrickList;
}
private List<Brick> setupRaspiCategoryList() {
List<Brick> raspiBrickList = new ArrayList<>();
raspiBrickList.add(new WhenRaspiPinChangedBrick(null));
raspiBrickList.add(new RaspiIfLogicBeginBrick(BrickValues.RASPI_DIGITAL_INITIAL_PIN_NUMBER));
raspiBrickList.add(new RaspiSendDigitalValueBrick(BrickValues.RASPI_DIGITAL_INITIAL_PIN_NUMBER, BrickValues.RASPI_DIGITAL_INITIAL_PIN_VALUE));
raspiBrickList.add(new RaspiPwmBrick(BrickValues.RASPI_DIGITAL_INITIAL_PIN_NUMBER, BrickValues
.RASPI_PWM_INITIAL_FREQUENCY, BrickValues.RASPI_PWM_INITIAL_PERCENTAGE));
return raspiBrickList;
}
private boolean isBackground(Sprite sprite) {
if (ProjectManager.getInstance().getCurrentScene().getSpriteList().indexOf(sprite) == 0) {
return true;
}
return false;
}
public String getBrickCategory(Brick brick, Sprite sprite, Context context) {
List<Brick> categoryBricks = new LinkedList<>();
categoryBricks = setupControlCategoryList(context);
Resources res = context.getResources();
Configuration config = res.getConfiguration();
Locale savedLocale = config.locale;
config.locale = Locale.ENGLISH;
res.updateConfiguration(config, null);
String category = "No match";
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_control);
}
}
categoryBricks = setupEventCategoryList(context);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_event);
}
}
categoryBricks = setupMotionCategoryList(sprite, context);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_motion);
}
}
categoryBricks = setupSoundCategoryList(context);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_sound);
}
}
boolean isBackgroundSprite = sprite.getName().equals(context.getString(R.string.background));
categoryBricks = setupLooksCategoryList(context, isBackgroundSprite);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_looks);
}
}
categoryBricks = setupPenCategoryList(sprite);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_pen);
}
}
categoryBricks = setupUserBricksCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_user_bricks);
}
}
categoryBricks = setupDataCategoryList(context);
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_data);
}
}
categoryBricks = setupLegoNxtCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_lego_nxt);
}
}
categoryBricks = setupArduinoCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_arduino);
}
}
categoryBricks = setupDroneCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_drone);
}
}
categoryBricks = setupPhiroProCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_phiro);
}
}
categoryBricks = setupRaspiCategoryList();
for (Brick categoryBrick : categoryBricks) {
if (brick.getClass().equals(categoryBrick.getClass())) {
category = res.getString(R.string.category_raspi);
}
}
if (brick instanceof AskBrick) {
category = res.getString(R.string.category_looks);
} else if (brick instanceof AskSpeechBrick) {
category = res.getString(R.string.category_sound);
} else if (brick instanceof WhenClonedBrick) {
category = res.getString(R.string.category_control);
} else if (brick instanceof WhenBackgroundChangesBrick) {
category = res.getString(R.string.category_event);
} else if (brick instanceof SetVariableBrick) {
category = res.getString(R.string.category_data);
}
config.locale = savedLocale;
res.updateConfiguration(config, null);
return category;
}
}