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

Commit 4131e789 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Don't crash systemui

... if any of the notification guts couldn't be inflated

Test: artificial crash
Change-Id: I08ca2020858c67ac9fada8daecc9e665d77e3281
Fixes: 112680753
parent 0eaa26ad
Loading
Loading
Loading
Loading
+43 −37
Original line number Original line Diff line number Diff line
@@ -28,12 +28,10 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.Resources;
import android.net.Uri;
import android.net.Uri;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserHandle;
import android.provider.Settings;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.service.notification.StatusBarNotification;
import androidx.annotation.VisibleForTesting;
import android.util.ArraySet;
import android.util.ArraySet;
import android.util.Log;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.HapticFeedbackConstants;
@@ -45,15 +43,17 @@ import com.android.internal.logging.nano.MetricsProto;
import com.android.systemui.Dependency;
import com.android.systemui.Dependency;
import com.android.systemui.Dumpable;
import com.android.systemui.Dumpable;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.NotificationPresenter;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBar;


import java.io.FileDescriptor;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.PrintWriter;


import androidx.annotation.VisibleForTesting;

/**
/**
 * Handles various NotificationGuts related tasks, such as binding guts to a row, opening and
 * Handles various NotificationGuts related tasks, such as binding guts to a row, opening and
 * closing guts, and keeping track of the currently exposed notification guts.
 * closing guts, and keeping track of the currently exposed notification guts.
@@ -147,15 +147,15 @@ public class NotificationGutsManager implements Dumpable {
        }
        }
    }
    }


    public void bindGuts(final ExpandableNotificationRow row) {
    public boolean bindGuts(final ExpandableNotificationRow row) {
        bindGuts(row, mGutsMenuItem);
        row.inflateGuts();
        return bindGuts(row, mGutsMenuItem);
    }
    }


    private void bindGuts(final ExpandableNotificationRow row,
    private boolean bindGuts(final ExpandableNotificationRow row,
            NotificationMenuRowPlugin.MenuItem item) {
            NotificationMenuRowPlugin.MenuItem item) {
        StatusBarNotification sbn = row.getStatusBarNotification();
        StatusBarNotification sbn = row.getStatusBarNotification();


        row.inflateGuts();
        row.setGutsView(item);
        row.setGutsView(item);
        row.setTag(sbn.getPackageName());
        row.setTag(sbn.getPackageName());
        row.getGuts().setClosedListener((NotificationGuts g) -> {
        row.getGuts().setClosedListener((NotificationGuts g) -> {
@@ -176,6 +176,7 @@ public class NotificationGutsManager implements Dumpable {
        });
        });


        View gutsView = item.getGutsView();
        View gutsView = item.getGutsView();
        try {
            if (gutsView instanceof NotificationSnooze) {
            if (gutsView instanceof NotificationSnooze) {
                initializeSnoozeView(row, (NotificationSnooze) gutsView);
                initializeSnoozeView(row, (NotificationSnooze) gutsView);
            } else if (gutsView instanceof AppOpsInfo) {
            } else if (gutsView instanceof AppOpsInfo) {
@@ -183,6 +184,11 @@ public class NotificationGutsManager implements Dumpable {
            } else if (gutsView instanceof NotificationInfo) {
            } else if (gutsView instanceof NotificationInfo) {
                initializeNotificationInfo(row, (NotificationInfo) gutsView);
                initializeNotificationInfo(row, (NotificationInfo) gutsView);
            }
            }
            return true;
        } catch (Exception e) {
            Log.e(TAG, "error binding guts", e);
            return false;
        }
    }
    }


    /**
    /**
@@ -240,7 +246,7 @@ public class NotificationGutsManager implements Dumpable {
    @VisibleForTesting
    @VisibleForTesting
    void initializeNotificationInfo(
    void initializeNotificationInfo(
            final ExpandableNotificationRow row,
            final ExpandableNotificationRow row,
            NotificationInfo notificationInfoView) {
            NotificationInfo notificationInfoView) throws Exception {
        NotificationGuts guts = row.getGuts();
        NotificationGuts guts = row.getGuts();
        StatusBarNotification sbn = row.getStatusBarNotification();
        StatusBarNotification sbn = row.getStatusBarNotification();
        String packageName = sbn.getPackageName();
        String packageName = sbn.getPackageName();
@@ -269,7 +275,6 @@ public class NotificationGutsManager implements Dumpable {
            };
            };
        }
        }


        try {
        notificationInfoView.bindNotification(
        notificationInfoView.bindNotification(
                pmUser,
                pmUser,
                iNotificationManager,
                iNotificationManager,
@@ -284,9 +289,7 @@ public class NotificationGutsManager implements Dumpable {
                row.getIsNonblockable(),
                row.getIsNonblockable(),
                isForBlockingHelper,
                isForBlockingHelper,
                row.getEntry().userSentiment == USER_SENTIMENT_NEGATIVE);
                row.getEntry().userSentiment == USER_SENTIMENT_NEGATIVE);
        } catch (RemoteException e) {

            Log.e(TAG, e.toString());
        }
    }
    }


    /**
    /**
@@ -356,8 +359,15 @@ public class NotificationGutsManager implements Dumpable {
                    true /* resetMenu */);
                    true /* resetMenu */);
            return false;
            return false;
        }
        }
        bindGuts(row, menuItem);

        row.inflateGuts();
        NotificationGuts guts = row.getGuts();
        NotificationGuts guts = row.getGuts();
        mNotificationGutsExposed = guts;
        if (!bindGuts(row, menuItem)) {
            // exception occurred trying to fill in all the data, bail.
            return false;
        }



        // Assume we are a status_bar_notification_row
        // Assume we are a status_bar_notification_row
        if (guts == null) {
        if (guts == null) {
@@ -378,9 +388,6 @@ public class NotificationGutsManager implements Dumpable {
                            + "window");
                            + "window");
                    return;
                    return;
                }
                }
                closeAndSaveGuts(true /* removeLeavebehind */, true /* force */,
                        true /* removeControls */, -1 /* x */, -1 /* y */,
                        false /* resetMenu */);
                guts.setVisibility(View.VISIBLE);
                guts.setVisibility(View.VISIBLE);


                final boolean needsFalsingProtection =
                final boolean needsFalsingProtection =
@@ -396,7 +403,6 @@ public class NotificationGutsManager implements Dumpable {


                row.closeRemoteInput();
                row.closeRemoteInput();
                mListContainer.onHeightChanged(row, true /* needsAnimation */);
                mListContainer.onHeightChanged(row, true /* needsAnimation */);
                mNotificationGutsExposed = guts;
                mGutsMenuItem = menuItem;
                mGutsMenuItem = menuItem;
            }
            }
        });
        });