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

Commit dd4e7318 authored by Ivan Chiang's avatar Ivan Chiang
Browse files

Create a separate HandlerThread to use for I/O operations

If we use main thread for I/O operations may have ANR issue.
Create a separate HandlerThread to avoid this.

Test: atest DocumentsUIGoogleTests:com.android.documentsui.archives.ReadableArchiveTest
Change-Id: I91748badfb1fd4ccda3f27a5c83a14591a4d9474
Fix: 129650074
parent 8bd8cfd9
Loading
Loading
Loading
Loading
+18 −7
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.documentsui.archives;
package com.android.documentsui.archives;


import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;

import static com.android.documentsui.base.SharedMinimal.DEBUG;
import static com.android.documentsui.base.SharedMinimal.DEBUG;


import android.content.Context;
import android.content.Context;
@@ -28,7 +29,7 @@ import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.CancellationSignal;
import android.os.FileUtils;
import android.os.FileUtils;
import android.os.Handler;
import android.os.Handler;
import android.os.Looper;
import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
import android.os.ParcelFileDescriptor;
import android.os.storage.StorageManager;
import android.os.storage.StorageManager;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract;
@@ -38,6 +39,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import androidx.core.util.Preconditions;
import androidx.core.util.Preconditions;


import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.compressors.CompressorException;
import org.apache.commons.compress.utils.IOUtils;


import java.io.File;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileNotFoundException;
@@ -50,11 +55,6 @@ import java.util.Enumeration;
import java.util.List;
import java.util.List;
import java.util.Stack;
import java.util.Stack;


import org.apache.commons.compress.archivers.ArchiveEntry;
import org.apache.commons.compress.archivers.ArchiveException;
import org.apache.commons.compress.compressors.CompressorException;
import org.apache.commons.compress.utils.IOUtils;

/**
/**
 * Provides basic implementation for extracting and accessing
 * Provides basic implementation for extracting and accessing
 * files within archives exposed by a document provider.
 * files within archives exposed by a document provider.
@@ -67,6 +67,8 @@ public class ReadableArchive extends Archive {
    private final StorageManager mStorageManager;
    private final StorageManager mStorageManager;
    private final ArchiveHandle mArchiveHandle;
    private final ArchiveHandle mArchiveHandle;
    private final ParcelFileDescriptor mParcelFileDescriptor;
    private final ParcelFileDescriptor mParcelFileDescriptor;
    private final Handler mHandler;
    private HandlerThread mHandlerThread;


    private ReadableArchive(
    private ReadableArchive(
            Context context,
            Context context,
@@ -170,6 +172,10 @@ public class ReadableArchive extends Archive {


            parentList.add(entry);
            parentList.add(entry);
        }
        }

        mHandlerThread = new HandlerThread(TAG);
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
    }
    }


    /**
    /**
@@ -270,7 +276,7 @@ public class ReadableArchive extends Archive {


        try {
        try {
            return mStorageManager.openProxyFileDescriptor(MODE_READ_ONLY,
            return mStorageManager.openProxyFileDescriptor(MODE_READ_ONLY,
                    new Proxy(mArchiveHandle, entry), new Handler(Looper.getMainLooper()));
                    new Proxy(mArchiveHandle, entry), mHandler);
        } catch (IOException e) {
        } catch (IOException e) {
            throw new IllegalStateException(e);
            throw new IllegalStateException(e);
        } catch (ArchiveException e) {
        } catch (ArchiveException e) {
@@ -353,5 +359,10 @@ public class ReadableArchive extends Archive {
             */
             */
            IOUtils.closeQuietly(mParcelFileDescriptor);
            IOUtils.closeQuietly(mParcelFileDescriptor);
        }
        }

        if (mHandlerThread != null) {
            mHandlerThread.quitSafely();
            mHandlerThread = null;
        }
    }
    }
}
}