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

Commit 2150ce56 authored by Rhed Jao's avatar Rhed Jao
Browse files

Fix BugreportReceiverTest

- Implements a local binder and #onBind in the service to return the
  service instance.
- Mocks BugreportManager in the service to avoid service interacting
  with the dumpstate.
- Fixes dialog name field did not disable after service is finished.
- Fixes screenshot did not remove if the name is empty.
- Extends screenshot delay timeout in tests.
- Fine tune the UiBot to fit new bugreport notification.
- Removes obsolete cases in the tests.

Bug: 143130523
Bug: 175287931
Test: atest BugreportReceiverTest
Change-Id: Iae89206da1d08a10891503869bbbf1ce18d4e31f
Merged-In: Iae89206da1d08a10891503869bbbf1ce18d4e31f
parent 52e7d23f
Loading
Loading
Loading
Loading
+54 −12
Original line number Diff line number Diff line
@@ -47,6 +47,7 @@ import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.BugreportManager;
import android.os.BugreportManager.BugreportCallback;
import android.os.BugreportManager.BugreportCallback.BugreportErrorCode;
@@ -186,7 +187,7 @@ public class BugreportProgressService extends Service {
    static final int SCREENSHOT_DELAY_SECONDS = 3;

    /** System property where dumpstate stores last triggered bugreport id */
    private static final String PROPERTY_LAST_ID = "dumpstate.last_id";
    static final String PROPERTY_LAST_ID = "dumpstate.last_id";

    private static final String BUGREPORT_SERVICE = "bugreport";

@@ -233,7 +234,7 @@ public class BugreportProgressService extends Service {

    private File mBugreportsDir;

    private BugreportManager mBugreportManager;
    @VisibleForTesting BugreportManager mBugreportManager;

    /**
     * id of the notification used to set service on foreground.
@@ -248,6 +249,11 @@ public class BugreportProgressService extends Service {
     */
    private boolean mTakingScreenshot;

    /**
     * The delay timeout before taking a screenshot.
     */
    @VisibleForTesting int mScreenshotDelaySec = SCREENSHOT_DELAY_SECONDS;

    @GuardedBy("sNotificationBundle")
    private static final Bundle sNotificationBundle = new Bundle();

@@ -282,6 +288,7 @@ public class BugreportProgressService extends Service {
                        mContext.getString(R.string.bugreport_notification_channel),
                        isTv(this) ? NotificationManager.IMPORTANCE_DEFAULT
                                : NotificationManager.IMPORTANCE_LOW));
        mBugreportManager = mContext.getSystemService(BugreportManager.class);
    }

    @Override
@@ -305,7 +312,7 @@ public class BugreportProgressService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
        return new LocalBinder();
    }

    @Override
@@ -375,6 +382,7 @@ public class BugreportProgressService extends Service {
            mInfo.renameScreenshots();
            synchronized (mLock) {
                sendBugreportFinishedBroadcastLocked();
                mMainThreadHandler.post(() -> mInfoDialog.onBugreportFinished(mInfo));
            }
        }

@@ -627,8 +635,6 @@ public class BugreportProgressService extends Service {
            }
        }

        mBugreportManager = (BugreportManager) mContext.getSystemService(
                Context.BUGREPORT_SERVICE);
        final Executor executor = ActivityThread.currentActivityThread().getExecutor();

        Log.i(TAG, "bugreport type = " + bugreportType
@@ -888,12 +894,12 @@ public class BugreportProgressService extends Service {
        collapseNotificationBar();
        final String msg = mContext.getResources()
                .getQuantityString(com.android.internal.R.plurals.bugreport_countdown,
                        SCREENSHOT_DELAY_SECONDS, SCREENSHOT_DELAY_SECONDS);
                        mScreenshotDelaySec, mScreenshotDelaySec);
        Log.i(TAG, msg);
        // Show a toast just once, otherwise it might be captured in the screenshot.
        Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();

        takeScreenshot(id, SCREENSHOT_DELAY_SECONDS);
        takeScreenshot(id, mScreenshotDelaySec);
    }

    /**
@@ -1622,6 +1628,16 @@ public class BugreportProgressService extends Service {
                || c == '_' || c == '-';
    }

    /**
     * A local binder with interface to return an instance of BugreportProgressService for the
     * purpose of testing.
     */
    final class LocalBinder extends Binder {
        @VisibleForTesting BugreportProgressService getService() {
            return BugreportProgressService.this;
        }
    }

    /**
     * Helper class encapsulating the UI elements and logic used to display a dialog where user
     * can change the details of a bugreport.
@@ -1751,6 +1767,22 @@ public class BugreportProgressService extends Service {
            }
        }

        /**
         * Notifies the dialog that the bugreport has finished so it disables the {@code name}
         * field.
         * <p>Once the bugreport is finished dumpstate has already generated the final files, so
         * changing the name would have no effect.
         */
        void onBugreportFinished(BugreportInfo info) {
            if (mId == info.id && mInfoName != null) {
                mInfoName.setEnabled(false);
                mInfoName.setText(null);
                if (!TextUtils.isEmpty(info.getName())) {
                    mInfoName.setText(info.getName());
                }
            }
        }

        void cancel() {
            if (mDialog != null) {
                mDialog.cancel();
@@ -1995,12 +2027,21 @@ public class BugreportProgressService extends Service {
                Log.i(TAG, "Deleting empty bugreport file: " + bugreportFile);
                bugreportFile.delete();
            }
            for (File file : screenshotFiles) {
                if (file.length() == 0) {
            deleteEmptyScreenshots();
        }

        /**
         * Deletes empty screenshot files.
         */
        private void deleteEmptyScreenshots() {
            screenshotFiles.removeIf(file -> {
                final long length = file.length();
                if (length == 0) {
                    Log.i(TAG, "Deleting empty screenshot file: " + file);
                    file.delete();
                }
            }
                return length == 0;
            });
        }

        /**
@@ -2008,7 +2049,8 @@ public class BugreportProgressService extends Service {
         * {@code initialName} if user has changed it.
         */
        void renameScreenshots() {
            if (TextUtils.isEmpty(name)) {
            deleteEmptyScreenshots();
            if (TextUtils.isEmpty(name) || screenshotFiles.isEmpty()) {
                return;
            }
            final List<File> renamedFiles = new ArrayList<>(screenshotFiles.size());