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

Commit 40c82423 authored by Valentin Iftime's avatar Valentin Iftime Committed by Automerger Merge Worker
Browse files

[DO NOT MERGE] Prevent RemoteViews crashing SystemUi am: cfc0b344

parents 749b03d2 cfc0b344
Loading
Loading
Loading
Loading
+29 −10
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import android.content.pm.LauncherActivityInfo;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.os.Bundle;
@@ -250,6 +251,14 @@ public class AppWidgetHostView extends FrameLayout {
            super.onLayout(changed, left, top, right, bottom);
        } catch (final RuntimeException e) {
            Log.e(TAG, "Remote provider threw runtime exception, using error view instead.", e);
            handleViewError();
        }
    }

    /**
     * Remove bad view and replace with error message view
     */
    private void handleViewError() {
        removeViewInLayout(mView);
        View child = getErrorView();
        prepareView(child);
@@ -261,7 +270,6 @@ public class AppWidgetHostView extends FrameLayout {
        mView = child;
        mViewMode = VIEW_MODE_ERROR;
    }
    }

    /**
     * Provide guidance about the size of this widget to the AppWidgetManager. The widths and
@@ -725,4 +733,15 @@ public class AppWidgetHostView extends FrameLayout {
            }
        };
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        try {
            super.dispatchDraw(canvas);
        } catch (Exception e) {
            // Catch draw exceptions that may be caused by RemoteViews
            Log.e(TAG, "Drawing view failed: " + e);
            post(this::handleViewError);
        }
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ import android.widget.ImageView;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.ContrastColorUtil;
import com.android.internal.widget.CachingIconView;
import com.android.systemui.Dependency;
@@ -1612,7 +1613,8 @@ public class ExpandableNotificationRow extends ActivatableNotificationView
            OnAppOpsClickListener onAppOpsClickListener,
            FalsingManager falsingManager,
            StatusBarStateController statusBarStateController,
            PeopleNotificationIdentifier peopleNotificationIdentifier) {
            PeopleNotificationIdentifier peopleNotificationIdentifier,
            IStatusBarService statusBarService) {
        mAppName = appName;
        if (mMenuRow == null) {
            mMenuRow = new NotificationMenuRow(mContext, peopleNotificationIdentifier);
+8 −2
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@ import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENAB
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -69,6 +71,7 @@ public class ExpandableNotificationRowController {
    private final FalsingManager mFalsingManager;
    private final boolean mAllowLongPress;
    private final PeopleNotificationIdentifier mPeopleNotificationIdentifier;
    private final IStatusBarService mStatusBarService;

    @Inject
    public ExpandableNotificationRowController(ExpandableNotificationRow view,
@@ -84,7 +87,8 @@ public class ExpandableNotificationRowController {
            NotificationGutsManager notificationGutsManager,
            @Named(ALLOW_NOTIFICATION_LONG_PRESS_NAME) boolean allowLongPress,
            @DismissRunnable Runnable onDismissRunnable, FalsingManager falsingManager,
            PeopleNotificationIdentifier peopleNotificationIdentifier) {
            PeopleNotificationIdentifier peopleNotificationIdentifier,
            IStatusBarService statusBarService) {
        mView = view;
        mActivatableNotificationViewController = activatableNotificationViewController;
        mMediaManager = mediaManager;
@@ -105,6 +109,7 @@ public class ExpandableNotificationRowController {
        mAllowLongPress = allowLongPress;
        mFalsingManager = falsingManager;
        mPeopleNotificationIdentifier = peopleNotificationIdentifier;
        mStatusBarService = statusBarService;
    }

    /**
@@ -125,7 +130,8 @@ public class ExpandableNotificationRowController {
                mOnAppOpsClickListener,
                mFalsingManager,
                mStatusBarStateController,
                mPeopleNotificationIdentifier
                mPeopleNotificationIdentifier,
                mStatusBarService
        );
        mView.setOnDismissRunnable(mOnDismissRunnable);
        mView.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+37 −0
Original line number Diff line number Diff line
@@ -24,9 +24,11 @@ import android.annotation.Nullable;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.RemoteException;
import android.provider.Settings;
import android.service.notification.StatusBarNotification;
import android.util.ArrayMap;
@@ -45,6 +47,7 @@ import android.widget.LinearLayout;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.R;
import com.android.systemui.statusbar.MediaTransferManager;
import com.android.systemui.statusbar.RemoteInputController;
@@ -126,6 +129,8 @@ public class NotificationContentView extends FrameLayout {
    private RemoteInputController mRemoteInputController;
    private Runnable mExpandedVisibleListener;
    private PeopleNotificationIdentifier mPeopleIdentifier;
    private IStatusBarService mStatusBarService;

    /**
     * List of listeners for when content views become inactive (i.e. not the showing view).
     */
@@ -182,6 +187,7 @@ public class NotificationContentView extends FrameLayout {
        mMediaTransferManager = new MediaTransferManager(getContext());
        mSmartReplyConstants = Dependency.get(SmartReplyConstants.class);
        mSmartReplyController = Dependency.get(SmartReplyController.class);
        mStatusBarService = Dependency.get(IStatusBarService.class);
        initView();
    }

@@ -1965,4 +1971,35 @@ public class NotificationContentView extends FrameLayout {
        }
        return Notification.COLOR_INVALID;
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        try {
            super.dispatchDraw(canvas);
        } catch (Exception e) {
            // Catch draw exceptions that may be caused by RemoteViews
            Log.e(TAG, "Drawing view failed: " + e);
            cancelNotification(e);
        }
    }

    private void cancelNotification(Exception exception) {
        try {
            setVisibility(GONE);
            if (mStatusBarService != null) {
                // report notification inflation errors back up
                // to notification delegates
                mStatusBarService.onNotificationError(
                        mStatusBarNotification.getPackageName(),
                        mStatusBarNotification.getTag(),
                        mStatusBarNotification.getId(),
                        mStatusBarNotification.getUid(),
                        mStatusBarNotification.getInitialPid(),
                        exception.getMessage(),
                        mStatusBarNotification.getUser().getIdentifier());
            }
        } catch (RemoteException ex) {
            Log.e(TAG, "cancelNotification failed: " + ex);
        }
    }
}
+3 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import android.testing.TestableLooper;
import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
import androidx.test.filters.SmallTest;

import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.util.NotificationMessagingUtil;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
@@ -252,7 +253,8 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase {
                                true,
                                null,
                                mFalsingManager,
                                mPeopleNotificationIdentifier
                                mPeopleNotificationIdentifier,
                                mock(IStatusBarService.class)
                        ));

        when(mNotificationRowComponentBuilder.activatableNotificationView(any()))
Loading