Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
cmsdk: Add touchscreen gestures support
Add the CMHW implementation for touchscreen gestures.

Change-Id: Iabeee255748fc92376bc861409a7074de570cb0c
  • Loading branch information
zwliew committed Feb 1, 2017
1 parent f142715 commit cfaf39e
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 0 deletions.
12 changes: 12 additions & 0 deletions api/cm_current.txt
Expand Up @@ -464,6 +464,7 @@ package cyanogenmod.hardware {
method public deprecated int getDisplayGammaCalibrationMax();
method public deprecated int getDisplayGammaCalibrationMin();
method public cyanogenmod.hardware.DisplayMode[] getDisplayModes();
method public cyanogenmod.hardware.TouchscreenGesture[] getTouchscreenGestures();
method public static cyanogenmod.hardware.CMHardwareManager getInstance(android.content.Context);
method public java.lang.String getLtoDestination();
method public long getLtoDownloadInterval();
Expand Down Expand Up @@ -493,6 +494,7 @@ package cyanogenmod.hardware {
method public deprecated boolean setDisplayGammaCalibration(int, int[]);
method public boolean setDisplayMode(cyanogenmod.hardware.DisplayMode, boolean);
method public boolean setPictureAdjustment(cyanogenmod.hardware.HSIC);
method public boolean setTouchscreenGestureEnabled(cyanogenmod.hardware.TouchscreenGesture, boolean);
method public boolean setVibratorIntensity(int);
method public boolean unRegisterThermalListener(cyanogenmod.hardware.ThermalListenerCallback);
method public boolean writePersistentBytes(java.lang.String, byte[]);
Expand All @@ -515,6 +517,7 @@ package cyanogenmod.hardware {
field public static final deprecated int FEATURE_TAP_TO_WAKE = 512; // 0x200
field public static final int FEATURE_THERMAL_MONITOR = 32768; // 0x8000
field public static final int FEATURE_TOUCH_HOVERING = 2048; // 0x800
field public static final int FEATURE_TOUCHSCREEN_GESTURES = 524288; // 0x80000
field public static final int FEATURE_UNIQUE_DEVICE_ID = 65536; // 0x10000
field public static final int FEATURE_VIBRATOR = 1024; // 0x400
}
Expand Down Expand Up @@ -543,6 +546,15 @@ package cyanogenmod.hardware {
method public void writeToParcel(android.os.Parcel, int);
}

public class TouchscreenGesture implements android.os.Parcelable {
ctor public TouchscreenGesture(int, java.lang.String, int);
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public final int id;
field public final java.lang.String name;
field public final int keycode;
}

public abstract interface IThermalListenerCallback implements android.os.IInterface {
method public abstract void onThermalChanged(int) throws android.os.RemoteException;
}
Expand Down
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015-2016 The CyanogenMod Project
* 2017 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -34,6 +35,7 @@
import cyanogenmod.hardware.IThermalListenerCallback;
import cyanogenmod.hardware.ThermalListenerCallback;
import cyanogenmod.hardware.HSIC;
import cyanogenmod.hardware.TouchscreenGesture;

import java.io.File;
import java.util.ArrayList;
Expand All @@ -56,6 +58,7 @@
import org.cyanogenmod.hardware.SunlightEnhancement;
import org.cyanogenmod.hardware.ThermalMonitor;
import org.cyanogenmod.hardware.ThermalUpdateCallback;
import org.cyanogenmod.hardware.TouchscreenGestures;
import org.cyanogenmod.hardware.TouchscreenHovering;
import org.cyanogenmod.hardware.UniqueDeviceId;
import org.cyanogenmod.hardware.VibratorHW;
Expand Down Expand Up @@ -117,6 +120,9 @@ private interface CMHardwareInterface {
public HSIC getDefaultPictureAdjustment();
public boolean setPictureAdjustment(HSIC hsic);
public List<Range<Float>> getPictureAdjustmentRanges();

public TouchscreenGesture[] getTouchscreenGestures();
public boolean setTouchscreenGestureEnabled(TouchscreenGesture gesture, boolean state);
}

private class LegacyCMHardware implements CMHardwareInterface {
Expand Down Expand Up @@ -160,6 +166,8 @@ public LegacyCMHardware() {
mSupportedFeatures |= CMHardwareManager.FEATURE_COLOR_BALANCE;
if (PictureAdjustment.isSupported())
mSupportedFeatures |= CMHardwareManager.FEATURE_PICTURE_ADJUSTMENT;
if (TouchscreenGestures.isSupported())
mSupportedFeatures |= CMHardwareManager.FEATURE_TOUCHSCREEN_GESTURES;
}

public int getSupportedFeatures() {
Expand Down Expand Up @@ -384,6 +392,14 @@ public List<Range<Float>> getPictureAdjustmentRanges() {
PictureAdjustment.getContrastRange(),
PictureAdjustment.getSaturationThresholdRange());
}

public TouchscreenGesture[] getTouchscreenGestures() {
return TouchscreenGestures.getAvailableGestures();
}

public boolean setTouchscreenGestureEnabled(TouchscreenGesture gesture, boolean state) {
return TouchscreenGestures.setGestureEnabled(gesture, state);
}
}

private CMHardwareInterface getImpl(Context context) {
Expand Down Expand Up @@ -860,5 +876,27 @@ public float[] getPictureAdjustmentRanges() {
}
return new float[10];
}

@Override
public TouchscreenGesture[] getTouchscreenGestures() {
mContext.enforceCallingOrSelfPermission(
cyanogenmod.platform.Manifest.permission.HARDWARE_ABSTRACTION_ACCESS, null);
if (!isSupported(CMHardwareManager.FEATURE_TOUCHSCREEN_GESTURES)) {
Log.e(TAG, "Touchscreen gestures are not supported");
return null;
}
return mCmHwImpl.getTouchscreenGestures();
}

@Override
public boolean setTouchscreenGestureEnabled(TouchscreenGesture gesture, boolean state) {
mContext.enforceCallingOrSelfPermission(
cyanogenmod.platform.Manifest.permission.HARDWARE_ABSTRACTION_ACCESS, null);
if (!isSupported(CMHardwareManager.FEATURE_TOUCHSCREEN_GESTURES)) {
Log.e(TAG, "Touchscreen gestures are not supported");
return false;
}
return mCmHwImpl.setTouchscreenGestureEnabled(gesture, state);
}
};
}
34 changes: 34 additions & 0 deletions sdk/src/java/cyanogenmod/hardware/CMHardwareManager.java
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2015-2016 The CyanogenMod Project
* 2017 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -172,6 +173,12 @@ public final class CMHardwareManager {
@VisibleForTesting
public static final int FEATURE_PICTURE_ADJUSTMENT = 0x40000;

/**
* Touchscreen gesture
*/
@VisibleForTesting
public static final int FEATURE_TOUCHSCREEN_GESTURES = 0x80000;

private static final List<Integer> BOOLEAN_FEATURES = Arrays.asList(
FEATURE_ADAPTIVE_BACKLIGHT,
FEATURE_COLOR_ENHANCEMENT,
Expand Down Expand Up @@ -1042,4 +1049,31 @@ public boolean unRegisterThermalListener(ThermalListenerCallback thermalCallback
}
return false;
}

/**
* @return a list of available touchscreen gestures on the devices
*/
public TouchscreenGesture[] getTouchscreenGestures() {
try {
if (checkService()) {
return sService.getTouchscreenGestures();
}
} catch (RemoteException e) {
}
return null;
}

/**
* @return true if setting the activation status was successful
*/
public boolean setTouchscreenGestureEnabled(
TouchscreenGesture gesture, boolean state) {
try {
if (checkService()) {
return sService.setTouchscreenGestureEnabled(gesture, state);
}
} catch (RemoteException e) {
}
return false;
}
}
4 changes: 4 additions & 0 deletions sdk/src/java/cyanogenmod/hardware/ICMHardwareService.aidl
@@ -1,5 +1,6 @@
/**
* Copyright (c) 2015, The CyanogenMod Project
* 2017 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -19,6 +20,7 @@ package cyanogenmod.hardware;
import cyanogenmod.hardware.DisplayMode;
import cyanogenmod.hardware.HSIC;
import cyanogenmod.hardware.IThermalListenerCallback;
import cyanogenmod.hardware.TouchscreenGesture;

/** @hide */
interface ICMHardwareService {
Expand Down Expand Up @@ -70,4 +72,6 @@ interface ICMHardwareService {
boolean setPictureAdjustment(in HSIC hsic);
float[] getPictureAdjustmentRanges();

TouchscreenGesture[] getTouchscreenGestures();
boolean setTouchscreenGestureEnabled(in TouchscreenGesture gesture, boolean state);
}
20 changes: 20 additions & 0 deletions sdk/src/java/cyanogenmod/hardware/TouchscreenGesture.aidl
@@ -0,0 +1,20 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* 2017 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package cyanogenmod.hardware;

parcelable TouchscreenGesture;
78 changes: 78 additions & 0 deletions sdk/src/java/cyanogenmod/hardware/TouchscreenGesture.java
@@ -0,0 +1,78 @@
/*
* Copyright (C) 2016 The CyanogenMod Project
* 2017 The LineageOS Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package cyanogenmod.hardware;

import android.os.Parcel;
import android.os.Parcelable;

/**
* Touchscreen gestures API
*
* A device may implement several touchscreen gestures for use while
* the display is turned off, such as drawing alphabets and shapes.
* These gestures can be interpreted by userspace to activate certain
* actions and launch certain apps, such as to skip music tracks,
* to turn on the flashlight, or to launch the camera app.
*
* This *should always* be supported by the hardware directly.
* A lot of recent touch controllers have a firmware option for this.
*
* This API provides support for enumerating the gestures
* supported by the touchscreen.
*
* A TouchscreenGesture is referenced by it's identifier and carries an
* associated name (up to the user to translate this value).
*/
public class TouchscreenGesture implements Parcelable {

public final int id;
public final String name;
public final int keycode;

public TouchscreenGesture(int id, String name, int keycode) {
this.id = id;
this.name = name;
this.keycode = keycode;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(id);
parcel.writeString(name);
parcel.writeInt(keycode);
}

/** @hide */
public static final Parcelable.Creator<TouchscreenGesture> CREATOR =
new Parcelable.Creator<TouchscreenGesture>() {

public TouchscreenGesture createFromParcel(Parcel in) {
return new TouchscreenGesture(in.readInt(), in.readString(), in.readInt());
}

@Override
public TouchscreenGesture[] newArray(int size) {
return new TouchscreenGesture[size];
}
};
}

0 comments on commit cfaf39e

Please sign in to comment.