PassCodeManager.java 3.1 KB

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