[ANR] Read device icon on the main thread

-com.android.systemui - Main thread blockedat android.provider.MediaStore$Images$Media.getBitmapat com.android.settingslib.bluetooth.BluetoothUtils.getBtDrawableWithDescrip...
-move it to background thread

Bug: 184924171
Test: atest MediaOutputAdapterTest
Change-Id: I50908fbd429d366ec794511046c8f62dfa80b6ac
This commit is contained in:
Tim Peng
2021-05-07 21:33:17 +08:00
parent 9969241092
commit 8ffe58d794

View File

@@ -24,6 +24,7 @@ import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
@@ -41,6 +42,7 @@ import androidx.recyclerview.widget.RecyclerView;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.media.MediaDevice;
import com.android.settingslib.utils.ThreadUtils;
import com.android.systemui.R;
import com.android.systemui.animation.Interpolators;
@@ -116,6 +118,7 @@ public abstract class MediaOutputBaseAdapter extends
final View mDivider;
final View mBottomDivider;
final CheckBox mCheckBox;
private String mDeviceId;
MediaDeviceBaseViewHolder(View view) {
super(view);
@@ -134,8 +137,17 @@ public abstract class MediaOutputBaseAdapter extends
}
void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin) {
mTitleIcon.setImageIcon(mController.getDeviceIconCompat(device).toIcon(mContext));
setMargin(topMargin, bottomMargin);
mDeviceId = device.getId();
ThreadUtils.postOnBackgroundThread(() -> {
Icon icon = mController.getDeviceIconCompat(device).toIcon(mContext);
ThreadUtils.postOnMainThread(() -> {
if (!TextUtils.equals(mDeviceId, device.getId())) {
return;
}
mTitleIcon.setImageIcon(icon);
setMargin(topMargin, bottomMargin);
});
});
}
void onBind(int customizedItem, boolean topMargin, boolean bottomMargin) {