From a1fca9a8332cc0747d2c489e359cf97b4cb3692a Mon Sep 17 00:00:00 2001 From: Gangphon Date: Tue, 13 Jan 2026 15:29:09 +0800 Subject: [PATCH] Lora --- XixunPlayer/app/build.gradle | 2 +- .../com/xixun/xixunplayer/MainActivity.java | 8 +- .../com/xixun/xixunplayer/MainService.java | 166 +++++++++++++----- .../main/java/com/xixun/xixunplayer/Util.java | 4 +- 4 files changed, 132 insertions(+), 48 deletions(-) diff --git a/XixunPlayer/app/build.gradle b/XixunPlayer/app/build.gradle index 5e457ce..ae57635 100644 --- a/XixunPlayer/app/build.gradle +++ b/XixunPlayer/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 21 targetSdk 34 versionCode 1 - versionName "2.2.18-Y" + versionName "2.2.18-Y-lora" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainActivity.java b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainActivity.java index 8e9ec9b..0ce4740 100644 --- a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainActivity.java +++ b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainActivity.java @@ -638,10 +638,12 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac } if(insView!=null || progView!=null) { state = 5; - Util.println(" Init Sync"); var ms = System.currentTimeMillis(); - if(demand==0 || progView==null) syncProg(ms, 0); - else { + if(demand==0 || progView==null) { + Util.println(" Init Sync"); + syncProg(ms, 0); + } else { + Util.println(" demand "+demand); avas.clear(); var page = progView.pages.get(demand-1); avas.add(page); diff --git a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainService.java b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainService.java index c19645a..3c94964 100644 --- a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainService.java +++ b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainService.java @@ -11,10 +11,15 @@ import net.lingala.zip4j.ZipFile; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import gnph.util.IOs; +import gnph.util.JSList; +import gnph.util.JSMap; public class MainService extends Service { @@ -50,55 +55,132 @@ public class MainService extends Service { Util.makeText(MainService.this, "MEDIA_MOUNTED path: "+path+"\nImporting 正在导入 ...").show(); new Thread(()->{ try { - var zip = new ZipFile(path+"/program.zip"); - if(zip.isEncrypted()) zip.setPassword(pass); - long size = 0; - ByteArrayOutputStream jsonOut = null; - var headers = zip.getFileHeaders(); - for(var header : headers) { - size += header.getUncompressedSize(); - if("program".equals(header.getFileName())) IOs.writeClose(jsonOut = new ByteArrayOutputStream(), zip.getInputStream(header)); - } - if(jsonOut==null) { - Util.println("No program File"); - if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "No program File").show()); - return; - } - if(size==0) { - Util.println("zip size is 0"); - if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "zip size is 0").show()); - return; - } - Util.deleteFiles(size, null); - for(var header : headers) if(! "program".equals(header.getFileName())) { - Util.println(" name: " + header.getFileName()); - var fOut = new FileOutputStream(Util.programDir + "/" + header.getFileName()); - IOs.writeCloseIn(fOut, zip.getInputStream(header)); - fOut.flush(); - fOut.getFD().sync(); - fOut.close(); - } - var json = jsonOut.toByteArray(); - Util.println("Import Succeed"); - if(acti!=null) acti.runOnUiThread(() -> { - Util.makeText(acti, "Import Succeed 导入成功").show(); - acti.initProg(json); - }); - else { + if(Util.custom == Util.Custom.LoRa) { + var id = Util.getCardId(); + var dir = new File(path+"/"+id); + if(! dir.isDirectory()) { + Util.println("MEDIA_MOUNTED can't find "+id); + if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "MEDIA_MOUNTED can't find "+id).show()); + return; + } + long size = 0; + var files = dir.listFiles(); + Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2.getName())); + for(var file : files) if(! file.getName().endsWith("json")) { + size += file.length(); + } + if(size==0) { + Util.println("files' size is 0"); + if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "files' size is 0").show()); + return; + } + var items = new JSList(); + var root = new JSMap( + "_type", "PlayXixunTask", + "Demand", 1, + "task", new JSMap( + "name", id, + "width", Util.screenWidth, + "height", Util.screenHeight, + "items", items + ) + ); + Util.deleteFiles(size, null); + for(var file : files) if(! file.getName().endsWith("json")) { + var name = file.getName(); + Util.println(" name: " + name); + var fOut = new FileOutputStream(Util.programDir + "/" + name); + IOs.writeCloseIn(fOut, new FileInputStream(file)); + fOut.flush(); + fOut.getFD().sync(); + fOut.close(); + items.add(new JSMap( + "_program", new JSMap( + "name", name, + "layers", new JSList<>(new JSMap( + "sources", new JSList<>(new JSMap( + "_type", "Video", + "id", name, + "md5", name, + "name", name, + "timeSpan", 43200, + "left", 0, + "top", 0, + "width", Util.screenWidth, + "height", Util.screenHeight, + "playTime", 0 + )) + )) + ) + )); + } var fOut = new FileOutputStream(Util.programDir + "/program"); - fOut.write(json); + root.write(fOut); var spaces = " ".getBytes(); for(int i=0;i<1000; i++) fOut.write(spaces); fOut.flush(); fOut.getFD().sync(); fOut.close(); - var inten = new Intent(MainService.this, MainActivity.class); - inten.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - startActivity(inten); + Util.println("Import Succeed"); + if(acti!=null) acti.runOnUiThread(() -> { + Util.makeText(acti, "Import Succeed 导入成功").show(); + acti.initProg(); + }); + } else { + var zip = new ZipFile(path + "/program.zip"); + if(zip.isEncrypted()) zip.setPassword(pass); + long size = 0; + ByteArrayOutputStream jsonOut = null; + var headers = zip.getFileHeaders(); + for(var header : headers) { + size += header.getUncompressedSize(); + if ("program".equals(header.getFileName())) + IOs.writeClose(jsonOut = new ByteArrayOutputStream(), zip.getInputStream(header)); + } + if(jsonOut == null) { + Util.println("No program File"); + if (acti != null) + acti.runOnUiThread(() -> Util.makeText(acti, "No program File").show()); + return; + } + if(size == 0) { + Util.println("zip size is 0"); + if (acti != null) + acti.runOnUiThread(() -> Util.makeText(acti, "zip size is 0").show()); + return; + } + Util.deleteFiles(size, null); + for(var header : headers) + if (!"program".equals(header.getFileName())) { + Util.println(" name: " + header.getFileName()); + var fOut = new FileOutputStream(Util.programDir + "/" + header.getFileName()); + IOs.writeCloseIn(fOut, zip.getInputStream(header)); + fOut.flush(); + fOut.getFD().sync(); + fOut.close(); + } + var json = jsonOut.toByteArray(); + Util.println("Import Succeed"); + if(acti != null) acti.runOnUiThread(() -> { + Util.makeText(acti, "Import Succeed 导入成功").show(); + acti.initProg(json); + }); + else { + var fOut = new FileOutputStream(Util.programDir + "/program"); + fOut.write(json); + var spaces = " ".getBytes(); + for (int i = 0; i < 1000; i++) fOut.write(spaces); + fOut.flush(); + fOut.getFD().sync(); + fOut.close(); + var inten = new Intent(MainService.this, MainActivity.class); + inten.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(inten); + } + var inten = new Intent("com.xixun.AccessibilityService"); + inten.putExtra("newProgram", "USB"); + sendBroadcast(inten); } - var inten = new Intent("com.xixun.AccessibilityService"); - inten.putExtra("newProgram", "USB"); - sendBroadcast(inten); } catch (Exception e) { Util.printStackTrace(e); if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, Util.toStr(e)).show()); diff --git a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/Util.java b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/Util.java index 7bd59f9..d43fb0c 100644 --- a/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/Util.java +++ b/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/Util.java @@ -35,8 +35,8 @@ import wseemann.media.FFmpegMediaMetadataRetriever; public class Util { - enum Custom{Normal, Yishi}; - public static final Custom custom = Custom.Normal; + enum Custom{Normal, Yishi, LoRa}; + public static final Custom custom = Custom.LoRa; public static JSMap cfg; public static SQLiteOpenHelper openHelper; public static String serverURL;