OSDN Git Service

Add a preference to turn on/off auto monitoring logcat. DO NOT MERGE.
authorSiva Velusamy <vsiva@google.com>
Tue, 4 Oct 2011 22:27:20 +0000 (15:27 -0700)
committerTor Norbye <tnorbye@google.com>
Wed, 5 Oct 2011 18:51:45 +0000 (11:51 -0700)
Change-Id: I30174344cd5909e3de773b30cac711dd4f609f87

eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/LogCatMonitor.java
eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/Messages.java
eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/i18n/messages.properties
eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/LogCatPreferencePage.java
eclipse/plugins/com.android.ide.eclipse.ddms/src/com/android/ide/eclipse/ddms/preferences/PreferenceInitializer.java

index e0fe6c1..662e8f9 100644 (file)
@@ -26,6 +26,8 @@ import com.android.ddmuilib.logcat.LogCatReceiverFactory;
 import com.android.ide.eclipse.ddms.views.LogCatView;
 
 import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IViewPart;
 import org.eclipse.ui.IWorkbenchPage;
@@ -33,9 +35,9 @@ import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.List;
-import java.util.Set;
+import java.util.Map;
 
 /**
  * LogCatMonitor helps in monitoring the logcat output from a set of devices.
@@ -43,19 +45,22 @@ import java.util.Set;
  * if any message is deemed important.
  */
 public class LogCatMonitor {
+    public static final String AUTO_MONITOR_PREFKEY = "ddms.logcat.automonitor";
+
     private IPreferenceStore mPrefStore;
-    private Set<String> mMonitoredDevices;
+    private Map<String, DeviceData> mMonitoredDevices;
     private IDebuggerConnector[] mConnectors;
 
     public LogCatMonitor(IDebuggerConnector[] debuggerConnectors, IPreferenceStore prefStore) {
         mConnectors = debuggerConnectors;
         mPrefStore = prefStore;
 
-        mMonitoredDevices = new HashSet<String>();
+        mMonitoredDevices = new HashMap<String, DeviceData>();
 
         AndroidDebugBridge.addDeviceChangeListener(new IDeviceChangeListener() {
             public void deviceDisconnected(IDevice device) {
-                unmonitorDevice(device);
+                unmonitorDevice(device.getSerialNumber());
+                mMonitoredDevices.remove(device.getSerialNumber());
             }
 
             public void deviceConnected(IDevice device) {
@@ -64,26 +69,54 @@ public class LogCatMonitor {
             public void deviceChanged(IDevice device, int changeMask) {
             }
         });
+
+        mPrefStore.addPropertyChangeListener(new IPropertyChangeListener() {
+            public void propertyChange(PropertyChangeEvent event) {
+                if (AUTO_MONITOR_PREFKEY.equals(event.getProperty())
+                        && event.getNewValue().equals(false)) {
+                    unmonitorAllDevices();
+                }
+            }
+        });
     }
 
-    private synchronized void unmonitorDevice(IDevice device) {
-        mMonitoredDevices.remove(device.getSerialNumber());
+    private void unmonitorAllDevices() {
+        for (String device : mMonitoredDevices.keySet()) {
+            unmonitorDevice(device);
+        }
+
+        mMonitoredDevices.clear();
+    }
+
+    private void unmonitorDevice(String deviceSerial) {
+        DeviceData data = mMonitoredDevices.get(deviceSerial);
+        if (data == null) {
+            return;
+        }
+
+        data.receiver.removeMessageReceivedEventListener(data.messageEventListener);
     }
 
     public void monitorDevice(final IDevice device) {
-        if (mMonitoredDevices.contains(device.getSerialNumber())) {
+        if (!mPrefStore.getBoolean(AUTO_MONITOR_PREFKEY)) {
+            // do not monitor device if auto monitoring is off
+            return;
+        }
+
+        if (mMonitoredDevices.keySet().contains(device.getSerialNumber())) {
             // the device is already monitored
             return;
         }
 
         LogCatReceiver r = LogCatReceiverFactory.INSTANCE.newReceiver(device, mPrefStore);
-        r.addMessageReceivedEventListener(new ILogCatMessageEventListener() {
+        ILogCatMessageEventListener l = new ILogCatMessageEventListener() {
             public void messageReceived(List<LogCatMessage> receivedMessages) {
                 checkMessages(receivedMessages, device);
             }
-        });
+        };
+        r.addMessageReceivedEventListener(l);
 
-        mMonitoredDevices.add(device.getSerialNumber());
+        mMonitoredDevices.put(device.getSerialNumber(), new DeviceData(r, l));
     }
 
     private void checkMessages(List<LogCatMessage> receivedMessages, IDevice device) {
@@ -163,4 +196,14 @@ public class LogCatMonitor {
             }
         });
     }
+
+    private static class DeviceData {
+        public final LogCatReceiver receiver;
+        public final ILogCatMessageEventListener messageEventListener;
+
+        public DeviceData(LogCatReceiver r, ILogCatMessageEventListener l) {
+            receiver = r;
+            messageEventListener = l;
+        }
+    }
 }
index ab000a3..15d30dd 100644 (file)
@@ -82,6 +82,7 @@ public class Messages extends NLS {
     public static String LogCatPreferencePage_Go_To_Problem_Error_Line;
     public static String LogCatPreferencePage_Switch_Perspective;
     public static String LogCatPreferencePage_Switch_To;
+    public static String LogCatPreferencePage_AutoMonitorLogcat;
     public static String LogCatView_Clear_Log;
     public static String LogCatView_Copy;
     public static String LogCatView_Create_Filter;
index 72f25e6..42722b1 100644 (file)
@@ -76,6 +76,7 @@ LogCatPreferencePage_Go_To_Problem_Declararion=Go to Problem (method declaration
 LogCatPreferencePage_Go_To_Problem_Error_Line=Go to Problem (error line)
 LogCatPreferencePage_Switch_Perspective=Switch Perspective
 LogCatPreferencePage_Switch_To=Switch to:
+LogCatPreferencePage_AutoMonitorLogcat=Display logcat view when there are messages from an application in the workspace
 LogCatView_Clear_Log=Clear Log
 LogCatView_Copy=Copy
 LogCatView_Create_Filter=Create Filter
index ae4e723..1f81a6d 100644 (file)
@@ -30,6 +30,7 @@ import org.eclipse.ui.PlatformUI;
 import com.android.ddmuilib.logcat.LogCatMessageList;
 import com.android.ddmuilib.logcat.LogCatPanel;
 import com.android.ide.eclipse.ddms.DdmsPlugin;
+import com.android.ide.eclipse.ddms.LogCatMonitor;
 import com.android.ide.eclipse.ddms.i18n.Messages;
 import com.android.ide.eclipse.ddms.views.LogCatView;
 
@@ -42,6 +43,7 @@ public class LogCatPreferencePage extends FieldEditorPreferencePage implements
     private BooleanFieldEditor mSwitchPerspective;
     private ComboFieldEditor mWhichPerspective;
     private IntegerFieldEditor mMaxMessages;
+    private BooleanFieldEditor mAutoMonitorLogcat;
 
     public LogCatPreferencePage() {
         super(GRID);
@@ -92,6 +94,11 @@ public class LogCatPreferencePage extends FieldEditorPreferencePage implements
         mWhichPerspective.setEnabled(getPreferenceStore()
                 .getBoolean(PreferenceInitializer.ATTR_SWITCH_PERSPECTIVE), getFieldEditorParent());
         addField(mWhichPerspective);
+
+        mAutoMonitorLogcat = new BooleanFieldEditor(LogCatMonitor.AUTO_MONITOR_PREFKEY,
+                Messages.LogCatPreferencePage_AutoMonitorLogcat,
+                getFieldEditorParent());
+        addField(mAutoMonitorLogcat);
     }
 
     public void init(IWorkbench workbench) {
index d84ce2b..2afa58c 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.ide.eclipse.ddms.preferences;
 
 import com.android.ide.eclipse.ddms.DdmsPlugin;
+import com.android.ide.eclipse.ddms.LogCatMonitor;
 import com.android.ide.eclipse.ddms.views.DeviceView.HProfHandler;
 import com.android.ide.eclipse.ddms.views.LogCatView;
 import com.android.ddmlib.DdmPreferences;
@@ -117,6 +118,8 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer {
         store.setDefault(ATTR_ADBHOST_VALUE, DdmPreferences.DEFAULT_ADBHOST_VALUE);
         store.setDefault(ATTR_SWITCH_PERSPECTIVE, LogCatView.DEFAULT_SWITCH_PERSPECTIVE);
         store.setDefault(ATTR_PERSPECTIVE_ID, LogCatView.DEFAULT_PERSPECTIVE_ID);
+
+        store.setDefault(LogCatMonitor.AUTO_MONITOR_PREFKEY, true);
     }
 
     /**