Skip to content

Commit

Permalink
Merge pull request #1439 from Neamar/double-tap-to-lock
Browse files Browse the repository at this point in the history
Double tap to lock screen
  • Loading branch information
Neamar authored Apr 15, 2020
2 parents ba189e3 + 5defb1b commit 924a25b
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 6 deletions.
12 changes: 12 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,18 @@
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>

<service
android:name=".utils.LockAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>

<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/lock_accessibility_service_config" />
</service>
</application>

</manifest>
69 changes: 64 additions & 5 deletions app/src/main/java/fr/neamar/kiss/forwarder/ExperienceTweaks.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
package fr.neamar.kiss.forwarder;

import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ServiceInfo;
import android.os.Build;
import android.os.Handler;
import android.provider.Settings;
import android.text.InputType;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityManager;
import android.widget.ImageView;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import fr.neamar.kiss.MainActivity;
import fr.neamar.kiss.R;
import fr.neamar.kiss.searcher.HistorySearcher;
import fr.neamar.kiss.searcher.NullSearcher;
import fr.neamar.kiss.searcher.Searcher;
import fr.neamar.kiss.utils.LockAccessibilityService;

// Deals with any settings in the "User Experience" setting sub-screen
class ExperienceTweaks extends Forwarder {
Expand Down Expand Up @@ -46,6 +54,7 @@ class ExperienceTweaks extends Forwarder {
private View mainEmptyView;
private final GestureDetector gd;

@SuppressLint("SourceLockedOrientationActivity")
ExperienceTweaks(final MainActivity mainActivity) {
super(mainActivity);

Expand All @@ -63,14 +72,43 @@ class ExperienceTweaks extends Forwarder {

gd = new GestureDetector(mainActivity, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(prefs.getBoolean("history-onclick", false)) {
public boolean onSingleTapConfirmed(MotionEvent e) {
if (prefs.getBoolean("history-onclick", false)) {
doAction("display-history");
}

return super.onSingleTapConfirmed(e);
}

@Override
public boolean onDoubleTap(MotionEvent e) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
return super.onDoubleTap(e);
}

if (isAccessibilityServiceEnabled(mainActivity)) {
Intent intent = new Intent(LockAccessibilityService.ACTION_LOCK, null, mainActivity, LockAccessibilityService.class);
mainActivity.startService(intent);
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);
builder.setMessage(R.string.enable_double_tap_to_lock);

builder.setPositiveButton(android.R.string.ok, (dialog, which) -> {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mainActivity.startActivity(intent);
});

builder.setNegativeButton(android.R.string.cancel, (dialog, which) -> {
dialog.dismiss();
});

AlertDialog alert = builder.create();
alert.show();
}
return super.onDoubleTap(e);
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
float directionY = e2.getY() - e1.getY();
Expand All @@ -95,7 +133,7 @@ private void doAction(String action) {
mainActivity.showKeyboard();
break;
case "display-apps":
if(mainActivity.isViewingSearchResults()) {
if (mainActivity.isViewingSearchResults()) {
mainActivity.displayKissBar(true);
}
break;
Expand Down Expand Up @@ -160,7 +198,7 @@ void onResume() {
}
}

void onTouch(View view, MotionEvent event) {
void onTouch(MotionEvent event) {
// Forward touch events to the gesture detector
gd.onTouchEvent(event);
}
Expand Down Expand Up @@ -225,7 +263,7 @@ private void adjustInputType() {
@SuppressWarnings("CatchAndPrintStackTrace")
private void displayNotificationDrawer() {
@SuppressLint("WrongConstant") Object sbservice = mainActivity.getSystemService("statusbar");
Class<?> statusbarManager = null;
Class<?> statusbarManager;
try {
statusbarManager = Class.forName("android.app.StatusBarManager");
Method showStatusBar;
Expand Down Expand Up @@ -277,4 +315,25 @@ private boolean isKeyboardOnStartEnabled() {
private boolean isSuggestionsEnabled() {
return prefs.getBoolean("enable-suggestions-keyboard", false);
}

/**
* Are we allowed to run our AccessibilityService?
*/
private boolean isAccessibilityServiceEnabled(Context context) {
AccessibilityManager am = (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
if (am == null) {
return false;
}

List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK);


for (AccessibilityServiceInfo enabledService : enabledServices) {
ServiceInfo enabledServiceInfo = enabledService.getResolveInfo().serviceInfo;
if (enabledServiceInfo.packageName.equals(context.getPackageName()) && enabledServiceInfo.name.equals(LockAccessibilityService.class.getName()))
return true;
}

return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public void onCreateContextMenu(ContextMenu menu) {
}

public boolean onTouch(View view, MotionEvent event) {
experienceTweaks.onTouch(view, event); // always return false anyway
experienceTweaks.onTouch(event);
return liveWallpaperForwarder.onTouch(view, event);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package fr.neamar.kiss.utils;

import android.accessibilityservice.AccessibilityService;
import android.app.Service;
import android.content.Intent;
import android.os.Build;
import android.view.accessibility.AccessibilityEvent;

public class LockAccessibilityService extends AccessibilityService {
public static String ACTION_LOCK = "fr.neamar.kiss.LOCK";

@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

}

@Override
public void onInterrupt() {

}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (ACTION_LOCK.equals(intent.getAction())) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
performGlobalAction(AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN);
}
}
return Service.START_STICKY;
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,8 @@
<string name="menu_size_up">Enlarge</string>
<string name="menu_widget_move_up">Move up</string>
<string name="menu_widget_move_down">Move down</string>
<string name="lock_service_description">Lock screen from KISS Launcher</string>
<string name="gesture_up_name">Action on swipe up</string>
<string name="gesture_down_name">Action on swipe down</string>
<string name="enable_double_tap_to_lock">To enable double-tap to lock, you\'ll need to grant additional permissions: enable KISS in the following screen.</string>
</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/xml/lock_accessibility_service_config.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityFeedbackType="feedbackGeneric"
android:description="@string/lock_service_description"
android:settingsActivity="fr.neamar.kiss.SettingsActivity" />

0 comments on commit 924a25b

Please sign in to comment.