From 2a2678dc6b607dd11e4ac6debb5b308c4fa95fb1 Mon Sep 17 00:00:00 2001 From: Nathaniel McCallum Date: Mon, 2 Dec 2013 18:18:10 -0500 Subject: [PATCH] Resurrect refresh icon / circle progress bar --- res/drawable-hdpi/generate.png | Bin 0 -> 1939 bytes res/drawable-mdpi/generate.png | Bin 0 -> 1567 bytes res/drawable-xhdpi/generate.png | Bin 0 -> 2332 bytes res/layout/token.xml | 92 ++++++++++-------- .../freeotp/CircleProgressBar.java | 85 ++++++++++++++++ src/org/fedorahosted/freeotp/Token.java | 4 +- .../freeotp/UrgencyProgressBar.java | 56 ----------- .../freeotp/adapters/TokenAdapter.java | 23 ++++- 8 files changed, 160 insertions(+), 100 deletions(-) create mode 100755 res/drawable-hdpi/generate.png create mode 100755 res/drawable-mdpi/generate.png create mode 100755 res/drawable-xhdpi/generate.png create mode 100644 src/org/fedorahosted/freeotp/CircleProgressBar.java delete mode 100644 src/org/fedorahosted/freeotp/UrgencyProgressBar.java diff --git a/res/drawable-hdpi/generate.png b/res/drawable-hdpi/generate.png new file mode 100755 index 0000000000000000000000000000000000000000..0f3ceec7cf7777190076701723d9b1162989b8a5 GIT binary patch literal 1939 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 f{so4Qwts_oyKGB@A8Kf@{;%+P5!@ - - - - + android:background="@drawable/token" > + android:layout_height="96dp" + android:orientation="vertical" > + + - - - - + + + + + + + diff --git a/src/org/fedorahosted/freeotp/CircleProgressBar.java b/src/org/fedorahosted/freeotp/CircleProgressBar.java new file mode 100644 index 0000000..b1c26cc --- /dev/null +++ b/src/org/fedorahosted/freeotp/CircleProgressBar.java @@ -0,0 +1,85 @@ +/* + * FreeOTP + * + * Authors: Nathaniel McCallum + * + * Copyright (C) 2013 Nathaniel McCallum, Red Hat + * + * 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 org.fedorahosted.freeotp; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Paint.Style; +import android.graphics.Rect; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.widget.ProgressBar; + +public class CircleProgressBar extends ProgressBar { + private Paint paint; + private RectF rectf; + private Rect rect; + + public CircleProgressBar(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + setup(); + } + + public CircleProgressBar(Context context, AttributeSet attrs) { + super(context, attrs); + setup(); + } + + public CircleProgressBar(Context context) { + super(context); + setup(); + } + + private void setup() { + paint = new Paint(); + rectf = new RectF(); + rect = new Rect(); + + paint.setARGB(0x99, 0x33, 0x33, 0x33); + paint.setAntiAlias(true); + paint.setStyle(Style.FILL_AND_STROKE); + } + + @Override + public synchronized void setProgress(int progress) { + super.setProgress(progress); + if (paint != null) { + int percent = progress * 100 / getMax(); + if (percent > 25 || progress == 0) + paint.setARGB(0x99, 0x33, 0x33, 0x33); + else + paint.setARGB(0x99, 0xff, 0xe0 * percent / 25, 0x00); + } + } + + @Override + protected synchronized void onDraw(Canvas canvas) { + getDrawingRect(rect); + rect.left += getPaddingLeft() + 2; + rect.top += getPaddingTop() + 2; + rect.right -= getPaddingRight() + 2; + rect.bottom -= getPaddingBottom() + 2; + + rectf.set(rect); + canvas.drawArc(rectf, -90, getProgress() * 360 / getMax(), true, paint); + } +} diff --git a/src/org/fedorahosted/freeotp/Token.java b/src/org/fedorahosted/freeotp/Token.java index f087297..9acecb4 100644 --- a/src/org/fedorahosted/freeotp/Token.java +++ b/src/org/fedorahosted/freeotp/Token.java @@ -228,10 +228,10 @@ public class Token { long time = System.currentTimeMillis(); if (mType == TokenType.TOTP) - return (int) (time % (mPeriod * 1000) / mPeriod); + return 1000 - (int) (time % (mPeriod * 1000) / mPeriod); long state = (time - mLastCode) / 60; - return (int) (state > 1000 ? 1000 : state); + return 1000 - (int) (state > 1000 ? 1000 : state); } public Uri toUri() { diff --git a/src/org/fedorahosted/freeotp/UrgencyProgressBar.java b/src/org/fedorahosted/freeotp/UrgencyProgressBar.java deleted file mode 100644 index d9fe2f0..0000000 --- a/src/org/fedorahosted/freeotp/UrgencyProgressBar.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * FreeOTP - * - * Authors: Nathaniel McCallum - * - * Copyright (C) 2013 Nathaniel McCallum, Red Hat - * - * 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 org.fedorahosted.freeotp; - -import android.content.Context; -import android.graphics.Color; -import android.graphics.PorterDuff.Mode; -import android.util.AttributeSet; -import android.widget.ProgressBar; - -public class UrgencyProgressBar extends ProgressBar { - public UrgencyProgressBar(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - } - - public UrgencyProgressBar(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public UrgencyProgressBar(Context context) { - super(context); - } - - @Override - public synchronized void setProgress(int progress) { - super.setProgress(progress); - - int percent = progress * 100 / getMax(); - if (percent > 33 || progress == 0) - getProgressDrawable().clearColorFilter(); - else { - int green = 0xe0 * percent / 33; - getProgressDrawable().setColorFilter(Color.RED | (green << 8), Mode.SRC_IN); - } - } - - -} diff --git a/src/org/fedorahosted/freeotp/adapters/TokenAdapter.java b/src/org/fedorahosted/freeotp/adapters/TokenAdapter.java index 4824e20..8126aca 100644 --- a/src/org/fedorahosted/freeotp/adapters/TokenAdapter.java +++ b/src/org/fedorahosted/freeotp/adapters/TokenAdapter.java @@ -33,6 +33,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; +import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.TextView; @@ -44,6 +45,7 @@ public class TokenAdapter extends TokenPersistenceBaseAdapter { TextView label; TextView issuer; ProgressBar progress; + ImageView image; } private static class Ticker extends Handler { @@ -60,11 +62,18 @@ public class TokenAdapter extends TokenPersistenceBaseAdapter { return; ViewHolder holder = (ViewHolder) view.getTag(); - int progress = 1000 - holder.token.getProgress(); holder.code.setText(holder.token.getCode()); + + int progress = holder.token.getProgress(); holder.progress.setProgress(progress); if (progress > 0 && progress < 950) view.setEnabled(true); + + if (holder.token.getType() == TokenType.HOTP && progress == 0) { + holder.progress.setVisibility(View.GONE); + holder.image.setVisibility(View.VISIBLE); + } + start(); } @@ -107,6 +116,8 @@ public class TokenAdapter extends TokenPersistenceBaseAdapter { ViewHolder holder = (ViewHolder) v.getTag(); holder.token.increment(); holder.code.setText(holder.token.getCode()); + holder.progress.setVisibility(View.VISIBLE); + holder.image.setVisibility(View.GONE); save(holder.token); v.setEnabled(false); } @@ -114,10 +125,15 @@ public class TokenAdapter extends TokenPersistenceBaseAdapter { } view.setOnClickListener(ocl); - if (holder.token.getType() == TokenType.TOTP) + if (holder.token.getType() == TokenType.TOTP) { view.setBackgroundResource(R.drawable.token_normal); - else + holder.progress.setVisibility(View.VISIBLE); + holder.image.setVisibility(View.GONE); + } else { view.setBackgroundResource(R.drawable.token); + holder.progress.setVisibility(View.GONE); + holder.image.setVisibility(View.VISIBLE); + } } @Override @@ -129,6 +145,7 @@ public class TokenAdapter extends TokenPersistenceBaseAdapter { holder.label = (TextView) view.findViewById(R.id.label); holder.issuer = (TextView) view.findViewById(R.id.issuer); holder.progress = (ProgressBar) view.findViewById(R.id.progress); + holder.image = (ImageView) view.findViewById(R.id.image); view.setTag(holder); new Ticker(view).start(); -- 2.43.2