Prevent that PIN code is requested when system windows partially overlapping the...
[pub/Android/ownCloud.git] / src / com / owncloud / android / authentication / PasscodeManager.java
diff --git a/src/com/owncloud/android/authentication/PasscodeManager.java b/src/com/owncloud/android/authentication/PasscodeManager.java
new file mode 100644 (file)
index 0000000..a5eb06a
--- /dev/null
@@ -0,0 +1,76 @@
+package com.owncloud.android.authentication;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+
+import com.owncloud.android.MainApp;
+import com.owncloud.android.ui.activity.PinCodeActivity;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class PassCodeManager {
+
+    private static final Set<Class> sExemptOfPasscodeActivites;
+
+    static {
+        sExemptOfPasscodeActivites = new HashSet<Class>();
+        sExemptOfPasscodeActivites.add(AuthenticatorActivity.class);    // maybe not so good idea
+        sExemptOfPasscodeActivites.add(PinCodeActivity.class);
+    }
+
+    private static int PASS_CODE_TIMEOUT = 1000;
+
+    public static PassCodeManager mPassCodeManagerInstance = null;
+
+    public static PassCodeManager getPassCodeManager() {
+        if (mPassCodeManagerInstance == null) {
+            mPassCodeManagerInstance = new PassCodeManager();
+        }
+        return mPassCodeManagerInstance;
+    }
+
+    private Long mTimestamp = 0l;
+    private int mVisibleActivitiesCounter = 0;
+
+    protected PassCodeManager() {};
+
+    public void onActivityStarted(Activity activity) {
+        if (!sExemptOfPasscodeActivites.contains(activity.getClass()) &&
+                passCodeShouldBeRequested()
+                ){
+
+            Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
+            i.setAction(PinCodeActivity.ACTION_REQUEST);
+            activity.startActivity(i);
+        }
+
+        mVisibleActivitiesCounter++;    // AFTER passCodeShouldBeRequested was checked
+    }
+
+    public void onActivityStopped(Activity activity) {
+        if (mVisibleActivitiesCounter > 0) {
+            mVisibleActivitiesCounter--;
+        }
+        setUnlockTimestamp();
+    }
+
+    private boolean passCodeShouldBeRequested(){
+        if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT &&
+                mVisibleActivitiesCounter <= 0
+                ){
+            SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
+            if (appPrefs.getBoolean("set_pincode", false)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private void setUnlockTimestamp() {
+        mTimestamp = System.currentTimeMillis();
+    }
+
+}