diff --git a/android/tagin-app/src/ca/idrc/tagin/app/TaginActivity.java b/android/tagin-app/src/ca/idrc/tagin/app/TaginActivity.java index 561fea0..625dd3e 100644 --- a/android/tagin-app/src/ca/idrc/tagin/app/TaginActivity.java +++ b/android/tagin-app/src/ca/idrc/tagin/app/TaginActivity.java @@ -58,16 +58,28 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } + /** + * Initiates an API request for a new URN. + * @param view + */ public void onRequestURN(View view) { mURNRequestButton.setText(R.string.requesting_urn); mTaginManager.apiRequest(TaginService.REQUEST_URN); } + /** + * Initiates an API request for a list of all fingerprints. + * @param view + */ public void onListFingerprints(View view) { mListFingerprintsButton.setText(R.string.requesting_fp_list); mTaginManager.apiRequest(TaginService.REQUEST_LIST_FINGERPRINTS); } + /** + * Initiates an API request for finding nearby neighbours. + * @param view + */ public void onFindNeighbours(View view) { if (mNeighboursEditText.getText().length() < 30) { Toast.makeText(this, R.string.invalid_urn, Toast.LENGTH_SHORT).show(); @@ -95,14 +107,22 @@ public void onReceive(Context context, Intent intent) { } }; + /** + * Updates the UI with the result of the fingerprints.list API request. + * @param result + */ private void handleFingerprintsResponse(String result) { FingerprintCollection fps = TaginUtils.deserialize(result, FingerprintCollection.class); if (fps != null) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); List items = fps.getItems(); if (items != null) { for (Fingerprint fp : items) { - sb.append("ID: " + fp.getId() + "\nURN: " + fp.getUrn() + "\n\n"); + sb.append("ID: "); + sb.append(fp.getId()); + sb.append("\nURN: "); + sb.append(fp.getUrn()); + sb.append("\n\n"); } } mListFPTextView.setText(sb.toString()); @@ -112,6 +132,10 @@ private void handleFingerprintsResponse(String result) { mListFingerprintsButton.setText(R.string.fp_list); } + /** + * Updates the UI with the result of the URN API request. + * @param urn + */ private void handleURNResponse(String urn) { if (urn != null) { mURNTextView.setText(urn); @@ -121,6 +145,10 @@ private void handleURNResponse(String urn) { mURNRequestButton.setText(R.string.request_urn); } + /** + * Updates the UI with the result of the neighbours API request. + * @param result + */ private void handleNeighboursResponse(String result) { if (result != null) { mNeighboursEditText.setText(result); diff --git a/android/tagin-app/src/ca/idrc/tagin/app/TagsActivity.java b/android/tagin-app/src/ca/idrc/tagin/app/TagsActivity.java index e05c377..51f7df4 100644 --- a/android/tagin-app/src/ca/idrc/tagin/app/TagsActivity.java +++ b/android/tagin-app/src/ca/idrc/tagin/app/TagsActivity.java @@ -48,6 +48,10 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } + /** + * Initiates a server request for fetching a URN's label. + * @param view + */ public void onGetLabel(View view) { mGetLabelButton.setText(R.string.fetching_label); String urn = mURNText1.getText().toString(); @@ -55,6 +59,10 @@ public void onGetLabel(View view) { task.execute(); } + /** + * Initiates a server request for assigning a URN's label. + * @param view + */ public void onSetLabel(View view) { mSetLabelButton.setText(R.string.saving_tag); String urn = mURNText2.getText().toString(); diff --git a/android/tagin-app/src/ca/idrc/tagin/app/util/LauncherDialog.java b/android/tagin-app/src/ca/idrc/tagin/app/util/LauncherDialog.java index 5592070..c124cbd 100644 --- a/android/tagin-app/src/ca/idrc/tagin/app/util/LauncherDialog.java +++ b/android/tagin-app/src/ca/idrc/tagin/app/util/LauncherDialog.java @@ -35,7 +35,7 @@ private class LauncherDialogBuilder extends AlertDialog.Builder { public LauncherDialogBuilder(Activity context) { super(context); - CharSequence[] items = {"tagin-api", "tagin-tags"}; + CharSequence[] items = {"tagin! API Explorer", "tagin! Tags Manager"}; setCancelable(true); setTitle(R.string.select_service); diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginManager.java b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginManager.java index 21d1e7d..9db8107 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginManager.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginManager.java @@ -21,14 +21,29 @@ public TaginManager(Context context) { mContext = context; } + /** + * See {@link apiRequest(String, String, String)} + * @param request + */ public void apiRequest(String request) { apiRequest(request, null, null); } + /** + * See {@link apiRequest(String, String, String)} + * @param request + * @param param + */ public void apiRequest(String request, String param) { apiRequest(request, param, null); } + /** + * Initiates an API request with the specified parameters. + * @param request the request name. + * @param param1 the first parameter. + * @param param2 the second parameter. + */ public void apiRequest(String request, String param1, String param2) { Intent intent = new Intent(mContext, TaginService.class); intent.putExtra(TaginService.EXTRA_TYPE, request); diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginService.java b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginService.java index c8c7aae..50eef3b 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginService.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginService.java @@ -92,6 +92,11 @@ public void onReceive(Context context, Intent intent) { } }; + /** + * Asynchronous task that handles API requests on a background thread. + * @author elyas-bhy + * + */ private class ApiRequestTask extends AsyncTask { private TaginApiCall apiCall = null; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginUtils.java b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginUtils.java index 1c61634..eae415e 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/TaginUtils.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/TaginUtils.java @@ -8,6 +8,12 @@ public class TaginUtils { + /** + * Deserializes a JSON response and returns it in its original container. + * @param result the JSON response. + * @param clazz the type of the original container. + * @return the deserialized result if the operation is successful, or null. + */ public static T deserialize(String result, Class clazz) { T container = null; if (result != null) { diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/FindNeighboursRequest.java b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/FindNeighboursRequest.java index 786559a..09ce416 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/FindNeighboursRequest.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/FindNeighboursRequest.java @@ -21,6 +21,9 @@ public FindNeighboursRequest(Tagin tagin, String urn, String count) { mMaxCount = Integer.parseInt(count); } + /** + * {@inheritDoc} + */ @Override public String execute() { String result = null; @@ -33,6 +36,9 @@ public String execute() { return result; } + /** + * {@inheritDoc} + */ @Override public String getBroadcastAction() { return TaginService.ACTION_NEIGHBOURS_READY; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/ListFingerprintsRequest.java b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/ListFingerprintsRequest.java index 7b3b073..737f949 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/ListFingerprintsRequest.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/ListFingerprintsRequest.java @@ -18,6 +18,9 @@ public ListFingerprintsRequest(Tagin tagin) { mTagin = tagin; } + /** + * {@inheritDoc} + */ @Override public String execute() { String result = null; @@ -30,6 +33,9 @@ public String execute() { return result; } + /** + * {@inheritDoc} + */ @Override public String getBroadcastAction() { return TaginService.ACTION_FINGERPRINTS_READY; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/TaginApiCall.java b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/TaginApiCall.java index 5bd7ab9..da9f1ab 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/TaginApiCall.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/TaginApiCall.java @@ -2,8 +2,16 @@ public interface TaginApiCall { + /** + * Executes the API call, and returns the result if successful, or null. + * @return + */ public String execute(); + /** + * Returns the broadcast action specific to the API call. + * @return + */ public String getBroadcastAction(); } diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/URNRequest.java b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/URNRequest.java index c7f2732..ab2070e 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/requests/URNRequest.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/requests/URNRequest.java @@ -20,6 +20,9 @@ public URNRequest(Tagin tagin, Pattern pattern) { mPattern = pattern; } + /** + * {@inheritDoc} + */ @Override public String execute() { String result = null; @@ -33,6 +36,9 @@ public String execute() { return result; } + /** + * {@inheritDoc} + */ @Override public String getBroadcastAction() { return TaginService.ACTION_URN_READY; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTask.java b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTask.java index 84d037a..f562e75 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTask.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTask.java @@ -19,7 +19,12 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; - +/** + * Asynchronous task responsible for fetching the labels of the specified URN. + * @author elyas-bhy + * + * @param + */ public class GetLabelsTask extends AsyncTask> { private T mContext; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTaskListener.java b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTaskListener.java index 7445616..35b7376 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTaskListener.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/GetLabelsTaskListener.java @@ -4,6 +4,11 @@ public interface GetLabelsTaskListener { + /** + * Callback method when GetLabelsTask is executed. + * @param urn the specified URN for which the labels are requested. + * @param labels a list of labels related to the URN. + */ public void onGetLabelsTaskComplete(String urn, List labels); } diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTask.java b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTask.java index 3c47de2..2c15e08 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTask.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTask.java @@ -15,6 +15,12 @@ import android.os.AsyncTask; import ca.idrc.tagin.lib.TaginManager; +/** + * Asynchronous task responsible for assigning a label to the specified URN + * @author elyas-bhy + * + * @param + */ public class SetLabelTask extends AsyncTask { private T mContext; diff --git a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTaskListener.java b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTaskListener.java index 123b69a..9b711cc 100644 --- a/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTaskListener.java +++ b/android/tagin-lib/src/ca/idrc/tagin/lib/tags/SetLabelTaskListener.java @@ -2,6 +2,10 @@ public interface SetLabelTaskListener { + /** + * Callback method when SetLabelTask is executed. + * @param isSuccessful true if the operation was successful, else false. + */ public void onSetLabelTaskComplete(Boolean isSuccessful); } diff --git a/experimental/apps/tagin-cloud/AndroidManifest.xml b/experimental/apps/tagin-cloud/AndroidManifest.xml index 0a689db..74bb09d 100644 --- a/experimental/apps/tagin-cloud/AndroidManifest.xml +++ b/experimental/apps/tagin-cloud/AndroidManifest.xml @@ -4,7 +4,9 @@ android:versionCode="1" android:versionName="1.0" > - + @@ -16,7 +18,8 @@ + android:label="@string/app_name" + android:hardwareAccelerated="true"> diff --git a/experimental/apps/tagin-cloud/res/values/strings.xml b/experimental/apps/tagin-cloud/res/values/strings.xml index ed99f69..7b5156a 100644 --- a/experimental/apps/tagin-cloud/res/values/strings.xml +++ b/experimental/apps/tagin-cloud/res/values/strings.xml @@ -12,6 +12,7 @@ URN value Current labels: New label + Missing data. Please fill out all fields before submitting. Fetching URN… Add a new tag @@ -20,6 +21,7 @@ Cancel Welcome to tagin-cloud! - There are no tags available yet for this location! Use the + button on the actionbar to add a new tag. + There are no tags available yet for this location! Use the + button on the actionbar to add a new tag. + To rotate the sphere, press on the edges of your device\'s screen. diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/CloudActivity.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/CloudActivity.java index 3e0eb4b..9851326 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/CloudActivity.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/CloudActivity.java @@ -1,11 +1,5 @@ package ca.idrc.tagin.cloud; -/** - * Komodo Lab: Tagin! Project: 3D Tag Cloud - * Google Summer of Code 2011 - * @authors Reza Shiftehfar, Sara Khosravinasr and Jorge Silva - */ - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -60,6 +54,9 @@ public void onCreate(Bundle savedInstanceState) { createTagCloud(); } + /** + * Initializes the tags map according to the current connectivity state. + */ private void initCloud() { if (TaginCloudApp.persistence.isConnected()) { mTagMap = (TagMap) getIntent().getSerializableExtra(LauncherActivity.EXTRA_TAGS); @@ -69,6 +66,9 @@ private void initCloud() { } } + /** + * Creates and displays a new tag cloud. + */ private void createTagCloud() { Display display = getWindowManager().getDefaultDisplay(); mTagCloudView = new TagCloudView(this, display.getWidth(), display.getHeight(), mTagMap); @@ -77,26 +77,44 @@ private void createTagCloud() { updateTagCloud(); } + /** + * Initiates a server request for assigning a tag's label. + * @param tag + */ public void submitTag(Tag tag) { SetLabelTask task = new SetLabelTask(mInstance, tag.getID(), tag.getText()); task.execute(); addTagToCloud(tag); } + /** + * Adds a new tag to the cloud. + * @param tag + */ public void addTagToCloud(Tag tag) { mTagCloudView.addTag(tag); mTagMap.put(tag.getID(), tag); updateTagCloud(); saveData(); Toast.makeText(this, "\"" + tag.getText() + "\" tag successfully added", Toast.LENGTH_SHORT).show(); + if (mTagMap.size() == 1) { + Toast.makeText(this, R.string.to_rotate_sphere, Toast.LENGTH_LONG).show(); + } } + /** + * Updates the state of the cloud. + */ private void updateTagCloud() { for (Tag tag : mTagMap.values()) { mTagCloudView.setTagRGBT(tag); } } + /** + * Initiates an API request for a new URN. + * @param view + */ public void onGetURNClick(View view) { mTaginManager.apiRequest(TaginService.REQUEST_URN); mTagAdderDialog.getURNTextView().setText(R.string.fetching_urn); @@ -121,8 +139,10 @@ public boolean onCreateOptionsMenu(Menu menu) { ShowcaseView.ConfigOptions options = new ShowcaseView.ConfigOptions(); options.hideOnClickOutside = false; mShowcaseView = ShowcaseView.insertShowcaseViewWithType(ShowcaseView.ITEM_ACTION_ITEM, - R.id.menu_add_tag, this, R.string.showcase_title, R.string.shwocase_message, options); + R.id.menu_add_tag, this, R.string.showcase_title, R.string.showcase_message, options); mShowcaseView.setOnShowcaseEventListener(this); + } else { + Toast.makeText(this, R.string.to_rotate_sphere, Toast.LENGTH_LONG).show(); } return true; } @@ -147,6 +167,9 @@ public void onBackPressed() { startActivity(intent); } + /** + * Writes the tags map to the device's memory. + */ public void saveData() { ObjectOutputStream oos = null; try { @@ -171,6 +194,10 @@ public void saveData() { } } + /** + * Loads a map of tags stored on the device's memory. + * @return saved data if found, or null. + */ private TagMap loadData() { File file = new File(getFilesDir() + "/tags.dat"); TagMap feedsEntry = null; @@ -206,7 +233,7 @@ public void onReceive(Context context, Intent intent) { public void onGetLabelsTaskComplete(String urn, List labels) { TextView textView = mTagAdderDialog.getLabelTextView(); if (labels.size() > 0) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); sb.append(labels.get(0)); for (int i = 1; i < labels.size(); i++) { sb.append(", " + labels.get(i)); @@ -224,13 +251,11 @@ public void onSetLabelTaskComplete(Boolean isSuccessful) { @Override public void onShowcaseViewHide(ShowcaseView showcaseView) { - // TODO Auto-generated method stub } @Override public void onShowcaseViewShow(ShowcaseView showcaseView) { - // TODO Auto-generated method stub } diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/LauncherActivity.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/LauncherActivity.java index e0aa3fb..80c917f 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/LauncherActivity.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/LauncherActivity.java @@ -45,6 +45,11 @@ protected void onCreate(Bundle savedInstanceState) { init(); } + /** + * Initializes a tags map according to the current connectivity state. + * If connected, initiates an API request for a new URN. + * Else, starts the cloud with an empty map. + */ private void init() { if (TaginCloudApp.persistence.isConnected()) { if (TaginCloudApp.persistence.isWifiEnabled()) { @@ -59,6 +64,9 @@ private void init() { } } + /** + * Starts a new cloud activity. + */ public void startCloud() { Intent intent = new Intent(LauncherActivity.this, CloudActivity.class); intent.putExtra(EXTRA_TAGS, mTagMap); @@ -103,11 +111,17 @@ public void onGetLabelsTaskComplete(String urn, List labels) { } } + /** + * Handles the neighbours API response. + * If neighbours are available, initiates a server request to fetch their respective labels. + * Else, starts the cloud. + * @param result + */ public void handleNeighboursReady(String result) { URNCollection urns = TaginUtils.deserialize(result, URNCollection.class); if (urns != null && urns.getItems() != null && urns.getItems().size() > 0) { - // Temporary workaround to handle duplicated URN + // Temporary workaround to handle duplicated URNs List items = new ArrayList(); for (URN urn : urns.getItems()) { if (!urn.getValue().equals(mInitialURN)) { diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/Tag.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/Tag.java index e1437cf..14f3bad 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/Tag.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/Tag.java @@ -9,7 +9,7 @@ import android.widget.TextView; /** - * Komodo Lab: Tagin! Project: 3D Tag Cloud + * Komodo OpenLab: Tagin! Project: 3D Tag Cloud * Google Summer of Code 2011 * @authors Reza Shiftehfar, Sara Khosravinasr and Jorge Silva */ @@ -19,7 +19,7 @@ public class Tag implements Serializable, Comparable { private static final long serialVersionUID = -4652373547442417254L; private static final int DEFAULT_POPULARITY = 1; - private float x, y, z; //the center of the 3D Tag + private float x, y, z; // the center of the 3D Tag private float x2D, y2D; private String mID; @@ -189,8 +189,11 @@ public void setUrl(String url) { } public String toString() { - return getClass().getSimpleName() + "[" + - "ID: " + mID + - ", Text: " + mText + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[ID: " + mID); + sb.append(", Text: " + mText); + sb.append("]"); + return sb.toString(); } } diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloud.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloud.java index 40a30ce..1901a28 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloud.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloud.java @@ -1,7 +1,7 @@ package ca.idrc.tagin.cloud.tag; /** - * Komodo Lab: Tagin! Project: 3D Tag Cloud + * Komodo OpenLab: Tagin! Project: 3D Tag Cloud * Google Summer of Code 2011 * @authors Reza Shiftehfar, Sara Khosravinasr and Jorge Silva */ diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloudView.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloudView.java index ae906b7..69c59ae 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloudView.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/tag/TagCloudView.java @@ -1,7 +1,7 @@ package ca.idrc.tagin.cloud.tag; /** - * Komodo Lab: Tagin! Project: 3D Tag Cloud + * Komodo OpenLab: Tagin! Project: 3D Tag Cloud * Google Summer of Code 2011 * @authors Reza Shiftehfar, Sara Khosravinasr and Jorge Silva */ @@ -38,12 +38,12 @@ public TagCloudView(Context context, int width, int height, TagMap tags) { mScrollSpeed = SCROLL_SPEED; - //set the center of the sphere on center of our screen: + // set the center of the sphere on center of our screen: mCenterX = width / 2; mCenterY = height / 2; mRadius = Math.min(mCenterX * 0.95f , mCenterY * 0.95f); //use 95% of screen - //since we set tag margins from left of screen, we shift the whole tags to left so that - //it looks more realistic and symmetric relative to center of screen in X direction + // since we set tag margins from left of screen, we shift the whole tags to left so that + // it looks more realistic and symmetric relative to center of screen in X direction mShiftLeft = (int) (Math.min(mCenterX * 0.15f , mCenterY * 0.15f)); // initialize the TagCloud from a list of tags diff --git a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/util/TagAdderDialog.java b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/util/TagAdderDialog.java index 87be4b5..89852ac 100644 --- a/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/util/TagAdderDialog.java +++ b/experimental/apps/tagin-cloud/src/ca/idrc/tagin/cloud/util/TagAdderDialog.java @@ -6,11 +6,11 @@ import android.view.View; import android.widget.EditText; import android.widget.TextView; +import android.widget.Toast; import ca.idrc.tagin.cloud.CloudActivity; import ca.idrc.tagin.cloud.R; import ca.idrc.tagin.cloud.tag.Tag; - public class TagAdderDialog extends AlertDialog { private TextView mURNTextView; @@ -71,8 +71,12 @@ public TagAdderBuilder(Activity context) { @Override public void onClick(DialogInterface dialog, int which) { - Tag tag = new Tag(mURNTextView.getText().toString(), mLabelEditText.getText().toString(), 20); - mContext.submitTag(tag); + if (mURNTextView.getText().length() != 0 && mLabelEditText.getText().length() != 0) { + Tag tag = new Tag(mURNTextView.getText().toString(), mLabelEditText.getText().toString(), 20); + mContext.submitTag(tag); + } else { + Toast.makeText(mContext, R.string.missing_data, Toast.LENGTH_SHORT).show(); + } } }); diff --git a/services/tagin-api/src/ca/idrc/tagin/dao/EMFService.java b/services/tagin-api/src/ca/idrc/tagin/dao/EMFService.java index c4ca84a..c19e4ae 100644 --- a/services/tagin-api/src/ca/idrc/tagin/dao/EMFService.java +++ b/services/tagin-api/src/ca/idrc/tagin/dao/EMFService.java @@ -12,10 +12,18 @@ private EMFService() { } + /** + * Returns a singleton instance of EntityManagerFactory + * @return + */ public static EntityManagerFactory getInstance() { return mFactory; } + /** + * Returns a new EntityManager + * @return + */ public static EntityManager createEntityManager() { return mFactory.createEntityManager(); } diff --git a/services/tagin-api/src/ca/idrc/tagin/dao/TaginDao.java b/services/tagin-api/src/ca/idrc/tagin/dao/TaginDao.java index 4311380..ff5d0aa 100644 --- a/services/tagin-api/src/ca/idrc/tagin/dao/TaginDao.java +++ b/services/tagin-api/src/ca/idrc/tagin/dao/TaginDao.java @@ -37,21 +37,21 @@ public interface TaginDao { /** * Retrieves a pattern with the specified ID. * @param id the pattern's ID. - * @return the corresponding pattern if found, or null. + * @return the matching pattern if found, or null. */ public Pattern getPattern(Long id); /** * Retrieves a fingerprint with the specified ID. * @param id the fingerprint's ID. - * @return the corresponding fingerprint if found, or null. + * @return the matching fingerprint if found, or null. */ public Fingerprint getFingerprint(Long id); /** * Retrieves a fingerprint with the specified URN. * @param urn the fingerprint's URN. - * @return the corresponding fingerprint if found, or null. + * @return the matching fingerprint if found, or null. */ public Fingerprint getFingerprint(String urn); @@ -64,7 +64,7 @@ public interface TaginDao { /** * Retrieves at most the specified number of neighbours of the specified fingerprint. - * @param fp + * @param fp the initial fingerprint. * @param maxCount the max number of neighbours. * @return a list of the corresponding neighbours' URNs. */ diff --git a/services/tagin-api/src/ca/idrc/tagin/dao/TaginEntityManager.java b/services/tagin-api/src/ca/idrc/tagin/dao/TaginEntityManager.java index 201a042..5b6eb8b 100644 --- a/services/tagin-api/src/ca/idrc/tagin/dao/TaginEntityManager.java +++ b/services/tagin-api/src/ca/idrc/tagin/dao/TaginEntityManager.java @@ -37,6 +37,9 @@ public TaginEntityManager() { } } + /** + * {@inheritDoc} + */ @Override public String persistPattern(Pattern pattern) { Fingerprint fp = new Fingerprint(pattern); @@ -45,6 +48,9 @@ public String persistPattern(Pattern pattern) { return fp.getUrn(); } + /** + * {@inheritDoc} + */ @Override public void persistFingerprint(Fingerprint fp) { mEntityManager.getTransaction().begin(); @@ -54,6 +60,9 @@ public void persistFingerprint(Fingerprint fp) { mEntityManager.getTransaction().commit(); } + /** + * {@inheritDoc} + */ @SuppressWarnings("unchecked") @Override public List listPatterns() { @@ -65,6 +74,9 @@ public List listPatterns() { return patterns; } + /** + * {@inheritDoc} + */ @SuppressWarnings("unchecked") @Override public List listFingerprints() { @@ -73,6 +85,9 @@ public List listFingerprints() { return fingerprints; } + /** + * {@inheritDoc} + */ @Override public Pattern getPattern(Long id) { Pattern p = findPattern(id); @@ -81,6 +96,9 @@ public Pattern getPattern(Long id) { return p; } + /** + * {@inheritDoc} + */ @Override public Fingerprint getFingerprint(Long id) { Fingerprint fp = mEntityManager.find(Fingerprint.class, id); @@ -89,6 +107,9 @@ public Fingerprint getFingerprint(Long id) { return fp; } + /** + * {@inheritDoc} + */ @Override public Fingerprint getFingerprint(String urn) { if (mFingerprintCache.containsKey(urn)) { @@ -97,6 +118,9 @@ public Fingerprint getFingerprint(String urn) { return findFingerprint(urn); } + /** + * {@inheritDoc} + */ @SuppressWarnings("unchecked") @Override public List getNeighbours(Fingerprint fp) { @@ -120,6 +144,9 @@ public List getNeighbours(Fingerprint fp) { return neighbours; } + /** + * {@inheritDoc} + */ @Override public List fetchNumOfNeighbours(Fingerprint fp, Integer maxCount) { Map neighbours = new LinkedHashMap(); @@ -138,6 +165,14 @@ public List fetchNumOfNeighbours(Fingerprint fp, Integer maxCount) { } } + /** + * Helper method for {@link fetchNumOfNeighbours(Fingerprint, Integer)} + * @param initialURN + * @param index + * @param maxCount + * @param neighbours + * @return + */ private List fetchNumOfNeighboursAux(String initialURN, int index, Integer maxCount, Map neighbours) { List urns = new ArrayList(neighbours.values()); Fingerprint fp = getFingerprint(urns.get(index).getValue()); @@ -158,6 +193,11 @@ private List fetchNumOfNeighboursAux(String initialURN, int index, Integer } } + /** + * Retrieves a pattern with the specified ID + * @param id + * @return the matching fingerprint if found, or null. + */ @SuppressWarnings("unchecked") private Pattern findPattern(Long id) { Pattern p = null; @@ -169,6 +209,11 @@ private Pattern findPattern(Long id) { return p; } + /** + * Retrieves a fingerprint with the specified URN + * @param urn + * @return the matching fingerprint if found, or null. + */ @SuppressWarnings("unchecked") private Fingerprint findFingerprint(String urn) { Fingerprint fp = null; @@ -180,6 +225,9 @@ private Fingerprint findFingerprint(String urn) { return fp; } + /** + * {@inheritDoc} + */ @Override public void removePattern(Long id) { Pattern p = findPattern(id); @@ -189,6 +237,9 @@ public void removePattern(Long id) { } } + /** + * {@inheritDoc} + */ @Override public void removeFingerprint(String urn) { Fingerprint fp = findFingerprint(urn); @@ -196,16 +247,25 @@ public void removeFingerprint(String urn) { mEntityManager.remove(fp); } + /** + * {@inheritDoc} + */ @Override public void close() { mEntityManager.close(); } + /** + * {@inheritDoc} + */ @Override public void beginTransaction() { mEntityManager.getTransaction().begin(); } + /** + * {@inheritDoc} + */ @Override public void commitTransaction() { mEntityManager.getTransaction().commit(); diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Beacon.java b/services/tagin-api/src/ca/idrc/tagin/model/Beacon.java index 4064ea9..b9e1eae 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Beacon.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Beacon.java @@ -21,7 +21,7 @@ public class Beacon implements Serializable, Comparable { private Key key; @Basic - private String id; // represented by BSSID + frequency + private String id; // formatted as: BSSID;frequency @Basic private Double rssi; @@ -85,10 +85,13 @@ public int compareTo(Beacon beacon) { } public String toString() { - return getClass().getSimpleName() + "[" + - "ID: " + getId() + - ", RSSI: " + getRssi() + - ", rank: " + getRank() + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[ID: " + getId()); + sb.append(", RSSI: " + getRssi()); + sb.append(", rank: " + getRank()); + sb.append("]"); + return sb.toString(); } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Distance.java b/services/tagin-api/src/ca/idrc/tagin/model/Distance.java index 2bc7aa3..c6c6c41 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Distance.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Distance.java @@ -19,5 +19,13 @@ public void setValue(Double distance) { public Double getValue() { return distance; } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[Distance: " + getValue()); + sb.append("]"); + return sb.toString(); + } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Fingerprint.java b/services/tagin-api/src/ca/idrc/tagin/model/Fingerprint.java index c4c8ef1..bff0f9e 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Fingerprint.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Fingerprint.java @@ -22,7 +22,7 @@ public class Fingerprint implements Serializable { private static final long serialVersionUID = 4658250121896413119L; - public static final Double THRESHOLD = 0.33; + public static final Double MERGE_THRESHOLD = 0.33; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -43,6 +43,10 @@ public Fingerprint(Pattern pattern) { this.urn = null; } + /** + * Retrieves the instance's neighbours. + * @return + */ public List findNeighbours() { List neighbours = new ArrayList(); TaginDao dao = new TaginEntityManager(); @@ -51,12 +55,16 @@ public List findNeighbours() { return neighbours; } + /** + * Retrieves a list of neighbours that are under the merge threshold. + * @return + */ public List findCloseNeighbours() { List closeNeighbours = new ArrayList(); List neighbours = findNeighbours(); Collections.sort(neighbours); for (Neighbour n : neighbours) { - if (n.getRankDistance() < THRESHOLD) { + if (n.getRankDistance() < MERGE_THRESHOLD) { closeNeighbours.add(n); } else { break; @@ -69,6 +77,7 @@ public List findCloseNeighbours() { * Calculates the relative distance between two fingerprints. * The value is between 0 and 1 and is maximal when two fingerprints * don't share a beacon and minimal where they share a lot of beacons. + * @return distance between two fingerprints, ranging from 0 to 1. */ public Double rankDistanceTo(Fingerprint fp) { double d = 0.0; // Euclidean distance between two beacons having same BSSID in two fingerprints. @@ -92,6 +101,11 @@ public Double rankDistanceTo(Fingerprint fp) { return Math.sqrt(d) / Math.sqrt(maxD); } + /** + * Merges the passed fingerprint into the calling instance. + * The resulting fingerprint is an averaged measure of both fingerprints. + * @param fp + */ public void merge(Fingerprint fp) { Map beacons = new HashMap(); for (Beacon beacon : this.getPattern().getBeacons().values()) { @@ -112,6 +126,10 @@ public void merge(Fingerprint fp) { pattern.setBeacons(beacons); } + /** + * Displaces the calling instance by the specified vectorial set. + * @param changeVector + */ public void displaceBy(List changeVector) { Map beacons = new HashMap(); for (Beacon beacon : this.getPattern().getBeacons().values()) { @@ -151,10 +169,13 @@ public void setUrn(String urn) { } public String toString() { - return getClass().getSimpleName() + - "[ID: " + getId() + - ", URN: " + getUrn() + - ", pattern: " + getPattern().toString() + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[ID: " + getId()); + sb.append(", URN: " + getUrn()); + sb.append(", pattern: " + getPattern().toString()); + sb.append("]"); + return sb.toString(); } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Neighbour.java b/services/tagin-api/src/ca/idrc/tagin/model/Neighbour.java index d6c80fe..92c8485 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Neighbour.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Neighbour.java @@ -6,7 +6,7 @@ public class Neighbour implements Comparable { private Double rankDistance; public Neighbour(Fingerprint fingerprint, Double rankDistance) { - this.fingerprint= fingerprint; + this.fingerprint = fingerprint; this.rankDistance = rankDistance; } @@ -34,9 +34,12 @@ public int compareTo(Neighbour n) { } public String toString() { - return getClass().getSimpleName() + - "[rankDistance: " + getRankDistance() + - ", fingerprint: " + getFingerprint() + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[rankDistance: " + getRankDistance()); + sb.append(", fingerprint: " + getFingerprint()); + sb.append("]"); + return sb.toString(); } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Pattern.java b/services/tagin-api/src/ca/idrc/tagin/model/Pattern.java index 5454472..ae975fb 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Pattern.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Pattern.java @@ -78,6 +78,10 @@ public boolean contains(String id) { return beacons.containsKey(id); } + /** + * Updates all of the instance's beacons ranks + * according to the maximal RSSI measure found. + */ public void updateRanks() { ArrayList values = new ArrayList(beacons.values()); Collections.sort(values); @@ -87,6 +91,12 @@ public void updateRanks() { } } + /** + * Returns a vector that represents the difference between + * the instance pattern and the passed pattern. + * @param p + * @return + */ public List calculateChangeVector(Pattern p) { Map beacons = new HashMap(); ArrayList result = new ArrayList(); @@ -109,10 +119,13 @@ public List calculateChangeVector(Pattern p) { } public String toString() { - return getClass().getSimpleName() + - "[Key: " + getKey() + - ", maxRSSI: " + getMaxRssi() + - ", beacons: " + getBeacons().toString() + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[Key: " + getKey()); + sb.append(", maxRSSI: " + getMaxRssi()); + sb.append(", beacons: " + getBeacons().toString()); + sb.append("]"); + return sb.toString(); } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/URN.java b/services/tagin-api/src/ca/idrc/tagin/model/URN.java index a6c4956..dec465a 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/URN.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/URN.java @@ -21,8 +21,11 @@ public void setValue(String urn) { } public String toString() { - return getClass().getSimpleName() + - "[URN: " + getValue() + "]"; + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append("[URN: " + getValue()); + sb.append("]"); + return sb.toString(); } } diff --git a/services/tagin-api/src/ca/idrc/tagin/model/Util.java b/services/tagin-api/src/ca/idrc/tagin/model/Util.java index f04b17f..7a904dd 100644 --- a/services/tagin-api/src/ca/idrc/tagin/model/Util.java +++ b/services/tagin-api/src/ca/idrc/tagin/model/Util.java @@ -13,10 +13,20 @@ public static Double calculateRank(Double rssi, Double maxRssi) { return Math.pow(rssi / maxRssi, 0.25); } + /** + * Converts dBm measures to power. + * @param dbm + * @return + */ public static double dBm2Power(int dbm) { return Math.pow(10.0, Double.valueOf(dbm - 30) / 10.0); } + /** + * Converts power measures to dBm. + * @param power + * @return + */ public static int power2dBm(double power) { return (int) Math.round(10 * Math.log10(power)) + 30; } diff --git a/services/tagin-api/src/ca/idrc/tagin/spi/v1/FingerprintEndpoints.java b/services/tagin-api/src/ca/idrc/tagin/spi/v1/FingerprintEndpoints.java index b0ff068..a59566e 100644 --- a/services/tagin-api/src/ca/idrc/tagin/spi/v1/FingerprintEndpoints.java +++ b/services/tagin-api/src/ca/idrc/tagin/spi/v1/FingerprintEndpoints.java @@ -19,6 +19,10 @@ public class FingerprintEndpoints { + /** + * Endpoint method that returns a list of all stored fingerprints + * @return + */ @ApiMethod( name = "fingerprints.list", path = "fingerprints", @@ -31,6 +35,11 @@ public List listFingerprints() { return fingerprints; } + /** + * Endpoint method that retrieves a fingerprint with the specified ID + * @param id the fingerprint's ID + * @return the matching fingerprint if found, or null. + */ @ApiMethod( name = "fingerprints.get", path = "fingerprints/{fingerprint_id}", diff --git a/services/tagin-api/src/ca/idrc/tagin/spi/v1/PatternEndpoints.java b/services/tagin-api/src/ca/idrc/tagin/spi/v1/PatternEndpoints.java index 494ea17..a816269 100644 --- a/services/tagin-api/src/ca/idrc/tagin/spi/v1/PatternEndpoints.java +++ b/services/tagin-api/src/ca/idrc/tagin/spi/v1/PatternEndpoints.java @@ -19,6 +19,11 @@ ) public class PatternEndpoints { + /** + * Endpoint method that returns a URN corresponding to the pattern passed. + * @param pattern + * @return + */ @ApiMethod( name = "patterns.add", path = "patterns", @@ -31,6 +36,10 @@ public URN addPattern(Pattern pattern) { return new URN(urn); } + /** + * Endpoint method that returns a list of all stored patterns. + * @return + */ @ApiMethod( name = "patterns.list", path = "patterns", @@ -43,6 +52,11 @@ public List listPatterns() { return patterns; } + /** + * Endpoint method that retrieves a pattern with the specified ID. + * @param id + * @return the matching pattern if found, or null. + */ @ApiMethod( name = "patterns.get", path = "patterns/{pattern_id}", @@ -55,6 +69,10 @@ public Pattern getPattern(@Named("pattern_id") Long id) { return p; } + /** + * Endpoint method that deletes a pattern with the specified ID from the datastore. + * @param id + */ @ApiMethod( name = "patterns.remove", path = "patterns/{pattern_id}", diff --git a/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNEndpoints.java b/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNEndpoints.java index 4a174ce..e6bdd11 100644 --- a/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNEndpoints.java +++ b/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNEndpoints.java @@ -21,6 +21,12 @@ ) public class URNEndpoints { + /** + * Endpoint method that returns the distance between two URNs. + * @param urn1 + * @param urn2 + * @return normalized distance between the two URNs if they are valid, or null. + */ @ApiMethod( name = "urns.distanceto", path = "urns/{urn1}/distanceto/{urn2}", @@ -38,6 +44,12 @@ public Distance getDistanceTo(@Named("urn1") String urn1, @Named("urn2") String return d; } + /** + * Endpoint method that returns a list of neighbours of the specified URN. + * @param urn + * @param maxCount + * @return + */ @ApiMethod( name = "urns.neighbours", path = "urns/{urn}/neighbours", @@ -52,6 +64,10 @@ public List getNeighbours(@Named("urn") String urn, @Named("max_count") Int return neighbours; } + /** + * Endpoint method that deletes the specified URN + * @param urn + */ @ApiMethod( name = "urns.remove", path = "urns/{urn}", diff --git a/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNManager.java b/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNManager.java index 8332819..8175f82 100644 --- a/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNManager.java +++ b/services/tagin-api/src/ca/idrc/tagin/spi/v1/URNManager.java @@ -13,6 +13,13 @@ public class URNManager { private static TaginDao dao; + /** + * Generates a URN to identify the passed fingerprint. + * A new URN is created if the fingerprint does not share any beacon with other fingerprints. + * If it does, it is merged into its closest neighbour, and they share the same URN. + * @param taginDao + * @param fp + */ public static void generateURN(TaginDao taginDao, Fingerprint fp) { dao = taginDao; List neighbours = fp.findCloseNeighbours(); @@ -33,6 +40,11 @@ public static void generateURN(TaginDao taginDao, Fingerprint fp) { } } + /** + * Performs a vectorial translation on the fingerprint's neighbours + * @param fp + * @param changeVector + */ private static void pushAwayNeighbours(Fingerprint fp, List changeVector) { List neighbours = fp.findCloseNeighbours(); for (Neighbour n : neighbours) { diff --git a/services/tagin-api/tests/ca/idrc/tagin/tests/FingerprintTest.java b/services/tagin-api/tests/ca/idrc/tagin/tests/FingerprintTest.java index eebcaff..14a0015 100644 --- a/services/tagin-api/tests/ca/idrc/tagin/tests/FingerprintTest.java +++ b/services/tagin-api/tests/ca/idrc/tagin/tests/FingerprintTest.java @@ -101,7 +101,7 @@ public void testRankDistanceToNeighbour() { TaginDao dao = new TaginEntityManager(); Fingerprint f1 = dao.getFingerprint(p1.getKey().getParent().getId()); Fingerprint f3 = dao.getFingerprint(p3.getKey().getParent().getId()); - Assert.assertTrue(f1.rankDistanceTo(f3) > Fingerprint.THRESHOLD); + Assert.assertTrue(f1.rankDistanceTo(f3) > Fingerprint.MERGE_THRESHOLD); dao.close(); }