a49b2ab8ed3f39e82a4dee558f202d09f168bad0
[pub/Android/ownCloud.git] / src / com / owncloud / android / authentication / PassCodeManager.java
1 package com.owncloud.android.authentication;
2
3 import android.app.Activity;
4 import android.content.Context;
5 import android.content.Intent;
6 import android.content.SharedPreferences;
7 import android.os.PowerManager;
8 import android.preference.PreferenceManager;
9 import android.view.View;
10 import android.view.WindowManager;
11
12 import com.owncloud.android.MainApp;
13 import com.owncloud.android.ui.activity.PinCodeActivity;
14
15 import java.util.HashSet;
16 import java.util.Set;
17
18 public class PassCodeManager {
19
20 private static final Set<Class> sExemptOfPasscodeActivites;
21
22 static {
23 sExemptOfPasscodeActivites = new HashSet<Class>();
24 sExemptOfPasscodeActivites.add(PinCodeActivity.class);
25 // other activities may be exempted, if needed
26 }
27
28 private static int PASS_CODE_TIMEOUT = 1000;
29 // keeping a "low" positive value is the easiest way to prevent the pass code is requested on rotations
30
31 public static PassCodeManager mPassCodeManagerInstance = null;
32
33 public static PassCodeManager getPassCodeManager() {
34 if (mPassCodeManagerInstance == null) {
35 mPassCodeManagerInstance = new PassCodeManager();
36 }
37 return mPassCodeManagerInstance;
38 }
39
40 private Long mTimestamp = 0l;
41 private int mVisibleActivitiesCounter = 0;
42
43 protected PassCodeManager() {};
44
45 public void onActivityCreated(Activity activity) {
46 if (passCodeIsEnabled()) {
47 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
48 } else {
49 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
50 }
51 }
52
53 public void onActivityStarted(Activity activity) {
54 if (!sExemptOfPasscodeActivites.contains(activity.getClass()) &&
55 passCodeShouldBeRequested()
56 ){
57
58 Intent i = new Intent(MainApp.getAppContext(), PinCodeActivity.class);
59 i.setAction(PinCodeActivity.ACTION_REQUEST);
60 i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
61 activity.startActivity(i);
62
63 }
64
65 mVisibleActivitiesCounter++; // keep it AFTER passCodeShouldBeRequested was checked
66 }
67
68 public void onActivityStopped(Activity activity) {
69 if (mVisibleActivitiesCounter > 0) {
70 mVisibleActivitiesCounter--;
71 }
72 setUnlockTimestamp();
73 PowerManager powerMgr = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
74 if (passCodeIsEnabled() && powerMgr != null && !powerMgr.isScreenOn()) {
75 activity.moveTaskToBack(true);
76 }
77 }
78
79 private void setUnlockTimestamp() {
80 mTimestamp = System.currentTimeMillis();
81 }
82
83 private boolean passCodeShouldBeRequested(){
84 if ((System.currentTimeMillis() - mTimestamp) > PASS_CODE_TIMEOUT &&
85 mVisibleActivitiesCounter <= 0
86 ){
87 return passCodeIsEnabled();
88 }
89 return false;
90 }
91
92 private boolean passCodeIsEnabled() {
93 SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(MainApp.getAppContext());
94 return (appPrefs.getBoolean("set_pincode", false));
95 }
96
97 }