diff --git a/.gitignore b/.gitignore
index 179ae55..a7ba3d7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,4 +10,5 @@
*.apk
app/debug/output.json
app/release/output.json
-.idea/*
\ No newline at end of file
+.idea/*
+!.travis.yml
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..8a765ea
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,13 @@
+language: android
+android:
+ components:
+ - build-tools-26.0.2
+ - android-26
+ - extra
+ - sys-img-armeabi-v7a-android-24
+
+before_script:
+ - echo no | android create avd --force -n test -t android-24 --abi armeabi-v7a
+ - emulator -avd test -no-skin -no-audio -no-window &
+ - android-wait-for-emulator
+ - adb shell input keyevent 82 &
diff --git a/README.md b/README.md
index 6dd055c..69f20a7 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,7 @@
# OnePlus Applock Tweaker
-一加应用锁 Xposed 修改插件
-第一次写 Android, 如果你有想法, 可以提交 Pull Request!
\ No newline at end of file
+
+[![Build Status](https://travis-ci.org/Cyl18/OnePlus-5T-Applock-Tweaker.svg?branch=dev)](https://travis-ci.org/Cyl18/OnePlus-5T-Applock-Tweaker)
+
+An Xposed module which appends face unlock method to OnePlus Applocker.
+
+Licensed under WTFPL.
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/AppLockHooker.java b/app/src/main/java/com/cyl18/opapplocktweaker/AppLockHooker.java
index 817a159..08f010f 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/AppLockHooker.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/AppLockHooker.java
@@ -26,19 +26,22 @@
*/
public class AppLockHooker implements IXposedHookLoadPackage {
- private static final int ONEPLUS_APPLOCK_LAYOUT_ID = 2131558403;
- private static ServiceConnection connection = new MyServiceConnection();
- private static Activity currentApplockerActivity;
- private static TrackerConnector currentTracker;
+ private ServiceConnection connection;
+ private Activity currentApplockerActivity;
+ private TrackerHandler currentTracker;
- public static Activity getCurrentApplockerActivity() {
+ public Activity getCurrentApplockerActivity() {
return currentApplockerActivity;
}
- public static TrackerConnector getCurrentTracker() {
+ public TrackerHandler getCurrentTracker() {
return currentTracker;
}
+ public AppLockHooker() {
+ connection = new MyServiceConnection(this);
+ }
+
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (!lpparam.packageName.equals(Constants.APPLOCK_PACKAGE)) return;
@@ -256,7 +259,7 @@ private void hookFaceUnlockStart() {
Intent intent = new Intent();
intent.setClassName(Constants.FACEUNLOCK_PACKAGE, Constants.FACEUNLOCK_SERVICE);
currentApplockerActivity.bindService(intent, connection, Context.BIND_AUTO_CREATE);
- currentTracker = new TrackerConnector(XposedHelpers.getObjectField(currentApplockerActivity, Constants.TRACKER));
+ currentTracker = new TrackerHandler(XposedHelpers.getObjectField(currentApplockerActivity, Constants.TRACKER));
getLayout().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
@@ -267,7 +270,7 @@ public void onClick(View view) {
}
private View getLayout() {
- return currentApplockerActivity.findViewById(ONEPLUS_APPLOCK_LAYOUT_ID);
+ return currentApplockerActivity.findViewById(Constants.ONEPLUS_APPLOCK_LAYOUT_ID);
}
public String getUnlockPackageName() {
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/Constants.java b/app/src/main/java/com/cyl18/opapplocktweaker/Constants.java
index a9b4267..5054292 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/Constants.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/Constants.java
@@ -2,6 +2,8 @@
public interface Constants {
int USER_ID = 0;
+ int ONEPLUS_APPLOCK_LAYOUT_ID = 2131558403;
+
String APPLOCK_PACKAGE = "com.oneplus.applocker";
String APPLOCK_ACTIVITY_CONFIRM = "com.oneplus.applocker.ApplockerConfirmActivity";
String APPLOCK_ACTIVITY_CONFIRM_COMPLEX = "com.oneplus.applocker.ApplockerConfirmComplexPassword";
@@ -10,7 +12,7 @@ public interface Constants {
String FACEUNLOCK_PACKAGE = "com.oneplus.faceunlock";
String FACEUNLOCK_SERVICE = "com.oneplus.faceunlock.FaceUnlockService";
String TRACKER = "mCredentialCheckResultTracker";
- String THIS_PACKAGE = "com.cyl18.opapplocktweaker";
+ String APP_PACKAGE = "com.cyl18.opapplocktweaker";
String SHARED_SETTINGS_FILE = "OPApplockTweakerSettings";
String APPLOCK_CHOOSE_PASSWORD = "com.oneplus.applocker.ChooseLockSettingsHelper";
}
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/FaceUnlockServiceConnector.java b/app/src/main/java/com/cyl18/opapplocktweaker/FaceUnlockServiceConnector.java
index 827e750..b2643ea 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/FaceUnlockServiceConnector.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/FaceUnlockServiceConnector.java
@@ -22,13 +22,15 @@ public class FaceUnlockServiceConnector {
private static FaceUnlockServiceConnector instance;
private boolean started = false;
private IBinder currentBinder;
+ private AppLockHooker hooker;
public static FaceUnlockServiceConnector getInstance() {
return instance;
}
- public FaceUnlockServiceConnector() {
+ public FaceUnlockServiceConnector(AppLockHooker hooker) {
instance = this;
+ this.hooker = hooker;
}
public void startFaceUnlock(IBinder binder) {
@@ -64,13 +66,13 @@ public void stopFaceUnlock(boolean force) {
}
if (!force)
- if (!AppLockHooker.getCurrentTracker().getResult() &&
+ if (!hooker.getCurrentTracker().getResult() &&
isScreenOn())
startFaceUnlock();
}
private boolean isScreenOn() {
- DisplayManager dm = (DisplayManager) AppLockHooker.getCurrentApplockerActivity().getSystemService(Context.DISPLAY_SERVICE);
+ DisplayManager dm = (DisplayManager) hooker.getCurrentApplockerActivity().getSystemService(Context.DISPLAY_SERVICE);
if (dm == null)
return false;
Display[] displays = dm.getDisplays();
@@ -92,7 +94,7 @@ public void onBeginRecognize(int i) throws RemoteException {
@Override
public void onCompared(int faceId, int userId, int result, int compareTimeMillis, int score) throws RemoteException {
if (result != RESULT_SUCCESSFUL) return;
- Object activity = AppLockHooker.getCurrentApplockerActivity();
+ Object activity = hooker.getCurrentApplockerActivity();
try {
XposedHelpers.callMethod(activity, "onAuthenticated");
} catch (Throwable e) {
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/MyServiceConnection.java b/app/src/main/java/com/cyl18/opapplocktweaker/MyServiceConnection.java
index 6897735..ff2139e 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/MyServiceConnection.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/MyServiceConnection.java
@@ -5,7 +5,11 @@
import android.os.IBinder;
public class MyServiceConnection implements ServiceConnection {
- private static FaceUnlockServiceConnector faceUnlockServiceConnector = new FaceUnlockServiceConnector();
+ private static FaceUnlockServiceConnector faceUnlockServiceConnector;
+
+ public MyServiceConnection(AppLockHooker hooker) {
+ faceUnlockServiceConnector = new FaceUnlockServiceConnector(hooker);
+ }
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/SettingsActivity.java b/app/src/main/java/com/cyl18/opapplocktweaker/SettingsActivity.java
index 12da3d2..15278e9 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/SettingsActivity.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/SettingsActivity.java
@@ -27,6 +27,7 @@
import android.view.MenuItem;
import org.lukhnos.nnio.file.Files;
+import org.lukhnos.nnio.file.Path;
import org.lukhnos.nnio.file.Paths;
import java.io.File;
@@ -67,8 +68,6 @@ public boolean onPreferenceChange(Preference preference, Object value) {
? listPreference.getEntries()[index]
: null);
- } else if (preference instanceof CheckBoxPreference) {
- // do nothing
} else {
// For all other preferences, set the summary to the value's
// simple string representation.
@@ -103,10 +102,10 @@ private static void bindPreferenceSummaryToValue(Preference preference) {
// Trigger the listener immediately with the preference's
// current value.
if (preference instanceof EditTextPreference) {
- sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,
- PreferenceManager
- .getDefaultSharedPreferences(preference.getContext())
- .getString(preference.getKey(), ""));
+ sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager
+ .getDefaultSharedPreferences(preference.getContext())
+ .getString(preference.getKey(), "")
+ );
}
@@ -121,15 +120,8 @@ protected void onCreate(Bundle savedInstanceState) {
!= PackageManager.PERMISSION_GRANTED) {
// Should we show an explanation?
- if (ActivityCompat.shouldShowRequestPermissionRationale(this,
+ if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
-
- // Show an expanation to the user *asynchronously* -- don't block
- // this thread waiting for the user's response! After the user
- // sees the explanation, try again to request the permission.
-
- } else {
-
// No explanation needed, we can request the permission.
ActivityCompat.requestPermissions(this,
@@ -147,10 +139,8 @@ protected void onCreate(Bundle savedInstanceState) {
*/
private void setupActionBar() {
ActionBar actionBar = getSupportActionBar();
- if (actionBar != null) {
- // Show the Up button in the action bar.
- actionBar.setDisplayHomeAsUpEnabled(true);
- }
+ // Show the Up button in the action bar.
+ if (actionBar != null) actionBar.setDisplayHomeAsUpEnabled(true);
}
/**
@@ -250,16 +240,16 @@ private String getApplicationName(ApplicationInfo applicationInfo, PackageManage
@Override
public void onPause() {
super.onPause();
- // bad code here.
+ // bad code here. // good code appended. ---by Lasm_Gratel
- File prefsDir = new File(getActivity().getApplicationInfo().dataDir, "shared_prefs");
- File source = new File(prefsDir, getPreferenceManager().getSharedPreferencesName() + ".xml");
- File dest = new File(Environment.getExternalStorageDirectory(), Constants.SHARED_SETTINGS_FILE);
+ Path prefsPath = Paths.get(getActivity().getApplicationInfo().dataDir, "shared_prefs");
+ Path sourcePath = prefsPath.resolve(getPreferenceManager().getSharedPreferencesName() + ".xml");
+ Path destPath = Paths.get(Environment.getExternalStorageDirectory().getAbsolutePath(), Constants.SHARED_SETTINGS_FILE);
- if (source.exists()) {
- if (dest.exists()) dest.delete();
+ if (Files.exists(prefsPath)) {
try {
- Files.copy(Paths.get(source.toURI()), Paths.get(dest.toURI()));
+ Files.deleteIfExists(destPath);
+ Files.copy(sourcePath, destPath);
} catch (IOException e) {
e.printStackTrace();
}
@@ -275,13 +265,5 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
return super.onOptionsItemSelected(item);
}
-
-
}
-
- /**
- * This fragment shows notification preferences only. It is used when the
- * activity is showing a two-pane settings UI.
- */
-
}
diff --git a/app/src/main/java/com/cyl18/opapplocktweaker/TrackerConnector.java b/app/src/main/java/com/cyl18/opapplocktweaker/TrackerHandler.java
similarity index 80%
rename from app/src/main/java/com/cyl18/opapplocktweaker/TrackerConnector.java
rename to app/src/main/java/com/cyl18/opapplocktweaker/TrackerHandler.java
index 55fae53..65b952c 100644
--- a/app/src/main/java/com/cyl18/opapplocktweaker/TrackerConnector.java
+++ b/app/src/main/java/com/cyl18/opapplocktweaker/TrackerHandler.java
@@ -6,10 +6,10 @@
* Created by Cyl18 on 1/25/2018.
*/
-public class TrackerConnector {
+public class TrackerHandler {
private final Object tracker;
- public TrackerConnector(Object tracker) {
+ public TrackerHandler(Object tracker) {
this.tracker = tracker;
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 87406e1..9a781a0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -6,18 +6,18 @@
General
- For fast unlock
+ For fast unlock. (WARNING: HIGH SECURITY RISKS!)
Enable face recognition
- Quick unlock needs to know the exact length of your password
+ Quick unlock needs the exact length of your password to be active.
Enable quick unlock
Password length
Hide icon
- Replace applock password
+ Applock password replacement
Password
Apps to replace
Only replaces selected apps
Disable fingerprint
- Use password below instead of system password, please use the same password type as the system\'s
+ Use password below instead of system password, please use the same password type as system configured.
diff --git a/app/src/test/java/com/cyl18/opapplocktweaker/ExampleUnitTest.java b/app/src/test/java/com/cyl18/opapplocktweaker/ExampleUnitTest.java
index a193742..41a7be3 100644
--- a/app/src/test/java/com/cyl18/opapplocktweaker/ExampleUnitTest.java
+++ b/app/src/test/java/com/cyl18/opapplocktweaker/ExampleUnitTest.java
@@ -10,8 +10,4 @@
* @see Testing documentation
*/
public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() throws Exception {
- assertEquals(4, 2 + 2);
- }
}
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index ca3a300..f50440f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -16,5 +16,3 @@
systemProp.https.proxyPort=1080
systemProp.http.proxyHost=127.0.0.1
org.gradle.jvmargs=-Xmx1536m
-systemProp.https.proxyHost=127.0.0.1
-systemProp.http.proxyPort=1080
diff --git a/gradlew b/gradlew
old mode 100644
new mode 100755
diff --git a/gradlew.bat b/gradlew.bat
old mode 100644
new mode 100755