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

Commit 0406f853 authored by Tony Wickham's avatar Tony Wickham
Browse files

Add callback to handle wtf logs

TerribleFailureHandler is hidden API, so we abstract it out so only
sysui uses it.

Test: compiles

Bug: 115877296
Change-Id: Iec9ca5c22beffcd9a86edde8eb5bdba06ae6aea5
parent 9967126b
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -14,7 +14,6 @@

package com.android.systemui.shared.plugins;

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

@@ -26,11 +25,16 @@ public interface PluginInitializer {
    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);

    PluginEnabler getPluginEnabler(Context context);

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

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

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

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

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

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

    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 CrashWhilePluginActiveException(what);
                }
            });
        }
        mPluginInitializer.handleWtfs();
    }

    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) {
            super(throwable);
        }
+25 −11
Original line number Diff line number Diff line
@@ -16,30 +16,30 @@ package com.android.systemui.plugins;

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

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

public class PluginInitializerImpl implements PluginInitializer {

    private boolean mWtfsSet;

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

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

    @Override
    public String[] getWhitelistedPlugins(Context context) {
@@ -49,4 +49,18 @@ public class PluginInitializerImpl implements PluginInitializer {
    public PluginEnabler getPluginEnabler(Context 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);
                }
            });
        }
    }
}