diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5b7d1fe558..1fb20757ab 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -142,6 +142,7 @@
+
diff --git a/res/layout/pincodelock.xml b/res/layout/pincodelock.xml
new file mode 100644
index 0000000000..9e0205ae27
--- /dev/null
+++ b/res/layout/pincodelock.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 8d5491fbb9..666bcee26d 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -69,6 +69,21 @@
- @anim/pump_bottom
- @anim/disappear
+
+
+
#777777
#000000
\ No newline at end of file
diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml
index 42e0784edc..7a32caf23c 100644
--- a/res/xml/preferences.xml
+++ b/res/xml/preferences.xml
@@ -7,7 +7,12 @@
android:title="@string/prefs_select_oc_account"
android:summary="@string/prefs_summary_select_oc_account"
/>
-
+
+
+
diff --git a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
index ae069b5d79..3412af817c 100644
--- a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
+++ b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
@@ -33,11 +33,13 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
+import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
@@ -129,6 +131,18 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
initDelayedTilAccountAvailabe();
+ // PIN CODE request
+ // best location is to decide; let's try this first
+ boolean pinStart = false;
+ SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
+ pinStart = appPrefs.getBoolean("set_passcode", false);
+
+ if (pinStart) {
+ Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
+ i.putExtra("activity", "splash");
+ startActivity(i);
+ }
+
} else {
setContentView(R.layout.no_account_available);
diff --git a/src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java b/src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java
new file mode 100644
index 0000000000..c62095257c
--- /dev/null
+++ b/src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java
@@ -0,0 +1,547 @@
+/* ownCloud Android client application
+ * Copyright (C) 2011 Bartek Przybylski
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+package eu.alefzero.owncloud.ui.activity;
+
+import com.actionbarsherlock.app.SherlockFragmentActivity;
+
+import eu.alefzero.owncloud.R;
+
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.preference.PreferenceManager;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnFocusChangeListener;
+import android.view.View.OnKeyListener;
+import android.widget.Button;
+import android.widget.EditText;
+import android.widget.TextView;
+
+
+public class PinCodeActivity extends SherlockFragmentActivity {
+
+
+
+ Button bCancel;
+ TextView mPinHdr;
+ EditText mText1;
+ EditText mText2;
+ EditText mText3;
+ EditText mText4;
+
+ String [] tempText ={"","","",""};
+
+ String activity;
+
+ boolean confirmingPinCode = false;
+ boolean pinCodeChecked = false;
+ boolean newPasswordEntered = false;
+ boolean bChange = true; // to control that only one blocks jump
+ int tCounter ; // Count the number of attempts an user could introduce de PIN code
+
+
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.pincodelock);
+
+ Intent intent = getIntent();
+ activity = intent.getStringExtra("activity");
+
+ bCancel = (Button) findViewById(R.id.cancel);
+ mPinHdr = (TextView) findViewById(R.id.pinHdr);
+ mText1 = (EditText) findViewById(R.id.txt1);
+ mText1.requestFocus();
+ mText2 = (EditText) findViewById(R.id.txt2);
+ mText3 = (EditText) findViewById(R.id.txt3);
+ mText4 = (EditText) findViewById(R.id.txt4);
+
+
+ SharedPreferences appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext());
+
+ // Not PIN Code defined yet
+ if ( appPrefs.getString("PrefPinCode1", null) == null ){
+ setChangePincodeView();
+ pinCodeChecked = true;
+ newPasswordEntered = true;
+
+ } else {
+ setInitView();
+ }
+
+
+ setTextListeners();
+
+
+ }
+
+
+ protected void setInitView(){
+ bCancel.setVisibility(View.INVISIBLE);
+ bCancel.setVisibility(View.GONE);
+ mPinHdr.setText("Please, Insert your PIN");
+ }
+
+
+
+ protected void setChangePincodeView(){
+ mPinHdr.setText("Configure your PIN");
+ bCancel.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ // TODO Auto-generated method stub
+ finish();
+ }
+ });
+
+ }
+
+ /*
+ *
+ */
+ protected void setTextListeners(){
+
+ /*------------------------------------------------
+ * FIRST BOX
+ -------------------------------------------------*/
+
+ mText1.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ // TODO Auto-generated method stub
+ if (s.length() > 0) {
+ if (!confirmingPinCode){
+ tempText[0] = mText1.getText().toString();
+
+ }
+ mText2.requestFocus();
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ // TODO Auto-generated method stub
+
+ }
+ });
+
+
+
+ /*------------------------------------------------
+ * SECOND BOX
+ -------------------------------------------------*/
+ mText2.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ // TODO Auto-generated method stub
+ if (s.length() > 0) {
+ if (!confirmingPinCode){
+ tempText[1] = mText2.getText().toString();
+ }
+ mText3.requestFocus();
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ // TODO Auto-generated method stub
+
+ }
+ });
+
+ mText2.setOnKeyListener(new OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ // TODO Auto-generated method stub
+
+ if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+
+ mText1.setText("");
+ mText1.requestFocus();
+ tempText[0] = "";
+ bChange= false;
+
+ }else if(!bChange){
+ bChange=true;
+
+ }
+ return false;
+ }
+ });
+
+ mText2.setOnFocusChangeListener(new OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ // TODO Auto-generated method stub
+ if (mText1.getText().toString().equals("")){
+ mText1.requestFocus();
+ }
+
+ }
+ });
+
+
+ /*------------------------------------------------
+ * THIRD BOX
+ -------------------------------------------------*/
+ mText3.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ // TODO Auto-generated method stub
+ if (s.length() > 0) {
+ if (!confirmingPinCode){
+ tempText[2] = mText3.getText().toString();
+ }
+ mText4.requestFocus();
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ // TODO Auto-generated method stub
+
+ }
+ });
+
+ mText3.setOnKeyListener(new OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ // TODO Auto-generated method stub
+
+ if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+ mText2.requestFocus();
+ tempText[1] = "";
+ mText2.setText("");
+ bChange= false;
+
+ }else if(!bChange){
+ bChange=true;
+
+ }
+ return false;
+ }
+ });
+
+ mText3.setOnFocusChangeListener(new OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ // TODO Auto-generated method stub
+ if (mText1.getText().toString().equals("")){
+ mText1.requestFocus();
+ }else if (mText2.getText().toString().equals("")){
+ mText2.requestFocus();
+ }
+
+ }
+ });
+
+ /*------------------------------------------------
+ * FOURTH BOX
+ -------------------------------------------------*/
+ mText4.addTextChangedListener(new TextWatcher() {
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before,
+ int count) {
+ // TODO Auto-generated method stub
+ if (s.length() > 0) {
+
+ if (!confirmingPinCode){
+ tempText[3] = mText4.getText().toString();
+ }
+ mText1.requestFocus();
+
+ if (!pinCodeChecked){
+ pinCodeChecked = checkPincode();
+ }
+
+ if (pinCodeChecked && activity.equals("splash")){
+ finish();
+ } else if (pinCodeChecked){
+
+ Intent intent = getIntent();
+ String newState = intent.getStringExtra("pinNewState");
+
+ if (newState.equals("false")){
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+ appPrefs.putBoolean("set_pincode",false);
+ appPrefs.commit();
+
+ // TODO Alert Message que salte y vuelva a la pantalla anterior
+
+ finish();
+
+
+ }else{
+
+ if (!confirmingPinCode && !newPasswordEntered){
+ pinCodeChangeRequest();
+ }else if (newPasswordEntered && !confirmingPinCode){
+ mPinHdr.setText("Confirm your PINCode, please");
+ confirmingPinCode = true;
+ clearBoxes();
+ }else {
+ confirmPincode();
+ }
+ }
+
+
+ }
+
+ }
+ }
+
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count,
+ int after) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+ // TODO Auto-generated method stub
+
+ }
+ });
+
+
+
+ mText4.setOnKeyListener(new OnKeyListener() {
+
+ @Override
+ public boolean onKey(View v, int keyCode, KeyEvent event) {
+ // TODO Auto-generated method stub
+
+ if (keyCode == KeyEvent.KEYCODE_DEL && bChange) {
+ mText3.requestFocus();
+ tempText[2]="";
+ mText3.setText("");
+ bChange= false;
+
+ }else if(!bChange){
+ bChange=true;
+ }
+ return false;
+ }
+ });
+
+ mText4.setOnFocusChangeListener(new OnFocusChangeListener() {
+
+ @Override
+ public void onFocusChange(View v, boolean hasFocus) {
+ // TODO Auto-generated method stub
+ if (mText1.getText().toString().equals("")){
+ mText1.requestFocus();
+ }else if (mText2.getText().toString().equals("")){
+ mText2.requestFocus();
+ }else if (mText3.getText().toString().equals("")){
+ mText3.requestFocus();
+ }
+
+ }
+ });
+
+
+
+ } // end setTextListener
+
+
+ protected void pinCodeChangeRequest(){
+
+ AlertDialog.Builder aBuilder = new AlertDialog.Builder(this);
+ aBuilder.setMessage("Do yo want to set a new PIN Code")
+ .setCancelable(false)
+ .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub
+ setChangePincodeView();
+ mPinHdr.setText("Please, insert your new PIN Code");
+ clearBoxes();
+ newPasswordEntered = true;
+ }
+ })
+ .setNegativeButton("No", new DialogInterface.OnClickListener() {
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+ appPrefs.putBoolean("set_pincode",false);
+ appPrefs.commit();
+ finish();
+ }
+ });
+
+ AlertDialog alert =aBuilder.create();
+
+ alert.show();
+
+
+ }
+
+
+ protected boolean checkPincode(){
+
+
+ SharedPreferences appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext());
+
+ String pText1 = appPrefs.getString("PrefPinCode1", null);
+ String pText2 = appPrefs.getString("PrefPinCode2", null);
+ String pText3 = appPrefs.getString("PrefPinCode3", null);
+ String pText4 = appPrefs.getString("PrefPinCode4", null);
+
+ if ( tempText[0].equals(pText1) &&
+ tempText[1].equals(pText2) &&
+ tempText[2].equals(pText3) &&
+ tempText[3].equals(pText4) ) {
+
+ return true;
+
+
+ }else {
+ AlertDialog aDialog = new AlertDialog.Builder(this).create();
+ aDialog.setTitle("ERROR");
+ aDialog.setMessage("Wrong PIN");
+ aDialog.setButton("OK", new DialogInterface.OnClickListener(){
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub("");
+ return;
+ }
+
+ });
+ aDialog.show();
+ clearBoxes();
+ mPinHdr.setText("Configure your PIN");
+ newPasswordEntered = true;
+ confirmingPinCode = false;
+
+ }
+
+
+ return false;
+ }
+
+ protected void confirmPincode(){
+
+ confirmingPinCode = false;
+
+ String rText1 = mText1.getText().toString();
+ String rText2 = mText2.getText().toString();
+ String rText3 = mText3.getText().toString();
+ String rText4 = mText4.getText().toString();
+
+ if ( tempText[0].equals(rText1) &&
+ tempText[1].equals(rText2) &&
+ tempText[2].equals(rText3) &&
+ tempText[3].equals(rText4) ) {
+
+ savePincodeAndExit();
+
+ } else {
+
+ AlertDialog aDialog = new AlertDialog.Builder(this).create();
+ aDialog.setTitle("ERROR");
+ aDialog.setMessage("PIN Code Mismatch");
+ aDialog.setButton("OK", new DialogInterface.OnClickListener(){
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // TODO Auto-generated method stub("");
+ return;
+ }
+
+ });
+ aDialog.show();
+ mPinHdr.setText("Configure your PIN");
+ clearBoxes();
+ }
+
+ }
+
+ protected void savePincodeAndExit(){
+ SharedPreferences.Editor appPrefs = PreferenceManager
+ .getDefaultSharedPreferences(getApplicationContext()).edit();
+
+ appPrefs.putString("PrefPinCode1", tempText[0]);
+ appPrefs.putString("PrefPinCode2",tempText[1]);
+ appPrefs.putString("PrefPinCode3", tempText[2]);
+ appPrefs.putString("PrefPinCode4", tempText[3]);
+ appPrefs.putBoolean("set_pincode",true);
+ appPrefs.commit();
+
+ finish();
+ }
+
+
+ protected void clearBoxes(){
+
+ mText1.setText("");
+ mText2.setText("");
+ mText3.setText("");
+ mText4.setText("");
+ mText1.requestFocus();
+ }
+
+
+}
diff --git a/src/eu/alefzero/owncloud/ui/activity/Preferences.java b/src/eu/alefzero/owncloud/ui/activity/Preferences.java
index 22c987673e..603466bde9 100644
--- a/src/eu/alefzero/owncloud/ui/activity/Preferences.java
+++ b/src/eu/alefzero/owncloud/ui/activity/Preferences.java
@@ -84,6 +84,26 @@ public class Preferences extends SherlockPreferenceActivity implements
return true;
}
});
+
+ CheckBoxPreference pCode = (CheckBoxPreference) findPreference("set_pincode");
+ if (pCode != null){
+
+ pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+
+
+ Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
+ i.putExtra("activity", "preferences");
+ i.putExtra("pinNewState",newValue.toString());
+ startActivity(i);
+
+ return true;
+ }
+ });
+
+ }
+
}
/**