Android/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/MainActivity.java

592 lines
25 KiB
Java
Raw Normal View History

2023-11-09 08:37:59 +08:00
package com.xixun.xixunplayer;
2024-01-24 20:17:59 +08:00
import android.annotation.SuppressLint;
2024-05-09 20:30:22 +08:00
import android.app.Activity;
2023-11-09 08:37:59 +08:00
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.IBinder;
2024-02-02 18:09:54 +08:00
import android.os.StrictMode;
2023-11-09 08:37:59 +08:00
import android.view.Choreographer;
2024-01-26 18:31:10 +08:00
import android.view.View;
2023-11-09 08:37:59 +08:00
2023-11-10 09:47:38 +08:00
import androidx.annotation.NonNull;
2023-11-09 08:37:59 +08:00
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.xixun.joey.aidlset.CardService;
2024-03-12 18:28:10 +08:00
import com.xixun.xy.conn.aidl.ConnService;
2023-11-09 08:37:59 +08:00
2024-01-24 20:17:59 +08:00
import net.lingala.zip4j.ZipFile;
2023-11-09 08:37:59 +08:00
import java.io.BufferedInputStream;
2024-01-26 21:35:38 +08:00
import java.io.ByteArrayOutputStream;
2023-11-09 08:37:59 +08:00
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.util.HashSet;
2024-01-26 21:35:38 +08:00
import gnph.util.Chsets;
2023-11-09 08:37:59 +08:00
import gnph.util.IOs;
import gnph.util.JSList;
import gnph.util.JSMap;
2024-05-09 20:30:22 +08:00
public class MainActivity extends Activity implements Choreographer.FrameCallback, Runnable {
2023-11-09 08:37:59 +08:00
public static MainActivity ins;
public Intent environIntent = new Intent();
2024-01-26 18:31:10 +08:00
HashSet<IntentReceiver> environs = new HashSet<>();
2023-11-09 08:37:59 +08:00
BackView backView;
2024-05-09 20:30:22 +08:00
Prog progView, insView;
2023-12-01 16:17:06 +08:00
long launchMilli = System.currentTimeMillis();
long syncMs;
2023-11-09 08:37:59 +08:00
int state;
@RequiresApi(api = Build.VERSION_CODES.R)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
2024-01-24 20:17:59 +08:00
var msg = "==== MainActivity onCreate ==== UI Thread: "+Thread.currentThread().getId();
Util.println(msg);
ins = this;
2023-11-10 21:45:00 +08:00
startService(new Intent(this, RestartService.class));
2024-02-02 18:09:54 +08:00
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
2023-11-09 08:37:59 +08:00
if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) init();
else {
2024-01-24 20:17:59 +08:00
Util.println("---- No permission, Try again ...");
2023-11-09 08:37:59 +08:00
ActivityCompat.requestPermissions(this, new String[]{
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
android.Manifest.permission.READ_EXTERNAL_STORAGE,
android.Manifest.permission.MANAGE_EXTERNAL_STORAGE,
android.Manifest.permission.RECEIVE_BOOT_COMPLETED,
android.Manifest.permission.INTERNET
}, 999);
}
}
2024-01-24 20:17:59 +08:00
2023-11-09 08:37:59 +08:00
@Override
2023-11-10 09:47:38 +08:00
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
2023-11-09 08:37:59 +08:00
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
2023-11-10 09:47:38 +08:00
if(requestCode==999 && grantResults.length > 0 && grantResults[0]==PackageManager.PERMISSION_GRANTED && backView==null) init();
2023-11-09 08:37:59 +08:00
}
2024-03-12 18:28:10 +08:00
ConnService connService;
2024-01-24 20:17:59 +08:00
@SuppressLint("UnspecifiedRegisterReceiverFlag")
2023-11-09 08:37:59 +08:00
public void init() {
2024-01-24 20:17:59 +08:00
var dir = Build.VERSION.SDK_INT < Build.VERSION_CODES.R ? Environment.getExternalStorageDirectory().getAbsolutePath() + "/XixunPlayer" : getExternalFilesDir(null).getAbsolutePath();
var msg = "---- dir "+dir;
Util.println(msg);
Util.programDir = dir + "/program";
Util.backImgFile = dir + "/background";
2023-11-09 08:37:59 +08:00
var program = new File(Util.programDir);
if(program.isFile()) program.delete();
2024-01-24 20:17:59 +08:00
msg = "---- mkdir: "+program.mkdirs();
Util.println(msg);
2023-11-09 08:37:59 +08:00
2024-03-12 18:28:10 +08:00
var cardConn = new ServiceConnection() {
2023-11-09 08:37:59 +08:00
public void onServiceDisconnected(ComponentName name) {
2024-01-24 20:17:59 +08:00
Util.println("Disconnected cardsystem aidl service");
2023-11-09 08:37:59 +08:00
}
public void onServiceConnected(ComponentName name, IBinder iBinder) {
2024-03-12 18:28:10 +08:00
unbindService(this);
2024-01-24 20:17:59 +08:00
Util.println("Bind cardsystem aidl service success");
2023-11-09 08:37:59 +08:00
var service = CardService.Stub.asInterface(iBinder);
try {
2023-11-10 09:47:38 +08:00
Util.isScreenOn = service.isScreenOpen();
2024-03-12 18:28:10 +08:00
Util.screenWidth = service.getScreenWidth();
Util.screenHeight = service.getScreenHeight();
Util.println(" IsScreenOn: "+Util.isScreenOn+" screen: "+Util.screenWidth+" x "+Util.screenHeight);
2024-05-09 20:30:22 +08:00
setContentView(backView = new BackView(MainActivity.this, Util.screenWidth, Util.screenHeight));
2024-03-26 15:15:57 +08:00
state = 5;
if(Util.isScreenOn) initProg();
else state = 8;
2024-03-12 18:28:10 +08:00
} catch (Exception e) {
2024-01-24 20:17:59 +08:00
Util.makeText(MainActivity.this, Util.toStr(e)).show();
Util.printStackTrace(e);
2023-11-09 08:37:59 +08:00
}
}
};
var intent = new Intent("com.xixun.joey.aidlset.SettingsService");
intent.setPackage("com.xixun.joey.cardsystem");
2024-03-12 18:28:10 +08:00
bindService(intent, cardConn, Context.BIND_AUTO_CREATE);
2023-11-09 08:37:59 +08:00
2024-03-12 18:28:10 +08:00
var connConn = new ServiceConnection() {
public void onServiceDisconnected(ComponentName name) {
Util.println("Disconnected xy.conn aidl service");
connService = null;
}
public void onServiceConnected(ComponentName name, IBinder iBinder) {
unbindService(this);
Util.println("Bind xy.conn aidl service success");
connService = ConnService.Stub.asInterface(iBinder);
try {
Util.serverURL = connService.getServerURL();
Util.println(" ServerURL: "+Util.serverURL);
if(Util.serverURL==null || Util.serverURL.isEmpty()) Util.serverURL = "https://m2mled.net/";
else {
if(! Util.serverURL.startsWith("http")) Util.serverURL = "http://"+Util.serverURL;
if(! Util.serverURL.endsWith("/")) Util.serverURL += "/";
2024-01-24 20:17:59 +08:00
}
2024-03-12 18:28:10 +08:00
} catch (Exception e) {
Util.makeText(MainActivity.this, Util.toStr(e)).show();
Util.printStackTrace(e);
}
2024-01-24 20:17:59 +08:00
}
2024-03-12 18:28:10 +08:00
};
intent = new Intent("xixun.intent.action.CONNECTION_INFO");
intent.setPackage("com.xixun.xy.conn");
bindService(intent, connConn, Context.BIND_AUTO_CREATE);
2024-01-24 20:17:59 +08:00
2023-11-09 08:37:59 +08:00
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
2024-01-24 20:17:59 +08:00
Util.println("Receive PAUSE_PLAYER");
2023-11-10 09:47:38 +08:00
Util.isScreenOn = ! intent.getBooleanExtra("pause", false);
2024-03-12 18:28:10 +08:00
Util.println(" IsScreenOn: "+Util.isScreenOn);
2023-11-10 09:47:38 +08:00
if(! Util.isScreenOn) {
2023-11-09 08:37:59 +08:00
state = 8;
2024-05-09 20:30:22 +08:00
if(insView!=null) {
insView.release();
insView = null;
}
2023-11-09 08:37:59 +08:00
if(progView!=null) {
2023-12-01 16:17:06 +08:00
progView.release();
2023-11-09 08:37:59 +08:00
progView = null;
}
2024-05-09 20:30:22 +08:00
setContentView(backView);
} else if(progView==null && insView==null) initProg();
2023-11-09 08:37:59 +08:00
}
2024-01-24 20:17:59 +08:00
}, new IntentFilter("com.xixun.action.PAUSE_PLAYER"));
2023-11-09 08:37:59 +08:00
2024-03-12 18:28:10 +08:00
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
Util.println("Receive CHANGE_COMPANYID");
if(connService!=null) {
try {
Util.serverURL = connService.getServerURL();
Util.println(" ServerURL: "+Util.serverURL);
2024-03-12 19:06:20 +08:00
if(Util.serverURL==null || Util.serverURL.isEmpty()) Util.serverURL = "https://m2mled.net/";
else {
if(! Util.serverURL.startsWith("http")) Util.serverURL = "http://"+Util.serverURL;
if(! Util.serverURL.endsWith("/")) Util.serverURL += "/";
}
2024-03-12 18:28:10 +08:00
} catch (Exception e) {
Util.makeText(MainActivity.this, Util.toStr(e)).show();
Util.printStackTrace(e);
}
}
}
}, new IntentFilter("com.xixun.joey.CHANGE_COMPANYID"));
2023-11-09 08:37:59 +08:00
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
MainActivity.this.environIntent = intent;
for(var environ : environs) {
environ.onReceive(intent);
2024-01-26 18:31:10 +08:00
((View)environ).invalidate();
2023-11-09 08:37:59 +08:00
}
}
2024-01-24 20:17:59 +08:00
}, new IntentFilter("xixun.intent.action.TEMPERATURE_HUMIDITY"));
2023-11-09 08:37:59 +08:00
2023-12-01 16:17:06 +08:00
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
try {
var code = intent.getIntExtra("code", 0);
2024-01-24 20:17:59 +08:00
Util.println(" remote_control "+code);
2024-05-09 20:30:22 +08:00
if(progView == null || ! progView.isShown() || code > progView.pages.size()) return;
2024-07-04 17:45:56 +08:00
if(! progView.avas.isEmpty()) {
progView.curAva().hide();
if(progView.avas.size()==1 && progView.avas.get(0)==code-1) for(var call : progView.calls) call.doFrame(System.currentTimeMillis());
}
2023-12-01 16:17:06 +08:00
var millis = (System.currentTimeMillis()+999)/1000*1000;
if(code > 0) {
progView.avas.clear();
progView.avas.add(code-1);
2024-02-02 18:09:54 +08:00
progView.curAva = 0;
progView.curTimes = 1;
progView.waitTo = 0; //点播
2024-05-09 20:30:22 +08:00
var page = progView.curAva();
2023-12-01 16:17:06 +08:00
page.setMillis(millis);
if(state != 6) {
setContentView(progView);
state = 6;
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
} else {
2024-02-02 18:09:54 +08:00
progView.waitTo = Long.MAX_VALUE;
2023-12-01 16:17:06 +08:00
syncProg(millis);
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
} catch (Throwable e) {
2024-01-24 20:17:59 +08:00
Util.makeText(MainActivity.this, Util.toStr(e)).show();
Util.printStackTrace(e);
2023-11-09 08:37:59 +08:00
}
}
2024-01-24 20:17:59 +08:00
}, new IntentFilter("com.xixun.yzd.REMOTE_CONTROL"));
2023-12-01 16:17:06 +08:00
2024-03-12 18:28:10 +08:00
var intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addDataScheme("file");
registerReceiver(new BroadcastReceiver(){
long lastMs;
final char[] pass = {'8','8','8'};
@Override
public void onReceive(Context context, Intent intent) {
var path = intent.getData().getPath();
Util.println("\nMEDIA_MOUNTED path: "+path);
var ms = System.currentTimeMillis();
if(ms-lastMs<1000) return;
lastMs = ms;
2024-03-14 21:48:08 +08:00
Util.makeText(MainActivity.this, "MEDIA_MOUNTED path: "+path+"\nImporting 正在导入 ...").show();
2024-03-12 18:28:10 +08:00
new Thread(()->{
try {
var zip = new ZipFile(path+"/program.zip");
if(zip.isEncrypted()) zip.setPassword(pass);
long size = 0;
2024-07-04 17:45:56 +08:00
ByteArrayOutputStream jsonOut = null;
2024-03-12 18:28:10 +08:00
var headers = zip.getFileHeaders();
for(var header : headers) {
size += header.getUncompressedSize();
2024-07-04 17:45:56 +08:00
if("program".equals(header.getFileName())) IOs.writeClose(jsonOut = new ByteArrayOutputStream(), zip.getInputStream(header));
2024-03-12 18:28:10 +08:00
}
2024-07-04 17:45:56 +08:00
if(jsonOut==null) {
2024-03-12 18:28:10 +08:00
Util.println("No program File");
runOnUiThread(() -> Util.makeText(MainActivity.this, "No program File").show());
return;
}
if(size==0) {
Util.println("zip size is 0");
runOnUiThread(() -> Util.makeText(MainActivity.this, "zip size is 0").show());
return;
}
Util.deleteFiles(size, null);
2024-03-14 21:00:56 +08:00
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();
}
2024-07-04 17:45:56 +08:00
var json = jsonOut.toByteArray();
2024-03-12 18:28:10 +08:00
runOnUiThread(() -> {
Util.println("Import Succeed");
2024-03-14 21:48:08 +08:00
Util.makeText(MainActivity.this, "Import Succeed 导入成功\nDon't shut down within 1 minute, otherwise the program may be lost\n不要在 1 分钟内关机,否则节目可能丢失").show();
2024-03-12 18:28:10 +08:00
initProg(json);
});
} catch (Exception e) {
Util.printStackTrace(e);
runOnUiThread(() -> Util.makeText(MainActivity.this, Util.toStr(e)).show());
}
}).start();
}
}, intentFilter);
2023-12-01 16:17:06 +08:00
new Thread(this).start();
2023-11-09 08:37:59 +08:00
}
2023-12-11 15:17:48 +08:00
public void stopProg() {
2024-05-09 20:30:22 +08:00
if(insView!=null) {
insView.release();
insView = null;
}
if(progView!=null) {
progView.release();
progView = null;
}
2023-12-11 15:17:48 +08:00
setContentView(backView);
}
2023-11-09 08:37:59 +08:00
public boolean delProgFile() {
2023-12-11 15:17:48 +08:00
stopProg();
2023-11-09 08:37:59 +08:00
var files = new File(Util.programDir).listFiles();
var ok = true;
if(files != null) for(var file : files) if(! file.delete()) ok = false;
state = 4;
try {
var out = new FileOutputStream(Util.programDir+"/program");
out.write("{}".getBytes());
out.flush();
out.getFD().sync();
out.close();
} catch (Throwable ignored) {
}
return ok;
}
public void initProg() {
2024-05-09 20:30:22 +08:00
state = 1;
try {
Util.println("\nParse Insert Prog Json");
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/insert")));
var task = root.jsmap("task");
if(task==null && root.containsKey("layers")) task = new JSMap("items", new JSList<>(new JSMap("_program", root)));
if(task!=null) {
var view = new Prog(task, this);
if(view.getChildCount()!=0) setContentView(insView = view);
}
} catch(FileNotFoundException ignored) {
} catch(Throwable e) {
state = 7;
Util.printStackTrace(e);
}
2023-11-09 08:37:59 +08:00
try {
2024-03-14 21:48:08 +08:00
Util.println("\nParse Prog Json");
var root = JSMap.fromClose(new BufferedInputStream(new FileInputStream(Util.programDir + "/program")));
var task = root.jsmap("task");
2024-05-09 20:30:22 +08:00
if(task==null && root.containsKey("layers")) task = new JSMap("items", new JSList<>(new JSMap("_program", root)));
if(task==null) Util.println(root.isEmpty() ? " Empty program JSON\n" : " Error: task==null\n");
else {
var view = new Prog(task, this);
if(view.getChildCount()==0) Util.println(" Error: ChildCount==0\n");
else setContentView(progView = view);
2023-11-09 08:37:59 +08:00
}
2024-05-09 20:30:22 +08:00
} catch(FileNotFoundException e) {
Util.println(""+e);
} catch(Throwable e) {
state = 7;
Util.makeText(this, Util.toStr(e)).show();
Util.printStackTrace(e);
}
if(insView!=null || progView!=null) {
2024-01-24 20:17:59 +08:00
state = 5;
Util.println("Init Sync");
2023-11-09 08:37:59 +08:00
syncProg((System.currentTimeMillis()+999)/1000*1000);
2024-01-24 20:17:59 +08:00
if(canAdd) {
choreographer.postFrameCallback(this);
canAdd = false;
}
2024-05-09 20:30:22 +08:00
} else if(state != 7) state = 3;
2023-11-09 08:37:59 +08:00
}
2024-01-26 21:35:38 +08:00
public void initProg(byte[] json) {
try {
Util.println("\nParse Prog Json");
2024-03-05 16:50:07 +08:00
var root = JSMap.from(json);
var task = root.jsmap("task");
2024-01-26 21:35:38 +08:00
if(task==null) {
2024-03-05 16:50:07 +08:00
if(! root.containsKey("layers")) {
state = 7;
Util.println(" Error: task==null\n");
Util.println(new String(json, Chsets.UTF8));
return;
}
2024-05-09 20:30:22 +08:00
task = new JSMap("items", new JSList<>(new JSMap("_program", root)));
2024-01-26 21:35:38 +08:00
}
var view = new Prog(task, this);
if(view.getChildCount()==0) {
2024-05-09 20:30:22 +08:00
if(! view.isInsert) state = 7;
2024-01-26 21:35:38 +08:00
Util.println(" Error: ChildCount==0\n");
Util.println(new String(json, Chsets.UTF8));
return;
}
2024-05-09 20:30:22 +08:00
if(view.isInsert) {
if(insView!=null) insView.release();
insView = view;
setContentView(insView);
} else {
if(progView!=null) progView.release();
progView = view;
setContentView(progView);
}
var fOut = new FileOutputStream(Util.programDir + (view.isInsert?"/insert":"/program"));
2024-01-26 21:35:38 +08:00
fOut.write(json);
fOut.flush();
fOut.getFD().sync();
fOut.close();
state = 5;
Util.println("Init Sync");
syncProg((System.currentTimeMillis()+999)/1000*1000);
if(canAdd) {
choreographer.postFrameCallback(this);
canAdd = false;
}
} catch (Throwable e) {
state = 7;
Util.makeText(this, Util.toStr(e)).show();
Util.printStackTrace(e);
Util.println(new String(json, Chsets.UTF8));
}
}
2023-11-09 08:37:59 +08:00
Choreographer choreographer = Choreographer.getInstance();
2024-01-24 20:17:59 +08:00
boolean canAdd = true;
2023-11-09 08:37:59 +08:00
@Override
public void doFrame(long frameTimeNanos) {
2024-05-09 20:30:22 +08:00
if(progView == null && insView==null) {
2024-01-24 20:17:59 +08:00
canAdd = true;
return;
}
2023-11-09 08:37:59 +08:00
var milli = System.currentTimeMillis();
2024-05-09 20:30:22 +08:00
if(insView!=null && ! insView.avas.isEmpty()) {
var lastPage = insView.curAva();
if(milli >= lastPage.endMilli) {
lastPage.hide();
if(--lastPage.repeatTimes<=0 && ++insView.curAva >= insView.avas.size()) {
var isDiff = milli-lastPage.endMilli>=1000;
Util.println("isDiff: "+isDiff+" endMs: "+lastPage.endMilli+" millis:"+milli);
syncProg(isDiff ? milli : lastPage.endMilli);
choreographer.postFrameCallback(this);
canAdd = false;
if(insView!=null) for(var call : insView.calls) call.doFrame(milli);
return;
}
insView.curAva().setMillis(lastPage.endMilli);
Util.println("curAva: "+insView.curAva+" endMs: "+insView.curAva().endMilli);
} else lastPage.showHideSrcs(milli);
choreographer.postFrameCallback(this);
canAdd = false;
for(var call : insView.calls) call.doFrame(milli);
return;
}
2023-12-01 16:17:06 +08:00
if(progView.avas.isEmpty()) {
2024-02-02 18:09:54 +08:00
if(milli >= progView.waitTo) {
progView.waitTo = Long.MAX_VALUE;
2024-01-24 20:17:59 +08:00
Util.println("wait sync");
2023-12-01 16:17:06 +08:00
syncProg(milli);
2023-11-09 08:37:59 +08:00
}
} else {
2024-05-09 20:30:22 +08:00
var lastPage = progView.curAva();
2023-12-01 16:17:06 +08:00
if(milli >= lastPage.endMilli) {
lastPage.hide();
2024-02-02 18:09:54 +08:00
if(progView.waitTo > 0) { //waitTo==0 为点播,不换页
if(progView.curTimes < lastPage.repeatTimes) progView.curTimes++;
2023-12-01 16:17:06 +08:00
else {
2024-02-02 18:09:54 +08:00
progView.curTimes = 1;
2024-05-09 20:30:22 +08:00
if(++progView.curAva >= progView.avas.size()) {
2023-12-01 16:17:06 +08:00
var isDiff = milli-lastPage.endMilli>=1000;
2024-01-24 20:17:59 +08:00
if(Util.buf.length()>1000000) Util.buf.replace(0, 100000, "");
Util.println("isDiff: "+isDiff+" endMs: "+lastPage.endMilli+" millis:"+milli);
2023-12-01 16:17:06 +08:00
syncProg(isDiff ? milli : lastPage.endMilli);
2024-05-09 20:30:22 +08:00
if(! progView.isShown() || progView.avas.isEmpty()) Util.println("after. No Avas");
else Util.println("after. curAva: "+progView.curAva+" endMs: "+progView.curAva().endMilli);
2023-12-01 16:17:06 +08:00
choreographer.postFrameCallback(this);
2024-01-24 20:17:59 +08:00
canAdd = false;
2024-02-02 21:51:16 +08:00
for(var call : progView.calls) call.doFrame(milli);
2023-12-01 16:17:06 +08:00
return;
}
}
2023-11-09 08:37:59 +08:00
}
2024-05-09 20:30:22 +08:00
progView.curAva().setMillis(lastPage.endMilli);
Util.println("curAva: "+progView.curAva+" endMs: "+progView.curAva().endMilli);
} else lastPage.showHideSrcs(milli);
2023-11-09 08:37:59 +08:00
}
choreographer.postFrameCallback(this);
2024-01-24 20:17:59 +08:00
canAdd = false;
2024-02-02 21:51:16 +08:00
for(var call : progView.calls) call.doFrame(milli);
2023-11-09 08:37:59 +08:00
}
void syncProg(long milli) {
2024-05-09 20:30:22 +08:00
if(insView!=null) {
insView.avas.clear();
for(int i=0; i<insView.pages.size(); i++) if(insView.pages.get(i).repeatTimes <= 0) {
for(var layer : insView.pages.get(i).layers) for(var src : layer.srcs) {
insView.removeView(src.view);
insView.calls.remove(src);
}
insView.pages.remove(i--);
}
if(insView.pages.isEmpty()) {
insView.release();
insView = null;
try {
var fOut = new FileOutputStream(Util.programDir + "/insert");
fOut.write("{}".getBytes());
fOut.flush();
fOut.getFD().sync();
fOut.close();
} catch(Exception e) {
Util.printStackTrace(e);
}
} else {
var dur = 0;
for(int i=0; i<insView.pages.size(); i++) if(insView.pages.get(i).isScheOn(milli+dur)) {
insView.avas.add(i);
dur += insView.pages.get(i).tDur;
}
if(dur==0) for(int i=0; i<insView.pages.size(); i++) if(insView.pages.get(i).sches==null) {
insView.avas.add(i);
dur += insView.pages.get(i).tDur;
}
if(dur!=0) {
insView.curAva = 0;
insView.curAva().setMillis(milli);
if(! insView.isShown()) setContentView(insView);
state = 6;
return;
}
}
2023-12-01 16:17:06 +08:00
}
2024-05-09 20:30:22 +08:00
if(progView!=null) {
progView.curTimes = 1;
progView.avas.clear();
var dur = 0;
for(int i=0; i<progView.pages.size(); i++) if(progView.pages.get(i).isScheOn(milli+dur)) {
2024-02-02 18:09:54 +08:00
progView.avas.add(i);
dur += progView.pages.get(i).tDur;
2023-11-09 08:37:59 +08:00
}
2024-02-02 18:09:54 +08:00
if(dur==0) {
2024-05-09 20:30:22 +08:00
for(int i=0; i<progView.pages.size(); i++) if(progView.pages.get(i).sches==null) {
progView.avas.add(i);
dur += progView.pages.get(i).tDur;
}
if(dur==0) {
progView.waitTo = milli + 1000;
if(state!=2) {
setContentView(backView);
state = 2;
}
return;
2024-02-02 18:09:54 +08:00
}
2023-11-09 08:37:59 +08:00
}
2024-05-09 20:30:22 +08:00
var start = milli / dur * dur;
progView.curAva = 0;
if(start < milli) {
do {
start += progView.curAva().tDur;
progView.curAva++;
} while(progView.curAva < progView.avas.size() && start<=milli);
progView.curAva--;
start -= progView.curAva().tDur;
syncMs = milli;
Util.println("Sync. dur: "+dur+" milli: "+milli+" start: "+start+" diff: "+(milli - start));
}
progView.curAva().setMillis(start);
if(! progView.isShown()) setContentView(progView);
2024-02-02 18:09:54 +08:00
state = 6;
}
2023-11-09 08:37:59 +08:00
}
2023-12-01 16:17:06 +08:00
2024-05-09 20:30:22 +08:00
public void run() {
2023-12-01 16:17:06 +08:00
try {
var serverSocket = new ServerSocket(3333);
while(true) {
try {
2024-02-02 18:09:54 +08:00
Util.println("\nAccepting ...");
2024-05-09 20:30:22 +08:00
var socket = serverSocket.accept();
new SocketThread(this, socket).start();
2024-02-02 18:09:54 +08:00
Util.println("\nAccepted");
2023-12-01 16:17:06 +08:00
} catch (Throwable e) {
2024-02-02 18:09:54 +08:00
MainActivity.ins.runOnUiThread(() -> Util.makeText(MainActivity.this, Util.toStr(e)).show());
2024-01-24 20:17:59 +08:00
Util.printStackTrace(e);
2023-12-01 16:17:06 +08:00
}
}
} catch (Throwable e) {
2024-02-02 18:09:54 +08:00
MainActivity.ins.runOnUiThread(() -> Util.makeText(MainActivity.this, Util.toStr(e)).show());
2024-01-24 20:17:59 +08:00
Util.printStackTrace(e);
2023-12-01 16:17:06 +08:00
}
2023-11-09 08:37:59 +08:00
}
}