① * /frameworks/base/core/java/android/view/View.java
+import android.view.WindowManager;
+import android.util.DisplayMetrics;
+import android.view.Display;
//add for screen shot
protected int shotX;
private boolean isShot=false;
private float orgX1=0;
private float orgX2=0;
private long downTime=0;
// add end
public boolean dispatchTouchEvent(MotionEvent event) {
...
if (onFilterTouchEventForSecurity(event)) {
if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
result = true;
}
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
&& li.mOnTouchListener.onTouch(this, event)) {
/// M : add log to help debugging
if (ViewDebugManager.DEBUG_TOUCH) {
ViewDebugManager.getInstance().debugEventHandled(this, event, li.toString());
}
result = true;
}
//add for screen shot
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
final int pointerCount = event.getPointerCount();
if (pointerCount == 1){
orgX1 = 0;
orgX2 = 0;
isShot = false;
} else {
if (!isShot) {
if ((event.getX(0) > shotX) && (event.getX(1) > shotX)) {
orgX1 = event.getX(0);
orgX2 = event.getX(1);
isShot = true;
}
}
}
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() >= 2) {
if (!isShot) {
if ((event.getX(0) > shotX) && (event.getX(1) > shotX)) {
orgX1 = event.getX(0);
orgX2 = event.getX(1);
isShot = true;
}
} else {
if ((orgX1 - event.getX(0)) > 150 && (orgX2 - event.getX(1) > 150)) {
Intent intent = new Intent("android.intent.action.SCREEN_SHOT");
mContext.sendBroadcast(intent);
orgX1 = 0;
orgX2 = 0;
}
}
}
break;
}
if (isShot) {
result = true;
}
// add end
if (!result && onTouchEvent(event)) {
/// M : add log to help debugging
if (ViewDebugManager.DEBUG_TOUCH) {
ViewDebugManager.getInstance().debugEventHandled(this,
event, "onTouchEvent");
}
result = true;
}
}
}
...
@CallSuper
protected void onFinishInflate() {
// add for screen shot
DisplayMetrics metrics = new DisplayMetrics();
WindowManager WM = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
Display display = WM.getDefaultDisplay();
display.getMetrics(metrics);
int width = metrics.widthPixels;
shotX = width - 30;
// add end
}
② * /frameworks/base/core/java/android/view/ViewGroup.java
+import android.util.DisplayMetrics;
+import android.view.WindowManager;
...
//add for screen shot
private float groupOrgX1=0;
private float groupOrgX2=0;
private boolean isInterupt=false;
private float interupPointX=0;
private Context viewgroupContext;
// add end
public ViewGroup(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ viewgroupContext = context;
initViewGroup();
initFromAttributes(context, attrs, defStyleAttr, defStyleRes);
}
...
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (onFilterTouchEventForSecurity(ev)) {
// add for screen shot
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
DisplayMetrics metrics = new DisplayMetrics();
WindowManager WM = (WindowManager) viewgroupContext.getSystemService(Context.WINDOW_SERVICE);
Display display = WM.getDefaultDisplay();
display.getMetrics(metrics);
int width = metrics.widthPixels;
interupPointX = width - 30;
final int pointerCount = ev.getPointerCount();
if (pointerCount == 1){
groupOrgX1 = 0;
groupOrgX2 = 0;
isInterupt = false;
} else {
if (!isInterupt) {
if ((ev.getX(0) > interupPointX) && (ev.getX(1) > interupPointX)) {
groupOrgX1 = ev.getX(0);
groupOrgX2 = ev.getX(1);
isInterupt = true;
}
}
}
break;
case MotionEvent.ACTION_MOVE:
if (ev.getPointerCount() >= 2) {
if (!isInterupt) {
if ((ev.getX(0) > interupPointX) && (ev.getX(1) > interupPointX)) {
groupOrgX1 = ev.getX(0);
groupOrgX2 = ev.getX(1);
isInterupt = true;
}
} else {
if ((groupOrgX1 - ev.getX(0) > 150) && (groupOrgX2 - ev.getX(1) > 150)) {
Intent intent = new Intent("android.intent.action.SCREEN_SHOT");
mContext.sendBroadcast(intent);
groupOrgX1 = 0;
groupOrgX2 = 0;
}
}
}
break;
}
if (isInterupt) {
return true;
}
// add end
final int action = ev.getAction();
final int actionMasked = action & MotionEvent.ACTION_MASK;
...
}
...
public boolean onInterceptTouchEvent(MotionEvent ev) {
//add for screen shot
if (isInterupt) {
return true;
}
//add end
③ * /frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
@Override
public void init(Context context, IWindowManager windowManager,
WindowManagerFuncs windowManagerFuncs) {
...
// add for screen shot
IntentFilter screenShotFilter=new IntentFilter();
screenShotFilter.addAction("android.intent.action.SCREEN_SHOT");
context.registerReceiver(mScreenShotReceiver, screenShotFilter);
//add end
/// M: MTK STK feature @{
mStkManager.registerStkReceiver(context);
...
}
...
//add for screen shot
BroadcastReceiver mScreenShotReceiver = new BroadcastReceiver(){
public void onReceive(Context context,Intent intent){
String action=intent.getAction();
takeScreenshot(TAKE_SCREENSHOT_FULLSCREEN);
}
};
//add end
BroadcastReceiver mDreamReceiver = new BroadcastReceiver() {