1 /* ownCloud Android client application 
   2  *   Copyright (C) 2011 Bartek Przybylski 
   4  *   This program is free software: you can redistribute it and/or modify 
   5  *   it under the terms of the GNU General Public License version 2, 
   6  *   as published by the Free Software Foundation. 
   8  *   This program is distributed in the hope that it will be useful, 
   9  *   but WITHOUT ANY WARRANTY; without even the implied warranty of 
  10  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  11  *   GNU General Public License for more details. 
  13  *   You should have received a copy of the GNU General Public License 
  14  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. 
  17 package com
.owncloud
.android
.ui
.activity
; 
  19 import java
.util
.Arrays
; 
  21 import com
.actionbarsherlock
.app
.ActionBar
; 
  22 import com
.actionbarsherlock
.app
.SherlockFragmentActivity
; 
  23 import com
.owncloud
.android
.R
; 
  24 import com
.owncloud
.android
.utils
.DisplayUtils
; 
  26 import android
.app
.AlertDialog
; 
  27 import android
.content
.DialogInterface
; 
  28 import android
.content
.Intent
; 
  29 import android
.content
.SharedPreferences
; 
  30 import android
.os
.Bundle
; 
  31 import android
.preference
.PreferenceManager
; 
  32 import android
.text
.Editable
; 
  33 import android
.text
.TextWatcher
; 
  34 import android
.view
.KeyEvent
; 
  35 import android
.view
.View
; 
  36 import android
.view
.View
.OnClickListener
; 
  37 import android
.view
.View
.OnFocusChangeListener
; 
  38 import android
.view
.View
.OnKeyListener
; 
  39 import android
.widget
.Button
; 
  40 import android
.widget
.EditText
; 
  41 import android
.widget
.TextView
; 
  43 public class PinCodeActivity 
extends SherlockFragmentActivity 
{ 
  46     public final static String EXTRA_ACTIVITY 
= "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY"; 
  47     public final static String EXTRA_NEW_STATE 
= "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE"; 
  49     private Button mBCancel
; 
  50     private TextView mPinHdr
; 
  51     private TextView mPinHdrExplanation
; 
  52     private EditText mText1
; 
  53     private EditText mText2
; 
  54     private EditText mText3
; 
  55     private EditText mText4
; 
  57     private String 
[] mTempText 
={"","","",""}; 
  59     private String mActivity
; 
  61     private boolean mConfirmingPinCode 
= false
; 
  62     private boolean mPinCodeChecked 
= false
; 
  63     private boolean mNewPasswordEntered 
= false
; 
  64     private boolean mBChange 
= true
; // to control that only one blocks jump 
  65     //private int mTCounter ; // Count the number of attempts an user could introduce the PIN code 
  68     protected void onCreate(Bundle savedInstanceState
) { 
  69         super.onCreate(savedInstanceState
); 
  70         setContentView(R
.layout
.pincodelock
);  
  72         Intent intent 
= getIntent(); 
  73         mActivity 
= intent
.getStringExtra(EXTRA_ACTIVITY
); 
  75         mBCancel 
= (Button
) findViewById(R
.id
.cancel
); 
  76         mPinHdr 
= (TextView
) findViewById(R
.id
.pinHdr
); 
  77         mPinHdrExplanation 
= (TextView
) findViewById(R
.id
.pinHdrExpl
); 
  78         mText1 
= (EditText
) findViewById(R
.id
.txt1
); 
  79         mText1
.requestFocus(); 
  80         getWindow().setSoftInputMode(android
.view
.WindowManager
.LayoutParams
.SOFT_INPUT_STATE_VISIBLE
); 
  81         mText2 
= (EditText
) findViewById(R
.id
.txt2
); 
  82         mText3 
= (EditText
) findViewById(R
.id
.txt3
); 
  83         mText4 
= (EditText
) findViewById(R
.id
.txt4
); 
  85         SharedPreferences appPrefs 
= PreferenceManager
 
  86                 .getDefaultSharedPreferences(getApplicationContext()); 
  89         // Not PIN Code defined yet. 
  90         // In a previous version settings is allow from start 
  91         if ( (appPrefs
.getString("PrefPinCode1", null
) == null 
) ){ 
  92             setChangePincodeView(true
); 
  93             mPinCodeChecked 
= true
;  
  94             mNewPasswordEntered 
= true
; 
  98             if (appPrefs
.getBoolean("set_pincode", false
)){ 
 100                if (mActivity
.equals("preferences")){ 
 101                 // PIN has been activated yet 
 102                  mPinHdr
.setText(R
.string
.pincode_configure_your_pin
); 
 103                  mPinHdrExplanation
.setVisibility(View
.VISIBLE
); 
 104                  mPinCodeChecked 
= true 
; // No need to check it  
 105                  setChangePincodeView(true
); 
 108                  mBCancel
.setVisibility(View
.INVISIBLE
); 
 109                  mBCancel
.setVisibility(View
.GONE
); 
 110                  mPinHdr
.setText(R
.string
.pincode_enter_pin_code
); 
 111                  mPinHdrExplanation
.setVisibility(View
.INVISIBLE
); 
 112                  setChangePincodeView(false
); 
 117               mPinHdr
.setText(R
.string
.pincode_remove_your_pincode
); 
 118               mPinHdrExplanation
.setVisibility(View
.INVISIBLE
); 
 119               mPinCodeChecked 
= false
; 
 120               setChangePincodeView(true
);  
 126         ActionBar actionBar 
= getSupportActionBar(); 
 127         actionBar
.setIcon(DisplayUtils
.getSeasonalIconId()); 
 132     protected void setInitVars(){ 
 133         mConfirmingPinCode 
= false
; 
 134         mPinCodeChecked 
= false
; 
 135         mNewPasswordEntered 
= false
; 
 139     protected void setInitView(){ 
 140         mBCancel
.setVisibility(View
.INVISIBLE
); 
 141         mBCancel
.setVisibility(View
.GONE
); 
 142         mPinHdr
.setText(R
.string
.pincode_enter_pin_code
); 
 143         mPinHdrExplanation
.setVisibility(View
.INVISIBLE
); 
 147     protected void setChangePincodeView(boolean state
){ 
 150         mBCancel
.setVisibility(View
.VISIBLE
); 
 151         mBCancel
.setOnClickListener(new OnClickListener() { 
 153         public void onClick(View v
) { 
 155             SharedPreferences
.Editor appPrefsE 
= PreferenceManager
 
 156                     .getDefaultSharedPreferences(getApplicationContext()).edit(); 
 158             SharedPreferences appPrefs 
= PreferenceManager
 
 159                     .getDefaultSharedPreferences(getApplicationContext()); 
 161             boolean state 
= appPrefs
.getBoolean("set_pincode", false
); 
 162             appPrefsE
.putBoolean("set_pincode",!state
);  
 177     protected void setTextListeners(){ 
 179         /*------------------------------------------------ 
 181          -------------------------------------------------*/ 
 183         mText1
.addTextChangedListener(new TextWatcher() { 
 186             public void onTextChanged(CharSequence s
, int start
, int before
, 
 191             public void beforeTextChanged(CharSequence s
, int start
, int count
, 
 196             public void afterTextChanged(Editable s
) { 
 197                 if (s
.length() > 0) { 
 198                     if (!mConfirmingPinCode
){ 
 199                        mTempText
[0] = mText1
.getText().toString(); 
 202                     mText2
.requestFocus(); 
 209         /*------------------------------------------------ 
 211          -------------------------------------------------*/ 
 212         mText2
.addTextChangedListener(new TextWatcher() { 
 215             public void onTextChanged(CharSequence s
, int start
, int before
, 
 220             public void beforeTextChanged(CharSequence s
, int start
, int count
, 
 225             public void afterTextChanged(Editable s
) { 
 226                 if (s
.length() > 0) { 
 227                     if (!mConfirmingPinCode
){ 
 228                         mTempText
[1] = mText2
.getText().toString(); 
 231                     mText3
.requestFocus(); 
 236         mText2
.setOnKeyListener(new OnKeyListener() { 
 239             public boolean onKey(View v
, int keyCode
, KeyEvent event
) { 
 240                 if (keyCode 
== KeyEvent
.KEYCODE_DEL 
&& mBChange
) { 
 243                     mText1
.requestFocus(); 
 244                     if (!mConfirmingPinCode
) 
 256         mText2
.setOnFocusChangeListener(new OnFocusChangeListener() { 
 259             public void onFocusChange(View v
, boolean hasFocus
) { 
 260                 mText2
.setCursorVisible(true
); 
 261                 if (mText1
.getText().toString().equals("")){ 
 262                     mText2
.setSelected(false
); 
 263                     mText2
.setCursorVisible(false
); 
 264                     mText1
.requestFocus();  
 265                     mText1
.setSelected(true
); 
 266                     mText1
.setSelection(0); 
 273         /*------------------------------------------------ 
 275          -------------------------------------------------*/ 
 276         mText3
.addTextChangedListener(new TextWatcher() { 
 279             public void onTextChanged(CharSequence s
, int start
, int before
, 
 284             public void beforeTextChanged(CharSequence s
, int start
, int count
, 
 289             public void afterTextChanged(Editable s
) { 
 290                 if (s
.length() > 0) { 
 291                     if (!mConfirmingPinCode
){ 
 292                         mTempText
[2] = mText3
.getText().toString(); 
 294                     mText4
.requestFocus(); 
 299         mText3
.setOnKeyListener(new OnKeyListener() { 
 302             public boolean onKey(View v
, int keyCode
, KeyEvent event
) { 
 303                 if (keyCode 
== KeyEvent
.KEYCODE_DEL 
&& mBChange
) { 
 304                     mText2
.requestFocus(); 
 305                     if (!mConfirmingPinCode
) 
 318         mText3
.setOnFocusChangeListener(new OnFocusChangeListener() { 
 321             public void onFocusChange(View v
, boolean hasFocus
) { 
 322                 mText3
.setCursorVisible(true
); 
 323                 if (mText1
.getText().toString().equals("")){ 
 324                     mText3
.setSelected(false
); 
 325                     mText3
.setCursorVisible(false
); 
 326                     mText1
.requestFocus(); 
 327                     mText1
.setSelected(true
); 
 328                     mText1
.setSelection(0); 
 329                 }else if (mText2
.getText().toString().equals("")){ 
 330                     mText3
.setSelected(false
); 
 331                     mText3
.setCursorVisible(false
); 
 332                     mText2
.requestFocus(); 
 333                     mText2
.setSelected(true
); 
 334                     mText2
.setSelection(0); 
 340         /*------------------------------------------------ 
 342          -------------------------------------------------*/ 
 343         mText4
.addTextChangedListener(new TextWatcher() { 
 346             public void onTextChanged(CharSequence s
, int start
, int before
, 
 351             public void beforeTextChanged(CharSequence s
, int start
, int count
, 
 356             public void afterTextChanged(Editable s
) { 
 357                 if (s
.length() > 0) { 
 359                     if (!mConfirmingPinCode
){ 
 360                        mTempText
[3] = mText4
.getText().toString(); 
 362                     mText1
.requestFocus(); 
 364                     if (!mPinCodeChecked
){ 
 365                         mPinCodeChecked 
= checkPincode(); 
 368                     if (mPinCodeChecked 
&&  
 369                             ( mActivity
.equals("FileDisplayActivity") || mActivity
.equals("PreviewImageActivity") ) ){ 
 371                     } else if (mPinCodeChecked
){ 
 373                         Intent intent 
= getIntent(); 
 374                         String newState 
= intent
.getStringExtra(EXTRA_NEW_STATE
); 
 376                         if (newState
.equals("false")){ 
 377                             SharedPreferences
.Editor appPrefs 
= PreferenceManager
 
 378                                     .getDefaultSharedPreferences(getApplicationContext()).edit(); 
 379                             appPrefs
.putBoolean("set_pincode",false
); 
 387                             if (!mConfirmingPinCode
){ 
 388                                 pinCodeChangeRequest(); 
 403         mText4
.setOnKeyListener(new OnKeyListener() { 
 406             public boolean onKey(View v
, int keyCode
, KeyEvent event
) { 
 407                 if (keyCode 
== KeyEvent
.KEYCODE_DEL 
&& mBChange
) { 
 408                     mText3
.requestFocus(); 
 409                     if (!mConfirmingPinCode
) 
 421        mText4
.setOnFocusChangeListener(new OnFocusChangeListener() { 
 424             public void onFocusChange(View v
, boolean hasFocus
) { 
 425                 mText4
.setCursorVisible(true
); 
 427                 if (mText1
.getText().toString().equals("")){ 
 428                     mText4
.setSelected(false
); 
 429                     mText4
.setCursorVisible(false
); 
 430                     mText1
.requestFocus(); 
 431                     mText1
.setSelected(true
); 
 432                     mText1
.setSelection(0); 
 433                 }else if (mText2
.getText().toString().equals("")){ 
 434                     mText4
.setSelected(false
); 
 435                     mText4
.setCursorVisible(false
); 
 436                     mText2
.requestFocus(); 
 437                     mText2
.setSelected(true
); 
 438                     mText2
.setSelection(0); 
 439                 }else if (mText3
.getText().toString().equals("")){ 
 440                     mText4
.setSelected(false
); 
 441                     mText4
.setCursorVisible(false
); 
 442                     mText3
.requestFocus(); 
 443                     mText3
.setSelected(true
); 
 444                     mText3
.setSelection(0); 
 452     } // end setTextListener 
 455     protected void pinCodeChangeRequest(){ 
 458         mPinHdr
.setText(R
.string
.pincode_reenter_your_pincode
);  
 459         mPinHdrExplanation
.setVisibility(View
.INVISIBLE
);         
 460         mConfirmingPinCode 
=true
; 
 465     protected boolean checkPincode(){ 
 468         SharedPreferences appPrefs 
= PreferenceManager
 
 469                 .getDefaultSharedPreferences(getApplicationContext()); 
 471        String pText1 
= appPrefs
.getString("PrefPinCode1", null
); 
 472         String pText2 
= appPrefs
.getString("PrefPinCode2", null
); 
 473         String pText3 
= appPrefs
.getString("PrefPinCode3", null
); 
 474         String pText4 
= appPrefs
.getString("PrefPinCode4", null
); 
 476         if ( mTempText
[0].equals(pText1
) &&  
 477              mTempText
[1].equals(pText2
) && 
 478              mTempText
[2].equals(pText3
) && 
 479              mTempText
[3].equals(pText4
) ) { 
 485             Arrays
.fill(mTempText
, null
); 
 486             AlertDialog aDialog 
= new AlertDialog
.Builder(this).create(); 
 487             CharSequence errorSeq 
= getString(R
.string
.common_error
); 
 488             aDialog
.setTitle(errorSeq
); 
 489             CharSequence cseq 
= getString(R
.string
.pincode_wrong
); 
 490             aDialog
.setMessage(cseq
); 
 491             CharSequence okSeq 
= getString(R
.string
.common_ok
); 
 492             aDialog
.setButton(okSeq
, new DialogInterface
.OnClickListener(){ 
 495                 public void onClick(DialogInterface dialog
, int which
) { 
 502             mPinHdr
.setText(R
.string
.pincode_enter_pin_code
); 
 503             mPinHdrExplanation
.setVisibility(View
.INVISIBLE
); 
 504             mNewPasswordEntered 
= true
; 
 505             mConfirmingPinCode 
= false
; 
 513     protected void confirmPincode(){ 
 515         mConfirmingPinCode 
= false
; 
 517         String rText1 
= mText1
.getText().toString(); 
 518         String rText2 
= mText2
.getText().toString(); 
 519         String rText3 
= mText3
.getText().toString(); 
 520         String rText4 
= mText4
.getText().toString(); 
 522         if ( mTempText
[0].equals(rText1
) &&  
 523              mTempText
[1].equals(rText2
) && 
 524              mTempText
[2].equals(rText3
) && 
 525              mTempText
[3].equals(rText4
) ) { 
 527             savePincodeAndExit(); 
 531             Arrays
.fill(mTempText
, null
); 
 532             AlertDialog aDialog 
= new AlertDialog
.Builder(this).create(); 
 533             CharSequence errorSeq 
= getString(R
.string
.common_error
); 
 534             aDialog
.setTitle(errorSeq
); 
 535             CharSequence cseq 
= getString(R
.string
.pincode_mismatch
); 
 536             aDialog
.setMessage(cseq
); 
 537             CharSequence okSeq 
= getString(R
.string
.common_ok
); 
 538             aDialog
.setButton(okSeq
, new DialogInterface
.OnClickListener(){ 
 541                 public void onClick(DialogInterface dialog
, int which
) { 
 547             mPinHdr
.setText(R
.string
.pincode_configure_your_pin
); 
 548             mPinHdrExplanation
.setVisibility(View
.VISIBLE
); 
 555     protected void pinCodeEnd(boolean state
){ 
 556         AlertDialog aDialog 
= new AlertDialog
.Builder(this).create(); 
 559             CharSequence saveSeq 
= getString(R
.string
.common_save_exit
); 
 560             aDialog
.setTitle(saveSeq
); 
 561             CharSequence cseq 
= getString(R
.string
.pincode_stored
); 
 562             aDialog
.setMessage(cseq
); 
 565             CharSequence saveSeq 
= getString(R
.string
.common_save_exit
); 
 566             aDialog
.setTitle(saveSeq
); 
 567             CharSequence cseq 
= getString(R
.string
.pincode_removed
); 
 568             aDialog
.setMessage(cseq
); 
 571         CharSequence okSeq 
= getString(R
.string
.common_ok
); 
 572         aDialog
.setButton(okSeq
, new DialogInterface
.OnClickListener(){ 
 575             public void onClick(DialogInterface dialog
, int which
) { 
 584     protected void savePincodeAndExit(){ 
 585         SharedPreferences
.Editor appPrefs 
= PreferenceManager
 
 586                 .getDefaultSharedPreferences(getApplicationContext()).edit(); 
 588         appPrefs
.putString("PrefPinCode1", mTempText
[0]); 
 589         appPrefs
.putString("PrefPinCode2",mTempText
[1]); 
 590         appPrefs
.putString("PrefPinCode3", mTempText
[2]); 
 591         appPrefs
.putString("PrefPinCode4", mTempText
[3]); 
 592         appPrefs
.putBoolean("set_pincode",true
); 
 602     protected void clearBoxes(){ 
 608         mText1
.requestFocus();  
 613     public boolean onKeyDown(int keyCode
, KeyEvent event
){ 
 614         if (keyCode 
== KeyEvent
.KEYCODE_BACK 
&& event
.getRepeatCount()== 0){ 
 616             if (mActivity
.equals("preferences")){ 
 617                 SharedPreferences
.Editor appPrefsE 
= PreferenceManager
 
 619                     .getDefaultSharedPreferences(getApplicationContext()).edit(); 
 621                 SharedPreferences appPrefs 
= PreferenceManager
 
 622                     .getDefaultSharedPreferences(getApplicationContext()); 
 624                 boolean state 
= appPrefs
.getBoolean("set_pincode", false
); 
 625                 appPrefsE
.putBoolean("set_pincode",!state
);  
 634         return super.onKeyDown(keyCode
, event
);