package androidx.core.os; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.lang.reflect.InvocationTargetException; public final class HandlerCompat { private static final String TAG = "HandlerCompat"; private HandlerCompat() { } @NonNull public static Handler createAsync(@NonNull Looper looper) { if (Build.VERSION.SDK_INT >= 28) { return Handler.createAsync(looper); } try { return (Handler) Handler.class.getDeclaredConstructor(Looper.class, Handler.Callback.class, Boolean.TYPE).newInstance(looper, null, Boolean.TRUE); } catch (IllegalAccessException | InstantiationException | NoSuchMethodException unused) { Log.v("HandlerCompat", "Unable to invoke Handler(Looper, Callback, boolean) constructor"); return new Handler(looper); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw ((RuntimeException) cause); } else if (cause instanceof Error) { throw ((Error) cause); } else { throw new RuntimeException(cause); } } } @NonNull public static Handler createAsync(@NonNull Looper looper, @NonNull Handler.Callback callback) { if (Build.VERSION.SDK_INT >= 28) { return Handler.createAsync(looper, callback); } try { return (Handler) Handler.class.getDeclaredConstructor(Looper.class, Handler.Callback.class, Boolean.TYPE).newInstance(looper, callback, Boolean.TRUE); } catch (IllegalAccessException | InstantiationException | NoSuchMethodException unused) { Log.v("HandlerCompat", "Unable to invoke Handler(Looper, Callback, boolean) constructor"); return new Handler(looper, callback); } catch (InvocationTargetException e) { Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { throw ((RuntimeException) cause); } else if (cause instanceof Error) { throw ((Error) cause); } else { throw new RuntimeException(cause); } } } public static boolean postDelayed(@NonNull Handler handler, @NonNull Runnable runnable, @Nullable Object obj, long j) { if (Build.VERSION.SDK_INT >= 28) { return handler.postDelayed(runnable, obj, j); } Message obtain = Message.obtain(handler, runnable); obtain.obj = obj; return handler.sendMessageDelayed(obtain, j); } }