package com.suwish.pc.phone;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.android.ddmlib.IDevice;
import com.suwish.pc.Setting;
import com.suwish.pc.adb.Adb;
import com.suwish.pc.adb.AdbManager;
import com.suwish.pc.adb.Command;
import com.suwish.pc.ddms.DdmsManager;
import com.suwish.pc.event.AdbEvent;
import com.suwish.pc.event.PhoneEvent;
import com.suwish.pc.event.PhoneListener;
import com.suwish.pc.ui.preference.PreferenceManager;
import com.suwish.pc.util.StringUtils;
/**
*
* <b>PhoneManager</b>顾名思义,就是对{@link Phone}的管理,{@link Phone}是对
* Android电话设备的抽象,向上提供用户界面使用,向下封装设备的连接和通信方式。
* 目前设计的通信方式有三种,ADB、USB-SOCKET、DDMS。</p>
*
* 三种通信方各有优缺点.
*
* @author Min
* @version 0.1 此版本基本消除<code>PhoneManager</code>的所有作用,而仅仅作为一个
* 系统的调用核心使用,并取消{@link Phone}设计之初的目的,本版本所有操作和事件完全依赖于
* DDMS完成。下一个版本将使用USB-SOCKET和ADB配合的方式,并将{@link IDevice}和ADB都纳入
* {@link Phone}对象管理。因此当前版本关于<code>Phone</code>的方法和操作都可视为无效和
* 不提倡的。鉴于此,所有的的操作都归入相应的Manager完成,<code>PhoneManager</code>仅仅
* 负责管理这些Manager和提供一些工具方法。
*/
public final class PhoneManager {
private static PhoneManager manager = null;
private AdbManager adbManager = null;
private DdmsManager ddmsManager = null;
private PreferenceManager perferenceManager = null;
private List<Phone> phones = new ArrayList<Phone>();
private List<PhoneListener> listeners = new ArrayList<PhoneListener>();
/**
*
* 单例
* @return
*/
public static synchronized PhoneManager getInstance(){
return manager == null ? (manager = new PhoneManager()) : manager;
}
public synchronized AdbManager getAdbManager(){
return adbManager == null ? (adbManager = new AdbManager(this)) : adbManager;
}
public synchronized PreferenceManager getPerferenceManager(){
return perferenceManager == null ? perferenceManager = new PreferenceManager() : perferenceManager;
}
public DdmsManager getDdmsManager(){
return ddmsManager;
}
public void initEvt(){
}
private PhoneManager(){
init();
}
private void init(){
ddmsManager = new DdmsManager();
ddmsManager.startDdmsAndWaitTimeOut();
}
// public Adb createAdb(){}
/**
*
* @deprecated
*/
void firePhoneConnect(PhoneEvent event){
for(PhoneListener l : listeners){
// if(!l.acceptEvent(event)) continue;
l.phoneConnect(event);
}
}
/**
*
* @deprecated
*
*/
void firePhoneDisconnect(PhoneEvent event){
for(PhoneListener l : listeners){
// if(!l.acceptEvent(event)) continue;
l.phoneDisconnection(event);
}
}
/**
*
* @param phone
* @deprecated
*/
public void closeConnect(Phone phone){
}
/**
* 退出系统,在此将销毁一些系统资源。
*
*/
public void exitSystem(){
ddmsManager.stopDdmsManager();
Setting.saveConfiguration();
System.exit(0);
}
/**
*
* @param serialNumber
* @return
* @throws IOException
*/
public static Process callShell(String serialNumber) throws IOException{
return AdbManager.execCommand(new Command(AdbManager.ADB_PATH, " -s " + serialNumber + " shell"));
}
public static String execCommand(String command) throws IOException{
return AdbManager.queryResult(new Command(AdbManager.ADB_PATH, command), true);
}
/**
*
* @param serialNumber
* @return
* @deprecated
*/
public Phone connectBySerialNumber(String serialNumber){
return null;
}
/**
*
* @param adb
* @return
* @deprecated
*/
public Phone getPhone(Adb adb){
if(StringUtils.isEmpty(adb.getSeroalNo())) return null;
for(Phone phone : phones){
if(phone.getAdb().getSeroalNo().equals(adb.getSeroalNo())) return phone;
}
return null;
}
/**
*
* @param serialNumber
* @return
* @deprecated
*/
public Phone getPhone(String serialNumber){
if(StringUtils.isEmpty(serialNumber)) return null;
for(Phone phone : phones){
if(serialNumber.equals(phone.getSerialNumber())) return phone;
}
return null;
}
/**
*
* @param l
* @deprecated
*/
public void addConnectListener(PhoneListener l){
if(listeners.contains(l)) return;
listeners.add(l);
}
/**
*
* @param l
* @return
* @deprecated
*/
public boolean removeConnectListener(PhoneListener l){
return listeners.remove(l);
}
}