/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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.motorola.studio.android.adt;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
import com.android.ddmlib.AndroidDebugBridge;
import com.android.ddmlib.AndroidDebugBridge.IClientChangeListener;
import com.android.ddmlib.AndroidDebugBridge.IDebugBridgeChangeListener;
public class StudioAndroidEventManager
{
private static final HashMap<EventType, List<DdmsRunnable>> listeners =
new HashMap<EventType, List<DdmsRunnable>>();
public enum EventType
{
DEVICE_CONNECTED, DEVICE_DISCONNECTED, PACKAGE_INSTALLED, PACKAGE_UNINSTALLED,
LANGUAGE_CHANGED
};
public static void addEventListener(EventType type, DdmsRunnable listener)
{
synchronized (listeners)
{
List<DdmsRunnable> typeListeners = listeners.get(type);
if (typeListeners == null)
{
typeListeners = new LinkedList<DdmsRunnable>();
listeners.put(type, typeListeners);
}
typeListeners.add(listener);
}
}
public static void removeEventListener(EventType type, DdmsRunnable listener)
{
synchronized (listeners)
{
List<DdmsRunnable> typeListeners = listeners.get(type);
if (typeListeners == null)
{
typeListeners = new LinkedList<DdmsRunnable>();
listeners.put(type, typeListeners);
}
typeListeners.remove(listener);
}
}
/**
* Adds a IClientChangeListener asynchronously
*
* @param listener The listener to add
*/
public static void asyncAddClientChangeListener(final IClientChangeListener listener)
{
new Thread(new Runnable()
{
public void run()
{
AndroidDebugBridge.addClientChangeListener(listener);
}
}).start();
}
/**
* Removes a IClientChangeListener asynchronously
*
* @param listener The listener to remove
*/
public static void asyncRemoveClientChangeListener(final IClientChangeListener listener)
{
new Thread(new Runnable()
{
public void run()
{
AndroidDebugBridge.removeClientChangeListener(listener);
}
}).start();
}
/**
* Adds a IDebugBridgeChangeListener asynchronously
*
* @param listener The listener to add
*/
public static void asyncAddDebugBridgeChangeListener(final IDebugBridgeChangeListener listener)
{
new Thread(new Runnable()
{
public void run()
{
AndroidDebugBridge.addDebugBridgeChangeListener(listener);
}
}).start();
}
/**
* Removes a IDebugBridgeChangeListener asynchronously
*
* @param listener The listener to remove
*/
public static void asyncRemoveDebugBridgeChangeListener(
final IDebugBridgeChangeListener listener)
{
new Thread(new Runnable()
{
public void run()
{
AndroidDebugBridge.removeDebugBridgeChangeListener(listener);
}
}).start();
}
/**
* Adds a IDeviceChangeListener asynchronously
*
* @param listener The listener to add
*/
public static void asyncAddDeviceChangeListeners(final DdmsRunnable connectedListener,
final DdmsRunnable disconnectedListener)
{
new Thread(new Runnable()
{
public void run()
{
if (connectedListener != null)
{
addEventListener(EventType.DEVICE_CONNECTED, connectedListener);
}
if (disconnectedListener != null)
{
addEventListener(EventType.DEVICE_DISCONNECTED, disconnectedListener);
}
}
}).start();
}
/**
* Removes a IDeviceChangeListener asynchronously
*
* @param listener The listener to remove
*/
public static void asyncRemoveDeviceChangeListeners(final DdmsRunnable connectedListener,
final DdmsRunnable disconnectedListener)
{
new Thread(new Runnable()
{
public void run()
{
if (connectedListener != null)
{
removeEventListener(EventType.DEVICE_CONNECTED, connectedListener);
}
if (disconnectedListener != null)
{
removeEventListener(EventType.DEVICE_DISCONNECTED, disconnectedListener);
}
}
}).start();
}
public static void fireEvent(EventType type, final String serialNumber)
{
synchronized (listeners)
{
if (listeners.get(type) != null)
{
for (final DdmsRunnable runnable : listeners.get(type))
{
SafeRunner.run(new SafeRunnable()
{
public void run() throws Exception
{
runnable.run(serialNumber);
}
});
}
}
}
}
}