16e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein/*
26e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * Copyright (C) 2013 The Android Open Source Project
36e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein *
46e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * Licensed under the Apache License, Version 2.0 (the "License");
56e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * you may not use this file except in compliance with the License.
66e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * You may obtain a copy of the License at
76e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein *
86e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein *      http://www.apache.org/licenses/LICENSE-2.0
96e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein *
106e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * Unless required by applicable law or agreed to in writing, software
116e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * distributed under the License is distributed on an "AS IS" BASIS,
126e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * See the License for the specific language governing permissions and
146e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein * limitations under the License.
156e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein */
166e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
17b8f95646fc0510eebfeaa27864023d630f34090fSam Blitzsteinpackage com.android.datetimepicker.time;
186e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
196e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.content.Context;
206e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.content.res.Resources;
216e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.graphics.Canvas;
226e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.graphics.Paint;
236e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.util.Log;
246e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport android.view.View;
256e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
266e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinimport com.android.datetimepicker.R;
276e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
28f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein/**
29f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein * Draws a simple white circle on which the numbers will be drawn.
30f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein */
316e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzsteinpublic class CircleView extends View {
326e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private static final String TAG = "CircleView";
336e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
346e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private final Paint mPaint = new Paint();
356e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private boolean mIs24HourMode;
366e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private int mWhite;
37f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein    private int mBlack;
386e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private float mCircleRadiusMultiplier;
396e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private float mAmPmCircleRadiusMultiplier;
406e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private boolean mIsInitialized;
416e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
426e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private boolean mDrawValuesReady;
436e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private int mXCenter;
446e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private int mYCenter;
456e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    private int mCircleRadius;
466e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
476e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    public CircleView(Context context) {
486e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        super(context);
496e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
506e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        Resources res = context.getResources();
516e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mWhite = res.getColor(R.color.white);
52f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein        mBlack = res.getColor(R.color.numbers_text_color);
536e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mPaint.setAntiAlias(true);
546e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
556e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mIsInitialized = false;
566e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    }
576e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
586e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    public void initialize(Context context, boolean is24HourMode) {
596e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        if (mIsInitialized) {
606e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            Log.e(TAG, "CircleView may only be initialized once.");
616e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            return;
626e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        }
636e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
646e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        Resources res = context.getResources();
656e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mIs24HourMode = is24HourMode;
666e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        if (is24HourMode) {
676e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mCircleRadiusMultiplier = Float.parseFloat(
686e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                    res.getString(R.string.circle_radius_multiplier_24HourMode));
696e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        } else {
706e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mCircleRadiusMultiplier = Float.parseFloat(
716e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                    res.getString(R.string.circle_radius_multiplier));
726e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mAmPmCircleRadiusMultiplier =
736e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                    Float.parseFloat(res.getString(R.string.ampm_circle_radius_multiplier));
746e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        }
756e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
766e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mIsInitialized = true;
776e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    }
786e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
796e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
806e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    @Override
816e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    public void onDraw(Canvas canvas) {
826e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        int viewWidth = getWidth();
836e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        if (viewWidth == 0 || !mIsInitialized) {
846e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            return;
856e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        }
866e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
876e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        if (!mDrawValuesReady) {
886e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mXCenter = getWidth() / 2;
896e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mYCenter = getHeight() / 2;
906e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mCircleRadius = (int) (Math.min(mXCenter, mYCenter) * mCircleRadiusMultiplier);
916e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
926e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            if (!mIs24HourMode) {
936e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                // We'll need to draw the AM/PM circles, so the main circle will need to have
946e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                // a slightly higher center. To keep the entire view centered vertically, we'll
956e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                // have to push it up by half the radius of the AM/PM circles.
966e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                int amPmCircleRadius = (int) (mCircleRadius * mAmPmCircleRadiusMultiplier);
976e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein                mYCenter -= amPmCircleRadius / 2;
986e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            }
996e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
1006e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein            mDrawValuesReady = true;
1016e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        }
1026e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
103f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein        // Draw the white circle.
1046e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        mPaint.setColor(mWhite);
1056e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        canvas.drawCircle(mXCenter, mYCenter, mCircleRadius, mPaint);
1066e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein
107f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein        // Draw a small black circle in the center.
108f3b38bd61d583d31200c501f5a74392aac510657Sam Blitzstein        mPaint.setColor(mBlack);
1096e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein        canvas.drawCircle(mXCenter, mYCenter, 2, mPaint);
1106e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein    }
1116e896f805cac499b777c98755149f07ccd7ba5c3Sam Blitzstein}
112