/*
* 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;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import org.catrobat.catroid.BuildConfig;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.content.Project;
import org.catrobat.catroid.content.Scene;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.drone.DroneServiceWrapper;
import org.catrobat.catroid.drone.DroneStageActivity;
import org.catrobat.catroid.stage.PreStageActivity;
import org.catrobat.catroid.stage.StageActivity;
import org.catrobat.catroid.ui.dialogs.PlaySceneDialog;
import org.catrobat.catroid.ui.dialogs.RenameSpriteDialog;
import java.util.concurrent.locks.Lock;
public class ProgramMenuActivity extends BaseActivity {
public static final String FORWARD_TO_SCRIPT_ACTIVITY = "forwardToScriptActivity";
private static final String TAG = ProgramMenuActivity.class.getSimpleName();
private Lock viewSwitchLock = new ViewSwitchLock();
private SpriteRenamedReceiver spriteRenamedReceiver;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getIntent().getExtras();
if (bundle != null && bundle.containsKey(FORWARD_TO_SCRIPT_ACTIVITY)) {
Intent intent = new Intent(this, ScriptActivity.class);
intent.putExtra(ScriptActivity.EXTRA_FRAGMENT_POSITION, bundle.getInt(FORWARD_TO_SCRIPT_ACTIVITY));
startActivity(intent);
}
setContentView(R.layout.activity_program_menu);
BottomBar.hideAddButton(this);
final ActionBar actionBar = getActionBar();
//The try-catch block is a fix for this bug: https://github.com/Catrobat/Catroid/issues/618
try {
Sprite sprite = ProjectManager.getInstance().getCurrentSprite();
Scene scene = ProjectManager.getInstance().getCurrentScene();
if (sprite != null && scene != null && actionBar != null) {
String title = ProjectManager.getInstance().getCurrentProject().getSceneList().size() > 1 ? scene.getName() + ": " + sprite.getName() : sprite.getName();
actionBar.setTitle(title);
actionBar.setHomeButtonEnabled(true);
}
} catch (NullPointerException nullPointerException) {
Log.e(TAG, "onCreate: NPE -> finishing", nullPointerException);
finish();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_rename_sprite:
showRenameDialog();
break;
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
if (ProjectManager.getInstance().getCurrentSpritePosition() == 0) {
((Button) findViewById(R.id.program_menu_button_looks)).setText(R.string.backgrounds);
} else {
((Button) findViewById(R.id.program_menu_button_looks)).setText(R.string.looks);
}
//Hide NFC if option is not set
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
if (sharedPreferences.getBoolean("setting_nfc_bricks", false) && BuildConfig.FEATURE_NFC_ENABLED) {
findViewById(R.id.program_menu_button_nfctags).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.program_menu_button_nfctags).setVisibility(View.INVISIBLE);
}
if (spriteRenamedReceiver == null) {
spriteRenamedReceiver = new SpriteRenamedReceiver();
}
IntentFilter intentFilterSpriteRenamed = new IntentFilter(ScriptActivity.ACTION_SPRITE_RENAMED);
getBaseContext().registerReceiver(spriteRenamedReceiver, intentFilterSpriteRenamed);
}
@Override
public void onPause() {
super.onPause();
if (spriteRenamedReceiver != null) {
getBaseContext().unregisterReceiver(spriteRenamedReceiver);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
if (ProjectManager.getInstance().getCurrentSpritePosition() == 0) {
return super.onCreateOptionsMenu(menu);
}
getMenuInflater().inflate(R.menu.menu_program_menu, menu);
return super.onCreateOptionsMenu(menu);
}
private class SpriteRenamedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ScriptActivity.ACTION_SPRITE_RENAMED)) {
String newSpriteName = intent.getExtras().getString(RenameSpriteDialog.EXTRA_NEW_SPRITE_NAME);
ProjectManager.getInstance().getCurrentSprite().rename(newSpriteName);
final ActionBar actionBar = getActionBar();
actionBar.setTitle(newSpriteName);
}
}
}
private void showRenameDialog() {
Sprite sprite = ProjectManager.getInstance().getCurrentSprite();
RenameSpriteDialog dialog = new RenameSpriteDialog(R.string.rename_sprite_dialog, R.string.sprite_name, sprite
.getName());
dialog.show(getFragmentManager(), RenameSpriteDialog.DIALOG_FRAGMENT_TAG);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == PreStageActivity.REQUEST_RESOURCES_INIT && resultCode == RESULT_OK) {
Intent intent;
if (DroneServiceWrapper.checkARDroneAvailability()) {
intent = new Intent(ProgramMenuActivity.this, DroneStageActivity.class);
} else {
intent = new Intent(ProgramMenuActivity.this, StageActivity.class);
}
startActivity(intent);
}
}
public void handleScriptsButton(View view) {
if (!viewSwitchLock.tryLock()) {
return;
}
startScriptActivity(ScriptActivity.FRAGMENT_SCRIPTS);
}
public void handleLooksButton(View view) {
if (!viewSwitchLock.tryLock()) {
return;
}
startScriptActivity(ScriptActivity.FRAGMENT_LOOKS);
}
public void handleSoundsButton(View view) {
if (!viewSwitchLock.tryLock()) {
return;
}
startScriptActivity(ScriptActivity.FRAGMENT_SOUNDS);
}
public void handleNfcTagsButton(View view) {
if (!viewSwitchLock.tryLock()) {
return;
}
startScriptActivity(ScriptActivity.FRAGMENT_NFCTAGS);
}
public void handlePlayButton(View view) {
if (!viewSwitchLock.tryLock()) {
return;
}
Project currentProject = ProjectManager.getInstance().getCurrentProject();
Scene currentScene = ProjectManager.getInstance().getCurrentScene();
if (currentScene.getName().equals(currentProject.getDefaultScene().getName())) {
ProjectManager.getInstance().setSceneToPlay(currentScene);
ProjectManager.getInstance().setStartScene(currentScene);
startPreStageActivity();
return;
}
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
PlaySceneDialog playSceneDialog = new PlaySceneDialog();
playSceneDialog.show(fragmentTransaction, PlaySceneDialog.DIALOG_FRAGMENT_TAG);
}
public void startPreStageActivity() {
Intent intent = new Intent(this, PreStageActivity.class);
startActivityForResult(intent, PreStageActivity.REQUEST_RESOURCES_INIT);
}
private void startScriptActivity(int fragmentPosition) {
Intent intent = new Intent(this, ScriptActivity.class);
intent.putExtra(ScriptActivity.EXTRA_FRAGMENT_POSITION, fragmentPosition);
startActivity(intent);
}
}