diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index fb38bba8ee16..90b6d5201257 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -127,6 +127,14 @@ import com.android.internal.widget.DecorContentParent;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
+// liujunjie add
+import com.android.internal.util.ScreenshotHelper;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.Messenger;
+import android.content.ServiceConnection;
+import android.content.ComponentName;
+import java.util.Arrays;
/**
* Android-specific Window.
@@ -350,10 +358,12 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
}
static final RotationWatcher sRotationWatcher = new RotationWatcher();
+ private Context mContext;
@UnsupportedAppUsage
public PhoneWindow(@UiContext Context context) {
super(context);
+ this.mContext = context;
mLayoutInflater = LayoutInflater.from(context);
mRenderShadowsInCompositor = Settings.Global.getInt(context.getContentResolver(),
DEVELOPMENT_RENDER_SHADOWS_IN_COMPOSITOR, 1) != 0;
@@ -1902,8 +1912,128 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback {
@Override
public boolean superDispatchTouchEvent(MotionEvent event) {
+ parse3PointerScreenShot(event); // liujunjie add
+
return mDecor.superDispatchTouchEvent(event);
}
+
+ private static final int MAX_POINTER = 10;
+ private static final float Y_OFFSET = 150;
+ private boolean is3Pointer = false;
+ private float downY[] = new float[MAX_POINTER];
+ private float upY[] = new float[MAX_POINTER];
+ private float matchY[] = new float[MAX_POINTER];
+ // liujunjie add ssr
+ private void clearArrayData(float[] data) {
+ Arrays.fill(data, 0);
+ }
+ private void parse3PointerScreenShot(MotionEvent ev) {
+ int pointerCount = ev.getPointerCount();
+ //android.util.Log.d("liujunjie33","parse3PointerScreenShot actionMasked: "+ actionMasked +" ,pointerCount:"+pointerCount);
+ if(pointerCount != 3){
+ return;
+ }
+ int value = Settings.System.getInt(mContext.getContentResolver(), "screenshot_pointer", 0);
+ if (value != 0) {
+ return ;
+ }
+ int actionMasked = ev.getActionMasked();
+ if (pointerCount == 3) {
+ switch (actionMasked) {
+ case MotionEvent.ACTION_POINTER_DOWN:
+ for (int i = 0; i < pointerCount; i++) {
+ int pointerId = ev.getPointerId(i);
+ downY[pointerId] = ev.getY(i);
+ }
+ is3Pointer = true;
+ break;
+ case MotionEvent.ACTION_POINTER_UP:
+ if (is3Pointer) {
+ for (int i = 0; i < pointerCount; i++) {
+ int pointerId = ev.getPointerId(i);
+ upY[pointerId] = ev.getY(i);
+ matchY[pointerId] = Math.abs(upY[pointerId] - downY[pointerId]);
+ }
+ } else {
+ clearArrayData(downY);
+ clearArrayData(upY);
+ clearArrayData(matchY);
+ }
+ break;
+ }
+ boolean[] flag = new boolean[] {false, false, false};
+ for (int i = 0; i < pointerCount; i++) {
+ int pointerId = ev.getPointerId(i);
+ if (matchY[pointerId] > Y_OFFSET) {
+ flag[i] = true;
+ matchY[pointerId] = 0;
+ }
+ }
+ if (flag[0] && flag[1] && flag[2]) {
+ h.sendEmptyMessage(HAND_SCREENSHOT);
+ }
+ } else {
+ is3Pointer = false;
+ }
+ }
+ private final static int HAND_SCREENSHOT = 7;
+ // liujunjie add
+ private final ComponentName cn = new ComponentName("com.android.systemui",
+ "com.android.systemui.screenshot.TakeScreenshotService");
+
+ private void myBindService() {
+ Intent intent = new Intent();
+ intent.setComponent(cn);
+ mContext.bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
+
+ }
+ private Messenger messenger = null;
+ private final Handler h = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what){
+ case HAND_SCREENSHOT:
+ senPostRequest();
+ break;
+ }
+ Log.d(TAG, "handleMessage: -------------msg:"+msg.what);
+ }
+ };
+ private void senPostRequest(){
+ if (messenger != null){
+ try {
+ Message msg = Message.obtain(null, 1);
+ msg.replyTo = new Messenger(h);
+ msg.arg1 = msg.arg2 = 0;
+ msg.obj = screenshotRequest;
+ messenger.send(msg);
+ } catch (RemoteException e) {
+ messenger = null;
+ throw new RuntimeException(e);
+ }
+ }else {
+ myBindService();
+ }
+ }
+ private final ScreenshotHelper.ScreenshotRequest screenshotRequest =
+ new ScreenshotHelper.ScreenshotRequest(1,2,new ComponentName("com.example.myapplication","com.example.myapplication.FullActivity2"));
+ private final ServiceConnection serviceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ Log.d(TAG, "onServiceConnected: ");
+ messenger = new Messenger(service);
+ senPostRequest();
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ Log.d(TAG, "onServiceDisconnected: ");
+ messenger = null;
+
+ }
+ };
+
+ // liujunjie add end
@Override
public boolean superDispatchTrackballEvent(MotionEvent event) {
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 2737ecf5ffa6..09771fe1e883 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -378,9 +378,8 @@
<!-- started from PhoneWindowManager
TODO: Should have an android:permission attribute -->
<service android:name=".screenshot.TakeScreenshotService"
- android:permission="com.android.systemui.permission.SELF"
android:process=":screenshot"
- android:exported="false" />
+ android:exported="true" />
<!-- Called from PhoneWindowManager -->
<receiver android:name=".screenshot.ScreenshotServiceErrorReceiver"
04-29
2193
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
04-22
117
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交