diff options
74 files changed, 1586 insertions, 653 deletions
diff --git a/api/current.xml b/api/current.xml index cdb6964..b2c9f92 100644 --- a/api/current.xml +++ b/api/current.xml @@ -75700,6 +75700,16 @@ visibility="public" > </field> +<field name="inPreferQualityOverSpeed" + type="boolean" + transient="false" + volatile="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="inPreferredConfig" type="android.graphics.Bitmap.Config" transient="false" @@ -198453,6 +198463,17 @@ visibility="public" > </field> +<field name="FLAG_FALLBACK" + type="int" + transient="false" + volatile="false" + value="1024" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="FLAG_FROM_SYSTEM" type="int" transient="false" @@ -198684,6 +198705,17 @@ visibility="public" > </field> +<field name="KEYCODE_APP_SWITCH" + type="int" + transient="false" + volatile="false" + value="187" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="KEYCODE_AT" type="int" transient="false" @@ -239897,6 +239929,325 @@ </parameter> </method> </interface> +<class name="NumberPicker" + extends="android.widget.LinearLayout" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="NumberPicker" + type="android.widget.NumberPicker" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +</constructor> +<constructor name="NumberPicker" + type="android.widget.NumberPicker" + 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="NumberPicker" + type="android.widget.NumberPicker" + 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="getCurrent" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getRangeEnd" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getRangeStart" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="setCurrent" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="current" type="int"> +</parameter> +</method> +<method name="setFormatter" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="formatter" type="android.widget.NumberPicker.Formatter"> +</parameter> +</method> +<method name="setOnChangeListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="onChangeListener" type="android.widget.NumberPicker.OnChangeListener"> +</parameter> +</method> +<method name="setOnLongPressUpdateInterval" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="intervalMillis" type="long"> +</parameter> +</method> +<method name="setOnScrollListener" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="onScrollListener" type="android.widget.NumberPicker.OnScrollListener"> +</parameter> +</method> +<method name="setRange" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="start" type="int"> +</parameter> +<parameter name="end" type="int"> +</parameter> +</method> +<method name="setRange" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="start" type="int"> +</parameter> +<parameter name="end" type="int"> +</parameter> +<parameter name="displayedValues" type="java.lang.String[]"> +</parameter> +</method> +<method name="setRange" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="start" type="int"> +</parameter> +<parameter name="end" type="int"> +</parameter> +<parameter name="displayedValues" type="java.lang.String[]"> +</parameter> +<parameter name="wrapSelectorWheel" type="boolean"> +</parameter> +</method> +<method name="setWrapSelectorWheel" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="wrapSelector" type="boolean"> +</parameter> +</method> +<field name="TWO_DIGIT_FORMATTER" + type="android.widget.NumberPicker.Formatter" + transient="false" + volatile="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<interface name="NumberPicker.Formatter" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="toString" + return="java.lang.String" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="value" type="int"> +</parameter> +</method> +</interface> +<interface name="NumberPicker.OnChangeListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onChange" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="picker" type="android.widget.NumberPicker"> +</parameter> +<parameter name="oldVal" type="int"> +</parameter> +<parameter name="newVal" type="int"> +</parameter> +</method> +</interface> +<interface name="NumberPicker.OnScrollListener" + abstract="true" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<method name="onScrollStateChange" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="view" type="android.widget.NumberPicker"> +</parameter> +<parameter name="scrollState" type="int"> +</parameter> +</method> +<field name="SCROLL_STATE_FLING" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SCROLL_STATE_IDLE" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SCROLL_STATE_TOUCH_SCROLL" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</interface> <class name="OverScroller" extends="java.lang.Object" abstract="false" diff --git a/core/java/android/nfc/Tag.java b/core/java/android/nfc/Tag.java index ad05496..2f6b3a5 100644 --- a/core/java/android/nfc/Tag.java +++ b/core/java/android/nfc/Tag.java @@ -154,11 +154,7 @@ public class Tag implements Parcelable { case TagTechnology.NFC_V: { return new NfcV(adapter, this, extras); } - case TagTechnology.MIFARE_CLASSIC_NDEF: - case TagTechnology.TYPE_1: - case TagTechnology.TYPE_2: - case TagTechnology.TYPE_3: - case TagTechnology.TYPE_4: { + case TagTechnology.NDEF: { return new Ndef(adapter, this, tech, extras); } case TagTechnology.NFC_F: { diff --git a/core/java/android/nfc/technology/Ndef.java b/core/java/android/nfc/technology/Ndef.java index 22460cf..1e3da2a 100644 --- a/core/java/android/nfc/technology/Ndef.java +++ b/core/java/android/nfc/technology/Ndef.java @@ -44,6 +44,9 @@ public final class Ndef extends BasicTagTechnology { public static final int NDEF_MODE_WRITE_MANY = 4; public static final int NDEF_MODE_UNKNOWN = 5; + /** @hide */ + public static final String EXTRA_NDEF_MSG = "ndefmsg"; + /** * Internal constructor, to be used by NfcAdapter * @hide diff --git a/core/java/android/nfc/technology/TagTechnology.java b/core/java/android/nfc/technology/TagTechnology.java index 9dfb297..4704f2b 100644 --- a/core/java/android/nfc/technology/TagTechnology.java +++ b/core/java/android/nfc/technology/TagTechnology.java @@ -49,22 +49,7 @@ public interface TagTechnology { /** * This object is an instance of {@link Ndef} */ - public static final int TYPE_1 = 101; - - /** - * This object is an instance of {@link Ndef} - */ - public static final int TYPE_2 = 102; - - /** - * This object is an instance of {@link Ndef} - */ - public static final int TYPE_3 = 103; - - /** - * This object is an instance of {@link Ndef} - */ - public static final int TYPE_4 = 104; + public static final int NDEF = 101; /** * This object is an instance of {@link NdefFormatable} diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java index 97bd8dd..5c4abd5 100644 --- a/core/java/android/view/KeyCharacterMap.java +++ b/core/java/android/view/KeyCharacterMap.java @@ -144,6 +144,8 @@ public class KeyCharacterMap { private static native void nativeDispose(int ptr); private static native char nativeGetCharacter(int ptr, int keyCode, int metaState); + private static native boolean nativeGetFallbackAction(int ptr, int keyCode, int metaState, + FallbackAction outFallbackAction); private static native char nativeGetNumber(int ptr, int keyCode); private static native char nativeGetMatch(int ptr, int keyCode, char[] chars, int metaState); private static native char nativeGetDisplayLabel(int ptr, int keyCode); @@ -206,14 +208,9 @@ public class KeyCharacterMap { * @return The associated character or combining accent, or 0 if none. */ public int get(int keyCode, int metaState) { - if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) { - metaState |= KeyEvent.META_CAPS_LOCK_ON; - } - if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) { - metaState |= KeyEvent.META_ALT_ON; - } - + metaState = applyLockedModifiers(metaState); char ch = nativeGetCharacter(mPtr, keyCode, metaState); + int map = COMBINING.get(ch); if (map != 0) { return map; @@ -223,6 +220,34 @@ public class KeyCharacterMap { } /** + * Gets the fallback action to perform if the application does not + * handle the specified key. + * <p> + * When an application does not handle a particular key, the system may + * translate the key to an alternate fallback key (specified in the + * fallback action) and dispatch it to the application. + * The event containing the fallback key is flagged + * with {@link KeyEvent#FLAG_FALLBACK}. + * </p> + * + * @param keyCode The key code. + * @param metaState The meta key modifier state. + * @param outFallbackAction The fallback action object to populate. + * @return True if a fallback action was found, false otherwise. + * + * @hide + */ + public boolean getFallbackAction(int keyCode, int metaState, + FallbackAction outFallbackAction) { + if (outFallbackAction == null) { + throw new IllegalArgumentException("fallbackAction must not be null"); + } + + metaState = applyLockedModifiers(metaState); + return nativeGetFallbackAction(mPtr, keyCode, metaState, outFallbackAction); + } + + /** * Gets the number or symbol associated with the key. * <p> * The character value is returned, not the numeric value. @@ -277,6 +302,8 @@ public class KeyCharacterMap { if (chars == null) { throw new IllegalArgumentException("chars must not be null."); } + + metaState = applyLockedModifiers(metaState); return nativeGetMatch(mPtr, keyCode, chars, metaState); } @@ -509,6 +536,16 @@ public class KeyCharacterMap { return ret; } + private static int applyLockedModifiers(int metaState) { + if ((metaState & MetaKeyKeyListener.META_CAP_LOCKED) != 0) { + metaState |= KeyEvent.META_CAPS_LOCK_ON; + } + if ((metaState & MetaKeyKeyListener.META_ALT_LOCKED) != 0) { + metaState |= KeyEvent.META_ALT_ON; + } + return metaState; + } + /** * Maps Unicode combining diacritical to display-form dead key * (display character shifted left 16 bits). @@ -670,4 +707,14 @@ public class KeyCharacterMap { super(msg); } } + + /** + * Specifies a substitute key code and meta state as a fallback action + * for an unhandled key. + * @hide + */ + public static final class FallbackAction { + public int keyCode; + public int metaState; + } } diff --git a/core/java/android/view/KeyEvent.java b/core/java/android/view/KeyEvent.java index 03407a3..43b77e6 100755 --- a/core/java/android/view/KeyEvent.java +++ b/core/java/android/view/KeyEvent.java @@ -529,15 +529,17 @@ public class KeyEvent extends InputEvent implements Parcelable { /** Key code constant: Blue "programmable" key. * On TV remotes, acts as a contextual/programmable key. */ public static final int KEYCODE_PROG_BLUE = 186; + /** Key code constant: App switch key. + * Should bring up the application switcher dialog. */ + public static final int KEYCODE_APP_SWITCH = 187; - private static final int LAST_KEYCODE = KEYCODE_PROG_BLUE; + private static final int LAST_KEYCODE = KEYCODE_APP_SWITCH; // NOTE: If you add a new keycode here you must also add it to: // isSystem() // native/include/android/keycodes.h // frameworks/base/include/ui/KeycodeLabels.h // external/webkit/WebKit/android/plugins/ANPKeyCodes.h - // tools/puppet_master/PuppetMaster/nav_keys.py // frameworks/base/core/res/res/values/attrs.xml // emulator? // @@ -737,6 +739,7 @@ public class KeyEvent extends InputEvent implements Parcelable { "KEYCODE_PROG_GREEN", "KEYCODE_PROG_YELLOW", "KEYCODE_PROG_BLUE", + "KEYCODE_APP_SWITCH", }; // Symbolic names of all metakeys in bit order from least significant to most significant. @@ -1056,7 +1059,17 @@ public class KeyEvent extends InputEvent implements Parcelable { * the tracking to be canceled. */ public static final int FLAG_TRACKING = 0x200; - + + /** + * Set when a key event has been synthesized to implement default behavior + * for an event that the application did not handle. + * Fallback key events are generated by unhandled trackball motions + * (to emulate a directional keypad) and by certain unhandled key presses + * that are declared in the key map (such as special function numeric keypad + * keys when numlock is off). + */ + public static final int FLAG_FALLBACK = 0x400; + /** * Private control to determine when an app is tracking a key sequence. * @hide diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1f5bb5d..ad96686 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -556,7 +556,7 @@ import java.util.WeakHashMap; * improve the security of views that provide access to sensitive functionality. * </p><p> * To enable touch filtering, call {@link #setFilterTouchesWhenObscured} or set the - * andoird:filterTouchesWhenObscured attribute to true. When enabled, the framework + * android:filterTouchesWhenObscured layout attribute to true. When enabled, the framework * will discard touches that are received whenever the view's window is obscured by * another visible window. As a result, the view will not receive touches whenever a * toast, dialog or other window appears above the view's window. diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 53cff91..9bda637 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -2310,21 +2310,23 @@ public final class ViewRoot extends Handler implements ViewParent, } final int action = event.getAction(); - final int metastate = event.getMetaState(); + final int metaState = event.getMetaState(); switch (action) { case MotionEvent.ACTION_DOWN: x.reset(2); y.reset(2); deliverKeyEvent(new KeyEvent(curTime, curTime, - KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, - 0, metastate), false); + KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState, + KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK, + InputDevice.SOURCE_KEYBOARD), false); break; case MotionEvent.ACTION_UP: x.reset(2); y.reset(2); deliverKeyEvent(new KeyEvent(curTime, curTime, - KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, - 0, metastate), false); + KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER, 0, metaState, + KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK, + InputDevice.SOURCE_KEYBOARD), false); break; } @@ -2374,9 +2376,11 @@ public final class ViewRoot extends Handler implements ViewParent, if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: " + keycode); movement--; + int repeatCount = accelMovement - movement; deliverKeyEvent(new KeyEvent(curTime, curTime, - KeyEvent.ACTION_MULTIPLE, keycode, - accelMovement-movement, metastate), false); + KeyEvent.ACTION_MULTIPLE, keycode, repeatCount, metaState, + KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK, + InputDevice.SOURCE_KEYBOARD), false); } while (movement > 0) { if (DEBUG_TRACKBALL) Log.v("foo", "Delivering fake DPAD: " @@ -2384,10 +2388,14 @@ public final class ViewRoot extends Handler implements ViewParent, movement--; curTime = SystemClock.uptimeMillis(); deliverKeyEvent(new KeyEvent(curTime, curTime, - KeyEvent.ACTION_DOWN, keycode, 0, event.getMetaState()), false); + KeyEvent.ACTION_DOWN, keycode, 0, metaState, + KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK, + InputDevice.SOURCE_KEYBOARD), false); deliverKeyEvent(new KeyEvent(curTime, curTime, - KeyEvent.ACTION_UP, keycode, 0, metastate), false); - } + KeyEvent.ACTION_UP, keycode, 0, metaState, + KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_FALLBACK, + InputDevice.SOURCE_KEYBOARD), false); + } mLastTrackballTime = curTime; } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index af36d80..3479bf5 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -587,9 +587,10 @@ public interface WindowManagerPolicy { * event will normally go. * @param event The key event. * @param policyFlags The policy flags associated with the key. - * @return Returns true if the policy consumed the event. + * @return Returns an alternate key event to redispatch as a fallback, or null to give up. + * The caller is responsible for recycling the key event. */ - public boolean dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags); + public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags); /** * Called when layout of the windows is about to start. diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index 261992b..4e5bc6e 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -28,7 +28,7 @@ import android.text.format.DateUtils; import android.util.AttributeSet; import android.util.SparseArray; import android.view.LayoutInflater; -import android.widget.NumberPicker.OnChangedListener; +import android.widget.NumberPicker.OnChangeListener; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -97,8 +97,8 @@ public class DatePicker extends FrameLayout { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.date_picker, this, true); - OnChangedListener onChangeListener = new OnChangedListener() { - public void onChanged(NumberPicker picker, int oldVal, int newVal) { + OnChangeListener onChangeListener = new OnChangeListener() { + public void onChange(NumberPicker picker, int oldVal, int newVal) { notifyDateChanged(); updateMiniMonth(); } @@ -107,18 +107,18 @@ public class DatePicker extends FrameLayout { // day mDayPicker = (NumberPicker) findViewById(R.id.day); mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); - mDayPicker.setSpeed(100); + mDayPicker.setOnLongPressUpdateInterval(100); mDayPicker.setOnChangeListener(onChangeListener); // month mMonthPicker = (NumberPicker) findViewById(R.id.month); mMonthPicker.setRange(0, mNumberOfMonths - 1, getShortMonths()); - mMonthPicker.setSpeed(200); + mMonthPicker.setOnLongPressUpdateInterval(200); mMonthPicker.setOnChangeListener(onChangeListener); // year mYearPicker = (NumberPicker) findViewById(R.id.year); - mYearPicker.setSpeed(100); + mYearPicker.setOnLongPressUpdateInterval(100); mYearPicker.setOnChangeListener(onChangeListener); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker); int mStartYear = a.getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR); diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index bdd2e2c..805bc08 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -50,10 +50,18 @@ import android.view.animation.OvershootInterpolator; import android.view.inputmethod.InputMethodManager; /** - * A view for selecting a number For a dialog using this view, see - * {@link android.app.TimePickerDialog}. - * - * @hide + * A widget that enables the user to select a number form a predefined range. + * The widget presents an input filed and up and down buttons for selecting the + * current value. Pressing/long pressing the up and down buttons increments and + * decrements the current value respectively. Touching the input filed shows a + * scroll wheel, tapping on which while shown and not moving allows direct edit + * of the current value. Sliding motions up or down hide the buttons and the + * input filed, show the scroll wheel, and rotate the latter. Flinging is + * also supported. The widget enables mapping from positions to strings such + * that instead the position index the corresponding string is displayed. + * <p> + * For an example of using this widget, see {@link android.widget.TimePicker}. + * </p> */ @Widget public class NumberPicker extends LinearLayout { @@ -166,7 +174,7 @@ public class NumberPicker extends LinearLayout { /** * Listener to be notified upon current value change. */ - private OnChangedListener mOnChangedListener; + private OnChangeListener mOnChangeListener; /** * Listener to be notified upon scroll state change. @@ -181,7 +189,7 @@ public class NumberPicker extends LinearLayout { /** * The speed for updating the value form long press. */ - private long mLongPressUpdateSpeed = 300; + private long mLongPressUpdateInterval = 300; /** * Cache for the string representation of selector indices. @@ -320,13 +328,15 @@ public class NumberPicker extends LinearLayout { /** * The callback interface used to indicate the number value has changed. */ - public interface OnChangedListener { + public interface OnChangeListener { /** + * Called upon a change of the current value. + * * @param picker The NumberPicker associated with this listener. * @param oldVal The previous value. * @param newVal The new value. */ - void onChanged(NumberPicker picker, int oldVal, int newVal); + void onChange(NumberPicker picker, int oldVal, int newVal); } /** @@ -356,18 +366,34 @@ public class NumberPicker extends LinearLayout { * @param scrollState The current scroll state. One of {@link #SCROLL_STATE_IDLE}, * {@link #SCROLL_STATE_TOUCH_SCROLL} or {@link #SCROLL_STATE_IDLE}. */ - public void onScrollStateChanged(NumberPicker view, int scrollState); + public void onScrollStateChange(NumberPicker view, int scrollState); } /** - * Interface used to format the number into a string for presentation + * Interface used to format the number into a string for presentation. */ public interface Formatter { - String toString(int value); + + /** + * Formats a string representation of the current index. + * + * @param value The currently selected value. + * @return A formatted string representation. + */ + public String toString(int value); } /** - * Create a new number picker + * Create a new number picker. + * + * @param context The application environment. + */ + public NumberPicker(Context context) { + this(context, null); + } + + /** + * Create a new number picker. * * @param context The application environment. * @param attrs A collection of attributes. @@ -735,17 +761,22 @@ public class NumberPicker extends LinearLayout { } } + @Override + public int getSolidColor() { + return mSolidColor; + } + /** - * Set the callback that indicates the number has been adjusted by the user. + * Sets the listener to be notified on change of the current value. * - * @param onChangeListener the callback, should not be null. + * @param onChangeListener The listener. */ - public void setOnChangeListener(OnChangedListener onChangeListener) { - mOnChangedListener = onChangeListener; + public void setOnChangeListener(OnChangeListener onChangeListener) { + mOnChangeListener = onChangeListener; } /** - * Set the callback that in notified for scroll state changes. + * Set listener to be notified for scroll state changes. * * @param onScrollListener the callback, should not be null. */ @@ -754,10 +785,16 @@ public class NumberPicker extends LinearLayout { } /** - * Set the formatter that will be used to format the number for presentation + * Set the formatter to be used for formatting the current value. + * <p> + * Note: If you have provided alternative values for the selected positons + * this formatter is never invoked. + * </p> * * @param formatter the formatter object. If formatter is null, - * String.valueOf() will be used + * String.valueOf() will be used. + * + * @see #setRange(int, int, String[]) */ public void setFormatter(Formatter formatter) { mFormatter = formatter; @@ -777,11 +814,11 @@ public class NumberPicker extends LinearLayout { /** * Set the range of numbers allowed for the number picker. The current value * will be automatically set to the start. Also provide a mapping for values - * used to display to the user. + * used to display to the user instead of the numbers in the range. * - * @param start the start of the range (inclusive) - * @param end the end of the range (inclusive) - * @param displayedValues the values displayed to the user. + * @param start The start of the range (inclusive). + * @param end The end of the range (inclusive). + * @param displayedValues The values displayed to the user. */ public void setRange(int start, int end, String[] displayedValues) { boolean wrapSelector = (end - start) >= mSelectorIndices.length; @@ -792,12 +829,20 @@ public class NumberPicker extends LinearLayout { * Set the range of numbers allowed for the number picker. The current value * will be automatically set to the start. Also provide a mapping for values * used to display to the user. + * <p> + * Note: The <code>wrapSelectorWheel</code> argument is ignored if the range + * (difference between <code>start</code> and <code>end</code>) us less than + * five since this is the number of values shown by the selector wheel. + * </p> * * @param start the start of the range (inclusive) * @param end the end of the range (inclusive) * @param displayedValues the values displayed to the user. + * @param wrapSelectorWheel Whether to wrap the selector wheel. + * + * @see #setWrapSelectorWheel(boolean) */ - public void setRange(int start, int end, String[] displayedValues, boolean wrapSelector) { + public void setRange(int start, int end, String[] displayedValues, boolean wrapSelectorWheel) { if (start < 0 || end < 0) { throw new IllegalArgumentException("start and end must be > 0"); } @@ -807,7 +852,7 @@ public class NumberPicker extends LinearLayout { mEnd = end; mCurrent = start; - setWrapSelector(wrapSelector); + setWrapSelectorWheel(wrapSelectorWheel); updateInputTextView(); if (displayedValues != null) { @@ -826,8 +871,9 @@ public class NumberPicker extends LinearLayout { * Set the current value for the number picker. * * @param current the current value the start of the range (inclusive) + * * @throws IllegalArgumentException when current is not within the range of - * of the number picker + * of the number picker. */ public void setCurrent(int current) { if (current < mStart || current > mEnd) { @@ -839,12 +885,14 @@ public class NumberPicker extends LinearLayout { } /** - * Sets whether the selector shown during flinging/scrolling should wrap - * around the beginning and end values. + * Sets whether the selector wheel shown during flinging/scrolling should wrap + * around the beginning and end values. By default if the range is more than + * five (the number of items shown on the selector wheel) the selector wheel + * wrapping is enabled. * * @param wrapSelector Whether to wrap. */ - public void setWrapSelector(boolean wrapSelector) { + public void setWrapSelectorWheel(boolean wrapSelector) { if (wrapSelector && (mEnd - mStart) < mSelectorIndices.length) { throw new IllegalStateException("Range less than selector items count."); } @@ -856,18 +904,18 @@ public class NumberPicker extends LinearLayout { } /** - * Sets the speed at which the numbers will scroll when the +/- buttons are - * longpressed + * Sets the speed at which the numbers be incremented and decremented when + * the up and down buttons are long pressed respectively. * - * @param speed The speed (in milliseconds) at which the numbers will scroll - * default 300ms + * @param intervalMillis The speed (in milliseconds) at which the numbers + * will be incremented and decremented (default 300ms). */ - public void setSpeed(long speed) { - mLongPressUpdateSpeed = speed; + public void setOnLongPressUpdateInterval(long intervalMillis) { + mLongPressUpdateInterval = intervalMillis; } /** - * Returns the current value of the NumberPicker + * Returns the current value of the NumberPicker. * * @return the current value. */ @@ -875,9 +923,22 @@ public class NumberPicker extends LinearLayout { return mCurrent; } - @Override - public int getSolidColor() { - return mSolidColor; + /** + * Returns the range lower value of the NumberPicker. + * + * @return The lower number of the range. + */ + public int getRangeStart() { + return mStart; + } + + /** + * Returns the range end value of the NumberPicker. + * + * @return The upper number of the range. + */ + public int getRangeEnd() { + return mEnd; } @Override @@ -950,24 +1011,6 @@ public class NumberPicker extends LinearLayout { } /** - * Returns the upper value of the range of the NumberPicker - * - * @return the uppper number of the range. - */ - protected int getEndRange() { - return mEnd; - } - - /** - * Returns the lower value of the range of the NumberPicker - * - * @return the lower number of the range. - */ - protected int getBeginRange() { - return mStart; - } - - /** * Sets the current value of this NumberPicker, and sets mPrevious to the * previous value. If current is greater than mEnd less than mStart, the * value of mCurrent is wrapped around. Subclasses can override this to @@ -1038,7 +1081,7 @@ public class NumberPicker extends LinearLayout { private void tryNotifyScrollListener(int scrollState) { if (mOnScrollListener != null && mScrollState != scrollState) { mScrollState = scrollState; - mOnScrollListener.onScrollStateChanged(this, scrollState); + mOnScrollListener.onScrollStateChange(this, scrollState); } } @@ -1238,8 +1281,8 @@ public class NumberPicker extends LinearLayout { * NumberPicker. */ private void notifyChange(int previous, int current) { - if (mOnChangedListener != null) { - mOnChangedListener.onChanged(this, previous, mCurrent); + if (mOnChangeListener != null) { + mOnChangeListener.onChange(this, previous, mCurrent); } } @@ -1439,7 +1482,7 @@ public class NumberPicker extends LinearLayout { public void run() { changeCurrent(mCurrent + mUpdateStep); - postDelayed(this, mLongPressUpdateSpeed); + postDelayed(this, mLongPressUpdateInterval); } } } diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index e66eb8d..203b637 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -25,7 +25,7 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; -import android.widget.NumberPicker.OnChangedListener; +import android.widget.NumberPicker.OnChangeListener; import java.text.DateFormatSymbols; import java.util.Calendar; @@ -110,8 +110,8 @@ public class TimePicker extends FrameLayout { // hour mHourPicker = (NumberPicker) findViewById(R.id.hour); - mHourPicker.setOnChangeListener(new NumberPicker.OnChangedListener() { - public void onChanged(NumberPicker spinner, int oldVal, int newVal) { + mHourPicker.setOnChangeListener(new NumberPicker.OnChangeListener() { + public void onChange(NumberPicker spinner, int oldVal, int newVal) { mCurrentHour = newVal; if (!mIs24HourView) { // adjust from [1-12] to [0-11] internally, with the times @@ -135,10 +135,10 @@ public class TimePicker extends FrameLayout { // digits of minute mMinutePicker = (NumberPicker) findViewById(R.id.minute); mMinutePicker.setRange(0, 59); - mMinutePicker.setSpeed(100); + mMinutePicker.setOnLongPressUpdateInterval(100); mMinutePicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER); - mMinutePicker.setOnChangeListener(new NumberPicker.OnChangedListener() { - public void onChanged(NumberPicker spinner, int oldVal, int newVal) { + mMinutePicker.setOnChangeListener(new NumberPicker.OnChangeListener() { + public void onChange(NumberPicker spinner, int oldVal, int newVal) { mCurrentMinute = newVal; onTimeChanged(); } @@ -146,8 +146,8 @@ public class TimePicker extends FrameLayout { // am/pm mAmPmPicker = (NumberPicker) findViewById(R.id.amPm); - mAmPmPicker.setOnChangeListener(new OnChangedListener() { - public void onChanged(NumberPicker picker, int oldVal, int newVal) { + mAmPmPicker.setOnChangeListener(new OnChangeListener() { + public void onChange(NumberPicker picker, int oldVal, int newVal) { picker.requestFocus(); if (mIsAm) { // Currently AM switching to PM diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java index ce7ab84..3e19811 100644 --- a/core/java/com/android/internal/app/ActionBarImpl.java +++ b/core/java/com/android/internal/app/ActionBarImpl.java @@ -23,9 +23,9 @@ import com.android.internal.widget.ActionBarContextView; import com.android.internal.widget.ActionBarView; import android.animation.Animator; -import android.animation.ObjectAnimator; import android.animation.Animator.AnimatorListener; import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.app.ActionBar; import android.app.Activity; import android.app.Dialog; @@ -40,10 +40,10 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.Window; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.SpinnerAdapter; -import android.widget.ViewAnimator; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -67,6 +67,7 @@ public class ActionBarImpl extends ActionBar { private ActionBarView mActionView; private ActionBarContextView mUpperContextView; private LinearLayout mLowerContextView; + private View mContentView; private ArrayList<TabImpl> mTabs = new ArrayList<TabImpl>(); @@ -88,7 +89,7 @@ public class ActionBarImpl extends ActionBar { final Handler mHandler = new Handler(); - private Animator mCurrentAnimation; + private Animator mCurrentAnim; final AnimatorListener[] mAfterAnimation = new AnimatorListener[] { new AnimatorListener() { // NORMAL_VIEW @@ -101,7 +102,7 @@ public class ActionBarImpl extends ActionBar { if (mLowerContextView != null) { mLowerContextView.removeAllViews(); } - mCurrentAnimation = null; + mCurrentAnim = null; hideAllExcept(NORMAL_VIEW); } @@ -120,7 +121,7 @@ public class ActionBarImpl extends ActionBar { @Override public void onAnimationEnd(Animator animation) { - mCurrentAnimation = null; + mCurrentAnim = null; hideAllExcept(CONTEXT_VIEW); } @@ -134,9 +135,56 @@ public class ActionBarImpl extends ActionBar { } }; + final AnimatorListener mHideListener = new AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mContentView != null) { + mContentView.setTranslationY(0); + } + mContainerView.setVisibility(View.GONE); + mCurrentAnim = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }; + + final AnimatorListener mShowListener = new AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + mCurrentAnim = null; + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + }; + public ActionBarImpl(Activity activity) { mActivity = activity; - init(activity.getWindow().getDecorView()); + Window window = activity.getWindow(); + View decor = window.getDecorView(); + init(decor); + if (!mActivity.getWindow().hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) { + mContentView = decor.findViewById(android.R.id.content); + } } public ActionBarImpl(Dialog dialog) { @@ -444,14 +492,45 @@ public class ActionBarImpl extends ActionBar { @Override public void show() { - // TODO animate! + if (mCurrentAnim != null) { + mCurrentAnim.end(); + } + if (mContainerView.getVisibility() == View.VISIBLE) { + return; + } mContainerView.setVisibility(View.VISIBLE); + mContainerView.setAlpha(0); + mContainerView.setTranslationY(-mContainerView.getHeight()); + AnimatorSet anim = new AnimatorSet(); + AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "translationY", 0)) + .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); + if (mContentView != null) { + b.with(ObjectAnimator.ofFloat(mContentView, "translationY", -mContainerView.getHeight(), 0)); + } + anim.addListener(mShowListener); + mCurrentAnim = anim; + anim.start(); } @Override public void hide() { - // TODO animate! - mContainerView.setVisibility(View.GONE); + if (mCurrentAnim != null) { + mCurrentAnim.end(); + } + if (mContainerView.getVisibility() == View.GONE) { + return; + } + mContainerView.setAlpha(1); + AnimatorSet anim = new AnimatorSet(); + AnimatorSet.Builder b = anim.play( + ObjectAnimator.ofFloat(mContainerView, "translationY", -mContainerView.getHeight())) + .with(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); + if (mContentView != null) { + b.with(ObjectAnimator.ofFloat(mContentView, "translationY", 0, -mContainerView.getHeight())); + } + anim.addListener(mHideListener); + mCurrentAnim = anim; + anim.start(); } public boolean isShowing() { @@ -459,10 +538,7 @@ public class ActionBarImpl extends ActionBar { } private long animateTo(int viewIndex) { - // Don't wait for the current animation to finish. - if (mCurrentAnimation != null) { - mCurrentAnimation.end(); - } + show(); AnimatorSet set = new AnimatorSet(); @@ -492,7 +568,7 @@ public class ActionBarImpl extends ActionBar { set.addListener(mAfterAnimation[viewIndex]); - mCurrentAnimation = set; + mCurrentAnim = set; set.start(); return set.getDuration(); } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 848bf9e..dea53bf 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -557,8 +557,6 @@ public class ZygoteInit { public static void main(String argv[]) { try { - VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024); - // Start profiling the zygote initialization. SamplingProfilerIntegration.start(); diff --git a/core/jni/Android.mk b/core/jni/Android.mk index bcd7bae..8eeed3d 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -51,11 +51,11 @@ LOCAL_SRC_FILES:= \ android_view_InputChannel.cpp \ android_view_InputQueue.cpp \ android_view_KeyEvent.cpp \ + android_view_KeyCharacterMap.cpp \ android_view_GLES20Canvas.cpp \ android_view_MotionEvent.cpp \ android_text_AndroidCharacter.cpp \ android_text_AndroidBidi.cpp \ - android_text_KeyCharacterMap.cpp \ android_os_Debug.cpp \ android_os_FileUtils.cpp \ android_os_MemoryFile.cpp \ diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index e50233e..a21f0ab 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -576,6 +576,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) char dexoptFlagsBuf[PROPERTY_VALUE_MAX]; char enableAssertBuf[sizeof("-ea:")-1 + PROPERTY_VALUE_MAX]; char jniOptsBuf[sizeof("-Xjniopts:")-1 + PROPERTY_VALUE_MAX]; + char heapstartsizeOptsBuf[sizeof("-Xms")-1 + PROPERTY_VALUE_MAX]; char heapsizeOptsBuf[sizeof("-Xmx")-1 + PROPERTY_VALUE_MAX]; char extraOptsBuf[PROPERTY_VALUE_MAX]; char* stackTraceFile = NULL; @@ -650,6 +651,11 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) mOptions.add(opt); //options[curOpt++].optionString = "-verbose:class"; + strcpy(heapstartsizeOptsBuf, "-Xms"); + property_get("dalvik.vm.heapstartsize", heapstartsizeOptsBuf+4, "2m"); + opt.optionString = heapstartsizeOptsBuf; + mOptions.add(opt); + strcpy(heapsizeOptsBuf, "-Xmx"); property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m"); //LOGI("Heap size: %s", heapsizeOptsBuf); diff --git a/core/jni/android_text_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp index a7e62c1..bfeec4f 100644 --- a/core/jni/android_text_KeyCharacterMap.cpp +++ b/core/jni/android_view_KeyCharacterMap.cpp @@ -29,6 +29,14 @@ static struct { jclass clazz; } gKeyEventClassInfo; +static struct { + jclass clazz; + + jfieldID keyCode; + jfieldID metaState; +} gFallbackActionClassInfo; + + static jint nativeLoad(JNIEnv *env, jobject clazz, jint deviceId) { KeyCharacterMap* map; status_t status = KeyCharacterMap::loadByDeviceId(deviceId, &map); @@ -54,6 +62,21 @@ static jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jint ptr, return map->getCharacter(keyCode, metaState); } +static jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, + jint metaState, jobject fallbackActionObj) { + KeyCharacterMap* map = reinterpret_cast<KeyCharacterMap*>(ptr); + KeyCharacterMap::FallbackAction fallbackAction; + + bool result = map->getFallbackAction(keyCode, metaState, &fallbackAction); + if (result) { + env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.keyCode, + fallbackAction.keyCode); + env->SetIntField(fallbackActionObj, gFallbackActionClassInfo.metaState, + fallbackAction.metaState); + } + return result; +} + static jchar nativeGetNumber(JNIEnv *env, jobject clazz, jint ptr, jint keyCode) { KeyCharacterMap* map = reinterpret_cast<KeyCharacterMap*>(ptr); return map->getNumber(keyCode); @@ -126,6 +149,8 @@ static JNINativeMethod g_methods[] = { (void*)nativeDispose }, { "nativeGetCharacter", "(III)C", (void*)nativeGetCharacter }, + { "nativeGetFallbackAction", "(IIILandroid/view/KeyCharacterMap$FallbackAction;)Z", + (void*)nativeGetFallbackAction }, { "nativeGetNumber", "(II)C", (void*)nativeGetNumber }, { "nativeGetMatch", "(II[CI)C", @@ -143,10 +168,22 @@ static JNINativeMethod g_methods[] = { LOG_FATAL_IF(! var, "Unable to find class " className); \ var = jclass(env->NewGlobalRef(var)); +#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \ + var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \ + LOG_FATAL_IF(! var, "Unable to find field " fieldName); + int register_android_text_KeyCharacterMap(JNIEnv* env) { FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); + FIND_CLASS(gFallbackActionClassInfo.clazz, "android/view/KeyCharacterMap$FallbackAction"); + + GET_FIELD_ID(gFallbackActionClassInfo.keyCode, gFallbackActionClassInfo.clazz, + "keyCode", "I"); + + GET_FIELD_ID(gFallbackActionClassInfo.metaState, gFallbackActionClassInfo.clazz, + "metaState", "I"); + return AndroidRuntime::registerNativeMethods(env, "android/view/KeyCharacterMap", g_methods, NELEM(g_methods)); } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 81191ff..4bd91b3 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1267,6 +1267,7 @@ <enum name="KEYCODE_PROG_GREEN" value="184" /> <enum name="KEYCODE_PROG_YELLOW" value="185" /> <enum name="KEYCODE_PROG_BLUE" value="186" /> + <enum name="KEYCODE_APP_SWITCH" value="187" /> </attr> <!-- ***************************************************************** --> diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm index 24b485d..14d7c80 100644 --- a/data/keyboards/Generic.kcm +++ b/data/keyboards/Generic.kcm @@ -42,7 +42,9 @@ key C { label: 'C' base: 'c' shift, capslock: 'C' - ctrl, alt, meta: none + alt: '\u00e7' + shift+alt: '\u00c7' + ctrl, meta: none } key D { @@ -56,7 +58,8 @@ key E { label: 'E' base: 'e' shift, capslock: 'E' - ctrl, alt, meta: none + alt: '\u0301' + ctrl, meta: none } key F { @@ -84,7 +87,8 @@ key I { label: 'I' base: 'i' shift, capslock: 'I' - ctrl, alt, meta: none + alt: '\u0302' + ctrl, meta: none } key J { @@ -119,7 +123,8 @@ key N { label: 'N' base: 'n' shift, capslock: 'N' - ctrl, alt, meta: none + alt: '\u0303' + ctrl, meta: none } key O { @@ -154,7 +159,8 @@ key S { label: 'S' base: 's' shift, capslock: 'S' - ctrl, alt, meta: none + alt: '\u00df' + ctrl, meta: none } key T { @@ -168,7 +174,8 @@ key U { label: 'U' base: 'u' shift, capslock: 'U' - ctrl, alt, meta: none + alt: '\u0308' + ctrl, meta: none } key V { @@ -253,6 +260,7 @@ key 6 { base: '6' shift: '^' ctrl, alt, meta: none + alt+shift: '\u0302' } key 7 { @@ -279,7 +287,8 @@ key 9 { key SPACE { label: ' ' base: ' ' - ctrl, alt, meta: none + ctrl, alt: none + meta: fallback SEARCH } key ENTER { @@ -291,7 +300,8 @@ key ENTER { key TAB { label: '\t' base: '\t' - ctrl, alt, meta: none + ctrl, alt: none + meta: fallback APP_SWITCH } key COMMA { @@ -319,7 +329,9 @@ key GRAVE { label, number: '`' base: '`' shift: '~' - ctrl, alt, meta: none + alt: '\u0300' + alt+shift: '\u0303' + ctrl, meta: none } key MINUS { @@ -525,3 +537,11 @@ key PLUS { label, number: '+' base: '+' } + +### Non-printing keys ### + +key ESCAPE { + base: fallback BACK + meta: fallback HOME + alt: fallback MENU +} diff --git a/data/keyboards/Vendor_05ac_Product_0239.kl b/data/keyboards/Vendor_05ac_Product_0239.kl index 5234d58..6bd3753 100644 --- a/data/keyboards/Vendor_05ac_Product_0239.kl +++ b/data/keyboards/Vendor_05ac_Product_0239.kl @@ -104,7 +104,7 @@ key 111 FORWARD_DEL key 113 VOLUME_MUTE key 114 VOLUME_DOWN key 115 VOLUME_UP -# key 120 switch applications +key 120 APP_SWITCH key 125 META_LEFT key 126 META_RIGHT key 161 MEDIA_EJECT diff --git a/data/keyboards/Vendor_22b8_Product_093d.kl b/data/keyboards/Vendor_22b8_Product_093d.kl index 87b3c32..2749c5b 100644 --- a/data/keyboards/Vendor_22b8_Product_093d.kl +++ b/data/keyboards/Vendor_22b8_Product_093d.kl @@ -12,6 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +# +# Motorola Bluetooth Wireless Keyboard. +# + key 1 BACK key 2 1 key 3 2 diff --git a/data/keyboards/Virtual.kcm b/data/keyboards/Virtual.kcm index 8d3c7ac..0ce4a68 100644 --- a/data/keyboards/Virtual.kcm +++ b/data/keyboards/Virtual.kcm @@ -39,7 +39,9 @@ key C { label: 'C' base: 'c' shift, capslock: 'C' - ctrl, alt, meta: none + alt: '\u00e7' + shift+alt: '\u00c7' + ctrl, meta: none } key D { @@ -53,7 +55,8 @@ key E { label: 'E' base: 'e' shift, capslock: 'E' - ctrl, alt, meta: none + alt: '\u0301' + ctrl, meta: none } key F { @@ -81,7 +84,8 @@ key I { label: 'I' base: 'i' shift, capslock: 'I' - ctrl, alt, meta: none + alt: '\u0302' + ctrl, meta: none } key J { @@ -116,7 +120,8 @@ key N { label: 'N' base: 'n' shift, capslock: 'N' - ctrl, alt, meta: none + alt: '\u0303' + ctrl, meta: none } key O { @@ -151,7 +156,8 @@ key S { label: 'S' base: 's' shift, capslock: 'S' - ctrl, alt, meta: none + alt: '\u00df' + ctrl, meta: none } key T { @@ -165,7 +171,8 @@ key U { label: 'U' base: 'u' shift, capslock: 'U' - ctrl, alt, meta: none + alt: '\u0308' + ctrl, meta: none } key V { @@ -250,6 +257,7 @@ key 6 { base: '6' shift: '^' ctrl, alt, meta: none + alt+shift: '\u0302' } key 7 { @@ -276,7 +284,8 @@ key 9 { key SPACE { label: ' ' base: ' ' - ctrl, alt, meta: none + ctrl, alt: none + meta: fallback SEARCH } key ENTER { @@ -288,7 +297,8 @@ key ENTER { key TAB { label: '\t' base: '\t' - ctrl, alt, meta: none + ctrl, alt: none + meta: fallback APP_SWITCH } key COMMA { @@ -316,7 +326,9 @@ key GRAVE { label, number: '`' base: '`' shift: '~' - ctrl, alt, meta: none + alt: '\u0300' + alt+shift: '\u0303' + ctrl, meta: none } key MINUS { @@ -522,3 +534,11 @@ key PLUS { label, number: '+' base: '+' } + +### Non-printing keys ### + +key ESCAPE { + base: fallback BACK + meta: fallback HOME + alt: fallback MENU +} diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 8450c3a..66f8f70 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -210,7 +210,6 @@ public class BitmapFactory { * expense of the decoding speed. Currently the field only affects JPEG * decode, in the case of which a more accurate, but slightly slower, * IDCT method will be used instead. - * @hide */ public boolean inPreferQualityOverSpeed; diff --git a/include/ui/GraphicBuffer.h b/include/ui/GraphicBuffer.h index c446633..aa65d93 100644 --- a/include/ui/GraphicBuffer.h +++ b/include/ui/GraphicBuffer.h @@ -91,12 +91,15 @@ public: status_t lock(uint32_t usage, const Rect& rect, void** vaddr); status_t lock(GGLSurface* surface, uint32_t usage); status_t unlock(); - + android_native_buffer_t* getNativeBuffer() const; void setIndex(int index); int getIndex() const; + // for debugging + static void dumpAllocationsToSystemLog(); + private: virtual ~GraphicBuffer(); diff --git a/include/ui/GraphicBufferAllocator.h b/include/ui/GraphicBufferAllocator.h index 54b8236..dffa788 100644 --- a/include/ui/GraphicBufferAllocator.h +++ b/include/ui/GraphicBufferAllocator.h @@ -68,6 +68,7 @@ public: status_t free(buffer_handle_t handle); void dump(String8& res) const; + static void dumpToSystemLog(); private: struct alloc_rec_t { diff --git a/include/ui/InputDispatcher.h b/include/ui/InputDispatcher.h index b621680..7305601 100644 --- a/include/ui/InputDispatcher.h +++ b/include/ui/InputDispatcher.h @@ -306,9 +306,10 @@ public: virtual bool interceptKeyBeforeDispatching(const sp<InputChannel>& inputChannel, const KeyEvent* keyEvent, uint32_t policyFlags) = 0; - /* Allows the policy a chance to perform default processing for an unhandled key. */ + /* Allows the policy a chance to perform default processing for an unhandled key. + * Returns an alternate keycode to redispatch as a fallback, or 0 to give up. */ virtual bool dispatchUnhandledKey(const sp<InputChannel>& inputChannel, - const KeyEvent* keyEvent, uint32_t policyFlags) = 0; + const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) = 0; /* Notifies the policy about switch events. */ @@ -735,6 +736,7 @@ private: CANCEL_ALL_EVENTS = 0, CANCEL_POINTER_EVENTS = 1, CANCEL_NON_POINTER_EVENTS = 2, + CANCEL_FALLBACK_EVENTS = 3, }; InputState(); @@ -771,6 +773,7 @@ private: int32_t source; int32_t keyCode; int32_t scanCode; + int32_t flags; nsecs_t downTime; }; @@ -790,7 +793,10 @@ private: Vector<KeyMemento> mKeyMementos; Vector<MotionMemento> mMotionMementos; - static bool shouldCancelEvent(int32_t eventSource, CancelationOptions options); + static bool shouldCancelKey(const KeyMemento& memento, + CancelationOptions options); + static bool shouldCancelMotion(const MotionMemento& memento, + CancelationOptions options); }; /* Manages the dispatch state associated with a single input channel. */ diff --git a/include/ui/InputReader.h b/include/ui/InputReader.h index 8ec5421..b466ff1 100644 --- a/include/ui/InputReader.h +++ b/include/ui/InputReader.h @@ -402,7 +402,6 @@ private: } mLocked; void initializeLocked(); - void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led); void configureParameters(); void dumpParameters(String8& dump); @@ -414,6 +413,8 @@ private: ssize_t findKeyDownLocked(int32_t scanCode); + void resetLedStateLocked(); + void initializeLedStateLocked(LockedState::LedState& ledState, int32_t led); void updateLedStateLocked(bool reset); void updateLedStateForModifierLocked(LockedState::LedState& ledState, int32_t led, int32_t modifier, bool reset); diff --git a/include/ui/InputTransport.h b/include/ui/InputTransport.h index 7efb6cc..119db81 100644 --- a/include/ui/InputTransport.h +++ b/include/ui/InputTransport.h @@ -256,7 +256,7 @@ public: * Returns WOULD_BLOCK if there is no signal present. * Other errors probably indicate that the channel is broken. */ - status_t receiveFinishedSignal(bool& outHandled); + status_t receiveFinishedSignal(bool* outHandled); private: sp<InputChannel> mChannel; diff --git a/include/ui/KeyCharacterMap.h b/include/ui/KeyCharacterMap.h index a1ccb37..10a3810 100644 --- a/include/ui/KeyCharacterMap.h +++ b/include/ui/KeyCharacterMap.h @@ -44,6 +44,12 @@ public: KEYBOARD_TYPE_SPECIAL_FUNCTION = 5, }; + // Substitute key code and meta state for fallback action. + struct FallbackAction { + int32_t keyCode; + int32_t metaState; + }; + ~KeyCharacterMap(); static status_t load(const String8& filename, KeyCharacterMap** outMap); @@ -67,6 +73,13 @@ public: */ char16_t getCharacter(int32_t keyCode, int32_t metaState) const; + /* Gets the fallback action to use by default if the application does not + * handle the specified key. + * Returns true if an action was available, false if none. + */ + bool getFallbackAction(int32_t keyCode, int32_t metaState, + FallbackAction* outFallbackAction) const; + /* Gets the first matching Unicode character that can be generated by the key, * preferring the one with the specified meta key modifiers. * Returns 0 if no matching character is generated. @@ -155,6 +168,10 @@ private: KeyCharacterMap(); + bool getKey(int32_t keyCode, const Key** outKey) const; + bool getKeyBehavior(int32_t keyCode, int32_t metaState, + const Key** outKey, const Behavior** outBehavior) const; + bool findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const; static void addKey(Vector<KeyEvent>& outEvents, diff --git a/include/ui/KeycodeLabels.h b/include/ui/KeycodeLabels.h index be7db1f..9b1a897 100755 --- a/include/ui/KeycodeLabels.h +++ b/include/ui/KeycodeLabels.h @@ -211,6 +211,7 @@ static const KeycodeLabel KEYCODES[] = { { "PROG_GREEN", 184 }, { "PROG_YELLOW", 185 }, { "PROG_BLUE", 186 }, + { "APP_SWITCH", 187 }, // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/libs/ui/GraphicBuffer.cpp b/libs/ui/GraphicBuffer.cpp index 436e064..97312a6 100644 --- a/libs/ui/GraphicBuffer.cpp +++ b/libs/ui/GraphicBuffer.cpp @@ -114,6 +114,11 @@ status_t GraphicBuffer::initCheck() const { return mInitCheck; } +void GraphicBuffer::dumpAllocationsToSystemLog() +{ + GraphicBufferAllocator::dumpToSystemLog(); +} + android_native_buffer_t* GraphicBuffer::getNativeBuffer() const { return static_cast<android_native_buffer_t*>( diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp index d51664d..fa46ab7 100644 --- a/libs/ui/GraphicBufferAllocator.cpp +++ b/libs/ui/GraphicBufferAllocator.cpp @@ -73,6 +73,13 @@ void GraphicBufferAllocator::dump(String8& result) const result.append(buffer); } +void GraphicBufferAllocator::dumpToSystemLog() +{ + String8 s; + GraphicBufferAllocator::getInstance().dump(s); + LOGD("%s", s.string()); +} + status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat format, int usage, buffer_handle_t* handle, int32_t* stride) { @@ -104,10 +111,6 @@ status_t GraphicBufferAllocator::alloc(uint32_t w, uint32_t h, PixelFormat forma rec.usage = usage; rec.size = h * stride[0] * bytesPerPixel(format); list.add(*handle, rec); - } else { - String8 s; - dump(s); - LOGD("%s", s.string()); } return err; diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp index f1223f1..1f6a920 100644 --- a/libs/ui/InputDispatcher.cpp +++ b/libs/ui/InputDispatcher.cpp @@ -1884,7 +1884,7 @@ int InputDispatcher::handleReceiveCallback(int receiveFd, int events, void* data } bool handled = false; - status_t status = connection->inputPublisher.receiveFinishedSignal(handled); + status_t status = connection->inputPublisher.receiveFinishedSignal(&handled); if (status) { LOGE("channel '%s' ~ Failed to receive finished signal. status=%d", connection->getInputChannelName(), status); @@ -3039,21 +3039,57 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible( sp<Connection> connection = commandEntry->connection; bool handled = commandEntry->handled; - if (!handled && !connection->outboundQueue.isEmpty()) { + if (!connection->outboundQueue.isEmpty()) { DispatchEntry* dispatchEntry = connection->outboundQueue.headSentinel.next; if (dispatchEntry->inProgress && dispatchEntry->hasForegroundTarget() && dispatchEntry->eventEntry->type == EventEntry::TYPE_KEY) { KeyEntry* keyEntry = static_cast<KeyEntry*>(dispatchEntry->eventEntry); - KeyEvent event; - initializeKeyEvent(&event, keyEntry); - - mLock.unlock(); - - mPolicy->dispatchUnhandledKey(connection->inputChannel, - &event, keyEntry->policyFlags); - - mLock.lock(); + if (!(keyEntry->flags & AKEY_EVENT_FLAG_FALLBACK)) { + if (handled) { + // If the application handled a non-fallback key, then immediately + // cancel all fallback keys previously dispatched to the application. + // This behavior will prevent chording with fallback keys (so they cannot + // be used as modifiers) but it will ensure that fallback keys do not + // get stuck. This takes care of the case where the application does not handle + // the original DOWN so we generate a fallback DOWN but it does handle + // the original UP in which case we would not generate the fallback UP. + synthesizeCancelationEventsForConnectionLocked(connection, + InputState::CANCEL_FALLBACK_EVENTS, + "Application handled a non-fallback event."); + } else { + // If the application did not handle a non-fallback key, then ask + // the policy what to do with it. We might generate a fallback key + // event here. + KeyEvent event; + initializeKeyEvent(&event, keyEntry); + + mLock.unlock(); + + bool fallback = mPolicy->dispatchUnhandledKey(connection->inputChannel, + &event, keyEntry->policyFlags, &event); + + mLock.lock(); + + if (fallback) { + // Restart the dispatch cycle using the fallback key. + keyEntry->eventTime = event.getEventTime(); + keyEntry->deviceId = event.getDeviceId(); + keyEntry->source = event.getSource(); + keyEntry->flags = event.getFlags() | AKEY_EVENT_FLAG_FALLBACK; + keyEntry->keyCode = event.getKeyCode(); + keyEntry->scanCode = event.getScanCode(); + keyEntry->metaState = event.getMetaState(); + keyEntry->repeatCount = event.getRepeatCount(); + keyEntry->downTime = event.getDownTime(); + keyEntry->syntheticRepeat = false; + + dispatchEntry->inProgress = false; + startDispatchCycleLocked(now(), connection); + return; + } + } + } } } @@ -3371,6 +3407,7 @@ InputDispatcher::InputState::Consistency InputDispatcher::InputState::trackKey( memento.source = entry->source; memento.keyCode = entry->keyCode; memento.scanCode = entry->scanCode; + memento.flags = entry->flags; memento.downTime = entry->downTime; return CONSISTENT; } @@ -3453,10 +3490,10 @@ void InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTim CancelationOptions options) { for (size_t i = 0; i < mKeyMementos.size(); ) { const KeyMemento& memento = mKeyMementos.itemAt(i); - if (shouldCancelEvent(memento.source, options)) { + if (shouldCancelKey(memento, options)) { outEvents.push(allocator->obtainKeyEntry(currentTime, memento.deviceId, memento.source, 0, - AKEY_EVENT_ACTION_UP, AKEY_EVENT_FLAG_CANCELED, + AKEY_EVENT_ACTION_UP, memento.flags | AKEY_EVENT_FLAG_CANCELED, memento.keyCode, memento.scanCode, 0, 0, memento.downTime)); mKeyMementos.removeAt(i); } else { @@ -3466,7 +3503,7 @@ void InputDispatcher::InputState::synthesizeCancelationEvents(nsecs_t currentTim for (size_t i = 0; i < mMotionMementos.size(); ) { const MotionMemento& memento = mMotionMementos.itemAt(i); - if (shouldCancelEvent(memento.source, options)) { + if (shouldCancelMotion(memento, options)) { outEvents.push(allocator->obtainMotionEntry(currentTime, memento.deviceId, memento.source, 0, AMOTION_EVENT_ACTION_CANCEL, 0, 0, 0, @@ -3502,15 +3539,30 @@ void InputDispatcher::InputState::copyPointerStateTo(InputState& other) const { } } -bool InputDispatcher::InputState::shouldCancelEvent(int32_t eventSource, +bool InputDispatcher::InputState::shouldCancelKey(const KeyMemento& memento, CancelationOptions options) { switch (options) { - case CANCEL_POINTER_EVENTS: - return eventSource & AINPUT_SOURCE_CLASS_POINTER; + case CANCEL_ALL_EVENTS: case CANCEL_NON_POINTER_EVENTS: - return !(eventSource & AINPUT_SOURCE_CLASS_POINTER); + return true; + case CANCEL_FALLBACK_EVENTS: + return memento.flags & AKEY_EVENT_FLAG_FALLBACK; default: + return false; + } +} + +bool InputDispatcher::InputState::shouldCancelMotion(const MotionMemento& memento, + CancelationOptions options) { + switch (options) { + case CANCEL_ALL_EVENTS: return true; + case CANCEL_POINTER_EVENTS: + return memento.source & AINPUT_SOURCE_CLASS_POINTER; + case CANCEL_NON_POINTER_EVENTS: + return !(memento.source & AINPUT_SOURCE_CLASS_POINTER); + default: + return false; } } diff --git a/libs/ui/InputReader.cpp b/libs/ui/InputReader.cpp index 9cc96ad..51ed09f 100644 --- a/libs/ui/InputReader.cpp +++ b/libs/ui/InputReader.cpp @@ -745,17 +745,6 @@ KeyboardInputMapper::~KeyboardInputMapper() { void KeyboardInputMapper::initializeLocked() { mLocked.metaState = AMETA_NONE; mLocked.downTime = 0; - - initializeLedStateLocked(mLocked.capsLockLedState, LED_CAPSL); - initializeLedStateLocked(mLocked.numLockLedState, LED_NUML); - initializeLedStateLocked(mLocked.scrollLockLedState, LED_SCROLLL); - - updateLedStateLocked(true); -} - -void KeyboardInputMapper::initializeLedStateLocked(LockedState::LedState& ledState, int32_t led) { - ledState.avail = getEventHub()->hasLed(getDeviceId(), led); - ledState.on = false; } uint32_t KeyboardInputMapper::getSources() { @@ -786,6 +775,12 @@ void KeyboardInputMapper::configure() { // Configure basic parameters. configureParameters(); + + // Reset LEDs. + { + AutoMutex _l(mLock); + resetLedStateLocked(); + } } void KeyboardInputMapper::configureParameters() { @@ -813,6 +808,7 @@ void KeyboardInputMapper::reset() { // Synthesize key up event on reset if keys are currently down. if (mLocked.keyDowns.isEmpty()) { initializeLocked(); + resetLedStateLocked(); break; // done } @@ -953,6 +949,19 @@ int32_t KeyboardInputMapper::getMetaState() { } // release lock } +void KeyboardInputMapper::resetLedStateLocked() { + initializeLedStateLocked(mLocked.capsLockLedState, LED_CAPSL); + initializeLedStateLocked(mLocked.numLockLedState, LED_NUML); + initializeLedStateLocked(mLocked.scrollLockLedState, LED_SCROLLL); + + updateLedStateLocked(true); +} + +void KeyboardInputMapper::initializeLedStateLocked(LockedState::LedState& ledState, int32_t led) { + ledState.avail = getEventHub()->hasLed(getDeviceId(), led); + ledState.on = false; +} + void KeyboardInputMapper::updateLedStateLocked(bool reset) { updateLedStateForModifierLocked(mLocked.capsLockLedState, LED_CAPSL, AMETA_CAPS_LOCK_ON, reset); @@ -966,7 +975,7 @@ void KeyboardInputMapper::updateLedStateForModifierLocked(LockedState::LedState& int32_t led, int32_t modifier, bool reset) { if (ledState.avail) { bool desiredState = (mLocked.metaState & modifier) != 0; - if (ledState.on != desiredState) { + if (reset || ledState.on != desiredState) { getEventHub()->setLedState(getDeviceId(), led, desiredState); ledState.on = desiredState; } diff --git a/libs/ui/InputTransport.cpp b/libs/ui/InputTransport.cpp index 1885691..83d9556 100644 --- a/libs/ui/InputTransport.cpp +++ b/libs/ui/InputTransport.cpp @@ -501,7 +501,7 @@ status_t InputPublisher::sendDispatchSignal() { return mChannel->sendSignal(INPUT_SIGNAL_DISPATCH); } -status_t InputPublisher::receiveFinishedSignal(bool& outHandled) { +status_t InputPublisher::receiveFinishedSignal(bool* outHandled) { #if DEBUG_TRANSPORT_ACTIONS LOGD("channel '%s' publisher ~ receiveFinishedSignal", mChannel->getName().string()); @@ -510,13 +510,13 @@ status_t InputPublisher::receiveFinishedSignal(bool& outHandled) { char signal; status_t result = mChannel->receiveSignal(& signal); if (result) { - outHandled = false; + *outHandled = false; return result; } if (signal == INPUT_SIGNAL_FINISHED_HANDLED) { - outHandled = true; + *outHandled = true; } else if (signal == INPUT_SIGNAL_FINISHED_UNHANDLED) { - outHandled = false; + *outHandled = false; } else { LOGE("channel '%s' publisher ~ Received unexpected signal '%c' from consumer", mChannel->getName().string(), signal); diff --git a/libs/ui/KeyCharacterMap.cpp b/libs/ui/KeyCharacterMap.cpp index e689c4b..9bfa8f6 100644 --- a/libs/ui/KeyCharacterMap.cpp +++ b/libs/ui/KeyCharacterMap.cpp @@ -141,9 +141,8 @@ int32_t KeyCharacterMap::getKeyboardType() const { char16_t KeyCharacterMap::getDisplayLabel(int32_t keyCode) const { char16_t result = 0; - ssize_t index = mKeys.indexOfKey(keyCode); - if (index >= 0) { - const Key* key = mKeys.valueAt(index); + const Key* key; + if (getKey(keyCode, &key)) { result = key->label; } #if DEBUG_MAPPING @@ -154,9 +153,8 @@ char16_t KeyCharacterMap::getDisplayLabel(int32_t keyCode) const { char16_t KeyCharacterMap::getNumber(int32_t keyCode) const { char16_t result = 0; - ssize_t index = mKeys.indexOfKey(keyCode); - if (index >= 0) { - const Key* key = mKeys.valueAt(index); + const Key* key; + if (getKey(keyCode, &key)) { result = key->number; } #if DEBUG_MAPPING @@ -167,15 +165,10 @@ char16_t KeyCharacterMap::getNumber(int32_t keyCode) const { char16_t KeyCharacterMap::getCharacter(int32_t keyCode, int32_t metaState) const { char16_t result = 0; - ssize_t index = mKeys.indexOfKey(keyCode); - if (index >= 0) { - const Key* key = mKeys.valueAt(index); - for (const Behavior* behavior = key->firstBehavior; behavior; behavior = behavior->next) { - if ((behavior->metaState & metaState) == behavior->metaState) { - result = behavior->character; - break; - } - } + const Key* key; + const Behavior* behavior; + if (getKeyBehavior(keyCode, metaState, &key, &behavior)) { + result = behavior->character; } #if DEBUG_MAPPING LOGD("getCharacter: keyCode=%d, metaState=0x%08x ~ Result %d.", keyCode, metaState, result); @@ -183,13 +176,33 @@ char16_t KeyCharacterMap::getCharacter(int32_t keyCode, int32_t metaState) const return result; } +bool KeyCharacterMap::getFallbackAction(int32_t keyCode, int32_t metaState, + FallbackAction* outFallbackAction) const { + outFallbackAction->keyCode = 0; + outFallbackAction->metaState = 0; + + bool result = false; + const Key* key; + const Behavior* behavior; + if (getKeyBehavior(keyCode, metaState, &key, &behavior)) { + outFallbackAction->keyCode = behavior->fallbackKeyCode; + outFallbackAction->metaState = metaState & ~behavior->metaState; + result = true; + } +#if DEBUG_MAPPING + LOGD("getFallbackKeyCode: keyCode=%d, metaState=0x%08x ~ Result %s, " + "fallback keyCode=%d, fallback metaState=0x%08x.", + keyCode, metaState, result ? "true" : "false", + outFallbackAction->keyCode, outFallbackAction->metaState); +#endif + return result; +} + char16_t KeyCharacterMap::getMatch(int32_t keyCode, const char16_t* chars, size_t numChars, int32_t metaState) const { char16_t result = 0; - ssize_t index = mKeys.indexOfKey(keyCode); - if (index >= 0) { - const Key* key = mKeys.valueAt(index); - + const Key* key; + if (getKey(keyCode, &key)) { // Try to find the most general behavior that maps to this character. // For example, the base key behavior will usually be last in the list. // However, if we find a perfect meta state match for one behavior then use that one. @@ -238,7 +251,7 @@ bool KeyCharacterMap::getEvents(int32_t deviceId, const char16_t* chars, size_t } #if DEBUG_MAPPING LOGD("getEvents: deviceId=%d, chars=[%s] ~ Generated %d events.", - deviceId, toString(chars, numChars).string(), outEvents.size()); + deviceId, toString(chars, numChars).string(), int32_t(outEvents.size())); for (size_t i = 0; i < outEvents.size(); i++) { LOGD(" Key: keyCode=%d, metaState=0x%08x, %s.", outEvents[i].getKeyCode(), outEvents[i].getMetaState(), @@ -248,6 +261,32 @@ bool KeyCharacterMap::getEvents(int32_t deviceId, const char16_t* chars, size_t return true; } +bool KeyCharacterMap::getKey(int32_t keyCode, const Key** outKey) const { + ssize_t index = mKeys.indexOfKey(keyCode); + if (index >= 0) { + *outKey = mKeys.valueAt(index); + return true; + } + return false; +} + +bool KeyCharacterMap::getKeyBehavior(int32_t keyCode, int32_t metaState, + const Key** outKey, const Behavior** outBehavior) const { + const Key* key; + if (getKey(keyCode, &key)) { + const Behavior* behavior = key->firstBehavior; + while (behavior) { + if ((behavior->metaState & metaState) == behavior->metaState) { + *outKey = key; + *outBehavior = behavior; + return true; + } + behavior = behavior->next; + } + } + return false; +} + bool KeyCharacterMap::findKey(char16_t ch, int32_t* outKeyCode, int32_t* outMetaState) const { if (!ch) { return false; diff --git a/libs/ui/tests/InputDispatcher_test.cpp b/libs/ui/tests/InputDispatcher_test.cpp index 68f9037..7e17c57 100644 --- a/libs/ui/tests/InputDispatcher_test.cpp +++ b/libs/ui/tests/InputDispatcher_test.cpp @@ -66,7 +66,7 @@ private: } virtual bool dispatchUnhandledKey(const sp<InputChannel>& inputChannel, - const KeyEvent* keyEvent, uint32_t policyFlags) { + const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { return false; } diff --git a/libs/ui/tests/InputPublisherAndConsumer_test.cpp b/libs/ui/tests/InputPublisherAndConsumer_test.cpp index c6eac25..903fcaf 100644 --- a/libs/ui/tests/InputPublisherAndConsumer_test.cpp +++ b/libs/ui/tests/InputPublisherAndConsumer_test.cpp @@ -123,7 +123,7 @@ void InputPublisherAndConsumerTest::PublishAndConsumeKeyEvent() { << "consumer sendFinishedSignal should return OK"; bool handled = false; - status = mPublisher->receiveFinishedSignal(handled); + status = mPublisher->receiveFinishedSignal(&handled); ASSERT_EQ(OK, status) << "publisher receiveFinishedSignal should return OK"; ASSERT_TRUE(handled) @@ -287,7 +287,7 @@ void InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent( << "consumer sendFinishedSignal should return OK"; bool handled = true; - status = mPublisher->receiveFinishedSignal(handled); + status = mPublisher->receiveFinishedSignal(&handled); ASSERT_EQ(OK, status) << "publisher receiveFinishedSignal should return OK"; ASSERT_FALSE(handled) diff --git a/libs/ui/tests/InputReader_test.cpp b/libs/ui/tests/InputReader_test.cpp index d6c2cbd..97cbc25 100644 --- a/libs/ui/tests/InputReader_test.cpp +++ b/libs/ui/tests/InputReader_test.cpp @@ -1137,6 +1137,7 @@ protected: mFakeDispatcher = new FakeInputDispatcher(); mFakeContext = new FakeInputReaderContext(mFakeEventHub, mFakePolicy, mFakeDispatcher); + mFakeEventHub->addDevice(DEVICE_ID, String8(DEVICE_NAME), 0); mDevice = new InputDevice(mFakeContext, DEVICE_ID, String8(DEVICE_NAME)); } @@ -1753,7 +1754,7 @@ TEST_F(KeyboardInputMapperTest, Process_LockedKeysShouldToggleMetaStateAndLeds) process(mapper, ARBITRARY_TIME, DEVICE_ID, EV_KEY, KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK, 1, 0); process(mapper, ARBITRARY_TIME, DEVICE_ID, - EV_KEY, KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK, 1, 0); + EV_KEY, KEY_CAPSLOCK, AKEYCODE_CAPS_LOCK, 0, 0); ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_CAPSL)); ASSERT_TRUE(mFakeEventHub->getLedState(DEVICE_ID, LED_NUML)); ASSERT_FALSE(mFakeEventHub->getLedState(DEVICE_ID, LED_SCROLLL)); @@ -2225,19 +2226,19 @@ void SingleTouchInputMapperTest::processSync(SingleTouchInputMapper* mapper) { } -TEST_F(SingleTouchInputMapperTest, GetSources_WhenDisplayTypeIsTouchPad_ReturnsTouchPad) { +TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchPad_ReturnsTouchPad) { SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); prepareAxes(POSITION); - addConfigurationProperty("touch.displayType", "touchPad"); + addConfigurationProperty("touch.deviceType", "touchPad"); addMapperAndConfigure(mapper); ASSERT_EQ(AINPUT_SOURCE_TOUCHPAD, mapper->getSources()); } -TEST_F(SingleTouchInputMapperTest, GetSources_WhenDisplayTypeIsTouchScreen_ReturnsTouchScreen) { +TEST_F(SingleTouchInputMapperTest, GetSources_WhenDeviceTypeIsTouchScreen_ReturnsTouchScreen) { SingleTouchInputMapper* mapper = new SingleTouchInputMapper(mDevice); prepareAxes(POSITION); - addConfigurationProperty("touch.displayType", "touchScreen"); + addConfigurationProperty("touch.deviceType", "touchScreen"); addMapperAndConfigure(mapper); ASSERT_EQ(AINPUT_SOURCE_TOUCHSCREEN, mapper->getSources()); diff --git a/media/java/android/media/MtpDatabase.java b/media/java/android/media/MtpDatabase.java index 139a6ea..6056a0f 100644 --- a/media/java/android/media/MtpDatabase.java +++ b/media/java/android/media/MtpDatabase.java @@ -31,6 +31,8 @@ import android.provider.MediaStore.Files; import android.provider.MediaStore.Images; import android.provider.MediaStore.MediaColumns; import android.util.Log; +import android.view.Display; +import android.view.WindowManager; import java.io.File; import java.util.HashMap; @@ -460,6 +462,7 @@ public class MtpDatabase { return new int[] { MtpConstants.DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MtpConstants.DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, + MtpConstants.DEVICE_PROPERTY_IMAGE_SIZE, }; } @@ -592,9 +595,21 @@ public class MtpDatabase { c.close(); } } - } - return MtpConstants.RESPONSE_DEVICE_PROP_NOT_SUPPORTED; + case MtpConstants.DEVICE_PROPERTY_IMAGE_SIZE: + // use screen size as max image size + Display display = ((WindowManager)mContext.getSystemService( + Context.WINDOW_SERVICE)).getDefaultDisplay(); + int width = display.getWidth(); + int height = display.getHeight(); + String imageSize = Integer.toString(width) + "x" + Integer.toString(height); + imageSize.getChars(0, imageSize.length(), outStringValue, 0); + outStringValue[imageSize.length()] = 0; + return MtpConstants.RESPONSE_OK; + + default: + return MtpConstants.RESPONSE_DEVICE_PROP_NOT_SUPPORTED; + } } private int setDeviceProperty(int property, long intValue, String stringValue) { diff --git a/media/jni/android_media_MtpDatabase.cpp b/media/jni/android_media_MtpDatabase.cpp index 1909e6a..9bb93fd 100644 --- a/media/jni/android_media_MtpDatabase.cpp +++ b/media/jni/android_media_MtpDatabase.cpp @@ -860,8 +860,9 @@ static const PropertyTableEntry kObjectPropertyTable[] = { }; static const PropertyTableEntry kDevicePropertyTable[] = { - { MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_STR }, - { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR }, + { MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER, MTP_TYPE_STR }, + { MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME, MTP_TYPE_STR }, + { MTP_DEVICE_PROPERTY_IMAGE_SIZE, MTP_TYPE_STR }, }; bool MyMtpDatabase::getObjectPropertyInfo(MtpObjectProperty property, int& type) { @@ -932,6 +933,9 @@ MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, MtpProperty* result = NULL; switch (property) { case MTP_PROPERTY_OBJECT_FORMAT: + // use format as default value + result = new MtpProperty(property, MTP_TYPE_UINT16, false, format); + break; case MTP_PROPERTY_PROTECTION_STATUS: case MTP_PROPERTY_TRACK: result = new MtpProperty(property, MTP_TYPE_UINT16); @@ -973,31 +977,35 @@ MtpProperty* MyMtpDatabase::getObjectPropertyDesc(MtpObjectProperty property, } MtpProperty* MyMtpDatabase::getDevicePropertyDesc(MtpDeviceProperty property) { + JNIEnv* env = AndroidRuntime::getJNIEnv(); MtpProperty* result = NULL; + bool writable = false; + switch (property) { case MTP_DEVICE_PROPERTY_SYNCHRONIZATION_PARTNER: case MTP_DEVICE_PROPERTY_DEVICE_FRIENDLY_NAME: - { - // writeable string properties - result = new MtpProperty(property, MTP_TYPE_STR, true); + writable = true; + // fall through + case MTP_DEVICE_PROPERTY_IMAGE_SIZE: + result = new MtpProperty(property, MTP_TYPE_STR, writable); - // set current value - JNIEnv* env = AndroidRuntime::getJNIEnv(); + // get current value jint ret = env->CallIntMethod(mDatabase, method_getDeviceProperty, (jint)property, mLongBuffer, mStringBuffer); if (ret == MTP_RESPONSE_OK) { jchar* str = env->GetCharArrayElements(mStringBuffer, 0); result->setCurrentValue(str); + // for read-only properties it is safe to assume current value is default value + if (!writable) + result->setDefaultValue(str); env->ReleaseCharArrayElements(mStringBuffer, str, 0); } else { LOGE("unable to read device property, response: %04X", ret); } - - checkAndClearExceptionFromCallback(env, __FUNCTION__); break; - } } + checkAndClearExceptionFromCallback(env, __FUNCTION__); return result; } diff --git a/media/mtp/Android.mk b/media/mtp/Android.mk index b7e1a2a..e285847 100644 --- a/media/mtp/Android.mk +++ b/media/mtp/Android.mk @@ -47,3 +47,32 @@ include $(BUILD_STATIC_LIBRARY) endif +ifeq ($(HOST_OS),linux) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES:= \ + MtpClient.cpp \ + MtpDataPacket.cpp \ + MtpDebug.cpp \ + MtpDevice.cpp \ + MtpEventPacket.cpp \ + MtpDeviceInfo.cpp \ + MtpObjectInfo.cpp \ + MtpPacket.cpp \ + MtpProperty.cpp \ + MtpRequestPacket.cpp \ + MtpResponsePacket.cpp \ + MtpStorageInfo.cpp \ + MtpStringBuffer.cpp \ + MtpStorage.cpp \ + MtpUtils.cpp \ + PtpCursor.cpp \ + +LOCAL_MODULE:= libmtp + +LOCAL_CFLAGS := -DMTP_HOST + +include $(BUILD_HOST_STATIC_LIBRARY) + +endif diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp index 416ebfe..8ad39dc 100644 --- a/media/mtp/MtpDevice.cpp +++ b/media/mtp/MtpDevice.cpp @@ -63,17 +63,13 @@ void MtpDevice::initialize() { openSession(); mDeviceInfo = getDeviceInfo(); if (mDeviceInfo) { - mDeviceInfo->print(); - if (mDeviceInfo->mDeviceProperties) { int count = mDeviceInfo->mDeviceProperties->size(); for (int i = 0; i < count; i++) { MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i]; MtpProperty* property = getDevicePropDesc(propCode); - if (property) { - property->print(); + if (property) mDeviceProperties.push(property); - } } } } @@ -87,6 +83,45 @@ void MtpDevice::close() { } } +void MtpDevice::print() { + if (mDeviceInfo) { + mDeviceInfo->print(); + + if (mDeviceInfo->mDeviceProperties) { + LOGI("***** DEVICE PROPERTIES *****\n"); + int count = mDeviceInfo->mDeviceProperties->size(); + for (int i = 0; i < count; i++) { + MtpDeviceProperty propCode = (*mDeviceInfo->mDeviceProperties)[i]; + MtpProperty* property = getDevicePropDesc(propCode); + if (property) { + property->print(); + } + } + } + } + + if (mDeviceInfo->mPlaybackFormats) { + LOGI("***** OBJECT PROPERTIES *****\n"); + int count = mDeviceInfo->mPlaybackFormats->size(); + for (int i = 0; i < count; i++) { + MtpObjectFormat format = (*mDeviceInfo->mPlaybackFormats)[i]; + LOGI("*** FORMAT: %s\n", MtpDebug::getFormatCodeName(format)); + MtpObjectPropertyList* props = getObjectPropsSupported(format); + if (props) { + for (int j = 0; j < props->size(); j++) { + MtpObjectProperty prop = (*props)[j]; + MtpProperty* property = getObjectPropDesc(prop, format); + if (property) + property->print(); + else + LOGE("could not fetch property: %s", + MtpDebug::getObjectPropCodeName(prop)); + } + } + } + } +} + const char* MtpDevice::getDeviceName() { if (mDevice) return usb_device_get_name(mDevice); @@ -330,6 +365,23 @@ MtpObjectHandle MtpDevice::getStorageID(MtpObjectHandle handle) { return -1; } +MtpObjectPropertyList* MtpDevice::getObjectPropsSupported(MtpObjectFormat format) { + Mutex::Autolock autoLock(mMutex); + + mRequest.reset(); + mRequest.setParameter(1, format); + if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROPS_SUPPORTED)) + return NULL; + if (!readData()) + return NULL; + MtpResponseCode ret = readResponse(); + if (ret == MTP_RESPONSE_OK) { + return mData.getAUInt16(); + } + return NULL; + +} + MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) { Mutex::Autolock autoLock(mMutex); @@ -348,6 +400,25 @@ MtpProperty* MtpDevice::getDevicePropDesc(MtpDeviceProperty code) { return NULL; } +MtpProperty* MtpDevice::getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format) { + Mutex::Autolock autoLock(mMutex); + + mRequest.reset(); + mRequest.setParameter(1, code); + mRequest.setParameter(2, format); + if (!sendRequest(MTP_OPERATION_GET_OBJECT_PROP_DESC)) + return NULL; + if (!readData()) + return NULL; + MtpResponseCode ret = readResponse(); + if (ret == MTP_RESPONSE_OK) { + MtpProperty* property = new MtpProperty; + property->read(mData); + return property; + } + return NULL; +} + // reads the object's data and writes it to the specified file path bool MtpDevice::readObject(MtpObjectHandle handle, const char* destPath, int group, int perm) { LOGD("readObject: %s", destPath); diff --git a/media/mtp/MtpDevice.h b/media/mtp/MtpDevice.h index 21c85d5..6ffbd24 100644 --- a/media/mtp/MtpDevice.h +++ b/media/mtp/MtpDevice.h @@ -67,6 +67,7 @@ public: void initialize(); void close(); + void print(); const char* getDeviceName(); bool openSession(); @@ -85,7 +86,10 @@ public: MtpObjectHandle getParent(MtpObjectHandle handle); MtpObjectHandle getStorageID(MtpObjectHandle handle); + MtpObjectPropertyList* getObjectPropsSupported(MtpObjectFormat format); + MtpProperty* getDevicePropDesc(MtpDeviceProperty code); + MtpProperty* getObjectPropDesc(MtpObjectProperty code, MtpObjectFormat format); bool readObject(MtpObjectHandle handle, const char* destPath, int group, int perm); diff --git a/media/mtp/MtpProperty.cpp b/media/mtp/MtpProperty.cpp index 4356a6f..b095ce1 100644 --- a/media/mtp/MtpProperty.cpp +++ b/media/mtp/MtpProperty.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "MtpProperty" #include "MtpDataPacket.h" +#include "MtpDebug.h" #include "MtpProperty.h" #include "MtpStringBuffer.h" #include "MtpUtils.h" @@ -121,9 +122,8 @@ MtpProperty::~MtpProperty() { } void MtpProperty::read(MtpDataPacket& packet) { - bool deviceProp = isDeviceProperty(); - mCode = packet.getUInt16(); + bool deviceProp = isDeviceProperty(); mType = packet.getUInt16(); mWriteable = (packet.getUInt8() == 1); switch (mType) { @@ -317,9 +317,93 @@ void MtpProperty::setFormDateTime() { } void MtpProperty::print() { - LOGV("MtpProperty %04X\n", mCode); - LOGV(" type %04X\n", mType); - LOGV(" writeable %s\n", (mWriteable ? "true" : "false")); + MtpString buffer; + bool deviceProp = isDeviceProperty(); + if (deviceProp) + LOGI(" %s (%04X)", MtpDebug::getDevicePropCodeName(mCode), mCode); + else + LOGI(" %s (%04X)", MtpDebug::getObjectPropCodeName(mCode), mCode); + LOGI(" type %04X", mType); + LOGI(" writeable %s", (mWriteable ? "true" : "false")); + buffer = " default value: "; + print(mDefaultValue, buffer); + LOGI("%s", (const char *)buffer); + if (deviceProp) { + buffer = " current value: "; + print(mCurrentValue, buffer); + LOGI("%s", (const char *)buffer); + } + switch (mFormFlag) { + case kFormNone: + break; + case kFormRange: + buffer = " Range ("; + print(mMinimumValue, buffer); + buffer += ", "; + print(mMaximumValue, buffer); + buffer += ", "; + print(mStepSize, buffer); + LOGI("%s", (const char *)buffer); + break; + case kFormEnum: + buffer = " Enum { "; + for (int i = 0; i < mEnumLength; i++) { + print(mEnumValues[i], buffer); + buffer += " "; + } + buffer += "}"; + LOGI("%s", (const char *)buffer); + break; + case kFormDateTime: + LOGI(" DateTime\n"); + break; + default: + LOGI(" form %d\n", mFormFlag); + break; + } +} + +void MtpProperty::print(MtpPropertyValue& value, MtpString& buffer) { + switch (mType) { + case MTP_TYPE_INT8: + buffer.appendFormat("%d", value.u.i8); + break; + case MTP_TYPE_UINT8: + buffer.appendFormat("%d", value.u.u8); + break; + case MTP_TYPE_INT16: + buffer.appendFormat("%d", value.u.i16); + break; + case MTP_TYPE_UINT16: + buffer.appendFormat("%d", value.u.u16); + break; + case MTP_TYPE_INT32: + buffer.appendFormat("%d", value.u.i32); + break; + case MTP_TYPE_UINT32: + buffer.appendFormat("%d", value.u.u32); + break; + case MTP_TYPE_INT64: + buffer.appendFormat("%lld", value.u.i64); + break; + case MTP_TYPE_UINT64: + buffer.appendFormat("%lld", value.u.u64); + break; + case MTP_TYPE_INT128: + buffer.appendFormat("%08X%08X%08X%08X", value.u.i128[0], value.u.i128[1], + value.u.i128[2], value.u.i128[3]); + break; + case MTP_TYPE_UINT128: + buffer.appendFormat("%08X%08X%08X%08X", value.u.u128[0], value.u.u128[1], + value.u.u128[2], value.u.u128[3]); + break; + case MTP_TYPE_STR: + buffer.appendFormat("%s", value.str); + break; + default: + LOGE("unsupported type for MtpProperty::print\n"); + break; + } } void MtpProperty::readValue(MtpDataPacket& packet, MtpPropertyValue& value) { diff --git a/media/mtp/MtpProperty.h b/media/mtp/MtpProperty.h index f783a87..06ca56e 100644 --- a/media/mtp/MtpProperty.h +++ b/media/mtp/MtpProperty.h @@ -94,6 +94,7 @@ public: void setFormDateTime(); void print(); + void print(MtpPropertyValue& value, MtpString& buffer); inline bool isDeviceProperty() const { return ( ((mCode & 0xF000) == 0x5000) diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index de6cbac..5c1e02a 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -423,7 +423,7 @@ MtpResponseCode MtpServer::doGetObjectPropsSupported() { if (!mSessionOpen) return MTP_RESPONSE_SESSION_NOT_OPEN; MtpObjectFormat format = mRequest.getParameter(1); - MtpDevicePropertyList* properties = mDatabase->getSupportedObjectProperties(format); + MtpObjectPropertyList* properties = mDatabase->getSupportedObjectProperties(format); mData.putAUInt16(properties); delete properties; return MTP_RESPONSE_OK; diff --git a/native/include/android/input.h b/native/include/android/input.h index 861ec8b..e196686 100644 --- a/native/include/android/input.h +++ b/native/include/android/input.h @@ -215,7 +215,15 @@ enum { * tracked from its initial down. That is, somebody requested that tracking * started on the key down and a long press has not caused * the tracking to be canceled. */ - AKEY_EVENT_FLAG_TRACKING = 0x200 + AKEY_EVENT_FLAG_TRACKING = 0x200, + + /* Set when a key event has been synthesized to implement default behavior + * for an event that the application did not handle. + * Fallback key events are generated by unhandled trackball motions + * (to emulate a directional keypad) and by certain unhandled key presses + * that are declared in the key map (such as special function numeric keypad + * keys when numlock is off). */ + AKEY_EVENT_FLAG_FALLBACK = 0x400, }; /* diff --git a/native/include/android/keycodes.h b/native/include/android/keycodes.h index 5f33ad5..b026a0c 100644 --- a/native/include/android/keycodes.h +++ b/native/include/android/keycodes.h @@ -230,6 +230,7 @@ enum { AKEYCODE_PROG_GREEN = 184, AKEYCODE_PROG_YELLOW = 185, AKEYCODE_PROG_BLUE = 186, + AKEYCODE_APP_SWITCH = 187, // NOTE: If you add a new keycode here you must also add it to several other files. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. diff --git a/opengl/tests/gl2_java/AndroidManifest.xml b/opengl/tests/gl2_java/AndroidManifest.xml index 585b63f..8bb6840 100644 --- a/opengl/tests/gl2_java/AndroidManifest.xml +++ b/opengl/tests/gl2_java/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/gl2_java/res/values/strings.xml b/opengl/tests/gl2_java/res/values/strings.xml index d718b1d..06bd23c 100644 --- a/opengl/tests/gl2_java/res/values/strings.xml +++ b/opengl/tests/gl2_java/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/gl2_jni/AndroidManifest.xml b/opengl/tests/gl2_jni/AndroidManifest.xml index a72a6a5..1827e5f 100644 --- a/opengl/tests/gl2_jni/AndroidManifest.xml +++ b/opengl/tests/gl2_jni/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/gl2_jni/res/values/strings.xml b/opengl/tests/gl2_jni/res/values/strings.xml index e3f7331..a29c74b 100644 --- a/opengl/tests/gl2_jni/res/values/strings.xml +++ b/opengl/tests/gl2_jni/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/gl_jni/AndroidManifest.xml b/opengl/tests/gl_jni/AndroidManifest.xml index 64bd6bf..5d0ec96 100644 --- a/opengl/tests/gl_jni/AndroidManifest.xml +++ b/opengl/tests/gl_jni/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/gl_jni/res/values/strings.xml b/opengl/tests/gl_jni/res/values/strings.xml index 880f5c9..aee9fa0 100644 --- a/opengl/tests/gl_jni/res/values/strings.xml +++ b/opengl/tests/gl_jni/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/gl_perfapp/AndroidManifest.xml b/opengl/tests/gl_perfapp/AndroidManifest.xml index 305d95f..ee4bd98 100644 --- a/opengl/tests/gl_perfapp/AndroidManifest.xml +++ b/opengl/tests/gl_perfapp/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/gl_perfapp/res/values/strings.xml b/opengl/tests/gl_perfapp/res/values/strings.xml index dc21075..52cd961 100644 --- a/opengl/tests/gl_perfapp/res/values/strings.xml +++ b/opengl/tests/gl_perfapp/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/gldual/AndroidManifest.xml b/opengl/tests/gldual/AndroidManifest.xml index 06f4c4d..a36f4f7 100644 --- a/opengl/tests/gldual/AndroidManifest.xml +++ b/opengl/tests/gldual/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/gldual/res/values/strings.xml b/opengl/tests/gldual/res/values/strings.xml index 4267dff..b1f535d 100644 --- a/opengl/tests/gldual/res/values/strings.xml +++ b/opengl/tests/gldual/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/testFramerate/AndroidManifest.xml b/opengl/tests/testFramerate/AndroidManifest.xml index e04342c..85617f4 100644 --- a/opengl/tests/testFramerate/AndroidManifest.xml +++ b/opengl/tests/testFramerate/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/testFramerate/res/values/strings.xml b/opengl/tests/testFramerate/res/values/strings.xml index e6b3088..baadf0e 100644 --- a/opengl/tests/testFramerate/res/values/strings.xml +++ b/opengl/tests/testFramerate/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/testLatency/AndroidManifest.xml b/opengl/tests/testLatency/AndroidManifest.xml index 741266e..59f2643 100644 --- a/opengl/tests/testLatency/AndroidManifest.xml +++ b/opengl/tests/testLatency/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/testLatency/res/values/strings.xml b/opengl/tests/testLatency/res/values/strings.xml index 0309991..d80b77c 100644 --- a/opengl/tests/testLatency/res/values/strings.xml +++ b/opengl/tests/testLatency/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/testPauseResume/AndroidManifest.xml b/opengl/tests/testPauseResume/AndroidManifest.xml index 3e8e7e7..1879bc3 100644 --- a/opengl/tests/testPauseResume/AndroidManifest.xml +++ b/opengl/tests/testPauseResume/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/testPauseResume/res/values/strings.xml b/opengl/tests/testPauseResume/res/values/strings.xml index 208fe15..b4c98fe 100644 --- a/opengl/tests/testPauseResume/res/values/strings.xml +++ b/opengl/tests/testPauseResume/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tests/testViewport/AndroidManifest.xml b/opengl/tests/testViewport/AndroidManifest.xml index 90a9d2d..ba178bb 100644 --- a/opengl/tests/testViewport/AndroidManifest.xml +++ b/opengl/tests/testViewport/AndroidManifest.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2009, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2009 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" diff --git a/opengl/tests/testViewport/res/values/strings.xml b/opengl/tests/testViewport/res/values/strings.xml index f4b8bbb..c037a7c 100644 --- a/opengl/tests/testViewport/res/values/strings.xml +++ b/opengl/tests/testViewport/res/values/strings.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- -/* -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ +<!-- Copyright (C) 2006 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. --> <!-- This file contains resource definitions for displayed strings, allowing diff --git a/opengl/tools/glgen/stubs/gles11/glGetString.java b/opengl/tools/glgen/stubs/gles11/glGetString.java index d44a6dd..b02a0d1 100644 --- a/opengl/tools/glgen/stubs/gles11/glGetString.java +++ b/opengl/tools/glgen/stubs/gles11/glGetString.java @@ -1,21 +1,21 @@ -/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- // C function const GLubyte * glGetString ( GLenum name )
-
- public static native String glGetString(
- int name
- );
+/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + // C function const GLubyte * glGetString ( GLenum name ) + + public static native String glGetString( + int name + ); diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index c3112d8..e61dd6c 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -133,6 +133,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final boolean DEBUG = false; static final boolean localLOGV = DEBUG ? Config.LOGD : Config.LOGV; static final boolean DEBUG_LAYOUT = false; + static final boolean DEBUG_FALLBACK = false; static final boolean SHOW_STARTING_ANIMATIONS = true; static final boolean SHOW_PROCESSES_ON_ALT_MENU = false; @@ -315,8 +316,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { Intent mHomeIntent; Intent mCarDockIntent; Intent mDeskDockIntent; - boolean mSearchKeyPressed; - boolean mConsumeSearchKeyUp; + int mShortcutKeyPressed = -1; + boolean mConsumeShortcutKeyUp; boolean mShowMenuKey = false; // track FLAG_NEEDS_MENU_KEY on frontmost window // support for activating the lock screen while the screen is on @@ -345,6 +346,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { ShortcutManager mShortcutManager; PowerManager.WakeLock mBroadcastWakeLock; + final KeyCharacterMap.FallbackAction mFallbackAction = new KeyCharacterMap.FallbackAction(); + class SettingsObserver extends ContentObserver { SettingsObserver(Handler handler) { super(handler); @@ -1228,56 +1231,44 @@ public class PhoneWindowManager implements WindowManagerPolicy { + repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed); } - // Clear a pending HOME longpress if the user releases Home - // TODO: This could probably be inside the next bit of logic, but that code - // turned out to be a bit fragile so I'm doing it here explicitly, for now. - if ((keyCode == KeyEvent.KEYCODE_HOME) && !down) { - mHandler.removeCallbacks(mHomeLongPress); - } + // First we always handle the home key here, so applications + // can never break it, although if keyguard is on, we do let + // it handle it, because that gives us the correct 5 second + // timeout. + if (keyCode == KeyEvent.KEYCODE_HOME) { + // Clear a pending HOME longpress if the user releases Home + if (!down) { + mHandler.removeCallbacks(mHomeLongPress); + } - // If the HOME button is currently being held, then we do special - // chording with it. - if (mHomePressed) { - // If we have released the home key, and didn't do anything else // while it was pressed, then it is time to go home! - if (keyCode == KeyEvent.KEYCODE_HOME) { - if (!down) { - mHomePressed = false; - - if (!canceled) { - // If an incoming call is ringing, HOME is totally disabled. - // (The user is already on the InCallScreen at this point, - // and his ONLY options are to answer or reject the call.) - boolean incomingRinging = false; - try { - ITelephony telephonyService = getTelephonyService(); - if (telephonyService != null) { - incomingRinging = telephonyService.isRinging(); - } - } catch (RemoteException ex) { - Log.w(TAG, "RemoteException from getPhoneInterface()", ex); - } - - if (incomingRinging) { - Log.i(TAG, "Ignoring HOME; there's a ringing incoming call."); - } else { - launchHomeFromHotKey(); + if (mHomePressed && !down) { + mHomePressed = false; + if (!canceled) { + // If an incoming call is ringing, HOME is totally disabled. + // (The user is already on the InCallScreen at this point, + // and his ONLY options are to answer or reject the call.) + boolean incomingRinging = false; + try { + ITelephony telephonyService = getTelephonyService(); + if (telephonyService != null) { + incomingRinging = telephonyService.isRinging(); } + } catch (RemoteException ex) { + Log.w(TAG, "RemoteException from getPhoneInterface()", ex); + } + + if (incomingRinging) { + Log.i(TAG, "Ignoring HOME; there's a ringing incoming call."); } else { - Log.i(TAG, "Ignoring HOME; event canceled."); + launchHomeFromHotKey(); } + } else { + Log.i(TAG, "Ignoring HOME; event canceled."); } + return true; } - - return true; - } - - // First we always handle the home key here, so applications - // can never break it, although if keyguard is on, we do let - // it handle it, because that gives us the correct 5 second - // timeout. - if (keyCode == KeyEvent.KEYCODE_HOME) { // If a system window has focus, then it doesn't make sense // right now to interact with applications. @@ -1334,21 +1325,28 @@ public class PhoneWindowManager implements WindowManagerPolicy { } else if (keyCode == KeyEvent.KEYCODE_SEARCH) { if (down) { if (repeatCount == 0) { - mSearchKeyPressed = true; + mShortcutKeyPressed = keyCode; + mConsumeShortcutKeyUp = false; } - } else { - mSearchKeyPressed = false; + } else if (keyCode == mShortcutKeyPressed) { + mShortcutKeyPressed = -1; - if (mConsumeSearchKeyUp) { + if (mConsumeShortcutKeyUp) { // Consume the up-event - mConsumeSearchKeyUp = false; + mConsumeShortcutKeyUp = false; return true; } } + } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { + if (!down) { + showRecentAppsDialog(); + } + return true; } - // Shortcuts are invoked through Search+key, so intercept those here - if (mSearchKeyPressed) { + // Shortcuts are invoked through Search+key or Meta+key, so intercept those here + if ((mShortcutKeyPressed != -1 && !mConsumeShortcutKeyUp) + || (metaState & KeyEvent.META_META_ON) != 0) { if (down && repeatCount == 0 && !keyguardOn) { Intent shortcutIntent = mShortcutManager.getIntent(event); if (shortcutIntent != null) { @@ -1359,7 +1357,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { * We launched an app, so the up-event of the search key * should be consumed */ - mConsumeSearchKeyUp = true; + if (mShortcutKeyPressed != -1) { + mConsumeShortcutKeyUp = true; + } return true; } } @@ -1370,8 +1370,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override - public boolean dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) { - if (false) { + public KeyEvent dispatchUnhandledKey(WindowState win, KeyEvent event, int policyFlags) { + if (DEBUG_FALLBACK) { Slog.d(TAG, "Unhandled key: win=" + win + ", action=" + event.getAction() + ", flags=" + event.getFlags() + ", keyCode=" + event.getKeyCode() @@ -1380,7 +1380,42 @@ public class PhoneWindowManager implements WindowManagerPolicy { + ", repeatCount=" + event.getRepeatCount() + ", policyFlags=" + policyFlags); } - return false; + + if ((event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) { + final KeyCharacterMap kcm = event.getKeyCharacterMap(); + boolean fallback = kcm.getFallbackAction(event.getKeyCode(), event.getMetaState(), + mFallbackAction); + + if (fallback) { + if (DEBUG_FALLBACK) { + Slog.d(TAG, "Fallback: keyCode=" + mFallbackAction.keyCode + + " metaState=" + Integer.toHexString(mFallbackAction.metaState)); + } + + int flags = event.getFlags() | KeyEvent.FLAG_FALLBACK; + KeyEvent fallbackEvent = KeyEvent.obtain( + event.getDownTime(), event.getEventTime(), + event.getAction(), mFallbackAction.keyCode, + event.getRepeatCount(), mFallbackAction.metaState, + event.getDeviceId(), event.getScanCode(), + flags, event.getSource(), null); + int actions = interceptKeyBeforeQueueing(fallbackEvent, policyFlags, true); + if ((actions & ACTION_PASS_TO_USER) != 0) { + if (!interceptKeyBeforeDispatching(win, fallbackEvent, policyFlags)) { + if (DEBUG_FALLBACK) { + Slog.d(TAG, "Performing fallback."); + } + return fallbackEvent; + } + } + fallbackEvent.recycle(); + } + } + + if (DEBUG_FALLBACK) { + Slog.d(TAG, "No fallback."); + } + return null; } /** diff --git a/services/java/com/android/server/InputManager.java b/services/java/com/android/server/InputManager.java index 8634eec..4c499cd 100644 --- a/services/java/com/android/server/InputManager.java +++ b/services/java/com/android/server/InputManager.java @@ -402,7 +402,7 @@ public class InputManager { } @SuppressWarnings("unused") - public boolean dispatchUnhandledKey(InputChannel focus, + public KeyEvent dispatchUnhandledKey(InputChannel focus, KeyEvent event, int policyFlags) { return mWindowManagerService.mInputMonitor.dispatchUnhandledKey( focus, event, policyFlags); diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 2d88b2f..f78ebb9 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -5844,7 +5844,7 @@ public class WindowManagerService extends IWindowManager.Stub /* Provides an opportunity for the window manager policy to process a key that * the application did not handle. */ - public boolean dispatchUnhandledKey( + public KeyEvent dispatchUnhandledKey( InputChannel focus, KeyEvent event, int policyFlags) { WindowState windowState = getWindowStateForInputChannel(focus); return mPolicy.dispatchUnhandledKey(windowState, event, policyFlags); diff --git a/services/jni/com_android_server_InputManager.cpp b/services/jni/com_android_server_InputManager.cpp index 1996dd0..9156249 100644 --- a/services/jni/com_android_server_InputManager.cpp +++ b/services/jni/com_android_server_InputManager.cpp @@ -183,7 +183,7 @@ public: virtual bool interceptKeyBeforeDispatching(const sp<InputChannel>& inputChannel, const KeyEvent* keyEvent, uint32_t policyFlags); virtual bool dispatchUnhandledKey(const sp<InputChannel>& inputChannel, - const KeyEvent* keyEvent, uint32_t policyFlags); + const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent); virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType); virtual bool checkInjectEventsPermissionNonReentrant( int32_t injectorPid, int32_t injectorUid); @@ -813,7 +813,7 @@ bool NativeInputManager::interceptKeyBeforeDispatching(const sp<InputChannel>& i // - Ignore untrusted events and pass them along. // - Filter normal events and trusted injected events through the window manager policy to // handle the HOME key and the like. - bool result; + bool result = false; if (policyFlags & POLICY_FLAG_TRUSTED) { JNIEnv* env = jniEnv(); @@ -830,21 +830,17 @@ bool NativeInputManager::interceptKeyBeforeDispatching(const sp<InputChannel>& i result = consumed && !error; } else { LOGE("Failed to obtain key event object for interceptKeyBeforeDispatching."); - result = false; } - env->DeleteLocalRef(inputChannelObj); - } else { - result = false; } return result; } bool NativeInputManager::dispatchUnhandledKey(const sp<InputChannel>& inputChannel, - const KeyEvent* keyEvent, uint32_t policyFlags) { + const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) { // Policy: // - Ignore untrusted events and do not perform default handling. - bool result; + bool result = false; if (policyFlags & POLICY_FLAG_TRUSTED) { JNIEnv* env = jniEnv(); @@ -852,21 +848,26 @@ bool NativeInputManager::dispatchUnhandledKey(const sp<InputChannel>& inputChann jobject inputChannelObj = getInputChannelObjLocal(env, inputChannel); jobject keyEventObj = android_view_KeyEvent_fromNative(env, keyEvent); if (keyEventObj) { - jboolean handled = env->CallBooleanMethod(mCallbacksObj, + jobject fallbackKeyEventObj = env->CallObjectMethod(mCallbacksObj, gCallbacksClassInfo.dispatchUnhandledKey, inputChannelObj, keyEventObj, policyFlags); - bool error = checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey"); + checkAndClearExceptionFromCallback(env, "dispatchUnhandledKey"); android_view_KeyEvent_recycle(env, keyEventObj); env->DeleteLocalRef(keyEventObj); - result = handled && !error; + + if (fallbackKeyEventObj) { + // Note: outFallbackKeyEvent may be the same object as keyEvent. + if (!android_view_KeyEvent_toNative(env, fallbackKeyEventObj, + outFallbackKeyEvent)) { + result = true; + } + android_view_KeyEvent_recycle(env, fallbackKeyEventObj); + env->DeleteLocalRef(fallbackKeyEventObj); + } } else { LOGE("Failed to obtain key event object for dispatchUnhandledKey."); - result = false; } - env->DeleteLocalRef(inputChannelObj); - } else { - result = false; } return result; } @@ -1307,7 +1308,8 @@ int register_android_server_InputManager(JNIEnv* env) { "(Landroid/view/InputChannel;Landroid/view/KeyEvent;I)Z"); GET_METHOD_ID(gCallbacksClassInfo.dispatchUnhandledKey, gCallbacksClassInfo.clazz, - "dispatchUnhandledKey", "(Landroid/view/InputChannel;Landroid/view/KeyEvent;I)Z"); + "dispatchUnhandledKey", + "(Landroid/view/InputChannel;Landroid/view/KeyEvent;I)Landroid/view/KeyEvent;"); GET_METHOD_ID(gCallbacksClassInfo.checkInjectEventsPermission, gCallbacksClassInfo.clazz, "checkInjectEventsPermission", "(II)Z"); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 145618e..15df888 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -409,6 +409,7 @@ sp<GraphicBuffer> Layer::requestBuffer(int index, err = buffer->initCheck(); if (err || buffer->handle == 0) { + GraphicBuffer::dumpAllocationsToSystemLog(); LOGE_IF(err || buffer->handle == 0, "Layer::requestBuffer(this=%p), index=%d, w=%d, h=%d failed (%s)", this, index, w, h, strerror(-err)); diff --git a/tests/DumpRenderTree/AndroidManifest.xml b/tests/DumpRenderTree/AndroidManifest.xml index 86b3f06..dc44b25 100644 --- a/tests/DumpRenderTree/AndroidManifest.xml +++ b/tests/DumpRenderTree/AndroidManifest.xml @@ -27,7 +27,7 @@ </activity> <activity android:name="TestShellActivity" android:launchMode="singleTop" - android:hardwareAccelerated="false" + android:hardwareAccelerated="true" android:screenOrientation="portrait" android:theme="@android:style/Theme.Light"/> <activity android:name="ReliabilityTestActivity" android:screenOrientation="portrait" |
