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());
109 if (holder.issuer.getText().length() == 0) {
110 holder.issuer.setText(holder.token.getLabel());
111 holder.label.setVisibility(View.GONE);
113 holder.label.setVisibility(View.VISIBLE);
116 // Update click listener
117 View.OnClickListener ocl = null;
118 if (holder.token.getType() == TokenType.HOTP) {
119 ocl = new View.OnClickListener() {
121 public void onClick(View v) {
122 ViewHolder holder = (ViewHolder) v.getTag();
123 holder.token.increment();
124 holder.code.setText(holder.token.getCode());
125 holder.progress.setVisibility(View.VISIBLE);
126 holder.image.setVisibility(View.GONE);
132 view.setOnClickListener(ocl);
134 if (holder.token.getType() == TokenType.TOTP) {
135 view.setBackgroundResource(R.drawable.token_normal);
136 holder.progress.setVisibility(View.VISIBLE);
137 holder.image.setVisibility(View.GONE);
139 view.setBackgroundResource(R.drawable.token);
140 holder.progress.setVisibility(View.GONE);
141 holder.image.setVisibility(View.VISIBLE);
146 protected View createView(ViewGroup parent, int type) {
147 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
149 ViewHolder holder = new ViewHolder();
150 holder.code = (TextView) view.findViewById(R.id.code);
151 holder.label = (TextView) view.findViewById(R.id.label);
152 holder.issuer = (TextView) view.findViewById(R.id.issuer);
153 holder.progress = (ProgressBar) view.findViewById(R.id.progress);
154 holder.image = (ImageView) view.findViewById(R.id.image);
157 new Ticker(view).start();
163 protected CompoundButton getCompoundButton(View view) {
164 return (CompoundButton) view.findViewById(R.id.checkBox);