Reviewers: pdr,

Description:
Fixing touch scrolling support for devices that support it natively. Our
current touch support overrides native touch scrolling on tablets, which
breaks touch scrolling.


Please review this at http://gwt-code-reviews.appspot.com/1369809/

Affected files:
  M user/src/com/google/gwt/touch/client/TouchScroller.java
  M user/test/com/google/gwt/touch/client/TouchScrollTest.java


Index: user/src/com/google/gwt/touch/client/TouchScroller.java
===================================================================
--- user/src/com/google/gwt/touch/client/TouchScroller.java     (revision 9828)
+++ user/src/com/google/gwt/touch/client/TouchScroller.java     (working copy)
@@ -43,6 +43,11 @@

 /**
  * Adds touch based scrolling to a scroll panel.
+ *
+ * <p>
+ * Touch based scrolling is only supported on devices that support touch events
+ * and do not implement native touch based scrolling.
+ * </p>
  */
 @PartialSupport
 public class TouchScroller {
@@ -149,9 +154,29 @@
     }

     private native boolean detectTouchSupport() /*-{
+      // Detect touch event support.
       var elem = document.createElement('div');
       elem.setAttribute('ontouchstart', 'return;');
-      return (typeof elem.ontouchstart) == "function";
+      if ((typeof elem.ontouchstart) != "function") {
+        return false;
+      }
+
+ // Detect if the browser supports touch scrolling natively. If the browser + // natively supports touch scrolling, then TouchScroller is NOT supported.
+      var ua = navigator.userAgent.toLowerCase();
+      if (/android ([3-9]+)\.([0-9]+)/.exec(ua) != null) {
+         // Android 3.0 natively support touch scrolling.
+        return false;
+      }
+
+      return true;
+    }-*/;
+
+    /**
+     * Check if the user agent is android 3.0 or greater.
+     * @return
+     */
+    private native boolean isAndroid3() /*-{
     }-*/;
   }

@@ -222,9 +247,10 @@
   }

   /**
-   * Runtime check for whether touch events are supported in this browser.
-   *
-   * @return true if touch events are is supported, false it not
+ * Runtime check for whether touch scrolling is supported in this browser. Returns true if touch + * events are supported but touch based scrolling is not natively supported.
+   *
+   * @return true if touch events are supported, false it not
    */
   public static boolean isSupported() {
     return impl().isSupported();
Index: user/test/com/google/gwt/touch/client/TouchScrollTest.java
===================================================================
--- user/test/com/google/gwt/touch/client/TouchScrollTest.java (revision 9828) +++ user/test/com/google/gwt/touch/client/TouchScrollTest.java (working copy)
@@ -257,7 +257,7 @@
   public void testCreateIfSupported() {
     // createIfSupported()
     TouchScroller scroller = TouchScroller.createIfSupported();
-    if (isTouchSupported()) {
+    if (TouchScroller.isSupported()) {
assertNotNull("TouchScroll not created, but touch is supported", scroller);
       assertNull(scroller.getTargetWidget());

@@ -268,7 +268,7 @@
     // createIfSupported(HasScrolling)
     HasScrolling target = new ScrollPanel();
     scroller = TouchScroller.createIfSupported(target);
-    if (isTouchSupported()) {
+    if (TouchScroller.isSupported()) {
assertNotNull("TouchScroll not created, but touch is supported", scroller);
       assertEquals(target, scroller.getTargetWidget());

@@ -511,10 +511,4 @@
     scrollPanel = null;
     scroller = null;
   }
-
-  private native boolean isTouchSupported() /*-{
-    var elem = document.createElement('div');
-    elem.setAttribute('ontouchstart', 'return;');
-    return (typeof elem.ontouchstart) == "function";
-  }-*/;
 }


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to