17 package eu.intermodalics.tango_ros_streamer.activities;
19 import android.animation.AnimatorInflater;
20 import android.animation.AnimatorSet;
21 import android.app.DialogFragment;
22 import android.app.FragmentManager;
23 import android.content.Intent;
24 import android.content.ServiceConnection;
25 import android.content.SharedPreferences;
26 import android.net.Uri;
27 import android.content.res.Configuration;
28 import android.net.wifi.WifiManager;
29 import android.os.AsyncTask;
30 import android.os.Bundle;
31 import android.os.StrictMode;
32 import android.preference.PreferenceManager;
33 import android.support.design.widget.Snackbar;
34 import android.support.v7.widget.Toolbar;
35 import android.text.format.Formatter;
36 import android.text.method.ScrollingMovementMethod;
37 import android.util.Log;
38 import android.view.Menu;
39 import android.view.MenuInflater;
40 import android.view.MenuItem;
41 import android.view.View;
42 import android.widget.Button;
43 import android.widget.CompoundButton;
44 import android.widget.Switch;
45 import android.widget.ImageView;
46 import android.widget.TextView;
47 import android.widget.Toast;
49 import org.apache.commons.io.FilenameUtils;
50 import org.ros.address.InetAddressFactory;
51 import org.ros.android.NodeMainExecutorService;
52 import org.ros.android.NodeMainExecutorServiceListener;
53 import org.ros.exception.RosRuntimeException;
54 import org.ros.node.ConnectedNode;
55 import org.ros.node.DefaultNodeListener;
56 import org.ros.node.NodeConfiguration;
57 import org.ros.node.NodeListener;
58 import org.ros.node.NodeMainExecutor;
62 import java.util.ArrayList;
63 import java.util.HashMap;
64 import java.util.List;
65 import java.util.concurrent.CountDownLatch;
79 import tango_ros_messages.TangoConnectRequest;
80 import tango_ros_messages.TangoConnectResponse;
84 TangoServiceClientNode.CallbackListener {
86 private static final String
TAGS_TO_LOG = TAG +
", " +
"tango_client_api, " +
"Registrar, " 87 +
"DefaultPublisher, " +
"native, " +
"DefaultPublisher" ;
106 MASTER_NOT_CONNECTED,
152 super(
"TangoRosStreamer",
"TangoRosStreamer");
156 super(notificationTicker, notificationTitle);
168 Log.i(TAG,
"Version of Tango is ok.");
171 Log.e(TAG, getResources().getString(R.string.tango_version_error));
176 Log.e(TAG, getString(R.string.tango_bind_error));
184 if (mRosStatus != status) {
188 SharedPreferences.Editor editor = mSharedPref.edit();
189 editor.putInt(getString(R.string.ros_status), status.ordinal());
194 runOnUiThread(
new Runnable() {
197 if (status == RosStatus.UNKNOWN) {
198 mRosLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_orange_light));
199 }
else if (status == RosStatus.MASTER_CONNECTED) {
201 mRosLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_green_light));
203 if (mSnackbarRosReconnection != null && mSnackbarRosReconnection.isShown()) {
204 mSnackbarRosReconnection.dismiss();
207 mToolbarMenu.findItem(R.id.settings).setIcon(R.drawable.ic_settings_white_24dp);
208 }
else if (status == RosStatus.MASTER_NOT_CONNECTED) {
210 mRosLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_red_light));
212 mSnackbarRosReconnection = Snackbar.make(findViewById(android.R.id.content),
213 getString(R.string.snackbar_text_reconnect_ros), Snackbar.LENGTH_INDEFINITE);
214 mSnackbarRosReconnection.setAction(getString(R.string.snackbar_action_text_reconnect_ros),
215 new View.OnClickListener() {
217 public void onClick(View view) {
218 mRunLocalMaster = mSharedPref.getBoolean(getString(R.string.pref_master_is_local_key),
false);
219 mMasterUri = mSharedPref.getString(getString(R.string.pref_master_uri_key),
220 getResources().getString(R.string.pref_master_uri_default));
221 mUriTextView.setText(mMasterUri);
226 View snackBarView = mSnackbarRosReconnection.getView();
227 snackBarView.setBackgroundColor(getResources().getColor(android.R.color.holo_red_dark));
228 mSnackbarRosReconnection.show();
230 AnimatorSet
set = (AnimatorSet) AnimatorInflater.loadAnimator(
RunningActivity.this, R.animator.master_uri_text_animation);
231 set.setTarget(mUriTextView);
234 mToolbarMenu.findItem(R.id.settings).setIcon(R.drawable.ic_settings_red_24dp);
241 if (mTangoStatus != status) {
242 mTangoStatus = status;
251 runOnUiThread(
new Runnable() {
255 mTangoLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_orange_light));
256 }
else if (status ==
TangoStatus.SERVICE_CONNECTED) {
257 mTangoLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_green_light));
259 mTangoLightImageView.setImageDrawable(getResources().getDrawable(R.drawable.btn_radio_on_red_light));
266 mCreateNewMap = mSharedPref.getBoolean(getString(R.string.pref_create_new_map_key),
false);
267 runOnUiThread(
new Runnable() {
270 mSaveMapButton.setEnabled(!mMapSaved);
272 mSaveMapButton.setVisibility(View.VISIBLE);
273 mLoadOccupancyGridButton.setVisibility(View.GONE);
275 mSaveMapButton.setVisibility(View.GONE);
276 mLoadOccupancyGridButton.setVisibility(View.VISIBLE);
287 runOnUiThread(
new Runnable() {
290 Toast.makeText(getApplicationContext(), messageId, Toast.LENGTH_LONG).show();
296 FragmentManager manager = getFragmentManager();
298 saveMapDialog.setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
299 saveMapDialog.show(manager,
"SaveMapDialog");
303 FragmentManager manager = getFragmentManager();
305 Bundle bundle =
new Bundle();
306 bundle.putBoolean(getString(R.string.show_load_occupancy_grid_empty_key), nameList.isEmpty());
307 bundle.putBoolean(getString(R.string.show_load_occupancy_grid_error_key), !firstTry);
308 bundle.putStringArrayList(getString(R.string.list_names_occupancy_grid_key), nameList);
309 loadOccupancyGridDialog.setArguments(bundle);
310 loadOccupancyGridDialog.setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
311 loadOccupancyGridDialog.show(manager,
"LoadOccupancyGridDialog");
316 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
318 mUriTextView = (TextView) findViewById(R.id.master_uri);
319 mUriTextView.setText(mMasterUri);
320 mRosLightImageView = (ImageView) findViewById(R.id.is_ros_ok_image);
321 mTangoLightImageView = (ImageView) findViewById(R.id.is_tango_ok_image);
322 mlogSwitch = (Switch) findViewById(R.id.log_switch);
323 mlogSwitch.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
325 public void onCheckedChanged(CompoundButton compoundButton,
boolean isChecked) {
326 mDisplayLog = isChecked;
327 mLogTextView.setVisibility(isChecked ? View.VISIBLE : View.INVISIBLE);
330 mLogTextView = (TextView)findViewById(R.id.log_view);
331 mLogTextView.setMovementMethod(
new ScrollingMovementMethod());
332 mSaveMapButton = (Button) findViewById(R.id.save_map_button);
333 mSaveMapButton.setOnClickListener(
new View.OnClickListener() {
335 public void onClick(View view) {
339 mLoadOccupancyGridButton = (Button) findViewById(R.id.load_occupancy_grid_button);
340 mLoadOccupancyGridButton.setOnClickListener(
new View.OnClickListener() {
342 public void onClick(View view) {
343 mOccupancyGridNameList =
new ArrayList<String>();
345 String directory = mParameterNode.getStringParam(getString(R.string.occupancy_grid_directory_key));
346 File occupancyGridDirectory =
new File(directory);
347 if (occupancyGridDirectory != null && occupancyGridDirectory.isDirectory()) {
348 File[] files = occupancyGridDirectory.listFiles();
349 for (File file : files) {
350 if (FilenameUtils.getExtension(file.getName()).equals(
"yaml")) {
351 mOccupancyGridNameList.add(FilenameUtils.removeExtension(file.getName()));
356 }
catch (RuntimeException e) {
365 assert(mapName !=null && !mapName.isEmpty());
366 mSaveMapButton.setEnabled(
false);
367 new AsyncTask<Void, Void, Void>() {
369 protected Void doInBackground(Void... params) {
370 mTangoServiceClientNode.callSaveMapService(mapName);
378 final String mapName,
final String mapUuid) {
383 runOnUiThread(
new Runnable() {
386 mSaveMapButton.setEnabled(!mMapSaved);
387 mSnackbarLoadNewMap = Snackbar.make(findViewById(android.R.id.content),
388 getString(R.string.snackbar_text_load_new_map), Snackbar.LENGTH_INDEFINITE);
389 mSnackbarLoadNewMap.setAction(getString(R.string.snackbar_action_text_load_new_map),
new View.OnClickListener() {
391 public void onClick(View view) {
393 mParameterNode.changeSettingsToLocalizeInMap(mapUuid, getString(R.string.pref_create_new_map_key),
394 getString(R.string.pref_localization_mode_key), getString(R.string.pref_localization_map_uuid_key));
396 }
catch (RuntimeException e) {
401 mSnackbarLoadNewMap.show();
405 Log.e(TAG,
"Error while saving map: " + message);
411 assert(occupancyGridName !=null && !occupancyGridName.isEmpty());
412 mLoadOccupancyGridButton.setEnabled(
false);
413 new AsyncTask<Void, Void, Void>() {
415 protected Void doInBackground(Void... params) {
416 mTangoServiceClientNode.callLoadOccupancyGridService(occupancyGridName);
424 boolean aligned, String mapUuid) {
433 Log.e(TAG,
"Error while loading occupancy grid: " + message);
437 runOnUiThread(
new Runnable() {
440 mLoadOccupancyGridButton.setEnabled(
true);
447 if (response != TangoConnectResponse.TANGO_SUCCESS) {
448 Log.e(TAG,
"Error connecting to Tango: " + response +
", message: " + message);
457 if (response != TangoConnectResponse.TANGO_SUCCESS) {
458 Log.e(TAG,
"Error disconnecting from Tango: " + response +
", message: " + message);
469 if (response != TangoConnectResponse.TANGO_SUCCESS) {
470 Log.e(TAG,
"Error reconnecting to Tango: " + response +
", message: " + message);
478 mUuidsNamesHashMap =
new HashMap<>();
479 if (mapUuids == null || mapNames == null)
return;
480 assert(mapUuids.size() == mapNames.size());
481 for (
int i = 0; i < mapUuids.size(); ++i) {
482 mUuidsNamesHashMap.put(mapUuids.get(i), mapNames.get(i));
484 if(mParameterNode != null) {
486 mParameterNode.setPreferencesFromParameterServer();
487 }
catch (RuntimeException e) {
492 settingsActivityIntent.putExtra(getString(R.string.uuids_names_map), mUuidsNamesHashMap);
493 this.sendBroadcast(settingsActivityIntent);
499 Log.e(TAG,
"Invalid Tango status " + status);
505 mParameterNode.setPreferencesFromParameterServer();
506 }
catch (RuntimeException e) {
510 if (mSnackbarLoadNewMap != null && mSnackbarLoadNewMap.isShown()) {
511 mSnackbarLoadNewMap.dismiss();
519 mTangoServiceClientNode.callGetMapUuidsService();
523 Intent intent =
new Intent();
524 intent.setAction(REQUEST_TANGO_PERMISSION_ACTION);
525 intent.putExtra(EXTRA_KEY_PERMISSIONTYPE, permissionType);
526 startActivityForResult(intent, requestCode);
530 protected void onCreate(Bundle savedInstanceState) {
531 super.onCreate(savedInstanceState);
532 Thread.setDefaultUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler() {
533 public void uncaughtException(Thread
t, Throwable e) {
534 Log.e(TAG,
"Uncaught exception of type " + e.getClass());
540 if (android.os.Build.VERSION.SDK_INT > 9) {
541 StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
542 StrictMode.setThreadPolicy(policy);
544 mSharedPref = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
545 mRunLocalMaster = mSharedPref.getBoolean(getString(R.string.pref_master_is_local_key),
false);
546 mMasterUri = mSharedPref.getString(getString(R.string.pref_master_uri_key),
547 getResources().getString(R.string.pref_master_uri_default));
548 mCreateNewMap = mSharedPref.getBoolean(getString(R.string.pref_create_new_map_key),
false);
549 String logFileName = mSharedPref.getString(getString(R.string.pref_log_file_key),
550 getString(R.string.pref_log_file_default));
552 mLogger =
new Logger(
this, mLogTextView, TAGS_TO_LOG, logFileName, LOG_TEXT_MAX_LENGTH);
557 super.onConfigurationChanged(newConfig);
561 mlogSwitch.setChecked(mDisplayLog);
562 mLogTextView.setText(mLogger.getLogText());
568 inflater.inflate(R.menu.menu, menu);
575 switch (item.getItemId()) {
577 if(mParameterNode != null) {
579 mParameterNode.setPreferencesFromParameterServer();
580 }
catch (RuntimeException e) {
585 settingsActivityIntent.putExtra(getString(R.string.uuids_names_map), mUuidsNamesHashMap);
589 mLogger.saveLogToFile();
590 Intent shareFileIntent =
new Intent(Intent.ACTION_SEND);
591 shareFileIntent.setType(
"text/plain");
592 shareFileIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(mLogger.getLogFile()));
593 startActivity(shareFileIntent);
596 return super.onOptionsItemSelected(item);
602 Log.i(TAG,
"Unbind tango service");
611 if (mParameterNode != null) {
613 mParameterNode.setPreferencesFromParameterServer();
614 }
catch (RuntimeException e) {
618 this.nodeMainExecutorService.forceShutdown();
623 if (resultCode == RESULT_CANCELED) {
627 mParameterNode != null) {
629 mParameterNode.uploadPreferencesToParameterServer();
630 }
catch (RuntimeException e) {
635 if (data != null && data.getBooleanExtra(RESTART_TANGO,
false)) {
640 mRunLocalMaster = mSharedPref.getBoolean(getString(R.string.pref_master_is_local_key),
false);
641 mMasterUri = mSharedPref.getString(getString(R.string.pref_master_uri_key),
642 getResources().getString(R.string.pref_master_uri_default));
643 mUriTextView.setText(mMasterUri);
644 String logFileName = mSharedPref.getString(getString(R.string.pref_log_file_key),
645 getString(R.string.pref_log_file_default));
646 mLogger.setLogFileName(logFileName);
653 String logFileName = mSharedPref.getString(getString(R.string.pref_log_file_key),
654 getString(R.string.pref_log_file_default));
655 mLogger.setLogFileName(logFileName);
656 if (mRosStatus == RosStatus.MASTER_NOT_CONNECTED && mSnackbarRosReconnection != null) {
659 mSnackbarRosReconnection.show();
664 if (requestCode == REQUEST_CODE_ADF_PERMISSION || requestCode == REQUEST_CODE_DATASET_PERMISSION) {
665 if (resultCode == RESULT_CANCELED) {
669 if (requestCode == REQUEST_CODE_ADF_PERMISSION) {
671 mAdfPermissionHasBeenAnswered =
true;
673 if (requestCode == REQUEST_CODE_DATASET_PERMISSION) {
675 mDatasetPermissionHasBeenAnswered =
true;
677 if (mAdfPermissionHasBeenAnswered && mDatasetPermissionHasBeenAnswered) {
680 Log.i(TAG,
"initAndStartRosJavaNode");
692 mRosConnectionLatch =
new CountDownLatch(1);
693 new MasterConnectionChecker(mMasterUri.toString(),
694 new MasterConnectionChecker.UserHook() {
696 public void onSuccess(Object o) {
698 mRosConnectionLatch.countDown();
702 public void onError(Throwable
t) {
704 Log.e(TAG, getString(R.string.ros_init_error));
706 mRosConnectionLatch.countDown();
715 if (mParameterNode != null) {
717 mParameterNode.setPreferencesFromParameterServer();
718 }
catch (RuntimeException e) {
722 mTangoServiceClientNode.callTangoConnectService(TangoConnectRequest.RECONNECT);
726 protected void init(NodeMainExecutor nodeMainExecutor) {
727 NodeConfiguration nodeConfiguration;
729 nodeConfiguration = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
730 nodeConfiguration.setMasterUri(this.nodeMainExecutorService.getMasterUri());
731 }
catch (RosRuntimeException e) {
733 Log.e(TAG, getString(R.string.network_error));
738 if (mRosStatus == RosStatus.MASTER_NOT_CONNECTED) {
742 HashMap<String, String> tangoConfigurationParameters =
new HashMap<String, String>();
743 tangoConfigurationParameters.put(getString(R.string.pref_create_new_map_key),
"boolean");
744 tangoConfigurationParameters.put(getString(R.string.pref_enable_depth_key),
"boolean");
745 tangoConfigurationParameters.put(getString(R.string.pref_enable_color_camera_key),
"boolean");
746 tangoConfigurationParameters.put(getString(R.string.pref_localization_mode_key),
"int_as_string");
747 tangoConfigurationParameters.put(getString(R.string.pref_localization_map_uuid_key),
"string");
748 mParameterNode =
new ParameterNode(
this, tangoConfigurationParameters);
749 nodeConfiguration.setNodeName(mParameterNode.getDefaultNodeName());
750 nodeMainExecutor.execute(mParameterNode, nodeConfiguration);
752 mTangoServiceClientNode =
new TangoServiceClientNode();
753 mTangoServiceClientNode.setCallbackListener(
this);
754 nodeConfiguration.setNodeName(mTangoServiceClientNode.getDefaultNodeName());
755 nodeMainExecutor.execute(mTangoServiceClientNode, nodeConfiguration);
759 nodeMainExecutor.execute(mImuNode, nodeConfiguration);
769 nodeMainExecutor.execute(mTangoNodeletManager, nodeConfiguration,
new ArrayList<NodeListener>(){{
770 add(
new DefaultNodeListener() {
772 public void onStart(ConnectedNode connectedNode) {
774 while (count < MAX_TANGO_CONNECTION_TRY &&
775 !mTangoServiceClientNode.callTangoConnectService(TangoConnectRequest.CONNECT)) {
778 Log.e(TAG,
"Trying to connect to Tango, attempt " + count);
780 }
catch (InterruptedException e) {
784 if (count >= MAX_TANGO_CONNECTION_TRY) {
793 Log.e(TAG, getResources().getString(R.string.tango_version_error));
798 Log.e(TAG, getString(R.string.tango_lib_error));
810 boolean appPreviouslyStarted = mSharedPref.getBoolean(getString(R.string.pref_previously_started_key),
false);
811 if (appPreviouslyStarted) {
825 this.nodeMainExecutorService.addListener(
new NodeMainExecutorServiceListener() {
827 public void onShutdown(NodeMainExecutorService nodeMainExecutorService) {
829 mLogger.saveLogToFile();
831 android.os.Process.killProcess(android.os.Process.myPid());
834 if (mRunLocalMaster) {
836 this.nodeMainExecutorService.startMaster(
false);
837 mMasterUri = this.nodeMainExecutorService.getMasterUri().toString();
842 WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(WIFI_SERVICE);
843 String deviceIP = Formatter.formatIpAddress(wifiManager.getConnectionInfo().getIpAddress());
844 mUriTextView = (TextView) findViewById(R.id.master_uri);
845 mUriTextView.setText(
"http://" + deviceIP +
":11311");
846 }
catch (RosRuntimeException e) {
848 Log.e(TAG, getString(R.string.local_master_error));
853 if (mMasterUri != null) {
856 masterUri = URI.create(mMasterUri);
857 }
catch (IllegalArgumentException e) {
858 Log.e(TAG,
"Wrong URI: " + e.getMessage());
861 this.nodeMainExecutorService.setMasterUri(masterUri);
862 new AsyncTask<Void, Void, Void>() {
864 protected Void doInBackground(Void... params) {
870 Log.e(TAG,
"Master URI is null");
881 Log.i(TAG,
"Waiting for " + latchName +
" latch release...");
883 Log.i(TAG, latchName +
" latch released!");
884 }
catch (InterruptedException ie) {
885 Log.w(TAG,
"Warning: continuing before " + latchName +
" latch was released");
boolean onOptionsItemSelected(MenuItem item)
void onGetMapUuidsFinish(List< String > mapUuids, List< String > mapNames)
static final int REQUEST_CODE_DATASET_PERMISSION
boolean onCreateOptionsMenu(Menu menu)
static final int STANDARD_RUN
void saveUuidsNamestoHashMap()
void onConfigurationChanged(Configuration newConfig)
TangoServiceClientNode mTangoServiceClientNode
void switchTangoLight(final TangoStatus status)
ImageView mTangoLightImageView
static final boolean bindTangoService(final Activity activity, ServiceConnection connection)
ArrayList< String > mOccupancyGridNameList
static final String TAGS_TO_LOG
HashMap< String, String > mUuidsNamesHashMap
CountDownLatch mRosConnectionLatch
static final int REQUEST_CODE_ADF_PERMISSION
void onTangoConnectServiceFinish(int response, String message)
void onTangoStatus(int status)
Snackbar mSnackbarLoadNewMap
bool add(const actionlib::TwoIntsGoal &req, actionlib::TwoIntsResult &res)
void onTangoDisconnectServiceFinish(int response, String message)
geometry_msgs::TransformStamped t
static final String RESTART_TANGO
void updateLoadAndSaveMapButtons()
static final int loadTangoSharedLibrary()
static final String REQUEST_TANGO_PERMISSION_ACTION
RunningActivity(String notificationTicker, String notificationTitle)
static final String EXTRA_VALUE_ADF
void setContentView(@LayoutRes int layoutResID)
static boolean isTangoServiceBound()
void onCreate(Bundle savedInstanceState)
void checkRosMasterConnection()
static final int FIRST_RUN
static final String EXTRA_KEY_PERMISSIONTYPE
static final void unbindTangoService(final Context context, ServiceConnection connection)
static final String NEW_UUIDS_NAMES_MAP_ALERT
static final int loadTangoRosNodeSharedLibrary()
ImageView mRosLightImageView
void onActivityResult(int requestCode, int resultCode, Intent data)
void switchRosLight(final RosStatus status)
void waitForLatchUnlock(CountDownLatch latch, String latchName)
GraphName getDefaultNodeName()
ROSCPP_DECL bool execute(const std::string &method, const XmlRpc::XmlRpcValue &request, XmlRpc::XmlRpcValue &response, XmlRpc::XmlRpcValue &payload, bool wait_for_master)
void getTangoPermission(String permissionType, int requestCode)
ParameterNode mParameterNode
boolean mAdfPermissionHasBeenAnswered
void updateTangoStatus(TangoStatus status)
static final int LOG_TEXT_MAX_LENGTH
Snackbar mSnackbarRosReconnection
void startMasterChooser()
bool runTest(const Chain &chain, const int &representation)
boolean mDatasetPermissionHasBeenAnswered
SharedPreferences mSharedPref
static final String EXTRA_VALUE_DATASET
void displayToastMessage(final int messageId)
void onClickOkSaveMapDialog(final String mapName)
static final String NODE_NAME
void onTangoReconnectServiceFinish(int response, String message)
void updateRosStatus(RosStatus status)
Button mLoadOccupancyGridButton
void onClickItemLoadOccupancyGridDialog(final String occupancyGridName)
static final int MAX_TANGO_CONNECTION_TRY
void onLoadOccupancyGridServiceCallFinish(boolean success, final String message, boolean aligned, String mapUuid)
void run(ClassLoader *loader)
static final int ARCH_ERROR
void initAndStartRosJavaNode()
void setSupportActionBar(@Nullable Toolbar toolbar)
static native boolean isTangoVersionOk(Activity callerActivity)
TangoNodeletManager mTangoNodeletManager
void showLoadOccupancyGridDialog(boolean firstTry, java.util.ArrayList< java.lang.String > nameList)
MenuInflater getMenuInflater()
void onSaveMapServiceCallFinish(boolean success, final String message, final String mapName, final String mapUuid)
void init(NodeMainExecutor nodeMainExecutor)