frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java修改:(svn chages as unified diff)
Index: PhoneWindowManager.java
===================================================================
--- PhoneWindowManager.java (revision 2175)
+++ PhoneWindowManager.java (revision 2176)
@@ -54,8 +54,9 @@import android.os.SystemProperties;import android.os.UEventObserver;import android.os.Vibrator;
+import android.os.Build;import android.provider.Settings;
-
+import android.media.MediaPlayer;import com.android.internal.R;import com.android.internal.app.ShutdownThread;import com.android.internal.policy.PolicyManager;
@@ -89,6 +90,7 @@import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;import static android.view.WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN;import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;
+import static android.view.WindowManager.LayoutParams.FLAG_AW_HIDESTATUS;import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
@@ -163,6 +165,7 @@// No longer recommended for desk docks; still useful in car docks.static final boolean ENABLE_CAR_DOCK_HOME_CAPTURE = true;static final boolean ENABLE_DESK_DOCK_HOME_CAPTURE = false;
+ static boolean mFullScreenIsEnable = true;static final int LONG_PRESS_POWER_NOTHING = 0;static final int LONG_PRESS_POWER_GLOBAL_ACTIONS = 1;
@@ -283,11 +286,14 @@/** If true, hitting shift & menu will broadcast Intent.ACTION_BUG_REPORT */boolean mEnableShiftMenuBugReports = false;
-
+ boolean mStatusBarShow = true;
+ boolean mStatusBarWillHide = true;
+ boolean mStatusBarReqShow = false;boolean mSafeMode;WindowState mStatusBar = null;boolean mStatusBarCanHide;
- int mStatusBarHeight;
+ int mStatusBarHeightReserved;
+ int mStatusBarHeight;final ArrayList<WindowState> mStatusBarPanels = new ArrayList<WindowState>();WindowState mNavigationBar = null;boolean mHasNavigationBar = false;
@@ -411,6 +417,7 @@WindowState mTopFullscreenOpaqueWindowState;boolean mTopIsFullscreen;
+ boolean mTopIsHideStatusbar;boolean mForceStatusBar;boolean mHideLockScreen;boolean mDismissKeyguard;
@@ -874,11 +881,11 @@* DisplayMetrics.DENSITY_DEFAULT/ DisplayMetrics.DENSITY_DEVICE;mStatusBarCanHide = shortSizeDp < 600;
- mStatusBarHeight = mContext.getResources().getDimensionPixelSize(
+ mStatusBarHeightReserved = mContext.getResources().getDimensionPixelSize(mStatusBarCanHide? com.android.internal.R.dimen.status_bar_height: com.android.internal.R.dimen.system_bar_height);
-
+ mStatusBarHeight = mStatusBarHeightReserved;mHasNavigationBar = mContext.getResources().getBoolean(com.android.internal.R.bool.config_showNavigationBar);// Allow a system property to override this. Used by the emulator.
@@ -1225,8 +1232,7 @@public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation) {// Assumes the navigation bar appears on the bottom of the display in portrait.return fullHeight
- - (mStatusBarCanHide ? 0 : mStatusBarHeight)
- - ((fullWidth > fullHeight) ? 0 : mNavigationBarHeight);
+ - ((fullWidth > fullHeight) ? 0 : mNavigationBarHeight) - ((mStatusBarCanHide ||mFullScreenIsEnable) ? 0 : mStatusBarHeight);}public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation) {
@@ -1239,8 +1245,7 @@// of the decor; however for purposes of configurations, we do want to// exclude it since applications can't generally use that part of the// screen.
- return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation)
- - (mStatusBarCanHide ? mStatusBarHeight : 0);
+ return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation) - ((mStatusBarCanHide ||mFullScreenIsEnable) ? mStatusBarHeight : 0);}public boolean doesForceHide(WindowState win, WindowManager.LayoutParams attrs) {
@@ -1914,7 +1919,6 @@mDockRight = mContentRight = mCurRight = displayWidth;mDockBottom = mContentBottom = mCurBottom = displayHeight;mDockLayer = 0x10000000;
-// start with the current dock rect, which will be (0,0,displayWidth,displayHeight)final Rect pf = mTmpParentFrame;final Rect df = mTmpDisplayFrame;
@@ -1923,7 +1927,6 @@pf.top = df.top = vf.top = mDockTop;pf.right = df.right = vf.right = mDockRight;pf.bottom = df.bottom = vf.bottom = mDockBottom;
-final boolean navVisible = (mNavigationBar == null || mNavigationBar.isVisibleLw()) &&(mLastSystemUiFlags&View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0;@@ -1977,6 +1980,12 @@mTmpNavigationFrame.offset(mNavigationBarWidth, 0);}}
+ // Make sure the content and current rectangles are updated to
+ // account for the restrictions from the navigation bar.
+ mContentTop = mCurTop = mDockTop;
+ mContentBottom = mCurBottom = mDockBottom;
+ mContentLeft = mCurLeft = mDockLeft;
+ mContentRight = mCurRight = mDockRight;// And compute the final frame.mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame,mTmpNavigationFrame, mTmpNavigationFrame);
@@ -2104,7 +2113,7 @@final boolean hasNavBar = (mHasNavigationBar && mNavigationBar != null && mNavigationBar.isVisibleLw());
-
+ if (attrs.type == TYPE_INPUT_METHOD) {pf.left = df.left = cf.left = vf.left = mDockLeft;pf.top = df.top = cf.top = vf.top = mDockTop;
@@ -2116,7 +2125,14 @@} else {final int adjust = sim & SOFT_INPUT_MASK_ADJUST;- if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))
+ if((fl & FLAG_AW_HIDESTATUS) == FLAG_AW_HIDESTATUS)
+ {
+ pf.left = df.left = mUnrestrictedScreenLeft;
+ pf.top = df.top = mUnrestrictedScreenTop;
+ pf.right = df.right = mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;
+ pf.bottom = df.bottom = mUnrestrictedScreenTop+mUnrestrictedScreenHeight;
+ }
+ else if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_FULLSCREEN | FLAG_LAYOUT_INSET_DECOR))== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {if (DEBUG_LAYOUT)Log.v(TAG, "layoutWindowLw(" + attrs.getTitle()
@@ -2211,19 +2227,37 @@"Laying out navigation bar window: (%d,%d - %d,%d)",pf.left, pf.top, pf.right, pf.bottom));}
- } else if (attrs.type == TYPE_SECURE_SYSTEM_OVERLAY
+ } else if ((attrs.type == TYPE_SECURE_SYSTEM_OVERLAY
+ || attrs.type == TYPE_BOOT_PROGRESS)&& ((fl & FLAG_FULLSCREEN) != 0)) {// Fullscreen secure system overlays get what they ask for.pf.left = df.left = mUnrestrictedScreenLeft;pf.top = df.top = mUnrestrictedScreenTop;pf.right = df.right = mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;pf.bottom = df.bottom = mUnrestrictedScreenTop+mUnrestrictedScreenHeight;
+ } else if (attrs.type == TYPE_BOOT_PROGRESS) {
+ // Boot progress screen always covers entire display.
+ pf.left = df.left = cf.left = mUnrestrictedScreenLeft;
+ pf.top = df.top = cf.top = mUnrestrictedScreenTop;
+ pf.right = df.right = cf.right = mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;
+ pf.bottom = df.bottom = cf.bottom
+ = mUnrestrictedScreenTop+mUnrestrictedScreenHeight;} else {
- pf.left = df.left = cf.left = mRestrictedScreenLeft;
- pf.top = df.top = cf.top = mRestrictedScreenTop;
- pf.right = df.right = cf.right = mRestrictedScreenLeft+mRestrictedScreenWidth;
- pf.bottom = df.bottom = cf.bottom
- = mRestrictedScreenTop+mRestrictedScreenHeight;
+ if(mFullScreenIsEnable) //mFullScreenIsEnable && mStatusBarWillHide && (mStatusBarReqShow == false)
+ {
+ pf.left = df.left = cf.left = mUnrestrictedScreenLeft;
+ pf.top = df.top = cf.top = mUnrestrictedScreenTop;
+ pf.right = df.right = cf.right = mUnrestrictedScreenLeft+mUnrestrictedScreenWidth;
+ pf.bottom = df.bottom = cf.bottom = mUnrestrictedScreenTop+mUnrestrictedScreenHeight;
+ }
+ else
+ {
+ pf.left = df.left = cf.left = mRestrictedScreenLeft;
+ pf.top = df.top = cf.top = mRestrictedScreenTop;
+ pf.right = df.right = cf.right = mRestrictedScreenLeft+mRestrictedScreenWidth;
+ pf.bottom = df.bottom = cf.bottom
+ = mRestrictedScreenTop+mRestrictedScreenHeight;
+ }}if (adjust != SOFT_INPUT_ADJUST_NOTHING) {vf.left = mCurLeft;
@@ -2336,7 +2370,7 @@if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw="+ win.isVisibleOrBehindKeyguardLw());if (mTopFullscreenOpaqueWindowState == null &&
- win.isVisibleOrBehindKeyguardLw()) {
+ win.isVisibleOrBehindKeyguardLw() && !win.isGoneForLayoutLw()) {if ((attrs.flags & FLAG_FORCE_NOT_FULLSCREEN) != 0) {mForceStatusBar = true;}
@@ -2366,6 +2400,7 @@public int finishAnimationLw() {int changes = 0;boolean topIsFullscreen = false;
+ boolean topIsHideStatusbar =false;final WindowManager.LayoutParams lp = (mTopFullscreenOpaqueWindowState != null)? mTopFullscreenOpaqueWindowState.getAttrs()
@@ -2373,7 +2408,7 @@if (mStatusBar != null) {if (DEBUG_LAYOUT) Log.i(TAG, "force=" + mForceStatusBar
- + " top=" + mTopFullscreenOpaqueWindowState);
+ + " top=" + mTopFullscreenOpaqueWindowState); if (mForceStatusBar) {if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: forced");if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
@@ -2385,15 +2420,27 @@+ " lp.flags=0x" + Integer.toHexString(lp.flags));}topIsFullscreen = (lp.flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0;
+ topIsHideStatusbar = (lp.flags & WindowManager.LayoutParams.FLAG_AW_HIDESTATUS) != 0;
+ // The subtle difference between the window for mTopFullscreenOpaqueWindowState// and mTopIsFullscreen is that that mTopIsFullscreen is set only if the window// has the FLAG_FULLSCREEN set. Not sure if there is another way that to be the// case though.
- if (topIsFullscreen) {
+ if(topIsHideStatusbar)
+ {
+ if (mStatusBar.hideLw(true))
+ {
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;
+
+ mStatusBarShow = false;
+ }
+ }
+ else if (topIsFullscreen) {if (mStatusBarCanHide) {if (DEBUG_LAYOUT) Log.v(TAG, "Hiding status bar");if (mStatusBar.hideLw(true)) {changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ mStatusBarShow = false;mHandler.post(new Runnable() { public void run() {if (mStatusBarService != null) {
@@ -2403,17 +2450,50 @@}}});}
- } else if (DEBUG_LAYOUT) {
- Log.v(TAG, "Preventing status bar from hiding by policy");
+ }
+ else
+ {
+ if (DEBUG_LAYOUT)
+ {
+ Log.v(TAG, "Preventing status bar from hiding by policy");
+ }
+ if(mFullScreenIsEnable)
+ {
+ if (mStatusBar.hideLw(true))
+ {
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ mStatusBarShow = false;
+ }
+ }
+ else
+ {
+ if(mStatusBarShow == false)
+ {
+ if (mStatusBar.showLw(true))
+ {
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ mStatusBarShow = true;
+ }
+
+ }
+ }
+ }
+
+ }
+ else
+ {
+ if (DEBUG_LAYOUT)
+ {
+ Log.v(TAG, "** SHOWING status bar: top is not fullscreen");}
- } else {
- if (DEBUG_LAYOUT) Log.v(TAG, "Showing status bar: top is not fullscreen");
- if (mStatusBar.showLw(true)) changes |= FINISH_LAYOUT_REDO_LAYOUT;
+ if (mStatusBar.showLw(true))
+ changes |= FINISH_LAYOUT_REDO_LAYOUT;}}}mTopIsFullscreen = topIsFullscreen;
+ mTopIsHideStatusbar = topIsHideStatusbar;// Hide the key guard if a visible window explicitly specifies that it wants to be displayed// when the screen is locked
@@ -3488,6 +3568,27 @@}};+ Runnable mStatusBarHide = new Runnable() {
+ public void run() {
+ mStatusBarWillHide = true;
+ try {
+ Log.d(TAG, "mStatusBarHide mStatusBarWillHide = " + mStatusBarWillHide);
+ //set orientation on WindowManager
+ mWindowManager.invokePerformWindow();
+ } catch (RemoteException e) {
+ // Ignore
+ }
+
+ }
+ };
+
+ public void lockNow() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null);
+ mHandler.removeCallbacks(mScreenLockTimeout);
+ mHandler.post(mScreenLockTimeout);
+ }
+
+private void updateLockScreenTimeout() {synchronized (mScreenLockTimeout) {boolean enable = (mAllowLockscreenWhenOn && mScreenOnEarly && mKeyguardMediator.isSecure());
@@ -3741,6 +3842,34 @@return mHasNavigationBar;}+ public boolean statusbarShow()
+ {
+ synchronized (this)
+ {
+ mStatusBarReqShow = true;
+ if(mStatusBarShow == false)
+ {
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+ public boolean statusbarHide()
+ {
+ synchronized (this)
+ {
+ mStatusBarReqShow = false;
+ if(mStatusBarShow == true)
+ {
+ return true;
+ }
+
+ return false;
+ }
+ }
+public void dump(String prefix, FileDescriptor fd, PrintWriter pw, String[] args) {pw.print(prefix); pw.print("mSafeMode="); pw.print(mSafeMode);pw.print(" mSystemReady="); pw.print(mSystemReady);
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java修改:(svn chages as unified diff)
Index: PhoneWindow.java
===================================================================
--- PhoneWindow.java (revision 2175)
+++ PhoneWindow.java (revision 2176)
@@ -20,6 +20,7 @@import static android.view.View.MeasureSpec.getMode;import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
+import static android.view.WindowManager.LayoutParams.FLAG_AW_HIDESTATUS;import static android.view.WindowManager.LayoutParams.FLAG_FULLSCREEN;import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
@@ -2559,6 +2560,10 @@setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN&(~getForcedWindowFlags()));}+ if (a.getBoolean(com.android.internal.R.styleable.Window_windowHideStatusbar, false)) {
+ setFlags(FLAG_AW_HIDESTATUS, FLAG_AW_HIDESTATUS&(~getForcedWindowFlags()));
+ }
+if (a.getBoolean(com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {setFlags(FLAG_SHOW_WALLPAPER, FLAG_SHOW_WALLPAPER&(~getForcedWindowFlags()));}
frameworks/base/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
Index: BridgeWindowManager.java
===================================================================
--- BridgeWindowManager.java (revision 2175)
+++ BridgeWindowManager.java (revision 2176)
@@ -471,4 +471,28 @@public boolean hasNavigationBar() {return false; // should this return something else?}
+
+ public void resetInputCalibration()
+ {
+
+ }
+
+ public void statusbarShow()
+ {
+
+ }
+
+ public void statusbarHide()
+ {
+
+ }
+
+ public void invokePerformWindow()
+ {
+
+ }
+ public void lockNow() {
+ // TODO Auto-generated method stub
+
+ }}
frameworks/base/services/input/InputReader.cpp
Index: InputReader.cpp
===================================================================
--- InputReader.cpp (revision 2175)
+++ InputReader.cpp (revision 2176)
@@ -50,6 +50,7 @@#include <math.h>#include <cutils/properties.h>+#define INDENT " "#define INDENT2 " "#define INDENT3 " "
@@ -118,6 +119,7 @@{ AKEYCODE_DPAD_UP, AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT },{ AKEYCODE_DPAD_LEFT, AKEYCODE_DPAD_DOWN, AKEYCODE_DPAD_RIGHT, AKEYCODE_DPAD_UP },};
+static bool resetTouch = false;static const size_t keyCodeRotationMapSize =sizeof(keyCodeRotationMap) / sizeof(keyCodeRotationMap[0]);@@ -701,6 +703,10 @@}}+void InputReader::resetTouchCalibration()
+{
+ resetTouch = true;
+}void InputReader::dump(String8& dump) {AutoMutex _l(mLock);@@ -940,7 +946,6 @@rawEvent->deviceId, rawEvent->type, rawEvent->scanCode, rawEvent->keyCode,rawEvent->value, rawEvent->flags);#endif
-if (mDropUntilNextSync) {if (rawEvent->type == EV_SYN && rawEvent->scanCode == SYN_REPORT) {mDropUntilNextSync = false;
@@ -1041,6 +1046,15 @@}}+void InputDevice::unfadePointer() {
+ size_t numMappers = mMappers.size();
+ for (size_t i = 0; i < numMappers; i++) {
+ InputMapper* mapper = mMappers[i];
+ mapper->unfadePointer();
+ }
+}
+
+void InputDevice::notifyReset(nsecs_t when) {NotifyDeviceResetArgs args(when, mId);mContext->getListener()->notifyDeviceReset(&args);
@@ -1711,6 +1725,10 @@void InputMapper::fadePointer() {}+void InputMapper::unfadePointer() {
+}
+
+status_t InputMapper::getAbsoluteAxisInfo(int32_t axis, RawAbsoluteAxisInfo* axisInfo) {return getEventHub()->getAbsoluteAxisInfo(getDeviceId(), axis, axisInfo);}
@@ -2323,13 +2341,21 @@}}+void CursorInputMapper::unfadePointer() {
+ if (mPointerController != NULL) {
+ mPointerController->unfade(PointerControllerInterface::TRANSITION_GRADUAL);
+ }
+}+
+// --- TouchInputMapper ---TouchInputMapper::TouchInputMapper(InputDevice* device) :InputMapper(device),mSource(0), mDeviceMode(DEVICE_MODE_DISABLED),mSurfaceOrientation(-1), mSurfaceWidth(-1), mSurfaceHeight(-1) {
+ mNeedCorrect = false;}TouchInputMapper::~TouchInputMapper() {
@@ -2463,6 +2489,296 @@}}+//get tp correct params
+int TouchInputMapper:: _get_str2int(char *saddr, int *flag)
+{
+ char *src;
+ char off;
+ unsigned int value = 0;
+
+ src = saddr;
+ off = 0; //0\u017d?0\u0153疲?\u017d?6\u0153? 2\u017d?0\u0153频腬u017e菏?
+ if((src[0] == '0') && ((src[1] == 'x') || (src[1] == 'X')))
+ {
+ src += 2;
+ off = 1;
+ }
+ else if((src[0] == '-')) {
+ src += 1;
+ off = 2;
+ }
+ if((!off) || (off == 2))
+ {
+ while(*src != '\0')
+ {
+ if((*src >= '0') && (*src <= '9'))
+ {
+ value = value * 10 + (*src - '0');
+ src ++;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ if(off == 2)
+ {
+ value = -value;
+ }
+ }
+ else if(off == 1)
+ {
+ while(*src != '\0')
+ {
+ if((*src >= '0') && (*src <= '9'))
+ {
+ value = value * 16 + (*src - '0');
+ src ++;
+ }
+ else if((*src >= 'A') && (*src <= 'F'))
+ {
+ value = value * 16 + (*src - 'A' + 10);
+ src ++;
+ }
+ else if((*src >= 'a') && (*src <= 'f'))
+ {
+ value = value * 16 + (*src - 'a' + 10);
+ src ++;;
+ }
+ else
+ {
+ return -1;
+ }
+ }
+ }
+
+ return value;
+}
+//\u017d撕袢eyname, itemname, 以\u0152癷temvalue,返回 0表蔦u0178失败,否则表蔦u0178当前\u017d\u0160理的砛u20ac度
+int TouchInputMapper::_get_item(char *saddr, char *name, char *value, unsigned int line_len)
+{
+ char *src;
+ char *dstname;
+ char *dstvalue;
+ unsigned int len;
+
+ src = saddr;
+ dstname = name;
+ dstvalue = value;
+
+ len = 0;
+ while(*src != '=')
+ {
+ if(*src != ' ')
+ {
+ *dstname++ = *src;
+ len ++;
+ }
+ src ++;
+ line_len --;
+ if(len > 256)
+ {
+ LOGD("key name too long\n");
+ return -1;
+ }
+ }
+ *dstname = '\0';
+ src ++; //跳过 '='
+ line_len --;
+
+ len = 0;
+ while((*src != 0x0A) && (line_len--))
+ {
+ if(*src != ' ')
+ {
+ *dstvalue++ = *src;
+ len ++;
+ }
+ src ++;
+ if(len > 256)
+ {
+ LOGD("key name too long\n");
+ return -1;
+ }
+ }
+ *dstvalue = '\0';
+
+ return 0;
+}
+//\u017d撕祷氐鼻靶械某\u20ac度,用謀u017e针返回当前的意义
+/********************************************
+* flag = 0 //当前是注释行,或空行
+* = 1 //当前是字段行
+* = 2 //当前是子项行,属于字段的下一项
+* = -1 //当前行不符合规范,出\u017d?*********************************************/
+int TouchInputMapper::_get_line(char *daddr, int *flag, unsigned int total_len)
+{
+ char *src;
+ unsigned int len = 0;
+
+ src = daddr;
+ if(*src == ';') //注释行
+ {
+ *flag = 0;
+ }
+ else if((*src == 0x0A)) //回车行
+ {
+ *flag = 0;
+ len = 1;
+
+ return len;
+ }
+ else //子字段行
+ {
+ *flag = 1;
+ }
+
+ src ++;
+ len = 1;
+ while(--total_len)
+ {
+ //LOGD("*src = %x\n",*src);
+ if((*src == 0x0A))
+ {
+ len += 1;
+ break;
+ }
+
+ src ++;
+
+ len ++;
+ if(len >= 512)
+ {
+ *flag = -1;
+
+ return 0;
+ }
+ }
+
+ return len;
+}
+
+int TouchInputMapper::tp_getpara(int *tp_para)
+{
+ FILE* pfd = 0;
+ char *data = 0;
+ char *src = 0;
+ unsigned int len, line_len, check_sum;
+ int flag, value;
+ char itemname[128], itemvalue[128];
+
+ pfd = fopen("/data/pointercal", "r+"); //只读
+ if(!pfd)
+ {
+ //LOGD("para data file not exist\n");
+
+ goto _err_out;
+ }
+ fseek(pfd, 0, 2);
+ len = ftell(pfd);
+ fseek(pfd, 0, 0);
+
+ data = NULL;
+ if(!len)
+ {
+ LOGD("bad tp cfg\n");
+ goto _err_out;
+ }
+ data = (char *)malloc(len);
+ if(!data)
+ {
+ //LOGD("fail to malloc memory to store data\n");
+ goto _err_out;
+ }
+ fread(data, 1, len, pfd);
+ fclose(pfd);
+ pfd = NULL;
+ src = data;
+
+ while(len)
+ {
+ line_len = _get_line(src, &flag, len);
+ LOGD("line_len = %d\n",line_len);
+ len -= line_len;
+ switch(flag)
+ {
+ case 0: //注释行,回车行
+ src += line_len;
+ break;
+ case 1:
+ if(_get_item(src, itemname, itemvalue, line_len))
+ {
+ LOGD("get item fail\n");
+
+ goto _err_out;
+ }
+ src += line_len;
+ value = _get_str2int(itemvalue, 0);
+
+ if(!strcmp(itemname, "TP_PARA1"))
+ {
+ tp_para[0] = value;
+ //LOGD("value0 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA2"))
+ {
+ tp_para[1] = value;
+ //LOGD("value1 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA3"))
+ {
+ tp_para[2] = value;
+ //LOGD("value2 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA4"))
+ {
+ tp_para[3] = value;
+ //LOGD("value3 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA5"))
+ {
+ tp_para[4] = value;
+ //LOGD("value4 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA6"))
+ {
+ tp_para[5] = value;
+ //LOGD("value5 = %d\n",value);
+ }
+ else if(!strcmp(itemname, "TP_PARA7"))
+ {
+ tp_para[6] = value;
+ //LOGD("value6 = %d\n",value);
+ }
+ break;
+ default:
+ goto _err_out;
+ }
+ }
+ free(data);
+
+ return 1;
+_err_out:
+ tp_para[0] = -28238;
+ tp_para[1] = 125;
+ tp_para[2] = 54543608;
+ tp_para[3] = 89;
+ tp_para[4] = -19020;
+ tp_para[5] = 34218656;
+ tp_para[6] = 65536;
+
+ if(data)
+ {
+ free(data);
+ }
+ if(pfd)
+ {
+ fclose(pfd);
+ }
+
+ return 0;
+}
+void TouchInputMapper::configure(nsecs_t when,const InputReaderConfiguration* config, uint32_t changes) {InputMapper::configure(when, config, changes);
@@ -2512,65 +2828,76 @@// Use the pointer presentation mode for devices that do not support distinct// multitouch. The spot-based presentation relies on being able to accurately// locate two or more fingers on the touch pad.
- mParameters.gestureMode = getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_SEMI_MT)
+ if(getDeviceId() != 0x0fff0ffe)
+ {
+ mParameters.gestureMode = getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_SEMI_MT)? Parameters::GESTURE_MODE_POINTER : Parameters::GESTURE_MODE_SPOTS;- String8 gestureModeString;
- if (getDevice()->getConfiguration().tryGetProperty(String8("touch.gestureMode"),
- gestureModeString)) {
- if (gestureModeString == "pointer") {
- mParameters.gestureMode = Parameters::GESTURE_MODE_POINTER;
- } else if (gestureModeString == "spots") {
- mParameters.gestureMode = Parameters::GESTURE_MODE_SPOTS;
- } else if (gestureModeString != "default") {
- LOGW("Invalid value for touch.gestureMode: '%s'", gestureModeString.string());
- }
- }
+ String8 gestureModeString;
+ if (getDevice()->getConfiguration().tryGetProperty(String8("touch.gestureMode"),
+ gestureModeString)) {
+ if (gestureModeString == "pointer") {
+ mParameters.gestureMode = Parameters::GESTURE_MODE_POINTER;
+ } else if (gestureModeString == "spots") {
+ mParameters.gestureMode = Parameters::GESTURE_MODE_SPOTS;
+ } else if (gestureModeString != "default") {
+ LOGV("Invalid value for touch.gestureMode: '%s'", gestureModeString.string());
+ }
+ }- if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_DIRECT)) {
- // The device is a touch screen.
- mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
- } else if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_POINTER)) {
- // The device is a pointing device like a track pad.
- mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
- } else if (getEventHub()->hasRelativeAxis(getDeviceId(), REL_X)
- || getEventHub()->hasRelativeAxis(getDeviceId(), REL_Y)) {
- // The device is a cursor device with a touch pad attached.
- // By default don't use the touch pad to move the pointer.
- mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
- } else {
- // The device is a touch pad of unknown purpose.
- mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
- }
+ if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_DIRECT)) {
+ // The device is a touch screen.
+ mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
+ } else if (getEventHub()->hasInputProperty(getDeviceId(), INPUT_PROP_POINTER)) {
+ // The device is a pointing device like a track pad.
+ mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
+ } else if (getEventHub()->hasRelativeAxis(getDeviceId(), REL_X)
+ || getEventHub()->hasRelativeAxis(getDeviceId(), REL_Y)) {
+ // The device is a cursor device with a touch pad attached.
+ // By default don't use the touch pad to move the pointer.
+ mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
+ } else {
+ // The device is a touch pad of unknown purpose.
+ mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
+ }- String8 deviceTypeString;
- if (getDevice()->getConfiguration().tryGetProperty(String8("touch.deviceType"),
- deviceTypeString)) {
- if (deviceTypeString == "touchScreen") {
- mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
- } else if (deviceTypeString == "touchPad") {
- mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
- } else if (deviceTypeString == "pointer") {
- mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
- } else if (deviceTypeString != "default") {
- LOGW("Invalid value for touch.deviceType: '%s'", deviceTypeString.string());
- }
- }
+ String8 deviceTypeString;
+ if (getDevice()->getConfiguration().tryGetProperty(String8("touch.deviceType"),
+ deviceTypeString)) {
+ if (deviceTypeString == "touchScreen") {
+ mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
+ } else if (deviceTypeString == "touchPad") {
+ mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_PAD;
+ } else if (deviceTypeString == "pointer") {
+ mParameters.deviceType = Parameters::DEVICE_TYPE_POINTER;
+ } else if (deviceTypeString != "default") {
+ LOGV("touch.deviceType: '%s'", deviceTypeString.string());
+ }
+ }- mParameters.orientationAware = mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN;
- getDevice()->getConfiguration().tryGetProperty(String8("touch.orientationAware"),
- mParameters.orientationAware);
+ mParameters.orientationAware = mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN;
+ getDevice()->getConfiguration().tryGetProperty(String8("touch.orientationAware"),
+ mParameters.orientationAware);- mParameters.associatedDisplayId = -1;
- mParameters.associatedDisplayIsExternal = false;
- if (mParameters.orientationAware
- || mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN
- || mParameters.deviceType == Parameters::DEVICE_TYPE_POINTER) {
- mParameters.associatedDisplayIsExternal =
- mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN
- && getDevice()->isExternal();
- mParameters.associatedDisplayId = 0;
- }
+ mParameters.associatedDisplayId = -1;
+ mParameters.associatedDisplayIsExternal = false;
+ if (mParameters.orientationAware
+ || mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN
+ || mParameters.deviceType == Parameters::DEVICE_TYPE_POINTER) {
+ mParameters.associatedDisplayIsExternal =
+ mParameters.deviceType == Parameters::DEVICE_TYPE_TOUCH_SCREEN
+ && getDevice()->isExternal();
+ mParameters.associatedDisplayId = 0;
+ }
+ }
+ else
+ {
+ mParameters.gestureMode = Parameters::GESTURE_MODE_SPOTS;
+ mParameters.deviceType = Parameters::DEVICE_TYPE_TOUCH_SCREEN;
+ mParameters.orientationAware = true;
+ mParameters.associatedDisplayId = 0;
+ }
+ }void TouchInputMapper::dumpParameters(String8& dump) {
@@ -2646,11 +2973,16 @@}// Ensure we have valid X and Y axes.
- if (!mRawPointerAxes.x.valid || !mRawPointerAxes.y.valid) {
- LOGW(INDENT "Touch device '%s' did not report support for X or Y axis! "
- "The device will be inoperable.", getDeviceName().string());
- mDeviceMode = DEVICE_MODE_DISABLED;
- return;
+ if (!mRawPointerAxes.x.valid || !mRawPointerAxes.y.valid)
+ {
+ //LOGW(INDENT "Touch device '%s' did not report support for X or Y axis! "
+ // "The device will be inoperable.", getDeviceName().string());
+ //mDeviceMode = DEVICE_MODE_DISABLED;
+ //return;
+ mRawPointerAxes.x.maxValue = 4095;
+ mRawPointerAxes.x.minValue = 0;
+ mRawPointerAxes.y.maxValue = 4095;
+ mRawPointerAxes.y.minValue = 0;}// Get associated display dimensions.
@@ -3878,34 +4210,62 @@default:distance = 0;}
-
+ //correct the one touch data here
+ float adjust_x,adjust_y;
+ adjust_x = float(in.x - mRawPointerAxes.x.minValue) * mXScale;
+ adjust_y = float(in.y - mRawPointerAxes.y.minValue) * mYScale;
+ if(mNeedCorrect == false)
+ {
+ int ret = tp_getpara(tp_para);
+ if(ret == 1)
+ {
+ adjust_x= ( tp_para[2] + tp_para[0]*adjust_x + tp_para[1]*adjust_x ) / tp_para[6];
+ adjust_y = ( tp_para[5] + tp_para[3]*adjust_y + tp_para[4]*adjust_y ) / tp_para[6];
+ mNeedCorrect = true;
+ }
+
+ }
+ else
+ {
+ if(resetTouch == true)
+ {
+ int ret = tp_getpara(tp_para);
+ if(ret == 1)
+ {
+ mNeedCorrect = true;
+ resetTouch = false;
+ }
+ }
+ adjust_x = ( tp_para[2] + tp_para[0]*adjust_x + tp_para[1]*adjust_x ) / tp_para[6];
+ adjust_y = ( tp_para[5] + tp_para[3]*adjust_y + tp_para[4]*adjust_y ) / tp_para[6];
+ }// X and Y// Adjust coords for surface orientation.float x, y;switch (mSurfaceOrientation) {case DISPLAY_ORIENTATION_90:
- x = float(in.y - mRawPointerAxes.y.minValue) * mYScale;
- y = float(mRawPointerAxes.x.maxValue - in.x) * mXScale;
+ x = adjust_y;
+ y = mSurfaceWidth-adjust_x;orientation -= M_PI_2;if (orientation < - M_PI_2) {orientation += M_PI;}break;case DISPLAY_ORIENTATION_180:
- x = float(mRawPointerAxes.x.maxValue - in.x) * mXScale;
- y = float(mRawPointerAxes.y.maxValue - in.y) * mYScale;
+ x = mSurfaceWidth - adjust_x;
+ y = mSurfaceHeight - adjust_y;break;case DISPLAY_ORIENTATION_270:
- x = float(mRawPointerAxes.y.maxValue - in.y) * mYScale;
- y = float(in.x - mRawPointerAxes.x.minValue) * mXScale;
+ x = mSurfaceHeight - adjust_y;
+ y = adjust_x;orientation += M_PI_2;if (orientation > M_PI_2) {orientation -= M_PI;}break;default:
- x = float(in.x - mRawPointerAxes.x.minValue) * mXScale;
- y = float(in.y - mRawPointerAxes.y.minValue) * mYScale;
+ x = adjust_x;
+ y = adjust_y;break;}@@ -5609,6 +5969,11 @@if (!inSlot->isInUse()) {continue;}
+
+ if((inSlot->getX() == 0) && (inSlot->getY() == 0))
+ {
+ continue;
+ }if (outCount >= MAX_POINTERS) {#if DEBUG_POINTERS
@@ -5643,7 +6008,8 @@bool isHovering = mTouchButtonAccumulator.getToolType() != AMOTION_EVENT_TOOL_TYPE_MOUSE&& (mTouchButtonAccumulator.isHovering()|| (mRawPointerAxes.pressure.valid && inSlot->getPressure() <= 0));
- outPointer.isHovering = isHovering;
+ //outPointer.isHovering = isHovering;
+ outPointer.isHovering = false;// Assign pointer id using tracking id if available.if (*outHavePointerIds) {
@@ -5669,7 +6035,8 @@} else {outPointer.id = id;mCurrentRawPointerData.idToIndex[id] = outCount;
- mCurrentRawPointerData.markIdBit(id, isHovering);
+ //mCurrentRawPointerData.markIdBit(id, isHovering);
+ mCurrentRawPointerData.markIdBit(id, outPointer.isHovering);newPointerIdBits.markBit(id);}}
frameworks/base/services/input/PointerController.cpp
Index: PointerController.cpp
===================================================================
--- PointerController.cpp (revision 2175)
+++ PointerController.cpp (revision 2176)
@@ -30,6 +30,7 @@#include <SkColor.h>#include <SkPaint.h>#include <SkXfermode.h>
+#include <cutils/properties.h>namespace android {@@ -121,6 +122,19 @@*outMaxY = mLocked.displayHeight - 1;break;}
+ char property[PROPERTY_VALUE_MAX];
+ if (property_get("ro.sf.hwrotation", property, NULL) > 0) {
+ float temp ;
+ //displayOrientation
+ switch (atoi(property)) {
+ case 270:
+ temp =*outMaxX ;
+ *outMaxX =*outMaxY;
+ *outMaxY =temp;
+ break;
+ }
+ }
+return true;}
frameworks/base/services/input/InputReader.h
Index: InputReader.h
===================================================================
--- InputReader.h (revision 2175)
+++ InputReader.h (revision 2176)
@@ -267,6 +267,7 @@* The changes flag is a bitfield that indicates what has changed and whether* the input devices must all be reopened. */virtual void requestRefreshConfiguration(uint32_t changes) = 0;
+ virtual void resetTouchCalibration() = 0;};@@ -335,6 +336,7 @@virtual void requestRefreshConfiguration(uint32_t changes);+ virtual void resetTouchCalibration();protected:// These members are protected so they can be instrumented by test cases.virtual InputDevice* createDeviceLocked(int32_t deviceId,
@@ -372,6 +374,7 @@// The event queue.static const int EVENT_BUFFER_SIZE = 256;RawEvent mEventBuffer[EVENT_BUFFER_SIZE];
+ RawEvent mConvertEventBuffer[EVENT_BUFFER_SIZE];KeyedVector<int32_t, InputDevice*> mDevices;@@ -386,6 +389,19 @@void handleConfigurationChangedLocked(nsecs_t when);int32_t mGlobalMetaState;
+ bool mKeyInMouseMode;
+ bool mKeySynced;
+ bool mVirtualTouchCreated;
+ bool mVirtualMouseCreated;
+ int32_t mDistance;
+ int mKeyDeviceId;
+ int mMouseDeviceId;
+ static const int MAX_MOUSE_SIZE = 10;
+ int mRealMouseDeviceId[MAX_MOUSE_SIZE];
+ int mTouchDeviceId;
+ int mRealTouchDeviceId;
+ int mLeft,mRight,mTop,mBottom;
+ int mLeftBtn,mRightBtn,mMidBtn;void updateGlobalMetaStateLocked();int32_t getGlobalMetaStateLocked();@@ -461,6 +477,7 @@int32_t getMetaState();void fadePointer();
+ void unfadePointer();void notifyReset(nsecs_t when);@@ -840,6 +857,7 @@virtual int32_t getMetaState();virtual void fadePointer();
+ virtual void unfadePointer();protected:InputDevice* mDevice;
@@ -944,10 +962,10 @@virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);virtual void reset(nsecs_t when);virtual void process(const RawEvent* rawEvent);
-virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);virtual void fadePointer();
+ virtual void unfadePointer();private:// Amount that trackball needs to move in order to generate a key event.
@@ -1006,6 +1024,11 @@virtual uint32_t getSources();virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);virtual void dump(String8& dump);
+ //get tp correct params
+ int _get_str2int(char *saddr, int *flag);
+ int _get_item(char *saddr, char *name, char *value, unsigned int line_len);
+ int _get_line(char *daddr, int *flag, unsigned int total_len);
+ virtual int tp_getpara(int *tp_para);virtual void configure(nsecs_t when, const InputReaderConfiguration* config, uint32_t changes);virtual void reset(nsecs_t when);virtual void process(const RawEvent* rawEvent);
@@ -1018,6 +1041,7 @@virtual void fadePointer();virtual void timeoutExpired(nsecs_t when);+ int tp_para[7];protected:CursorButtonAccumulator mCursorButtonAccumulator;CursorScrollAccumulator mCursorScrollAccumulator;
@@ -1188,6 +1212,7 @@virtual void syncTouch(nsecs_t when, bool* outHavePointerIds) = 0;+ bool mNeedCorrect;private:// The surface orientation and width and height set by configureSurface().int32_t mSurfaceOrientation;
frameworks/base/services/jni/com_android_server_InputManager.cpp
Index: com_android_server_InputManager.cpp
===================================================================
--- com_android_server_InputManager.cpp (revision 2175)
+++ com_android_server_InputManager.cpp (revision 2176)
@@ -201,6 +201,7 @@virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,const sp<InputWindowHandle>& inputWindowHandle);virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle);
+ virtual void resetTouchCalibration();virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags);virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig);virtual bool isKeyRepeatEnabled();
@@ -750,6 +751,10 @@return pass;}+void NativeInputManager::resetTouchCalibration()
+{
+ mInputManager->getReader()->resetTouchCalibration();
+}void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent,uint32_t& policyFlags) {// Policy:
@@ -1307,6 +1312,14 @@transferTouchFocus(fromChannel, toChannel);}+static void android_server_InputManager_nativeResetTouchCalibration(JNIEnv* env, jclass clazz)
+{
+ if (checkInputManagerUnitialized(env)) {
+ return;
+ }
+
+ gNativeInputManager->resetTouchCalibration();
+}static void android_server_InputManager_nativeSetPointerSpeed(JNIEnv* env,jclass clazz, jint speed) {if (checkInputManagerUnitialized(env)) {
@@ -1398,6 +1411,8 @@(void*) android_server_InputManager_nativeDump },{ "nativeMonitor", "()V",(void*) android_server_InputManager_nativeMonitor },
+ { "nativeResetTouchCalibration", "()V",
+ (void*) android_server_InputManager_nativeResetTouchCalibration },};#define FIND_CLASS(var, className) \
frameworks/base/services/java/com/android/server/wm/WindowState.java
Index: WindowState.java
===================================================================
--- WindowState.java (revision 2175)
+++ WindowState.java (revision 2176)
@@ -238,6 +238,12 @@// we can give the window focus before waiting for the relayout.boolean mRelayoutCalled;+ // If the application has called relayout() with changes that can
+ // impact its window's size, we need to perform a layout pass on it
+ // even if it is not currently visible for layout. This is set
+ // when in that case until the layout is done.
+ boolean mLayoutNeeded;
+// This is set after the Surface has been created but before the// window has been drawn. During this time the surface is hidden.boolean mDrawPending;
@@ -1444,6 +1450,16 @@|| mAnimating);}+ public boolean isGoneForLayoutLw() {
+ final AppWindowToken atoken = mAppToken;
+ return mViewVisibility == View.GONE
+ || !mRelayoutCalled
+ || (atoken == null && mRootToken.hidden)
+ || (atoken != null && (atoken.hiddenRequested || atoken.hidden))
+ || mAttachedHidden
+ || mExiting || mDestroying;
+ }
+/*** Returns true if the window has a surface that it has drawn a* complete UI in to.
@@ -1718,8 +1734,9 @@pw.print(mPolicyVisibilityAfterAnim);pw.print(" mAttachedHidden="); pw.println(mAttachedHidden);}
- if (!mRelayoutCalled) {
- pw.print(prefix); pw.print("mRelayoutCalled="); pw.println(mRelayoutCalled);
+ if (!mRelayoutCalled || mLayoutNeeded) {
+ pw.print(prefix); pw.print("mRelayoutCalled="); pw.print(mRelayoutCalled);
+ pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded);}if (mSurfaceResized || mSurfaceDestroyDeferred) {pw.print(prefix); pw.print("mSurfaceResized="); pw.print(mSurfaceResized);
frameworks/base/services/java/com/android/server/wm/WindowManagerService.java
Index: WindowManagerService.java
===================================================================
--- WindowManagerService.java (revision 2175)
+++ WindowManagerService.java (revision 2176)
@@ -2538,8 +2538,12 @@if (win == null) {return 0;}
- win.mRequestedWidth = requestedWidth;
- win.mRequestedHeight = requestedHeight;
+ if (win.mRequestedWidth != requestedWidth
+ || win.mRequestedHeight != requestedHeight) {
+ win.mLayoutNeeded = true;
+ win.mRequestedWidth = requestedWidth;
+ win.mRequestedHeight = requestedHeight;
+ }if (attrs != null && seq == win.mSeq) {win.mSystemUiVisibility = systemUiVisibility;}
@@ -2560,6 +2564,9 @@}flagChanges = win.mAttrs.flags ^= attrs.flags;attrChanges = win.mAttrs.copyFrom(attrs);
+ if ((attrChanges&WindowManager.LayoutParams.LAYOUT_CHANGED) != 0) {
+ win.mLayoutNeeded = true;
+ }}if (DEBUG_LAYOUT) Slog.v(TAG, "Relayout " + win + ": " + win.mAttrs);
@@ -3495,6 +3502,8 @@if (req == ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) {req = getOrientationFromAppTokensLocked();}
+
+ req = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;return req;}@@ -5133,6 +5142,11 @@// The screenshot API does not apply the current screen rotation.rot = mDisplay.getRotation();
+ if(SystemProperties.getInt("ro.sf.hwrotation",0)==270)
+ {
+ rot =( rot+3)%4;
+ }
+int fw = frame.width();int fh = frame.height();@@ -7391,8 +7405,11 @@final int N = mWindows.size();int i;- if (DEBUG_LAYOUT) Slog.v(TAG, "performLayout: needed="
- + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
+ if (DEBUG_LAYOUT) {
+ Slog.v(TAG, "-------------------------------------");
+ Slog.v(TAG, "performLayout: needed="
+ + mLayoutNeeded + " dw=" + dw + " dh=" + dh);
+ }mPolicy.beginLayoutLw(dw, dh, mRotation);@@ -7434,16 +7451,17 @@// if they want. (We do the normal layout for INVISIBLE// windows, since that means "perform layout as normal,// just don't display").
- if (!gone || !win.mHaveFrame) {
+ if (!gone || !win.mHaveFrame || win.mLayoutNeeded) {if (!win.mLayoutAttached) {if (initial) {//Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");win.mContentChanged = false;}
+ win.mLayoutNeeded = false;win.prelayout();mPolicy.layoutWindowLw(win, win.mAttrs, null);win.mLayoutSeq = seq;
- if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
+ if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame="+ win.mFrame + " mContainingFrame="+ win.mContainingFrame + " mDisplayFrame="+ win.mDisplayFrame);
@@ -7471,15 +7489,16 @@// windows, since that means "perform layout as normal,// just don't display").if ((win.mViewVisibility != View.GONE && win.mRelayoutCalled)
- || !win.mHaveFrame) {
+ || !win.mHaveFrame || win.mLayoutNeeded) {if (initial) {//Slog.i(TAG, "Window " + this + " clearing mContentChanged - initial");win.mContentChanged = false;}
+ win.mLayoutNeeded = false;win.prelayout();mPolicy.layoutWindowLw(win, win.mAttrs, win.mAttachedWindow);win.mLayoutSeq = seq;
- if (DEBUG_LAYOUT) Slog.v(TAG, "-> mFrame="
+ if (DEBUG_LAYOUT) Slog.v(TAG, " LAYOUT: mFrame="+ win.mFrame + " mContainingFrame="+ win.mContainingFrame + " mDisplayFrame="+ win.mDisplayFrame);
@@ -8580,7 +8599,11 @@if (mDimAnimator == null) {mDimAnimator = new DimAnimator(mFxSession);}
- mDimAnimator.show(innerDw, innerDh);
+ if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) {
+ mDimAnimator.show(dw, dh);
+ } else {
+ mDimAnimator.show(innerDw, innerDh);
+ }mDimAnimator.updateParameters(mContext.getResources(),w, currentTime);}
@@ -9411,6 +9434,49 @@return mPolicy.hasNavigationBar();}+ public void resetInputCalibration()
+ {
+ mInputManager.resetTouchCalibration();
+ }
+ public void statusbarShow()
+ {
+ if(mPolicy.statusbarShow())
+ {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mWindowMap) {
+ performLayoutAndPlaceSurfacesLocked();
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ public void statusbarHide()
+ {
+ if(mPolicy.statusbarHide())
+ {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mWindowMap) {
+ performLayoutAndPlaceSurfacesLocked();
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+ }
+
+ public void invokePerformWindow()
+ {
+ final long origId = Binder.clearCallingIdentity();
+ synchronized (mWindowMap) {
+ performLayoutAndPlaceSurfacesLocked();
+ }
+ Binder.restoreCallingIdentity(origId);
+ }
+
+
+ public void lockNow() {
+ mPolicy.lockNow();
+ }
+
+void dumpInput(FileDescriptor fd, PrintWriter pw, boolean dumpAll) {pw.println("WINDOW MANAGER INPUT (dumpsys window input)");mInputManager.dump(pw);
frameworks/base/services/java/com/android/server/wm/InputManager.java
Index: InputManager.java
===================================================================
--- InputManager.java (revision 2175)
+++ InputManager.java (revision 2176)
@@ -95,6 +95,8 @@InputChannel toChannel);private static native void nativeSetPointerSpeed(int speed);private static native void nativeSetShowTouches(boolean enabled);
+ //reset tp correct params
+ private static native void nativeResetTouchCalibration();private static native String nativeDump();private static native void nativeMonitor();@@ -175,6 +177,11 @@if (DEBUG) {Slog.d(TAG, "Setting display #" + displayId + " orientation to " + rotation);}
+ if(SystemProperties.getInt("ro.sf.hwrotation",0)==270)
+ {
+ rotation =(rotation+3)%4;
+ }
+nativeSetDisplayOrientation(displayId, rotation);}@@ -249,6 +256,13 @@return nativeHasKeys(deviceId, sourceMask, keyCodes, keyExists);}+ /**
+ *reset the tp correct params
+ */
+ public void resetTouchCalibration()
+ {
+ nativeResetTouchCalibration();
+ }/*** Creates an input channel that will receive all input from the input dispatcher.* @param inputChannelName The input channel name.
frameworks/base/core/java/android/view/WindowManager.java
Index: WindowManager.java
===================================================================
--- WindowManager.java (revision 2175)
+++ WindowManager.java (revision 2176)
@@ -699,6 +699,8 @@* {@hide} */public static final int FLAG_SYSTEM_ERROR = 0x40000000;+ public static final int FLAG_AW_HIDESTATUS = 0x80000000;
+/*** Various behavioral options/flags. Default is none.*
@@ -777,7 +779,9 @@@ViewDebug.FlagToString(mask = FLAG_SPLIT_TOUCH, equals = FLAG_SPLIT_TOUCH,name = "FLAG_SPLIT_TOUCH"),@ViewDebug.FlagToString(mask = FLAG_HARDWARE_ACCELERATED, equals = FLAG_HARDWARE_ACCELERATED,
- name = "FLAG_HARDWARE_ACCELERATED")
+ name = "FLAG_HARDWARE_ACCELERATED"),
+ @ViewDebug.FlagToString(mask = FLAG_AW_HIDESTATUS, equals = FLAG_AW_HIDESTATUS,
+ name = "FLAG_AW_HIDESTATUS")})public int flags;
frameworks/base/core/java/android/view/WindowManagerPolicy.java
Index: WindowManagerPolicy.java
===================================================================
--- WindowManagerPolicy.java (revision 2175)
+++ WindowManagerPolicy.java (revision 2176)
@@ -298,6 +298,11 @@boolean isDisplayedLw();/**
+ * Is this window considered to be gone for purposes of layout?
+ */
+ boolean isGoneForLayoutLw();
+
+ /*** Returns true if this window has been shown on screen at some time in * the past. Must be called with the window manager lock held.*
@@ -946,6 +951,10 @@*/public void systemReady();+ public boolean statusbarShow();
+
+ public boolean statusbarHide();
+/*** Called when the system is done booting to the point where the* user can start interacting with it.
@@ -1023,6 +1032,11 @@public boolean hasNavigationBar();/**
+ * Lock the device now.
+ */
+ public void lockNow();
+
+ /*** Print the WindowManagerPolicy's state into the given stream.** @param prefix Text to print at the front of each line.
frameworks/base/core/java/android/view/IWindowManager.aidl
Index: IWindowManager.aidl
===================================================================
--- IWindowManager.aidl (revision 2175)
+++ IWindowManager.aidl (revision 2176)
@@ -229,4 +229,14 @@* Device has a software navigation bar (separate from the status bar).*/boolean hasNavigationBar();
+
+ /**
+ * Lock the device immediately.
+ */
+ void lockNow();
+
+ void resetInputCalibration();
+ void statusbarShow();
+ void statusbarHide();
+ void invokePerformWindow();}
frameworks/base/core/res/res/values/attrs.xml
Index: attrs.xml
===================================================================
--- attrs.xml (revision 2175)
+++ attrs.xml (revision 2176)
@@ -307,6 +307,8 @@<attr name="windowNoTitle" format="boolean" /><!-- Flag indicating whether this window should fill the entire screen. --><attr name="windowFullscreen" format="boolean" />
+ <!-- Flag indicating whether this window should hide the statusbar for tablet. -->
+ <attr name="windowHideStatusbar" format="boolean" /><!-- Flag indicating whether this is a floating window. --><attr name="windowIsFloating" format="boolean" /><!-- Flag indicating whether this is a translucent window. -->
@@ -1515,6 +1517,7 @@<attr name="windowFrame" /><attr name="windowNoTitle" /><attr name="windowFullscreen" />
+ <attr name="windowHideStatusbar" /><attr name="windowIsFloating" /><attr name="windowIsTranslucent" /><attr name="windowShowWallpaper" />
@@ -5285,6 +5288,10 @@<!-- Used to shift center of pattern horizontally. --><attr name="horizontalOffset" format="dimension" />
+ <!-- The max application icon number -->
+ <attr name="maxAppIconNum" format="integer" />
+ <!-- The icon size -->
+ <attr name="iconSize" format="integer" /></declare-styleable><!-- =============================== -->
frameworks/base/core/res/res/values/public.xml
Index: public.xml
===================================================================
--- public.xml (revision 2175)
+++ public.xml (revision 2176)
@@ -572,6 +572,7 @@<public type="attr" name="listChoiceIndicatorMultiple" id="0x0101021a" /><public type="attr" name="versionCode" id="0x0101021b" /><public type="attr" name="versionName" id="0x0101021c" />
+ <public type="attr" name="windowHideStatusbar" id="0x0101040e" /><public type="id" name="background" id="0x01020000" /><public type="id" name="checkbox" id="0x01020001" />