Pin code
authorDavid A. Velasco <dvelasco@solidgear.es>
Mon, 9 Jul 2012 09:11:44 +0000 (11:11 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Mon, 9 Jul 2012 09:11:44 +0000 (11:11 +0200)
AndroidManifest.xml
res/layout/pincodelock.xml [new file with mode: 0644]
res/values/styles.xml
res/xml/preferences.xml
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java [new file with mode: 0644]
src/eu/alefzero/owncloud/ui/activity/Preferences.java

index d9ec9af..1d386b9 100644 (file)
         </receiver>\r
 \r
         <activity android:name=".ui.activity.FileDetailActivity" />
+        <activity android:name=".ui.activity.PinCodeActivity" />\r
         <activity android:name=".extensions.ExtensionsAvailableActivity"></activity>
         <activity android:name=".extensions.ExtensionsListActivity"></activity>\r
         <activity android:name=".ui.activity.AccountSelectActivity" android:uiOptions="none" android:label="@string/prefs_accounts"></activity>\r
diff --git a/res/layout/pincodelock.xml b/res/layout/pincodelock.xml
new file mode 100644 (file)
index 0000000..9e0205a
--- /dev/null
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ownCloud Android client application
+
+  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 <http://www.gnu.org/licenses/>.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:oc="http://schemas.android.com/apk/res/eu.alefzero.owncloud"
+    android:layout_width="fill_parent"
+    android:layout_height="fill_parent"
+    android:gravity="center_horizontal"
+    android:orientation="vertical"
+    android:padding="20dp" >
+
+
+    <TextView
+        android:id="@+id/pinHdr"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Enter pin code"
+        android:textColor="@android:color/black"
+         />
+
+    <LinearLayout
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+      >
+
+        <EditText
+            android:id="@+id/txt1"
+            android:focusable="true"
+            style="@style/PassCodeStyle" />
+
+        <EditText
+            android:id="@+id/txt2"
+            style="@style/PassCodeStyle" />
+
+        <EditText
+            android:id="@+id/txt3"
+            style="@style/PassCodeStyle" />
+
+        <EditText
+            android:id="@+id/txt4"
+            style="@style/PassCodeStyle" />
+    </LinearLayout>
+
+    <Button android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Cancel"
+        android:textColor="@android:color/black"
+        android:id="@+id/cancel"/>
+</LinearLayout>
\ No newline at end of file
index 8d5491f..666bcee 100644 (file)
                <item name="@android:windowEnterAnimation">@anim/pump_bottom</item>
                <item name="@android:windowExitAnimation">@anim/disappear</item>
        </style>
+       
+       <style name="PassCodeStyle">
+        <item name="android:layout_width">50dp</item>
+        <item name="android:layout_height">50dp</item>
+               <item name="android:gravity">center</item>
+               <item name="android:layout_margin">10dp</item>
+               <item name="android:inputType">numberDecimal</item>
+               <item name="android:numeric">decimal</item>
+               <item name="android:digits">1234567890</item>
+               <item name="android:maxLength">1</item>
+               <item name="android:password">true</item>
+               <item name="android:singleLine">true</item>
+                   
+    </style>
+               
        <color name="setup_text_hint">#777777</color>
        <color name="setup_text_typed">#000000</color>
 </resources>
\ No newline at end of file
index 42e0784..7a32caf 100644 (file)
@@ -7,7 +7,12 @@
         android:title="@string/prefs_select_oc_account"
         android:summary="@string/prefs_summary_select_oc_account" 
         />
-    <Preference android:title="Manage accounts" android:key="manage_account" /><CheckBoxPreference android:key="instant_uploading" android:title="Enable instant uploading" android:summary="Instantly upload photos taken by camera"/>
+    <Preference android:title="Manage accounts" android:key="manage_account" />
+    <CheckBoxPreference android:title="ownCloud App PIN" android:key="set_pincode" 
+                        android:summary="Protect your ownCloud client"/>
+    <CheckBoxPreference android:key="instant_uploading" 
+                        android:title="Enable instant uploading" 
+                        android:summary="Instantly upload photos taken by camera"/>
     
        </PreferenceCategory>
     
index 1463759..d5bdc59 100644 (file)
@@ -33,11 +33,13 @@ import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
+import android.content.SharedPreferences;\r
 import android.content.pm.PackageInfo;\r
 import android.content.pm.PackageManager.NameNotFoundException;\r
 import android.database.Cursor;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
+import android.preference.PreferenceManager;\r
 import android.provider.MediaStore;\r
 import android.support.v4.app.FragmentTransaction;\r
 import android.util.Log;\r
@@ -129,6 +131,18 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             \r
             initDelayedTilAccountAvailabe();\r
             \r
+            // PIN CODE request\r
+            // best location is to decide; let's try this first\r
+            boolean pinStart = false;\r
+            SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());\r
+            pinStart = appPrefs.getBoolean("set_passcode", false);\r
+            \r
+            if (pinStart) {\r
+                Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);\r
+                i.putExtra("activity", "splash");\r
+                startActivity(i);\r
+            }\r
+            \r
         } else {\r
             \r
             setContentView(R.layout.no_account_available);\r
diff --git a/src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java b/src/eu/alefzero/owncloud/ui/activity/PinCodeActivity.java
new file mode 100644 (file)
index 0000000..c620952
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+ *
+ */
+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(); 
+    }
+            
+            
+}
index 22c9876..603466b 100644 (file)
@@ -84,6 +84,26 @@ public class Preferences extends SherlockPreferenceActivity implements
                 return true;\r
             }\r
         });\r
+        \r
+        CheckBoxPreference pCode = (CheckBoxPreference) findPreference("set_pincode");\r
+        if (pCode != null){\r
+            \r
+            pCode.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {\r
+                @Override\r
+                public boolean onPreferenceChange(Preference preference, Object newValue) {\r
+                    \r
+                                        \r
+                    Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);\r
+                    i.putExtra("activity", "preferences");\r
+                    i.putExtra("pinNewState",newValue.toString());\r
+                    startActivity(i);\r
+                    \r
+                    return true;\r
+                }\r
+            });            \r
+            \r
+        }\r
+        \r
     }\r
 \r
     /**\r