diff options
23 files changed, 2112 insertions, 78 deletions
diff --git a/api/current.xml b/api/current.xml index a396c4d..7df4115 100644 --- a/api/current.xml +++ b/api/current.xml @@ -46849,6 +46849,1742 @@ </method> </class> </package> +<package name="android.gesture" +> +<class name="Gesture" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<implements name="android.os.Parcelable"> +</implements> +<constructor name="Gesture" + type="android.gesture.Gesture" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</constructor> +<method name="addStroke" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="stroke" type="android.gesture.GestureStroke"> +</parameter> +</method> +<method name="describeContents" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getBoundingBox" + return="android.graphics.RectF" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getID" + return="long" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getLength" + return="float" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStrokes" + return="java.util.ArrayList<android.gesture.GestureStroke>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getStrokesCount" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="toBitmap" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="width" type="int"> +</parameter> +<parameter name="height" type="int"> +</parameter> +<parameter name="edge" type="int"> +</parameter> +<parameter name="numSample" type="int"> +</parameter> +<parameter name="color" type="int"> +</parameter> +</method> +<method name="toBitmap" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="width" type="int"> +</parameter> +<parameter name="height" type="int"> +</parameter> +<parameter name="inset" type="int"> +</parameter> +<parameter name="color" type="int"> +</parameter> +</method> +<method name="toPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="toPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="android.graphics.Path"> +</parameter> +</method> +<method name="toPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="width" type="int"> +</parameter> +<parameter name="height" type="int"> +</parameter> +<parameter name="edge" type="int"> +</parameter> +<parameter name="numSample" type="int"> +</parameter> +</method> +<method name="toPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="android.graphics.Path"> +</parameter> +<parameter name="width" type="int"> +</parameter> +<parameter name="height" type="int"> +</parameter> +<parameter name="edge" type="int"> +</parameter> +<parameter name="numSample" type="int"> +</parameter> +</method> +<method name="writeToParcel" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="out" type="android.os.Parcel"> +</parameter> +<parameter name="flags" type="int"> +</parameter> +</method> +<field name="CREATOR" + type="android.os.Parcelable.Creator" + transient="false" + volatile="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="GestureLibraries" + extends="java.lang.Object" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="fromFile" + return="android.gesture.GestureLibrary" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="java.lang.String"> +</parameter> +</method> +<method name="fromFile" + return="android.gesture.GestureLibrary" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="java.io.File"> +</parameter> +</method> +<method name="fromPrivateFile" + return="android.gesture.GestureLibrary" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="name" type="java.lang.String"> +</parameter> +</method> +<method name="fromRawResource" + return="android.gesture.GestureLibrary" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="resourceId" type="int"> +</parameter> +</method> +</class> +<class name="GestureLibrary" + extends="java.lang.Object" + abstract="true" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="GestureLibrary" + type="android.gesture.GestureLibrary" + static="false" + final="false" + deprecated="not deprecated" + visibility="protected" +> +</constructor> +<method name="addGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="getGestureEntries" + return="java.util.Set<java.lang.String>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestures" + return="java.util.ArrayList<android.gesture.Gesture>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +</method> +<method name="getLearner" + return="android.gesture.Learner" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getOrientationStyle" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getSequenceType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isReadOnly" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="load" + return="boolean" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="recognize" + return="java.util.ArrayList<android.gesture.Prediction>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="removeEntry" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +</method> +<method name="removeGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="save" + return="boolean" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="setOrientationStyle" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="style" type="int"> +</parameter> +</method> +<method name="setSequenceType" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="type" type="int"> +</parameter> +</method> +<field name="mStore" + type="android.gesture.GestureStore" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="protected" +> +</field> +</class> +<class name="GestureOverlayView" + extends="android.widget.FrameLayout" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="GestureOverlayView" + type="android.gesture.GestureOverlayView" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +</constructor> +<constructor name="GestureOverlayView" + type="android.gesture.GestureOverlayView" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="attrs" type="android.util.AttributeSet"> +</parameter> +</constructor> +<constructor name="GestureOverlayView" + type="android.gesture.GestureOverlayView" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="attrs" type="android.util.AttributeSet"> +</parameter> +<parameter name="defStyle" type="int"> +</parameter> +</constructor> +<method name="addOnGestureListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener"> +</parameter> +</method> +<method name="addOnGesturePerformedListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener"> +</parameter> +</method> +<method name="addOnGesturingListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener"> +</parameter> +</method> +<method name="cancelClearAnimation" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="cancelGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="clear" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="animated" type="boolean"> +</parameter> +</method> +<method name="getCurrentStroke" + return="java.util.ArrayList<android.gesture.GesturePoint>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getFadeOffset" + return="long" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGesture" + return="android.gesture.Gesture" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestureColor" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGesturePath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGesturePath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="android.graphics.Path"> +</parameter> +</method> +<method name="getGestureStrokeAngleThreshold" + return="float" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestureStrokeLengthThreshold" + return="float" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestureStrokeSquarenessTreshold" + return="float" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestureStrokeType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestureStrokeWidth" + return="float" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getOrientation" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getUncertainGestureColor" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isEventsInterceptionEnabled" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isFadeEnabled" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isGestureVisible" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isGesturing" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="removeAllOnGestureListeners" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="removeAllOnGesturePerformedListeners" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="removeAllOnGesturingListeners" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="removeOnGestureListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGestureListener"> +</parameter> +</method> +<method name="removeOnGesturePerformedListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturePerformedListener"> +</parameter> +</method> +<method name="removeOnGesturingListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="listener" type="android.gesture.GestureOverlayView.OnGesturingListener"> +</parameter> +</method> +<method name="setEventsInterceptionEnabled" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="enabled" type="boolean"> +</parameter> +</method> +<method name="setFadeEnabled" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="fadeEnabled" type="boolean"> +</parameter> +</method> +<method name="setFadeOffset" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="fadeOffset" type="long"> +</parameter> +</method> +<method name="setGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="setGestureColor" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="color" type="int"> +</parameter> +</method> +<method name="setGestureStrokeAngleThreshold" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gestureStrokeAngleThreshold" type="float"> +</parameter> +</method> +<method name="setGestureStrokeLengthThreshold" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gestureStrokeLengthThreshold" type="float"> +</parameter> +</method> +<method name="setGestureStrokeSquarenessTreshold" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gestureStrokeSquarenessTreshold" type="float"> +</parameter> +</method> +<method name="setGestureStrokeType" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gestureStrokeType" type="int"> +</parameter> +</method> +<method name="setGestureStrokeWidth" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gestureStrokeWidth" type="float"> +</parameter> +</method> +<method name="setGestureVisible" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="visible" type="boolean"> +</parameter> +</method> +<method name="setOrientation" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="orientation" type="int"> +</parameter> +</method> +<method name="setUncertainGestureColor" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="color" type="int"> +</parameter> +</method> +<field name="GESTURE_STROKE_TYPE_MULTIPLE" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="GESTURE_STROKE_TYPE_SINGLE" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ORIENTATION_HORIZONTAL" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ORIENTATION_VERTICAL" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<interface name="GestureOverlayView.OnGestureListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onGesture" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +<parameter name="event" type="android.view.MotionEvent"> +</parameter> +</method> +<method name="onGestureCancelled" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +<parameter name="event" type="android.view.MotionEvent"> +</parameter> +</method> +<method name="onGestureEnded" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +<parameter name="event" type="android.view.MotionEvent"> +</parameter> +</method> +<method name="onGestureStarted" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +<parameter name="event" type="android.view.MotionEvent"> +</parameter> +</method> +</interface> +<interface name="GestureOverlayView.OnGesturePerformedListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onGesturePerformed" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +</interface> +<interface name="GestureOverlayView.OnGesturingListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onGesturingEnded" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +</method> +<method name="onGesturingStarted" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="overlay" type="android.gesture.GestureOverlayView"> +</parameter> +</method> +</interface> +<class name="GesturePoint" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="GesturePoint" + type="android.gesture.GesturePoint" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="x" type="float"> +</parameter> +<parameter name="y" type="float"> +</parameter> +<parameter name="t" type="long"> +</parameter> +</constructor> +<field name="timestamp" + type="long" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="x" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="y" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="GestureStore" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="GestureStore" + type="android.gesture.GestureStore" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</constructor> +<method name="addGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="getGestureEntries" + return="java.util.Set<java.lang.String>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getGestures" + return="java.util.ArrayList<android.gesture.Gesture>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +</method> +<method name="getOrientationStyle" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getSequenceType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="hasChanged" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="load" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="stream" type="java.io.InputStream"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="load" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="stream" type="java.io.InputStream"> +</parameter> +<parameter name="closeStream" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="recognize" + return="java.util.ArrayList<android.gesture.Prediction>" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="removeEntry" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +</method> +<method name="removeGesture" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="entryName" type="java.lang.String"> +</parameter> +<parameter name="gesture" type="android.gesture.Gesture"> +</parameter> +</method> +<method name="save" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="stream" type="java.io.OutputStream"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="save" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="stream" type="java.io.OutputStream"> +</parameter> +<parameter name="closeStream" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="setOrientationStyle" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="style" type="int"> +</parameter> +</method> +<method name="setSequenceType" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="type" type="int"> +</parameter> +</method> +<field name="ORIENTATION_INVARIANT" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="ORIENTATION_SENSITIVE" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SEQUENCE_INVARIANT" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SEQUENCE_SENSITIVE" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="GestureStroke" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="GestureStroke" + type="android.gesture.GestureStroke" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="points" type="java.util.ArrayList<android.gesture.GesturePoint>"> +</parameter> +</constructor> +<method name="clearPath" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="computeOrientedBoundingBox" + return="android.gesture.OrientedBoundingBox" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="toPath" + return="android.graphics.Path" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="width" type="float"> +</parameter> +<parameter name="height" type="float"> +</parameter> +<parameter name="numSample" type="int"> +</parameter> +</method> +<field name="boundingBox" + type="android.graphics.RectF" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="length" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="points" + type="float[]" + transient="false" + volatile="false" + value="null" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="Learner" + extends="java.lang.Object" + abstract="true" + static="false" + final="false" + deprecated="not deprecated" + visibility="" +> +</class> +<class name="OrientedBoundingBox" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<field name="centerX" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="centerY" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="height" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="orientation" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="squareness" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="width" + type="float" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="Prediction" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<field name="name" + type="java.lang.String" + transient="false" + volatile="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="score" + type="double" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +</package> <package name="android.graphics" > <class name="AvoidXfermode" diff --git a/core/java/android/gesture/Gesture.java b/core/java/android/gesture/Gesture.java index 2262477..c92f665 100755 --- a/core/java/android/gesture/Gesture.java +++ b/core/java/android/gesture/Gesture.java @@ -57,11 +57,6 @@ public class Gesture implements Parcelable { mGestureID = GESTURE_ID_BASE + sGestureCount++; } - void recycle() { - mStrokes.clear(); - mBoundingBox.setEmpty(); - } - /** * @return all the strokes of the gesture */ @@ -162,20 +157,6 @@ public class Gesture implements Parcelable { } /** - * draw the gesture - * - * @param canvas - */ - void draw(Canvas canvas, Paint paint) { - final ArrayList<GestureStroke> strokes = mStrokes; - final int count = strokes.size(); - - for (int i = 0; i < count; i++) { - strokes.get(i).draw(canvas, paint); - } - } - - /** * Create a bitmap of the gesture with a transparent background * * @param width width of the target bitmap diff --git a/core/java/android/gesture/package.html b/core/java/android/gesture/package.html index a54a017..32c44d2 100644 --- a/core/java/android/gesture/package.html +++ b/core/java/android/gesture/package.html @@ -1,5 +1,5 @@ <HTML> <BODY> -@hide +Provides classes to create, recognize, load and save gestures. </BODY> </HTML> diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java index 1214abc..51e6c1e 100644 --- a/core/java/android/os/Process.java +++ b/core/java/android/os/Process.java @@ -68,6 +68,12 @@ public class Process { public static final int PHONE_UID = 1001; /** + * Defines the UID/GID for the WIFI supplicant process. + * @hide + */ + public static final int WIFI_UID = 1010; + + /** * Defines the start of a range of UIDs (and GIDs), going from this * number to {@link #LAST_APPLICATION_UID} that are reserved for assigning * to applications. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index aa583ac..6ed1ac8 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1328,7 +1328,7 @@ public final class Settings { * boolean (1 or 0). */ public static final String HAPTIC_FEEDBACK_ENABLED = "haptic_feedback_enabled"; - + /** * Whether live web suggestions while the user types into search dialogs are * enabled. Browsers and other search UIs should respect this, as it allows @@ -2300,7 +2300,7 @@ public final class Settings { * @hide */ public static final String BACKUP_TRANSPORT = "backup_transport"; - + /** * Version for which the setup wizard was last shown. Bumped for * each release when there is new setup information to show. @@ -2954,6 +2954,13 @@ public final class Settings { "vending_pd_resend_frequency_ms"; /** + * Frequency in milliseconds at which we should cycle through the promoted applications + * on the home screen or the categories page. + */ + public static final String VENDING_PROMO_REFRESH_FREQUENCY_MS = + "vending_promo_refresh_freq_ms"; + + /** * URL that points to the legal terms of service to display in Settings. * <p> * This should be a https URL. For a pretty user-friendly URL, use diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java index b959907..c615957 100644 --- a/core/java/android/server/search/Searchables.java +++ b/core/java/android/server/search/Searchables.java @@ -247,7 +247,12 @@ public class Searchables { for (int i = 0; i < webSearchInfoList.size(); ++i) { ActivityInfo ai = webSearchInfoList.get(i).activityInfo; ComponentName component = new ComponentName(ai.packageName, ai.name); - newSearchablesForWebSearchList.add(newSearchablesMap.get(component)); + SearchableInfo searchable = newSearchablesMap.get(component); + if (searchable == null) { + Log.w(LOG_TAG, "did not find component in searchables: " + component); + } else { + newSearchablesForWebSearchList.add(searchable); + } } } diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index ec671d5..9f01923 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -16,15 +16,27 @@ package android.webkit; +import android.content.ContentValues; import android.content.Context; +import android.content.SharedPreferences; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.preference.PreferenceManager; import android.provider.Checkin; +import android.provider.Settings; +import android.util.Log; +import java.io.File; import java.lang.SecurityException; + +import android.content.SharedPreferences.Editor; import android.content.pm.PackageManager; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteException; +import android.database.sqlite.SQLiteStatement; +import java.util.HashSet; import java.util.Locale; /** @@ -176,6 +188,43 @@ public class WebSettings { private boolean mBuiltInZoomControls = false; private boolean mAllowFileAccess = true; + // Donut-specific hack to keep Gears permissions in sync with the + // system location setting. + // TODO: Make sure this hack is removed in Eclair, when Gears + // is also removed. + // Used to remember if we checked the Gears permissions already. + static boolean mCheckedGearsPermissions = false; + // The Gears permissions database directory. + private final static String GEARS_DATABASE_DIR = "gears"; + // The Gears permissions database file name. + private final static String GEARS_DATABASE_FILE = "permissions.db"; + // The Gears location permissions table. + private final static String GEARS_LOCATION_ACCESS_TABLE_NAME = + "LocationAccess"; + // The Gears storage access permissions table. + private final static String GEARS_STORAGE_ACCESS_TABLE_NAME = "Access"; + // The Gears permissions db schema version table. + private final static String GEARS_SCHEMA_VERSION_TABLE_NAME = + "VersionInfo"; + // The shared pref name. + private static final String LAST_KNOWN_LOCATION_SETTING = + "lastKnownLocationSystemSetting"; + // The Browser package name. + private static final String BROWSER_PACKAGE_NAME = "com.android.browser"; + // The Google URLs whitelisted for Gears location access. + private static HashSet<String> sGearsWhiteList; + + static { + sGearsWhiteList = new HashSet<String>(); + // NOTE: DO NOT ADD A "/" AT THE END! + sGearsWhiteList.add("http://www.google.com"); + sGearsWhiteList.add("http://www.google.co.uk"); + } + + private static final String LOGTAG = "webcore"; + static final boolean DEBUG = false; + static final boolean LOGV_ENABLED = DEBUG; + // Class to handle messages before WebCore is ready. private class EventHandler { // Message id for syncing @@ -196,6 +245,7 @@ public class WebSettings { switch (msg.what) { case SYNC: synchronized (WebSettings.this) { + checkGearsPermissions(); if (mBrowserFrame.mNativeFrame != 0) { nativeSync(mBrowserFrame.mNativeFrame); } @@ -1163,6 +1213,126 @@ public class WebSettings { return size; } + private void checkGearsPermissions() { + // Did we already check the permissions? + if (mCheckedGearsPermissions) { + return; + } + // Are we running in the browser? + if (!BROWSER_PACKAGE_NAME.equals(mContext.getPackageName())) { + return; + } + // Is the pluginsPath sane? + if (mPluginsPath == null || mPluginsPath.length() == 0) { + // We don't yet have a meaningful plugin path, so + // we can't do anything about the Gears permissions. + return; + } + // Remember we checked the Gears permissions. + mCheckedGearsPermissions = true; + // Get the current system settings. + int setting = Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.USE_LOCATION_FOR_SERVICES, -1); + // Check if we need to set the Gears permissions. + if (setting != -1 && locationSystemSettingChanged(setting)) { + setGearsPermissionForGoogleDomains(setting); + } + } + + private boolean locationSystemSettingChanged(int newSetting) { + SharedPreferences prefs = + PreferenceManager.getDefaultSharedPreferences(mContext); + int oldSetting = 0; + oldSetting = prefs.getInt(LAST_KNOWN_LOCATION_SETTING, oldSetting); + if (oldSetting == newSetting) { + return false; + } + Editor ed = prefs.edit(); + ed.putInt(LAST_KNOWN_LOCATION_SETTING, newSetting); + ed.commit(); + return true; + } + + private void setGearsPermissionForGoogleDomains(int systemPermission) { + // Transform the system permission into a Gears permission + int gearsPermission = (systemPermission == 1 ? 1 : 2); + // Build the path to the Gears library. + + File file = new File(mPluginsPath).getParentFile(); + if (file == null) { + return; + } + // Build the Gears database file name. + file = new File(file.getAbsolutePath() + File.separator + + GEARS_DATABASE_DIR + File.separator + GEARS_DATABASE_FILE); + // Remember whether or not we need to create the LocationAccess table. + boolean needToCreateTables = !file.exists(); + // Try opening the Gears database. + SQLiteDatabase permissions; + try { + permissions = SQLiteDatabase.openOrCreateDatabase(file, null); + } catch (SQLiteException e) { + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Could not open Gears permission DB: " + + e.getMessage()); + } + // Just bail out. + return; + } + // We now have a database open. Begin a transaction. + permissions.beginTransaction(); + try { + if (needToCreateTables) { + // Create the tables. Note that this creates the + // Gears tables for the permissions DB schema version 2. + // The Gears schema upgrade process will take care of the rest. + // First, the storage access table. + SQLiteStatement statement = permissions.compileStatement( + "CREATE TABLE IF NOT EXISTS " + + GEARS_STORAGE_ACCESS_TABLE_NAME + + " (Name TEXT UNIQUE, Value)"); + statement.execute(); + // Next the location access table. + statement = permissions.compileStatement( + "CREATE TABLE IF NOT EXISTS " + + GEARS_LOCATION_ACCESS_TABLE_NAME + + " (Name TEXT UNIQUE, Value)"); + statement.execute(); + // Finally, the schema version table. + statement = permissions.compileStatement( + "CREATE TABLE IF NOT EXISTS " + + GEARS_SCHEMA_VERSION_TABLE_NAME + + " (Name TEXT UNIQUE, Value)"); + statement.execute(); + // Set the schema version to 2. + ContentValues schema = new ContentValues(); + schema.put("Name", "Version"); + schema.put("Value", 2); + permissions.insert(GEARS_SCHEMA_VERSION_TABLE_NAME, null, + schema); + } + + ContentValues permissionValues = new ContentValues(); + + for (String url : sGearsWhiteList) { + permissionValues.put("Name", url); + permissionValues.put("Value", gearsPermission); + permissions.replace(GEARS_LOCATION_ACCESS_TABLE_NAME, null, + permissionValues); + permissionValues.clear(); + } + // Commit the transaction. + permissions.setTransactionSuccessful(); + } catch (SQLiteException e) { + if (LOGV_ENABLED) { + Log.v(LOGTAG, "Could not set the Gears permissions: " + + e.getMessage()); + } + } finally { + permissions.endTransaction(); + permissions.close(); + } + } /* Post a SYNC message to handle syncing the native settings. */ private synchronized void postSync() { // Only post if a sync is not pending diff --git a/core/jni/android_backup_BackupDataOutput.cpp b/core/jni/android_backup_BackupDataOutput.cpp index d02590e..ce30aaa 100644 --- a/core/jni/android_backup_BackupDataOutput.cpp +++ b/core/jni/android_backup_BackupDataOutput.cpp @@ -70,7 +70,7 @@ writeEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int s int err; BackupDataWriter* writer = (BackupDataWriter*)w; - if (env->GetArrayLength(data) > size) { + if (env->GetArrayLength(data) < size) { // size mismatch return -1; } diff --git a/core/jni/android_net_wifi_Wifi.cpp b/core/jni/android_net_wifi_Wifi.cpp index 9f93e2f..ae744a8 100644 --- a/core/jni/android_net_wifi_Wifi.cpp +++ b/core/jni/android_net_wifi_Wifi.cpp @@ -27,6 +27,8 @@ namespace android { +static jboolean sScanModeActive = false; + /* * The following remembers the jfieldID's of the fields * of the DhcpInfo Java object, so that we don't have @@ -254,27 +256,29 @@ static jboolean android_net_wifi_reassociateCommand(JNIEnv* env, jobject clazz) return doBooleanCommand("REASSOCIATE", "OK"); } -static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz) +static jboolean doSetScanMode(jboolean setActive) +{ + return doBooleanCommand((setActive ? "DRIVER SCAN-ACTIVE" : "DRIVER SCAN-PASSIVE"), "OK"); +} + +static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz, jboolean forceActive) { jboolean result; + // Ignore any error from setting the scan mode. // The scan will still work. - (void)doBooleanCommand("DRIVER SCAN-ACTIVE", "OK"); + if (forceActive && !sScanModeActive) + doSetScanMode(true); result = doBooleanCommand("SCAN", "OK"); - (void)doBooleanCommand("DRIVER SCAN-PASSIVE", "OK"); + if (forceActive && !sScanModeActive) + doSetScanMode(sScanModeActive); return result; } static jboolean android_net_wifi_setScanModeCommand(JNIEnv* env, jobject clazz, jboolean setActive) { - jboolean result; - // Ignore any error from setting the scan mode. - // The scan will still work. - if (setActive) { - return doBooleanCommand("DRIVER SCAN-ACTIVE", "OK"); - } else { - return doBooleanCommand("DRIVER SCAN-PASSIVE", "OK"); - } + sScanModeActive = setActive; + return doSetScanMode(setActive); } static jboolean android_net_wifi_startDriverCommand(JNIEnv* env, jobject clazz) @@ -509,7 +513,7 @@ static JNINativeMethod gWifiMethods[] = { { "disconnectCommand", "()Z", (void *)android_net_wifi_disconnectCommand }, { "reconnectCommand", "()Z", (void *)android_net_wifi_reconnectCommand }, { "reassociateCommand", "()Z", (void *)android_net_wifi_reassociateCommand }, - { "scanCommand", "()Z", (void*) android_net_wifi_scanCommand }, + { "scanCommand", "(Z)Z", (void*) android_net_wifi_scanCommand }, { "setScanModeCommand", "(Z)Z", (void*) android_net_wifi_setScanModeCommand }, { "startDriverCommand", "()Z", (void*) android_net_wifi_startDriverCommand }, { "stopDriverCommand", "()Z", (void*) android_net_wifi_stopDriverCommand }, diff --git a/core/res/res/values-no-rNO/arrays.xml b/core/res/res/values-nb-rNO/arrays.xml index 500e8e1..500e8e1 100644 --- a/core/res/res/values-no-rNO/arrays.xml +++ b/core/res/res/values-nb-rNO/arrays.xml diff --git a/libs/utils/ResourceTypes.cpp b/libs/utils/ResourceTypes.cpp index 109f28d..87edb01 100644 --- a/libs/utils/ResourceTypes.cpp +++ b/libs/utils/ResourceTypes.cpp @@ -1573,7 +1573,6 @@ status_t ResTable::add(Asset* asset, void* cookie, bool copyData) status_t ResTable::add(ResTable* src) { mError = src->mError; - mParams = src->mParams; for (size_t i=0; i<src->mHeaders.size(); i++) { mHeaders.add(src->mHeaders[i]); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index b6bc8a5..2b36904 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -16,12 +16,16 @@ package com.android.providers.settings; +import java.io.DataInputStream; +import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.io.EOFException; import java.util.Arrays; import java.util.HashMap; +import java.util.zip.CRC32; import android.backup.BackupDataInput; import android.backup.BackupDataOutput; @@ -34,7 +38,9 @@ import android.database.Cursor; import android.media.AudioManager; import android.net.Uri; import android.net.wifi.WifiManager; +import android.os.FileUtils; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.provider.Settings; @@ -52,6 +58,13 @@ public class SettingsBackupAgent extends BackupHelperAgent { private static final String KEY_SYNC = "sync_providers"; private static final String KEY_LOCALE = "locale"; + private static final int STATE_SYSTEM = 0; + private static final int STATE_SECURE = 1; + private static final int STATE_SYNC = 2; + private static final int STATE_LOCALE = 3; + private static final int STATE_WIFI = 4; + private static final int STATE_SIZE = 5; // The number of state items + private static String[] sortedSystemKeys = null; private static String[] sortedSecureKeys = null; @@ -87,20 +100,22 @@ public class SettingsBackupAgent extends BackupHelperAgent { byte[] secureSettingsData = getSecureSettings(); byte[] syncProviders = mSettingsHelper.getSyncProviders(); byte[] locale = mSettingsHelper.getLocaleData(); - - data.writeEntityHeader(KEY_SYSTEM, systemSettingsData.length); - data.writeEntityData(systemSettingsData, systemSettingsData.length); - - data.writeEntityHeader(KEY_SECURE, secureSettingsData.length); - data.writeEntityData(secureSettingsData, secureSettingsData.length); - - data.writeEntityHeader(KEY_SYNC, syncProviders.length); - data.writeEntityData(syncProviders, syncProviders.length); - - data.writeEntityHeader(KEY_LOCALE, locale.length); - data.writeEntityData(locale, locale.length); - - backupFile(FILE_WIFI_SUPPLICANT, data); + byte[] wifiData = getFileData(FILE_WIFI_SUPPLICANT); + + long[] stateChecksums = readOldChecksums(oldState); + + stateChecksums[STATE_SYSTEM] = + writeIfChanged(stateChecksums[STATE_SYSTEM], KEY_SYSTEM, systemSettingsData, data); + stateChecksums[STATE_SECURE] = + writeIfChanged(stateChecksums[STATE_SECURE], KEY_SECURE, secureSettingsData, data); + stateChecksums[STATE_SYNC] = + writeIfChanged(stateChecksums[STATE_SYNC], KEY_SYNC, syncProviders, data); + stateChecksums[STATE_LOCALE] = + writeIfChanged(stateChecksums[STATE_LOCALE], KEY_LOCALE, locale, data); + stateChecksums[STATE_WIFI] = + writeIfChanged(stateChecksums[STATE_WIFI], FILE_WIFI_SUPPLICANT, wifiData, data); + + writeNewChecksums(stateChecksums, newState); } @Override @@ -115,11 +130,15 @@ public class SettingsBackupAgent extends BackupHelperAgent { final int size = data.getDataSize(); if (KEY_SYSTEM.equals(key)) { restoreSettings(data, Settings.System.CONTENT_URI); + mSettingsHelper.applyAudioSettings(); } else if (KEY_SECURE.equals(key)) { restoreSettings(data, Settings.Secure.CONTENT_URI); -// TODO: Re-enable WIFI restore when we figure out a solution for the permissions -// } else if (FILE_WIFI_SUPPLICANT.equals(key)) { -// restoreFile(FILE_WIFI_SUPPLICANT, data); + } else if (FILE_WIFI_SUPPLICANT.equals(key)) { + restoreFile(FILE_WIFI_SUPPLICANT, data); + FileUtils.setPermissions(FILE_WIFI_SUPPLICANT, + FileUtils.S_IRUSR | FileUtils.S_IWUSR | + FileUtils.S_IRGRP | FileUtils.S_IWGRP, + Process.myUid(), Process.WIFI_UID); } else if (KEY_SYNC.equals(key)) { mSettingsHelper.setSyncProviders(data); } else if (KEY_LOCALE.equals(key)) { @@ -132,6 +151,49 @@ public class SettingsBackupAgent extends BackupHelperAgent { } } + private long[] readOldChecksums(ParcelFileDescriptor oldState) throws IOException { + long[] stateChecksums = new long[STATE_SIZE]; + + DataInputStream dataInput = new DataInputStream( + new FileInputStream(oldState.getFileDescriptor())); + for (int i = 0; i < STATE_SIZE; i++) { + try { + stateChecksums[i] = dataInput.readLong(); + } catch (EOFException eof) { + break; + } + } + dataInput.close(); + return stateChecksums; + } + + private void writeNewChecksums(long[] checksums, ParcelFileDescriptor newState) + throws IOException { + DataOutputStream dataOutput = new DataOutputStream( + new FileOutputStream(newState.getFileDescriptor())); + for (int i = 0; i < STATE_SIZE; i++) { + dataOutput.writeLong(checksums[i]); + } + dataOutput.close(); + } + + private long writeIfChanged(long oldChecksum, String key, byte[] data, + BackupDataOutput output) { + CRC32 checkSummer = new CRC32(); + checkSummer.update(data); + long newChecksum = checkSummer.getValue(); + if (oldChecksum == newChecksum) { + return oldChecksum; + } + try { + output.writeEntityHeader(key, data.length); + output.writeEntityData(data, data.length); + } catch (IOException ioe) { + // Bail + } + return newChecksum; + } + private byte[] getSystemSettings() { Cursor sortedCursor = getContentResolver().query(Settings.System.CONTENT_URI, PROJECTION, null, null, Settings.NameValueTable.NAME); @@ -248,7 +310,7 @@ public class SettingsBackupAgent extends BackupHelperAgent { return result; } - private void backupFile(String filename, BackupDataOutput data) { + private byte[] getFileData(String filename) { try { File file = new File(filename); if (file.exists()) { @@ -260,14 +322,13 @@ public class SettingsBackupAgent extends BackupHelperAgent { got = fis.read(bytes, offset, bytes.length - offset); if (got > 0) offset += got; } while (offset < bytes.length && got > 0); - data.writeEntityHeader(filename, bytes.length); - data.writeEntityData(bytes, bytes.length); + return bytes; } else { - data.writeEntityHeader(filename, 0); - data.writeEntityData(EMPTY_DATA, 0); + return EMPTY_DATA; } } catch (IOException ioe) { Log.w(TAG, "Couldn't backup " + filename); + return EMPTY_DATA; } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java index 2c5775a..ca739e6 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java @@ -167,6 +167,9 @@ public class SettingsHelper { // Check if locale was set by the user: Configuration conf = mContext.getResources().getConfiguration(); Locale loc = conf.locale; + // TODO: The following is not working as intended because the network is forcing a locale + // change after registering. Need to find some other way to detect if the user manually + // changed the locale if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard final String[] availableLocales = mContext.getAssets().getLocales(); @@ -193,6 +196,14 @@ public class SettingsHelper { } catch (RemoteException e) { // Intentionally left blank } + } + /** + * Informs the audio service of changes to the settings so that + * they can be re-read and applied. + */ + void applyAudioSettings() { + AudioManager am = new AudioManager(mContext); + am.reloadAudioSettings(); } } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 2abf8b3..c0de9a5 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -126,11 +126,14 @@ public class SettingsProvider extends ContentProvider { // a notification and then using the contract class to get their data, // the system property will be updated and they'll get the new data. + boolean backedUpDataChanged = false; String property = null, table = uri.getPathSegments().get(0); if (table.equals("system")) { property = Settings.System.SYS_PROP_SETTING_VERSION; + backedUpDataChanged = true; } else if (table.equals("secure")) { property = Settings.Secure.SYS_PROP_SETTING_VERSION; + backedUpDataChanged = true; } else if (table.equals("gservices")) { property = Settings.Gservices.SYS_PROP_SETTING_VERSION; } @@ -142,7 +145,9 @@ public class SettingsProvider extends ContentProvider { } // Inform the backup manager about a data change - mBackupManager.dataChanged(); + if (backedUpDataChanged) { + mBackupManager.dataChanged(); + } // Now send the notification through the content framework. String notify = uri.getQueryParameter("notify"); diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index a713edf..1eba469 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -38,6 +38,8 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.TimeUnit; + /** * @hide Synthesizes speech from text. This is implemented as a service so that @@ -358,20 +360,38 @@ public class TtsService extends Service implements OnCompletionListener { * Stops all speech output and removes any utterances still in the queue. */ private int stop() { - Log.i("TTS", "Stopping"); - mSpeechQueue.clear(); + int result = TextToSpeech.TTS_ERROR; + boolean speechQueueAvailable = false; + try{ + // If the queue is locked for more than 1 second, + // something has gone very wrong with processSpeechQueue. + speechQueueAvailable = speechQueueLock.tryLock(1000, TimeUnit.MILLISECONDS); + if (speechQueueAvailable) { + Log.i("TTS", "Stopping"); + mSpeechQueue.clear(); - int result = nativeSynth.stop(); - mIsSpeaking = false; - if (mPlayer != null) { - try { - mPlayer.stop(); - } catch (IllegalStateException e) { - // Do nothing, the player is already stopped. + result = nativeSynth.stop(); + mIsSpeaking = false; + if (mPlayer != null) { + try { + mPlayer.stop(); + } catch (IllegalStateException e) { + // Do nothing, the player is already stopped. + } + } + Log.i("TTS", "Stopped"); + } + } catch (InterruptedException e) { + Log.e("TTS stop", "tryLock interrupted"); + e.printStackTrace(); + } finally { + // This check is needed because finally will always run; even if the + // method returns somewhere in the try block. + if (speechQueueAvailable) { + speechQueueLock.unlock(); } + return result; } - Log.i("TTS", "Stopped"); - return result; } public void onCompletion(MediaPlayer arg0) { @@ -443,6 +463,7 @@ public class TtsService extends Service implements OnCompletionListener { } nativeSynth.speak(text); } catch (InterruptedException e) { + Log.e("TTS speakInternalOnly", "tryLock interrupted"); e.printStackTrace(); } finally { // This check is needed because finally will always run; @@ -497,6 +518,7 @@ public class TtsService extends Service implements OnCompletionListener { } nativeSynth.synthesizeToFile(text, filename); } catch (InterruptedException e) { + Log.e("TTS synthToFileInternalOnly", "tryLock interrupted"); e.printStackTrace(); } finally { // This check is needed because finally will always run; diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 190d3e6..38fb7c9 100644 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -49,6 +49,7 @@ import android.os.IBinder; import android.os.Message; import android.os.Power; import android.os.RemoteException; +import android.os.SystemProperties; import android.os.Vibrator; import android.provider.Settings; import android.text.TextUtils; @@ -945,6 +946,9 @@ class NotificationManagerService extends INotificationManager.Stub // to accidentally lose. private void updateAdbNotification() { if (mAdbEnabled && mBatteryPlugged == BatteryManager.BATTERY_PLUGGED_USB) { + if ("0".equals(SystemProperties.get("persist.adb.notify"))) { + return; + } if (!mAdbNotificationShown) { NotificationManager notificationManager = (NotificationManager) mContext .getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index a940af3..01394ad 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -436,7 +436,7 @@ public class WifiService extends IWifiManager.Stub { * see {@link android.net.wifi.WifiManager#startScan()} * @return {@code true} if the operation succeeds */ - public boolean startScan() { + public boolean startScan(boolean forceActive) { enforceChangePermission(); synchronized (mWifiStateTracker) { switch (mWifiStateTracker.getSupplicantState()) { @@ -450,7 +450,7 @@ public class WifiService extends IWifiManager.Stub { WifiStateTracker.SUPPL_SCAN_HANDLING_LIST_ONLY); break; } - return WifiNative.scanCommand(); + return WifiNative.scanCommand(forceActive); } } diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java index cbcac6c..39bbf16 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/LoadTestsAutoTest.java @@ -72,6 +72,7 @@ public class LoadTestsAutoTest extends ActivityInstrumentationTestCase2<TestShel // Run tests runTestAndWaitUntilDone(activity, runner.mTestPath, runner.mTimeoutInMillis); + activity.clearCache(); dumpMemoryInfo(); // Kill activity diff --git a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java index 0d22eca..09f7cbc 100644 --- a/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java +++ b/tests/DumpRenderTree/src/com/android/dumprendertree/TestShellActivity.java @@ -87,6 +87,10 @@ public class TestShellActivity extends Activity implements LayoutTestController } } + public void clearCache() { + mWebView.clearCache(true); + } + @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 3d65d3c..fa328e8 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -40,7 +40,7 @@ interface IWifiManager boolean pingSupplicant(); - boolean startScan(); + boolean startScan(boolean forceActive); List<ScanResult> getScanResults(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 7a15f27..1f73bec 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -476,9 +476,27 @@ public class WifiManager { * on completion of the scan. * @return {@code true} if the operation succeeded, i.e., the scan was initiated */ - public boolean startScan() { + public boolean startScan() { try { - return mService.startScan(); + return mService.startScan(false); + } catch (RemoteException e) { + return false; + } + } + + /** + * Request a scan for access points. Returns immediately. The availability + * of the results is made known later by means of an asynchronous event sent + * on completion of the scan. + * This is a variant of startScan that forces an active scan, even if passive + * scans are the current default + * @return {@code true} if the operation succeeded, i.e., the scan was initiated + * + * @hide + */ + public boolean startScanActive() { + try { + return mService.startScan(true); } catch (RemoteException e) { return false; } diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index 3851ac0..0799f5f 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -51,7 +51,7 @@ public class WifiNative { public native static boolean pingCommand(); - public native static boolean scanCommand(); + public native static boolean scanCommand(boolean forceActive); public native static boolean setScanModeCommand(boolean setActive); diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java index 2fbc779..63687b3 100644 --- a/wifi/java/android/net/wifi/WifiStateTracker.java +++ b/wifi/java/android/net/wifi/WifiStateTracker.java @@ -1121,7 +1121,7 @@ public class WifiStateTracker extends NetworkStateTracker { } else { // In some situations, supplicant needs to be kickstarted to // start the background scanning - WifiNative.scanCommand(); + WifiNative.scanCommand(true); } } } |
