From c46db9416a5637f603b6272645bc5e83723dbcc9 Mon Sep 17 00:00:00 2001 From: Elvis Date: Fri, 10 May 2019 14:22:01 +0800 Subject: [PATCH] 添加新文件 --- C5/app/src/main/aidl/com/sunvote/basebridge/IPadSystem.aidl | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/sdk/HuaWeiSDK.java | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/AbsDownloadProcess.java | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/IUploadListener.java | 18 ++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/RFFileDownloadModule.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/RFFileUploadModule.java | 362 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/RFMessageUploadModule.java | 303 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/java/com/sunvote/xpadcomm/usb/UsbTransferManager.java | 452 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ C5/app/src/main/res/drawable-xhdpi/signal_1.png | Bin 0 -> 1804 bytes C5/app/src/main/res/drawable-xhdpi/signal_2.png | Bin 0 -> 1762 bytes C5/app/src/main/res/drawable-xhdpi/signal_3.png | Bin 0 -> 1814 bytes C5/app/src/main/res/drawable-xhdpi/signal_4.png | Bin 0 -> 1700 bytes C5/app/src/main/res/drawable-xhdpi/signal_5.png | Bin 0 -> 1548 bytes C5/app/src/main/res/drawable-xxhdpi/signal_1.png | Bin 0 -> 1683 bytes C5/app/src/main/res/drawable-xxhdpi/signal_2.png | Bin 0 -> 1777 bytes C5/app/src/main/res/drawable-xxhdpi/signal_3.png | Bin 0 -> 1777 bytes C5/app/src/main/res/drawable-xxhdpi/signal_4.png | Bin 0 -> 1751 bytes C5/app/src/main/res/drawable-xxhdpi/signal_5.png | Bin 0 -> 1486 bytes C5/app/src/main/res/drawable-xxxhdpi/signal_1.png | Bin 0 -> 2883 bytes C5/app/src/main/res/drawable-xxxhdpi/signal_2.png | Bin 0 -> 2697 bytes C5/app/src/main/res/drawable-xxxhdpi/signal_3.png | Bin 0 -> 2741 bytes C5/app/src/main/res/drawable-xxxhdpi/signal_4.png | Bin 0 -> 2497 bytes C5/app/src/main/res/drawable-xxxhdpi/signal_5.png | Bin 0 -> 2180 bytes C5/app/src/main/res/mipmap-xhdpi/signal.png | Bin 0 -> 1703 bytes C5/app/src/main/res/mipmap-xhdpi/signal_1.png | Bin 0 -> 1804 bytes C5/app/src/main/res/mipmap-xhdpi/signal_2.png | Bin 0 -> 1762 bytes C5/app/src/main/res/mipmap-xhdpi/signal_3.png | Bin 0 -> 1814 bytes C5/app/src/main/res/mipmap-xhdpi/signal_4.png | Bin 0 -> 1700 bytes C5/app/src/main/res/mipmap-xhdpi/signal_5.png | Bin 0 -> 1548 bytes C5/app/src/main/res/mipmap-xxhdpi/signal.png | Bin 0 -> 1582 bytes C5/app/src/main/res/mipmap-xxhdpi/signal_1.png | Bin 0 -> 1683 bytes C5/app/src/main/res/mipmap-xxhdpi/signal_2.png | Bin 0 -> 1777 bytes C5/app/src/main/res/mipmap-xxhdpi/signal_3.png | Bin 0 -> 1777 bytes C5/app/src/main/res/mipmap-xxhdpi/signal_4.png | Bin 0 -> 1751 bytes C5/app/src/main/res/mipmap-xxhdpi/signal_5.png | Bin 0 -> 1486 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal.png | Bin 0 -> 2538 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal_1.png | Bin 0 -> 2883 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal_2.png | Bin 0 -> 2697 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal_3.png | Bin 0 -> 2741 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal_4.png | Bin 0 -> 2497 bytes C5/app/src/main/res/mipmap-xxxhdpi/signal_5.png | Bin 0 -> 2180 bytes 41 files changed, 1776 insertions(+), 0 deletions(-) create mode 100644 C5/app/src/main/aidl/com/sunvote/basebridge/IPadSystem.aidl create mode 100644 C5/app/src/main/java/com/sunvote/sdk/HuaWeiSDK.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/AbsDownloadProcess.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/IUploadListener.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/RFFileDownloadModule.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/RFFileUploadModule.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/RFMessageUploadModule.java create mode 100644 C5/app/src/main/java/com/sunvote/xpadcomm/usb/UsbTransferManager.java create mode 100644 C5/app/src/main/res/drawable-xhdpi/signal_1.png create mode 100644 C5/app/src/main/res/drawable-xhdpi/signal_2.png create mode 100644 C5/app/src/main/res/drawable-xhdpi/signal_3.png create mode 100644 C5/app/src/main/res/drawable-xhdpi/signal_4.png create mode 100644 C5/app/src/main/res/drawable-xhdpi/signal_5.png create mode 100644 C5/app/src/main/res/drawable-xxhdpi/signal_1.png create mode 100644 C5/app/src/main/res/drawable-xxhdpi/signal_2.png create mode 100644 C5/app/src/main/res/drawable-xxhdpi/signal_3.png create mode 100644 C5/app/src/main/res/drawable-xxhdpi/signal_4.png create mode 100644 C5/app/src/main/res/drawable-xxhdpi/signal_5.png create mode 100644 C5/app/src/main/res/drawable-xxxhdpi/signal_1.png create mode 100644 C5/app/src/main/res/drawable-xxxhdpi/signal_2.png create mode 100644 C5/app/src/main/res/drawable-xxxhdpi/signal_3.png create mode 100644 C5/app/src/main/res/drawable-xxxhdpi/signal_4.png create mode 100644 C5/app/src/main/res/drawable-xxxhdpi/signal_5.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal_1.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal_2.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal_3.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal_4.png create mode 100644 C5/app/src/main/res/mipmap-xhdpi/signal_5.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal_1.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal_2.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal_3.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal_4.png create mode 100644 C5/app/src/main/res/mipmap-xxhdpi/signal_5.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal_1.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal_2.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal_3.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal_4.png create mode 100644 C5/app/src/main/res/mipmap-xxxhdpi/signal_5.png diff --git a/C5/app/src/main/aidl/com/sunvote/basebridge/IPadSystem.aidl b/C5/app/src/main/aidl/com/sunvote/basebridge/IPadSystem.aidl new file mode 100644 index 0000000..99ee519 --- /dev/null +++ b/C5/app/src/main/aidl/com/sunvote/basebridge/IPadSystem.aidl @@ -0,0 +1,84 @@ +// IPadSystem.aidl +package com.sunvote.basebridge; + +// Declare any non-default types here with import statements + +interface IPadSystem { + /** + * 控制系统关机 + */ + boolean powerOffXPad(); + + /** + * 控制系统重启 + * @return true 成功 + * false 失败 + */ + boolean rebootXPad(); + /** + * 控制系统禁/启用通知栏 + * @return true 成功 + * false 失败 + */ + boolean setNavgation(boolean visible); + + /** + * 是否激活 + * @return true 成功 + * false 失败 + */ + boolean isActiveMe(); + + + boolean setStatusBarExpandPanelDisabled(boolean disable); + + boolean setNavigationBarDisabled(boolean disable); + /** + * 控制系统禁/启用Home键 + * @return true 成功 + * false 失败 + */ + boolean setHomeButtonDisabled(boolean disable); + /** + * 控制系统禁/启用BACK键 + * @return true 成功 + * false 失败 + */ + boolean setBackButtonDisabled(boolean disable); + /** + * 控制系统禁/启用power off键 + * @return true 成功 + * false 失败 + */ + boolean setPowerDisabled(boolean disable); + + /** + * 控制系统禁/启用最近使用栏 + * @return true 成功 + * false 失败 + */ + boolean setTaskButtonDisabled(boolean disable); + + boolean installPackage(String packagePath); + boolean uninstallPackage(String packageName, boolean keepData); + boolean clearPackageData(String packageName); + /** + * 注册开机启动程序 + * packageName 启动名称 + * activi 是否激活 + * @return 0 表示应用成功 + * 1 下次生效 + * 2 表示已成功 + * -1 失败 + */ + int registerBootStarted(String packageName,String activity ,boolean activi); + + /** + * 移除其他所有开机启动程序 + * @return 0 成功 + * <0 失败 + * >=0 成功 + */ + int removeAllBootStarted(); + +} diff --git a/C5/app/src/main/java/com/sunvote/sdk/HuaWeiSDK.java b/C5/app/src/main/java/com/sunvote/sdk/HuaWeiSDK.java new file mode 100644 index 0000000..e2ed644 --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/sdk/HuaWeiSDK.java @@ -0,0 +1,323 @@ +package com.sunvote.sdk; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.os.IBinder; +import android.os.RemoteException; + +import com.sunvote.basebridge.IPadSystem; + +import java.util.List; + +public class HuaWeiSDK { + + private Activity activity; + private IPadSystem iPadSystem; + + private ServiceConnection serviceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + iPadSystem = IPadSystem.Stub.asInterface(service); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + iPadSystem = null; + } + }; + + private HuaWeiSDK(Activity activity) { + this.activity = activity; + } + + private static HuaWeiSDK instance = null ; + + public static HuaWeiSDK getInstance(Activity activity){ + if(instance == null){ + synchronized(HuaWeiSDK.class){ + if(instance == null){ + instance = new HuaWeiSDK(activity); + } + } + } + instance.activity = activity; + return instance; + } + + /** + * 必须在同一个activity里面开启和关闭,如果在一个里面没有关闭,而在另外一个开启,会报错。 + * 建议:在activity onCreate 里面调用open,在ondestroy 里面调用close + * 调用功能前 必须先open,不调用了 需要close + */ + public void open() { + bindService(); + } + + /** + * 必须在同一个activity里面开启和关闭,如果在一个里面没有关闭,而在另外一个开启,会报错。 + * 建议:在activity onCreate 里面调用open,在ondestroy 里面调用close + * 调用功能前 必须先open,不调用了 需要close + */ + public void close(){ + activity.unbindService(serviceConnection); + } + + private void bindService() { + Intent intent = new Intent(); + intent.setPackage("com.sunvote.basebridge"); + intent.setAction("com.sunvote.basebridge.service.PadSystemService"); + Intent tintent = getExplicitIntent(activity, intent); + if(tintent != null){ + activity.bindService(getExplicitIntent(activity, intent), serviceConnection, Context.BIND_AUTO_CREATE); + } + } + + public Intent getExplicitIntent(Context context, Intent implicitIntent) { + PackageManager pm = context.getPackageManager(); + List resolveInfos = pm.queryIntentServices(implicitIntent, 0); + if (resolveInfos == null || resolveInfos.size() != 1) { + return null; + } + Intent explicitIntent = null; + ResolveInfo info = resolveInfos.get(0); + String packageName = info.serviceInfo.packageName; + String className = info.serviceInfo.name; + ComponentName component = new ComponentName(packageName, className); + explicitIntent = new Intent(implicitIntent); + explicitIntent.setComponent(component); + return explicitIntent; + } + + /** + * 控制系统关机 + */ + public boolean powerOffXPad() { + if (iPadSystem != null) { + try { + return iPadSystem.powerOffXPad(); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统重启 + * + * @return true 成功 + * false 失败 + */ + public boolean rebootXPad() { + if (iPadSystem != null) { + try { + return iPadSystem.rebootXPad(); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统禁/启用通知栏 + * + * @return true 成功 + * false 失败 + */ + public boolean setNavgation(boolean visible) { + if (iPadSystem != null) { + try { + return iPadSystem.setNavgation(visible); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 是否激活 + * + * @return true 成功 + * false 失败 + */ + public boolean isActiveMe() { + if (iPadSystem != null) { + try { + return iPadSystem.isActiveMe(); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + + public boolean setStatusBarExpandPanelDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setStatusBarExpandPanelDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + public boolean setNavigationBarDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setNavigationBarDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统禁/启用Home键 + * + * @return true 成功 + * false 失败 + */ + public boolean setHomeButtonDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setHomeButtonDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统禁/启用BACK键 + * + * @return true 成功 + * false 失败 + */ + public boolean setBackButtonDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setBackButtonDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统禁/启用power off键 + * + * @return true 成功 + * false 失败 + */ + public boolean setPowerDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setPowerDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 控制系统禁/启用最近使用栏 + * + * @return true 成功 + * false 失败 + */ + public boolean setTaskButtonDisabled(boolean disable) { + if (iPadSystem != null) { + try { + return iPadSystem.setTaskButtonDisabled(disable); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + public boolean installPackage(String packagePath) { + if (iPadSystem != null) { + try { + return iPadSystem.installPackage(packagePath); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + public boolean uninstallPackage(String packageName, boolean keepData) { + if (iPadSystem != null) { + try { + return iPadSystem.uninstallPackage(packageName, keepData); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + public boolean clearPackageData(String packageName) { + if (iPadSystem != null) { + try { + return iPadSystem.clearPackageData(packageName); + } catch (RemoteException e) { + return false; + } + } + return false; + } + + /** + * 注册开机启动程序 + * packageName 启动名称 + * activi 是否激活 + * + * @return 0 表示应用成功 + * 1 下次生效 + * 2 表示已成功 + * -1 失败 + */ + public int registerBootStarted(String packageName, String activity, boolean activi) { + if (iPadSystem != null) { + try { + return iPadSystem.registerBootStarted(packageName, activity, activi); + } catch (RemoteException e) { + return -1; + } + } + return -1; + } + + /** + * 移除其他所有开机启动程序 + * + * @return 0 成功 + * <0 失败 + * >=0 成功 + */ + public int removeAllBootStarted() { + if (iPadSystem != null) { + try { + return iPadSystem.removeAllBootStarted(); + } catch (RemoteException e) { + return -1; + } + } + return -1; + } +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/AbsDownloadProcess.java b/C5/app/src/main/java/com/sunvote/xpadcomm/AbsDownloadProcess.java new file mode 100644 index 0000000..b0405bb --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/AbsDownloadProcess.java @@ -0,0 +1,114 @@ +package com.sunvote.xpadcomm; + +import java.io.File; +import java.io.IOException; + +/** + * Created by Elvis on 2018/3/20 11:18 + * Email:Eluis@psunsky.com + * 版权所有:长沙中天电子设计开发有限公司 + * Description: 人大通用版XPadAppRendaMac + */ +public abstract class AbsDownloadProcess { + + private static String foldPath = "/sdcard/Sunvote/download/"; + + protected static String fileName = "default.obj"; + + private long length ; + private long curComplete = 0 ; + + private static File file ; + + public File getFile() { + if(file == null){ + curComplete = 0 ; + File folder = new File(foldPath); + if(!folder.exists()){ + folder.mkdirs(); + } + if(fileName == null || "".equals(fileName.trim())){ + fileName = "default.obj" ; + } + file = new File(foldPath , fileName); + file.deleteOnExit(); + if(!file.exists()){ + try { + file.createNewFile(); + } catch (IOException e) { + onDownloadError(e); + } + } + } + return file; + } + + protected long getLength() { + return length; + } + + public String getFoldPath() { + return foldPath; + } + + protected void setLength(long length) { + this.length = length; + curComplete = 0 ; + } + + public void setFileName(String fileName) { + if(!(fileName == null || "".equals(fileName.trim()))) { + this.fileName = fileName; + file = null; + } + } + + protected String getFileName() { + return fileName; + } + + public void setFoldPath(String foldPath) { + this.foldPath = foldPath; + } + + protected void onStartDownload(){ + onStartDownload(getFile(),getLength()); + } + + public abstract void onStartDownload(File file,long length); + + protected void onDownloadAddProcess(int curPack) { + curComplete += curPack; + double result = 0; + if(curComplete <= length){ + result = (double)curComplete / length ; + }else{ + result = 1; + } + + try{ + onDownloadProcess(result); + }catch (Exception ex){ + ex.printStackTrace(); + } + try{ + int ri = (int)(result * 100); + onDownloadProcess(ri + "%"); + }catch (Exception ex){ + ex.printStackTrace(); + } + } + + public abstract void onDownloadProcess(double process); + + public abstract void onDownloadProcess(String process); + + protected void onStopDownload(){ + onStopDownload(getFile()); + } + + public abstract void onStopDownload(File file); + + public abstract void onDownloadError(Exception e); + +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/IUploadListener.java b/C5/app/src/main/java/com/sunvote/xpadcomm/IUploadListener.java new file mode 100644 index 0000000..842de7b --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/IUploadListener.java @@ -0,0 +1,18 @@ +package com.sunvote.xpadcomm; + +/** + * Created by Elvis on 2018/3/22 13:43 + * Email:Eluis@psunsky.com + * 版权所有:长沙中天电子设计开发有限公司 + * Description: 人大通用版XPadAppRendaMac + */ +public interface IUploadListener { + + public void onUploadStart(); + + public void onUploadProcess(double process); + + public void onUploadStop(); + + public void onFail(); +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileDownloadModule.java b/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileDownloadModule.java new file mode 100644 index 0000000..cf4a75b --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileDownloadModule.java @@ -0,0 +1,120 @@ +package com.sunvote.xpadcomm; + +import android.os.Handler; +import android.os.Looper; + +import com.sunvote.util.LogUtil; + +import java.io.File; + +/** + * Created by Elvis on 2018/3/20 11:16 + * Email:Eluis@psunsky.com + * 版权所有:长沙中天电子设计开发有限公司 + * Description: 人大通用版XPadAppRendaMac + */ +public class RFFileDownloadModule { + + private RFFileDownloadModule(){ + handler = new Handler(Looper.getMainLooper()); + } + private Handler handler ; + private long overtime = 15 * 1000 ; + private static RFFileDownloadModule instance = new RFFileDownloadModule(); + + public static RFFileDownloadModule getInstance() { + return instance; + } + + private AbsDownloadProcess downloadProcess; + private AbsDownloadProcess tdownloadProcess = new AbsDownloadProcess() { + + private boolean start = false; + private double process = 0 ; + private Runnable runnable = new Runnable() { + @Override + public void run() { + onDownloadError(new Exception("overtime")); + } + }; + + @Override + public void onStartDownload(File file, long length) { + start = true; + process = 0; + LogUtil.i("onStartDownload", file.getName() + "," + length); + if(downloadProcess != null){ + downloadProcess.onStartDownload(file,length); + } + handler.removeCallbacks(runnable); + handler.postDelayed(runnable,overtime); + } + + @Override + public void onDownloadProcess(double process) { + this.process = process; + LogUtil.i("onDownloadProcess", "process," + process); + if(downloadProcess != null && start){ + downloadProcess.onDownloadProcess(process); + } + handler.removeCallbacks(runnable); + handler.postDelayed(runnable,overtime); + } + + @Override + public void onDownloadProcess(String process) { + LogUtil.i("onDownloadProcess", "process," + process); + if(downloadProcess != null && start){ + downloadProcess.onDownloadProcess(process); + } + handler.removeCallbacks(runnable); + handler.postDelayed(runnable,overtime); + } + + @Override + public void onStopDownload(File file) { + LogUtil.i("onStopDownload", "process," + file.getName()); + if(downloadProcess != null && start){ + if(process >= 1.0){ + downloadProcess.onStopDownload(file); + }else{ + downloadProcess.onDownloadError(new Exception("file download error")); + } + } + start = false; + handler.removeCallbacks(runnable); + file.deleteOnExit(); + } + + @Override + public void onDownloadError(Exception e) { + LogUtil.i("onStopDownload", "error", e); + if(downloadProcess != null && start){ + downloadProcess.onDownloadError(e); + } + start = false; + handler.removeCallbacks(runnable); + } + }; + + public void setOvertime(long overtime) { + if(overtime > 0){ + this.overtime = overtime; + } + } + + public synchronized void registerDownloadProcess(AbsDownloadProcess downloadProcess){ + this.downloadProcess = downloadProcess ; + } + + public synchronized void unRegisterDownloadProcess(AbsDownloadProcess downloadProcess){ + this.downloadProcess = null; + } + + protected synchronized AbsDownloadProcess getDownloadProcess() { + + return tdownloadProcess; + } + + +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileUploadModule.java b/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileUploadModule.java new file mode 100644 index 0000000..f114b05 --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/RFFileUploadModule.java @@ -0,0 +1,362 @@ +package com.sunvote.xpadcomm; + +import android.os.Handler; +import android.os.HandlerThread; + +import com.sunvote.util.LogUtil; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; + +/** + * Created by Elvis on 2018/3/21 16:13 + * Email:Eluis@psunsky.com + * 版权所有:长沙中天电子设计开发有限公司 + * Description: 文件上传模块 + */ +public class RFFileUploadModule { + + public static final byte PACKTYPE = 5 ; + public static final int SLEEP_TIME = 25 ; + public static byte index = 0 ; + private RFFileUploadModule(){ + handlerThread = new HandlerThread(RFFileUploadModule.class.getSimpleName()); + handlerThread.start(); + handler = new Handler(handlerThread.getLooper()); + } + + private static RFFileUploadModule instance ; + + public static RFFileUploadModule getInstance() { + if(instance == null){ + synchronized (RFFileUploadModule.class){ + if(instance == null){ + instance = new RFFileUploadModule(); + } + } + } + return instance; + } + + private IUploadListener uploadListener = new IUploadListener() { + @Override + public void onUploadStart() { + System.out.println("onUploadStart"); + } + + @Override + public void onUploadProcess(double process) { + System.out.println("onUploadProcess:" + process); + } + + @Override + public void onUploadStop() { + System.out.println("onUploadStop"); + } + + @Override + public void onFail() { + System.out.println("onFail"); + } + }; + + + private String filename; + private byte[] datas = new byte[1024]; + private int length = 1024; + private HandlerThread handlerThread ; + private Handler handler ; + private byte[] keyid = new byte[2]; + private Runnable task; + private int packTotal ; + private boolean isStop = false ; + + /** + * 文件名不能超过16个字符(中文不能超过8个),超过16个字符将会出现截断。 + * 文件长度不能超过65535个字节 + * @param file 文件 + * @return 是否成功发起上传 + */ + public boolean uploadFile(File file){ + LogUtil.i("RFFileUploadModule","uploadFile" + file); + if(file != null){ + length = (int)file.length(); + filename = file.getName(); + datas = new byte[length+4]; + FileInputStream fis = null ; + try { + fis = new FileInputStream(file); + int start = 0 ; + // 把文件数据读入字节数组。 + while(start < length){ + int ret = fis.read(datas,start,length-start); + if(ret < 0){ + break; + } + start += ret ; + } + datas[length] = 0x13 ; + datas[length + 1] = 0x0 ; + datas[length + 2] = 0x10 ; + datas[length + 3] = 0x0 ; + + if(start >= length){ + task = new A0(filename,length); + handler.removeCallbacks(task); + handler.post(task); +// packetConfirmation((byte)0); + return true; + } + + } catch (Exception e) { + e.printStackTrace(); + }finally { + if(fis != null){ + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + fis = null; + } + } + } + return false; + } + + public void setKeyid(byte[] keyid) { + setKeyid(keyid,0); + } + public void setKeyid(byte[] keyid,int start) { + this.keyid[0] = keyid[start]; + this.keyid[1] = keyid[start+1]; + } + + public void onUploadFile(byte data, byte[] keyid, byte packid, byte packH, byte[] packLs) { + if (data == 1) { + setKeyid(keyid); + packetConfirmation(packid); + } + if (data == 2) { + uploadData(packid, packH, packLs); + } + if (data == 3) { + packetReceptionConfirmed(packid, packH); + } + } + + public void uploadData(byte packid, byte packH, byte[] packLs){ + System.out.println("uploadData"); + handler.removeCallbacks(task); + if(task instanceof A2){ + ((A2)task).setStop(true); + } + task = new A2(keyid,packid,packH,datas,packLs); + handler.post(task); + if(uploadListener != null){ + double process = 0 ; + if(packTotal > 0){ + int count = 0 ; + int sen = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0XFF); + for(int i = 0 ; i < 16 ; i++){ + if((sen & (1 << i)) == 0){ + count ++ ; + } + } + int been = packH * 16 + count ; + if(been > packTotal){ + been = packTotal ; + } + process = (double)(been) / packTotal ; + } + uploadListener.onUploadProcess(process); + } + } + + public void packetConfirmation(byte packid){ + System.out.println("packetConfirmation"); + handler.removeCallbacks(task); + byte[] names = null; + if(filename != null){ + try { + names = filename.getBytes("GB2312"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + task = new A1(keyid,(byte)((length + 4 ) / 65535), (byte)(((length + 4) % 65535) / 256),(byte)((length + 4) % 256),names); + handler.post(task); + } + + public void packetReceptionConfirmed(byte packid,byte packH){ + System.out.println("packetReceptionConfirmed"); + handler.removeCallbacks(task); + task = new A3(keyid,packid,packH); + handler.post(task); + } + + public boolean uploadFile(byte[] datas){ + System.out.println("uploadFile" + datas); + if(datas != null){ + length = datas.length ; + filename = null ; + this.datas = new byte[length + 4]; + System.arraycopy(datas,0,this.datas,0,length); + datas[length] = 0x13 ; + datas[length + 1] = 0x0 ; + datas[length + 2] = 0x10 ; + datas[length + 3] = 0x0 ; + task = new A0(filename,length); + handler.removeCallbacks(task); + handler.post(task); +// packetConfirmation((byte)0); + return true; + } + return false; + } + + + public void setUploadListener(IUploadListener uploadListener) { + this.uploadListener = uploadListener; + } + + class A0 implements Runnable{ + private int length ; + private String filename; + private int times ; + public A0(String filename,int length){ + this.length = length ; + this.filename = filename; + packTotal = length / 16 + 1; + times = 0 ; + index++; + } + + @Override + public void run() { + LogUtil.i("RFFileUploadModule","A0 run"); + XPadApi.getInstance().applyFileUpload(this.length,this.filename,PACKTYPE,index); + times ++ ; + if(task != null && times < 5){ + handler.removeCallbacks(task); + handler.postDelayed(task,5000); + } + } + } + + class A1 implements Runnable{ + + private byte[] keyid; + private byte packid ; + private byte packH ; + private byte packL ; + private byte[] names ; + private int times ; + + public A1(byte[] keyid, byte packid,byte packH,byte packL,byte[] names) { + LogUtil.i("RFFileUploadModule","A1"); + this.keyid = keyid; + this.packid = packid; + this.packH = packH ; + this.packL = packL ; + this.names = names ; + times = 0 ; + } + + @Override + public void run() { + LogUtil.i("RFFileUploadModule","A1 run"); + XPadApi.getInstance().packetConfirmation(this.keyid,this.packid,this.packH,this.packL,this.names,PACKTYPE); + times ++ ; + if(task != null && times < 5){ + handler.removeCallbacks(task); + handler.postDelayed(task,5000); + } + if(uploadListener != null){ + uploadListener.onUploadStart(); + isStop = false; + } + } + } + + class A2 implements Runnable{ + private byte[] keyid; + private byte packid; + private byte packH; + private byte[] datas ; + private byte[] packLs; + private int times ; + private boolean stop = false; + + public void setStop(boolean stop) { + this.stop = stop; + } + + public A2(byte[] keyid, byte packid, byte packH, byte[] datas, byte[] packLs) { + LogUtil.i("RFFileUploadModule","A2"); + this.keyid = keyid; + this.packid = packid; + this.packH = packH; + this.datas = datas; + this.packLs = packLs; + times = 0 ; + } + + @Override + public void run() { + LogUtil.i("RFFileUploadModule","A2 run"); + int packLsi = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0xFF); + int offset = 0 ; + int length = 16; + System.out.println("packLsi:" + packLsi); + for(byte packL = 0 ;packL < 16 && !stop ;packL ++) { + if((packLsi & (1 << packL)) != 0){ + offset = ((packid * 65535) + (packH) * 256 + 16 * (packL)) & 0xFFFF; + XPadApi.getInstance().uploadFileData(this.keyid, this.packid, this.packH, (byte)(packL ), this.datas, offset, length,PACKTYPE); + // need sleep ???? + try{ + Thread.sleep(SLEEP_TIME); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + +// datas = "123".getBytes(); +// XPadApi.getInstance().uploadFileData(this.keyid, this.packid, this.packH, (byte)0, this.datas, offset, length); + + times ++ ; + if(task != null && times < 5){ + handler.removeCallbacks(task); + handler.postDelayed(task,5000); + } + } + } + + class A3 implements Runnable{ + private byte[] keyid; + private byte packid ; + private byte packH; + private int times ; + + public A3(byte[] keyid, byte packid, byte packH) { + LogUtil.i("RFFileUploadModule","A3"); + this.keyid = keyid; + this.packid = packid; + this.packH = packH; + times = 0 ; + } + + @Override + public void run() { + LogUtil.i("RFFileUploadModule","A3 run"); + XPadApi.getInstance().packetReceptionConfirmed(this.keyid,this.packid,this.packH,PACKTYPE); + if(uploadListener != null && !isStop){ + isStop = true; + uploadListener.onUploadStop(); + } + } + } +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/RFMessageUploadModule.java b/C5/app/src/main/java/com/sunvote/xpadcomm/RFMessageUploadModule.java new file mode 100644 index 0000000..265305a --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/RFMessageUploadModule.java @@ -0,0 +1,303 @@ +package com.sunvote.xpadcomm; + +import android.os.Handler; +import android.os.HandlerThread; + +import com.sunvote.util.LogUtil; + +import java.io.UnsupportedEncodingException; + +/** + * Created by Elvis on 2018/3/27 9:48 + * Email:Eluis@psunsky.com + * 版权所有:长沙中天电子设计开发有限公司 + * Description: 人大通用版 + * 短消息上传模块 + */ +public class RFMessageUploadModule { + + public static final byte PACKTYPE = 3 ; + private static RFMessageUploadModule instance ; + + private IUploadListener uploadListener ; + + private String filename; + private byte[] datas = "test message".getBytes(); + private int length = 1024; + private HandlerThread handlerThread ; + private Handler handler ; + private byte[] keyid; + private Runnable task; + private int packTotal ; + private boolean stop = false; + + private RFMessageUploadModule(){ + handlerThread = new HandlerThread(RFMessageUploadModule.class.getSimpleName()); + handlerThread.start(); + handler = new Handler(handlerThread.getLooper()); + } + + public static RFMessageUploadModule getInstance() { + if(instance == null){ + instance = new RFMessageUploadModule(); + } + return instance; + } + + public void setMessageContent(byte[] messageContent) { + this.datas = messageContent; + uploadMsgData(datas); + removeTask(); + } + + public void setMessageContent(String message) { + try { + this.datas = message.getBytes("GB2312"); + uploadMsgData(datas); + removeTask(); + handler.removeCallbacks(failCall); + handler.postDelayed(failCall,10000); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private boolean uploadMsgData(byte[] ds){ + System.out.println("uploadMsgData" + ds); + if(ds != null){ + length = ds.length ; + filename = null ; + this.datas = new byte[length ]; + System.arraycopy(ds,0,this.datas,0,length); +// this.datas[length] = 0x13 ; +// this.datas[length + 1] = 0x0 ; +// this.datas[length + 2] = 0x10 ; +// this.datas[length + 3] = 0x0 ; + task = new A0(filename,length); + handler.removeCallbacks(task); + handler.post(task); + return true; + } + return false; + } + + + public void setKeyid(byte[] keyid) { + this.keyid = keyid; + } + + public void uploadData(byte packid, byte packH, byte[] packLs){ + System.out.println("uploadData"); + handler.removeCallbacks(task); + task = new A2(keyid,packid,packH,datas,packLs); + handler.post(task); + if(uploadListener != null){ + double process = 0 ; + if(packTotal > 0){ + int count = 0 ; + int sen = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0XFF); + for(int i = 0 ; i < 16 ; i++){ + if((sen & (1 << i)) != 0){ + count ++ ; + } + } + process = (double)(packH * 16 + count) / packTotal ; + } + uploadListener.onUploadProcess(process); + } + } + + public void packetConfirmation(byte packid){ + System.out.println("packetConfirmation"); + handler.removeCallbacks(task); + byte[] names = null; + if(filename != null){ + try { + names = filename.getBytes("GB2312"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + task = new A1(keyid,(byte)((length ) / 65535), (byte)(((length ) % 65535) / 256),(byte)(((length ) % 256 / 16 + (length % 16 == 0 ? 0 : 1))),names); + handler.post(task); + } + + public void packetReceptionConfirmed(byte packid,byte packH){ + System.out.println("packetReceptionConfirmed"); + handler.removeCallbacks(task); + task = new A3(keyid,packid,packH); + handler.post(task); + } + + public boolean uploadMessage(byte[] datas){ + System.out.println("uploadMsgData" + datas); + if(datas != null){ + length = datas.length ; + filename = null ; + this.datas = new byte[length ]; + System.arraycopy(datas,0,this.datas,0,length); +// datas[length] = 0x13 ; +// datas[length + 1] = 0x0 ; +// datas[length + 2] = 0x10 ; +// datas[length + 3] = 0x0 ; + task = new A0(filename,length); + handler.removeCallbacks(task); + handler.post(task); + return true; + } + return false; + } + + + public void setUploadListener(IUploadListener uploadListener) { + this.uploadListener = uploadListener; + } + + class A0 implements Runnable{ + private int length ; + private String filename; + private int times ; + public A0(String filename,int length){ + this.length = length ; + this.filename = filename; + packTotal = length / 16 + 1; + times = 0 ; + } + + @Override + public void run() { + XPadApi.getInstance().applyFileUpload(this.length,this.filename,PACKTYPE,RFFileUploadModule.index); + } + } + + class A1 implements Runnable{ + + private byte[] keyid; + private byte packid ; + private byte packH ; + private byte packL ; + private byte[] names ; + private int times ; + + public A1(byte[] keyid, byte packid,byte packH,byte packL,byte[] names) { + this.keyid = keyid; + this.packid = packid; + this.packH = packH ; + this.packL = packL ; + this.names = names ; + times = 0 ; + } + + @Override + public void run() { + XPadApi.getInstance().packetConfirmation(this.keyid,this.packid,this.packH,this.packL,this.names,PACKTYPE); + times ++ ; + if(task != null && times < 5){ + handler.postDelayed(task,1000); + } + if(uploadListener != null){ + uploadListener.onUploadStart(); + } + + handler.removeCallbacks(failCall); + handler.postDelayed(failCall,10000); + } + } + + class A2 implements Runnable{ + private byte[] keyid; + private byte packid; + private byte packH; + private byte[] datas ; + private byte[] packLs; + private int times ; + + public A2(byte[] keyid, byte packid, byte packH, byte[] datas, byte[] packLs) { + this.keyid = keyid; + this.packid = packid; + this.packH = packH; + this.datas = datas; + this.packLs = packLs; + times = 0 ; + } + + @Override + public void run() { + + int packLsi = packLs[1] * 256 + packLs[0]; + int offset = 0 ; + int length = 16; + System.out.println("packLsi:" + packLsi); + for(byte packL = 0 ;packL < 16 ;packL ++) { + if((packLsi & (1 << packL)) != 0){ + offset = ((packid * 65535) + (packH) * 256 + 16 * (packL)) & 0xFFFF; + XPadApi.getInstance().uploadFileData(this.keyid, this.packid, this.packH, (byte)(packL), this.datas, offset, length,PACKTYPE); + try{ + Thread.sleep(50); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + times ++ ; + if(task != null && times < 5){ + handler.postDelayed(task,1000); + } + handler.removeCallbacks(failCall); + handler.postDelayed(failCall,10000); + } + } + + class A3 implements Runnable{ + private byte[] keyid; + private byte packid ; + private byte packH; + + public A3(byte[] keyid, byte packid, byte packH) { + this.keyid = keyid; + this.packid = packid; + this.packH = packH; + } + + @Override + public void run() { + XPadApi.getInstance().packetReceptionConfirmed(this.keyid,this.packid,this.packH,PACKTYPE); + if(uploadListener != null){ + uploadListener.onUploadStop(); + } + handler.removeCallbacks(failCall); + } + } + + public void onUploadMessage(byte data, byte[] keyid, byte packid, byte packH, byte[] packLs) { + LogUtil.i("RFMessageUploadModule","onUploadMessage:" + data); + if (data == 1) { + setKeyid(keyid); + packetConfirmation(packid); + } + if (data == 2) { + uploadData(packid, packH, packLs); + } + if (data == 3) { + packetReceptionConfirmed(packid, packH); + } + } + + private void removeTask(){ + handler.postDelayed(new Runnable() { + @Override + public void run() { + handler.removeCallbacks(task); + } + },5000); + } + + private Runnable failCall = new Runnable() { + @Override + public void run() { + if(uploadListener != null){ + uploadListener.onFail(); + } + } + }; +} diff --git a/C5/app/src/main/java/com/sunvote/xpadcomm/usb/UsbTransferManager.java b/C5/app/src/main/java/com/sunvote/xpadcomm/usb/UsbTransferManager.java new file mode 100644 index 0000000..a5e51c8 --- /dev/null +++ b/C5/app/src/main/java/com/sunvote/xpadcomm/usb/UsbTransferManager.java @@ -0,0 +1,452 @@ +package com.sunvote.xpadcomm.usb; + +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.hardware.usb.UsbDevice; +import android.hardware.usb.UsbDeviceConnection; +import android.hardware.usb.UsbEndpoint; +import android.hardware.usb.UsbInterface; +import android.hardware.usb.UsbManager; +import android.os.Handler; +import android.os.HandlerThread; + +import com.sunvote.util.LogUtil; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/*** + * @Auther Elvis + */ +public class UsbTransferManager { + + public interface OnUsbConnectListener{ + boolean onConnect(boolean isConnected); + } + + public static final String TAG = UsbTransferManager.class.getSimpleName(); + private static UsbTransferManager instance = null ; + private HandlerThread workThread = new HandlerThread("usb workThread"); + private Handler workHandler = null; + private boolean stop = false; + private OnUsbConnectListener onUsbConnectListener; + + public void setOnUsbConnectListener(OnUsbConnectListener onUsbConnectListener) { + this.onUsbConnectListener = onUsbConnectListener; + } + + private UsbTransferManager(){ + workThread.start(); + workHandler = new Handler(workThread.getLooper()); + } + + public static UsbTransferManager getInstance(){ + if(instance == null){ + synchronized(UsbTransferManager.class){ + if(instance == null){ + instance = new UsbTransferManager(); + } + } + } + return instance; + } + + public void startWork(){ + stop = false; + workHandler.post(usbConnectInit); + } + + public void stopWork(){ + mUsbDevice = null; + mUsbConnection = null; + epIn = null; + epOut = null; + workHandler.removeCallbacks(usbConnectInit); + workHandler.removeCallbacks(usbConnect); + workHandler.removeCallbacks(usbConnectionReceiverTask); + stop = true; + } + + private UsbOutputStream outputStream = new UsbOutputStream(); + private UsbInputStream inputStream = new UsbInputStream(); + + public UsbInputStream getInputStream() { + return inputStream; + } + + public UsbOutputStream getOutputStream() { + return outputStream; + } + + private long lastOpenTime; + private class UsbPermissionReceiver extends BroadcastReceiver { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (ACTION_USB_PERMISSION.equals(action)) { + synchronized (this) { + UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); + if (device.getDeviceName().equals(mUsbDevice.getDeviceName())) { + if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { + // 授权成功,在这里进行打开设备操作 + if (System.currentTimeMillis() - lastOpenTime > 1000) { + lastOpenTime = System.currentTimeMillis(); + workHandler.removeCallbacks(usbConnectInit); + workHandler.removeCallbacks(usbConnect); + if(!stop){ + workHandler.postDelayed(usbConnect,0); + } + } + }else{ + if(!stop){ + workHandler.postDelayed(usbConnectInit,20000); + } + } + } + } + } + } + } + + private Runnable usbConnectionReceiverTask = new Runnable() { + @Override + public void run() { + if (usbManager != null) { + HashMap map = usbManager.getDeviceList(); + boolean find = false; + for (UsbDevice device : map.values()) { + LogUtil.d(TAG, "找到基站: Vid:" + device.getVendorId() + " Pid:" + device.getProductId()); + if (device.getVendorId() == VendorID && device.getProductId() == ProductID + || device.getVendorId() == VendorID_2 && device.getProductId() == ProductID_2 + || device.getVendorId() == VendorID_3 && device.getProductId() == ProductID_3) { + find = true; + workHandler.postDelayed(usbConnectionReceiverTask, 1000); + break; + } + } + if (!find) { + stopWork(); + startWork(); + } + } + } + }; + + private Runnable usbConnectInit = new Runnable() { + @Override + public void run() { + LogUtil.i(TAG, "发起USB初始化!"); + boolean find = false; + workHandler.removeCallbacks(usbConnectionReceiverTask); + if(usbManager != null) { + HashMap map = usbManager.getDeviceList(); + for (UsbDevice device : map.values()) { + LogUtil.d(TAG, "找到基站: Vid:" + device.getVendorId() + " Pid:" + device.getProductId()); + if (device.getVendorId() == VendorID && device.getProductId() == ProductID + || device.getVendorId() == VendorID_2 && device.getProductId() == ProductID_2 + || device.getVendorId() == VendorID_3 && device.getProductId() == ProductID_3) { + mUsbDevice = device; + find = true; + if (!usbManager.hasPermission(device)) { + if (usbPermissionReceiver == null) { + usbPermissionReceiver = new UsbPermissionReceiver(); + } + // 申请权限 + Intent intent = new Intent(ACTION_USB_PERMISSION); + PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); + IntentFilter permissionFilter = new IntentFilter(ACTION_USB_PERMISSION); + mContext.registerReceiver(usbPermissionReceiver, permissionFilter); + usbManager.requestPermission(device, mPermissionIntent); + if(!stop){ + workHandler.postDelayed(usbConnectInit,20 * 1000); + } + } else { + if(!stop){ + workHandler.postDelayed(usbConnect,10); + } + } + } + } + + } + if(!find){ + workHandler.removeCallbacks(usbConnectInit); + if(!stop){ + workHandler.postDelayed(usbConnectInit,2000); + } + } + } + }; + + + private Runnable usbConnect = new Runnable() { + @Override + public void run() { + LogUtil.i(TAG, "发起USB键盘连接!"); + if(openUsbDevice()){ + if(onUsbConnectListener != null){ + onUsbConnectListener.onConnect(true); + } + workHandler.postDelayed(usbConnectionReceiverTask,2000); + }; + } + }; + + private Runnable readData = new Runnable() { + @Override + public void run() { + byte[] datas = receiveUsbRequestData(); + LogUtil.i(TAG, "RECEIVEA DATA:", datas); + if(datas != null) { + int length = datas.length; + try { + try { + lock.lock(); + if (linkedList.size() < MAX_CACHE_SIZE) { + for (int i = length - 1; i >= 0; i--) { + linkedList.push(datas[i]); + } + } + } finally { + empty.signal(); + lock.unlock(); + } + } catch (Exception e) { + LogUtil.e(TAG, "UDP receiver message", e); + close = true; + } + if(!stop){ + workHandler.post(readData); + } + }else{ + stopWork(); + startWork(); + } + + } + }; + + /** + * 打开连接 + * + * @paramdevice + */ + private boolean openUsbDevice() { + + if (mUsbDevice == null) + return false; + + if(mUsbDevice.getInterfaceCount() == 0){ + return false; + } + mUsbInterface = mUsbDevice.getInterface(0); + setEndpoint(mUsbInterface); + mUsbConnection = usbManager.openDevice(mUsbDevice); + LogUtil.i(TAG,"打开USB连接"); + if (mUsbConnection != null) { + return mUsbConnection.claimInterface(mUsbInterface, true); + } + return false; + } + + private int sendDataBulkTransfer(byte[] buffer) { + final int length = buffer.length; + int ref = -100; + if (epOut != null && mUsbConnection != null) { + ref = mUsbConnection.bulkTransfer(epOut, buffer, length, 100); + mUsbConnection.claimInterface(mUsbInterface, true); + LogUtil.d(TAG, "发送数据成功有:" + ref); + if(ref <0 ){ + if(onUsbConnectListener != null){ + onUsbConnectListener.onConnect(false); + } + workHandler.removeCallbacks(usbConnectionReceiverTask); + workHandler.post(usbConnectionReceiverTask); + } + }else{ + LogUtil.d(TAG, "未连接:" + ref); + } + return ref; + } + + public byte[] receiveUsbRequestData() { + if(epIn != null && mUsbConnection != null) { + byte[] bytes = new byte[epIn.getMaxPacketSize()]; + int ret = mUsbConnection.bulkTransfer(epIn, bytes, bytes.length, 100); + if (ret > 0) { + return bytes; + } + } + return null; + } + + /** + * UsbInterface 进行端点设置和通讯 + * + * @param intf + */ + private void setEndpoint(UsbInterface intf) { + if (intf == null) + return; + // 设置接收数据的端点 + if (intf.getEndpoint(0) != null) { + epIn = intf.getEndpoint(0); + } + // 当端点为2的时候 + if (intf.getEndpointCount() == 2) { + // 设置发送数据的断点 + if (intf.getEndpoint(1) != null) + epOut = intf.getEndpoint(1); + } + } + + public void setUsbManager(UsbManager usbManager) { + this.usbManager = usbManager; + } + + public void setContext(Context mContext) { + this.mContext = mContext; + } + + public class UsbOutputStream extends OutputStream{ + + @Override + public void write(int b) throws IOException { + sendDataBulkTransfer(new byte[]{(byte)b}); + } + + @Override + public void write(byte[] b) throws IOException { + sendDataBulkTransfer(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + byte[] temp = new byte[len]; + System.arraycopy(b, off, temp, 0, len); + sendDataBulkTransfer(temp); + } + } + + private LinkedList linkedList = new LinkedList(); + public long MAX_CACHE_SIZE = 4 * 1024; + private Lock lock = new ReentrantLock(); + private Condition empty = lock.newCondition(); + private boolean close = false; + public class UsbInputStream extends InputStream{ + @Override + public int read() throws IOException { + if (close) { + throw new IOException("the stream has closed"); + } + + try { + lock.lock(); + while (linkedList.isEmpty()) { + try { + empty.await(); + } catch (InterruptedException e) { + LogUtil.e(TAG,e); + } + } + return linkedList.pop(); + } finally { + lock.unlock(); + } + } + + + public boolean isClose() { + return close; + } + + @Override + public void close() throws IOException { + close = true; + super.close(); + } + + @Override + public int read(byte[] buffer) throws IOException { + try { + lock.lock(); + if (buffer == null) { + throw new IOException("buffer is empty"); + } + if (close) { + throw new IOException("the stream has closed"); + } + + while (linkedList.isEmpty()) { + try { + empty.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + int index = 0; + while (index < buffer.length && !linkedList.isEmpty()) { + buffer[index++] = linkedList.pop(); + } + return index; + } finally { + lock.unlock(); + } + } + + + @Override + public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { + try { + lock.lock(); + if (buffer == null) { + throw new IOException("buffer is empty"); + } + if (close) { + throw new IOException("the stream has closed"); + } + + while (linkedList.isEmpty()) { + try { + empty.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + int index = 0; + while (index < byteCount && !linkedList.isEmpty()) { + index++; + buffer[byteOffset++] = linkedList.pop(); + } + return index; + } finally { + lock.unlock(); + } + } + } + + private UsbManager usbManager ; + private UsbDevice mUsbDevice; + private UsbDeviceConnection mUsbConnection; + private UsbInterface mUsbInterface; + private UsbEndpoint epOut, epIn; + private UsbPermissionReceiver usbPermissionReceiver; + private Context mContext ; + + private static final int VendorID = 0x03eb; + private static final int ProductID = 0x6201; + private static final int VendorID_2 = 0x0d8c; + private static final int ProductID_2 = 0xEA10; + private static final int VendorID_3 = 0x2F70; + private static final int ProductID_3 = 0xEA10; + private final String ACTION_USB_PERMISSION = "com.hhd.USB_PERMISSION"; + private boolean isUsbReceiver = false; +} diff --git a/C5/app/src/main/res/drawable-xhdpi/signal_1.png b/C5/app/src/main/res/drawable-xhdpi/signal_1.png new file mode 100644 index 0000000..ad0b5a5 Binary files /dev/null and b/C5/app/src/main/res/drawable-xhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/drawable-xhdpi/signal_2.png b/C5/app/src/main/res/drawable-xhdpi/signal_2.png new file mode 100644 index 0000000..bbc7475 Binary files /dev/null and b/C5/app/src/main/res/drawable-xhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/drawable-xhdpi/signal_3.png b/C5/app/src/main/res/drawable-xhdpi/signal_3.png new file mode 100644 index 0000000..c5b4cf6 Binary files /dev/null and b/C5/app/src/main/res/drawable-xhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/drawable-xhdpi/signal_4.png b/C5/app/src/main/res/drawable-xhdpi/signal_4.png new file mode 100644 index 0000000..9312ac2 Binary files /dev/null and b/C5/app/src/main/res/drawable-xhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/drawable-xhdpi/signal_5.png b/C5/app/src/main/res/drawable-xhdpi/signal_5.png new file mode 100644 index 0000000..52f1533 Binary files /dev/null and b/C5/app/src/main/res/drawable-xhdpi/signal_5.png differ diff --git a/C5/app/src/main/res/drawable-xxhdpi/signal_1.png b/C5/app/src/main/res/drawable-xxhdpi/signal_1.png new file mode 100644 index 0000000..e8e27e7 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/drawable-xxhdpi/signal_2.png b/C5/app/src/main/res/drawable-xxhdpi/signal_2.png new file mode 100644 index 0000000..d0ab53b Binary files /dev/null and b/C5/app/src/main/res/drawable-xxhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/drawable-xxhdpi/signal_3.png b/C5/app/src/main/res/drawable-xxhdpi/signal_3.png new file mode 100644 index 0000000..2648917 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/drawable-xxhdpi/signal_4.png b/C5/app/src/main/res/drawable-xxhdpi/signal_4.png new file mode 100644 index 0000000..b9d0904 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/drawable-xxhdpi/signal_5.png b/C5/app/src/main/res/drawable-xxhdpi/signal_5.png new file mode 100644 index 0000000..a330716 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxhdpi/signal_5.png differ diff --git a/C5/app/src/main/res/drawable-xxxhdpi/signal_1.png b/C5/app/src/main/res/drawable-xxxhdpi/signal_1.png new file mode 100644 index 0000000..33ab236 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxxhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/drawable-xxxhdpi/signal_2.png b/C5/app/src/main/res/drawable-xxxhdpi/signal_2.png new file mode 100644 index 0000000..2167bbc Binary files /dev/null and b/C5/app/src/main/res/drawable-xxxhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/drawable-xxxhdpi/signal_3.png b/C5/app/src/main/res/drawable-xxxhdpi/signal_3.png new file mode 100644 index 0000000..e88a7d6 Binary files /dev/null and b/C5/app/src/main/res/drawable-xxxhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/drawable-xxxhdpi/signal_4.png b/C5/app/src/main/res/drawable-xxxhdpi/signal_4.png new file mode 100644 index 0000000..7dfcfff Binary files /dev/null and b/C5/app/src/main/res/drawable-xxxhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/drawable-xxxhdpi/signal_5.png b/C5/app/src/main/res/drawable-xxxhdpi/signal_5.png new file mode 100644 index 0000000..4badc6b Binary files /dev/null and b/C5/app/src/main/res/drawable-xxxhdpi/signal_5.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal.png b/C5/app/src/main/res/mipmap-xhdpi/signal.png new file mode 100644 index 0000000..a42d913 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal_1.png b/C5/app/src/main/res/mipmap-xhdpi/signal_1.png new file mode 100644 index 0000000..ad0b5a5 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal_2.png b/C5/app/src/main/res/mipmap-xhdpi/signal_2.png new file mode 100644 index 0000000..bbc7475 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal_3.png b/C5/app/src/main/res/mipmap-xhdpi/signal_3.png new file mode 100644 index 0000000..c5b4cf6 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal_4.png b/C5/app/src/main/res/mipmap-xhdpi/signal_4.png new file mode 100644 index 0000000..9312ac2 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/mipmap-xhdpi/signal_5.png b/C5/app/src/main/res/mipmap-xhdpi/signal_5.png new file mode 100644 index 0000000..52f1533 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xhdpi/signal_5.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal.png b/C5/app/src/main/res/mipmap-xxhdpi/signal.png new file mode 100644 index 0000000..2e353b5 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal_1.png b/C5/app/src/main/res/mipmap-xxhdpi/signal_1.png new file mode 100644 index 0000000..e8e27e7 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal_2.png b/C5/app/src/main/res/mipmap-xxhdpi/signal_2.png new file mode 100644 index 0000000..d0ab53b Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal_3.png b/C5/app/src/main/res/mipmap-xxhdpi/signal_3.png new file mode 100644 index 0000000..2648917 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal_4.png b/C5/app/src/main/res/mipmap-xxhdpi/signal_4.png new file mode 100644 index 0000000..b9d0904 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/mipmap-xxhdpi/signal_5.png b/C5/app/src/main/res/mipmap-xxhdpi/signal_5.png new file mode 100644 index 0000000..a330716 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxhdpi/signal_5.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal.png new file mode 100644 index 0000000..643cef7 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal_1.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal_1.png new file mode 100644 index 0000000..33ab236 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal_1.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal_2.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal_2.png new file mode 100644 index 0000000..2167bbc Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal_2.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal_3.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal_3.png new file mode 100644 index 0000000..e88a7d6 Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal_3.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal_4.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal_4.png new file mode 100644 index 0000000..7dfcfff Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal_4.png differ diff --git a/C5/app/src/main/res/mipmap-xxxhdpi/signal_5.png b/C5/app/src/main/res/mipmap-xxxhdpi/signal_5.png new file mode 100644 index 0000000..4badc6b Binary files /dev/null and b/C5/app/src/main/res/mipmap-xxxhdpi/signal_5.png differ -- libgit2 0.21.4