blob: a2ffa042b0263cf1018e6fd3e6e8b6e0bb3a2e4f [file] [log] [blame]
/*
* 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.android.ide.eclipse.monitor.ddms;
import com.android.ddmlib.DebugPortManager.IDebugPortProvider;
import com.android.ddmlib.IDevice;
import com.android.ide.eclipse.ddms.DdmsPlugin;
import org.eclipse.jface.preference.IPreferenceStore;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* DDMS implementation of the IDebugPortProvider interface.
* This class handles saving/loading the list of static debug port from
* the preference store and provides the port number to the Device Monitor.
*/
public class DebugPortProvider implements IDebugPortProvider {
private static DebugPortProvider sThis = new DebugPortProvider();
/** Preference name for the static port list. */
public static final String PREFS_STATIC_PORT_LIST = "android.staticPortList"; //$NON-NLS-1$
/**
* Mapping device serial numbers to maps. The embedded maps are mapping application names to
* debugger ports.
*/
private Map<String, Map<String, Integer>> mMap;
public static DebugPortProvider getInstance() {
return sThis;
}
private DebugPortProvider() {
computePortList();
}
/**
* Returns a static debug port for the specified application running on the
* specified {@link IDevice}.
* @param device The device the application is running on.
* @param appName The application name, as defined in the
* AndroidManifest.xml package attribute.
* @return The static debug port or {@link #NO_STATIC_PORT} if there is none setup.
*
* @see IDebugPortProvider#getPort(IDevice, String)
*/
@Override
public int getPort(IDevice device, String appName) {
if (mMap != null) {
Map<String, Integer> deviceMap = mMap.get(device.getSerialNumber());
if (deviceMap != null) {
Integer i = deviceMap.get(appName);
if (i != null) {
return i.intValue();
}
}
}
return IDebugPortProvider.NO_STATIC_PORT;
}
/**
* Returns the map of Static debugger ports. The map links device serial numbers to
* a map linking application name to debugger ports.
*/
public Map<String, Map<String, Integer>> getPortList() {
return mMap;
}
/**
* Create the map member from the values contained in the Preference Store.
*/
private void computePortList() {
mMap = new HashMap<String, Map<String, Integer>>();
// get the prefs store
IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
String value = store.getString(PREFS_STATIC_PORT_LIST);
if (value != null && value.length() > 0) {
// format is
// port1|port2|port3|...
// where port# is
// appPackageName:appPortNumber:device-serial-number
String[] portSegments = value.split("\\|"); //$NON-NLS-1$
for (String seg : portSegments) {
String[] entry = seg.split(":"); //$NON-NLS-1$
// backward compatibility support. if we have only 2 entry, we default
// to the first emulator.
String deviceName = null;
if (entry.length == 3) {
deviceName = entry[2];
} else {
deviceName = IDevice.FIRST_EMULATOR_SN;
}
// get the device map
Map<String, Integer> deviceMap = mMap.get(deviceName);
if (deviceMap == null) {
deviceMap = new HashMap<String, Integer>();
mMap.put(deviceName, deviceMap);
}
deviceMap.put(entry[0], Integer.valueOf(entry[1]));
}
}
}
/**
* Sets new [device, app, port] values.
* The values are also sync'ed in the preference store.
* @param map The map containing the new values.
*/
public void setPortList(Map<String, Map<String,Integer>> map) {
// update the member map.
mMap.clear();
mMap.putAll(map);
// create the value to store in the preference store.
// see format definition in getPortList
StringBuilder sb = new StringBuilder();
Set<String> deviceKeys = map.keySet();
for (String deviceKey : deviceKeys) {
Map<String, Integer> deviceMap = map.get(deviceKey);
if (deviceMap != null) {
Set<String> appKeys = deviceMap.keySet();
for (String appKey : appKeys) {
Integer port = deviceMap.get(appKey);
if (port != null) {
sb.append(appKey).append(':').append(port.intValue()).append(':').
append(deviceKey).append('|');
}
}
}
}
String value = sb.toString();
// get the prefs store.
IPreferenceStore store = DdmsPlugin.getDefault().getPreferenceStore();
// and give it the new value.
store.setValue(PREFS_STATIC_PORT_LIST, value);
}
}