]> Pileus Git - ~andy/freeotp/blob - src/org/fedorahosted/freeotp/adapters/TokenAdapter.java
Tablet UI rewrite
[~andy/freeotp] / src / org / fedorahosted / freeotp / adapters / TokenAdapter.java
1 /*
2  * FreeOTP
3  *
4  * Authors: Nathaniel McCallum <npmccallum@redhat.com>
5  *
6  * Copyright (C) 2013  Nathaniel McCallum, Red Hat
7  *
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
11  *
12  *     http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  */
20
21 package org.fedorahosted.freeotp.adapters;
22
23 import java.lang.ref.WeakReference;
24
25 import org.fedorahosted.freeotp.R;
26 import org.fedorahosted.freeotp.Token;
27 import org.fedorahosted.freeotp.Token.TokenType;
28
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;
38
39
40 public class TokenAdapter extends TokenPersistenceBaseAdapter {
41         private class ViewHolder {
42                 Token token;
43                 TextView code;
44                 TextView label;
45                 TextView issuer;
46                 ProgressBar progress;
47         }
48
49         private static class Ticker extends Handler {
50                 WeakReference<View> wr;
51
52                 public Ticker(View view) {
53                         wr = new WeakReference<View>(view);
54                 }
55
56                 @Override
57                 public void handleMessage(Message msg) {
58                         View view = wr.get();
59                         if (view == null)
60                                 return;
61
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);
68                         start();
69                 }
70
71                 public void start() {
72                         stop();
73                         sendEmptyMessageDelayed(0, 100);
74                 }
75
76                 public void stop() {
77                         removeMessages(0);
78                 }
79         }
80
81         private final LayoutInflater mLayoutInflater;
82
83         public TokenAdapter(Context ctx) {
84                 super(ctx);
85                 mLayoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
86         }
87
88         @Override
89         protected void bindView(View view, int position) {
90                 super.bindView(view, position);
91
92                 ViewHolder holder = (ViewHolder) view.getTag();
93                 holder.token = getItem(position);
94
95                 // Update views
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());
100
101                 // Update click listener
102                 View.OnClickListener ocl = null;
103                 if (holder.token.getType() == TokenType.HOTP) {
104                         ocl = new View.OnClickListener() {
105                                 @Override
106                                 public void onClick(View v) {
107                                         ViewHolder holder = (ViewHolder) v.getTag();
108                                         holder.token.increment();
109                                         holder.code.setText(holder.token.getCode());
110                                         save(holder.token);
111                                         v.setEnabled(false);
112                                 }
113                         };
114                 }
115                 view.setOnClickListener(ocl);
116
117                 if (holder.token.getType() == TokenType.TOTP)
118                         view.setBackgroundResource(R.drawable.token_normal);
119                 else
120                         view.setBackgroundResource(R.drawable.token);
121         }
122
123         @Override
124         protected View createView(ViewGroup parent, int type) {
125                 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
126
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);
132                 view.setTag(holder);
133
134                 new Ticker(view).start();
135
136                 return view;
137         }
138
139         @Override
140         protected CompoundButton getCompoundButton(View view) {
141                 return (CompoundButton) view.findViewById(R.id.checkBox);
142         }
143 }