Android/XixunPlayer/app/src/main/java/com/xixun/xixunplayer/SrcCountdown.java
2024-01-24 20:17:59 +08:00

98 lines
2.7 KiB
Java

package com.xixun.xixunplayer;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Choreographer;
import android.view.View;
import android.webkit.WebView;
import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.HashMap;
import gnph.util.Dates;
import gnph.util.JSMap;
import gnph.util.NumFmts;
public class SrcCountdown extends WebView implements Choreographer.FrameCallback {
long targetTime;
String html;
boolean hasDay, hasHour, hasMin, hasSec;
public SrcCountdown(Context context, JSMap json) {
super(context);
try {
html = json.stnn("html");
targetTime = Dates.milli(json.stnn("time")) / 1000;
hasDay = html.contains("%d");
hasHour = html.contains("%h");
hasMin = html.contains("%m");
hasSec = html.contains("%s");
} catch (Exception e) {
Util.printStackTrace(e);
Util.makeText(context, Util.toStr(e)).show();
}
}
void cal() {
var cur = System.currentTimeMillis() / 1000;
var secs = targetTime - cur;
if(secs < 0) secs = 0;
var htm = html;
if(hasDay) {
var str = Long.toString(secs/86400);
secs %= 86400;
htm = htm.replace("%d", str);
}
if(hasHour) {
var str = NumFmts.zz().format(secs/3600);
secs %= 3600;
htm = htm.replace("%h", str);
}
if(hasMin) {
var str = NumFmts.zz().format(secs/60);
secs %= 60;
htm = htm.replace("%m", str);
}
if(hasSec) {
var str = NumFmts.zz().format(secs);
htm = htm.replace("%s", str);
}
loadData(htm, "text/html", null);
}
@Override
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
super.onVisibilityChanged(changedView, visibility);
if(visibility==View.VISIBLE) {
if(lastSec==0) {
cal();
choreographer.postFrameCallback(this);
lastSec = 1;
}
}
}
Choreographer choreographer = Choreographer.getInstance();
long lastSec;
@Override
public void doFrame(long frameTimeNanos) {
if(! isShown()) {
lastSec = 0;
return;
}
var sec = System.currentTimeMillis() / 1000;
if(sec != lastSec) {
lastSec = sec;
cal();
}
choreographer.postFrameCallback(this);
}
}