]> Pileus Git - ~andy/freeotp/blob - src/org/fedorahosted/freeotp/adapters/TokenAdapter.java
Consolodate views if issuer is not present
[~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                 if (holder.issuer.getText().length() == 0) {
110                         holder.issuer.setText(holder.token.getLabel());
111                         holder.label.setVisibility(View.GONE);
112                 } else {
113                         holder.label.setVisibility(View.VISIBLE);
114                 }
115
116                 // Update click listener
117                 View.OnClickListener ocl = null;
118                 if (holder.token.getType() == TokenType.HOTP) {
119                         ocl = new View.OnClickListener() {
120                                 @Override
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);
127                                         save(holder.token);
128                                         v.setEnabled(false);
129                                 }
130                         };
131                 }
132                 view.setOnClickListener(ocl);
133
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);
138                 } else {
139                         view.setBackgroundResource(R.drawable.token);
140                         holder.progress.setVisibility(View.GONE);
141                         holder.image.setVisibility(View.VISIBLE);
142                 }
143         }
144
145         @Override
146         protected View createView(ViewGroup parent, int type) {
147                 View view = mLayoutInflater.inflate(R.layout.token, parent, false);
148
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);
155                 view.setTag(holder);
156
157                 new Ticker(view).start();
158
159                 return view;
160         }
161
162         @Override
163         protected CompoundButton getCompoundButton(View view) {
164                 return (CompoundButton) view.findViewById(R.id.checkBox);
165         }
166 }