Refactored location of passcode check: a callback to rule them all
authorDavid A. Velasco <dvelasco@solidgear.es>
Wed, 29 Apr 2015 14:50:30 +0000 (16:50 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Wed, 29 Apr 2015 14:50:30 +0000 (16:50 +0200)
src/com/owncloud/android/MainApp.java
src/com/owncloud/android/authentication/PinCheck.java
src/com/owncloud/android/ui/activity/FileDisplayActivity.java
src/com/owncloud/android/ui/activity/PinCodeActivity.java
src/com/owncloud/android/ui/activity/Preferences.java
src/com/owncloud/android/ui/activity/Uploader.java
src/com/owncloud/android/ui/preview/PreviewImageActivity.java

index 760a5e7..789fa14 100644 (file)
  */
 package com.owncloud.android;
 
+import android.app.Activity;
 import android.app.Application;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
+import android.os.Build;
+import android.os.Bundle;
 
+import com.owncloud.android.authentication.AuthenticatorActivity;
+import com.owncloud.android.authentication.PinCheck;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.ui.activity.PinCodeActivity;
+
+import java.util.HashSet;
+import java.util.Set;
 
 /**
  * Main Application of the project
@@ -41,6 +51,14 @@ public class MainApp extends Application {
     private static final String TAG = MainApp.class.getSimpleName();
 
     private static final String AUTH_ON = "on";
+
+    private static final Set<String> sExemptOfPasscodeActivites;
+
+    static {
+        sExemptOfPasscodeActivites = new HashSet<String>();
+        sExemptOfPasscodeActivites.add(AuthenticatorActivity.class.getCanonicalName());
+        sExemptOfPasscodeActivites.add(PinCodeActivity.class.getCanonicalName());
+    }
     
     @SuppressWarnings("unused")
     private static final String POLICY_SINGLE_SESSION_PER_ACCOUNT = "single session per account";
@@ -75,6 +93,59 @@ public class MainApp extends Application {
             Log_OC.startLogging();
             Log_OC.d("Debug", "start logging");
         }
+
+        // register global protection with pass code
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+            this.registerActivityLifecycleCallbacks( new ActivityLifecycleCallbacks() {
+
+                @Override
+                public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onCreate(Bundle)" );
+                }
+
+                @Override
+                public void onActivityStarted(Activity activity) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onStart()" );
+                }
+
+                @Override
+                public void onActivityResumed(Activity activity) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onResume()" );
+                    if (!sExemptOfPasscodeActivites.contains(activity.getClass().getCanonicalName()) &&
+                        PinCheck.checkIfPinEntry()
+                            ){
+                        Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
+                        //i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, activity.getClass().getSimpleName());
+                        i.setAction(PinCodeActivity.ACTION_REQUEST);
+                        activity.startActivity(i);
+                    }
+                }
+
+                @Override
+                public void onActivityPaused(Activity activity) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onPause()");
+                    PinCheck.setUnlockTimestamp();
+                }
+
+                @Override
+                public void onActivityStopped(Activity activity) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onStop()" );
+
+                }
+
+                @Override
+                public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onSaveInstanceState(Bundle)" );
+
+                }
+
+                @Override
+                public void onActivityDestroyed(Activity activity) {
+                    Log_OC.d(TAG, activity.getClass().getSimpleName() + " in onDestroy()" );
+
+                }
+            });
+        }
     }
 
     public static Context getAppContext() {
index 0f3f4c5..2f48eb0 100644 (file)
@@ -9,8 +9,8 @@ import com.owncloud.android.MainApp;
 public class PinCheck extends Activity {
 
     private static Long timestamp = 0l;
-    private static Long lastStart = 0l;
-    private static int PINCODE_TIMEOUT = 10000;
+    private static Long lastStart = 0l; // this must be here because it's called twice - in onCreate and onResume
+    private static int PINCODE_TIMEOUT = 1000;
     
     public static void setUnlockTimestamp() {
         timestamp = System.currentTimeMillis();
@@ -18,7 +18,8 @@ public class PinCheck extends Activity {
 
     public static boolean checkIfPinEntry(){
         if ((System.currentTimeMillis() - timestamp) > PINCODE_TIMEOUT &&
-            (System.currentTimeMillis() - lastStart) > PINCODE_TIMEOUT){
+            (System.currentTimeMillis() - lastStart) > PINCODE_TIMEOUT
+            ){
             SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
             if (appPrefs.getBoolean("set_pincode", false)) {
                 lastStart = System.currentTimeMillis();
index 793f904..a94e978 100644 (file)
@@ -164,12 +164,13 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
 
         super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid
 
-        
+        /* TODO remove
         if (PinCheck.checkIfPinEntry()){
             Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
             i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "FileDisplayActivity");
             startActivity(i);
         }
+        */
 
         /// grant that FileObserverService is watching favorite files
         if (savedInstanceState == null) {
@@ -535,10 +536,6 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
                         sortByDate(false);
                         break;
                         
-// TODO re-enable when server-side folder size calculation is available                       
-//                    case 2:
-//                        sortBySize(false);
-//                        break;
                     }
                     
                     dialog.dismiss();
@@ -801,12 +798,6 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener {
         Log_OC.d(TAG, "onResume() start");
         super.onResume();
 
-        if (PinCheck.checkIfPinEntry()){
-            Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
-            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "FileDisplayActivity");
-            startActivity(i);
-        }
-    
         // refresh list of files
         refreshListOfFilesFragment();
 
index cdc9578..cab1917 100644 (file)
@@ -46,7 +46,9 @@ import com.owncloud.android.utils.DisplayUtils;
 public class PinCodeActivity extends SherlockFragmentActivity {
 
   
-    public final static String EXTRA_ACTIVITY = "com.owncloud.android.ui.activity.PinCodeActivity.ACTIVITY";
+    public final static String ACTION_TOGGLE = PinCodeActivity.class.getCanonicalName() + ".TOGGLE";
+    public final static String ACTION_REQUEST= PinCodeActivity.class.getCanonicalName()  + ".REQUEST";
+
     public final static String EXTRA_NEW_STATE = "com.owncloud.android.ui.activity.PinCodeActivity.NEW_STATE";
     
     private Button mBCancel;
@@ -59,8 +61,6 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     
     private String [] mTempText ={"","","",""};
     
-    private String mActivity;
-    
     private boolean mConfirmingPinCode = false;
     private boolean mPinCodeChecked = false;
     private boolean mNewPasswordEntered = false;
@@ -72,9 +72,6 @@ public class PinCodeActivity extends SherlockFragmentActivity {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.pincodelock); 
         
-        Intent intent = getIntent();
-        mActivity = intent.getStringExtra(EXTRA_ACTIVITY);
-     
         mBCancel = (Button) findViewById(R.id.cancel);
         mPinHdr = (TextView) findViewById(R.id.pinHdr);
         mPinHdrExplanation = (TextView) findViewById(R.id.pinHdrExpl);
@@ -96,31 +93,32 @@ public class PinCodeActivity extends SherlockFragmentActivity {
             mPinCodeChecked = true; 
             mNewPasswordEntered = true;
             
-        }else{ 
-            
+        } else {
+
+            /// TODO rewrite this activity; this logic is too twisted
             if (appPrefs.getBoolean("set_pincode", false)){
-               // pincode activated
-               if (mActivity.equals("preferences")){
-                // PIN has been activated yet
-                 mPinHdr.setText(R.string.pincode_configure_your_pin);
-                 mPinHdrExplanation.setVisibility(View.VISIBLE);
-                 mPinCodeChecked = true ; // No need to check it 
-                 setChangePincodeView(true);
-               }else{
-                // PIN active
-                 mBCancel.setVisibility(View.INVISIBLE);
-                 mBCancel.setVisibility(View.GONE);
-                 mPinHdr.setText(R.string.pincode_enter_pin_code);
-                 mPinHdrExplanation.setVisibility(View.INVISIBLE);
-                 setChangePincodeView(false);
+                // pincode activated
+                if (ACTION_TOGGLE.equals(getIntent().getAction())) {
+                    // PIN has been activated yet
+                    mPinHdr.setText(R.string.pincode_configure_your_pin);
+                    mPinHdrExplanation.setVisibility(View.VISIBLE);
+                    mPinCodeChecked = true ; // No need to check it
+                    setChangePincodeView(true);
+               } else {
+                    // PIN active
+                    mBCancel.setVisibility(View.INVISIBLE);
+                    mBCancel.setVisibility(View.GONE);
+                    mPinHdr.setText(R.string.pincode_enter_pin_code);
+                    mPinHdrExplanation.setVisibility(View.INVISIBLE);
+                    setChangePincodeView(false);
               }
             
-           }else {
-            // pincode removal
-              mPinHdr.setText(R.string.pincode_remove_your_pincode);
-              mPinHdrExplanation.setVisibility(View.INVISIBLE);
-              mPinCodeChecked = false;
-              setChangePincodeView(true); 
+           } else {
+                // pincode removal
+                mPinHdr.setText(R.string.pincode_remove_your_pincode);
+                mPinHdrExplanation.setVisibility(View.INVISIBLE);
+                mPinCodeChecked = false;
+                setChangePincodeView(true);
            }
            
         }
@@ -368,36 +366,36 @@ public class PinCodeActivity extends SherlockFragmentActivity {
                         mPinCodeChecked = checkPincode();
                     }
                     
-                    if (mPinCodeChecked && 
-                       (mActivity.equals("FileDisplayActivity") || mActivity.equals("PreviewImageActivity") || mActivity.equals("ownCloudUploader"))){
-                        PinCheck.setUnlockTimestamp();
-                        finish();
-                    } else if (mPinCodeChecked){
+                    if (mPinCodeChecked) {
                         PinCheck.setUnlockTimestamp();
-                        
-                        Intent intent = getIntent();
-                        String newState = intent.getStringExtra(EXTRA_NEW_STATE);
-                        
-                        if (newState.equals("false")){
-                            SharedPreferences.Editor appPrefs = PreferenceManager
-                                    .getDefaultSharedPreferences(getApplicationContext()).edit();
-                            appPrefs.putBoolean("set_pincode",false);
-                            appPrefs.commit();
-                            
-                            setInitVars();
-                            pinCodeEnd(false);
-                            
-                        }else{
-                        
-                            if (!mConfirmingPinCode){
-                                pinCodeChangeRequest();
-                             
+
+                        if (ACTION_REQUEST.equals(getIntent().getAction())) {
+                            finish();
+
+                        } else if (mPinCodeChecked) {
+                            String newState = getIntent().getStringExtra(EXTRA_NEW_STATE);
+
+                            // TODO - next decision should done according to the current state of PIN in prefs (enable or not), not whatever says de client
+                            if (newState.equals("false")) {
+                                SharedPreferences.Editor appPrefs = PreferenceManager
+                                        .getDefaultSharedPreferences(getApplicationContext()).edit();
+                                appPrefs.putBoolean("set_pincode", false);
+                                appPrefs.commit();
+
+                                setInitVars();
+                                pinCodeEnd(false);
+
                             } else {
-                                confirmPincode();
+
+                                if (!mConfirmingPinCode) {
+                                    pinCodeChangeRequest();
+
+                                } else {
+                                    confirmPincode();
+                                }
                             }
+
                         }
-                   
-                        
                     }    
                 }
             }
@@ -571,9 +569,8 @@ public class PinCodeActivity extends SherlockFragmentActivity {
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event){
         if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount()== 0){
-            if (mActivity.equals("preferences")){
+            if (ACTION_TOGGLE.equals(getIntent().getAction())){
                 SharedPreferences.Editor appPrefsE = PreferenceManager
-            
                     .getDefaultSharedPreferences(getApplicationContext()).edit();
             
                 SharedPreferences appPrefs = PreferenceManager
index ef9e39a..313a07b 100644 (file)
@@ -168,7 +168,7 @@ public class Preferences extends SherlockPreferenceActivity
                 @Override
                 public boolean onPreferenceChange(Preference preference, Object newValue) {
                     Intent i = new Intent(getApplicationContext(), PinCodeActivity.class);
-                    i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "preferences");
+                    i.setAction(PinCodeActivity.ACTION_TOGGLE);
                     i.putExtra(PinCodeActivity.EXTRA_NEW_STATE, newValue.toString());
                     startActivity(i);
                     
index d36e1cb..c8326e7 100644 (file)
@@ -118,13 +118,6 @@ public class Uploader extends FileActivity
         }
         super.onCreate(savedInstanceState);
 
-        // Check Pin entry
-        if (PinCheck.checkIfPinEntry()){
-            Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
-            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "ownCloudUploader");
-            startActivity(i);
-        }
-        
         ActionBar actionBar = getSupportActionBar();
         actionBar.setIcon(DisplayUtils.getSeasonalIconId());
 
index be48633..af10789 100644 (file)
@@ -104,13 +104,6 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener {
         actionBar.setIcon(DisplayUtils.getSeasonalIconId());
         actionBar.setDisplayHomeAsUpEnabled(true);
         actionBar.hide();
-        
-        // PIN CODE request
-        if (PinCheck.checkIfPinEntry()){
-            Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
-            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "PreviewImageActivity");
-            startActivity(i);
-        }
 
         // Make sure we're running on Honeycomb or higher to use FullScreen and
         // Immersive Mode
@@ -327,14 +320,7 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener {
     @Override
     protected void onResume() {
         super.onResume();
-        
-        if (PinCheck.checkIfPinEntry()){
-            Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
-            i.putExtra(PinCodeActivity.EXTRA_ACTIVITY, "PreviewImageActivity");
-            startActivity(i);
-        }
-        
-        //Log_OC.e(TAG, "ACTIVITY, ONRESUME");
+
         mDownloadFinishReceiver = new DownloadFinishReceiver();
         
         IntentFilter filter = new IntentFilter(FileDownloader.getDownloadFinishMessage());
@@ -344,7 +330,6 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener {
 
     @Override
     protected void onPostResume() {
-        //Log_OC.e(TAG, "ACTIVITY, ONPOSTRESUME");
         super.onPostResume();
     }