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.ProgressBar;
37 import android.widget.TextView;
40 public class TokenAdapter extends TokenPersistenceBaseAdapter {
41 private class ViewHolder {
49 private static class Ticker extends Handler {
50 WeakReference<View> wr;
52 public Ticker(View view) {
53 wr = new WeakReference<View>(view);
57 public void handleMessage(Message msg) {
62 ViewHolder holder = (ViewHolder) view.getTag();
63 int progress = 1000 - holder.token.getProgress();
64 holder.code.setText(holder.token.getCode());
65 holder.progress.setProgress(progress);
66 if (progress > 0 && progress < 950)
67 view.setEnabled(true);
73 sendEmptyMessageDelayed(0, 100);
81 private final LayoutInflater mLayoutInflater;
83 public TokenAdapter(Context ctx) {
85 mLayoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
89 protected void bindView(View view, int position) {
90 super.bindView(view, position);
92 ViewHolder holder = (ViewHolder) view.getTag();
93 holder.token = getItem(position);
96 holder.code.setText(holder.token.getCode());
97 holder.label.setText(holder.token.getLabel());
98 holder.issuer.setText(holder.token.getIssuer());
99 holder.progress.setProgress(holder.token.getProgress());
101 // Update click listener
102 View.OnClickListener ocl = null;
103 if (holder.token.getType() == TokenType.HOTP) {
104 ocl = new View.OnClickListener() {
106 public void onClick(View v) {
107 ViewHolder holder = (ViewHolder) v.getTag();
108 holder.token.increment();
109 holder.code.setText(holder.token.getCode());
115 view.setOnClickListener(ocl);
117 if (holder.token.getType() == TokenType.TOTP)
118 view.setBackgroundResource(R.drawable.token_normal);
120 view.setBackgroundResource(R.drawable.token);
124 protected View createView(ViewGroup parent, int type) {
125 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
127 ViewHolder holder = new ViewHolder();
128 holder.code = (TextView) view.findViewById(R.id.code);
129 holder.label = (TextView) view.findViewById(R.id.label);
130 holder.issuer = (TextView) view.findViewById(R.id.issuer);
131 holder.progress = (ProgressBar) view.findViewById(R.id.progress);
134 new Ticker(view).start();
140 protected CompoundButton getCompoundButton(View view) {
141 return (CompoundButton) view.findViewById(R.id.checkBox);