Home | History | Annotate | Download | only in ui
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.camera.ui;
     18 
     19 import android.content.Context;
     20 import android.graphics.Canvas;
     21 import android.graphics.Color;
     22 import android.graphics.Paint;
     23 import android.graphics.RectF;
     24 
     25 import com.android.camera2.R;
     26 
     27 /**
     28  * Renders a circular progress bar on the screen.
     29  */
     30 public class ProgressRenderer {
     31 
     32     public static interface VisibilityListener {
     33         public void onHidden();
     34     }
     35 
     36     private final int mProgressRadius;
     37     private final Paint mProgressBasePaint;
     38     private final Paint mProgressPaint;
     39 
     40     private RectF mArcBounds = new RectF(0, 0, 1, 1);
     41     private int mProgressAngleDegrees = 270;
     42     private boolean mVisible = false;
     43     private VisibilityListener mVisibilityListener;
     44 
     45     /**
     46      * After we reach 100%, keep on painting the progress for another x milliseconds
     47      * before hiding it.
     48      */
     49     private static final int SHOW_PROGRESS_X_ADDITIONAL_MS = 100;
     50 
     51     /** When to hide the progress indicator. */
     52     private long mTimeToHide = 0;
     53 
     54     public ProgressRenderer(Context context) {
     55         mProgressRadius = context.getResources().getDimensionPixelSize(R.dimen.pie_progress_radius);
     56         int pieProgressWidth = context.getResources().getDimensionPixelSize(
     57                 R.dimen.pie_progress_width);
     58         mProgressBasePaint = createProgressPaint(pieProgressWidth, 0.2f);
     59         mProgressPaint = createProgressPaint(pieProgressWidth, 1.0f);
     60     }
     61 
     62     /**
     63      * Sets or replaces a visiblity listener.
     64      */
     65     public void setVisibilityListener(VisibilityListener listener) {
     66         mVisibilityListener = listener;
     67     }
     68 
     69     /**
     70      * Shows a progress indicator. If the progress is '100', the progress
     71      * indicator will be hidden.
     72      *
     73      * @param percent the progress in percent (0-100).
     74      */
     75     public void setProgress(int percent) {
     76         // Clamp the value.
     77         percent = Math.min(100, Math.max(percent, 0));
     78         mProgressAngleDegrees = (int) ((360f / 100) * percent);
     79 
     80         // We hide the progress once we drew the 100% state once.
     81         if (percent < 100) {
     82             mVisible = true;
     83             mTimeToHide = System.currentTimeMillis() + SHOW_PROGRESS_X_ADDITIONAL_MS;
     84         }
     85     }
     86 
     87     /**
     88      * Draw the current progress (if < 100%) centered at the given location.
     89      */
     90     public void onDraw(Canvas canvas, int centerX, int centerY) {
     91         if (!mVisible) {
     92             return;
     93         }
     94         mArcBounds = new RectF(centerX - mProgressRadius, centerY - mProgressRadius, centerX
     95                 + mProgressRadius,
     96                 centerY + mProgressRadius);
     97 
     98         canvas.drawCircle(centerX, centerY, mProgressRadius, mProgressBasePaint);
     99         canvas.drawArc(mArcBounds, -90, mProgressAngleDegrees, false, mProgressPaint);
    100 
    101         // After we reached 100%, we paint the progress renderer for another x
    102         // milliseconds until we hide it.
    103         if (mProgressAngleDegrees == 360 && System.currentTimeMillis() > mTimeToHide) {
    104             mVisible = false;
    105             if (mVisibilityListener != null) {
    106                 mVisibilityListener.onHidden();
    107             }
    108         }
    109     }
    110 
    111     /**
    112      * @return Whether the progress renderer is visible.
    113      */
    114     public boolean isVisible() {
    115         return mVisible;
    116     }
    117 
    118     private static Paint createProgressPaint(int width, float alpha) {
    119         Paint paint = new Paint();
    120         paint.setAntiAlias(true);
    121         // 20% alpha.
    122         paint.setColor(Color.argb((int) (alpha * 255), 255, 255, 255));
    123         paint.setStrokeWidth(width);
    124         paint.setStyle(Paint.Style.STROKE);
    125         return paint;
    126     }
    127 }
    128