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 ;
if ( ! progView . avas . isEmpty ( ) ) progView . curAva ( ) . hide ( ) ;
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 ;
ByteArrayOutputStream progJson = null ;
var headers = zip . getFileHeaders ( ) ;
for ( var header : headers ) {
size + = header . getUncompressedSize ( ) ;
if ( " program " . equals ( header . getFileName ( ) ) ) {
progJson = new ByteArrayOutputStream ( ) ;
IOs . writeClose ( progJson , zip . getInputStream ( header ) ) ;
}
}
if ( progJson = = null ) {
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-03-12 18:28:10 +08:00
var json = progJson . toByteArray ( ) ;
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
}
}