Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e4df2564 authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

Merge "Add callback to handle wtf logs"

parents 27ef9e49 0406f853
Loading
Loading
Loading
Loading
+7 −3
Original line number Original line Diff line number Diff line
@@ -14,7 +14,6 @@


package com.android.systemui.shared.plugins;
package com.android.systemui.shared.plugins;


import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.os.Looper;
import android.os.Looper;


@@ -26,11 +25,16 @@ public interface PluginInitializer {
    Looper getBgLooper();
    Looper getBgLooper();


    /**
    /**
     * This Runnable is run on the bg looper during initialization of {@link PluginManagerImpl}.
     * Called from the bg looper during initialization of {@link PluginManagerImpl}.
     */
     */
    @Nullable Runnable getBgInitCallback();
    void onPluginManagerInit();


    String[] getWhitelistedPlugins(Context context);
    String[] getWhitelistedPlugins(Context context);


    PluginEnabler getPluginEnabler(Context context);
    PluginEnabler getPluginEnabler(Context context);

    /**
     * Called from {@link PluginManagerImpl#handleWtfs()}.
     */
    void handleWtfs();
}
}
+11 −17
Original line number Original line Diff line number Diff line
@@ -74,11 +74,11 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
    private final boolean isDebuggable;
    private final boolean isDebuggable;
    private final PluginPrefs mPluginPrefs;
    private final PluginPrefs mPluginPrefs;
    private final PluginEnabler mPluginEnabler;
    private final PluginEnabler mPluginEnabler;
    private final PluginInitializer mPluginInitializer;
    private ClassLoaderFilter mParentClassLoader;
    private ClassLoaderFilter mParentClassLoader;
    private boolean mListening;
    private boolean mListening;
    private boolean mHasOneShot;
    private boolean mHasOneShot;
    private Looper mLooper;
    private Looper mLooper;
    private boolean mWtfsSet;


    public PluginManagerImpl(Context context, PluginInitializer initializer) {
    public PluginManagerImpl(Context context, PluginInitializer initializer) {
        this(context, new PluginInstanceManagerFactory(), Build.IS_DEBUGGABLE,
        this(context, new PluginInstanceManagerFactory(), Build.IS_DEBUGGABLE,
@@ -87,7 +87,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage


    @VisibleForTesting
    @VisibleForTesting
    PluginManagerImpl(Context context, PluginInstanceManagerFactory factory, boolean debuggable,
    PluginManagerImpl(Context context, PluginInstanceManagerFactory factory, boolean debuggable,
            UncaughtExceptionHandler defaultHandler, PluginInitializer initializer) {
            UncaughtExceptionHandler defaultHandler, final PluginInitializer initializer) {
        mContext = context;
        mContext = context;
        mFactory = factory;
        mFactory = factory;
        mLooper = initializer.getBgLooper();
        mLooper = initializer.getBgLooper();
@@ -95,15 +95,18 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
        mWhitelistedPlugins.addAll(Arrays.asList(initializer.getWhitelistedPlugins(mContext)));
        mWhitelistedPlugins.addAll(Arrays.asList(initializer.getWhitelistedPlugins(mContext)));
        mPluginPrefs = new PluginPrefs(mContext);
        mPluginPrefs = new PluginPrefs(mContext);
        mPluginEnabler = initializer.getPluginEnabler(mContext);
        mPluginEnabler = initializer.getPluginEnabler(mContext);
        mPluginInitializer = initializer;


        PluginExceptionHandler uncaughtExceptionHandler = new PluginExceptionHandler(
        PluginExceptionHandler uncaughtExceptionHandler = new PluginExceptionHandler(
                defaultHandler);
                defaultHandler);
        Thread.setUncaughtExceptionPreHandler(uncaughtExceptionHandler);
        Thread.setUncaughtExceptionPreHandler(uncaughtExceptionHandler);


        Runnable bgRunnable = initializer.getBgInitCallback();
        new Handler(mLooper).post(new Runnable() {
        if (bgRunnable != null) {
            @Override
            new Handler(mLooper).post(bgRunnable);
            public void run() {
                initializer.onPluginManagerInit();
            }
            }
        });
    }
    }


    public String[] getWhitelistedPlugins() {
    public String[] getWhitelistedPlugins() {
@@ -299,16 +302,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
    }
    }


    public void handleWtfs() {
    public void handleWtfs() {
        if (!mWtfsSet) {
        mPluginInitializer.handleWtfs();
            mWtfsSet = true;
            Log.setWtfHandler(new Log.TerribleFailureHandler() {
                @Override
                public void onTerribleFailure(String tag, Log.TerribleFailure what,
                        boolean system) {
                    throw new CrashWhilePluginActiveException(what);
                }
            });
        }
    }
    }


    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
@@ -391,7 +385,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
        }
        }
    }
    }


    private class CrashWhilePluginActiveException extends RuntimeException {
    public static class CrashWhilePluginActiveException extends RuntimeException {
        public CrashWhilePluginActiveException(Throwable throwable) {
        public CrashWhilePluginActiveException(Throwable throwable) {
            super(throwable);
            super(throwable);
        }
        }
+25 −11
Original line number Original line Diff line number Diff line
@@ -16,30 +16,30 @@ package com.android.systemui.plugins;


import android.content.Context;
import android.content.Context;
import android.os.Looper;
import android.os.Looper;
import android.util.Log;


import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.shared.plugins.PluginEnabler;
import com.android.systemui.shared.plugins.PluginEnabler;
import com.android.systemui.shared.plugins.PluginInitializer;
import com.android.systemui.shared.plugins.PluginInitializer;
import com.android.systemui.R;
import com.android.systemui.shared.plugins.PluginManagerImpl;


public class PluginInitializerImpl implements PluginInitializer {
public class PluginInitializerImpl implements PluginInitializer {

    private boolean mWtfsSet;

    @Override
    @Override
    public Looper getBgLooper() {
    public Looper getBgLooper() {
        return Dependency.get(Dependency.BG_LOOPER);
        return Dependency.get(Dependency.BG_LOOPER);
    }
    }


    @Override
    @Override
    public Runnable getBgInitCallback() {
    public void onPluginManagerInit() {
        return new Runnable() {
            @Override
            public void run() {
        // Plugin dependencies that don't have another good home can go here, but
        // Plugin dependencies that don't have another good home can go here, but
        // dependencies that have better places to init can happen elsewhere.
        // dependencies that have better places to init can happen elsewhere.
        Dependency.get(PluginDependencyProvider.class)
        Dependency.get(PluginDependencyProvider.class)
                .allowPluginDependency(ActivityStarter.class);
                .allowPluginDependency(ActivityStarter.class);
    }
    }
        };
    }


    @Override
    @Override
    public String[] getWhitelistedPlugins(Context context) {
    public String[] getWhitelistedPlugins(Context context) {
@@ -49,4 +49,18 @@ public class PluginInitializerImpl implements PluginInitializer {
    public PluginEnabler getPluginEnabler(Context context) {
    public PluginEnabler getPluginEnabler(Context context) {
        return new PluginEnablerImpl(context);
        return new PluginEnablerImpl(context);
    }
    }

    @Override
    public void handleWtfs() {
        if (!mWtfsSet) {
            mWtfsSet = true;
            Log.setWtfHandler(new Log.TerribleFailureHandler() {
                @Override
                public void onTerribleFailure(String tag, Log.TerribleFailure what,
                        boolean system) {
                    throw new PluginManagerImpl.CrashWhilePluginActiveException(what);
                }
            });
        }
    }
}
}