]> Pileus Git - ~andy/freeotp/blob - src/org/fedorahosted/freeotp/adapters/TokenAdapter.java
Resurrect refresh icon / circle progress bar
[~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.ImageView;
37 import android.widget.ProgressBar;
38 import android.widget.TextView;
39
40
41 public class TokenAdapter extends TokenPersistenceBaseAdapter {
42         private class ViewHolder {
43                 Token token;
44                 TextView code;
45                 TextView label;
46                 TextView issuer;
47                 ProgressBar progress;
48                 ImageView image;
49         }
50
51         private static class Ticker extends Handler {
52                 WeakReference<View> wr;
53
54                 public Ticker(View view) {
55                         wr = new WeakReference<View>(view);
56                 }
57
58                 @Override
59                 public void handleMessage(Message msg) {
60                         View view = wr.get();
61                         if (view == null)
62                                 return;
63
64                         ViewHolder holder = (ViewHolder) view.getTag();
65                         holder.code.setText(holder.token.getCode());
66
67                         int progress = holder.token.getProgress();
68                         holder.progress.setProgress(progress);
69                         if (progress > 0 && progress < 950)
70                                 view.setEnabled(true);
71
72                         if (holder.token.getType() == TokenType.HOTP && progress == 0) {
73                                 holder.progress.setVisibility(View.GONE);
74                                 holder.image.setVisibility(View.VISIBLE);
75                         }
76
77                         start();
78                 }
79
80                 public void start() {
81                         stop();
82                         sendEmptyMessageDelayed(0, 100);
83                 }
84
85                 public void stop() {
86                         removeMessages(0);
87                 }
88         }
89
90         private final LayoutInflater mLayoutInflater;
91
92         public TokenAdapter(Context ctx) {
93                 super(ctx);
94                 mLayoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
95         }
96
97         @Override
98         protected void bindView(View view, int position) {
99                 super.bindView(view, position);
100
101                 ViewHolder holder = (ViewHolder) view.getTag();
102                 holder.token = getItem(position);
103
104                 // Update views
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
110                 // Update click listener
111                 View.OnClickListener ocl = null;
112                 if (holder.token.getType() == TokenType.HOTP) {
113                         ocl = new View.OnClickListener() {
114                                 @Override
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);
121                                         save(holder.token);
122                                         v.setEnabled(false);
123                                 }
124                         };
125                 }
126                 view.setOnClickListener(ocl);
127
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);
132                 } else {
133                         view.setBackgroundResource(R.drawable.token);
134                         holder.progress.setVisibility(View.GONE);
135                         holder.image.setVisibility(View.VISIBLE);
136                 }
137         }
138
139         @Override
140         protected View createView(ViewGroup parent, int type) {
141                 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
142
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);
149                 view.setTag(holder);
150
151                 new Ticker(view).start();
152
153                 return view;
154         }
155
156         @Override
157         protected CompoundButton getCompoundButton(View view) {
158                 return (CompoundButton) view.findViewById(R.id.checkBox);
159         }
160 }