/*
* Copyright (C) 2012 The CyanogenMod 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.cyanogenmod.filemanager.ui.widgets;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.View;
import com.cyanogenmod.filemanager.R;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/**
* A widget for display a relevance widget.
*/
public class RelevanceView extends View {
private final Paint mBorderPaint = new Paint();
private final Paint mRelevancePaint = new Paint();
private float mRelevance;
private Map<Integer, Integer> mColors;
/**
* Constructor of <code>RelevanceView</code>.
*
* @param context The current context
*/
public RelevanceView(Context context) {
super(context);
init();
}
/**
* Constructor of <code>RelevanceView</code>.
*
* @param context The current context
* @param attrs The attributes of the XML tag that is inflating the view.
*/
public RelevanceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
/**
* Constructor of <code>RelevanceView</code>.
*
* @param context The current context
* @param attrs The attributes of the XML tag that is inflating the view.
* @param defStyle The default style to apply to this view. If 0, no style
* will be applied (beyond what is included in the theme). This may
* either be an attribute resource, whose value will be retrieved
* from the current theme, or an explicit style resource.
*/
public RelevanceView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
/**
* Method that initializes the view. This method loads all the necessary
* information and create an appropriate layout for the view
*/
private void init() {
//Configure the paints
float density = getResources().getDisplayMetrics().density;
this.mBorderPaint.setColor(getResources().getColor(R.color.relevance_border));
this.mBorderPaint.setStrokeWidth((1 * density) + 0.5f);
this.mRelevancePaint.setColor(Color.TRANSPARENT);
//Create the color map
this.mColors = new TreeMap<Integer, Integer>();
this.mColors.put(Integer.valueOf(25),
Integer.valueOf(getResources().getColor(R.color.relevance_percentil_25)));
this.mColors.put(Integer.valueOf(50),
Integer.valueOf(getResources().getColor(R.color.relevance_percentil_50)));
this.mColors.put(Integer.valueOf(75),
Integer.valueOf(getResources().getColor(R.color.relevance_percentil_75)));
this.mColors.put(Integer.valueOf(100),
Integer.valueOf(getResources().getColor(R.color.relevance_percentil_100)));
//Relevance is 0 until is sets
this.mRelevance = 0.0f;
}
/**
* Set the relevance of the widget.
*
* @param relevance the mRelevance to set
*/
public void setRelevance(float relevance) {
this.mRelevance = relevance;
if (relevance < 0) {
this.mRelevance = 0.0f;
}
if (relevance > 100) {
this.mRelevance = 100.0f;
}
//Change the color of the relevance depending on his percentage
Iterator<Integer> it = this.mColors.keySet().iterator();
while (it.hasNext()) {
Integer key = it.next();
if (this.mRelevance <= key.intValue()) {
this.mRelevancePaint.setColor(this.mColors.get(key).intValue());
break;
}
}
//Invalidate the widget for drawing again
if (Looper.getMainLooper().getThread() == Thread.currentThread()) {
invalidate();
} else {
postInvalidate();
}
}
@Override
protected void onDraw(Canvas canvas) {
int w = getMeasuredWidth();
int h = getMeasuredHeight();
//Draw the relevance
canvas.drawRect(0, 0, (this.mRelevance * w / 100), h, this.mRelevancePaint);
//Draw the border
canvas.drawLine(0, 0, w, 0, this.mBorderPaint);
canvas.drawLine(w, 0, w, h, this.mBorderPaint);
canvas.drawLine(w, h, 0, h, this.mBorderPaint);
canvas.drawLine(0, h, 0, 0, this.mBorderPaint);
}
}