Replaced 'PIN code' by 'pass code'
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / PassCodeActivity.java
1 /**
2 * ownCloud Android client application
3 *
4 * Copyright (C) 2011 Bartek Przybylski
5 * Copyright (C) 2015 ownCloud Inc.
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2,
9 * as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20 package com.owncloud.android.ui.activity;
21
22 import java.util.Arrays;
23
24 import android.content.SharedPreferences;
25 import android.os.Bundle;
26 import android.preference.PreferenceManager;
27 import android.text.Editable;
28 import android.text.TextWatcher;
29 import android.view.KeyEvent;
30 import android.view.View;
31 import android.view.View.OnClickListener;
32 import android.view.View.OnFocusChangeListener;
33 import android.view.View.OnKeyListener;
34 import android.widget.Button;
35 import android.widget.EditText;
36 import android.widget.TextView;
37 import android.widget.Toast;
38
39 import com.actionbarsherlock.app.ActionBar;
40 import com.actionbarsherlock.app.SherlockFragmentActivity;
41 import com.owncloud.android.R;
42 import com.owncloud.android.utils.DisplayUtils;
43
44 public class PassCodeActivity extends SherlockFragmentActivity {
45
46
47 public final static String ACTION_TOGGLE = PassCodeActivity.class.getCanonicalName() + ".TOGGLE";
48 public final static String ACTION_REQUEST= PassCodeActivity.class.getCanonicalName() + ".REQUEST";
49
50 public final static String EXTRA_NEW_STATE = PassCodeActivity.class.getCanonicalName() + ".NEW_STATE";
51
52 private Button mBCancel;
53 private TextView mPassCodeHdr;
54 private TextView mPassCodeHdrExplanation;
55 private EditText mText1;
56 private EditText mText2;
57 private EditText mText3;
58 private EditText mText4;
59
60 private String [] mTempText ={"","","",""};
61
62 private boolean mConfirmingPassCode = false;
63 private boolean mPassCodeChecked = false;
64 private boolean mNewPasswordEntered = false;
65 private boolean mBChange = true; // to control that only one blocks jump
66 //private int mTCounter ; // Count the number of attempts an user could introduce the pass code
67
68
69 protected void onCreate(Bundle savedInstanceState) {
70 super.onCreate(savedInstanceState);
71 setContentView(R.layout.passcodelock);
72
73 mBCancel = (Button) findViewById(R.id.cancel);
74 mPassCodeHdr = (TextView) findViewById(R.id.header);
75 mPassCodeHdrExplanation = (TextView) findViewById(R.id.explanation);
76 mText1 = (EditText) findViewById(R.id.txt1);
77 mText1.requestFocus();
78 getWindow().setSoftInputMode(android.view.WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
79 mText2 = (EditText) findViewById(R.id.txt2);
80 mText3 = (EditText) findViewById(R.id.txt3);
81 mText4 = (EditText) findViewById(R.id.txt4);
82
83 SharedPreferences appPrefs = PreferenceManager
84 .getDefaultSharedPreferences(getApplicationContext());
85
86
87 // Not Pass Code defined yet.
88 // In a previous version settings is allow from start
89 if ( (appPrefs.getString("PrefPinCode1", null) == null ) ){
90 setChangePassCodeView(true);
91 mPassCodeChecked = true;
92 mNewPasswordEntered = true;
93
94 } else {
95
96 /// TODO rewrite this activity; this logic is too twisted
97 if (appPrefs.getBoolean("set_pincode", false)){
98 // pass code activated
99 if (ACTION_TOGGLE.equals(getIntent().getAction())) {
100 // pass code has been activated yet
101 mPassCodeHdr.setText(R.string.pass_code_configure_your_pass_code);
102 mPassCodeHdrExplanation.setVisibility(View.VISIBLE);
103 mPassCodeChecked = true ; // No need to check it
104 setChangePassCodeView(true);
105 } else {
106 // pass code active
107 mBCancel.setVisibility(View.INVISIBLE);
108 mBCancel.setVisibility(View.GONE);
109 mPassCodeHdr.setText(R.string.pass_code_enter_pass_code);
110 mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
111 setChangePassCodeView(false);
112 }
113
114 } else {
115 // pass code removal
116 mPassCodeHdr.setText(R.string.pass_code_remove_your_pass_code);
117 mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
118 mPassCodeChecked = false;
119 setChangePassCodeView(true);
120 }
121
122 }
123 setTextListeners();
124
125 ActionBar actionBar = getSupportActionBar();
126 actionBar.setIcon(DisplayUtils.getSeasonalIconId());
127 }
128
129
130
131 protected void setInitVars(){
132 mConfirmingPassCode = false;
133 mPassCodeChecked = false;
134 mNewPasswordEntered = false;
135
136 }
137
138 protected void setInitView(){
139 mBCancel.setVisibility(View.INVISIBLE);
140 mBCancel.setVisibility(View.GONE);
141 mPassCodeHdr.setText(R.string.pass_code_enter_pass_code);
142 mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
143 }
144
145
146 protected void setChangePassCodeView(boolean state){
147
148 if(state){
149 mBCancel.setVisibility(View.VISIBLE);
150 mBCancel.setOnClickListener(new OnClickListener() {
151 @Override
152 public void onClick(View v) {
153
154 SharedPreferences.Editor appPrefsE = PreferenceManager
155 .getDefaultSharedPreferences(getApplicationContext()).edit();
156
157 SharedPreferences appPrefs = PreferenceManager
158 .getDefaultSharedPreferences(getApplicationContext());
159
160 boolean state = appPrefs.getBoolean("set_pincode", false);
161 appPrefsE.putBoolean("set_pincode",!state);
162 appPrefsE.commit();
163 setInitVars();
164 finish();
165 }
166 });
167 }
168
169 }
170
171
172
173 /*
174 *
175 */
176 protected void setTextListeners(){
177
178 /*------------------------------------------------
179 * FIRST BOX
180 -------------------------------------------------*/
181
182 mText1.addTextChangedListener(new TextWatcher() {
183
184 @Override
185 public void onTextChanged(CharSequence s, int start, int before,
186 int count) {
187 }
188
189 @Override
190 public void beforeTextChanged(CharSequence s, int start, int count,
191 int after) {
192 }
193
194 @Override
195 public void afterTextChanged(Editable s) {
196 if (s.length() > 0) {
197 if (!mConfirmingPassCode){
198 mTempText[0] = mText1.getText().toString();
199
200 }
201 mText2.requestFocus();
202 }
203 }
204 });
205
206
207
208 /*------------------------------------------------
209 * SECOND BOX
210 -------------------------------------------------*/
211 mText2.addTextChangedListener(new TextWatcher() {
212
213 @Override
214 public void onTextChanged(CharSequence s, int start, int before,
215 int count) {
216 }
217
218 @Override
219 public void beforeTextChanged(CharSequence s, int start, int count,
220 int after) {
221 }
222
223 @Override
224 public void afterTextChanged(Editable s) {
225 if (s.length() > 0) {
226 if (!mConfirmingPassCode){
227 mTempText[1] = mText2.getText().toString();
228 }
229
230 mText3.requestFocus();
231 }
232 }
233 });
234
235 mText2.setOnKeyListener(new OnKeyListener() {
236
237 @Override
238 public boolean onKey(View v, int keyCode, KeyEvent event) {
239 if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
240
241 mText1.setText("");
242 mText1.requestFocus();
243 if (!mConfirmingPassCode)
244 mTempText[0] = "";
245 mBChange= false;
246
247 }else if(!mBChange){
248 mBChange=true;
249
250 }
251 return false;
252 }
253 });
254
255 mText2.setOnFocusChangeListener(new OnFocusChangeListener() {
256
257 @Override
258 public void onFocusChange(View v, boolean hasFocus) {
259 mText2.setCursorVisible(true);
260 if (mText1.getText().toString().equals("")){
261 mText2.setSelected(false);
262 mText2.setCursorVisible(false);
263 mText1.requestFocus();
264 mText1.setSelected(true);
265 mText1.setSelection(0);
266 }
267
268 }
269 });
270
271
272 /*------------------------------------------------
273 * THIRD BOX
274 -------------------------------------------------*/
275 mText3.addTextChangedListener(new TextWatcher() {
276
277 @Override
278 public void onTextChanged(CharSequence s, int start, int before,
279 int count) {
280 }
281
282 @Override
283 public void beforeTextChanged(CharSequence s, int start, int count,
284 int after) {
285 }
286
287 @Override
288 public void afterTextChanged(Editable s) {
289 if (s.length() > 0) {
290 if (!mConfirmingPassCode){
291 mTempText[2] = mText3.getText().toString();
292 }
293 mText4.requestFocus();
294 }
295 }
296 });
297
298 mText3.setOnKeyListener(new OnKeyListener() {
299
300 @Override
301 public boolean onKey(View v, int keyCode, KeyEvent event) {
302 if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
303 mText2.requestFocus();
304 if (!mConfirmingPassCode)
305 mTempText[1] = "";
306 mText2.setText("");
307 mBChange= false;
308
309 }else if(!mBChange){
310 mBChange=true;
311
312 }
313 return false;
314 }
315 });
316
317 mText3.setOnFocusChangeListener(new OnFocusChangeListener() {
318
319 @Override
320 public void onFocusChange(View v, boolean hasFocus) {
321 mText3.setCursorVisible(true);
322 if (mText1.getText().toString().equals("")){
323 mText3.setSelected(false);
324 mText3.setCursorVisible(false);
325 mText1.requestFocus();
326 mText1.setSelected(true);
327 mText1.setSelection(0);
328 }else if (mText2.getText().toString().equals("")){
329 mText3.setSelected(false);
330 mText3.setCursorVisible(false);
331 mText2.requestFocus();
332 mText2.setSelected(true);
333 mText2.setSelection(0);
334 }
335
336 }
337 });
338
339 /*------------------------------------------------
340 * FOURTH BOX
341 -------------------------------------------------*/
342 mText4.addTextChangedListener(new TextWatcher() {
343
344 @Override
345 public void onTextChanged(CharSequence s, int start, int before,
346 int count) {
347 }
348
349 @Override
350 public void beforeTextChanged(CharSequence s, int start, int count,
351 int after) {
352 }
353
354 @Override
355 public void afterTextChanged(Editable s) {
356 if (s.length() > 0) {
357
358 if (!mConfirmingPassCode){
359 mTempText[3] = mText4.getText().toString();
360 }
361 mText1.requestFocus();
362
363 if (!mPassCodeChecked){
364 mPassCodeChecked = checkPassCode();
365 }
366
367 if (mPassCodeChecked) {
368 if (ACTION_REQUEST.equals(getIntent().getAction())) {
369 finish();
370
371 } else if (mPassCodeChecked) {
372 String newState = getIntent().getStringExtra(EXTRA_NEW_STATE);
373
374 // TODO - next decision should done according to the current state of PIN in prefs (enable or not), not whatever says de client
375 if (newState.equals("false")) {
376 SharedPreferences.Editor appPrefs = PreferenceManager
377 .getDefaultSharedPreferences(getApplicationContext()).edit();
378 appPrefs.putBoolean("set_pincode", false);
379 appPrefs.commit();
380
381 setInitVars();
382 passCodeEnd(false);
383
384 } else {
385
386 if (!mConfirmingPassCode) {
387 passCodeChangeRequest();
388
389 } else {
390 confirmPassCode();
391 }
392 }
393
394 }
395 }
396 }
397 }
398 });
399
400
401
402 mText4.setOnKeyListener(new OnKeyListener() {
403
404 @Override
405 public boolean onKey(View v, int keyCode, KeyEvent event) {
406 if (keyCode == KeyEvent.KEYCODE_DEL && mBChange) {
407 mText3.requestFocus();
408 if (!mConfirmingPassCode)
409 mTempText[2]="";
410 mText3.setText("");
411 mBChange= false;
412
413 }else if(!mBChange){
414 mBChange=true;
415 }
416 return false;
417 }
418 });
419
420 mText4.setOnFocusChangeListener(new OnFocusChangeListener() {
421
422 @Override
423 public void onFocusChange(View v, boolean hasFocus) {
424 mText4.setCursorVisible(true);
425
426 if (mText1.getText().toString().equals("")){
427 mText4.setSelected(false);
428 mText4.setCursorVisible(false);
429 mText1.requestFocus();
430 mText1.setSelected(true);
431 mText1.setSelection(0);
432 }else if (mText2.getText().toString().equals("")){
433 mText4.setSelected(false);
434 mText4.setCursorVisible(false);
435 mText2.requestFocus();
436 mText2.setSelected(true);
437 mText2.setSelection(0);
438 }else if (mText3.getText().toString().equals("")){
439 mText4.setSelected(false);
440 mText4.setCursorVisible(false);
441 mText3.requestFocus();
442 mText3.setSelected(true);
443 mText3.setSelection(0);
444 }
445
446 }
447 });
448
449
450
451 } // end setTextListener
452
453
454 protected void passCodeChangeRequest(){
455
456 clearBoxes();
457 mPassCodeHdr.setText(R.string.pass_code_reenter_your_pass_code);
458 mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
459 mConfirmingPassCode =true;
460
461 }
462
463
464 protected boolean checkPassCode(){
465
466
467 SharedPreferences appPrefs = PreferenceManager
468 .getDefaultSharedPreferences(getApplicationContext());
469
470 String pText1 = appPrefs.getString("PrefPinCode1", null);
471 String pText2 = appPrefs.getString("PrefPinCode2", null);
472 String pText3 = appPrefs.getString("PrefPinCode3", null);
473 String pText4 = appPrefs.getString("PrefPinCode4", null);
474
475 if ( mTempText[0].equals(pText1) &&
476 mTempText[1].equals(pText2) &&
477 mTempText[2].equals(pText3) &&
478 mTempText[3].equals(pText4) ) {
479
480 return true;
481
482
483 }else {
484 Arrays.fill(mTempText, null);
485 CharSequence errorSeq = getString(R.string.common_error);
486 Toast.makeText(this, errorSeq, Toast.LENGTH_LONG).show();
487
488 clearBoxes();
489 mPassCodeHdr.setText(R.string.pass_code_enter_pass_code);
490 mPassCodeHdrExplanation.setVisibility(View.INVISIBLE);
491 mNewPasswordEntered = true;
492 mConfirmingPassCode = false;
493
494 }
495
496
497 return false;
498 }
499
500 protected void confirmPassCode(){
501
502 mConfirmingPassCode = false;
503
504 String rText1 = mText1.getText().toString();
505 String rText2 = mText2.getText().toString();
506 String rText3 = mText3.getText().toString();
507 String rText4 = mText4.getText().toString();
508
509 if ( mTempText[0].equals(rText1) &&
510 mTempText[1].equals(rText2) &&
511 mTempText[2].equals(rText3) &&
512 mTempText[3].equals(rText4) ) {
513
514 savePassCodeAndExit();
515
516 } else {
517 Arrays.fill(mTempText, null);
518 CharSequence cseq = getString(R.string.pass_code_mismatch);
519 Toast.makeText(this, cseq, Toast.LENGTH_LONG).show();
520
521 mPassCodeHdr.setText(R.string.pass_code_configure_your_pass_code);
522 mPassCodeHdrExplanation.setVisibility(View.VISIBLE);
523 clearBoxes();
524 }
525
526 }
527
528
529 protected void passCodeEnd(boolean state){
530 CharSequence cseq;
531 if (state){
532 cseq = getString(R.string.pass_code_stored);
533 }else{
534 cseq = getString(R.string.pass_code_removed);
535 }
536
537 Toast.makeText(this, cseq, Toast.LENGTH_LONG).show();
538 finish();
539 }
540
541 protected void savePassCodeAndExit(){
542 SharedPreferences.Editor appPrefs = PreferenceManager
543 .getDefaultSharedPreferences(getApplicationContext()).edit();
544
545 appPrefs.putString("PrefPinCode1", mTempText[0]);
546 appPrefs.putString("PrefPinCode2",mTempText[1]);
547 appPrefs.putString("PrefPinCode3", mTempText[2]);
548 appPrefs.putString("PrefPinCode4", mTempText[3]);
549 appPrefs.putBoolean("set_pincode",true);
550 appPrefs.commit();
551
552 passCodeEnd(true);
553 }
554
555
556 protected void clearBoxes(){
557 mText1.setText("");
558 mText2.setText("");
559 mText3.setText("");
560 mText4.setText("");
561 mText1.requestFocus();
562 }
563
564
565 @Override
566 public boolean onKeyDown(int keyCode, KeyEvent event){
567 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
568 if (ACTION_TOGGLE.equals(getIntent().getAction())){
569 SharedPreferences.Editor appPrefsE = PreferenceManager
570 .getDefaultSharedPreferences(getApplicationContext()).edit();
571
572 SharedPreferences appPrefs = PreferenceManager
573 .getDefaultSharedPreferences(getApplicationContext());
574
575 boolean state = appPrefs.getBoolean("set_pincode", false);
576 appPrefsE.putBoolean("set_pincode",!state);
577 appPrefsE.commit();
578 setInitVars();
579 finish();
580 }
581 return true;
582 }
583 return super.onKeyDown(keyCode, event);
584 }
585 }