package com.xypower.mpremote; import android.content.Context; import android.text.TextUtils; import java.io.File; import java.util.HashMap; import java.util.Map; import dadb.AdbKeyPair; import dadb.Dadb; public class AdbManager { private static class InternalAdb { public Dadb adb; public String ip; public int port; } private static AdbKeyPair mAdbKeyPair; private static Object mLocker = new Object(); private static Map mAdbs = new HashMap<>(); public static void initManager(Context context) { File file = new File(context.getFilesDir(), ".keypair"); if (!file.exists()) { file.mkdirs(); } final File pubKeyFile = new File(file, "pub.key"); final File priKeyFile = new File(file, "pri.key"); if (!priKeyFile.exists() || !pubKeyFile.exists()) { AdbKeyPair.generate(priKeyFile, pubKeyFile); } mAdbKeyPair = AdbKeyPair.read(priKeyFile, pubKeyFile); } public static Dadb getAdb(String ip, int port) { synchronized (mLocker) { if (mAdbs.containsKey(ip)) { InternalAdb adb = mAdbs.get(ip); if (adb != null && adb.port == port) { if (adb.adb != null) { return adb.adb; } } mAdbs.remove(ip); if (adb != null && adb.adb != null) { try { adb.adb.close(); } catch (Exception ex) { ex.printStackTrace(); } adb.adb = null; } adb = null; } InternalAdb adb = new InternalAdb(); adb.ip = ip; adb.port = port; adb.adb = Dadb.create(ip, port, mAdbKeyPair); mAdbs.put(ip, adb); return adb.adb; } } public static void releaseAdb(String ip) { synchronized (mLocker) { if (mAdbs.containsKey(ip)) { InternalAdb adb = mAdbs.get(ip); mAdbs.remove(ip); if (adb != null && adb.adb != null) { try { adb.adb.close(); } catch (Exception ex) { ex.printStackTrace(); } adb.adb = null; } adb = null; } } } public static void clear() { synchronized (mLocker) { for (InternalAdb adb : mAdbs.values()) { if (adb != null && adb.adb != null) { try { adb.adb.close(); } catch (Exception ex) { ex.printStackTrace(); } adb.adb = null; } adb = null; } mAdbs.clear(); } } }