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

Commit c41fdd6f authored by nicolasroard's avatar nicolasroard Committed by Android (Google) Code Review
Browse files

Merge "Fix icons rendering to be consistent" into gb-ub-photos-carlsbad

parents 0bdafb19 a0cd22d2
Loading
Loading
Loading
Loading
+5 −24
Original line number Diff line number Diff line
@@ -39,29 +39,10 @@

    </HorizontalScrollView>

    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageButton
    <com.android.gallery3d.filtershow.category.IconView
            android:id="@+id/addButton"
            android:layout_width="@dimen/category_panel_height"
            android:layout_height="@dimen/category_panel_height"
                android:src="@drawable/filtershow_add"
                style="?android:attr/borderlessButtonStyle"
                android:scaleType="fitCenter"
                android:padding="16dp"
                android:layout_marginBottom="6dp"
                android:layout_gravity="center"/>

        <TextView
                android:id="@+id/addButtonText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="4dp"
                android:layout_gravity="bottom|center"/>

    </FrameLayout>
            android:src="@drawable/filtershow_add"/>

</LinearLayout>
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -58,6 +58,10 @@ public class Action implements RenderingRequestCaller {
        this(context, representation, CROP_VIEW);
    }

    public int getType() {
        return mType;
    }

    public FilterRepresentation getRepresentation() {
        return mRepresentation;
    }
+3 −5
Original line number Diff line number Diff line
@@ -37,8 +37,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener {

    private int mCurrentAdapter = MainPanel.LOOKS;
    private CategoryAdapter mAdapter;
    private ImageButton mAddButton;
    private TextView mAddButtonText;
    private IconView mAddButton;

    public void setAdapter(int value) {
        mCurrentAdapter = value;
@@ -114,8 +113,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener {
            mAdapter.setContainer(panel);
        }

        mAddButton = (ImageButton) main.findViewById(R.id.addButton);
        mAddButtonText = (TextView) main.findViewById(R.id.addButtonText);
        mAddButton = (IconView) main.findViewById(R.id.addButton);
        if (mAddButton != null) {
            mAddButton.setOnClickListener(this);
            updateAddButtonVisibility();
@@ -141,7 +139,7 @@ public class CategoryPanel extends Fragment implements View.OnClickListener {
        if (activity.isShowingImageStatePanel() && mAdapter.showAddButton()) {
            mAddButton.setVisibility(View.VISIBLE);
            if (mAdapter != null) {
                mAddButtonText.setText(mAdapter.getAddButtonText());
                mAddButton.setText(mAdapter.getAddButtonText());
            }
        } else {
            mAddButton.setVisibility(View.GONE);
+17 −97
Original line number Diff line number Diff line
@@ -23,16 +23,13 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.android.gallery3d.R;
import com.android.gallery3d.filtershow.FilterShowActivity;
import com.android.gallery3d.filtershow.filters.FilterRepresentation;
import com.android.gallery3d.filtershow.ui.SelectionRenderer;

public class CategoryView extends View
public class CategoryView extends IconView
        implements View.OnClickListener, SwipableView{

    private static final String LOGTAG = "CategoryView";
@@ -40,17 +37,11 @@ public class CategoryView extends View
    public static final int HORIZONTAL = 1;
    private Paint mPaint = new Paint();
    private Action mAction;
    private Rect mTextBounds = new Rect();
    private int mMargin = 16;
    private int mTextSize = 32;
    private int mTextColor;
    private int mBackgroundColor;
    private Paint mSelectPaint;
    CategoryAdapter mAdapter;
    private int mSelectionStroke;
    private Paint mBorderPaint;
    private int mBorderStroke;
    private int mOrientation = VERTICAL;
    private float mStartTouchY = 0;
    private float mDeleteSlope = 20;

@@ -58,11 +49,7 @@ public class CategoryView extends View
        super(context);
        setOnClickListener(this);
        Resources res = getResources();
        mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background);
        mTextColor = res.getColor(R.color.filtershow_categoryview_text);
        mSelectionStroke = res.getDimensionPixelSize(R.dimen.thumbnail_margin);
        mTextSize = res.getDimensionPixelSize(R.dimen.category_panel_text_size);
        mMargin = res.getDimensionPixelOffset(R.dimen.category_panel_margin);
        mSelectPaint = new Paint();
        mSelectPaint.setStyle(Paint.Style.FILL);
        mSelectPaint.setColor(res.getColor(R.color.filtershow_category_selection));
@@ -71,103 +58,40 @@ public class CategoryView extends View
        mBorderStroke = mSelectionStroke / 3;
    }

    private void computeTextPosition(String text) {
        if (text == null) {
            return;
        }
        mPaint.setTextSize(mTextSize);
        if (mOrientation == VERTICAL) {
            text = text.toUpperCase();
            // TODO: set this in xml
            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
        }
        mPaint.getTextBounds(text, 0, text.length(), mTextBounds);
    }

    public void drawText(Canvas canvas, String text) {
        if (text == null) {
            return;
        }
        float textWidth = mPaint.measureText(text);
        int x = (int) (canvas.getWidth() - textWidth - mMargin);
        if (mOrientation == HORIZONTAL) {
            x = (int) ((canvas.getWidth() - textWidth) / 2.0f);
        }
        if (x < 0) {
            // If the text takes more than the view width,
            // justify to the left.
            x = mMargin;
        }
        int y = canvas.getHeight() - mMargin;
        canvas.drawText(text, x, y, mPaint);
    }

    @Override
    public CharSequence getContentDescription () {
        if (mAction != null) {
            return mAction.getName();
    public boolean isHalfImage() {
        if (mAction == null) {
            return false;
        }
        return null;
        if (mAction.getType() == Action.CROP_VIEW) {
            return true;
        }
        return false;
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawColor(mBackgroundColor);
        if (mAction != null) {
            mPaint.reset();
            mPaint.setAntiAlias(true);
            computeTextPosition(mAction.getName());
            if (mAction.getImage() == null) {
                mAction.setImageFrame(new Rect(0, 0, getWidth(), getHeight()), mOrientation);
                mAction.setImageFrame(new Rect(0, 0, getWidth(), getHeight()), getOrientation());
            } else {
                Bitmap bitmap = mAction.getImage();
                canvas.save();
                Rect clipRect = new Rect(mSelectionStroke, mSelectionStroke,
                        getWidth() - mSelectionStroke,
                        getHeight() - 2* mMargin - mTextSize);
                int offsetx = 0;
                int offsety = 0;
                if (mOrientation == HORIZONTAL) {
                    canvas.clipRect(clipRect);
                    offsetx = - (bitmap.getWidth() - clipRect.width()) / 2;
                    offsety = - (bitmap.getHeight() - clipRect.height()) / 2;
                }
                canvas.drawBitmap(bitmap, offsetx, offsety, mPaint);
                canvas.restore();
                setBitmap(mAction.getImage());
            }
        }
        super.onDraw(canvas);
        if (mAdapter.isSelected(this)) {
                    if (mOrientation == HORIZONTAL) {
                        SelectionRenderer.drawSelection(canvas, 0, 0,
                                getWidth(), getHeight() - mMargin - mTextSize,
                                mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint);
                    } else {
            SelectionRenderer.drawSelection(canvas, 0, 0,
                                Math.min(bitmap.getWidth(), getWidth()),
                                Math.min(bitmap.getHeight(), getHeight()),
                    getWidth(), getHeight(),
                    mSelectionStroke, mSelectPaint, mBorderStroke, mBorderPaint);
        }
    }
            }
            mPaint.setColor(mBackgroundColor);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(3);
            drawText(canvas, mAction.getName());
            mPaint.setColor(mTextColor);
            mPaint.setStyle(Paint.Style.FILL);
            mPaint.setStrokeWidth(1);
            drawText(canvas, mAction.getName());
        }
    }

    public void setAction(Action action, CategoryAdapter adapter) {
        mAction = action;
        setText(mAction.getName());
        mAdapter = adapter;
        invalidate();
    }

    public FilterRepresentation getRepresentation() {
        return mAction.getRepresentation();
    }

    @Override
    public void onClick(View view) {
        FilterShowActivity activity = (FilterShowActivity) getContext();
@@ -175,10 +99,6 @@ public class CategoryView extends View
        mAdapter.setSelected(this);
    }

    public void setOrientation(int orientation) {
        mOrientation = orientation;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
+229 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.gallery3d.filtershow.category;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;
import com.android.gallery3d.R;

public class IconView extends View {

    public static final int VERTICAL = 0;
    public static final int HORIZONTAL = 1;

    private Paint mPaint = new Paint();
    private int mTextColor;
    private int mBackgroundColor;
    private int mMargin = 16;
    private int mOrientation = HORIZONTAL;
    private int mTextSize = 32;
    private Rect mTextBounds = new Rect();
    private Bitmap mBitmap;
    private Rect mBitmapBounds;
    private String mText;
    private boolean mUseOnlyDrawable = false;

    public IconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup(context);
        int bitmapRsc = attrs.getAttributeResourceValue(
                "http://schemas.android.com/apk/res/android", "src", 0);
        Resources res = context.getResources();
        Bitmap bitmap = BitmapFactory.decodeStream(res.openRawResource(bitmapRsc));
        mUseOnlyDrawable = true;
        setBitmap(bitmap);
    }

    public IconView(Context context) {
        super(context);
        setup(context);
    }

    private void setup(Context context) {
        Resources res = getResources();
        mTextColor = res.getColor(R.color.filtershow_categoryview_text);
        mBackgroundColor = res.getColor(R.color.filtershow_categoryview_background);
        mMargin = res.getDimensionPixelOffset(R.dimen.category_panel_margin);
        mTextSize = res.getDimensionPixelSize(R.dimen.category_panel_text_size);
    }

    protected void computeTextPosition(String text) {
        if (text == null) {
            return;
        }
        mPaint.setTextSize(mTextSize);
        if (getOrientation() == VERTICAL) {
            text = text.toUpperCase();
            // TODO: set this in xml
            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
        }
        mPaint.getTextBounds(text, 0, text.length(), mTextBounds);
    }

    protected void drawText(Canvas canvas, String text) {
        if (text == null) {
            return;
        }
        float textWidth = mPaint.measureText(text);
        int x = (int) (canvas.getWidth() - textWidth - 2*mMargin);
        if (mOrientation == HORIZONTAL) {
            x = (int) ((canvas.getWidth() - textWidth) / 2.0f);
        }
        if (x < 0) {
            // If the text takes more than the view width,
            // justify to the left.
            x = mMargin;
        }
        int y = canvas.getHeight() - 2*mMargin;
        canvas.drawText(text, x, y, mPaint);
    }

    protected void drawOutlinedText(Canvas canvas, String text) {
        mPaint.setColor(getBackgroundColor());
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(3);
        drawText(canvas, text);
        mPaint.setColor(getTextColor());
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeWidth(1);
        drawText(canvas, text);
    }

    public int getOrientation() {
        return mOrientation;
    }

    public void setOrientation(int orientation) {
        mOrientation = orientation;
    }

    public int getMargin() {
        return mMargin;
    }

    public int getTextSize() {
        return mTextSize;
    }

    public int getTextColor() {
        return mTextColor;
    }

    public int getBackgroundColor() {
        return mBackgroundColor;
    }

    public void setText(String text) {
        mText = text;
    }

    public String getText() {
        return mText;
    }

    public void setBitmap(Bitmap bitmap) {
        mBitmap = bitmap;
    }

    public Rect getBitmapBounds() {
        return mBitmapBounds;
    }

    @Override
    public CharSequence getContentDescription () {
        return mText;
    }

    public boolean isHalfImage() {
        return false;
    }

    public void computeBitmapBounds() {
        if (mUseOnlyDrawable) {
            mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2,
                    getHeight() - mTextSize - 2*mMargin);
        } else {
            if (getOrientation() == VERTICAL && isHalfImage()) {
                mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth()/2, getHeight());
            } else {
                mBitmapBounds = new Rect(mMargin/2, mMargin, getWidth() - mMargin/2, getHeight());
            }
        }
    }

    @Override
    public void onDraw(Canvas canvas) {
        mPaint.reset();
        mPaint.setAntiAlias(true);
        canvas.drawColor(mBackgroundColor);
        computeBitmapBounds();
        computeTextPosition(getText());
        if (mBitmap != null) {
            canvas.save();
            canvas.clipRect(mBitmapBounds);
            Matrix m = new Matrix();
            if (mUseOnlyDrawable) {
                mPaint.setFilterBitmap(true);
                m.setRectToRect(new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight()),
                        new RectF(mBitmapBounds), Matrix.ScaleToFit.CENTER);
            } else {
                float scaleWidth = mBitmapBounds.width() / (float) mBitmap.getWidth();
                float scaleHeight = mBitmapBounds.height() / (float) mBitmap.getHeight();
                float scale = Math.max(scaleWidth, scaleHeight);
                float dx = (mBitmapBounds.width() - (mBitmap.getWidth() * scale)) / 2f;
                float dy = (mBitmapBounds.height() - (mBitmap.getHeight() * scale)) / 2f;
                dx += mBitmapBounds.left;
                dy += mBitmapBounds.top;
                m.postScale(scale, scale);
                m.postTranslate(dx, dy);
            }

            canvas.drawBitmap(mBitmap, m, mPaint);
            canvas.restore();
        }

        if (!mUseOnlyDrawable) {
            int startColor = Color.argb(0, 0, 0, 0);
            int endColor = Color.argb(200, 0, 0, 0);
            float start = getHeight() - 2 * mMargin - 2 * mTextSize;
            float end = getHeight();
            Shader shader = new LinearGradient(0, start, 0, end, startColor,
                    endColor, Shader.TileMode.CLAMP);
            mPaint.setShader(shader);
            float startGradient = 0;
            if (getOrientation() == VERTICAL && isHalfImage()) {
                startGradient = getWidth()/2;
            }
            canvas.drawRect(new RectF(startGradient, start, getWidth(), end), mPaint);
            mPaint.setShader(null);
        }
        drawOutlinedText(canvas, getText());
    }
}