diff --git a/danmaku/src/main/java/master/flame/danmaku/controller/DrawTask.java b/danmaku/src/main/java/master/flame/danmaku/controller/DrawTask.java index 1f623b191..b1fda410c 100644 --- a/danmaku/src/main/java/master/flame/danmaku/controller/DrawTask.java +++ b/danmaku/src/main/java/master/flame/danmaku/controller/DrawTask.java @@ -281,11 +281,7 @@ public class DrawTask implements IDrawTask { } protected void loadDanmakus(BaseDanmakuParser parser) { - danmakuList = parser.setConfig(mContext).setDisplay(mDisp).setTimer(mTimer).setListener(danmaku -> { - if (mTaskListener != null) { - mTaskListener.onDanmakuAdd(danmaku); - } - }).getDanmakus(); + danmakuList = parser.setConfig(mContext).setDisplay(mDisp).setTimer(mTimer).getDanmakus(); mContext.mGlobalFlagValues.resetAll(); if (danmakuList != null) { mLastDanmaku = danmakuList.last(); diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/Danmakus.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/Danmakus.java index ce6f37057..214700047 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/Danmakus.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/model/android/Danmakus.java @@ -30,22 +30,14 @@ import master.flame.danmaku.danmaku.model.IDanmakus; public class Danmakus implements IDanmakus { - public Collection items; - + private final AtomicInteger mSize = new AtomicInteger(0); + private Collection items; private Danmakus subItems; - private BaseDanmaku startItem, endItem; - private BaseDanmaku endSubItem; - private BaseDanmaku startSubItem; - - private volatile AtomicInteger mSize = new AtomicInteger(0); - private int mSortType = ST_BY_TIME; - private BaseComparator mComparator; - private boolean mDuplicateMergingEnabled; private Object mLockObject = new Object(); @@ -154,7 +146,6 @@ public class Danmakus implements IDanmakus { if (endSubItem == null) { endSubItem = createItem("end"); } - startSubItem.setTime(startTime); endSubItem.setTime(endTime); return ((SortedSet) items).subSet(startSubItem, endSubItem); @@ -163,10 +154,8 @@ public class Danmakus implements IDanmakus { @Override public IDanmakus subnew(long startTime, long endTime) { Collection subset = subset(startTime, endTime); - if (subset == null || subset.isEmpty()) { - return null; - } - LinkedList newSet = new LinkedList(subset); + if (subset == null || subset.isEmpty()) return null; + LinkedList newSet = new LinkedList<>(subset); return new Danmakus(newSet); } diff --git a/danmaku/src/main/java/master/flame/danmaku/danmaku/parser/BaseDanmakuParser.java b/danmaku/src/main/java/master/flame/danmaku/danmaku/parser/BaseDanmakuParser.java index 6c05abaa9..1e4c234b4 100644 --- a/danmaku/src/main/java/master/flame/danmaku/danmaku/parser/BaseDanmakuParser.java +++ b/danmaku/src/main/java/master/flame/danmaku/danmaku/parser/BaseDanmakuParser.java @@ -16,7 +16,6 @@ package master.flame.danmaku.danmaku.parser; -import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.DanmakuTimer; import master.flame.danmaku.danmaku.model.IDanmakus; import master.flame.danmaku.danmaku.model.IDisplay; @@ -31,7 +30,6 @@ public abstract class BaseDanmakuParser { protected float mScaledDensity; protected IDisplay mDisp; protected DanmakuContext mContext; - protected Listener mListener; private IDanmakus mDanmakus; public IDisplay getDisplay() { @@ -49,15 +47,9 @@ public abstract class BaseDanmakuParser { return this; } - public BaseDanmakuParser setListener(Listener listener) { - mListener = listener; - return this; - } - /** * decide the speed of scroll-danmakus * - * @return */ protected float getViewportSizeFactor() { return 1 / (mDispDensity - 0.6f); @@ -89,8 +81,4 @@ public abstract class BaseDanmakuParser { mContext = config; return this; } - - public interface Listener { - void onDanmakuAdd(BaseDanmaku danmaku); - } } diff --git a/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java b/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java index 32ec550b0..5304cb20c 100644 --- a/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java +++ b/danmaku/src/main/java/tv/cjump/jni/DeviceUtils.java @@ -1,149 +1,22 @@ package tv.cjump.jni; import android.os.Build; -import android.os.Environment; -import android.text.TextUtils; -import android.util.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.lang.reflect.Field; public class DeviceUtils { - public static final String ABI_X86 = "x86"; - - public static final String ABI_MIPS = "mips"; - // see include/​uapi/​linux/​elf-em.h - private static final int EM_ARM = 40; - private static final int EM_386 = 3; - private static final int EM_MIPS = 8; - private static final int EM_AARCH64 = 183; - private static ARCH sArch = ARCH.Unknown; - - // /system/lib/libc.so - // XXX: need a runtime check - public static synchronized ARCH getMyCpuArch() { - byte[] data = new byte[20]; - File libc = new File(Environment.getRootDirectory(), "lib/libc.so"); - if (libc.canRead()) { - RandomAccessFile fp = null; - try { - fp = new RandomAccessFile(libc, "r"); - fp.readFully(data); - int machine = (data[19] << 8) | data[18]; - switch (machine) { - case EM_ARM: - sArch = ARCH.ARM; - break; - case EM_386: - sArch = ARCH.X86; - break; - case EM_MIPS: - sArch = ARCH.MIPS; - break; - case EM_AARCH64: - sArch = ARCH.ARM64; - break; - default: - Log.e("NativeBitmapFactory", "libc.so is unknown arch: " + Integer.toHexString(machine)); - break; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (fp != null) { - try { - fp.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - return sArch; - } - - public static String get_CPU_ABI() { - return Build.CPU_ABI; - } - - public static String get_CPU_ABI2() { - try { - Field field = Build.class.getDeclaredField("CPU_ABI2"); - if (field == null) - return null; - - Object fieldValue = field.get(null); - if (!(fieldValue instanceof String)) { - return null; - } - - return (String) fieldValue; - } catch (Exception e) { - - } - - return null; - } - - public static boolean supportABI(String requestAbi) { - String abi = get_CPU_ABI(); - if (!TextUtils.isEmpty(abi) && abi.equalsIgnoreCase(requestAbi)) - return true; - - String abi2 = get_CPU_ABI2(); - return !TextUtils.isEmpty(abi2) && abi.equalsIgnoreCase(requestAbi); - - } - - public static boolean supportX86() { - return supportABI(ABI_X86); - } - - public static boolean supportMips() { - return supportABI(ABI_MIPS); - } - - public static boolean isARMSimulatedByX86() { - ARCH arch = getMyCpuArch(); - return !supportX86() && ARCH.X86.equals(arch); - } - public static boolean isMiBox2Device() { String manufacturer = Build.MANUFACTURER; String productName = Build.PRODUCT; - return manufacturer.equalsIgnoreCase("Xiaomi") - && productName.equalsIgnoreCase("dredd"); + return manufacturer.equalsIgnoreCase("Xiaomi") && productName.equalsIgnoreCase("dredd"); } public static boolean isMagicBoxDevice() { String manufacturer = Build.MANUFACTURER; String productName = Build.PRODUCT; - return manufacturer.equalsIgnoreCase("MagicBox") - && productName.equalsIgnoreCase("MagicBox"); + return manufacturer.equalsIgnoreCase("MagicBox") && productName.equalsIgnoreCase("MagicBox"); } public static boolean isProblemBoxDevice() { return isMiBox2Device() || isMagicBoxDevice(); } - - public static boolean isRealARMArch() { - ARCH arch = getMyCpuArch(); - return (supportABI("armeabi-v7a") || supportABI("armeabi")) && ARCH.ARM.equals(arch); - } - - public static boolean isRealX86Arch() { - ARCH arch = getMyCpuArch(); - return supportABI(ABI_X86) || ARCH.X86.equals(arch); - } - - public static enum ARCH { - Unknown, ARM, X86, MIPS, ARM64, - } - } diff --git a/danmaku/src/main/java/tv/cjump/jni/NativeBitmapFactory.java b/danmaku/src/main/java/tv/cjump/jni/NativeBitmapFactory.java index b7cbff3dd..2306d1c3e 100644 --- a/danmaku/src/main/java/tv/cjump/jni/NativeBitmapFactory.java +++ b/danmaku/src/main/java/tv/cjump/jni/NativeBitmapFactory.java @@ -1,11 +1,11 @@ package tv.cjump.jni; -import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.os.Build; import android.util.Log; import java.lang.reflect.Field; @@ -15,70 +15,29 @@ public class NativeBitmapFactory { static Field nativeIntField = null; static boolean nativeLibLoaded = false; - static boolean notLoadAgain = false; - - public static boolean isInNativeAlloc() { - return android.os.Build.VERSION.SDK_INT < 11 || (nativeLibLoaded && nativeIntField != null); - } public static void loadLibs() { - if (notLoadAgain) { - return; - } - if (!(DeviceUtils.isRealARMArch() || DeviceUtils.isRealX86Arch())) { - notLoadAgain = true; - nativeLibLoaded = false; - return; - } - if (nativeLibLoaded) { - return; - } - try { - if (android.os.Build.VERSION.SDK_INT >= 11 && android.os.Build.VERSION.SDK_INT < 23) { - System.loadLibrary("ndkbitmap"); - nativeLibLoaded = true; - } else { - notLoadAgain = true; - nativeLibLoaded = false; - } - } catch (Exception e) { - e.printStackTrace(); - notLoadAgain = true; - nativeLibLoaded = false; - } catch (Error e) { - e.printStackTrace(); - notLoadAgain = true; + System.loadLibrary("ndkbitmap"); + nativeLibLoaded = true; + boolean libInit = init(); + if (!libInit) { + release(); nativeLibLoaded = false; - } - if (nativeLibLoaded) { - boolean libInit = init(); - if (!libInit) { + } else { + initField(); + boolean confirm = testLib(); + if (!confirm) { release(); - notLoadAgain = true; nativeLibLoaded = false; - } else { - initField(); - boolean confirm = testLib(); - if (!confirm) { - // 测试so文件函数是否调用失败 - release(); - notLoadAgain = true; - nativeLibLoaded = false; - } } } - - Log.e("NativeBitmapFactory", "loaded" + nativeLibLoaded); } public static synchronized void releaseLibs() { boolean loaded = nativeLibLoaded; nativeIntField = null; nativeLibLoaded = false; - if (loaded) { - release(); - } - // Log.e("NativeBitmapFactory", "released"); + if (loaded) release(); } static void initField() { @@ -91,28 +50,24 @@ public class NativeBitmapFactory { } } - @SuppressLint("NewApi") private static boolean testLib() { - if (nativeIntField == null) { - return false; - } + if (nativeIntField == null) return false; Bitmap bitmap = null; - Canvas canvas = null; + Canvas canvas; try { bitmap = createNativeBitmap(2, 2, Bitmap.Config.ARGB_8888, true); boolean result = (bitmap != null && bitmap.getWidth() == 2 && bitmap.getHeight() == 2); if (result) { - if (android.os.Build.VERSION.SDK_INT >= 17 && !bitmap.isPremultiplied()) { + if (Build.VERSION.SDK_INT >= 17 && !bitmap.isPremultiplied()) { bitmap.setPremultiplied(true); } canvas = new Canvas(bitmap); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setTextSize(20f); - canvas.drawRect(0f, 0f, (float) bitmap.getWidth(), (float) bitmap.getHeight(), - paint); + canvas.drawRect(0f, 0f, (float) bitmap.getWidth(), (float) bitmap.getHeight(), paint); canvas.drawText("TestLib", 0, 0, paint); - if (android.os.Build.VERSION.SDK_INT >= 17) { + if (Build.VERSION.SDK_INT >= 17) { result = bitmap.isPremultiplied(); } } @@ -125,23 +80,18 @@ public class NativeBitmapFactory { } finally { if (bitmap != null) { bitmap.recycle(); - bitmap = null; } } } public static int getNativeConfig(Bitmap.Config config) { try { - if (nativeIntField == null) { - return 0; - } + if (nativeIntField == null) return 0; return nativeIntField.getInt(config); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } catch (IllegalAccessException e) { + } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); + return 0; } - return 0; } public static Bitmap createBitmap(int width, int height, Bitmap.Config config) { @@ -153,31 +103,20 @@ public class NativeBitmapFactory { } public static synchronized Bitmap createBitmap(int width, int height, Bitmap.Config config, boolean hasAlpha) { - if (!nativeLibLoaded || nativeIntField == null) { - // Log.e("NativeBitmapFactory", "ndk bitmap create failed"); - return Bitmap.createBitmap(width, height, config); - } + if (!nativeLibLoaded || nativeIntField == null) return Bitmap.createBitmap(width, height, config); return createNativeBitmap(width, height, config, hasAlpha); } private static Bitmap createNativeBitmap(int width, int height, Config config, boolean hasAlpha) { int nativeConfig = getNativeConfig(config); - // Log.e("NativeBitmapFactory", "nativeConfig:" + nativeConfig); - // Log.e("NativeBitmapFactory", "create bitmap:" + bitmap); - return android.os.Build.VERSION.SDK_INT == 19 ? createBitmap19(width, height, - nativeConfig, hasAlpha) : createBitmap(width, height, nativeConfig, hasAlpha); + return Build.VERSION.SDK_INT == 19 ? createBitmap19(width, height, nativeConfig, hasAlpha) : createBitmap(width, height, nativeConfig, hasAlpha); } - // ///////////native methods////////// - private static native boolean init(); private static native boolean release(); - private static native Bitmap createBitmap(int width, int height, int nativeConfig, - boolean hasAlpha); - - private static native Bitmap createBitmap19(int width, int height, int nativeConfig, - boolean hasAlpha); + private static native Bitmap createBitmap(int width, int height, int nativeConfig, boolean hasAlpha); + private static native Bitmap createBitmap19(int width, int height, int nativeConfig, boolean hasAlpha); }