/*
* App passcode library for Android, master branch
* Dual licensed under MIT, and GPL.
* See https://github.com/wordpress-mobile/Android-PasscodeLock
*/
package com.seafile.seadroid2.gesturelock;
import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.google.common.collect.MapMaker;
import com.google.common.collect.Maps;
import com.seafile.seadroid2.SettingsManager;
import com.seafile.seadroid2.ui.activity.UnlockGesturePasswordActivity;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
/**
* Implementation of AppLock
*/
public class DefaultAppLock extends AbstractAppLock {
public static final String DEBUG_TAG = "DefaultAppLock";
private Application currentApp; //Keep a reference to the app that invoked the locker
private SettingsManager settingsMgr;
/** by default, the returned map uses equality comparisons (the equals method) to determine equality for keys or values.
* However, if weakKeys() was specified, the map uses identity (==) comparisons instead for keys.
* Likewise, if weakValues() or softValues() was specified, the map uses identity (==) comparisons for values. */
private static ConcurrentMap<Object, Long> mCheckedActivities = new MapMaker()
.weakKeys()
.makeMap();
public DefaultAppLock(Application currentApp) {
super();
this.currentApp = currentApp;
this.settingsMgr = SettingsManager.instance();
}
public void enable() {
if (android.os.Build.VERSION.SDK_INT < 14)
return;
currentApp.registerActivityLifecycleCallbacks(this);
}
@Override
public void disable() {
if (android.os.Build.VERSION.SDK_INT < 14)
return;
currentApp.unregisterActivityLifecycleCallbacks(this);
}
@Override
public void onActivityPaused(Activity activity) {
Log.d(DEBUG_TAG, "onActivityPaused");
if (activity.getClass() == UnlockGesturePasswordActivity.class)
return;
if (!isActiviyBeingChecked(activity)) {
settingsMgr.saveGestureLockTimeStamp();
}
}
private boolean isActiviyBeingChecked(Activity activity) {
if (!mCheckedActivities.containsKey(activity)) {
return false;
}
long ts = mCheckedActivities.get(activity);
return ts + 2000 > System.currentTimeMillis();
}
@Override
public void onActivityResumed(Activity activity) {
Log.d(DEBUG_TAG, "onActivityResumed");
/** just compare fully-qualified names to determine if two classes being equal
* even if they've been loaded by different classloaders,
* possibly from different locations */
if (activity.getClass() == UnlockGesturePasswordActivity.class)
return;
if (settingsMgr.isGestureLockRequired()) {
mCheckedActivities.put(activity, System.currentTimeMillis());
Intent i = new Intent(activity, UnlockGesturePasswordActivity.class);
activity.startActivity(i);
}
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}