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

Commit 40ac84e6 authored by Wei Huang's avatar Wei Huang Committed by Android (Google) Code Review
Browse files

Merge "Fix NPE while flipping through pictures." into ics-mr0

parents 209a9163 1b2cfc14
Loading
Loading
Loading
Loading
+12 −10
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

package com.android.gallery3d.ui;

import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.RectF;

import com.android.gallery3d.app.GalleryContext;
import com.android.gallery3d.common.Utils;
import com.android.gallery3d.data.DecodeUtils;
@@ -24,10 +28,6 @@ import com.android.gallery3d.util.ThreadPool;
import com.android.gallery3d.util.ThreadPool.CancelListener;
import com.android.gallery3d.util.ThreadPool.JobContext;

import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.RectF;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -55,17 +55,20 @@ public class TileImageView extends GLView {
     *               --> RECYCLED - by recycleTile)
     *      DECODING --> RECYCLING - by recycleTile()
     *               --> DECODED  - by decodeTile()
     *               --> DECODE_FAIL - by decodeTile()
     *      RECYCLING --> RECYCLED - by decodeTile()
     *      DECODED --> ACTIVATED - (after the decoded bitmap is uploaded)
     *      DECODED --> RECYCLED - by recycleTile()
     *      DECODE_FAIL -> RECYCLED - by recycleTile()
     *      RECYCLED --> ACTIVATED - by obtainTile()
     */
    private static final int STATE_ACTIVATED = 0x01;
    private static final int STATE_IN_QUEUE = 0x02;
    private static final int STATE_DECODING = 0x04;
    private static final int STATE_DECODED = 0x08;
    private static final int STATE_RECYCLING = 0x10;
    private static final int STATE_RECYCLED = 0x20;
    private static final int STATE_DECODE_FAIL = 0x10;
    private static final int STATE_RECYCLING = 0x20;
    private static final int STATE_RECYCLED = 0x40;

    private Model mModel;
    protected BitmapTexture mBackupImage;
@@ -435,7 +438,7 @@ public class TileImageView extends GLView {
                mRecycledQueue.push(tile);
                return false;
            }
            tile.mTileState = STATE_DECODED;
            tile.mTileState = decodeComplete ? STATE_DECODED : STATE_DECODE_FAIL;
            return decodeComplete;
        }
    }
@@ -526,7 +529,7 @@ public class TileImageView extends GLView {
                    } else {
                        mRenderComplete = false;
                    }
                } else {
                } else if (tile.mTileState != STATE_DECODE_FAIL){
                    mRenderComplete = false;
                    queueForDecode(tile);
                }
@@ -603,11 +606,10 @@ public class TileImageView extends GLView {
            try {
                mDecodedTile = DecodeUtils.ensureGLCompatibleBitmap(mModel.getTile(
                        mTileLevel, mX - borderLength, mY - borderLength, tileLength));
                return mDecodedTile != null;
            } catch (Throwable t) {
                Log.w(TAG, "fail to decode tile", t);
                return false;
            }
            return mDecodedTile != null;
        }

        @Override
+10 −2
Original line number Diff line number Diff line
@@ -16,8 +16,6 @@

package com.android.gallery3d.ui;

import com.android.gallery3d.common.Utils;

import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
@@ -25,7 +23,10 @@ import android.graphics.BitmapRegionDecoder;
import android.graphics.Canvas;
import android.graphics.Rect;

import com.android.gallery3d.common.Utils;

public class TileImageViewAdapter implements TileImageView.Model {
    private static final String TAG = "TileImageViewAdapter";
    protected BitmapRegionDecoder mRegionDecoder;
    protected int mImageWidth;
    protected int mImageHeight;
@@ -80,6 +81,8 @@ public class TileImageViewAdapter implements TileImageView.Model {

    @Override
    public synchronized Bitmap getTile(int level, int x, int y, int length) {
        if (mRegionDecoder == null) return null;

        Rect region = mRegionRect;
        Rect intersectRect = mIntersectRect;
        region.set(x, y, x + (length << level), y + (length << level));
@@ -104,6 +107,11 @@ public class TileImageViewAdapter implements TileImageView.Model {
        // If so, we fill black pixels on it.
        if (intersectRect.equals(region)) return bitmap;

        if (bitmap == null) {
            Log.w(TAG, "fail in decoding region");
            return null;
        }

        Bitmap tile = Bitmap.createBitmap(length, length, Config.ARGB_8888);
        Canvas canvas = new Canvas(tile);
        canvas.drawBitmap(bitmap,