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

Commit 6467e277 authored by bvineeth's avatar bvineeth
Browse files

Optimize memory used for creating saved recording notification

Updated the SavedRecording object to save the icon for notification
thumbnail, instead of bitmap, as bitmap is later converted to Icon.
Updated the size of the thumbnail to match the size required for the
notification, to avoid multiple resizings.

memory profile -
before http://screen/mDN2iC5SsFDYdi5 29MB
after http://screen/AxhE9HoAWqwGyqG 10MB

Test: manually tested
Fixes: http://b/278223891
Flag: None
Change-Id: I4f65a8ed542819d741968ed0e44d430307369fd0
parent d9d1cada
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.media.MediaRecorder;
import android.net.Uri;
@@ -379,10 +378,9 @@ public class RecordingService extends Service implements ScreenMediaRecorderList
                .addExtras(extras);

        // Add thumbnail if available
        Bitmap thumbnailBitmap = recording.getThumbnail();
        if (thumbnailBitmap != null) {
        if (recording.getThumbnail() != null) {
            Notification.BigPictureStyle pictureStyle = new Notification.BigPictureStyle()
                    .bigPicture(thumbnailBitmap)
                    .bigPicture(recording.getThumbnail())
                    .showBigPictureWhenCollapsed(true);
            builder.setStyle(pictureStyle);
        }
+24 −7
Original line number Diff line number Diff line
@@ -23,10 +23,12 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC;
import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.MIC_AND_INTERNAL;

import android.annotation.Nullable;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaCodec;
@@ -51,6 +53,7 @@ import android.util.Size;
import android.view.Surface;
import android.view.WindowManager;

import com.android.internal.R;
import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget;

import java.io.Closeable;
@@ -361,13 +364,26 @@ public class ScreenMediaRecorder extends MediaProjection.Callback {
        Files.copy(mTempVideoFile.toPath(), os);
        os.close();
        if (mTempAudioFile != null) mTempAudioFile.delete();
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        Size size = new Size(metrics.widthPixels, metrics.heightPixels);
        SavedRecording recording = new SavedRecording(itemUri, mTempVideoFile, size);
        SavedRecording recording = new SavedRecording(
                itemUri, mTempVideoFile, getRequiredThumbnailSize());
        mTempVideoFile.delete();
        return recording;
    }

    /**
     * Returns the required {@code Size} of the thumbnail.
     */
    private Size getRequiredThumbnailSize() {
        boolean isLowRam = ActivityManager.isLowRamDeviceStatic();
        int thumbnailIconHeight = mContext.getResources().getDimensionPixelSize(isLowRam
                ? R.dimen.notification_big_picture_max_height_low_ram
                : R.dimen.notification_big_picture_max_height);
        int thumbnailIconWidth = mContext.getResources().getDimensionPixelSize(isLowRam
                ? R.dimen.notification_big_picture_max_width_low_ram
                : R.dimen.notification_big_picture_max_width);
        return new Size(thumbnailIconWidth, thumbnailIconHeight);
    }

    /**
     * Release the resources without saving the data
     */
@@ -386,13 +402,14 @@ public class ScreenMediaRecorder extends MediaProjection.Callback {
    public class SavedRecording {

        private Uri mUri;
        private Bitmap mThumbnailBitmap;
        private Icon mThumbnailIcon;

        protected SavedRecording(Uri uri, File file, Size thumbnailSize) {
            mUri = uri;
            try {
                mThumbnailBitmap = ThumbnailUtils.createVideoThumbnail(
                Bitmap thumbnailBitmap = ThumbnailUtils.createVideoThumbnail(
                        file, thumbnailSize, null);
                mThumbnailIcon = Icon.createWithBitmap(thumbnailBitmap);
            } catch (IOException e) {
                Log.e(TAG, "Error creating thumbnail", e);
            }
@@ -402,8 +419,8 @@ public class ScreenMediaRecorder extends MediaProjection.Callback {
            return mUri;
        }

        public @Nullable Bitmap getThumbnail() {
            return mThumbnailBitmap;
        public @Nullable Icon getThumbnail() {
            return mThumbnailIcon;
        }
    }