diff --git a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/ADFUUIDListViewActivity.java b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/ADFUUIDListViewActivity.java index 284b6f51..3abb469d 100644 --- a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/ADFUUIDListViewActivity.java +++ b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/ADFUUIDListViewActivity.java @@ -40,15 +40,13 @@ import java.io.File; import java.util.Arrays; -import com.projecttango.experiments.javaarealearning.SetADFNameDialog.SetNameCommunicator; - /** * This class lets you manage ADFs between this class's Application Package folder and API private * space. This show cases mainly three things: Import, Export, Delete an ADF file from API private * space to any known and accessible file path. * */ -public class ADFUUIDListViewActivity extends Activity implements SetNameCommunicator { +public class ADFUUIDListViewActivity extends Activity implements SetADFNameDialog.CallbackListener { private ADFDataSource mADFDataSource; private ListView mUUIDListView, mAppSpaceUUIDListView; ADFUUIDArrayAdapter mADFAdapter, mAppSpaceADFAdapter; @@ -224,8 +222,11 @@ private void showSetNameDialog(String mCurrentUUID) { setADFNameDialog.show(manager, "ADFNameDialog"); } + /** + * Implements SetADFNameDialog.CallbackListener. + */ @Override - public void onSetName(String name, String uuid) { + public void onAdfNameOk(String name, String uuid) { TangoAreaDescriptionMetaData metadata = new TangoAreaDescriptionMetaData(); metadata = mADFDataSource.getTango().loadAreaDescriptionMetaData(uuid); byte[] adfNameBytes = metadata.get("name"); @@ -239,6 +240,15 @@ public void onSetName(String name, String uuid) { mADFAdapter = new ADFUUIDArrayAdapter(this, mUUIDList, mUUIDNames); mUUIDListView.setAdapter(mADFAdapter); } + + + /** + * Implements SetADFNameDialog.CallbackListener. + */ + @Override + public void onAdfNameCancelled() { + // Nothing to do here. + } } /** diff --git a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/AreaLearningActivity.java b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/AreaLearningActivity.java index e260ae40..35a57a19 100644 --- a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/AreaLearningActivity.java +++ b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/AreaLearningActivity.java @@ -45,15 +45,13 @@ import java.text.DecimalFormat; import java.util.ArrayList; -import com.projecttango.experiments.javaarealearning.SetADFNameDialog.SetNameCommunicator; - /** * Main Activity class for the Area Learning API Sample. Handles the connection to the Tango service * and propagation of Tango pose data to OpenGL and Layout views. OpenGL rendering logic is * delegated to the {@link ALRenderer} class. */ public class AreaLearningActivity extends Activity implements View.OnClickListener, - SetNameCommunicator { + SetADFNameDialog.CallbackListener, SaveAdfTask.SaveAdfListener { private static final String TAG = AreaLearningActivity.class.getSimpleName(); private static final int SECONDS_TO_MILLI = 1000; @@ -79,7 +77,7 @@ public class AreaLearningActivity extends Activity implements View.OnClickListen private TextView mAdf2DevicePoseDeltaTextView; private TextView mAdf2StartPoseDeltaTextView; - private Button mSaveAdf; + private Button mSaveAdfButton; private Button mFirstPersonButton; private Button mThirdPersonButton; private Button mTopDownButton; @@ -109,6 +107,8 @@ public class AreaLearningActivity extends Activity implements View.OnClickListen private TangoPoseData[] mPoses; private static final int UPDATE_INTERVAL_MS = 100; private static final DecimalFormat threeDec = new DecimalFormat("00.000"); + // Long-running task to save the ADF. + private SaveAdfTask mSaveAdfTask; public static Object sharedLock = new Object(); @Override @@ -145,10 +145,9 @@ protected void onCreate(Bundle savedInstanceState) { mApplicationVersionTextView = (TextView) findViewById(R.id.appversion); mGLView = (GLSurfaceView) findViewById(R.id.gl_surface_view); - mSaveAdf = (Button) findViewById(R.id.saveAdf); + mSaveAdfButton = (Button) findViewById(R.id.saveAdf); mUUIDTextView = (TextView) findViewById(R.id.uuid); - mSaveAdf.setVisibility(View.GONE); // Set up button click listeners mFirstPersonButton.setOnClickListener(this); mThirdPersonButton.setOnClickListener(this); @@ -187,8 +186,11 @@ private void setTangoConfig() { // Set learning mode to config. mConfig.putBoolean(TangoConfig.KEY_BOOLEAN_LEARNINGMODE, true); // Set the ADF save button visible. - mSaveAdf.setVisibility(View.VISIBLE); - mSaveAdf.setOnClickListener(this); + mSaveAdfButton.setEnabled(false); + mSaveAdfButton.setOnClickListener(this); + }else { + // Hide to save ADF button if leanring mode is off. + mSaveAdfButton.setVisibility(View.GONE); } // Check for Load ADF/Constant Space relocalization mode if (mIsConstantSpaceRelocalize) { @@ -243,7 +245,17 @@ public void onTangoEvent(final TangoEvent event) { runOnUiThread(new Runnable() { @Override public void run() { + // Update the debug UI with information about this event. mTangoEventTextView.setText(event.eventKey + ": " + event.eventValue); + + // When saving an ADF, update the progress bar UI. + if (event.eventType == TangoEvent.EVENT_AREA_LEARNING && + TangoEvent.KEY_AREA_DESCRIPTION_SAVE_PROGRESS.equals(event.eventKey)) { + int progressPercent = (int) (Double.parseDouble(event.eventValue) * 100); + if (mSaveAdfTask != null) { + mSaveAdfTask.publishProgress(progressPercent); + } + } } }); } @@ -315,10 +327,8 @@ public void onPoseAvailable(TangoPoseData pose) { mAdf2StartPreviousPoseTimeStamp = pose.timestamp; if (pose.statusCode == TangoPoseData.POSE_VALID) { mIsRelocalized = true; - // Set the color to green } else { mIsRelocalized = false; - // Set the color blue } } @@ -363,35 +373,13 @@ private void showSetNameDialog() { setADFNameDialog.show(manager, "ADFNameDialog"); } - @Override - public void onSetName(String name, String uuids) { - - TangoAreaDescriptionMetaData metadata = new TangoAreaDescriptionMetaData(); - try { - mCurrentUUID = mTango.saveAreaDescription(); - metadata = mTango.loadAreaDescriptionMetaData(mCurrentUUID); - metadata.set(TangoAreaDescriptionMetaData.KEY_NAME, name.getBytes()); - mTango.saveAreaDescriptionMetadata(mCurrentUUID, metadata); - } catch (TangoErrorException e) { - Toast.makeText(getApplicationContext(), getString(R.string.tango_error), - Toast.LENGTH_SHORT).show(); - return; - } catch (TangoInvalidException e) { - Toast.makeText(getApplicationContext(), getString(R.string.tango_invalid), - Toast.LENGTH_SHORT).show(); - return; - } - Toast.makeText(getApplicationContext(), getString(R.string.adf_save) + mCurrentUUID, - Toast.LENGTH_SHORT).show(); - } - /** * Updates the text view in UI screen with the Pose. Each pose is associated with Target and * Base Frame. We need to check for that pair and update our views accordingly. - * - * @param pose */ private void updateTextViews() { + // Allow clicking of the save button only when Tango is localized to the current ADF. + mSaveAdfButton.setEnabled(mIsRelocalized); if (mPoses[0] != null && mPoses[0].baseFrame == TangoPoseData.COORDINATE_FRAME_AREA_DESCRIPTION && mPoses[0].targetFrame == TangoPoseData.COORDINATE_FRAME_DEVICE) { @@ -456,31 +444,31 @@ protected void onPause() { try { mTango.disconnect(); } catch (TangoErrorException e) { - Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT) - .show(); + Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT).show(); } } @Override protected void onResume() { super.onResume(); + // Clear the relocalization state: we don't know where the device has been since our app was paused + mIsRelocalized = false; try { setUpTangoListeners(); } catch (TangoErrorException e) { - Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT) - .show(); + Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT).show(); } catch (SecurityException e) { - Toast.makeText(getApplicationContext(), R.string.no_permissions, Toast.LENGTH_SHORT) - .show(); + Toast.makeText(getApplicationContext(), R.string.no_permissions, Toast.LENGTH_SHORT).show(); } + // Connect to the tango service (start receiving pose updates). try { mTango.connect(mConfig); } catch (TangoOutOfDateException e) { - Toast.makeText(getApplicationContext(), R.string.tango_out_of_date_exception, - Toast.LENGTH_SHORT).show(); + Toast.makeText(getApplicationContext(), R.string.tango_out_of_date_exception, Toast.LENGTH_SHORT).show(); } catch (TangoErrorException e) { - Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT) - .show(); + Toast.makeText(getApplicationContext(), R.string.tango_error, Toast.LENGTH_SHORT).show(); + } catch (TangoInvalidException e) { + Toast.makeText(getApplicationContext(), R.string.tango_invalid, Toast.LENGTH_SHORT).show(); } } @@ -503,7 +491,8 @@ public void onClick(View v) { mRenderer.setThirdPersonView(); break; case R.id.saveAdf: - saveAdf(); + // Query the user for an ADF name and save if OK was clicked. + showSetADFNameDialog(); break; default: Log.w(TAG, "Unknown button click"); @@ -551,4 +540,70 @@ public void run() { } }).start(); } + + /** + * Save the current Area Description File. + * Performs saving on a background thread and displays a progress dialog. + */ + private void saveAdf(String adfName) { + mSaveAdfTask = new SaveAdfTask(this, this, mTango, adfName); + mSaveAdfTask.execute(); + } + + /** + * Handles failed save from mSaveAdfTask. + */ + @Override + public void onSaveAdfFailed(String adfName) { + String toastMessage = String.format( + getResources().getString(R.string.save_adf_failed_toast_format), + adfName); + Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show(); + mSaveAdfTask = null; + } + + /** + * Handles successful save from mSaveAdfTask. + */ + @Override + public void onSaveAdfSuccess(String adfName, String adfUuid) { + String toastMessage = String.format( + getResources().getString(R.string.save_adf_success_toast_format), + adfName, adfUuid); + Toast.makeText(this, toastMessage, Toast.LENGTH_LONG).show(); + mSaveAdfTask = null; + finish(); + } + + /** + * Shows a dialog for setting the ADF name. + */ + private void showSetADFNameDialog() { + Bundle bundle = new Bundle(); + bundle.putString("name",getResources().getString(R.string.default_adf_name) ); + bundle.putString("id", ""); // UUID is generated after the ADF is saved. + + FragmentManager manager = getFragmentManager(); + SetADFNameDialog setADFNameDialog = new SetADFNameDialog(); + setADFNameDialog.setArguments(bundle); + setADFNameDialog.show(manager, "ADFNameDialog"); + } + + + /** + * Implements SetADFNameDialog.CallbackListener. + */ + @Override + public void onAdfNameOk(String name, String uuid) { + saveAdf(name); + } + + + /** + * Implements SetADFNameDialog.CallbackListener. + */ + @Override + public void onAdfNameCancelled() { + // Continue running.s + } } diff --git a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfDialog.java b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfDialog.java new file mode 100644 index 00000000..8afd2003 --- /dev/null +++ b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfDialog.java @@ -0,0 +1,64 @@ +/* + * Copyright 2014 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.projecttango.experiments.javaarealearning; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.Window; +import android.widget.ProgressBar; + +/** + * Displays progress bar and text information while saving an adf. + */ +public class SaveAdfDialog extends AlertDialog { + private static final String TAG = SaveAdfDialog.class.getSimpleName(); + + private ProgressBar mProgressBar; + + public SaveAdfDialog(Context context) { + super(context); + } + + public void setProgress(int progress) { + if (mProgressBar != null) { + mProgressBar.setVisibility(View.VISIBLE); + mProgressBar.setProgress(progress); + } + } + + public void setProgressBarVisibility(int visibility) { + if (mProgressBar != null) { + mProgressBar.setVisibility(visibility); + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.save_adf_dialog); + + setCancelable(false); + + mProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + if (mProgressBar == null) { + Log.e(TAG, "Unable to find view progress_bar."); + } + } +} \ No newline at end of file diff --git a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfTask.java b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfTask.java new file mode 100644 index 00000000..027d689f --- /dev/null +++ b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SaveAdfTask.java @@ -0,0 +1,120 @@ +/* + * Copyright 2015 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.projecttango.experiments.javaarealearning; + +import com.google.atap.tangoservice.Tango; +import com.google.atap.tangoservice.TangoAreaDescriptionMetaData; +import com.google.atap.tangoservice.TangoErrorException; +import com.google.atap.tangoservice.TangoInvalidException; + +import android.content.Context; +import android.os.AsyncTask; +import android.widget.Toast; + +/** + * Saves the ADF on a background thread and shows a progress dialog while + * saving. + */ +public class SaveAdfTask extends AsyncTask { + + public interface SaveAdfListener { + void onSaveAdfFailed(String adfName); + void onSaveAdfSuccess(String adfName, String adfUuid); + } + + Context mContext; + SaveAdfListener mCallbackListener; + SaveAdfDialog mProgressDialog; + Tango mTango; + String mAdfName; + + SaveAdfTask(Context context, SaveAdfListener callbackListener, Tango tango, String adfName) { + mContext = context; + mCallbackListener = callbackListener; + mTango = tango; + mAdfName = adfName; + mProgressDialog = new SaveAdfDialog(context); + } + + /** + * Call this method to marshall progress updates to the UI thread. + */ + public void publishProgress(int progress) { + super.publishProgress(progress); + } + + + /** + * Sets up the progress dialog. + */ + @Override + protected void onPreExecute() { + if (mProgressDialog != null) { + mProgressDialog.show(); + } + } + + /** + * Performs long-running save in the background. + */ + @Override + protected String doInBackground(Void... params) { + String adfUuid = null; + try { + // Save the ADF. + adfUuid = mTango.saveAreaDescription(); + + // Read the ADF Metadata, set the desired name, and save it back. + TangoAreaDescriptionMetaData metadata = mTango.loadAreaDescriptionMetaData(adfUuid); + metadata.set(TangoAreaDescriptionMetaData.KEY_NAME, mAdfName.getBytes()); + mTango.saveAreaDescriptionMetadata(adfUuid, metadata); + + } catch (TangoErrorException e) { + adfUuid = null; // There's currently no additional information in the exception. + } catch (TangoInvalidException e) { + adfUuid = null; // There's currently no additional information in the exception. + } + return adfUuid; + } + + /** + * Responds to progress update events by updating the UI. + */ + @Override + protected void onProgressUpdate(Integer... progress) { + if (mProgressDialog != null) { + mProgressDialog.setProgress(progress[0]); + } + } + + /** + * Dismisses the progress dialog and executes callbacks. + */ + @Override + protected void onPostExecute(String adfUuid) { + if (mProgressDialog != null) { + mProgressDialog.dismiss(); + } + if (mCallbackListener != null) { + if (adfUuid == null) { + mCallbackListener.onSaveAdfFailed(mAdfName); + } else { + mCallbackListener.onSaveAdfSuccess(mAdfName, adfUuid); + } + } + } +} \ No newline at end of file diff --git a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SetADFNameDialog.java b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SetADFNameDialog.java index 00455d57..47318bd4 100644 --- a/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SetADFNameDialog.java +++ b/AreaLearningJava/app/src/main/java/com/projecttango/experiments/javaarealearning/SetADFNameDialog.java @@ -35,12 +35,16 @@ public class SetADFNameDialog extends DialogFragment implements OnClickListener { private EditText mNameEditText; private TextView mUUIDTextView; - SetNameCommunicator mCommunicator; + CallbackListener mCallbackListener; + interface CallbackListener { + public void onAdfNameOk(String name, String uuid); + public void onAdfNameCancelled(); + } @Override public void onAttach(Activity activity) { super.onAttach(activity); - mCommunicator = (SetNameCommunicator) activity; + mCallbackListener = (CallbackListener) activity; } @Override @@ -68,17 +72,14 @@ public View onCreateView(LayoutInflater inflator, ViewGroup container, public void onClick(View v) { switch (v.getId()) { case R.id.Ok: - mCommunicator.onSetName(mNameEditText.getText().toString(), + mCallbackListener.onAdfNameOk(mNameEditText.getText().toString(), mUUIDTextView.getText().toString()); dismiss(); break; case R.id.cancel: + mCallbackListener.onAdfNameCancelled(); dismiss(); break; } } - - interface SetNameCommunicator { - public void onSetName(String name, String uuid); - } } diff --git a/AreaLearningJava/app/src/main/res/layout/save_adf_dialog.xml b/AreaLearningJava/app/src/main/res/layout/save_adf_dialog.xml new file mode 100644 index 00000000..ee31b3f2 --- /dev/null +++ b/AreaLearningJava/app/src/main/res/layout/save_adf_dialog.xml @@ -0,0 +1,26 @@ + + + + + + + \ No newline at end of file diff --git a/AreaLearningJava/app/src/main/res/values/strings.xml b/AreaLearningJava/app/src/main/res/values/strings.xml index c65a9585..c40e7ead 100644 --- a/AreaLearningJava/app/src/main/res/values/strings.xml +++ b/AreaLearningJava/app/src/main/res/values/strings.xml @@ -67,7 +67,10 @@ "invalid" "unknown" ", Latest ADF is: " - + Saving ADF + New ADF + "Failed to save ADF '%1$s'." + "Saved ADF '%1$s' (%2$s)." Rename Delete from API space diff --git a/AreaLearningJava/settings.gradle b/AreaLearningJava/settings.gradle index e989940b..9d495b34 100644 --- a/AreaLearningJava/settings.gradle +++ b/AreaLearningJava/settings.gradle @@ -1,3 +1 @@ -include ':app' -include ':TangoUtils' -project(':TangoUtils').projectDir = new File('../TangoUtils/TangoUtils') \ No newline at end of file +include ':app' \ No newline at end of file diff --git a/PointCloudJava/app/src/main/java/com/projecttango/experiments/javapointcloud/PointCloudActivity.java b/PointCloudJava/app/src/main/java/com/projecttango/experiments/javapointcloud/PointCloudActivity.java index b3c9a1e1..cffe8f21 100644 --- a/PointCloudJava/app/src/main/java/com/projecttango/experiments/javapointcloud/PointCloudActivity.java +++ b/PointCloudJava/app/src/main/java/com/projecttango/experiments/javapointcloud/PointCloudActivity.java @@ -30,6 +30,7 @@ import com.google.atap.tangoservice.TangoXyzIjData; import com.google.atap.tango.ux.TangoUx; +import com.google.atap.tango.ux.TangoUx.StartParams; import com.google.atap.tango.ux.TangoUxLayout; @@ -140,9 +141,6 @@ public void onUxExceptionEvent(UxExceptionEvent uxExceptionEvent) { if(uxExceptionEvent.getType() == UxExceptionEvent.TYPE_TANGO_SERVICE_NOT_RESPONDING){ Log.i(TAG, "TangoService is not responding "); } - if(uxExceptionEvent.getType() == UxExceptionEvent.TYPE_TANGO_UPDATE_NEEDED){ - Log.i(TAG, "Device not running on ART"); - } if(uxExceptionEvent.getType() == UxExceptionEvent.TYPE_UNDER_EXPOSED){ Log.i(TAG, "Camera Under Exposed " ); } @@ -179,9 +177,9 @@ protected void onCreate(Bundle savedInstanceState) { mConfig = mTango.getConfig(TangoConfig.CONFIG_TYPE_CURRENT); mConfig.putBoolean(TangoConfig.KEY_BOOLEAN_DEPTH, true); - mTangoUx = new TangoUx.Builder(this).build(); + mTangoUx = new TangoUx(this); mTangoUxLayout = (TangoUxLayout) findViewById(R.id.layout_tango); - mTangoUx = new TangoUx.Builder(this).setTangoUxLayout(mTangoUxLayout).build(); + mTangoUx.setLayout(mTangoUxLayout); mTangoUx.setUxExceptionEventListener(mUxExceptionListener); @@ -221,7 +219,8 @@ protected void onPause() { @Override protected void onResume() { super.onResume(); - mTangoUx.start(); + StartParams params = new StartParams(); + mTangoUx.start(params); if (!mIsTangoServiceConnected) { startActivityForResult( Tango.getRequestPermissionIntent(Tango.PERMISSIONTYPE_MOTION_TRACKING), @@ -254,7 +253,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { mIsTangoServiceConnected = true; } catch (TangoOutOfDateException outDateEx) { if (mTangoUx != null) { - mTangoUx.onTangoOutOfDate(); + mTangoUx.showTangoOutOfDate(); } } catch (TangoErrorException e) { Toast.makeText(getApplicationContext(), R.string.TangoError, Toast.LENGTH_SHORT) @@ -396,7 +395,7 @@ public void onXyzIjAvailable(final TangoXyzIjData xyzIj) { @Override public void onTangoEvent(final TangoEvent event) { if(mTangoUx!=null){ - mTangoUx.onTangoEvent(event); + mTangoUx.updateTangoEvent(event); } runOnUiThread(new Runnable() { @Override diff --git a/TangoReleaseLibs/aar/tango-ux-support-library.aar b/TangoReleaseLibs/aar/tango-ux-support-library.aar index e2b654ab..71e6f8c8 100644 Binary files a/TangoReleaseLibs/aar/tango-ux-support-library.aar and b/TangoReleaseLibs/aar/tango-ux-support-library.aar differ diff --git a/TangoReleaseLibs/jar/tango_java_lib.jar b/TangoReleaseLibs/jar/tango_java_lib.jar index e8112ef4..d5240029 100644 Binary files a/TangoReleaseLibs/jar/tango_java_lib.jar and b/TangoReleaseLibs/jar/tango_java_lib.jar differ