4 * Authors: Nathaniel McCallum <npmccallum@redhat.com>
6 * Copyright (C) 2013 Nathaniel McCallum, Red Hat
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
21 package org.fedorahosted.freeotp.adapters;
23 import java.lang.ref.WeakReference;
25 import org.fedorahosted.freeotp.R;
26 import org.fedorahosted.freeotp.Token;
27 import org.fedorahosted.freeotp.Token.TokenType;
29 import android.content.Context;
30 import android.os.Handler;
31 import android.os.Message;
32 import android.view.LayoutInflater;
33 import android.view.View;
34 import android.view.ViewGroup;
35 import android.widget.CompoundButton;
36 import android.widget.ImageView;
37 import android.widget.ProgressBar;
38 import android.widget.TextView;
41 public class TokenAdapter extends TokenPersistenceBaseAdapter {
42 private class ViewHolder {
51 private static class Ticker extends Handler {
52 WeakReference<View> wr;
54 public Ticker(View view) {
55 wr = new WeakReference<View>(view);
59 public void handleMessage(Message msg) {
64 ViewHolder holder = (ViewHolder) view.getTag();
65 holder.code.setText(holder.token.getCode());
67 int progress = holder.token.getProgress();
68 holder.progress.setProgress(progress);
69 if (progress > 0 && progress < 950)
70 view.setEnabled(true);
72 if (holder.token.getType() == TokenType.HOTP && progress == 0) {
73 holder.progress.setVisibility(View.GONE);
74 holder.image.setVisibility(View.VISIBLE);
82 sendEmptyMessageDelayed(0, 100);
90 private final LayoutInflater mLayoutInflater;
92 public TokenAdapter(Context ctx) {
94 mLayoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
98 protected void bindView(View view, int position) {
99 super.bindView(view, position);
101 ViewHolder holder = (ViewHolder) view.getTag();
102 holder.token = getItem(position);
105 holder.code.setText(holder.token.getCode());
106 holder.label.setText(holder.token.getLabel());
107 holder.issuer.setText(holder.token.getIssuer());
108 holder.progress.setProgress(holder.token.getProgress());
110 // Update click listener
111 View.OnClickListener ocl = null;
112 if (holder.token.getType() == TokenType.HOTP) {
113 ocl = new View.OnClickListener() {
115 public void onClick(View v) {
116 ViewHolder holder = (ViewHolder) v.getTag();
117 holder.token.increment();
118 holder.code.setText(holder.token.getCode());
119 holder.progress.setVisibility(View.VISIBLE);
120 holder.image.setVisibility(View.GONE);
126 view.setOnClickListener(ocl);
128 if (holder.token.getType() == TokenType.TOTP) {
129 view.setBackgroundResource(R.drawable.token_normal);
130 holder.progress.setVisibility(View.VISIBLE);
131 holder.image.setVisibility(View.GONE);
133 view.setBackgroundResource(R.drawable.token);
134 holder.progress.setVisibility(View.GONE);
135 holder.image.setVisibility(View.VISIBLE);
140 protected View createView(ViewGroup parent, int type) {
141 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
143 ViewHolder holder = new ViewHolder();
144 holder.code = (TextView) view.findViewById(R.id.code);
145 holder.label = (TextView) view.findViewById(R.id.label);
146 holder.issuer = (TextView) view.findViewById(R.id.issuer);
147 holder.progress = (ProgressBar) view.findViewById(R.id.progress);
148 holder.image = (ImageView) view.findViewById(R.id.image);
151 new Ticker(view).start();
157 protected CompoundButton getCompoundButton(View view) {
158 return (CompoundButton) view.findViewById(R.id.checkBox);