| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package me.imid.swipebacklayout.lib;
- import android.app.Activity;
- import android.app.ActivityOptions;
- import android.os.Build;
- import java.lang.reflect.Method;
- /**
- * Created by Chaojun Wang on 6/9/14.
- */
- public class Utils {
- private Utils() {
- }
- /**
- * Convert a translucent themed Activity
- * {@link android.R.attr#windowIsTranslucent} to a fullscreen opaque
- * Activity.
- * <p>
- * Call this whenever the background of a translucent Activity has changed
- * to become opaque. Doing so will allow the {@link android.view.Surface} of
- * the Activity behind to be released.
- * <p>
- * This call has no effect on non-translucent activities or on activities
- * with the {@link android.R.attr#windowIsFloating} attribute.
- */
- public static void convertActivityFromTranslucent(Activity activity) {
- try {
- Method method = Activity.class.getDeclaredMethod("convertFromTranslucent");
- method.setAccessible(true);
- method.invoke(activity);
- } catch (Throwable t) {
- }
- }
- /**
- * Convert a translucent themed Activity
- * {@link android.R.attr#windowIsTranslucent} back from opaque to
- * translucent following a call to
- * {@link #convertActivityFromTranslucent(android.app.Activity)} .
- * <p>
- * Calling this allows the Activity behind this one to be seen again. Once
- * all such Activities have been redrawn
- * <p>
- * This call has no effect on non-translucent activities or on activities
- * with the {@link android.R.attr#windowIsFloating} attribute.
- */
- public static void convertActivityToTranslucent(Activity activity) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- convertActivityToTranslucentAfterL(activity);
- } else {
- convertActivityToTranslucentBeforeL(activity);
- }
- }
- /**
- * Calling the convertToTranslucent method on platforms before Android 5.0
- */
- public static void convertActivityToTranslucentBeforeL(Activity activity) {
- try {
- Class<?>[] classes = Activity.class.getDeclaredClasses();
- Class<?> translucentConversionListenerClazz = null;
- for (Class clazz : classes) {
- if (clazz.getSimpleName().contains("TranslucentConversionListener")) {
- translucentConversionListenerClazz = clazz;
- }
- }
- Method method = Activity.class.getDeclaredMethod("convertToTranslucent",
- translucentConversionListenerClazz);
- method.setAccessible(true);
- method.invoke(activity, new Object[] {
- null
- });
- } catch (Throwable t) {
- }
- }
- /**
- * Calling the convertToTranslucent method on platforms after Android 5.0
- */
- private static void convertActivityToTranslucentAfterL(Activity activity) {
- try {
- Method getActivityOptions = Activity.class.getDeclaredMethod("getActivityOptions");
- getActivityOptions.setAccessible(true);
- Object options = getActivityOptions.invoke(activity);
- Class<?>[] classes = Activity.class.getDeclaredClasses();
- Class<?> translucentConversionListenerClazz = null;
- for (Class clazz : classes) {
- if (clazz.getSimpleName().contains("TranslucentConversionListener")) {
- translucentConversionListenerClazz = clazz;
- }
- }
- Method convertToTranslucent = Activity.class.getDeclaredMethod("convertToTranslucent",
- translucentConversionListenerClazz, ActivityOptions.class);
- convertToTranslucent.setAccessible(true);
- convertToTranslucent.invoke(activity, null, options);
- } catch (Throwable t) {
- }
- }
- }
|