/* * This file is part of the Remote Sensor Actuator Interface (ReSAI). * * Copyright(c) Andreas Kipp, Frederic Siepmann * http://opensource.cit-ec.de/projects/resai * * This file may be licensed under the terms of of the * GNU Lesser General Public License Version 3 (the ``LGPL''), * or (at your option) any later version. * * Software distributed under the License is distributed * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either * express or implied. See the LGPL for the specific language * governing rights and limitations. * * You should have received a copy of the LGPL along with this * program. If not, go to http://www.gnu.org/licenses/lgpl.html * or write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * The development of this software was supported by the * Excellence Cluster EXC 277 Cognitive Interaction Technology. * The Excellence Cluster EXC 277 is a grant of the Deutsche * Forschungsgemeinschaft (DFG) in the context of the German * Excellence Initiative. * */ /** * Tab showing scripts available for the icub. * * @author akipp */ package de.unibi.airobots.resaidroid.tabactivities; import java.util.ArrayList; import java.util.HashMap; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.AdapterView.OnItemSelectedListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; import de.unibi.airobots.resaidroid.R; import de.unibi.airobots.resaidroid.constants.ServerConfig; import de.unibi.airobots.resaidroid.helper.EasyDialog; import de.unibi.airobots.resaidroid.tabactivities.template.TabTemplate; public class TabScripts extends TabTemplate implements OnItemSelectedListener, SeekBar.OnSeekBarChangeListener, OnTouchListener, OnItemLongClickListener { private Spinner m_ScriptSpinner; private ArrayAdapter m_adapterForScriptSpinner; private Button btnGetScript; private Button btnCreateScript; private Button btnExecuteScript; private Button btnInterrupt; private SeekBar seekMoveDelay; private TextView txtMoveDelay; private ListView lvScript; private ArrayList scriptlines; private ArrayAdapter scriptlinesAdapter; private ArrayList scripts = new ArrayList(); private long selLineId = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.scripts); txtMoveDelay = (TextView) findViewById(R.id.txtMoveDelay); seekMoveDelay = (SeekBar) findViewById(R.id.seekMoveDelay); seekMoveDelay.setOnSeekBarChangeListener(this); scriptlines = new ArrayList(); scriptlinesAdapter = new ArrayAdapter(this, R.layout.scripts_list_item, scriptlines); if (scriptlinesAdapter != null) { lvScript = (ListView) findViewById(R.id.lvScript); if (lvScript != null) { lvScript.setAdapter(scriptlinesAdapter); } } btnGetScript = (Button) findViewById(R.id.btnGetScript); btnGetScript.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (m_ScriptSpinner.getSelectedItem() != null) { scriptlines.clear(); lvScript.invalidate(); scriptlinesAdapter.notifyDataSetChanged(); addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty( "SCRIPT", m_ScriptSpinner.getItemAtPosition( m_ScriptSpinner.getSelectedItemPosition()) .toString()); addProperty("ACTION", "get_script"); sendMessage(ServerConfig.RECIPIENT_FULL); } else { EasyDialog.makeToast(getApplicationContext(), "Please select a script first!"); } } }); btnInterrupt = (Button) findViewById(R.id.btnInterrupt); btnInterrupt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty("ACTION", "interrupt"); sendMessage(ServerConfig.RECIPIENT_FULL); } }); btnCreateScript = (Button) findViewById(R.id.btnCreateScript); btnCreateScript.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { createScriptPopup(); } }); lvScript.setOnTouchListener(this); lvScript.setOnItemSelectedListener(this); lvScript.setOnItemLongClickListener(this); registerForContextMenu(lvScript); btnExecuteScript = (Button) findViewById(R.id.btnExecuteScript); btnExecuteScript.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (m_ScriptSpinner.getSelectedItem() != null) { addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty( "SCRIPT", m_ScriptSpinner.getItemAtPosition( m_ScriptSpinner.getSelectedItemPosition()) .toString()); addProperty("ACTION", "execute_script"); addProperty("MOVE_DELAY", String.valueOf(seekMoveDelay.getProgress())); sendMessage(ServerConfig.RECIPIENT_FULL); } else { EasyDialog.makeToast(getApplicationContext(), "Please select a script first!"); } } }); // REQUEST SCRIPTS addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty("ACTION", "get_scriptnames"); sendMessage(ServerConfig.RECIPIENT_FULL); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); // REQUEST SCRIPTS addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty("ACTION", "get_scriptnames"); sendMessage(ServerConfig.RECIPIENT_FULL); } private void createScriptPopup() { AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Create new script"); alert.setMessage("Enter name for new script:"); // Set an EditText view to get user input final EditText input = new EditText(this); alert.setView(input); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String value = input.getText().toString(); // Do something with value! if (value.length() > 0) { addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty("ACTION", "create_script"); addProperty("SCRIPT", value); sendMessage(ServerConfig.RECIPIENT_FULL); } else { EasyDialog.makeToast(getApplicationContext(), "No script name given!"); } } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Canceled. } }); alert.show(); } private void initScriptSpinner() { // SCRIPT SPINNER m_ScriptSpinner = (Spinner) findViewById(R.id.spinnerScript); m_adapterForScriptSpinner = new ArrayAdapter(this, android.R.layout.simple_spinner_item); m_adapterForScriptSpinner.clear(); m_adapterForScriptSpinner .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); m_ScriptSpinner.setAdapter(m_adapterForScriptSpinner); for (String scriptname : scripts) { m_adapterForScriptSpinner.add(scriptname); } // initScriptSpinner(); m_ScriptSpinner.setOnItemSelectedListener(this); } @Override public void processProperties() { messageHandler.post(new Runnable() { public void run() { try { synchronized (receivedProperties) { if (receivedProperties .containsKey("ScripterThread_ACTION")) { if (receivedProperties.get("ScripterThread_ACTION") .equals("send_script")) { scriptlines.clear(); lvScript.invalidate(); scriptlinesAdapter.notifyDataSetChanged(); HashMap scriptElements = new HashMap(); for (String prop : receivedProperties.keySet()) { if (prop.startsWith("ScripterThread_LINE_", 0) && prop.length() > 20) { scriptElements.put(Integer .parseInt(prop.substring(20)), receivedProperties.get(prop)); } } for (int i = 0; i < scriptElements.size(); i++) { scriptlines.add(scriptElements.get(i + 1)); lvScript.invalidate(); scriptlinesAdapter.notifyDataSetChanged(); } } else if (receivedProperties.get( "ScripterThread_ACTION").equals( "scriptnames")) { scripts.clear(); for (String prop : receivedProperties.keySet()) { if (prop.startsWith( "ScripterThread_SCRIPT_", 0)) { scripts.add(receivedProperties .get(prop)); } } initScriptSpinner(); } else if (receivedProperties.get( "ScripterThread_ACTION").equals("error")) { EasyDialog .makeToast( getApplicationContext(), receivedProperties .get("ScripterThread_ERROR_MESSAGE")); } } } } catch (Exception e) { // TODO: handle exception Log.i(TAG, "###ERROR " + e.getMessage()); } } }); } @Override public void onItemSelected(AdapterView parent, View view, int pos, long id) { if (parent.equals(lvScript)) { selLineId = id; } } @Override public void onNothingSelected(AdapterView parent) { } @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return false; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.scriptstouchmenu, menu); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.miDelete: addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty( "SCRIPT", m_ScriptSpinner.getItemAtPosition( m_ScriptSpinner.getSelectedItemPosition()) .toString()); addProperty("ACTION", "del_line"); addProperty("LINE_ID", String.valueOf(selLineId)); sendMessage(ServerConfig.RECIPIENT_FULL); break; case R.id.miMoveUp: addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty( "SCRIPT", m_ScriptSpinner.getItemAtPosition( m_ScriptSpinner.getSelectedItemPosition()) .toString()); addProperty("ACTION", "move_up"); addProperty("LINE_ID", String.valueOf(selLineId)); sendMessage(ServerConfig.RECIPIENT_FULL); break; case R.id.miMoveDown: addProperty("TAG", "ScripterThread"); addProperty("ScripterThread", "True"); addProperty( "SCRIPT", m_ScriptSpinner.getItemAtPosition( m_ScriptSpinner.getSelectedItemPosition()) .toString()); addProperty("ACTION", "move_down"); addProperty("LINE_ID", String.valueOf(selLineId)); sendMessage(ServerConfig.RECIPIENT_FULL); break; default: } return true; } @Override public boolean onItemLongClick(AdapterView parent, View view, int pos, long id) { if (parent.equals(lvScript)) { selLineId = id; } return false; } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (seekBar.equals(seekMoveDelay)) { txtMoveDelay.setText(String.valueOf(progress)); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } }