This commit is contained in:
Gangphon 2026-01-13 15:29:09 +08:00
parent 7af8c10ba5
commit a1fca9a833
4 changed files with 132 additions and 48 deletions

View File

@ -11,7 +11,7 @@ android {
minSdk 21 minSdk 21
targetSdk 34 targetSdk 34
versionCode 1 versionCode 1
versionName "2.2.18-Y" versionName "2.2.18-Y-lora"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
} }

View File

@ -638,10 +638,12 @@ public class MainActivity extends Activity implements Choreographer.FrameCallbac
} }
if(insView!=null || progView!=null) { if(insView!=null || progView!=null) {
state = 5; state = 5;
Util.println(" Init Sync");
var ms = System.currentTimeMillis(); var ms = System.currentTimeMillis();
if(demand==0 || progView==null) syncProg(ms, 0); if(demand==0 || progView==null) {
else { Util.println(" Init Sync");
syncProg(ms, 0);
} else {
Util.println(" demand "+demand);
avas.clear(); avas.clear();
var page = progView.pages.get(demand-1); var page = progView.pages.get(demand-1);
avas.add(page); avas.add(page);

View File

@ -11,10 +11,15 @@ import net.lingala.zip4j.ZipFile;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import gnph.util.IOs; import gnph.util.IOs;
import gnph.util.JSList;
import gnph.util.JSMap;
public class MainService extends Service { public class MainService extends Service {
@ -50,55 +55,132 @@ public class MainService extends Service {
Util.makeText(MainService.this, "MEDIA_MOUNTED path: "+path+"\nImporting 正在导入 ...").show(); Util.makeText(MainService.this, "MEDIA_MOUNTED path: "+path+"\nImporting 正在导入 ...").show();
new Thread(()->{ new Thread(()->{
try { try {
var zip = new ZipFile(path+"/program.zip"); if(Util.custom == Util.Custom.LoRa) {
if(zip.isEncrypted()) zip.setPassword(pass); var id = Util.getCardId();
long size = 0; var dir = new File(path+"/"+id);
ByteArrayOutputStream jsonOut = null; if(! dir.isDirectory()) {
var headers = zip.getFileHeaders(); Util.println("MEDIA_MOUNTED can't find "+id);
for(var header : headers) { if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "MEDIA_MOUNTED can't find "+id).show());
size += header.getUncompressedSize(); return;
if("program".equals(header.getFileName())) IOs.writeClose(jsonOut = new ByteArrayOutputStream(), zip.getInputStream(header)); }
} long size = 0;
if(jsonOut==null) { var files = dir.listFiles();
Util.println("No program File"); Arrays.sort(files, (f1, f2) -> f1.getName().compareTo(f2.getName()));
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "No program File").show()); for(var file : files) if(! file.getName().endsWith("json")) {
return; size += file.length();
} }
if(size==0) { if(size==0) {
Util.println("zip size is 0"); Util.println("files' size is 0");
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "zip size is 0").show()); if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, "files' size is 0").show());
return; return;
} }
Util.deleteFiles(size, null); var items = new JSList<JSMap>();
for(var header : headers) if(! "program".equals(header.getFileName())) { var root = new JSMap(
Util.println(" name: " + header.getFileName()); "_type", "PlayXixunTask",
var fOut = new FileOutputStream(Util.programDir + "/" + header.getFileName()); "Demand", 1,
IOs.writeCloseIn(fOut, zip.getInputStream(header)); "task", new JSMap(
fOut.flush(); "name", id,
fOut.getFD().sync(); "width", Util.screenWidth,
fOut.close(); "height", Util.screenHeight,
} "items", items
var json = jsonOut.toByteArray(); )
Util.println("Import Succeed"); );
if(acti!=null) acti.runOnUiThread(() -> { Util.deleteFiles(size, null);
Util.makeText(acti, "Import Succeed 导入成功").show(); for(var file : files) if(! file.getName().endsWith("json")) {
acti.initProg(json); var name = file.getName();
}); Util.println(" name: " + name);
else { 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"); var fOut = new FileOutputStream(Util.programDir + "/program");
fOut.write(json); root.write(fOut);
var spaces = " ".getBytes(); var spaces = " ".getBytes();
for(int i=0;i<1000; i++) fOut.write(spaces); for(int i=0;i<1000; i++) fOut.write(spaces);
fOut.flush(); fOut.flush();
fOut.getFD().sync(); fOut.getFD().sync();
fOut.close(); fOut.close();
var inten = new Intent(MainService.this, MainActivity.class); Util.println("Import Succeed");
inten.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if(acti!=null) acti.runOnUiThread(() -> {
startActivity(inten); 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) { } catch (Exception e) {
Util.printStackTrace(e); Util.printStackTrace(e);
if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, Util.toStr(e)).show()); if(acti!=null) acti.runOnUiThread(() -> Util.makeText(acti, Util.toStr(e)).show());

View File

@ -35,8 +35,8 @@ import wseemann.media.FFmpegMediaMetadataRetriever;
public class Util { public class Util {
enum Custom{Normal, Yishi}; enum Custom{Normal, Yishi, LoRa};
public static final Custom custom = Custom.Normal; public static final Custom custom = Custom.LoRa;
public static JSMap cfg; public static JSMap cfg;
public static SQLiteOpenHelper openHelper; public static SQLiteOpenHelper openHelper;
public static String serverURL; public static String serverURL;