diff --git a/mobile/res/layout/view_log_msg.xml b/mobile/res/layout/view_log_msg.xml
index b8ec471a..b7e21a9e 100644
--- a/mobile/res/layout/view_log_msg.xml
+++ b/mobile/res/layout/view_log_msg.xml
@@ -1,51 +1,49 @@
-
-
+ android:orientation="horizontal">
-
+
-
+
+
+
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/mobile/res/menu/debug.xml b/mobile/res/menu/debug.xml
new file mode 100644
index 00000000..b7c8f29a
--- /dev/null
+++ b/mobile/res/menu/debug.xml
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/mobile/res/values/strings.xml b/mobile/res/values/strings.xml
index 19330fcf..0a251478 100644
--- a/mobile/res/values/strings.xml
+++ b/mobile/res/values/strings.xml
@@ -213,6 +213,8 @@
Debug
Send screenshot
Add external plugins
+ Copy
+ Delete
Choose account to login
Login failed.
Search Locations
diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_LogAdapter.java b/mobile/src/com/cradle/iitc_mobile/IITC_LogAdapter.java
index 4a01ac99..ff52c844 100644
--- a/mobile/src/com/cradle/iitc_mobile/IITC_LogAdapter.java
+++ b/mobile/src/com/cradle/iitc_mobile/IITC_LogAdapter.java
@@ -1,6 +1,5 @@
package com.cradle.iitc_mobile;
-import android.annotation.SuppressLint;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
@@ -12,50 +11,52 @@ import com.cradle.iitc_mobile.Log.Message;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.text.SimpleDateFormat;
public class IITC_LogAdapter extends ArrayAdapter implements Log.Receiver {
- @SuppressLint("SimpleDateFormat")
- private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("HH:mm:ss.SSS");
-
+ private final IITC_Mobile mIitc;
private int mObservers = 0;
- private IITC_Mobile mIitc;
- public IITC_LogAdapter(IITC_Mobile iitc) {
+ public IITC_LogAdapter(final IITC_Mobile iitc) {
super(iitc, 0);
mIitc = iitc;
}
@Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Message item = getItem(position);
- View v = mIitc.getLayoutInflater().inflate(R.layout.view_log_msg, parent, false);
+ public View getView(final int position, View v, final ViewGroup parent) {
+ final Message item = getItem(position);
+
+ ViewHolder holder;
+ if (v != null && v.getTag() != null && v.getTag() instanceof ViewHolder) {
+ holder = (ViewHolder) v.getTag();
+ } else {
+ v = mIitc.getLayoutInflater().inflate(R.layout.view_log_msg, parent, false);
+ holder = new ViewHolder();
+ holder.icon = (ImageView) v.findViewById(R.id.log_type);
+ holder.tag = (TextView) v.findViewById(R.id.log_tag);
+ holder.time = (TextView) v.findViewById(R.id.log_time);
+ holder.msg = (TextView) v.findViewById(R.id.log_msg);
+ v.setTag(holder);
+ }
- ImageView iv = (ImageView) v.findViewById(R.id.log_type);
switch (item.getPriority()) {
case Log.ASSERT:
case Log.ERROR:
- iv.setImageResource(R.drawable.ic_action_error_red);
+ holder.icon.setImageResource(R.drawable.ic_action_error_red);
break;
case Log.WARN:
- iv.setImageResource(R.drawable.ic_action_warning_yellow);
+ holder.icon.setImageResource(R.drawable.ic_action_warning_yellow);
break;
default:
- iv.setImageResource(R.drawable.ic_action_about);
+ holder.icon.setImageResource(R.drawable.ic_action_about);
}
- TextView tv;
-
- tv = (TextView) v.findViewById(R.id.log_tag);
- tv.setText(item.getTag());
-
- tv = (TextView) v.findViewById(R.id.log_time);
- tv.setText(FORMATTER.format(item.getDate()));
+ holder.tag.setText(item.getTag());
+ holder.time.setText(item.getDateString());
String msg = item.getMsg();
if (item.getTr() != null) {
- StringWriter sw = new StringWriter();
- PrintWriter pw = new PrintWriter(sw);
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new PrintWriter(sw);
item.getTr().printStackTrace(pw);
if (msg == null || msg.isEmpty())
@@ -64,8 +65,7 @@ public class IITC_LogAdapter extends ArrayAdapter implements Log.Re
msg += "\n" + sw.toString();
}
- tv = (TextView) v.findViewById(R.id.log_msg);
- tv.setText(msg);
+ holder.msg.setText(msg);
return v;
}
@@ -75,27 +75,6 @@ public class IITC_LogAdapter extends ArrayAdapter implements Log.Re
return 1;
}
- @Override
- public void unregisterDataSetObserver(DataSetObserver observer) {
- super.unregisterDataSetObserver(observer);
- mObservers--;
-
- if (mObservers < 1) {
- clear();
- Log.removeReceiver(this);
- }
- }
-
- @Override
- public void registerDataSetObserver(DataSetObserver observer) {
- super.registerDataSetObserver(observer);
-
- if (mObservers < 1)
- Log.addReceiver(this);
-
- mObservers++;
- }
-
@Override
public void handle(final Message message) {
mIitc.runOnUiThread(new Runnable() {
@@ -105,4 +84,32 @@ public class IITC_LogAdapter extends ArrayAdapter implements Log.Re
}
});
}
+
+ @Override
+ public void registerDataSetObserver(final DataSetObserver observer) {
+ super.registerDataSetObserver(observer);
+
+ if (mObservers < 1)
+ Log.addReceiver(this);
+
+ mObservers++;
+ }
+
+ @Override
+ public void unregisterDataSetObserver(final DataSetObserver observer) {
+ super.unregisterDataSetObserver(observer);
+ mObservers--;
+
+ if (mObservers < 1) {
+ clear();
+ Log.removeReceiver(this);
+ }
+ }
+
+ private class ViewHolder {
+ private ImageView icon;
+ private TextView msg;
+ private TextView tag;
+ private TextView time;
+ }
}
diff --git a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java
index c5ab2e8e..5e68fcc7 100644
--- a/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java
+++ b/mobile/src/com/cradle/iitc_mobile/IITC_Mobile.java
@@ -32,9 +32,12 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.CookieManager;
import android.webkit.WebView;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
+import android.widget.PopupMenu;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
@@ -60,7 +63,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IITC_Mobile extends Activity
- implements OnSharedPreferenceChangeListener, NfcAdapter.CreateNdefMessageCallback {
+ implements OnSharedPreferenceChangeListener, NfcAdapter.CreateNdefMessageCallback, OnItemLongClickListener {
private static final String mIntelUrl = "https://www.ingress.com/intel";
private SharedPreferences mSharedPrefs;
@@ -132,6 +135,7 @@ public class IITC_Mobile extends Activity
});
mLvDebug.setAdapter(new IITC_LogAdapter(this));
+ mLvDebug.setOnItemLongClickListener(this);
// do something if user changed something in the settings
mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
@@ -930,4 +934,33 @@ public class IITC_Mobile extends Activity
}
return new NdefMessage(records);
}
+
+ @Override
+ public boolean onItemLongClick(final AdapterView> parent, final View view, final int position, final long id) {
+ if (parent == mLvDebug) {
+ final IITC_LogAdapter adapter = ((IITC_LogAdapter) parent.getAdapter());
+ final Log.Message item = adapter.getItem(position);
+
+ final PopupMenu popupMenu = new PopupMenu(this, view);
+ popupMenu.getMenuInflater().inflate(R.menu.debug, popupMenu.getMenu());
+
+ popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
+ @Override
+ public boolean onMenuItemClick(final MenuItem menuitem) {
+ switch (menuitem.getItemId()) {
+ case R.id.menu_copy:
+ mIitcWebView.getJSInterface().copy(item.toString());
+ return true;
+ case R.id.menu_delete:
+ adapter.remove(item);
+ return true;
+ }
+ return false;
+ }
+ });
+
+ popupMenu.show();
+ }
+ return false;
+ }
}
diff --git a/mobile/src/com/cradle/iitc_mobile/Log.java b/mobile/src/com/cradle/iitc_mobile/Log.java
index 1411c870..122bbfe8 100644
--- a/mobile/src/com/cradle/iitc_mobile/Log.java
+++ b/mobile/src/com/cradle/iitc_mobile/Log.java
@@ -1,8 +1,12 @@
package com.cradle.iitc_mobile;
+import android.annotation.SuppressLint;
import android.webkit.ConsoleMessage;
import android.webkit.ConsoleMessage.MessageLevel;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
@@ -12,6 +16,8 @@ import java.util.regex.Pattern;
public final class Log {
private static final HashMap CONSOLE_MAPPING;
+ @SuppressLint("SimpleDateFormat")
+ private static final SimpleDateFormat FORMATTER = new SimpleDateFormat("HH:mm:ss.SSS");
private static final List RECEIVERS = new LinkedList();
private static final Pattern URL_PATTERN;
@@ -268,6 +274,10 @@ public final class Log {
return mDate;
}
+ public String getDateString() {
+ return FORMATTER.format(mDate);
+ }
+
public String getMsg() {
return mMsg;
}
@@ -283,6 +293,46 @@ public final class Log {
public Throwable getTr() {
return mTr;
}
+
+ @Override
+ public String toString() {
+ String priority;
+ switch (mPriority) {
+ case Log.ASSERT:
+ priority = "ASSERT";
+ break;
+ case Log.DEBUG:
+ priority = "DEBUG";
+ break;
+ case Log.ERROR:
+ priority = "ERROR";
+ break;
+ case Log.INFO:
+ priority = "INFO";
+ case Log.WARN:
+ priority = "WARN";
+ break;
+ case Log.VERBOSE:
+ priority = "VERBOSE";
+ break;
+ default:
+ priority = "UNKNOWN";
+ }
+
+ String msg = mMsg;
+ if (mTr != null) {
+ final StringWriter sw = new StringWriter();
+ final PrintWriter pw = new PrintWriter(sw);
+ mTr.printStackTrace(pw);
+
+ if (msg == null || msg.isEmpty())
+ msg = sw.toString();
+ else
+ msg += "\n" + sw.toString();
+ }
+
+ return getDateString() + " " + priority + " " + getTag() + "\n" + msg;
+ }
}
public static interface Receiver {