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 ;
2024-08-22 17:37:46 +08:00
import java.util.ArrayList ;
2023-11-09 08:37:59 +08:00
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 ;
2024-08-22 17:37:46 +08:00
ArrayList < BroadcastReceiver > reces = new ArrayList < > ( ) ;
2023-11-09 08:37:59 +08:00
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
ins = this ;
2024-08-22 17:37:46 +08:00
Util . println ( " ==>> MainActivity onCreate >>>> this " + hashCode ( ) + " UI Thread: " + Thread . currentThread ( ) . getId ( ) ) ;
try {
if ( RestartService . ins = = null ) startService ( new Intent ( this , RestartService . class ) ) ;
} catch ( Throwable e ) {
Util . printStackTrace ( e ) ;
}
2023-11-10 21:45:00 +08:00
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
2024-08-22 17:37:46 +08:00
@Override
protected void onDestroy ( ) {
super . onDestroy ( ) ;
Util . println ( " ==<< MainActivity onDestroy <<<< this " + hashCode ( ) ) ;
state = 8 ;
if ( insView ! = null ) {
insView . release ( ) ;
insView = null ;
}
if ( progView ! = null ) {
progView . release ( ) ;
progView = null ;
}
ins = null ;
for ( var rece : reces ) {
try {
unregisterReceiver ( rece ) ;
} catch ( Throwable ignored ) {
}
}
System . gc ( ) ;
}
@Override
protected void onStart ( ) {
super . onStart ( ) ;
Util . println ( " ==>> MainActivity onStart >> " + hashCode ( ) ) ;
}
@Override
protected void onStop ( ) {
super . onStop ( ) ;
Util . println ( " ==<< MainActivity onStop << " + hashCode ( ) ) ;
}
@Override
protected void onRestart ( ) {
super . onRestart ( ) ;
Util . println ( " ==>> MainActivity onRestart >> " + hashCode ( ) ) ;
}
@Override
protected void onResume ( ) {
super . onResume ( ) ;
Util . println ( " ==>> MainActivity onResume >> " + hashCode ( ) ) ;
}
@Override
protected void onPause ( ) {
super . onPause ( ) ;
Util . println ( " ==<< MainActivity onPause << " + hashCode ( ) ) ;
}
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-08-24 17:05:31 +08:00
ConnService serviXy ;
2024-03-12 18:28:10 +08:00
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-08-24 17:05:31 +08:00
Util . println ( " <-<- AIDL Service cardsystem Disconnected " ) ;
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-08-24 17:05:31 +08:00
Util . println ( " ->-> AIDL Service cardsystem aidl service Connected " ) ;
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-08-24 17:05:31 +08:00
var connXy = new ServiceConnection ( ) {
2024-03-12 18:28:10 +08:00
public void onServiceDisconnected ( ComponentName name ) {
2024-08-24 17:05:31 +08:00
Util . println ( " <-<- AIDL Service xy.conn Disconnected " ) ;
serviXy = null ;
2024-03-12 18:28:10 +08:00
}
public void onServiceConnected ( ComponentName name , IBinder iBinder ) {
unbindService ( this ) ;
2024-08-24 17:05:31 +08:00
Util . println ( " ->-> AIDL Service xy.conn Connected " ) ;
serviXy = ConnService . Stub . asInterface ( iBinder ) ;
2024-03-12 18:28:10 +08:00
try {
2024-08-24 17:05:31 +08:00
Util . serverURL = serviXy . getServerURL ( ) ;
2024-03-12 18:28:10 +08:00
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
} ;
2024-08-24 17:05:31 +08:00
var intenXy = new Intent ( " xixun.intent.action.CONNECTION_INFO " ) ;
intenXy . setPackage ( " com.xixun.xy.conn " ) ;
bindService ( intenXy , connXy , Context . BIND_AUTO_CREATE ) ;
2024-01-24 20:17:59 +08:00
2024-08-22 17:37:46 +08:00
reces . clear ( ) ;
BroadcastReceiver rece ;
registerReceiver ( rece = new BroadcastReceiver ( ) {
2023-11-09 08:37:59 +08:00
@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 ) ;
2024-08-22 17:37:46 +08:00
} else if ( progView = = null & & insView = = null ) MainActivity . ins . runOnUiThread ( ( ) - > initProg ( ) ) ;
System . gc ( ) ;
2023-11-09 08:37:59 +08:00
}
2024-01-24 20:17:59 +08:00
} , new IntentFilter ( " com.xixun.action.PAUSE_PLAYER " ) ) ;
2024-08-22 17:37:46 +08:00
reces . add ( rece ) ;
2023-11-09 08:37:59 +08:00
2024-08-22 17:37:46 +08:00
registerReceiver ( rece = new BroadcastReceiver ( ) {
2024-03-12 18:28:10 +08:00
@Override
public void onReceive ( Context context , Intent intent ) {
Util . println ( " Receive CHANGE_COMPANYID " ) ;
2024-08-24 17:05:31 +08:00
try {
if ( serviXy ! = null & & serviXy . asBinder ( ) . isBinderAlive ( ) ) {
Util . serverURL = serviXy . getServerURL ( ) ;
2024-03-12 18:28:10 +08:00
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-08-24 17:05:31 +08:00
} else {
Util . println ( " bindService " ) ;
bindService ( intenXy , connXy , Context . BIND_AUTO_CREATE ) ;
2024-03-12 18:28:10 +08:00
}
2024-08-24 17:05:31 +08:00
} catch ( Exception e ) {
Util . makeText ( MainActivity . this , Util . toStr ( e ) ) . show ( ) ;
Util . printStackTrace ( e ) ;
2024-03-12 18:28:10 +08:00
}
}
} , new IntentFilter ( " com.xixun.joey.CHANGE_COMPANYID " ) ) ;
2024-08-22 17:37:46 +08:00
reces . add ( rece ) ;
2023-11-09 08:37:59 +08:00
2024-08-22 17:37:46 +08:00
registerReceiver ( rece = new BroadcastReceiver ( ) {
2023-11-09 08:37:59 +08:00
@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 " ) ) ;
2024-08-22 17:37:46 +08:00
reces . add ( rece ) ;
2023-11-09 08:37:59 +08:00
2024-08-22 17:37:46 +08:00
registerReceiver ( rece = new BroadcastReceiver ( ) {
2023-12-01 16:17:06 +08:00
@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-08-22 17:37:46 +08:00
var page = progView . pages . get ( code - 1 ) ;
var ms = System . currentTimeMillis ( ) ;
if ( ! avas . isEmpty ( ) ) {
avas . get ( curAva ) . hide ( ) ;
if ( avas . size ( ) = = 1 & & avas . get ( 0 ) = = page ) for ( var call : progView . calls ) call . doFrame ( ms ) ;
2024-07-04 17:45:56 +08:00
}
2024-08-22 17:37:46 +08:00
ms = ( ms + 999 ) / 1000 * 1000 ;
2023-12-01 16:17:06 +08:00
if ( code > 0 ) {
2024-08-22 17:37:46 +08:00
avas . clear ( ) ;
avas . add ( page ) ;
curAva = 0 ;
curTimes = 1 ;
waitTo = 0 ; //点播
page . setMillis ( ms ) ;
2023-12-01 16:17:06 +08:00
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-08-22 17:37:46 +08:00
waitTo = Long . MAX_VALUE ;
syncProg ( ms ) ;
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 " ) ) ;
2024-08-22 17:37:46 +08:00
reces . add ( rece ) ;
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 " ) ;
2024-08-22 17:37:46 +08:00
registerReceiver ( rece = new BroadcastReceiver ( ) {
2024-03-12 18:28:10 +08:00
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 ) ;
2024-08-22 17:37:46 +08:00
reces . add ( rece ) ;
2024-03-12 18:28:10 +08:00
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 ) ;
2024-08-22 17:37:46 +08:00
System . gc ( ) ;
2023-12-11 15:17:48 +08:00
}
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 ;
2024-08-22 17:37:46 +08:00
System . gc ( ) ;
2024-01-26 21:35:38 +08:00
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
2024-08-22 17:37:46 +08:00
ArrayList < Prog . Page > avas = new ArrayList < > ( ) ;
int curAva , curTimes = 1 ;
long waitTo = Long . MAX_VALUE ;
boolean isInsert ;
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 ;
}
2024-08-22 17:37:46 +08:00
choreographer . postFrameCallback ( this ) ;
canAdd = false ;
2023-11-09 08:37:59 +08:00
var milli = System . currentTimeMillis ( ) ;
2024-08-22 17:37:46 +08:00
if ( avas . isEmpty ( ) ) {
if ( milli > = waitTo ) {
waitTo = Long . MAX_VALUE ;
Util . println ( " wait sync " ) ;
syncProg ( milli ) ;
if ( insView ! = null ) for ( var call : insView . calls ) call . doFrame ( milli ) ;
if ( progView ! = null ) for ( var call : progView . calls ) call . doFrame ( milli ) ;
}
return ;
}
var lastPage = avas . get ( curAva ) ;
if ( milli < lastPage . endMilli ) lastPage . showHideSrcs ( milli ) ;
else {
lastPage . hide ( ) ;
if ( isInsert ) {
if ( - - lastPage . repeatTimes < = 0 & & + + curAva > = avas . size ( ) ) {
2024-05-09 20:30:22 +08:00
var isDiff = milli - lastPage . endMilli > = 1000 ;
syncProg ( isDiff ? milli : lastPage . endMilli ) ;
if ( insView ! = null ) for ( var call : insView . calls ) call . doFrame ( milli ) ;
2024-08-22 17:37:46 +08:00
if ( progView ! = null ) for ( var call : progView . calls ) call . doFrame ( milli ) ;
2024-05-09 20:30:22 +08:00
return ;
}
2024-08-22 17:37:46 +08:00
} else {
if ( waitTo > 0 ) { //waitTo==0 为点播,不换页
if ( curTimes < lastPage . repeatTimes ) curTimes + + ;
2023-12-01 16:17:06 +08:00
else {
2024-08-22 17:37:46 +08:00
curTimes = 1 ;
if ( + + curAva > = avas . size ( ) ) {
2023-12-01 16:17:06 +08:00
var isDiff = milli - lastPage . endMilli > = 1000 ;
syncProg ( isDiff ? milli : lastPage . endMilli ) ;
2024-08-22 17:37:46 +08:00
if ( insView ! = null ) for ( var call : insView . calls ) call . doFrame ( milli ) ;
if ( progView ! = null ) 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-08-22 17:37:46 +08:00
}
avas . get ( curAva ) . setMillis ( lastPage . endMilli ) ;
Util . println ( " curAva: " + curAva + " endMs: " + avas . get ( curAva ) . endMilli ) ;
2023-11-09 08:37:59 +08:00
}
2024-08-22 17:37:46 +08:00
if ( isInsert ) for ( var call : insView . calls ) call . doFrame ( milli ) ;
else for ( var call : progView . calls ) call . doFrame ( milli ) ;
2023-11-09 08:37:59 +08:00
}
void syncProg ( long milli ) {
2024-08-22 17:37:46 +08:00
Util . println ( " \ nSyncProg " ) ;
avas . clear ( ) ;
curAva = 0 ;
curTimes = 1 ;
isInsert = false ;
2024-05-09 20:30:22 +08:00
if ( insView ! = null ) {
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 ) ;
2024-08-22 17:37:46 +08:00
if ( src . view instanceof Choreographer . FrameCallback ) insView . calls . remove ( ( Choreographer . FrameCallback ) src . view ) ;
2024-05-09 20:30:22 +08:00
}
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 ) ;
}
2024-08-22 17:37:46 +08:00
System . gc ( ) ;
2024-05-09 20:30:22 +08:00
} else {
var dur = 0 ;
2024-08-22 17:37:46 +08:00
for ( var page : insView . pages ) if ( page . isScheOn ( milli + dur ) ) {
avas . add ( page ) ;
dur + = page . tDur ;
2024-05-09 20:30:22 +08:00
}
2024-08-22 17:37:46 +08:00
if ( avas . isEmpty ( ) ) for ( var page : insView . pages ) if ( page . sches = = null ) avas . add ( page ) ;
if ( ! avas . isEmpty ( ) ) {
isInsert = true ;
avas . get ( curAva ) . setMillis ( milli ) ;
2024-05-09 20:30:22 +08:00
if ( ! insView . isShown ( ) ) setContentView ( insView ) ;
state = 6 ;
2024-08-22 17:37:46 +08:00
Util . println ( " avas " + avas . size ( ) + " Insert " ) ;
2024-05-09 20:30:22 +08:00
return ;
}
}
2023-12-01 16:17:06 +08:00
}
2024-05-09 20:30:22 +08:00
if ( progView ! = null ) {
var dur = 0 ;
2024-08-22 17:37:46 +08:00
for ( var page : progView . pages ) if ( page . isScheOn ( milli + dur ) ) {
avas . add ( page ) ;
dur + = page . tDur ;
2023-11-09 08:37:59 +08:00
}
2024-08-22 17:37:46 +08:00
if ( dur = = 0 ) for ( var page : progView . pages ) if ( page . sches = = null ) {
avas . add ( page ) ;
dur + = page . tDur ;
2023-11-09 08:37:59 +08:00
}
2024-08-22 17:37:46 +08:00
if ( dur ! = 0 ) {
var start = milli / dur * dur ;
if ( start < milli ) {
do {
start + = avas . get ( curAva + + ) . tDur ;
} while ( curAva < avas . size ( ) & & start < = milli ) ;
start - = avas . get ( - - curAva ) . tDur ;
syncMs = milli ;
Util . println ( " Sync. dur: " + dur + " milli: " + milli + " start: " + start + " diff: " + ( milli - start ) ) ;
}
avas . get ( curAva ) . setMillis ( start ) ;
if ( ! progView . isShown ( ) ) setContentView ( progView ) ;
state = 6 ;
Util . println ( " Avas " + avas . size ( ) ) ;
return ;
2024-05-09 20:30:22 +08:00
}
2024-02-02 18:09:54 +08:00
}
2024-08-22 17:37:46 +08:00
waitTo = milli + 1000 ;
if ( state ! = 2 ) {
setContentView ( backView ) ;
state = 2 ;
}
Util . println ( " No Avas, back " ) ;
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 ( ) ;
2024-08-22 17:37:46 +08:00
new SocketThread ( MainActivity . ins , 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-08-22 17:37:46 +08:00
if ( MainActivity . ins ! = null ) MainActivity . ins . runOnUiThread ( ( ) - > Util . makeText ( MainActivity . ins , 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-08-22 17:37:46 +08:00
var msg = e . getMessage ( ) ;
if ( msg = = null | | ! msg . contains ( " EADDRINUSE " ) ) MainActivity . ins . runOnUiThread ( ( ) - > Util . makeText ( MainActivity . ins , 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
}
}