android4.0.3校准屏幕和隐藏statusbar

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" />


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值