diff options
33 files changed, 2740 insertions, 235 deletions
@@ -29401,6 +29401,23 @@ visibility="public" > </method> +<method name="listenUsingInsecureRfcommWithServiceRecord" + return="android.bluetooth.BluetoothServerSocket" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="name" type="java.lang.String"> +</parameter> +<parameter name="uuid" type="java.util.UUID"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> <method name="listenUsingRfcommWithServiceRecord" return="android.bluetooth.BluetoothServerSocket" abstract="false" @@ -30587,6 +30604,21 @@ > <implements name="android.os.Parcelable"> </implements> +<method name="createInsecureRfcommSocketToServiceRecord" + return="android.bluetooth.BluetoothSocket" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="uuid" type="java.util.UUID"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> <method name="createRfcommSocketToServiceRecord" return="android.bluetooth.BluetoothSocket" abstract="false" @@ -35673,6 +35705,17 @@ visibility="public" > </field> +<field name="NFC_SERVICE" + type="java.lang.String" + transient="false" + volatile="false" + value=""nfc"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="NOTIFICATION_SERVICE" type="java.lang.String" transient="false" @@ -59851,6 +59894,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" @@ -59963,6 +60016,146 @@ > </field> </class> +<class name="BitmapRegionDecoder" + extends="java.lang.Object" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="decodeRegion" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="rect" type="android.graphics.Rect"> +</parameter> +<parameter name="options" type="android.graphics.BitmapFactory.Options"> +</parameter> +</method> +<method name="getHeight" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getWidth" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isRecycled" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="newInstance" + return="android.graphics.BitmapRegionDecoder" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<parameter name="offset" type="int"> +</parameter> +<parameter name="length" type="int"> +</parameter> +<parameter name="isShareable" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="newInstance" + return="android.graphics.BitmapRegionDecoder" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="fd" type="java.io.FileDescriptor"> +</parameter> +<parameter name="isShareable" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="newInstance" + return="android.graphics.BitmapRegionDecoder" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="is" type="java.io.InputStream"> +</parameter> +<parameter name="isShareable" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="newInstance" + return="android.graphics.BitmapRegionDecoder" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pathName" type="java.lang.String"> +</parameter> +<parameter name="isShareable" type="boolean"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="recycle" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +</class> <class name="BitmapShader" extends="android.graphics.Shader" abstract="false" @@ -85926,6 +86119,385 @@ </parameter> </method> </interface> +<class name="MediaMetadataRetriever" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="MediaMetadataRetriever" + type="android.media.MediaMetadataRetriever" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</constructor> +<method name="extractMetadata" + return="java.lang.String" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="keyCode" type="int"> +</parameter> +</method> +<method name="getEmbeddedPicture" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getFrameAtTime" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="timeUs" type="long"> +</parameter> +<parameter name="option" type="int"> +</parameter> +</method> +<method name="getFrameAtTime" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="timeUs" type="long"> +</parameter> +</method> +<method name="getFrameAtTime" + return="android.graphics.Bitmap" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="release" + return="void" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="setDataSource" + return="void" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="path" type="java.lang.String"> +</parameter> +<exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException"> +</exception> +</method> +<method name="setDataSource" + return="void" + abstract="false" + native="true" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="fd" type="java.io.FileDescriptor"> +</parameter> +<parameter name="offset" type="long"> +</parameter> +<parameter name="length" type="long"> +</parameter> +<exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException"> +</exception> +</method> +<method name="setDataSource" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="fd" type="java.io.FileDescriptor"> +</parameter> +<exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException"> +</exception> +</method> +<method name="setDataSource" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="context" type="android.content.Context"> +</parameter> +<parameter name="uri" type="android.net.Uri"> +</parameter> +<exception name="IllegalArgumentException" type="java.lang.IllegalArgumentException"> +</exception> +<exception name="SecurityException" type="java.lang.SecurityException"> +</exception> +</method> +<field name="METADATA_KEY_ALBUM" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_ALBUMARTIST" + type="int" + transient="false" + volatile="false" + value="13" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_ARTIST" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_AUTHOR" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_CD_TRACK_NUMBER" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_COMPILATION" + type="int" + transient="false" + volatile="false" + value="15" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_COMPOSER" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_DATE" + type="int" + transient="false" + volatile="false" + value="5" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_DISC_NUMBER" + type="int" + transient="false" + volatile="false" + value="14" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_DURATION" + type="int" + transient="false" + volatile="false" + value="9" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_GENRE" + type="int" + transient="false" + volatile="false" + value="6" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_MIMETYPE" + type="int" + transient="false" + volatile="false" + value="12" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_NUM_TRACKS" + type="int" + transient="false" + volatile="false" + value="10" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_TITLE" + type="int" + transient="false" + volatile="false" + value="7" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_WRITER" + type="int" + transient="false" + volatile="false" + value="11" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="METADATA_KEY_YEAR" + type="int" + transient="false" + volatile="false" + value="8" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="OPTION_CLOSEST" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="OPTION_CLOSEST_SYNC" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="OPTION_NEXT_SYNC" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="OPTION_PREVIOUS_SYNC" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> <class name="MediaPlayer" extends="java.lang.Object" abstract="false" @@ -87195,6 +87767,17 @@ deprecated="not deprecated" visibility="public" > +<field name="AAC" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="AMR_NB" type="int" transient="false" @@ -87206,6 +87789,17 @@ visibility="public" > </field> +<field name="AMR_WB" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="DEFAULT" type="int" transient="false" @@ -87362,6 +87956,28 @@ deprecated="not deprecated" visibility="public" > +<field name="AMR_NB" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="AMR_WB" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="DEFAULT" type="int" transient="false" @@ -100173,6 +100789,66 @@ deprecated="not deprecated" visibility="public" > +<method name="disableForegroundDispatch" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="activity" type="android.app.Activity"> +</parameter> +</method> +<method name="disableForegroundNdefPush" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="activity" type="android.app.Activity"> +</parameter> +</method> +<method name="enableForegroundDispatch" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="activity" type="android.app.Activity"> +</parameter> +<parameter name="intent" type="android.app.PendingIntent"> +</parameter> +<parameter name="filters" type="android.content.IntentFilter[]"> +</parameter> +<parameter name="techLists" type="java.lang.String[][]"> +</parameter> +</method> +<method name="enableForegroundNdefPush" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="activity" type="android.app.Activity"> +</parameter> +<parameter name="msg" type="android.nfc.NdefMessage"> +</parameter> +</method> <method name="getDefaultAdapter" return="android.nfc.NfcAdapter" abstract="false" @@ -100183,6 +100859,19 @@ deprecated="not deprecated" visibility="public" > +<parameter name="context" type="android.content.Context"> +</parameter> +</method> +<method name="getDefaultAdapter" + return="android.nfc.NfcAdapter" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="deprecated" + visibility="public" +> </method> <method name="isEnabled" return="boolean" @@ -100195,6 +100884,17 @@ visibility="public" > </method> +<field name="ACTION_NDEF_DISCOVERED" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.nfc.action.NDEF_DISCOVERED"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="ACTION_TAG_DISCOVERED" type="java.lang.String" transient="false" @@ -100206,6 +100906,17 @@ visibility="public" > </field> +<field name="ACTION_TECHNOLOGY_DISCOVERED" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.nfc.action.TECH_DISCOVERED"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> <field name="EXTRA_ID" type="java.lang.String" transient="false" @@ -100228,7 +100939,1327 @@ visibility="public" > </field> +<field name="EXTRA_TAG" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.nfc.extra.TAG"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="NfcManager" + extends="java.lang.Object" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="getDefaultAdapter" + return="android.nfc.NfcAdapter" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +</class> +<class name="Tag" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<implements name="android.os.Parcelable"> +</implements> +<method name="createMockTag" + return="android.nfc.Tag" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="id" type="byte[]"> +</parameter> +<parameter name="techList" type="int[]"> +</parameter> +<parameter name="techListExtras" type="android.os.Bundle[]"> +</parameter> +</method> +<method name="describeContents" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getId" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getTechList" + return="java.lang.String[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="writeToParcel" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="dest" type="android.os.Parcel"> +</parameter> +<parameter name="flags" type="int"> +</parameter> +</method> +<field name="CREATOR" + type="android.os.Parcelable.Creator" + transient="false" + volatile="false" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="TagLostException" + extends="java.io.IOException" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<constructor name="TagLostException" + type="android.nfc.TagLostException" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</constructor> +<constructor name="TagLostException" + type="android.nfc.TagLostException" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="message" type="java.lang.String"> +</parameter> +</constructor> +</class> +</package> +<package name="android.nfc.tech" +> +<class name="BasicTagTechnology" + extends="java.lang.Object" + abstract="true" + static="false" + final="false" + deprecated="not deprecated" + visibility="" +> +<implements name="android.nfc.tech.TagTechnology"> +</implements> +<method name="close" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="connect" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="getTag" + return="android.nfc.Tag" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isConnected" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="reconnect" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<class name="IsoDep" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.IsoDep" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getHiLayerResponse" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getHistoricalBytes" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="setTimeout" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="timeout" type="int"> +</parameter> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<class name="MifareClassic" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="authenticateSectorWithKeyA" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="sectorIndex" type="int"> +</parameter> +<parameter name="key" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="authenticateSectorWithKeyB" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="sectorIndex" type="int"> +</parameter> +<parameter name="key" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="blockToSector" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +</method> +<method name="decrement" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<parameter name="value" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="get" + return="android.nfc.tech.MifareClassic" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getBlockCount" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getBlockCountInSector" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="sectorIndex" type="int"> +</parameter> +</method> +<method name="getSectorCount" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getSize" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="increment" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<parameter name="value" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="readBlock" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="restore" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="sectorToBlock" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="sectorIndex" type="int"> +</parameter> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="transfer" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="writeBlock" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="blockIndex" type="int"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<field name="BLOCK_SIZE" + type="int" + transient="false" + volatile="false" + value="16" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="KEY_DEFAULT" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="KEY_MIFARE_APPLICATION_DIRECTORY" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="KEY_NFC_FORUM" + type="byte[]" + transient="false" + volatile="false" + value="null" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SIZE_1K" + type="int" + transient="false" + volatile="false" + value="1024" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SIZE_2K" + type="int" + transient="false" + volatile="false" + value="2048" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SIZE_4K" + type="int" + transient="false" + volatile="false" + value="4096" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="SIZE_MINI" + type="int" + transient="false" + volatile="false" + value="320" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_CLASSIC" + type="int" + transient="false" + volatile="false" + value="0" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_PLUS" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_PRO" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_UNKNOWN" + type="int" + transient="false" + volatile="false" + value="-1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="MifareUltralight" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.MifareUltralight" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="readPages" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pageOffset" type="int"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="writePage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="pageOffset" type="int"> +</parameter> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<field name="PAGE_SIZE" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_ULTRALIGHT" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_ULTRALIGHT_C" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="TYPE_UNKNOWN" + type="int" + transient="false" + volatile="false" + value="-1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> </class> +<class name="Ndef" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="canMakeReadonly" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="get" + return="android.nfc.tech.Ndef" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getCachedNdefMessage" + return="android.nfc.NdefMessage" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getMaxSize" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getNdefMessage" + return="android.nfc.NdefMessage" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="FormatException" type="android.nfc.FormatException"> +</exception> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="getType" + return="int" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="isWritable" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="makeReadonly" + return="boolean" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="writeNdefMessage" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="msg" type="android.nfc.NdefMessage"> +</parameter> +<exception name="FormatException" type="android.nfc.FormatException"> +</exception> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<field name="MIFARE_CLASSIC" + type="int" + transient="false" + volatile="false" + value="101" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NFC_FORUM_TYPE_1" + type="int" + transient="false" + volatile="false" + value="1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NFC_FORUM_TYPE_2" + type="int" + transient="false" + volatile="false" + value="2" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NFC_FORUM_TYPE_3" + type="int" + transient="false" + volatile="false" + value="3" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="NFC_FORUM_TYPE_4" + type="int" + transient="false" + volatile="false" + value="4" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="OTHER" + type="int" + transient="false" + volatile="false" + value="-1" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> +<class name="NdefFormatable" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="format" + return="void" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="firstMessage" type="android.nfc.NdefMessage"> +</parameter> +<exception name="FormatException" type="android.nfc.FormatException"> +</exception> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="get" + return="android.nfc.tech.NdefFormatable" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +</class> +<class name="NfcA" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.NfcA" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getAtqa" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getSak" + return="short" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<class name="NfcB" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.NfcB" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getApplicationData" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getProtocolInfo" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<class name="NfcF" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.NfcF" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getManufacturer" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getSystemCode" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<class name="NfcV" + extends="android.nfc.tech.BasicTagTechnology" + abstract="false" + static="false" + final="true" + deprecated="not deprecated" + visibility="public" +> +<method name="get" + return="android.nfc.tech.NfcV" + abstract="false" + native="false" + synchronized="false" + static="true" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="tag" type="android.nfc.Tag"> +</parameter> +</method> +<method name="getDsfId" + return="byte" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="getResponseFlags" + return="byte" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="transceive" + return="byte[]" + abstract="false" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<parameter name="data" type="byte[]"> +</parameter> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</class> +<interface name="TagTechnology" + abstract="true" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<implements name="java.io.Closeable"> +</implements> +<method name="close" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="connect" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +<method name="getTag" + return="android.nfc.Tag" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +</method> +<method name="reconnect" + return="void" + abstract="true" + native="false" + synchronized="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<exception name="IOException" type="java.io.IOException"> +</exception> +</method> +</interface> </package> <package name="android.opengl" > @@ -120245,6 +122276,17 @@ visibility="public" > </field> +<field name="GINGERBREAD_MR1" + type="int" + transient="false" + volatile="false" + value="10" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> </class> <class name="Bundle" extends="java.lang.Object" @@ -147050,6 +149092,92 @@ > </field> </class> +<class name="RecognizerResultsIntent" + extends="java.lang.Object" + abstract="false" + static="false" + final="false" + deprecated="not deprecated" + visibility="public" +> +<field name="ACTION_VOICE_SEARCH_RESULTS" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.action.VOICE_SEARCH_RESULTS"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="EXTRA_VOICE_SEARCH_RESULT_HTML" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.extras.VOICE_SEARCH_RESULT_HTML"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.extras.VOICE_SEARCH_RESULT_HTML_BASE_URLS"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.extras.EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="EXTRA_VOICE_SEARCH_RESULT_STRINGS" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.extras.VOICE_SEARCH_RESULT_STRINGS"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="EXTRA_VOICE_SEARCH_RESULT_URLS" + type="java.lang.String" + transient="false" + volatile="false" + value=""android.speech.extras.VOICE_SEARCH_RESULT_URLS"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +<field name="URI_SCHEME_INLINE" + type="java.lang.String" + transient="false" + volatile="false" + value=""inline"" + static="true" + final="true" + deprecated="not deprecated" + visibility="public" +> +</field> +</class> <class name="SpeechRecognizer" extends="java.lang.Object" abstract="false" diff --git a/core/java/android/content/res/CompatibilityInfo.java b/core/java/android/content/res/CompatibilityInfo.java index 6baf1c2..e403ac2 100644 --- a/core/java/android/content/res/CompatibilityInfo.java +++ b/core/java/android/content/res/CompatibilityInfo.java @@ -141,10 +141,16 @@ public class CompatibilityInfo { appFlags = appInfo.flags; if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) { - mCompatibilityFlags |= LARGE_SCREENS | CONFIGURED_LARGE_SCREENS; + // Saying you support large screens also implies you support xlarge + // screens; there is no compatibility mode for a large app on an + // xlarge screen. + mCompatibilityFlags |= LARGE_SCREENS | CONFIGURED_LARGE_SCREENS + | XLARGE_SCREENS | CONFIGURED_XLARGE_SCREENS + | EXPANDABLE | CONFIGURED_EXPANDABLE; } if ((appInfo.flags & ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS) != 0) { - mCompatibilityFlags |= XLARGE_SCREENS | CONFIGURED_XLARGE_SCREENS; + mCompatibilityFlags |= XLARGE_SCREENS | CONFIGURED_XLARGE_SCREENS + | EXPANDABLE | CONFIGURED_EXPANDABLE; } if ((appInfo.flags & ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) { mCompatibilityFlags |= EXPANDABLE | CONFIGURED_EXPANDABLE; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f111f98..f9629bd 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -10940,7 +10940,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility public void dispatchSystemUiVisibilityChanged(int visibility) { if (mOnSystemUiVisibilityChangeListener != null) { mOnSystemUiVisibilityChangeListener.onSystemUiVisibilityChange( - visibility & ~PUBLIC_STATUS_BAR_VISIBILITY_MASK); + visibility & PUBLIC_STATUS_BAR_VISIBILITY_MASK); } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index a9abb65..fcfcc03 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -6625,15 +6625,10 @@ public class WebView extends AbsoluteLayout * @param y New y position of the WebTextView in view coordinates */ /* package */ void scrollFocusedTextInputY(int y) { - if (!inEditingMode()) { + if (!inEditingMode() || mWebViewCore == null) { return; } - int xPos = viewToContentX((mWebTextView.getLeft() + mWebTextView.getRight()) / 2); - int yPos = viewToContentY((mWebTextView.getTop() + mWebTextView.getBottom()) / 2); - int layer = nativeScrollableLayer(xPos, yPos, null, null); - if (layer != 0) { - nativeScrollLayer(layer, 0, viewToContentDimension(y)); - } + mWebViewCore.sendMessage(EventHub.SCROLL_TEXT_INPUT, 0, viewToContentDimension(y)); } /** @@ -7980,18 +7975,15 @@ public class WebView extends AbsoluteLayout * @param node Pointer to the node touched. * @param x x-position of the touch. * @param y y-position of the touch. - * @param scrollY Only used when touching on a textarea. Otherwise, use -1. - * Tells how much the textarea is scrolled. */ private void sendMotionUp(int touchGeneration, - int frame, int node, int x, int y, int scrollY) { + int frame, int node, int x, int y) { WebViewCore.TouchUpData touchUpData = new WebViewCore.TouchUpData(); touchUpData.mMoveGeneration = touchGeneration; touchUpData.mFrame = frame; touchUpData.mNode = node; touchUpData.mX = x; touchUpData.mY = y; - touchUpData.mScrollY = scrollY; mWebViewCore.sendMessage(EventHub.TOUCH_UP, touchUpData); } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 3bde000..b949a41 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -559,7 +559,7 @@ final class WebViewCore { private native String nativeRetrieveImageSource(int x, int y); private native void nativeTouchUp(int touchGeneration, - int framePtr, int nodePtr, int x, int y, int scrollY); + int framePtr, int nodePtr, int x, int y); private native boolean nativeHandleTouchEvent(int action, int[] idArray, int[] xArray, int[] yArray, int count, int metaState); @@ -777,8 +777,6 @@ final class WebViewCore { int mNode; int mX; int mY; - // Used in the case of a scrolled textarea - int mScrollY; } static class TouchHighlightData { @@ -1086,8 +1084,13 @@ final class WebViewCore { break; case SCROLL_TEXT_INPUT: - nativeScrollFocusedTextInput( - ((Float) msg.obj).floatValue(), msg.arg1); + float xPercent; + if (msg.obj == null) { + xPercent = 0f; + } else { + xPercent = ((Float) msg.obj).floatValue(); + } + nativeScrollFocusedTextInput(xPercent, msg.arg2); break; case LOAD_URL: { @@ -1307,8 +1310,7 @@ final class WebViewCore { TouchUpData touchUpData = (TouchUpData) msg.obj; nativeTouchUp(touchUpData.mMoveGeneration, touchUpData.mFrame, touchUpData.mNode, - touchUpData.mX, touchUpData.mY, - touchUpData.mScrollY); + touchUpData.mX, touchUpData.mY); break; case TOUCH_EVENT: { diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index 1a4ff29..22f6f4e 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -66,6 +66,10 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { private final Rect mBounds = new Rect(); + // When positive, the widths and heights of tabs will be imposed so that they fit in parent + private int mImposedTabsHeight = -1; + private int[] mImposedTabWidths; + public TabWidget(Context context) { this(context, null); } @@ -150,52 +154,62 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { setOnFocusChangeListener(this); } - /** - * {@inheritDoc} - */ + @Override + void measureChildBeforeLayout(View child, int childIndex, + int widthMeasureSpec, int totalWidth, + int heightMeasureSpec, int totalHeight) { + + if (mImposedTabsHeight >= 0) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec( + totalWidth + mImposedTabWidths[childIndex], MeasureSpec.EXACTLY); + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mImposedTabsHeight, + MeasureSpec.EXACTLY); + } + + super.measureChildBeforeLayout(child, childIndex, + widthMeasureSpec, totalWidth, heightMeasureSpec, totalHeight); + } + @Override void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { - // First measure with no constraint + // First, measure with no constraint final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); super.measureHorizontal(unspecifiedWidth, heightMeasureSpec); + mImposedTabsHeight = -1; - final int count = getChildCount(); - int totalWidth = 0; - int totalCount = 0; - for (int i = 0; i < count; i++) { - final View child = getChildAt(i); - if (child.getVisibility() == GONE) { - continue; - } - final int childWidth = child.getMeasuredWidth(); - totalWidth += childWidth; - totalCount++; - } + int extraWidth = getMeasuredWidth() - MeasureSpec.getSize(widthMeasureSpec); + if (extraWidth > 0) { + final int count = getChildCount(); - final int width = MeasureSpec.getSize(widthMeasureSpec); - if (totalWidth > width && totalCount > 0) { - int extraWidth = totalWidth - width; + int childCount = 0; for (int i = 0; i < count; i++) { final View child = getChildAt(i); - if (child.getVisibility() == GONE) { - continue; - } - final int childWidth = child.getMeasuredWidth(); - final int delta = extraWidth / totalCount; - final int tabWidth = Math.max(0, childWidth - delta); - - final int tabWidthMeasureSpec = MeasureSpec.makeMeasureSpec( - tabWidth, MeasureSpec.EXACTLY); - final int tabHeightMeasureSpec = MeasureSpec.makeMeasureSpec( - child.getMeasuredHeight(), MeasureSpec.EXACTLY); - - child.measure(tabWidthMeasureSpec, tabHeightMeasureSpec); + if (child.getVisibility() == GONE) continue; + childCount++; + } - // Make sure the extra width is evenly distributed, avoiding int division remainder - extraWidth -= delta; - totalCount--; + if (childCount > 0) { + if (mImposedTabWidths == null || mImposedTabWidths.length != count) { + mImposedTabWidths = new int[count]; + } + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + if (child.getVisibility() == GONE) continue; + final int childWidth = child.getMeasuredWidth(); + final int delta = extraWidth / childCount; + final int newWidth = Math.max(0, childWidth - delta); + mImposedTabWidths[i] = newWidth; + // Make sure the extra width is evenly distributed, no int division remainder + extraWidth -= childWidth - newWidth; // delta may have been clamped + childCount--; + mImposedTabsHeight = Math.max(mImposedTabsHeight, child.getMeasuredHeight()); + } } - setMeasuredDimension(width, getMeasuredHeight()); + } + + // Measure again, this time with imposed tab widths and respecting initial spec request + if (mImposedTabsHeight >= 0 || unspecifiedWidth != widthMeasureSpec) { + super.measureHorizontal(widthMeasureSpec, heightMeasureSpec); } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index eee042a..8cb725a 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -3489,8 +3489,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener com.android.internal.R.layout.textview_hint, null); final float scale = getResources().getDisplayMetrics().density; - mPopup = new ErrorPopup(err, (int) (200 * scale + 0.5f), - (int) (50 * scale + 0.5f)); + mPopup = new ErrorPopup(err, (int) (200 * scale + 0.5f), (int) (50 * scale + 0.5f)); mPopup.setFocusable(false); // The user is entering text, so the input method is needed. We // don't want the popup to be displayed on top of it. @@ -3514,6 +3513,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener ErrorPopup(TextView v, int width, int height) { super(v, width, height); mView = v; + // Make sure the TextView has a background set as it will be used the first time it is + // shown and positionned. Initialized with below background, which should have + // dimensions identical to the above version for this to work (and is more likely). + mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId, + com.android.internal.R.styleable.Theme_errorMessageBackground); + mView.setBackgroundResource(mPopupInlineErrorBackgroundId); } void fixDirection(boolean above) { @@ -3521,18 +3526,21 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (above) { mPopupInlineErrorAboveBackgroundId = - getResourceId(mPopupInlineErrorAboveBackgroundId, com.android.internal.R.styleable.Theme_errorMessageAboveBackground); + getResourceId(mPopupInlineErrorAboveBackgroundId, + com.android.internal.R.styleable.Theme_errorMessageAboveBackground); } else { - mPopupInlineErrorBackgroundId = - getResourceId(mPopupInlineErrorBackgroundId, com.android.internal.R.styleable.Theme_errorMessageBackground); + mPopupInlineErrorBackgroundId = getResourceId(mPopupInlineErrorBackgroundId, + com.android.internal.R.styleable.Theme_errorMessageBackground); } - mView.setBackgroundResource(above ? mPopupInlineErrorAboveBackgroundId : mPopupInlineErrorBackgroundId); + mView.setBackgroundResource(above ? mPopupInlineErrorAboveBackgroundId : + mPopupInlineErrorBackgroundId); } private int getResourceId(int currentId, int index) { if (currentId == 0) { - TypedArray styledAttributes = mView.getContext().obtainStyledAttributes(R.styleable.Theme); + TypedArray styledAttributes = mView.getContext().obtainStyledAttributes( + R.styleable.Theme); currentId = styledAttributes.getResourceId(index, 0); styledAttributes.recycle(); } @@ -3562,9 +3570,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final float scale = getResources().getDisplayMetrics().density; final Drawables dr = mDrawables; - return getWidth() - mPopup.getWidth() - - getPaddingRight() - - (dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f); + return getWidth() - mPopup.getWidth() - getPaddingRight() - + (dr != null ? dr.mDrawableSizeRight : 0) / 2 + (int) (25 * scale + 0.5f); } /** @@ -3576,20 +3583,20 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * Compound, not extended, because the icon is not clipped * if the text height is smaller. */ - int vspace = mBottom - mTop - - getCompoundPaddingBottom() - getCompoundPaddingTop(); + final int compoundPaddingTop = getCompoundPaddingTop(); + int vspace = mBottom - mTop - getCompoundPaddingBottom() - compoundPaddingTop; final Drawables dr = mDrawables; - int icontop = getCompoundPaddingTop() - + (vspace - (dr != null ? dr.mDrawableHeightRight : 0)) / 2; + int icontop = compoundPaddingTop + + (vspace - (dr != null ? dr.mDrawableHeightRight : 0)) / 2; /* * The "2" is the distance between the point and the top edge * of the background. */ - - return icontop + (dr != null ? dr.mDrawableHeightRight : 0) - - getHeight() - 2; + final float scale = getResources().getDisplayMetrics().density; + return icontop + (dr != null ? dr.mDrawableHeightRight : 0) - getHeight() - + (int) (2 * scale + 0.5f); } private void hideError() { @@ -5772,11 +5779,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int want = width - getCompoundPaddingLeft() - getCompoundPaddingRight(); int unpaddedWidth = want; - int hintWant = want; - if (mHorizontallyScrolling) - want = VERY_WIDE; + if (mHorizontallyScrolling) want = VERY_WIDE; + int hintWant = want; int hintWidth = mHintLayout == null ? hintWant : mHintLayout.getWidth(); if (mLayout == null) { @@ -7358,7 +7364,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener stopSelectionActionMode(); boolean selectAllGotFocus = mSelectAllOnFocus && mTouchFocusSelected; - if (hasInsertionController() && !selectAllGotFocus) { + if (hasInsertionController() && !selectAllGotFocus && mText.length() > 0) { getInsertionController().show(); } } @@ -8881,6 +8887,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener mLastParentX = coords[0]; mLastParentY = coords[1]; mIsDragging = true; + if (mIsInsertionHandle) { + mTouchTimer = SystemClock.uptimeMillis(); + } break; } @@ -9029,6 +9038,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (offset != previousOffset) { updateOffset(handle, offset); + removePastePopupCallback(); } hideDelayed(); } diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index 4b37beb..18d1825 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -132,12 +132,8 @@ public class TimePicker extends FrameLayout { mHourSpinner.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() { public void onValueChange(NumberPicker spinner, int oldVal, int newVal) { if (!is24HourView()) { - int minValue = mHourSpinner.getMinValue(); - int maxValue = mHourSpinner.getMaxValue(); - // toggle AM/PM if the spinner has wrapped and not in 24 - // format - if ((oldVal == maxValue && newVal == minValue) - || (oldVal == minValue && newVal == maxValue)) { + if ((oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) + || (oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1)) { mIsAm = !mIsAm; updateAmPmControl(); } @@ -163,21 +159,19 @@ public class TimePicker extends FrameLayout { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); if (oldVal == maxValue && newVal == minValue) { - int currentHour = mHourSpinner.getValue(); - // toggle AM/PM if the spinner is about to wrap - if (!is24HourView() && currentHour == mHourSpinner.getMaxValue()) { + int newHour = mHourSpinner.getValue() + 1; + if (!is24HourView() && newHour == HOURS_IN_HALF_DAY) { mIsAm = !mIsAm; updateAmPmControl(); } - mHourSpinner.setValue(currentHour + 1); + mHourSpinner.setValue(newHour); } else if (oldVal == minValue && newVal == maxValue) { - int currentHour = mHourSpinner.getValue(); - // toggle AM/PM if the spinner is about to wrap - if (!is24HourView() && currentHour == mHourSpinner.getMinValue()) { + int newHour = mHourSpinner.getValue() - 1; + if (!is24HourView() && newHour == HOURS_IN_HALF_DAY - 1) { mIsAm = !mIsAm; updateAmPmControl(); } - mHourSpinner.setValue(currentHour - 1); + mHourSpinner.setValue(newHour); } onTimeChanged(); } @@ -330,10 +324,12 @@ public class TimePicker extends FrameLayout { */ public Integer getCurrentHour() { int currentHour = mHourSpinner.getValue(); - if (is24HourView() || mIsAm) { + if (is24HourView()) { return currentHour; + } else if (mIsAm) { + return currentHour % HOURS_IN_HALF_DAY; } else { - return (currentHour == HOURS_IN_HALF_DAY) ? 0 : currentHour + HOURS_IN_HALF_DAY; + return (currentHour % HOURS_IN_HALF_DAY) + HOURS_IN_HALF_DAY; } } @@ -347,14 +343,16 @@ public class TimePicker extends FrameLayout { } if (!is24HourView()) { // convert [0,23] ordinal to wall clock display - if (currentHour > HOURS_IN_HALF_DAY) { - currentHour -= HOURS_IN_HALF_DAY; + if (currentHour >= HOURS_IN_HALF_DAY) { mIsAm = false; + if (currentHour > HOURS_IN_HALF_DAY) { + currentHour = currentHour - HOURS_IN_HALF_DAY; + } } else { + mIsAm = true; if (currentHour == 0) { currentHour = HOURS_IN_HALF_DAY; } - mIsAm = true; } updateAmPmControl(); } diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java index b1b5d71..471a5a9 100644 --- a/core/java/com/android/internal/app/ActionBarImpl.java +++ b/core/java/com/android/internal/app/ActionBarImpl.java @@ -480,12 +480,12 @@ public class ActionBarImpl extends ActionBar { @Override public void show() { - if (mContainerView.getVisibility() == View.VISIBLE) { - return; - } if (mCurrentAnim != null) { mCurrentAnim.end(); } + if (mContainerView.getVisibility() == View.VISIBLE) { + return; + } mContainerView.setVisibility(View.VISIBLE); mContainerView.setAlpha(0); AnimatorSet anim = new AnimatorSet(); diff --git a/core/res/res/drawable-hdpi/indicator_input_error.png b/core/res/res/drawable-hdpi/indicator_input_error.png Binary files differindex 213976c..8785376 100644 --- a/core/res/res/drawable-hdpi/indicator_input_error.png +++ b/core/res/res/drawable-hdpi/indicator_input_error.png diff --git a/core/res/res/drawable-hdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-hdpi/popup_inline_error_above_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..61ea2b0 --- /dev/null +++ b/core/res/res/drawable-hdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-hdpi/popup_inline_error_above_holo_light.9.png Binary files differnew file mode 100644 index 0000000..83b2bce --- /dev/null +++ b/core/res/res/drawable-hdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-hdpi/popup_inline_error_holo_dark.9.png Binary files differnew file mode 100644 index 0000000..daa47b7 --- /dev/null +++ b/core/res/res/drawable-hdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-hdpi/popup_inline_error_holo_light.9.png Binary files differnew file mode 100644 index 0000000..6c45935 --- /dev/null +++ b/core/res/res/drawable-hdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/indicator_input_error.png b/core/res/res/drawable-mdpi/indicator_input_error.png Binary files differindex ee60165..775e417 100755 --- a/core/res/res/drawable-mdpi/indicator_input_error.png +++ b/core/res/res/drawable-mdpi/indicator_input_error.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png Binary files differindex dd4af6d..c03e658 100644 --- a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png Binary files differindex 8925112..19b153b 100644 --- a/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png +++ b/core/res/res/drawable-mdpi/popup_inline_error_above_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png b/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png Binary files differindex 66c2c09..4092728 100755 --- a/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/popup_inline_error_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png b/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png Binary files differindex c5113f2..67a2cd4 100755 --- a/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png +++ b/core/res/res/drawable-mdpi/popup_inline_error_holo_light.9.png diff --git a/core/res/res/layout/textview_hint.xml b/core/res/res/layout/textview_hint.xml index f9c4406..b94dfc9 100644 --- a/core/res/res/layout/textview_hint.xml +++ b/core/res/res/layout/textview_hint.xml @@ -18,5 +18,5 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:textAppearance="?android:attr/textAppearanceSmall" - android:textColor="@color/primary_text_light" + android:textColor="?android:attr/textColorPrimaryInverse" /> diff --git a/core/res/res/raw/fallbackring.ogg b/core/res/res/raw/fallbackring.ogg Binary files differindex 0cbf55d..a9adeb8 100644..100755 --- a/core/res/res/raw/fallbackring.ogg +++ b/core/res/res/raw/fallbackring.ogg diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 4c659d4..1fc2722 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -32,6 +32,17 @@ import android.os.Message; * updated to contain the most recent image from the image stream. This may cause some frames of * the stream to be skipped. * + * <p>When sampling from the texture one should first transform the texture coordinates using the + * matrix queried via {@link #getTransformMatrix}. The transform matrix may change each time {@link + * #updateTexImage} is called, so it should be re-queried each time the texture image is updated. + * This matrix transforms traditional 2D OpenGL ES texture coordinate column vectors of the form (s, + * t, 0, 1) where s and t are on the inclusive interval [0, 1] to the proper sampling location in + * the streamed texture. This transform compensates for any properties of the image stream source + * that cause it to appear different from a traditional OpenGL ES texture. For example, sampling + * from the bottom left corner of the image can be accomplished by transforming the column vector + * (0, 0, 0, 1) using the queried matrix, while sampling from the top right corner of the image can + * be done by transforming (1, 1, 0, 1). + * * <p>The texture object uses the GL_TEXTURE_EXTERNAL_OES texture target, which is defined by the * OES_EGL_image_external OpenGL ES extension. This limits how the texture may be used. * diff --git a/opengl/libagl/egl.cpp b/opengl/libagl/egl.cpp index 7ac6f92..a1cb23a 100644 --- a/opengl/libagl/egl.cpp +++ b/opengl/libagl/egl.cpp @@ -82,6 +82,11 @@ static GLint getError() { if (ggl_unlikely(gEGLErrorKey == -1)) return EGL_SUCCESS; GLint error = (GLint)pthread_getspecific(gEGLErrorKey); + if (error == 0) { + // The TLS key has been created by another thread, but the value for + // this thread has not been initialized. + return EGL_SUCCESS; + } pthread_setspecific(gEGLErrorKey, (void*)EGL_SUCCESS); return error; } diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel_title.xml b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel_title.xml index 3e785c6..2d34635 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel_title.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_notification_panel_title.xml @@ -119,7 +119,7 @@ android:layout_width="match_parent" android:layout_alignParentRight="true" android:layout_above="@id/title_divider" - android:layout_marginRight="32dip" + android:layout_marginRight="6dip" android:layout_marginBottom="8dip" > <TextView android:id="@+id/time_bg" @@ -127,14 +127,14 @@ android:layout_height="wrap_content" android:gravity="right" android:singleLine="true" - android:textSize="72sp" + android:textSize="78sp" android:textColor="#999999" /> <TextView android:id="@+id/time_fg" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:singleLine="true" - android:textSize="72sp" + android:textSize="78sp" android:textColor="#666666" /> </com.android.systemui.statusbar.tablet.HoloClock> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java index 502e0fe..0c2909a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/InputMethodsPanel.java @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.tablet; +import com.android.systemui.R; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -23,18 +25,16 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.IBinder; -import android.os.RemoteException; import android.provider.Settings; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; -import android.util.Slog; import android.view.View; -import android.view.View.OnClickListener; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RadioButton; @@ -48,10 +48,8 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import com.android.internal.statusbar.IStatusBarService; -import com.android.systemui.R; - -public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, OnClickListener { +public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, View.OnClickListener, + CompoundButton.OnCheckedChangeListener { private static final boolean DEBUG = TabletStatusBar.DEBUG; private static final String TAG = "InputMethodsPanel"; @@ -144,8 +142,8 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O mInputMethodMenuList = (LinearLayout) findViewById(R.id.input_method_menu_list); mHardKeyboardSection = (LinearLayout) findViewById(R.id.hard_keyboard_section); mHardKeyboardSwitch = (Switch) findViewById(R.id.hard_keyboard_switch); - mHardKeyboardSwitch.setOnClickListener(this); - mConfigureImeShortcut = ((View) findViewById(R.id.ime_settings_shortcut)); + mHardKeyboardSwitch.setOnCheckedChangeListener(this); + mConfigureImeShortcut = findViewById(R.id.ime_settings_shortcut); mConfigureImeShortcut.setOnClickListener(this); // TODO: If configurations for IME are not changed, do not update // by checking onConfigurationChanged. @@ -179,9 +177,17 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O if (view == mConfigureImeShortcut) { showConfigureInputMethods(); onFinishPanel(true); - } else if (view == mHardKeyboardSwitch) { - mHardKeyboardEnabled = mHardKeyboardSwitch.isChecked(); - mHardKeyboardEnabledChangeListener.onHardKeyboardEnabledChange(mHardKeyboardEnabled); + } + } + + @Override + public void onCheckedChanged(CompoundButton button, boolean checked) { + if (button == mHardKeyboardSwitch) { + if (mHardKeyboardEnabled != checked) { + mHardKeyboardEnabled = checked; + if (mHardKeyboardEnabledChangeListener != null) + mHardKeyboardEnabledChangeListener.onHardKeyboardEnabledChange(checked); + } } } @@ -247,9 +253,9 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O subtypeView, new Pair<InputMethodInfo, InputMethodSubtype> (imi, subtype)); subtypeView.setOnClickListener(new View.OnClickListener() { @Override - public void onClick(View view) { + public void onClick(View v) { Pair<InputMethodInfo, InputMethodSubtype> imiAndSubtype = - updateRadioButtonsByView(view); + updateRadioButtonsByView(v); onFinishPanel(false); setInputMethodAndSubtype(imiAndSubtype.first, imiAndSubtype.second); } @@ -310,7 +316,9 @@ public class InputMethodsPanel extends LinearLayout implements StatusBarPanel, O private void updateHardKeyboardSection() { if (mHardKeyboardAvailable) { mHardKeyboardSection.setVisibility(View.VISIBLE); - mHardKeyboardSwitch.setChecked(mHardKeyboardEnabled); + if (mHardKeyboardSwitch.isChecked() != mHardKeyboardEnabled) { + mHardKeyboardSwitch.setChecked(mHardKeyboardEnabled); + } } else { mHardKeyboardSection.setVisibility(View.GONE); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index 22fed63..2ec2af0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -170,7 +170,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, setContentFrameVisible(n > 0, false); } else if (mSettingsView == null) { // we're looking at the notifications; time to maybe make some changes - if (mNotificationCount != n) { + if ((mNotificationCount > 0) != (n > 0)) { setContentFrameVisible(n > 0, true); } } diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter.java index c7968a4..8d7f016 100644 --- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter.java +++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/DelegateMethodAdapter.java @@ -27,6 +27,8 @@ import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; +import java.util.ArrayList; + /** * This method adapter rewrites a method by discarding the original code and generating * a call to a delegate. Original annotations are passed along unchanged. @@ -124,7 +126,7 @@ class DelegateMethodAdapter implements MethodVisitor { public void generateCode() { /* * The goal is to generate a call to a static delegate method. - * If this method is not-static, the first parameter will be this. + * If this method is non-static, the first parameter will be 'this'. * All the parameters must be passed and then the eventual return type returned. * * Example, let's say we have a method such as @@ -133,9 +135,19 @@ class DelegateMethodAdapter implements MethodVisitor { * We'll want to create a body that calls a delegate method like this: * TheClass_Delegate.method_1(this, a, b, c); * + * If the method is non-static and the class name is an inner class (e.g. has $ in its + * last segment), we want to push the 'this' of the outer class first: + * OuterClass_InnerClass_Delegate.method_1( + * OuterClass.this, + * OuterClass$InnerClass.this, + * a, b, c); + * + * Only one level of inner class is supported right now, for simplicity and because + * we don't need more. + * * The generated class name is the current class name with "_Delegate" appended to it. * One thing to realize is that we don't care about generics -- since generic types - * are erased at runtime, they have no influence on the method being called. + * are erased at runtime, they have no influence on the method name being called. */ // Add our annotation @@ -151,34 +163,61 @@ class DelegateMethodAdapter implements MethodVisitor { mVisitCodeCalled = true; } - int numVars = 0; + ArrayList<Type> paramTypes = new ArrayList<Type>(); + String delegateClassName = mClassName + DELEGATE_SUFFIX; + boolean pushedArg0 = false; + int maxStack = 0; - // Push "this" for an instance method, which is always ALOAD 0 + // For an instance method (e.g. non-static), push the 'this' preceded + // by the 'this' of any outer class, if any. if (!mIsStatic) { - mParentVisitor.visitVarInsn(Opcodes.ALOAD, numVars++); + // Check if the last segment of the class name has inner an class. + // Right now we only support one level of inner classes. + int slash = mClassName.lastIndexOf('/'); + int dol = mClassName.lastIndexOf('$'); + if (dol != -1 && dol > slash && dol == mClassName.indexOf('$')) { + String outerClass = mClassName.substring(0, dol); + Type outerType = Type.getObjectType(outerClass); + + // Change a delegate class name to "com/foo/Outer_Inner_Delegate" + delegateClassName = delegateClassName.replace('$', '_'); + + // The first-level inner class has a package-protected member called 'this$0' + // that points to the outer class. + + // Push this.getField("this$0") on the call stack. + mParentVisitor.visitVarInsn(Opcodes.ALOAD, 0); // var 0 = this + mParentVisitor.visitFieldInsn(Opcodes.GETFIELD, + mClassName, // class where the field is defined + "this$0", // field name + outerType.getDescriptor()); // type of the field + maxStack++; + paramTypes.add(outerType); + } + + // Push "this" for the instance method, which is always ALOAD 0 + mParentVisitor.visitVarInsn(Opcodes.ALOAD, 0); + maxStack++; + pushedArg0 = true; + paramTypes.add(Type.getObjectType(mClassName)); } - // Push all other arguments + // Push all other arguments. Start at arg 1 if we already pushed 'this' above. Type[] argTypes = Type.getArgumentTypes(mDesc); + int maxLocals = pushedArg0 ? 1 : 0; for (Type t : argTypes) { int size = t.getSize(); - mParentVisitor.visitVarInsn(t.getOpcode(Opcodes.ILOAD), numVars); - numVars += size; - } - - // Construct the descriptor of the delegate. For a static method, it's the same - // however for an instance method we need to pass the 'this' reference first - String desc = mDesc; - if (!mIsStatic) { - Type[] argTypes2 = new Type[argTypes.length + 1]; - - argTypes2[0] = Type.getObjectType(mClassName); - System.arraycopy(argTypes, 0, argTypes2, 1, argTypes.length); - - desc = Type.getMethodDescriptor(Type.getReturnType(mDesc), argTypes2); + mParentVisitor.visitVarInsn(t.getOpcode(Opcodes.ILOAD), maxLocals); + maxLocals += size; + maxStack += size; + paramTypes.add(t); } - String delegateClassName = mClassName + DELEGATE_SUFFIX; + // Construct the descriptor of the delegate based on the parameters + // we pushed on the call stack. The return type remains unchanged. + String desc = Type.getMethodDescriptor( + Type.getReturnType(mDesc), + paramTypes.toArray(new Type[paramTypes.size()])); // Invoke the static delegate mParentVisitor.visitMethodInsn(Opcodes.INVOKESTATIC, @@ -189,7 +228,7 @@ class DelegateMethodAdapter implements MethodVisitor { Type returnType = Type.getReturnType(mDesc); mParentVisitor.visitInsn(returnType.getOpcode(Opcodes.IRETURN)); - mParentVisitor.visitMaxs(numVars, numVars); + mParentVisitor.visitMaxs(maxStack, maxLocals); mParentVisitor.visitEnd(); // For debugging now. Maybe we should collect these and store them in diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java index 7d80796..e8b3ea8 100644 --- a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/DelegateClassAdapterTest.java @@ -24,25 +24,38 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.android.tools.layoutlib.create.dataclass.ClassWithNative; +import com.android.tools.layoutlib.create.dataclass.OuterClass; +import com.android.tools.layoutlib.create.dataclass.OuterClass.InnerClass; + import org.junit.Before; import org.junit.Test; import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassWriter; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.lang.annotation.Annotation; +import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; public class DelegateClassAdapterTest { private MockLog mLog; - private static final String CLASS_NAME = - DelegateClassAdapterTest.class.getCanonicalName() + "$" + - ClassWithNative.class.getSimpleName(); + private static final String NATIVE_CLASS_NAME = ClassWithNative.class.getCanonicalName(); + private static final String OUTER_CLASS_NAME = OuterClass.class.getCanonicalName(); + private static final String INNER_CLASS_NAME = OuterClass.class.getCanonicalName() + "$" + + InnerClass.class.getSimpleName(); @Before public void setUp() throws Exception { @@ -55,11 +68,11 @@ public class DelegateClassAdapterTest { */ @SuppressWarnings("unchecked") @Test - public void testNoOp() throws Exception { + public void testNoOp() throws Throwable { // create an instance of the class that will be modified // (load the class in a distinct class loader so that we can trash its definition later) ClassLoader cl1 = new ClassLoader(this.getClass().getClassLoader()) { }; - Class<ClassWithNative> clazz1 = (Class<ClassWithNative>) cl1.loadClass(CLASS_NAME); + Class<ClassWithNative> clazz1 = (Class<ClassWithNative>) cl1.loadClass(NATIVE_CLASS_NAME); ClassWithNative instance1 = clazz1.newInstance(); assertEquals(42, instance1.add(20, 22)); try { @@ -73,42 +86,47 @@ public class DelegateClassAdapterTest { ClassWriter cw = new ClassWriter(0 /*flags*/); HashSet<String> delegateMethods = new HashSet<String>(); - String internalClassName = CLASS_NAME.replace('.', '/'); + String internalClassName = NATIVE_CLASS_NAME.replace('.', '/'); DelegateClassAdapter cv = new DelegateClassAdapter( mLog, cw, internalClassName, delegateMethods); - ClassReader cr = new ClassReader(CLASS_NAME); + ClassReader cr = new ClassReader(NATIVE_CLASS_NAME); cr.accept(cv, 0 /* flags */); // Load the generated class in a different class loader and try it again - final byte[] bytes = cw.toByteArray(); - ClassLoader2 cl2 = new ClassLoader2(bytes) { - @Override - public void testModifiedInstance() throws Exception { - Class<?> clazz2 = loadClass(CLASS_NAME); - Object i2 = clazz2.newInstance(); - assertNotNull(i2); - assertEquals(42, callAdd(i2, 20, 22)); + ClassLoader2 cl2 = null; + try { + cl2 = new ClassLoader2() { + @Override + public void testModifiedInstance() throws Exception { + Class<?> clazz2 = loadClass(NATIVE_CLASS_NAME); + Object i2 = clazz2.newInstance(); + assertNotNull(i2); + assertEquals(42, callAdd(i2, 20, 22)); - try { - callCallNativeInstance(i2, 10, 3.1415, new Object[0]); - fail("Test should have failed to invoke callTheNativeMethod [2]"); - } catch (InvocationTargetException e) { - // This is expected to fail since the native method has NOT been - // overridden here. - assertEquals(UnsatisfiedLinkError.class, e.getCause().getClass()); + try { + callCallNativeInstance(i2, 10, 3.1415, new Object[0]); + fail("Test should have failed to invoke callTheNativeMethod [2]"); + } catch (InvocationTargetException e) { + // This is expected to fail since the native method has NOT been + // overridden here. + assertEquals(UnsatisfiedLinkError.class, e.getCause().getClass()); + } + + // Check that the native method does NOT have the new annotation + Method[] m = clazz2.getDeclaredMethods(); + assertEquals("native_instance", m[2].getName()); + assertTrue(Modifier.isNative(m[2].getModifiers())); + Annotation[] a = m[2].getAnnotations(); + assertEquals(0, a.length); } - - // Check that the native method does NOT have the new annotation - Method[] m = clazz2.getDeclaredMethods(); - assertEquals("native_instance", m[2].getName()); - assertTrue(Modifier.isNative(m[2].getModifiers())); - Annotation[] a = m[2].getAnnotations(); - assertEquals(0, a.length); - } - }; - cl2.testModifiedInstance(); + }; + cl2.add(NATIVE_CLASS_NAME, cw); + cl2.testModifiedInstance(); + } catch (Throwable t) { + throw dumpGeneratedClass(t, cl2); + } } /** @@ -122,38 +140,37 @@ public class DelegateClassAdapterTest { public void testConstructorsNotSupported() throws IOException { ClassWriter cw = new ClassWriter(0 /*flags*/); - String internalClassName = CLASS_NAME.replace('.', '/'); + String internalClassName = NATIVE_CLASS_NAME.replace('.', '/'); HashSet<String> delegateMethods = new HashSet<String>(); delegateMethods.add("<init>"); DelegateClassAdapter cv = new DelegateClassAdapter( mLog, cw, internalClassName, delegateMethods); - ClassReader cr = new ClassReader(CLASS_NAME); + ClassReader cr = new ClassReader(NATIVE_CLASS_NAME); cr.accept(cv, 0 /* flags */); } @Test - public void testDelegateNative() throws Exception { + public void testDelegateNative() throws Throwable { ClassWriter cw = new ClassWriter(0 /*flags*/); - String internalClassName = CLASS_NAME.replace('.', '/'); + String internalClassName = NATIVE_CLASS_NAME.replace('.', '/'); HashSet<String> delegateMethods = new HashSet<String>(); delegateMethods.add(DelegateClassAdapter.ALL_NATIVES); DelegateClassAdapter cv = new DelegateClassAdapter( mLog, cw, internalClassName, delegateMethods); - ClassReader cr = new ClassReader(CLASS_NAME); + ClassReader cr = new ClassReader(NATIVE_CLASS_NAME); cr.accept(cv, 0 /* flags */); // Load the generated class in a different class loader and try it - final byte[] bytes = cw.toByteArray(); - + ClassLoader2 cl2 = null; try { - ClassLoader2 cl2 = new ClassLoader2(bytes) { + cl2 = new ClassLoader2() { @Override public void testModifiedInstance() throws Exception { - Class<?> clazz2 = loadClass(CLASS_NAME); + Class<?> clazz2 = loadClass(NATIVE_CLASS_NAME); Object i2 = clazz2.newInstance(); assertNotNull(i2); @@ -173,48 +190,105 @@ public class DelegateClassAdapterTest { assertEquals("LayoutlibDelegate", a[0].annotationType().getSimpleName()); } }; + cl2.add(NATIVE_CLASS_NAME, cw); cl2.testModifiedInstance(); + } catch (Throwable t) { + throw dumpGeneratedClass(t, cl2); + } + } + + @Test + public void testDelegateInner() throws Throwable { + // We'll delegate the "get" method of both the inner and outer class. + HashSet<String> delegateMethods = new HashSet<String>(); + delegateMethods.add("get"); + + // Generate the delegate for the outer class. + ClassWriter cwOuter = new ClassWriter(0 /*flags*/); + String outerClassName = OUTER_CLASS_NAME.replace('.', '/'); + DelegateClassAdapter cvOuter = new DelegateClassAdapter( + mLog, cwOuter, outerClassName, delegateMethods); + ClassReader cr = new ClassReader(OUTER_CLASS_NAME); + cr.accept(cvOuter, 0 /* flags */); + + // Generate the delegate for the inner class. + ClassWriter cwInner = new ClassWriter(0 /*flags*/); + String innerClassName = INNER_CLASS_NAME.replace('.', '/'); + DelegateClassAdapter cvInner = new DelegateClassAdapter( + mLog, cwInner, innerClassName, delegateMethods); + cr = new ClassReader(INNER_CLASS_NAME); + cr.accept(cvInner, 0 /* flags */); + + // Load the generated classes in a different class loader and try them + ClassLoader2 cl2 = null; + try { + cl2 = new ClassLoader2() { + @Override + public void testModifiedInstance() throws Exception { + + // Check the outer class + Class<?> outerClazz2 = loadClass(OUTER_CLASS_NAME); + Object o2 = outerClazz2.newInstance(); + assertNotNull(o2); + + // The original Outer.get returns 1+10+20, + // but the delegate makes it return 4+10+20 + assertEquals(4+10+20, callGet(o2, 10, 20)); + + // Check the inner class. Since it's not a static inner class, we need + // to use the hidden constructor that takes the outer class as first parameter. + Class<?> innerClazz2 = loadClass(INNER_CLASS_NAME); + Constructor<?> innerCons = innerClazz2.getConstructor( + new Class<?>[] { outerClazz2 }); + Object i2 = innerCons.newInstance(new Object[] { o2 }); + assertNotNull(i2); - // This code block is useful for debugging. However to make it work you need to - // pull in the org.objectweb.asm.util.TraceClassVisitor class and associated - // utilities which are found in the ASM source jar. - // - // } catch (Throwable t) { - // For debugging, dump the bytecode of the class in case of unexpected error. - // StringWriter sw = new StringWriter(); - // PrintWriter pw = new PrintWriter(sw); - // TraceClassVisitor tcv = new TraceClassVisitor(pw); - // ClassReader cr2 = new ClassReader(bytes); - // cr2.accept(tcv, 0 /* flags */); - // String msg = "\n" + t.getClass().getCanonicalName(); - // if (t.getMessage() != null) { - // msg += ": " + t.getMessage(); - // } - // msg = msg + "\nBytecode dump:\n" + sw.toString(); - // // Re-throw exception with new message - // RuntimeException ex = new RuntimeException(msg, t); - // throw ex; - } finally { + // The original Inner.get returns 3+10+20, + // but the delegate makes it return 6+10+20 + assertEquals(6+10+20, callGet(i2, 10, 20)); + } + }; + cl2.add(OUTER_CLASS_NAME, cwOuter.toByteArray()); + cl2.add(INNER_CLASS_NAME, cwInner.toByteArray()); + cl2.testModifiedInstance(); + } catch (Throwable t) { + throw dumpGeneratedClass(t, cl2); } } //------- /** - * A class loader than can define and instantiate our dummy {@link ClassWithNative}. + * A class loader than can define and instantiate our modified classes. + * <p/> + * The trick here is that this class loader will test our <em>modified</em> version + * of the classes, the one with the delegate calls. * <p/> - * The trick here is that this class loader will test our modified version of ClassWithNative. * Trying to do so in the original class loader generates all sort of link issues because * there are 2 different definitions of the same class name. This class loader will * define and load the class when requested by name and provide helpers to access the * instance methods via reflection. */ private abstract class ClassLoader2 extends ClassLoader { - private final byte[] mClassWithNative; - public ClassLoader2(byte[] classWithNative) { + private final Map<String, byte[]> mClassDefs = new HashMap<String, byte[]>(); + + public ClassLoader2() { super(null); - mClassWithNative = classWithNative; + } + + public ClassLoader2 add(String className, byte[] definition) { + mClassDefs.put(className, definition); + return this; + } + + public ClassLoader2 add(String className, ClassWriter rewrittenClass) { + mClassDefs.put(className, rewrittenClass.toByteArray()); + return this; + } + + private Set<Entry<String, byte[]>> getByteCode() { + return mClassDefs.entrySet(); } @SuppressWarnings("unused") @@ -224,9 +298,10 @@ public class DelegateClassAdapterTest { return super.findClass(name); } catch (ClassNotFoundException e) { - if (CLASS_NAME.equals(name)) { + byte[] def = mClassDefs.get(name); + if (def != null) { // Load the modified ClassWithNative from its bytes representation. - return defineClass(CLASS_NAME, mClassWithNative, 0, mClassWithNative.length); + return defineClass(name, def, 0, def.length); } try { @@ -244,6 +319,17 @@ public class DelegateClassAdapterTest { } /** + * Accesses {@link OuterClass#get()} or {@link InnerClass#get() }via reflection. + */ + public int callGet(Object instance, int a, long b) throws Exception { + Method m = instance.getClass().getMethod("get", + new Class<?>[] { int.class, long.class } ); + + Object result = m.invoke(instance, new Object[] { a, b }); + return ((Integer) result).intValue(); + } + + /** * Accesses {@link ClassWithNative#add(int, int)} via reflection. */ public int callAdd(Object instance, int a, int b) throws Exception { @@ -271,34 +357,53 @@ public class DelegateClassAdapterTest { } /** - * Dummy test class with a native method. - * The native method is not defined and any attempt to invoke it will - * throw an {@link UnsatisfiedLinkError}. + * For debugging, it's useful to dump the content of the generated classes + * along with the exception that was generated. + * + * However to make it work you need to pull in the org.objectweb.asm.util.TraceClassVisitor + * class and associated utilities which are found in the ASM source jar. Since we don't + * want that dependency in the source code, we only put it manually for development and + * access the TraceClassVisitor via reflection if present. + * + * @param t The exception thrown by {@link ClassLoader2#testModifiedInstance()} + * @param cl2 The {@link ClassLoader2} instance with the generated bytecode. + * @return Either original {@code t} or a new wrapper {@link Throwable} */ - public static class ClassWithNative { - public ClassWithNative() { - } - - public int add(int a, int b) { - return a + b; - } + private Throwable dumpGeneratedClass(Throwable t, ClassLoader2 cl2) { + try { + // For debugging, dump the bytecode of the class in case of unexpected error + // if we can find the TraceClassVisitor class. + Class<?> tcvClass = Class.forName("org.objectweb.asm.util.TraceClassVisitor"); + + StringBuilder sb = new StringBuilder(); + sb.append('\n').append(t.getClass().getCanonicalName()); + if (t.getMessage() != null) { + sb.append(": ").append(t.getMessage()); + } + + for (Entry<String, byte[]> entry : cl2.getByteCode()) { + String className = entry.getKey(); + byte[] bytes = entry.getValue(); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + // next 2 lines do: TraceClassVisitor tcv = new TraceClassVisitor(pw); + Constructor<?> cons = tcvClass.getConstructor(new Class<?>[] { pw.getClass() }); + Object tcv = cons.newInstance(new Object[] { pw }); + ClassReader cr2 = new ClassReader(bytes); + cr2.accept((ClassVisitor) tcv, 0 /* flags */); + + sb.append("\nBytecode dump: <").append(className).append(">:\n") + .append(sw.toString()); + } - public int callNativeInstance(int a, double d, Object[] o) { - return native_instance(a, d, o); + // Re-throw exception with new message + RuntimeException ex = new RuntimeException(sb.toString(), t); + return ex; + } catch (Throwable ignore) { + // In case of problem, just throw the original exception as-is. + return t; } - - private native int native_instance(int a, double d, Object[] o); } - /** - * The delegate that receives the call to {@link ClassWithNative}'s overridden methods. - */ - public static class ClassWithNative_Delegate { - public static int native_instance(ClassWithNative instance, int a, double d, Object[] o) { - if (o != null && o.length > 0) { - o[0] = instance; - } - return (int)(a + d); - } - } } diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java new file mode 100644 index 0000000..c314853 --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2010 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. + */ + +package com.android.tools.layoutlib.create.dataclass; + +import com.android.tools.layoutlib.create.DelegateClassAdapterTest; + +/** + * Dummy test class with a native method. + * The native method is not defined and any attempt to invoke it will + * throw an {@link UnsatisfiedLinkError}. + * + * Used by {@link DelegateClassAdapterTest}. + */ +public class ClassWithNative { + public ClassWithNative() { + } + + public int add(int a, int b) { + return a + b; + } + + // Note: it's good to have a long or double for testing parameters since they take + // 2 slots in the stack/locals maps. + + public int callNativeInstance(int a, double d, Object[] o) { + return native_instance(a, d, o); + } + + private native int native_instance(int a, double d, Object[] o); +} + diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java new file mode 100644 index 0000000..a3d4dc6 --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/ClassWithNative_Delegate.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2010 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. + */ + +package com.android.tools.layoutlib.create.dataclass; + +import com.android.tools.layoutlib.create.DelegateClassAdapterTest; + +/** + * The delegate that receives the call to {@link ClassWithNative_Delegate}'s overridden methods. + * + * Used by {@link DelegateClassAdapterTest}. + */ +public class ClassWithNative_Delegate { + public static int native_instance(ClassWithNative instance, int a, double d, Object[] o) { + if (o != null && o.length > 0) { + o[0] = instance; + } + return (int)(a + d); + } +} + diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java new file mode 100644 index 0000000..9dc2f69 --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2011 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. + */ + +package com.android.tools.layoutlib.create.dataclass; + +import com.android.tools.layoutlib.create.DelegateClassAdapterTest; + +/** + * Test class with an inner class. + * + * Used by {@link DelegateClassAdapterTest}. + */ +public class OuterClass { + private int mOuterValue = 1; + public OuterClass() { + } + + // Outer.get returns 1 + a + b + // Note: it's good to have a long or double for testing parameters since they take + // 2 slots in the stack/locals maps. + public int get(int a, long b) { + return mOuterValue + a + (int) b; + } + + public class InnerClass { + public InnerClass() { + } + + // Inner.get returns 1+2=3 + a + b + public int get(int a, long b) { + return 2 + mOuterValue + a + (int) b; + } + } +} + diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java new file mode 100644 index 0000000..3252d87 --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_Delegate.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2011 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. + */ + +package com.android.tools.layoutlib.create.dataclass; + +import com.android.tools.layoutlib.create.DelegateClassAdapterTest; + +/** + * Used by {@link DelegateClassAdapterTest}. + */ +public class OuterClass_Delegate { + // The delegate override of Outer.get returns 4 + a + b + public static int get(OuterClass instance, int a, long b) { + return 4 + a + (int) b; + } +} + diff --git a/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java new file mode 100644 index 0000000..b472220 --- /dev/null +++ b/tools/layoutlib/create/tests/com/android/tools/layoutlib/create/dataclass/OuterClass_InnerClass_Delegate.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2011 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. + */ + +package com.android.tools.layoutlib.create.dataclass; + +import com.android.tools.layoutlib.create.DelegateClassAdapterTest; +import com.android.tools.layoutlib.create.dataclass.OuterClass.InnerClass; + +/** + * Used by {@link DelegateClassAdapterTest}. + */ +public class OuterClass_InnerClass_Delegate { + // The delegate override of Inner.get return 6 + a + b + public static int get(OuterClass outer, InnerClass inner, int a, long b) { + return 6 + a + (int) b; + } +} |
