diff options
302 files changed, 23725 insertions, 2027 deletions
diff --git a/Android.mk b/Android.mk index 80e681c6a805..83c4b5b1fe4e 100644 --- a/Android.mk +++ b/Android.mk @@ -398,6 +398,7 @@ framework_docs_LOCAL_DROIDDOC_OPTIONS := \ -since ./frameworks/base/api/12.xml 12 \ -since ./frameworks/base/api/13.xml 13 \ -since ./frameworks/base/api/14.txt 14 \ + -since ./frameworks/base/api/15.txt 15 \ -werror -hide 113 \ -overview $(LOCAL_PATH)/core/java/overview.html @@ -444,10 +445,14 @@ web_docs_sample_code_flags := \ resources/samples/JetBoy "JetBoy" \ -samplecode $(sample_dir)/LunarLander \ resources/samples/LunarLander "Lunar Lander" \ + -samplecode $(sample_dir)/training/ads-and-ux \ + resources/samples/training/ads-and-ux "Mobile Advertisement Integration" \ -samplecode $(sample_dir)/MultiResolution \ resources/samples/MultiResolution "Multiple Resolutions" \ -samplecode $(sample_dir)/NFCDemo \ resources/samples/NFCDemo "NFC Demo" \ + -samplecode $(sample_dir)/training/multiscreen/newsreader \ + resources/samples/newsreader "News Reader" \ -samplecode $(sample_dir)/NotePad \ resources/samples/NotePad "Note Pad" \ -samplecode $(sample_dir)/SpellChecker/SampleSpellCheckerService \ @@ -497,7 +502,10 @@ web_docs_sample_code_flags := \ -samplecode $(sample_dir)/XmlAdapters \ resources/samples/XmlAdapters "XML Adapters" \ -samplecode $(sample_dir)/TtsEngine \ - resources/samples/TtsEngine "Text To Speech Engine" + resources/samples/TtsEngine "Text To Speech Engine" \ + -samplecode $(sample_dir)/training/device-management-policy \ + resources/samples/training/device-management-policy "Device Management Policy" + ## SDK version identifiers used in the published docs # major[.minor] version for current SDK. (full releases only) diff --git a/api/15.txt b/api/15.txt index bca8e012d89f..ddf5baf30ff9 100644 --- a/api/15.txt +++ b/api/15.txt @@ -83,6 +83,7 @@ package android { field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE"; field public static final java.lang.String READ_PROFILE = "android.permission.READ_PROFILE"; field public static final java.lang.String READ_SMS = "android.permission.READ_SMS"; + field public static final java.lang.String READ_SOCIAL_STREAM = "android.permission.READ_SOCIAL_STREAM"; field public static final java.lang.String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS"; field public static final java.lang.String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS"; field public static final java.lang.String REBOOT = "android.permission.REBOOT"; @@ -127,6 +128,7 @@ package android { field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS"; field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS"; field public static final java.lang.String WRITE_SMS = "android.permission.WRITE_SMS"; + field public static final java.lang.String WRITE_SOCIAL_STREAM = "android.permission.WRITE_SOCIAL_STREAM"; field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS"; } @@ -3235,6 +3237,7 @@ package android.app { method public final android.app.Fragment getTargetFragment(); method public final int getTargetRequestCode(); method public final java.lang.CharSequence getText(int); + method public boolean getUserVisibleHint(); method public android.view.View getView(); method public final int hashCode(); method public static android.app.Fragment instantiate(android.content.Context, java.lang.String); @@ -3281,6 +3284,7 @@ package android.app { method public void setMenuVisibility(boolean); method public void setRetainInstance(boolean); method public void setTargetFragment(android.app.Fragment, int); + method public void setUserVisibleHint(boolean); method public void startActivity(android.content.Intent); method public void startActivityForResult(android.content.Intent, int); method public void unregisterForContextMenu(android.view.View); @@ -4143,6 +4147,7 @@ package android.appwidget { ctor public AppWidgetHostView(android.content.Context, int, int); method public int getAppWidgetId(); method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(); + method public static android.graphics.Rect getDefaultPaddingForWidget(android.content.Context, android.content.ComponentName, android.graphics.Rect); method protected android.view.View getDefaultView(); method protected android.view.View getErrorView(); method protected void prepareView(android.view.View); @@ -4472,10 +4477,12 @@ package android.bluetooth { method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException; method public int describeContents(); + method public boolean fetchUuidsWithSdp(); method public java.lang.String getAddress(); method public android.bluetooth.BluetoothClass getBluetoothClass(); method public int getBondState(); method public java.lang.String getName(); + method public android.os.ParcelUuid[] getUuids(); method public void writeToParcel(android.os.Parcel, int); field public static final java.lang.String ACTION_ACL_CONNECTED = "android.bluetooth.device.action.ACL_CONNECTED"; field public static final java.lang.String ACTION_ACL_DISCONNECTED = "android.bluetooth.device.action.ACL_DISCONNECTED"; @@ -4484,6 +4491,7 @@ package android.bluetooth { field public static final java.lang.String ACTION_CLASS_CHANGED = "android.bluetooth.device.action.CLASS_CHANGED"; field public static final java.lang.String ACTION_FOUND = "android.bluetooth.device.action.FOUND"; field public static final java.lang.String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED"; + field public static final java.lang.String ACTION_UUID = "android.bluetooth.device.action.UUID"; field public static final int BOND_BONDED = 12; // 0xc field public static final int BOND_BONDING = 11; // 0xb field public static final int BOND_NONE = 10; // 0xa @@ -4495,6 +4503,7 @@ package android.bluetooth { field public static final java.lang.String EXTRA_NAME = "android.bluetooth.device.extra.NAME"; field public static final java.lang.String EXTRA_PREVIOUS_BOND_STATE = "android.bluetooth.device.extra.PREVIOUS_BOND_STATE"; field public static final java.lang.String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI"; + field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID"; } public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile { @@ -5325,6 +5334,7 @@ package android.content { method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String); method public T getParcelableExtra(java.lang.String); method public java.lang.String getScheme(); + method public android.content.Intent getSelector(); method public java.io.Serializable getSerializableExtra(java.lang.String); method public short[] getShortArrayExtra(java.lang.String); method public short getShortExtra(java.lang.String, short); @@ -5337,6 +5347,7 @@ package android.content { method public boolean hasExtra(java.lang.String); method public boolean hasFileDescriptors(); method public static android.content.Intent makeMainActivity(android.content.ComponentName); + method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String); method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName); method public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException; method public static android.content.Intent parseUri(java.lang.String, int) throws java.net.URISyntaxException; @@ -5390,6 +5401,7 @@ package android.content { method public void setExtrasClassLoader(java.lang.ClassLoader); method public android.content.Intent setFlags(int); method public android.content.Intent setPackage(java.lang.String); + method public void setSelector(android.content.Intent); method public void setSourceBounds(android.graphics.Rect); method public android.content.Intent setType(java.lang.String); method public deprecated java.lang.String toURI(); @@ -5493,7 +5505,16 @@ package android.content { field public static final java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED"; field public static final java.lang.String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH"; field public static final java.lang.String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE"; + field public static final java.lang.String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER"; + field public static final java.lang.String CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR"; + field public static final java.lang.String CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR"; + field public static final java.lang.String CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS"; + field public static final java.lang.String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL"; + field public static final java.lang.String CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY"; + field public static final java.lang.String CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS"; field public static final java.lang.String CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET"; + field public static final java.lang.String CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING"; + field public static final java.lang.String CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC"; field public static final java.lang.String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE"; field public static final java.lang.String CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK"; field public static final java.lang.String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE"; @@ -5559,6 +5580,7 @@ package android.content { field public static final int FILL_IN_COMPONENT = 8; // 0x8 field public static final int FILL_IN_DATA = 2; // 0x2 field public static final int FILL_IN_PACKAGE = 16; // 0x10 + field public static final int FILL_IN_SELECTOR = 64; // 0x40 field public static final int FILL_IN_SOURCE_BOUNDS = 32; // 0x20 field public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; // 0x400000 field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000 @@ -6782,6 +6804,13 @@ package android.database { method public abstract boolean onMove(int, int); } + public class CrossProcessCursorWrapper extends android.database.CursorWrapper implements android.database.CrossProcessCursor { + ctor public CrossProcessCursorWrapper(android.database.Cursor); + method public void fillWindow(int, android.database.CursorWindow); + method public android.database.CursorWindow getWindow(); + method public boolean onMove(int, int); + } + public abstract interface Cursor { method public abstract void close(); method public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer); @@ -6851,7 +6880,8 @@ package android.database { } public class CursorWindow extends android.database.sqlite.SQLiteClosable implements android.os.Parcelable { - ctor public CursorWindow(boolean); + ctor public CursorWindow(java.lang.String); + ctor public deprecated CursorWindow(boolean); method public boolean allocRow(); method public void clear(); method public void close(); @@ -8782,6 +8812,7 @@ package android.graphics { method public long getTimestamp(); method public void getTransformMatrix(float[]); method public void release(); + method public void setDefaultBufferSize(int, int); method public void setOnFrameAvailableListener(android.graphics.SurfaceTexture.OnFrameAvailableListener); method public void updateTexImage(); } @@ -9356,6 +9387,7 @@ package android.hardware { method public java.util.List<android.hardware.Camera.Size> getSupportedVideoSizes(); method public java.util.List<java.lang.String> getSupportedWhiteBalance(); method public float getVerticalViewAngle(); + method public boolean getVideoStabilization(); method public java.lang.String getWhiteBalance(); method public int getZoom(); method public java.util.List<java.lang.Integer> getZoomRatios(); @@ -9363,6 +9395,7 @@ package android.hardware { method public boolean isAutoWhiteBalanceLockSupported(); method public boolean isSmoothZoomSupported(); method public boolean isVideoSnapshotSupported(); + method public boolean isVideoStabilizationSupported(); method public boolean isZoomSupported(); method public void remove(java.lang.String); method public void removeGpsData(); @@ -9394,6 +9427,7 @@ package android.hardware { method public void setRecordingHint(boolean); method public void setRotation(int); method public void setSceneMode(java.lang.String); + method public void setVideoStabilization(boolean); method public void setWhiteBalance(java.lang.String); method public void setZoom(int); method public void unflatten(java.lang.String); @@ -10529,6 +10563,7 @@ package android.media { field public static final int QUALITY_HIGH = 1; // 0x1 field public static final int QUALITY_LOW = 0; // 0x0 field public static final int QUALITY_QCIF = 2; // 0x2 + field public static final int QUALITY_QVGA = 7; // 0x7 field public static final int QUALITY_TIME_LAPSE_1080P = 1006; // 0x3ee field public static final int QUALITY_TIME_LAPSE_480P = 1004; // 0x3ec field public static final int QUALITY_TIME_LAPSE_720P = 1005; // 0x3ed @@ -10536,6 +10571,7 @@ package android.media { field public static final int QUALITY_TIME_LAPSE_HIGH = 1001; // 0x3e9 field public static final int QUALITY_TIME_LAPSE_LOW = 1000; // 0x3e8 field public static final int QUALITY_TIME_LAPSE_QCIF = 1002; // 0x3ea + field public static final int QUALITY_TIME_LAPSE_QVGA = 1007; // 0x3ef field public int audioBitRate; field public int audioChannels; field public int audioCodec; @@ -10675,6 +10711,7 @@ package android.media { field public static final int METADATA_KEY_GENRE = 6; // 0x6 field public static final int METADATA_KEY_HAS_AUDIO = 16; // 0x10 field public static final int METADATA_KEY_HAS_VIDEO = 17; // 0x11 + field public static final int METADATA_KEY_LOCATION = 23; // 0x17 field public static final int METADATA_KEY_MIMETYPE = 12; // 0xc field public static final int METADATA_KEY_NUM_TRACKS = 10; // 0xa field public static final int METADATA_KEY_TITLE = 7; // 0x7 @@ -13609,16 +13646,19 @@ package android.opengl { field public static final int GL_RENDERBUFFER_RED_SIZE_OES = 36176; // 0x8d50 field public static final int GL_RENDERBUFFER_STENCIL_SIZE_OES = 36181; // 0x8d55 field public static final int GL_RENDERBUFFER_WIDTH_OES = 36162; // 0x8d42 + field public static final int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 36200; // 0x8d68 field public static final int GL_RGB565_OES = 36194; // 0x8d62 field public static final int GL_RGB5_A1_OES = 32855; // 0x8057 field public static final int GL_RGB8_OES = 32849; // 0x8051 field public static final int GL_RGBA4_OES = 32854; // 0x8056 field public static final int GL_RGBA8_OES = 32856; // 0x8058 + field public static final int GL_SAMPLER_EXTERNAL_OES = 36198; // 0x8d66 field public static final int GL_STENCIL_ATTACHMENT_OES = 36128; // 0x8d20 field public static final int GL_STENCIL_INDEX1_OES = 36166; // 0x8d46 field public static final int GL_STENCIL_INDEX4_OES = 36167; // 0x8d47 field public static final int GL_STENCIL_INDEX8_OES = 36168; // 0x8d48 field public static final int GL_TEXTURE_BINDING_CUBE_MAP_OES = 34068; // 0x8514 + field public static final int GL_TEXTURE_BINDING_EXTERNAL_OES = 36199; // 0x8d67 field public static final int GL_TEXTURE_CROP_RECT_OES = 35741; // 0x8b9d field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES = 34070; // 0x8516 field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES = 34072; // 0x8518 @@ -13627,6 +13667,7 @@ package android.opengl { field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES = 34069; // 0x8515 field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES = 34071; // 0x8517 field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES = 34073; // 0x8519 + field public static final int GL_TEXTURE_EXTERNAL_OES = 36197; // 0x8d65 field public static final int GL_TEXTURE_GEN_MODE_OES = 9472; // 0x2500 field public static final int GL_TEXTURE_GEN_STR_OES = 36192; // 0x8d60 field public static final int GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES = 35215; // 0x898f @@ -14384,6 +14425,7 @@ package android.os { field public static final int HONEYCOMB_MR1 = 12; // 0xc field public static final int HONEYCOMB_MR2 = 13; // 0xd field public static final int ICE_CREAM_SANDWICH = 14; // 0xe + field public static final int ICE_CREAM_SANDWICH_MR1 = 15; // 0xf } public final class Bundle implements java.lang.Cloneable android.os.Parcelable { @@ -14749,6 +14791,7 @@ package android.os { field public static final int FLAG_ONEWAY = 1; // 0x1 field public static final int INTERFACE_TRANSACTION = 1598968902; // 0x5f4e5446 field public static final int LAST_CALL_TRANSACTION = 16777215; // 0xffffff + field public static final int LIKE_TRANSACTION = 1598835019; // 0x5f4c494b field public static final int PING_TRANSACTION = 1599098439; // 0x5f504e47 field public static final int TWEET_TRANSACTION = 1599362900; // 0x5f545754 } @@ -15110,6 +15153,7 @@ package android.os { public class RemoteException extends android.util.AndroidException { ctor public RemoteException(); + ctor public RemoteException(java.lang.String); } public class ResultReceiver implements android.os.Parcelable { @@ -15204,6 +15248,10 @@ package android.os { method public abstract void released(); } + public class TransactionTooLargeException extends android.os.RemoteException { + ctor public TransactionTooLargeException(); + } + public class Vibrator { method public void cancel(); method public boolean hasVibrator(); @@ -15720,6 +15768,7 @@ package android.provider { field public static final int TYPE_NONE = 0; // 0x0 field public static final int TYPE_OPTIONAL = 2; // 0x2 field public static final int TYPE_REQUIRED = 1; // 0x1 + field public static final int TYPE_RESOURCE = 3; // 0x3 } public static final class CalendarContract.CalendarAlerts implements android.provider.BaseColumns android.provider.CalendarContract.CalendarAlertsColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns { @@ -15758,9 +15807,12 @@ package android.provider { } protected static abstract interface CalendarContract.CalendarColumns { + field public static final java.lang.String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes"; + field public static final java.lang.String ALLOWED_AVAILABILITY = "allowedAvailability"; field public static final java.lang.String ALLOWED_REMINDERS = "allowedReminders"; field public static final java.lang.String CALENDAR_ACCESS_LEVEL = "calendar_access_level"; field public static final java.lang.String CALENDAR_COLOR = "calendar_color"; + field public static final java.lang.String CALENDAR_COLOR_KEY = "calendar_color_index"; field public static final java.lang.String CALENDAR_DISPLAY_NAME = "calendar_displayName"; field public static final java.lang.String CALENDAR_TIME_ZONE = "calendar_timezone"; field public static final int CAL_ACCESS_CONTRIBUTOR = 500; // 0x1f4 @@ -15805,6 +15857,18 @@ package android.provider { field public static final java.lang.String NAME = "name"; } + public static final class CalendarContract.Colors implements android.provider.CalendarContract.ColorsColumns { + field public static final android.net.Uri CONTENT_URI; + } + + protected static abstract interface CalendarContract.ColorsColumns implements android.provider.SyncStateContract.Columns { + field public static final java.lang.String COLOR = "color"; + field public static final java.lang.String COLOR_KEY = "color_index"; + field public static final java.lang.String COLOR_TYPE = "color_type"; + field public static final int TYPE_CALENDAR = 0; // 0x0 + field public static final int TYPE_EVENT = 1; // 0x1 + } + public static final class CalendarContract.EventDays implements android.provider.CalendarContract.EventDaysColumns { method public static final android.database.Cursor query(android.content.ContentResolver, int, int, java.lang.String[]); field public static final android.net.Uri CONTENT_URI; @@ -15830,6 +15894,7 @@ package android.provider { field public static final java.lang.String AVAILABILITY = "availability"; field public static final int AVAILABILITY_BUSY = 0; // 0x0 field public static final int AVAILABILITY_FREE = 1; // 0x1 + field public static final int AVAILABILITY_TENTATIVE = 2; // 0x2 field public static final java.lang.String CALENDAR_ID = "calendar_id"; field public static final java.lang.String CAN_INVITE_OTHERS = "canInviteOthers"; field public static final java.lang.String DESCRIPTION = "description"; @@ -15837,6 +15902,7 @@ package android.provider { field public static final java.lang.String DTSTART = "dtstart"; field public static final java.lang.String DURATION = "duration"; field public static final java.lang.String EVENT_COLOR = "eventColor"; + field public static final java.lang.String EVENT_COLOR_KEY = "eventColor_index"; field public static final java.lang.String EVENT_END_TIMEZONE = "eventEndTimezone"; field public static final java.lang.String EVENT_LOCATION = "eventLocation"; field public static final java.lang.String EVENT_TIMEZONE = "eventTimezone"; @@ -16572,6 +16638,10 @@ package android.provider { field public static final java.lang.String PHOTO_FILE_ID = "data14"; } + public static final class ContactsContract.Contacts.StreamItems implements android.provider.ContactsContract.StreamItemsColumns { + field public static final java.lang.String CONTENT_DIRECTORY = "stream_items"; + } + protected static abstract interface ContactsContract.ContactsColumns { field public static final java.lang.String DISPLAY_NAME = "display_name"; field public static final java.lang.String HAS_PHONE_NUMBER = "has_phone_number"; @@ -16829,6 +16899,10 @@ package android.provider { field public static final java.lang.String DATA_ID = "data_id"; } + public static final class ContactsContract.RawContacts.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns { + field public static final java.lang.String CONTENT_DIRECTORY = "stream_items"; + } + protected static abstract interface ContactsContract.RawContactsColumns { field public static final java.lang.String AGGREGATION_MODE = "aggregation_mode"; field public static final java.lang.String CONTACT_ID = "contact_id"; @@ -16892,6 +16966,56 @@ package android.provider { field public static final android.net.Uri PROFILE_CONTENT_URI; } + public static final class ContactsContract.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns { + field public static final java.lang.String PHOTO = "photo"; + } + + protected static abstract interface ContactsContract.StreamItemPhotosColumns { + field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id"; + field public static final java.lang.String PHOTO_URI = "photo_uri"; + field public static final java.lang.String SORT_INDEX = "sort_index"; + field public static final java.lang.String STREAM_ITEM_ID = "stream_item_id"; + field public static final java.lang.String SYNC1 = "stream_item_photo_sync1"; + field public static final java.lang.String SYNC2 = "stream_item_photo_sync2"; + field public static final java.lang.String SYNC3 = "stream_item_photo_sync3"; + field public static final java.lang.String SYNC4 = "stream_item_photo_sync4"; + } + + public static final class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns { + field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item"; + field public static final android.net.Uri CONTENT_LIMIT_URI; + field public static final android.net.Uri CONTENT_PHOTO_URI; + field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item"; + field public static final android.net.Uri CONTENT_URI; + field public static final java.lang.String MAX_ITEMS = "max_items"; + } + + public static final class ContactsContract.StreamItems.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns { + field public static final java.lang.String CONTENT_DIRECTORY = "photo"; + field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item_photo"; + field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item_photo"; + } + + protected static abstract interface ContactsContract.StreamItemsColumns { + field public static final java.lang.String ACCOUNT_NAME = "account_name"; + field public static final java.lang.String ACCOUNT_TYPE = "account_type"; + field public static final java.lang.String COMMENTS = "comments"; + field public static final java.lang.String CONTACT_ID = "contact_id"; + field public static final java.lang.String CONTACT_LOOKUP_KEY = "contact_lookup"; + field public static final java.lang.String DATA_SET = "data_set"; + field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id"; + field public static final java.lang.String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id"; + field public static final java.lang.String RES_ICON = "icon"; + field public static final java.lang.String RES_LABEL = "label"; + field public static final java.lang.String RES_PACKAGE = "res_package"; + field public static final java.lang.String SYNC1 = "stream_item_sync1"; + field public static final java.lang.String SYNC2 = "stream_item_sync2"; + field public static final java.lang.String SYNC3 = "stream_item_sync3"; + field public static final java.lang.String SYNC4 = "stream_item_sync4"; + field public static final java.lang.String TEXT = "text"; + field public static final java.lang.String TIMESTAMP = "timestamp"; + } + protected static abstract interface ContactsContract.SyncColumns implements android.provider.ContactsContract.BaseSyncColumns { field public static final java.lang.String ACCOUNT_NAME = "account_name"; field public static final java.lang.String ACCOUNT_TYPE = "account_type"; @@ -16946,7 +17070,7 @@ package android.provider { field public static final java.lang.String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality"; field public static final java.lang.String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH = "android.media.action.MEDIA_PLAY_FROM_SEARCH"; field public static final java.lang.String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH"; - field public static final java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER"; + field public static final deprecated java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER"; field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA"; field public static final java.lang.String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA"; field public static final java.lang.String MEDIA_IGNORE_FILENAME = ".nomedia"; @@ -17309,6 +17433,7 @@ package android.provider { method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String); method public static final void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean); field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled"; + field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password"; field public static final java.lang.String ADB_ENABLED = "adb_enabled"; field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins"; field public static final java.lang.String ALLOW_MOCK_LOCATION = "mock_location"; @@ -18603,6 +18728,7 @@ package android.service.textservice { method public android.os.Bundle getBundle(); method public java.lang.String getLocale(); method public void onCancel(); + method public void onClose(); method public abstract void onCreate(); method public abstract android.view.textservice.SuggestionsInfo onGetSuggestions(android.view.textservice.TextInfo, int); method public android.view.textservice.SuggestionsInfo[] onGetSuggestionsMultiple(android.view.textservice.TextInfo[], int, boolean); @@ -18639,6 +18765,7 @@ package android.service.wallpaper { method public void onSurfaceRedrawNeeded(android.view.SurfaceHolder); method public void onTouchEvent(android.view.MotionEvent); method public void onVisibilityChanged(boolean); + method public void setOffsetNotificationsEnabled(boolean); method public void setTouchEventsEnabled(boolean); } @@ -18777,6 +18904,7 @@ package android.speech.tts { method public boolean areDefaultsEnforced(); method public java.lang.String getDefaultEngine(); method public java.util.List<android.speech.tts.TextToSpeech.EngineInfo> getEngines(); + method public java.util.Set<java.lang.String> getFeatures(java.util.Locale); method public java.util.Locale getLanguage(); method public int isLanguageAvailable(java.util.Locale); method public boolean isSpeaking(); @@ -18784,7 +18912,8 @@ package android.speech.tts { method public int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>); method public deprecated int setEngineByPackageName(java.lang.String); method public int setLanguage(java.util.Locale); - method public int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener); + method public deprecated int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener); + method public int setOnUtteranceProgressListener(android.speech.tts.UtteranceProgressListener); method public int setPitch(float); method public int setSpeechRate(float); method public void shutdown(); @@ -18822,6 +18951,8 @@ package android.speech.tts { field public static final java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo"; field public static final java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot"; field public static final java.lang.String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE"; + field public static final java.lang.String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts"; + field public static final java.lang.String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts"; field public static final java.lang.String KEY_PARAM_PAN = "pan"; field public static final java.lang.String KEY_PARAM_STREAM = "streamType"; field public static final java.lang.String KEY_PARAM_UTTERANCE_ID = "utteranceId"; @@ -18847,6 +18978,7 @@ package android.speech.tts { public abstract class TextToSpeechService extends android.app.Service { ctor public TextToSpeechService(); method public android.os.IBinder onBind(android.content.Intent); + method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String); method protected abstract java.lang.String[] onGetLanguage(); method protected abstract int onIsLanguageAvailable(java.lang.String, java.lang.String, java.lang.String); method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String); @@ -18854,6 +18986,13 @@ package android.speech.tts { method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback); } + public abstract class UtteranceProgressListener { + ctor public UtteranceProgressListener(); + method public abstract void onDone(java.lang.String); + method public abstract void onError(java.lang.String); + method public abstract void onStart(java.lang.String); + } + } package android.telephony { @@ -21018,6 +21157,7 @@ package android.text.style { method public void writeToParcel(android.os.Parcel, int); field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED"; field public static final android.os.Parcelable.Creator CREATOR; + field public static final int FLAG_AUTO_CORRECTION = 4; // 0x4 field public static final int FLAG_EASY_CORRECT = 1; // 0x1 field public static final int FLAG_MISSPELLED = 2; // 0x2 field public static final int SUGGESTIONS_MAX_SIZE = 5; // 0x5 @@ -22090,6 +22230,8 @@ package android.view { field public static final int KEYCODE_BUTTON_Y = 100; // 0x64 field public static final int KEYCODE_BUTTON_Z = 101; // 0x65 field public static final int KEYCODE_C = 31; // 0x1f + field public static final int KEYCODE_CALCULATOR = 210; // 0xd2 + field public static final int KEYCODE_CALENDAR = 208; // 0xd0 field public static final int KEYCODE_CALL = 5; // 0x5 field public static final int KEYCODE_CAMERA = 27; // 0x1b field public static final int KEYCODE_CAPS_LOCK = 115; // 0x73 @@ -22098,6 +22240,7 @@ package android.view { field public static final int KEYCODE_CHANNEL_UP = 166; // 0xa6 field public static final int KEYCODE_CLEAR = 28; // 0x1c field public static final int KEYCODE_COMMA = 55; // 0x37 + field public static final int KEYCODE_CONTACTS = 207; // 0xcf field public static final int KEYCODE_CTRL_LEFT = 113; // 0x71 field public static final int KEYCODE_CTRL_RIGHT = 114; // 0x72 field public static final int KEYCODE_D = 32; // 0x20 @@ -22165,6 +22308,7 @@ package android.view { field public static final int KEYCODE_MINUS = 69; // 0x45 field public static final int KEYCODE_MOVE_END = 123; // 0x7b field public static final int KEYCODE_MOVE_HOME = 122; // 0x7a + field public static final int KEYCODE_MUSIC = 209; // 0xd1 field public static final int KEYCODE_MUTE = 91; // 0x5b field public static final int KEYCODE_N = 42; // 0x2a field public static final int KEYCODE_NOTIFICATION = 83; // 0x53 @@ -22814,6 +22958,7 @@ package android.view { method public void buildDrawingCache(); method public void buildDrawingCache(boolean); method public void buildLayer(); + method public boolean callOnClick(); method public boolean canScrollHorizontally(int); method public boolean canScrollVertically(int); method public void cancelLongPress(); @@ -22965,6 +23110,7 @@ package android.view { method public float getY(); method public boolean hasFocus(); method public boolean hasFocusable(); + method public boolean hasOnClickListeners(); method public boolean hasWindowFocus(); method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup); method protected void initializeFadingEdge(android.content.res.TypedArray); @@ -24082,6 +24228,8 @@ package android.view.accessibility { method public int getCurrentItemIndex(); method public int getFromIndex(); method public int getItemCount(); + method public int getMaxScrollX(); + method public int getMaxScrollY(); method public android.os.Parcelable getParcelableData(); method public int getRemovedCount(); method public int getScrollX(); @@ -24108,6 +24256,8 @@ package android.view.accessibility { method public void setFromIndex(int); method public void setFullScreen(boolean); method public void setItemCount(int); + method public void setMaxScrollX(int); + method public void setMaxScrollY(int); method public void setParcelableData(android.os.Parcelable); method public void setPassword(boolean); method public void setRemovedCount(int); @@ -24713,6 +24863,7 @@ package android.view.textservice { } public class SpellCheckerSession { + method public void cancel(); method public void close(); method public android.view.textservice.SpellCheckerInfo getSpellChecker(); method public void getSuggestions(android.view.textservice.TextInfo, int); @@ -24749,6 +24900,7 @@ package android.view.textservice { method public void setCookieAndSequence(int, int); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; + field public static final int RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS = 4; // 0x4 field public static final int RESULT_ATTR_IN_THE_DICTIONARY = 1; // 0x1 field public static final int RESULT_ATTR_LOOKS_LIKE_TYPO = 2; // 0x2 } @@ -25018,7 +25170,7 @@ package android.webkit { method public synchronized java.lang.String getFixedFontFamily(); method public synchronized boolean getJavaScriptCanOpenWindowsAutomatically(); method public synchronized boolean getJavaScriptEnabled(); - method public deprecated synchronized android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm(); + method public synchronized android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm(); method public boolean getLightTouchEnabled(); method public boolean getLoadWithOverviewMode(); method public synchronized boolean getLoadsImagesAutomatically(); @@ -25065,7 +25217,7 @@ package android.webkit { method public synchronized void setGeolocationEnabled(boolean); method public synchronized void setJavaScriptCanOpenWindowsAutomatically(boolean); method public synchronized void setJavaScriptEnabled(boolean); - method public deprecated synchronized void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm); + method public synchronized void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm); method public void setLightTouchEnabled(boolean); method public void setLoadWithOverviewMode(boolean); method public synchronized void setLoadsImagesAutomatically(boolean); @@ -25100,12 +25252,12 @@ package android.webkit { field public static final int LOAD_NO_CACHE = 2; // 0x2 } - public static final deprecated class WebSettings.LayoutAlgorithm extends java.lang.Enum { + public static final class WebSettings.LayoutAlgorithm extends java.lang.Enum { method public static android.webkit.WebSettings.LayoutAlgorithm valueOf(java.lang.String); method public static final android.webkit.WebSettings.LayoutAlgorithm[] values(); enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NARROW_COLUMNS; enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NORMAL; - enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN; + enum_constant public static final deprecated android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN; } public static final class WebSettings.PluginState extends java.lang.Enum { @@ -26770,6 +26922,7 @@ package android.widget { method public void setChar(int, java.lang.String, char); method public void setCharSequence(int, java.lang.String, java.lang.CharSequence); method public void setChronometer(int, long, java.lang.String, boolean); + method public void setContentDescription(int, java.lang.CharSequence); method public void setDisplayedChild(int, int); method public void setDouble(int, java.lang.String, double); method public void setEmptyView(int, int); diff --git a/api/current.txt b/api/current.txt index 96108531c323..9eb2075bef9a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4244,6 +4244,7 @@ package android.bluetooth { method public int getProfileConnectionState(int); method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int); method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String); + method public android.bluetooth.BluetoothDevice getRemoteDevice(byte[]); method public int getScanMode(); method public int getState(); method public boolean isDiscovering(); diff --git a/cmds/dumpstate/dumpstate.c b/cmds/dumpstate/dumpstate.c index d5d65c1611b1..02e1f1ce6187 100644 --- a/cmds/dumpstate/dumpstate.c +++ b/cmds/dumpstate/dumpstate.c @@ -92,6 +92,9 @@ static void dumpstate() { LOGI("wrote screenshot: %s\n", screenshot_path); } + run_command("SYSTEM SETTINGS", 20, "su", "root", "sqlite3", + "/data/data/com.android.providers.settings/databases/settings.db", + "pragma user_version; select * from system; select * from secure;", NULL); run_command("SYSTEM LOG", 20, "logcat", "-v", "threadtime", "-d", "*:v", NULL); /* show the traces we collected in main(), if that was done */ @@ -250,6 +253,13 @@ static void dumpstate() { run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL); printf("========================================================\n"); + printf("== Running Application Providers\n"); + printf("========================================================\n"); + + run_command("APP SERVICES", 30, "dumpsys", "activity", "provider", "all", NULL); + + + printf("========================================================\n"); printf("== dumpstate: done\n"); printf("========================================================\n"); } diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 0ec007cf9daa..c0ba543eee36 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -212,6 +212,7 @@ public final class Pm { int getFlags = 0; boolean listDisabled = false, listEnabled = false; boolean listSystem = false, listThirdParty = false; + boolean listInstaller = false; try { String opt; while ((opt=nextOption()) != null) { @@ -229,6 +230,8 @@ public final class Pm { listSystem = true; } else if (opt.equals("-3")) { listThirdParty = true; + } else if (opt.equals("-i")) { + listInstaller = true; } else if (opt.equals("-u")) { getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES; } else { @@ -265,7 +268,12 @@ public final class Pm { System.out.print(info.applicationInfo.sourceDir); System.out.print("="); } - System.out.println(info.packageName); + System.out.print(info.packageName); + if (listInstaller) { + System.out.print(" installer="); + System.out.print(mPm.getInstallerPackageName(info.packageName)); + } + System.out.println(); } } } catch (RemoteException e) { @@ -1109,7 +1117,7 @@ public final class Pm { } private static void showUsage() { - System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-e] [-u] [FILTER]"); + System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [FILTER]"); System.err.println(" pm list permission-groups"); System.err.println(" pm list permissions [-g] [-f] [-d] [-u] [GROUP]"); System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]"); @@ -1134,6 +1142,7 @@ public final class Pm { System.err.println(" -e: filter to only show enabled packages."); System.err.println(" -s: filter to only show system packages."); System.err.println(" -3: filter to only show third party packages."); + System.err.println(" -i: see the installer for the packages."); System.err.println(" -u: also include uninstalled packages."); System.err.println(""); System.err.println("pm list permission-groups: prints all known permission groups."); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 0c761fc4b7e3..9e88bc6e8442 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -813,6 +813,19 @@ public final class ActivityThread { } } + public void dumpProvider(FileDescriptor fd, IBinder providertoken, + String[] args) { + DumpComponentInfo data = new DumpComponentInfo(); + try { + data.fd = ParcelFileDescriptor.dup(fd); + data.token = providertoken; + data.args = args; + queueOrSendMessage(H.DUMP_PROVIDER, data); + } catch (IOException e) { + Slog.w(TAG, "dumpProvider failed", e); + } + } + @Override public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean all, String[] args) { @@ -1044,6 +1057,7 @@ public final class ActivityThread { public void scheduleTrimMemory(int level) { queueOrSendMessage(H.TRIM_MEMORY, null, level); } + } private class H extends Handler { @@ -1088,6 +1102,7 @@ public final class ActivityThread { public static final int SET_CORE_SETTINGS = 138; public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139; public static final int TRIM_MEMORY = 140; + public static final int DUMP_PROVIDER = 141; String codeToString(int code) { if (DEBUG_MESSAGES) { switch (code) { @@ -1132,6 +1147,7 @@ public final class ActivityThread { case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS"; case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO"; case TRIM_MEMORY: return "TRIM_MEMORY"; + case DUMP_PROVIDER: return "DUMP_PROVIDER"; } } return "(unknown)"; @@ -1264,6 +1280,9 @@ public final class ActivityThread { case DUMP_ACTIVITY: handleDumpActivity((DumpComponentInfo)msg.obj); break; + case DUMP_PROVIDER: + handleDumpProvider((DumpComponentInfo)msg.obj); + break; case SLEEPING: handleSleeping((IBinder)msg.obj, msg.arg1 != 0); break; @@ -2347,6 +2366,19 @@ public final class ActivityThread { } } + private void handleDumpProvider(DumpComponentInfo info) { + ProviderClientRecord r = mLocalProviders.get(info.token); + if (r != null && r.mLocalProvider != null) { + PrintWriter pw = new PrintWriter(new FileOutputStream(info.fd.getFileDescriptor())); + r.mLocalProvider.dump(info.fd.getFileDescriptor(), pw, info.args); + pw.flush(); + try { + info.fd.close(); + } catch (IOException e) { + } + } + } + private void handleServiceArgs(ServiceArgsData data) { Service s = mServices.get(data.token); if (s != null) { diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index c4a4feaff611..e6d28ef48c21 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -352,6 +352,21 @@ public abstract class ApplicationThreadNative extends Binder return true; } + case DUMP_PROVIDER_TRANSACTION: { + data.enforceInterface(IApplicationThread.descriptor); + ParcelFileDescriptor fd = data.readFileDescriptor(); + final IBinder service = data.readStrongBinder(); + final String[] args = data.readStringArray(); + if (fd != null) { + dumpProvider(fd.getFileDescriptor(), service, args); + try { + fd.close(); + } catch (IOException e) { + } + } + return true; + } + case SCHEDULE_REGISTERED_RECEIVER_TRANSACTION: { data.enforceInterface(IApplicationThread.descriptor); IIntentReceiver receiver = IIntentReceiver.Stub.asInterface( @@ -931,6 +946,17 @@ class ApplicationThreadProxy implements IApplicationThread { data.recycle(); } + public void dumpProvider(FileDescriptor fd, IBinder token, String[] args) + throws RemoteException { + Parcel data = Parcel.obtain(); + data.writeInterfaceToken(IApplicationThread.descriptor); + data.writeFileDescriptor(fd); + data.writeStrongBinder(token); + data.writeStringArray(args); + mRemote.transact(DUMP_PROVIDER_TRANSACTION, data, null, IBinder.FLAG_ONEWAY); + data.recycle(); + } + public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky) throws RemoteException { diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index 473a2d17ca39..f427e78db96a 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -181,7 +181,8 @@ final class FragmentState implements Parcelable { * * While the Fragment API was introduced in * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API - * is also available for use on older platforms. See the blog post + * at is also available for use on older platforms through + * {@link android.support.v4.app.FragmentActivity}. See the blog post * <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html"> * Fragments For All</a> for more details. * diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index a8c9cbab2095..1abb7dea9949 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -51,6 +51,13 @@ import java.util.Arrays; * <p>For more information about using fragments, read the * <a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</p> * </div> + * + * While the FragmentManager API was introduced in + * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API + * at is also available for use on older platforms through + * {@link android.support.v4.app.FragmentActivity}. See the blog post + * <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html"> + * Fragments For All</a> for more details. */ public abstract class FragmentManager { /** diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index 1253fe7896c4..a3627781bdaf 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -102,6 +102,8 @@ public interface IApplicationThread extends IInterface { void processInBackground() throws RemoteException; void dumpService(FileDescriptor fd, IBinder servicetoken, String[] args) throws RemoteException; + void dumpProvider(FileDescriptor fd, IBinder servicetoken, String[] args) + throws RemoteException; void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String data, Bundle extras, boolean ordered, boolean sticky) throws RemoteException; @@ -171,4 +173,5 @@ public interface IApplicationThread extends IInterface { int SCHEDULE_TRIM_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41; int DUMP_MEM_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+42; int DUMP_GFX_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+43; + int DUMP_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+44; } diff --git a/core/java/android/app/LoaderManager.java b/core/java/android/app/LoaderManager.java index 1b8a4f5ceea8..d83d2e6a80d4 100644 --- a/core/java/android/app/LoaderManager.java +++ b/core/java/android/app/LoaderManager.java @@ -36,7 +36,8 @@ import java.lang.reflect.Modifier; * * While the LoaderManager API was introduced in * {@link android.os.Build.VERSION_CODES#HONEYCOMB}, a version of the API - * is also available for use on older platforms. See the blog post + * at is also available for use on older platforms through + * {@link android.support.v4.app.FragmentActivity}. See the blog post * <a href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html"> * Fragments For All</a> for more details. * diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 5f5ba5041333..e420bfd8c1bf 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -399,6 +399,25 @@ public final class BluetoothAdapter { } /** + * Get a {@link BluetoothDevice} object for the given Bluetooth hardware + * address. + * <p>Valid Bluetooth hardware addresses must be 6 bytes. This method + * expects the address in network byte order (MSB first). + * <p>A {@link BluetoothDevice} will always be returned for a valid + * hardware address, even if this adapter has never seen that device. + * + * @param address Bluetooth MAC address (6 bytes) + * @throws IllegalArgumentException if address is invalid + */ + public BluetoothDevice getRemoteDevice(byte[] address) { + if (address == null || address.length != 6) { + throw new IllegalArgumentException("Bluetooth address must have 6 bytes"); + } + return new BluetoothDevice(String.format("%02X:%02X:%02X:%02X:%02X:%02X", + address[0], address[1], address[2], address[3], address[4], address[5])); + } + + /** * Return true if Bluetooth is currently enabled and ready for use. * <p>Equivalent to: * <code>getBluetoothState() == STATE_ON</code> @@ -1281,7 +1300,7 @@ public final class BluetoothAdapter { } /** - * Validate a Bluetooth address, such as "00:43:A8:23:10:F0" + * Validate a String Bluetooth address, such as "00:43:A8:23:10:F0" * <p>Alphabetic characters must be uppercase to be valid. * * @param address Bluetooth address as string diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java index d71a8d6f73a1..b609c2685300 100644 --- a/core/java/android/content/BroadcastReceiver.java +++ b/core/java/android/content/BroadcastReceiver.java @@ -28,11 +28,21 @@ import android.util.Slog; /** * Base class for code that will receive intents sent by sendBroadcast(). - * You can either dynamically register an instance of this class with + * + * <p>If you don't need to send broadcasts across applications, consider using + * this class with {@link android.support.v4.content.LocalBroadcastManager} instead + * of the more general facilities described below. This will give you a much + * more efficient implementation (no cross-process communication needed) and allow + * you to avoid thinking about any security issues related to other applications + * being able to receive or send your broadcasts. + * + * <p>You can either dynamically register an instance of this class with * {@link Context#registerReceiver Context.registerReceiver()} * or statically publish an implementation through the * {@link android.R.styleable#AndroidManifestReceiver <receiver>} - * tag in your <code>AndroidManifest.xml</code>. <em><strong>Note:</strong></em> + * tag in your <code>AndroidManifest.xml</code>. + * + * <p><em><strong>Note:</strong></em> * If registering a receiver in your * {@link android.app.Activity#onResume() Activity.onResume()} * implementation, you should unregister it in @@ -86,8 +96,8 @@ import android.util.Slog; * * <p>Topics covered here: * <ol> + * <li><a href="#Security">Security</a> * <li><a href="#ReceiverLifecycle">Receiver Lifecycle</a> - * <li><a href="#Permissions">Permissions</a> * <li><a href="#ProcessLifecycle">Process Lifecycle</a> * </ol> * @@ -98,32 +108,39 @@ import android.util.Slog; * developer guide.</p> * </div> * - * <a name="ReceiverLifecycle"></a> - * <h3>Receiver Lifecycle</h3> - * - * <p>A BroadcastReceiver object is only valid for the duration of the call - * to {@link #onReceive}. Once your code returns from this function, - * the system considers the object to be finished and no longer active. - * - * <p>This has important repercussions to what you can do in an - * {@link #onReceive} implementation: anything that requires asynchronous - * operation is not available, because you will need to return from the - * function to handle the asynchronous operation, but at that point the - * BroadcastReceiver is no longer active and thus the system is free to kill - * its process before the asynchronous operation completes. - * - * <p>In particular, you may <i>not</i> show a dialog or bind to a service from - * within a BroadcastReceiver. For the former, you should instead use the - * {@link android.app.NotificationManager} API. For the latter, you can - * use {@link android.content.Context#startService Context.startService()} to - * send a command to the service. - * - * <a name="Permissions"></a> - * <h3>Permissions</h3> - * + * <a name="Security"></a> + * <h3>Security</h3> + * + * <p>Receivers used with the {@link Context} APIs are by their nature a + * cross-application facility, so you must consider how other applications + * may be able to abuse your use of them. Some things to consider are: + * + * <ul> + * <li><p>The Intent namespace is global. Make sure that Intent action names and + * other strings are written in a namespace you own, or else you may inadvertantly + * conflict with other applications. + * <li><p>When you use {@link Context#registerReceiver(BroadcastReceiver, IntentFilter)}, + * <em>any</em> application may send broadcasts to that registered receiver. You can + * control who can send broadcasts to it through permissions described below. + * <li><p>When you publish a receiver in your application's manifest and specify + * intent-filters for it, any other application can send broadcasts to it regardless + * of the filters you specify. To prevent others from sending to it, make it + * unavailable to them with <code>android:exported="false"</code>. + * <li><p>When you use {@link Context#sendBroadcast(Intent)} or related methods, + * normally any other application can receive these broadcasts. You can control who + * can receive such broadcasts through permissions described below. Alternatively, + * starting with {@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}, you + * can also safely restrict the broadcast to a single application with + * {@link Intent#setPackage(String) Intent.setPackage} + * </ul> + * + * <p>None of these issues exist when using + * {@link android.support.v4.content.LocalBroadcastManager}, since intents + * broadcast it never go outside of the current process. + * * <p>Access permissions can be enforced by either the sender or receiver - * of an Intent. - * + * of a broadcast. + * * <p>To enforce a permission when sending, you supply a non-null * <var>permission</var> argument to * {@link Context#sendBroadcast(Intent, String)} or @@ -133,7 +150,7 @@ import android.util.Slog; * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} * tag in their <code>AndroidManifest.xml</code>) will be able to receive * the broadcast. - * + * * <p>To enforce a permission when receiving, you supply a non-null * <var>permission</var> when registering your receiver -- either when calling * {@link Context#registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)} @@ -144,10 +161,30 @@ import android.util.Slog; * {@link android.R.styleable#AndroidManifestUsesPermission <uses-permission>} * tag in their <code>AndroidManifest.xml</code>) will be able to send an * Intent to the receiver. - * + * * <p>See the <a href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a> * document for more information on permissions and security in general. + * + * <a name="ReceiverLifecycle"></a> + * <h3>Receiver Lifecycle</h3> + * + * <p>A BroadcastReceiver object is only valid for the duration of the call + * to {@link #onReceive}. Once your code returns from this function, + * the system considers the object to be finished and no longer active. + * + * <p>This has important repercussions to what you can do in an + * {@link #onReceive} implementation: anything that requires asynchronous + * operation is not available, because you will need to return from the + * function to handle the asynchronous operation, but at that point the + * BroadcastReceiver is no longer active and thus the system is free to kill + * its process before the asynchronous operation completes. * + * <p>In particular, you may <i>not</i> show a dialog or bind to a service from + * within a BroadcastReceiver. For the former, you should instead use the + * {@link android.app.NotificationManager} API. For the latter, you can + * use {@link android.content.Context#startService Context.startService()} to + * send a command to the service. + * * <a name="ProcessLifecycle"></a> * <h3>Process Lifecycle</h3> * diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index 092a0c854f72..116ca4858774 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -32,8 +32,10 @@ import android.os.Process; import android.util.Log; import java.io.File; +import java.io.FileDescriptor; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; /** @@ -1013,4 +1015,19 @@ public abstract class ContentProvider implements ComponentCallbacks2 { Log.w(TAG, "implement ContentProvider shutdown() to make sure all database " + "connections are gracefully shutdown"); } + + /** + * Print the Provider's state into the given stream. This gets invoked if + * you run "adb shell dumpsys activity provider <provider_component_name>". + * + * @param prefix Desired prefix to prepend at each line of output. + * @param fd The raw file descriptor that the dump is being sent to. + * @param writer The PrintWriter to which you should dump your state. This will be + * closed for you after you return. + * @param args additional arguments to the dump request. + * @hide + */ + public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + writer.println("nothing to dump"); + } } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 4e5598b3a0a1..e3b1f541d211 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2318,7 +2318,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2330,7 +2330,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2342,7 +2342,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2354,7 +2354,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2366,7 +2366,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2379,7 +2379,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2391,7 +2391,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2403,7 +2403,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) @@ -2416,7 +2416,7 @@ public class Intent implements Parcelable, Cloneable { * <p>NOTE: This should not be used as the primary key of an Intent, * since it will not result in the app launching with the correct * action and category. Instead, use this with - * {@link #makeMainSelectorActivity(String, String) to generate a main + * {@link #makeMainSelectorActivity(String, String)} to generate a main * Intent with this category in the selector.</p> */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) diff --git a/core/java/android/content/Loader.java b/core/java/android/content/Loader.java index 2d2a90d40ecf..ac056829567f 100644 --- a/core/java/android/content/Loader.java +++ b/core/java/android/content/Loader.java @@ -58,6 +58,13 @@ public class Loader<D> { boolean mReset = true; boolean mContentChanged = false; + /** + * An implementation of a ContentObserver that takes care of connecting + * it to the Loader to have the loader re-load its data when the observer + * is told it has changed. You do not normally need to use this yourself; + * it is used for you by {@link CursorLoader} to take care of executing + * an update when the cursor's backing data changes. + */ public final class ForceLoadContentObserver extends ContentObserver { public ForceLoadContentObserver() { super(new Handler()); @@ -74,6 +81,14 @@ public class Loader<D> { } } + /** + * Interface that is implemented to discover when a Loader has finished + * loading its data. You do not normally need to implement this yourself; + * it is used in the implementation of {@link android.app.LoaderManager} + * to find out when a Loader it is managing has completed so that this can + * be reported to its client. This interface should only be used if a + * Loader is not being used in conjunction with LoaderManager. + */ public interface OnLoadCompleteListener<D> { /** * Called on the thread that created the Loader when the load is complete. diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index 4f190108971c..d38b8da7a82a 100755 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -1889,8 +1889,7 @@ public class Resources { if (cs != null) { dr = cs.newDrawable(this); } else { - if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && - value.type <= TypedValue.TYPE_LAST_COLOR_INT) { + if (isColorDrawable) { dr = new ColorDrawable(value.data); } diff --git a/core/java/android/inputmethodservice/ExtractEditText.java b/core/java/android/inputmethodservice/ExtractEditText.java index 72431f3615b6..10c11958610b 100644 --- a/core/java/android/inputmethodservice/ExtractEditText.java +++ b/core/java/android/inputmethodservice/ExtractEditText.java @@ -158,25 +158,46 @@ public class ExtractEditText extends EditText { } /** - * Delete the range of text, supposedly valid + * {@inheritDoc} * @hide */ @Override protected void deleteText_internal(int start, int end) { - // Do not call the super method. This will change the source TextView instead, which - // will update the ExtractTextView. + // Do not call the super method. + // This will change the source TextView instead, which will update the ExtractTextView. mIME.onExtractedDeleteText(start, end); } /** - * Replaces the range of text [start, end[ by replacement text + * {@inheritDoc} * @hide */ @Override protected void replaceText_internal(int start, int end, CharSequence text) { - // Do not call the super method. This will change the source TextView instead, which - // will update the ExtractTextView. + // Do not call the super method. + // This will change the source TextView instead, which will update the ExtractTextView. mIME.onExtractedReplaceText(start, end, text); } + /** + * {@inheritDoc} + * @hide + */ + @Override + protected void setSpan_internal(Object span, int start, int end, int flags) { + // Do not call the super method. + // This will change the source TextView instead, which will update the ExtractTextView. + mIME.onExtractedSetSpan(span, start, end, flags); + } + + /** + * {@inheritDoc} + * @hide + */ + @Override + protected void setCursorPosition_internal(int start, int end) { + // Do not call the super method. + // This will change the source TextView instead, which will update the ExtractTextView. + mIME.onExtractedSelectionChanged(start, end); + } } diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 02839dbe6770..53cdf2146011 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -2006,6 +2006,22 @@ public class InputMethodService extends AbstractInputMethodService { } /** + * @hide + */ + public void onExtractedSetSpan(Object span, int start, int end, int flags) { + InputConnection conn = getCurrentInputConnection(); + if (conn != null) { + if (!conn.setSelection(start, end)) return; + CharSequence text = conn.getSelectedText(InputConnection.GET_TEXT_WITH_STYLES); + if (text instanceof Spannable) { + ((Spannable) text).setSpan(span, 0, text.length(), flags); + conn.setComposingRegion(start, end); + conn.commitText(text, 1); + } + } + } + + /** * This is called when the user has clicked on the extracted text view, * when running in fullscreen mode. The default implementation hides * the candidates view when this happens, but only if the extracted text diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 1b24f0c7b35f..d9ea7001dd1d 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -39,16 +39,18 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public long warningBytes; public long limitBytes; public long lastSnooze; + public boolean metered; private static final long DEFAULT_MTU = 1500; public NetworkPolicy(NetworkTemplate template, int cycleDay, long warningBytes, long limitBytes, - long lastSnooze) { + long lastSnooze, boolean metered) { this.template = checkNotNull(template, "missing NetworkTemplate"); this.cycleDay = cycleDay; this.warningBytes = warningBytes; this.limitBytes = limitBytes; this.lastSnooze = lastSnooze; + this.metered = metered; } public NetworkPolicy(Parcel in) { @@ -57,6 +59,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { warningBytes = in.readLong(); limitBytes = in.readLong(); lastSnooze = in.readLong(); + metered = in.readInt() != 0; } /** {@inheritDoc} */ @@ -66,6 +69,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { dest.writeLong(warningBytes); dest.writeLong(limitBytes); dest.writeLong(lastSnooze); + dest.writeInt(metered ? 1 : 0); } /** {@inheritDoc} */ @@ -99,16 +103,16 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public int hashCode() { - return Objects.hashCode(template, cycleDay, warningBytes, limitBytes, lastSnooze); + return Objects.hashCode(template, cycleDay, warningBytes, limitBytes, lastSnooze, metered); } @Override public boolean equals(Object obj) { if (obj instanceof NetworkPolicy) { final NetworkPolicy other = (NetworkPolicy) obj; - return Objects.equal(template, other.template) && cycleDay == other.cycleDay - && warningBytes == other.warningBytes && limitBytes == other.limitBytes - && lastSnooze == other.lastSnooze; + return cycleDay == other.cycleDay && warningBytes == other.warningBytes + && limitBytes == other.limitBytes && lastSnooze == other.lastSnooze + && metered == other.metered && Objects.equal(template, other.template); } return false; } @@ -116,7 +120,8 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public String toString() { return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", warningBytes=" - + warningBytes + ", limitBytes=" + limitBytes + ", lastSnooze=" + lastSnooze; + + warningBytes + ", limitBytes=" + limitBytes + ", lastSnooze=" + lastSnooze + + ", metered=" + metered; } public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { diff --git a/core/java/android/nfc/Tag.java b/core/java/android/nfc/Tag.java index a73067a5f709..9fe0bedfe358 100644 --- a/core/java/android/nfc/Tag.java +++ b/core/java/android/nfc/Tag.java @@ -113,7 +113,7 @@ public final class Tag implements Parcelable { /*package*/ final String[] mTechStringList; /*package*/ final Bundle[] mTechExtras; /*package*/ final int mServiceHandle; // for use by NFC service, 0 indicates a mock - /*package*/ final INfcTag mTagService; + /*package*/ final INfcTag mTagService; // interface to NFC service, will be null if mock tag /*package*/ int mConnectedTechnology; @@ -148,7 +148,7 @@ public final class Tag implements Parcelable { * @hide */ public static Tag createMockTag(byte[] id, int[] techList, Bundle[] techListExtras) { - // set serviceHandle to 0 to indicate mock tag + // set serviceHandle to 0 and tagService to null to indicate mock tag return new Tag(id, techList, techListExtras, 0, null); } @@ -266,6 +266,9 @@ public final class Tag implements Parcelable { throw new IllegalStateException("Close connection to the technology first!"); } + if (mTagService == null) { + throw new IOException("Mock tags don't support this operation."); + } try { Tag newTag = mTagService.rediscover(getServiceHandle()); if (newTag != null) { diff --git a/core/java/android/nfc/tech/Ndef.java b/core/java/android/nfc/tech/Ndef.java index b266bb6dd1ed..226e079ca226 100644 --- a/core/java/android/nfc/tech/Ndef.java +++ b/core/java/android/nfc/tech/Ndef.java @@ -259,6 +259,9 @@ public final class Ndef extends BasicTagTechnology { try { INfcTag tagService = mTag.getTagService(); + if (tagService == null) { + throw new IOException("Mock tags don't support this operation."); + } int serviceHandle = mTag.getServiceHandle(); if (tagService.isNdef(serviceHandle)) { NdefMessage msg = tagService.ndefRead(serviceHandle); @@ -303,6 +306,9 @@ public final class Ndef extends BasicTagTechnology { try { INfcTag tagService = mTag.getTagService(); + if (tagService == null) { + throw new IOException("Mock tags don't support this operation."); + } int serviceHandle = mTag.getServiceHandle(); if (tagService.isNdef(serviceHandle)) { int errorCode = tagService.ndefWrite(serviceHandle, msg); @@ -335,6 +341,9 @@ public final class Ndef extends BasicTagTechnology { */ public boolean canMakeReadOnly() { INfcTag tagService = mTag.getTagService(); + if (tagService == null) { + return false; + } try { return tagService.canMakeReadOnly(mNdefType); } catch (RemoteException e) { @@ -366,6 +375,9 @@ public final class Ndef extends BasicTagTechnology { try { INfcTag tagService = mTag.getTagService(); + if (tagService == null) { + return false; + } if (tagService.isNdef(mTag.getServiceHandle())) { int errorCode = tagService.ndefMakeReadOnly(mTag.getServiceHandle()); switch (errorCode) { diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index c25ebb7f815c..24569fa6e9b1 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -337,13 +337,16 @@ public class Binder implements IBinder { try { res = onTransact(code, data, reply, flags); } catch (RemoteException e) { + reply.setDataPosition(0); reply.writeException(e); res = true; } catch (RuntimeException e) { + reply.setDataPosition(0); reply.writeException(e); res = true; } catch (OutOfMemoryError e) { RuntimeException re = new RuntimeException("Out of memory", e); + reply.setDataPosition(0); reply.writeException(re); res = true; } diff --git a/core/java/android/server/BluetoothAdapterStateMachine.java b/core/java/android/server/BluetoothAdapterStateMachine.java index f4a390e32573..ed59b032844d 100644 --- a/core/java/android/server/BluetoothAdapterStateMachine.java +++ b/core/java/android/server/BluetoothAdapterStateMachine.java @@ -360,13 +360,13 @@ final class BluetoothAdapterStateMachine extends StateMachine { boolean retValue = HANDLED; switch(message.what) { case USER_TURN_ON: + broadcastState(BluetoothAdapter.STATE_TURNING_ON); if ((Boolean) message.obj) { persistSwitchSetting(true); } // let it fall to TURN_ON_CONTINUE: //$FALL-THROUGH$ case TURN_ON_CONTINUE: - broadcastState(BluetoothAdapter.STATE_TURNING_ON); mBluetoothService.switchConnectable(true); transitionTo(mSwitching); break; diff --git a/core/java/android/service/textservice/SpellCheckerService.java b/core/java/android/service/textservice/SpellCheckerService.java index 5282e610c30e..2b8a4582896e 100644 --- a/core/java/android/service/textservice/SpellCheckerService.java +++ b/core/java/android/service/textservice/SpellCheckerService.java @@ -24,6 +24,7 @@ import android.app.Service; import android.content.Intent; import android.os.Bundle; import android.os.IBinder; +import android.os.Process; import android.os.RemoteException; import android.util.Log; import android.view.textservice.SuggestionsInfo; @@ -206,11 +207,15 @@ public abstract class SpellCheckerService extends Service { @Override public void onGetSuggestionsMultiple( TextInfo[] textInfos, int suggestionsLimit, boolean sequentialWords) { + int pri = Process.getThreadPriority(Process.myTid()); try { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); mListener.onGetSuggestions( mSession.onGetSuggestionsMultiple( textInfos, suggestionsLimit, sequentialWords)); } catch (RemoteException e) { + } finally { + Process.setThreadPriority(pri); } } @@ -226,13 +231,25 @@ public abstract class SpellCheckerService extends Service { @Override public void onCancel() { - mSession.onCancel(); + int pri = Process.getThreadPriority(Process.myTid()); + try { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + mSession.onCancel(); + } finally { + Process.setThreadPriority(pri); + } } @Override public void onClose() { - mSession.onClose(); - mListener = null; + int pri = Process.getThreadPriority(Process.myTid()); + try { + Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + mSession.onClose(); + } finally { + Process.setThreadPriority(pri); + mListener = null; + } } public String getLocale() { diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java index 231f9132e6ae..b70875060b30 100644 --- a/core/java/android/text/SpannableStringBuilder.java +++ b/core/java/android/text/SpannableStringBuilder.java @@ -863,6 +863,17 @@ public class SpannableStringBuilder implements CharSequence, GetChars, Spannable return new String(buf); } + /** + * Return a String containing a copy of the chars in this buffer, limited to the + * [start, end[ range. + * @hide + */ + public String substring(int start, int end) { + char[] buf = new char[end - start]; + getChars(start, end, buf, 0); + return new String(buf); + } + private TextWatcher[] sendTextWillChange(int start, int before, int after) { TextWatcher[] recip = getSpans(start, start + before, TextWatcher.class); int n = recip.length; diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index b73d90046303..1e8a2f7676de 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -59,6 +59,12 @@ class TextLine { private boolean mCharsValid; private Spanned mSpanned; private final TextPaint mWorkPaint = new TextPaint(); + private final SpanSet<MetricAffectingSpan> mMetricAffectingSpanSpanSet = + new SpanSet<MetricAffectingSpan>(MetricAffectingSpan.class); + private final SpanSet<CharacterStyle> mCharacterStyleSpanSet = + new SpanSet<CharacterStyle>(CharacterStyle.class); + private final SpanSet<ReplacementSpan> mReplacementSpanSpanSet = + new SpanSet<ReplacementSpan>(ReplacementSpan.class); private static final TextLine[] sCached = new TextLine[3]; @@ -96,6 +102,11 @@ class TextLine { tl.mText = null; tl.mPaint = null; tl.mDirections = null; + + tl.mMetricAffectingSpanSpanSet.recycle(); + tl.mCharacterStyleSpanSet.recycle(); + tl.mReplacementSpanSpanSet.recycle(); + synchronized(sCached) { for (int i = 0; i < sCached.length; ++i) { if (sCached[i] == null) { @@ -119,7 +130,6 @@ class TextLine { * @param hasTabs true if the line might contain tabs or emoji * @param tabStops the tabStops. Can be null. */ - @SuppressWarnings("null") void set(TextPaint paint, CharSequence text, int start, int limit, int dir, Directions directions, boolean hasTabs, TabStops tabStops) { mPaint = paint; @@ -135,12 +145,10 @@ class TextLine { mSpanned = null; boolean hasReplacement = false; - SpanSet<ReplacementSpan> replacementSpans = null; if (text instanceof Spanned) { mSpanned = (Spanned) text; - replacementSpans = new SpanSet<ReplacementSpan>(mSpanned, start, limit, - ReplacementSpan.class); - hasReplacement = replacementSpans.numberOfSpans > 0; + mReplacementSpanSpanSet.init(mSpanned, start, limit); + hasReplacement = mReplacementSpanSpanSet.numberOfSpans > 0; } mCharsValid = hasReplacement || hasTabs || directions != Layout.DIRS_ALL_LEFT_TO_RIGHT; @@ -158,9 +166,8 @@ class TextLine { // zero-width characters. char[] chars = mChars; for (int i = start, inext; i < limit; i = inext) { - // replacementSpans cannot be null if hasReplacement is true - inext = replacementSpans.getNextTransition(i, limit); - if (replacementSpans.hasSpansIntersecting(i, inext)) { + inext = mReplacementSpanSpanSet.getNextTransition(i, limit); + if (mReplacementSpanSpanSet.hasSpansIntersecting(i, inext)) { // transition into a span chars[i - start] = '\ufffc'; for (int j = i - start + 1, e = inext - start; j < e; ++j) { @@ -854,23 +861,32 @@ class TextLine { } private static class SpanSet<E> { - final int numberOfSpans; - final E[] spans; - final int[] spanStarts; - final int[] spanEnds; - final int[] spanFlags; + int numberOfSpans; + E[] spans; + int[] spanStarts; + int[] spanEnds; + int[] spanFlags; + final Class<? extends E> classType; + + SpanSet(Class<? extends E> type) { + classType = type; + numberOfSpans = 0; + } @SuppressWarnings("unchecked") - SpanSet(Spanned spanned, int start, int limit, Class<? extends E> type) { - final E[] allSpans = spanned.getSpans(start, limit, type); + public void init(Spanned spanned, int start, int limit) { + final E[] allSpans = spanned.getSpans(start, limit, classType); final int length = allSpans.length; - // These arrays may end up being too large because of empty spans - spans = (E[]) Array.newInstance(type, length); - spanStarts = new int[length]; - spanEnds = new int[length]; - spanFlags = new int[length]; - int count = 0; + if (length > 0 && (spans == null || spans.length < length)) { + // These arrays may end up being too large because of empty spans + spans = (E[]) Array.newInstance(classType, length); + spanStarts = new int[length]; + spanEnds = new int[length]; + spanFlags = new int[length]; + } + + numberOfSpans = 0; for (int i = 0; i < length; i++) { final E span = allSpans[i]; @@ -879,34 +895,14 @@ class TextLine { if (spanStart == spanEnd) continue; final int spanFlag = spanned.getSpanFlags(span); - final int priority = spanFlag & Spanned.SPAN_PRIORITY; - if (priority != 0 && count != 0) { - int j; - - for (j = 0; j < count; j++) { - final int otherPriority = spanFlags[j] & Spanned.SPAN_PRIORITY; - if (priority > otherPriority) break; - } - System.arraycopy(spans, j, spans, j + 1, count - j); - System.arraycopy(spanStarts, j, spanStarts, j + 1, count - j); - System.arraycopy(spanEnds, j, spanEnds, j + 1, count - j); - System.arraycopy(spanFlags, j, spanFlags, j + 1, count - j); + spans[numberOfSpans] = span; + spanStarts[numberOfSpans] = spanStart; + spanEnds[numberOfSpans] = spanEnd; + spanFlags[numberOfSpans] = spanFlag; - spans[j] = span; - spanStarts[j] = spanStart; - spanEnds[j] = spanEnd; - spanFlags[j] = spanFlag; - } else { - spans[i] = span; - spanStarts[i] = spanStart; - spanEnds[i] = spanEnd; - spanFlags[i] = spanFlag; - } - - count++; + numberOfSpans++; } - numberOfSpans = count; } public boolean hasSpansIntersecting(int start, int end) { @@ -927,6 +923,13 @@ class TextLine { } return limit; } + + public void recycle() { + // The spans array is guaranteed to be not null when numberOfSpans is > 0 + for (int i = 0; i < numberOfSpans; i++) { + spans[i] = null; // prevent a leak: no reference kept when TextLine is recycled + } + } } /** @@ -970,10 +973,8 @@ class TextLine { y, bottom, fmi, needWidth || mlimit < measureLimit); } - final SpanSet<MetricAffectingSpan> metricAffectingSpans = new SpanSet<MetricAffectingSpan>( - mSpanned, mStart + start, mStart + limit, MetricAffectingSpan.class); - final SpanSet<CharacterStyle> characterStyleSpans = new SpanSet<CharacterStyle>( - mSpanned, mStart + start, mStart + limit, CharacterStyle.class); + mMetricAffectingSpanSpanSet.init(mSpanned, mStart + start, mStart + limit); + mCharacterStyleSpanSet.init(mSpanned, mStart + start, mStart + limit); // Shaping needs to take into account context up to metric boundaries, // but rendering needs to take into account character style boundaries. @@ -985,17 +986,18 @@ class TextLine { TextPaint wp = mWorkPaint; wp.set(mPaint); - inext = metricAffectingSpans.getNextTransition(mStart + i, mStart + limit) - mStart; + inext = mMetricAffectingSpanSpanSet.getNextTransition(mStart + i, mStart + limit) - + mStart; int mlimit = Math.min(inext, measureLimit); ReplacementSpan replacement = null; - for (int j = 0; j < metricAffectingSpans.numberOfSpans; j++) { + for (int j = 0; j < mMetricAffectingSpanSpanSet.numberOfSpans; j++) { // Both intervals [spanStarts..spanEnds] and [mStart + i..mStart + mlimit] are NOT // empty by construction. This special case in getSpans() explains the >= & <= tests - if ((metricAffectingSpans.spanStarts[j] >= mStart + mlimit) || - (metricAffectingSpans.spanEnds[j] <= mStart + i)) continue; - MetricAffectingSpan span = metricAffectingSpans.spans[j]; + if ((mMetricAffectingSpanSpanSet.spanStarts[j] >= mStart + mlimit) || + (mMetricAffectingSpanSpanSet.spanEnds[j] <= mStart + i)) continue; + MetricAffectingSpan span = mMetricAffectingSpanSpanSet.spans[j]; if (span instanceof ReplacementSpan) { replacement = (ReplacementSpan)span; } else { @@ -1016,16 +1018,16 @@ class TextLine { y, bottom, fmi, needWidth || mlimit < measureLimit); } else { for (int j = i, jnext; j < mlimit; j = jnext) { - jnext = characterStyleSpans.getNextTransition(mStart + j, mStart + mlimit) - + jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + mlimit) - mStart; wp.set(mPaint); - for (int k = 0; k < characterStyleSpans.numberOfSpans; k++) { + for (int k = 0; k < mCharacterStyleSpanSet.numberOfSpans; k++) { // Intentionally using >= and <= as explained above - if ((characterStyleSpans.spanStarts[k] >= mStart + jnext) || - (characterStyleSpans.spanEnds[k] <= mStart + j)) continue; + if ((mCharacterStyleSpanSet.spanStarts[k] >= mStart + jnext) || + (mCharacterStyleSpanSet.spanEnds[k] <= mStart + j)) continue; - CharacterStyle span = characterStyleSpans.spans[k]; + CharacterStyle span = mCharacterStyleSpanSet.spans[k]; span.updateDrawState(wp); } diff --git a/core/java/android/text/format/Formatter.java b/core/java/android/text/format/Formatter.java index 5ae65df9826a..121c6f2f9324 100644 --- a/core/java/android/text/format/Formatter.java +++ b/core/java/android/text/format/Formatter.java @@ -21,7 +21,7 @@ import android.net.NetworkUtils; /** * Utility class to aid in formatting common values that are not covered - * by {@link java.util.Formatter} + * by the {@link java.util.Formatter} class in {@link java.util} */ public final class Formatter { diff --git a/core/java/android/text/format/package.html b/core/java/android/text/format/package.html new file mode 100644 index 000000000000..b9e6a44f60e0 --- /dev/null +++ b/core/java/android/text/format/package.html @@ -0,0 +1,7 @@ +<HTML> +<BODY> +This package contains alternative classes for some text formatting classes +defined in {@link java.util} and {@link java.text}. It also contains additional text formatting +classes for situations not covered by {@link java.util} or {@link java.text}. +</BODY> +</HTML> diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java index 239d9e8c5726..11226a98f753 100644 --- a/core/java/android/text/method/WordIterator.java +++ b/core/java/android/text/method/WordIterator.java @@ -18,6 +18,7 @@ package android.text.method; import android.text.Selection; +import android.text.SpannableStringBuilder; import java.text.BreakIterator; import java.util.Locale; @@ -58,7 +59,11 @@ public class WordIterator implements Selection.PositionIterator { mOffsetShift = Math.max(0, start - WINDOW_WIDTH); final int windowEnd = Math.min(charSequence.length(), end + WINDOW_WIDTH); - mString = charSequence.toString().substring(mOffsetShift, windowEnd); + if (charSequence instanceof SpannableStringBuilder) { + mString = ((SpannableStringBuilder) charSequence).substring(mOffsetShift, windowEnd); + } else { + mString = charSequence.subSequence(mOffsetShift, windowEnd).toString(); + } mIterator.setText(mString); } diff --git a/core/java/android/text/style/SuggestionSpan.java b/core/java/android/text/style/SuggestionSpan.java index ed2af10bcf03..0f26a34ece8d 100644 --- a/core/java/android/text/style/SuggestionSpan.java +++ b/core/java/android/text/style/SuggestionSpan.java @@ -92,11 +92,6 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan { private float mAutoCorrectionUnderlineThickness; private int mAutoCorrectionUnderlineColor; - /* - * TODO: If switching IME is required, needs to add parameters for ids of InputMethodInfo - * and InputMethodSubtype. - */ - /** * @param context Context for the application * @param suggestions Suggestions for the string under the span @@ -146,6 +141,16 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan { } private void initStyle(Context context) { + if (context == null) { + mMisspelledUnderlineThickness = 0; + mEasyCorrectUnderlineThickness = 0; + mAutoCorrectionUnderlineThickness = 0; + mMisspelledUnderlineColor = Color.BLACK; + mEasyCorrectUnderlineColor = Color.BLACK; + mAutoCorrectionUnderlineColor = Color.BLACK; + return; + } + int defStyle = com.android.internal.R.attr.textAppearanceMisspelledSuggestion; TypedArray typedArray = context.obtainStyledAttributes( null, com.android.internal.R.styleable.SuggestionSpan, defStyle, 0); @@ -169,7 +174,6 @@ public class SuggestionSpan extends CharacterStyle implements ParcelableSpan { com.android.internal.R.styleable.SuggestionSpan_textUnderlineThickness, 0); mAutoCorrectionUnderlineColor = typedArray.getColor( com.android.internal.R.styleable.SuggestionSpan_textUnderlineColor, Color.BLACK); - } public SuggestionSpan(Parcel src) { diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 443acf68411c..3f793bb24428 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -441,6 +441,8 @@ public abstract class HardwareRenderer { } boolean mDirtyRegionsEnabled; + boolean mUpdateDirtyRegions; + final boolean mVsyncDisabled; final int mGlVersion; @@ -675,6 +677,12 @@ public abstract class HardwareRenderer { initCaches(); + enableDirtyRegions(); + + return mEglContext.getGL(); + } + + private void enableDirtyRegions() { // If mDirtyRegions is set, this means we have an EGL configuration // with EGL_SWAP_BEHAVIOR_PRESERVED_BIT set if (sDirtyRegions) { @@ -690,8 +698,6 @@ public abstract class HardwareRenderer { // configuration (see RENDER_DIRTY_REGIONS) mDirtyRegionsEnabled = GLES20Canvas.isBackBufferPreserved(); } - - return mEglContext.getGL(); } abstract void initCaches(); @@ -745,6 +751,9 @@ public abstract class HardwareRenderer { if (!createSurface(holder)) { return; } + + mUpdateDirtyRegions = true; + if (mCanvas != null) { setEnabled(true); } @@ -943,6 +952,10 @@ public abstract class HardwareRenderer { fallback(true); return SURFACE_STATE_ERROR; } else { + if (mUpdateDirtyRegions) { + enableDirtyRegions(); + mUpdateDirtyRegions = false; + } return SURFACE_STATE_UPDATED; } } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 1102a47984ee..0d34b90cc632 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -4190,10 +4190,10 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager * {@inheritDoc} */ public boolean getChildVisibleRect(View child, Rect r, android.graphics.Point offset) { - // The View is not attached to a window, 'visible' does not make sense, return false - if (mAttachInfo == null) return false; - - final RectF rect = mAttachInfo.mTmpTransformRect; + // It doesn't make a whole lot of sense to call this on a view that isn't attached, + // but for some simple tests it can be useful. If we don't have attach info this + // will allocate memory. + final RectF rect = mAttachInfo != null ? mAttachInfo.mTmpTransformRect : new RectF(); rect.set(r); if (!child.hasIdentityMatrix()) { @@ -4207,7 +4207,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (offset != null) { if (!child.hasIdentityMatrix()) { - float[] position = mAttachInfo.mTmpTransformLocation; + float[] position = mAttachInfo != null ? mAttachInfo.mTmpTransformLocation + : new float[2]; position[0] = offset.x; position[1] = offset.y; child.getMatrix().mapPoints(position); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 7a9d82c1b31b..72966ef4dbbb 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3257,8 +3257,9 @@ public final class ViewRootImpl extends Handler implements ViewParent, } // If the Control modifier is held, try to interpret the key as a shortcut. - if (event.getAction() == KeyEvent.ACTION_UP + if (event.getAction() == KeyEvent.ACTION_DOWN && event.isCtrlPressed() + && event.getRepeatCount() == 0 && !KeyEvent.isModifierKey(event.getKeyCode())) { if (mView.dispatchKeyShortcutEvent(event)) { finishInputEvent(q, true); diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java index 48fe0df89577..24a3066164c1 100644 --- a/core/java/android/view/VolumePanel.java +++ b/core/java/android/view/VolumePanel.java @@ -400,7 +400,7 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie if (LOGD) Log.d(TAG, "onVolumeChanged(streamType: " + streamType + ", flags: " + flags + ")"); if ((flags & AudioManager.FLAG_SHOW_UI) != 0) { - if (mActiveStreamType == -1) { + if (mActiveStreamType != streamType) { reorderSliders(streamType); } onShowVolumeChanged(streamType, flags); diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index d0841dd2b3e7..a99ac03e0570 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -743,6 +743,9 @@ public abstract class Window { public void setFlags(int flags, int mask) { final WindowManager.LayoutParams attrs = getAttributes(); attrs.flags = (attrs.flags&~mask) | (flags&mask); + if ((mask&WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0) { + attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY; + } mForcedWindowFlags |= mask; if (mCallback != null) { mCallback.onWindowAttributesChanged(attrs); diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index e74fec6082a4..c0eb65bf73f4 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -824,6 +824,16 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_WANTS_OFFSET_NOTIFICATIONS = 0x00000004; /** + * This is set for a window that has explicitly specified its + * FLAG_NEEDS_MENU_KEY, so we know the value on this window is the + * appropriate one to use. If this is not set, we should look at + * windows behind it to determine the appropriate value. + * + * @hide + */ + public static final int PRIVATE_FLAG_SET_NEEDS_MENU_KEY = 0x00000008; + + /** * Control flags that are private to the platform. * @hide */ diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 7d729c68ab4d..c7cd662d2c27 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -238,6 +238,14 @@ public interface WindowManagerPolicy { public WindowManager.LayoutParams getAttrs(); /** + * Return whether this window needs the menu key shown. Must be called + * with window lock held, because it may need to traverse down through + * window list to determine the result. + * @param bottom The bottom-most window to consider when determining this. + */ + public boolean getNeedsMenuLw(WindowState bottom); + + /** * Retrieve the current system UI visibility flags associated with * this window. */ diff --git a/core/java/android/view/textservice/SpellCheckerSession.java b/core/java/android/view/textservice/SpellCheckerSession.java index 1d66cbe81c32..f6418ce6f1ce 100644 --- a/core/java/android/view/textservice/SpellCheckerSession.java +++ b/core/java/android/view/textservice/SpellCheckerSession.java @@ -21,8 +21,11 @@ import com.android.internal.textservice.ISpellCheckerSessionListener; import com.android.internal.textservice.ITextServicesManager; import com.android.internal.textservice.ITextServicesSessionListener; +import android.os.Binder; import android.os.Handler; +import android.os.HandlerThread; import android.os.Message; +import android.os.Process; import android.os.RemoteException; import android.util.Log; import android.view.textservice.SpellCheckerInfo; @@ -226,6 +229,8 @@ public class SpellCheckerSession { private boolean mOpened; private ISpellCheckerSession mISpellCheckerSession; + private HandlerThread mThread; + private Handler mAsyncHandler; public SpellCheckerSessionListenerImpl(Handler handler) { mOpened = false; @@ -237,6 +242,7 @@ public class SpellCheckerSession { public final TextInfo[] mTextInfos; public final int mSuggestionsLimit; public final boolean mSequentialWords; + public ISpellCheckerSession mSession; public SpellCheckerParams(int what, TextInfo[] textInfos, int suggestionsLimit, boolean sequentialWords) { mWhat = what; @@ -246,30 +252,100 @@ public class SpellCheckerSession { } } - private void processTask(SpellCheckerParams scp) { - switch (scp.mWhat) { - case TASK_CANCEL: - processCancel(); - break; - case TASK_GET_SUGGESTIONS_MULTIPLE: - processGetSuggestionsMultiple(scp); - break; - case TASK_CLOSE: - processClose(); - break; - case TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE: - processGetSuggestionsMultipleForSentence(scp); - break; + private void processTask(ISpellCheckerSession session, SpellCheckerParams scp, + boolean async) { + if (async || mAsyncHandler == null) { + switch (scp.mWhat) { + case TASK_CANCEL: + if (DBG) { + Log.w(TAG, "Cancel spell checker tasks."); + } + try { + session.onCancel(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to cancel " + e); + } + break; + case TASK_GET_SUGGESTIONS_MULTIPLE: + if (DBG) { + Log.w(TAG, "Get suggestions from the spell checker."); + } + try { + session.onGetSuggestionsMultiple(scp.mTextInfos, + scp.mSuggestionsLimit, scp.mSequentialWords); + } catch (RemoteException e) { + Log.e(TAG, "Failed to get suggestions " + e); + } + break; + case TASK_GET_SUGGESTIONS_MULTIPLE_FOR_SENTENCE: + if (DBG) { + Log.w(TAG, "Get suggestions from the spell checker."); + } + if (scp.mTextInfos.length != 1) { + throw new IllegalArgumentException(); + } + try { + session.onGetSuggestionsMultipleForSentence( + scp.mTextInfos, scp.mSuggestionsLimit); + } catch (RemoteException e) { + Log.e(TAG, "Failed to get suggestions " + e); + } + break; + case TASK_CLOSE: + if (DBG) { + Log.w(TAG, "Close spell checker tasks."); + } + try { + session.onClose(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to close " + e); + } + break; + } + } else { + // The interface is to a local object, so need to execute it + // asynchronously. + scp.mSession = session; + mAsyncHandler.sendMessage(Message.obtain(mAsyncHandler, 1, scp)); + } + + if (scp.mWhat == TASK_CLOSE) { + // If we are closing, we want to clean up our state now even + // if it is pending as an async operation. + synchronized (this) { + mISpellCheckerSession = null; + mHandler = null; + if (mThread != null) { + mThread.quit(); + } + mThread = null; + mAsyncHandler = null; + } } } public synchronized void onServiceConnected(ISpellCheckerSession session) { - mISpellCheckerSession = session; - mOpened = true; + synchronized (this) { + mISpellCheckerSession = session; + if (session.asBinder() instanceof Binder && mThread == null) { + // If this is a local object, we need to do our own threading + // to make sure we handle it asynchronously. + mThread = new HandlerThread("SpellCheckerSession", + Process.THREAD_PRIORITY_BACKGROUND); + mThread.start(); + mAsyncHandler = new Handler(mThread.getLooper()) { + @Override public void handleMessage(Message msg) { + SpellCheckerParams scp = (SpellCheckerParams)msg.obj; + processTask(scp.mSession, scp, true); + } + }; + } + mOpened = true; + } if (DBG) Log.d(TAG, "onServiceConnected - Success"); while (!mPendingTasks.isEmpty()) { - processTask(mPendingTasks.poll()); + processTask(session, mPendingTasks.poll(), false); } } @@ -310,105 +386,43 @@ public class SpellCheckerSession { return mOpened && mISpellCheckerSession == null; } - public boolean checkOpenConnection() { - if (mISpellCheckerSession != null) { - return true; - } - Log.e(TAG, "not connected to the spellchecker service."); - return false; - } - private void processOrEnqueueTask(SpellCheckerParams scp) { if (DBG) { Log.d(TAG, "process or enqueue task: " + mISpellCheckerSession); } - SpellCheckerParams closeTask = null; - if (mISpellCheckerSession == null) { - if (scp.mWhat == TASK_CANCEL) { - while (!mPendingTasks.isEmpty()) { - final SpellCheckerParams tmp = mPendingTasks.poll(); - if (tmp.mWhat == TASK_CLOSE) { - // Only one close task should be processed, while we need to remove all - // close tasks from the queue - closeTask = tmp; + ISpellCheckerSession session; + synchronized (this) { + session = mISpellCheckerSession; + if (session == null) { + SpellCheckerParams closeTask = null; + if (scp.mWhat == TASK_CANCEL) { + while (!mPendingTasks.isEmpty()) { + final SpellCheckerParams tmp = mPendingTasks.poll(); + if (tmp.mWhat == TASK_CLOSE) { + // Only one close task should be processed, while we need to remove all + // close tasks from the queue + closeTask = tmp; + } } } + mPendingTasks.offer(scp); + if (closeTask != null) { + mPendingTasks.offer(closeTask); + } + return; } - mPendingTasks.offer(scp); - if (closeTask != null) { - mPendingTasks.offer(closeTask); - } - } else { - processTask(scp); - } - } - - private void processCancel() { - if (!checkOpenConnection()) { - return; - } - if (DBG) { - Log.w(TAG, "Cancel spell checker tasks."); - } - try { - mISpellCheckerSession.onCancel(); - } catch (RemoteException e) { - Log.e(TAG, "Failed to cancel " + e); - } - } - - private void processClose() { - if (!checkOpenConnection()) { - return; - } - if (DBG) { - Log.w(TAG, "Close spell checker tasks."); - } - try { - mISpellCheckerSession.onClose(); - mISpellCheckerSession = null; - mHandler = null; - } catch (RemoteException e) { - Log.e(TAG, "Failed to close " + e); - } - } - - private void processGetSuggestionsMultiple(SpellCheckerParams scp) { - if (!checkOpenConnection()) { - return; - } - if (DBG) { - Log.w(TAG, "Get suggestions from the spell checker."); - } - try { - mISpellCheckerSession.onGetSuggestionsMultiple( - scp.mTextInfos, scp.mSuggestionsLimit, scp.mSequentialWords); - } catch (RemoteException e) { - Log.e(TAG, "Failed to get suggestions " + e); - } - } - - private void processGetSuggestionsMultipleForSentence(SpellCheckerParams scp) { - if (!checkOpenConnection()) { - return; - } - if (DBG) { - Log.w(TAG, "Get suggestions from the spell checker."); - } - if (scp.mTextInfos.length != 1) { - throw new IllegalArgumentException(); - } - try { - mISpellCheckerSession.onGetSuggestionsMultipleForSentence( - scp.mTextInfos, scp.mSuggestionsLimit); - } catch (RemoteException e) { - Log.e(TAG, "Failed to get suggestions " + e); } + processTask(session, scp, false); } @Override public void onGetSuggestions(SuggestionsInfo[] results) { - mHandler.sendMessage(Message.obtain(mHandler, MSG_ON_GET_SUGGESTION_MULTIPLE, results)); + synchronized (this) { + if (mHandler != null) { + mHandler.sendMessage(Message.obtain(mHandler, + MSG_ON_GET_SUGGESTION_MULTIPLE, results)); + } + } } @Override diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index c1945599d337..0da867f0fb80 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -410,6 +410,7 @@ class BrowserFrame extends Handler { mCommitted = false; // remove pending draw to block update until mFirstLayoutDone is // set to true in didFirstLayout() + mWebViewCore.clearContent(); mWebViewCore.removeMessages(WebViewCore.EventHub.WEBKIT_DRAW); } } @@ -1180,11 +1181,19 @@ class BrowserFrame extends Handler { @Override public void proceed() { SslCertLookupTable.getInstance().setIsAllowed(sslError); - nativeSslCertErrorProceed(handle); + post(new Runnable() { + public void run() { + nativeSslCertErrorProceed(handle); + } + }); } @Override public void cancel() { - nativeSslCertErrorCancel(handle, certError); + post(new Runnable() { + public void run() { + nativeSslCertErrorCancel(handle, certError); + } + }); } }; mCallbackProxy.onReceivedSslError(handler, sslError); diff --git a/core/java/android/webkit/ClientCertRequestHandler.java b/core/java/android/webkit/ClientCertRequestHandler.java index 3a71e7e5bc33..f86261305559 100644 --- a/core/java/android/webkit/ClientCertRequestHandler.java +++ b/core/java/android/webkit/ClientCertRequestHandler.java @@ -16,6 +16,7 @@ package android.webkit; +import android.os.Handler; import java.security.PrivateKey; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; @@ -29,7 +30,7 @@ import org.apache.harmony.xnet.provider.jsse.NativeCrypto; * * @hide */ -public final class ClientCertRequestHandler { +public final class ClientCertRequestHandler extends Handler { private final BrowserFrame mBrowserFrame; private final int mHandle; @@ -49,23 +50,35 @@ public final class ClientCertRequestHandler { * Proceed with the specified private key and client certificate chain. */ public void proceed(PrivateKey privateKey, X509Certificate[] chain) { - byte[] privateKeyBytes = privateKey.getEncoded(); - byte[][] chainBytes; + final byte[] privateKeyBytes = privateKey.getEncoded(); + final byte[][] chainBytes; try { chainBytes = NativeCrypto.encodeCertificates(chain); + mTable.Allow(mHostAndPort, privateKeyBytes, chainBytes); + post(new Runnable() { + public void run() { + mBrowserFrame.nativeSslClientCert(mHandle, privateKeyBytes, chainBytes); + } + }); } catch (CertificateEncodingException e) { - mBrowserFrame.nativeSslClientCert(mHandle, null, null); - return; + post(new Runnable() { + public void run() { + mBrowserFrame.nativeSslClientCert(mHandle, null, null); + return; + } + }); } - mTable.Allow(mHostAndPort, privateKeyBytes, chainBytes); - mBrowserFrame.nativeSslClientCert(mHandle, privateKeyBytes, chainBytes); } /** * Igore the request for now, the user may be prompted again. */ public void ignore() { - mBrowserFrame.nativeSslClientCert(mHandle, null, null); + post(new Runnable() { + public void run() { + mBrowserFrame.nativeSslClientCert(mHandle, null, null); + } + }); } /** @@ -73,6 +86,10 @@ public final class ClientCertRequestHandler { */ public void cancel() { mTable.Deny(mHostAndPort); - mBrowserFrame.nativeSslClientCert(mHandle, null, null); + post(new Runnable() { + public void run() { + mBrowserFrame.nativeSslClientCert(mHandle, null, null); + } + }); } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index a284a17dad91..b1e113295e8a 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -2571,7 +2571,8 @@ public class WebView extends AbsoluteLayout if (text != null) { if (text.startsWith(SCHEME_TEL)) { result.setType(HitTestResult.PHONE_TYPE); - result.setExtra(text.substring(SCHEME_TEL.length())); + result.setExtra(URLDecoder.decode(text + .substring(SCHEME_TEL.length()))); } else if (text.startsWith(SCHEME_MAILTO)) { result.setType(HitTestResult.EMAIL_TYPE); result.setExtra(text.substring(SCHEME_MAILTO.length())); @@ -4538,7 +4539,7 @@ public class WebView extends AbsoluteLayout boolean isPictureAfterFirstLayout, boolean registerPageSwapCallback) { if (mNativeClass == 0) return; - nativeSetBaseLayer(layer, invalRegion, showVisualIndicator, + nativeSetBaseLayer(mNativeClass, layer, invalRegion, showVisualIndicator, isPictureAfterFirstLayout, registerPageSwapCallback); if (mHTML5VideoViewProxy != null) { mHTML5VideoViewProxy.setBaseLayer(layer); @@ -9493,7 +9494,12 @@ public class WebView extends AbsoluteLayout /** @hide call pageSwapCallback upon next page swap */ protected void registerPageSwapCallback() { - nativeRegisterPageSwapCallback(); + nativeRegisterPageSwapCallback(mNativeClass); + } + + /** @hide discard all textures from tiles */ + protected void discardAllTextures() { + nativeDiscardAllTextures(); } /** @@ -9643,7 +9649,8 @@ public class WebView extends AbsoluteLayout private native void nativeSetFindIsEmpty(); private native void nativeSetFindIsUp(boolean isUp); private native void nativeSetHeightCanMeasure(boolean measure); - private native void nativeSetBaseLayer(int layer, Region invalRegion, + private native void nativeSetBaseLayer(int nativeInstance, + int layer, Region invalRegion, boolean showVisualIndicator, boolean isPictureAfterFirstLayout, boolean registerPageSwapCallback); private native int nativeGetBaseLayer(); @@ -9657,7 +9664,8 @@ public class WebView extends AbsoluteLayout private native void nativeStopGL(); private native Rect nativeSubtractLayers(Rect content); private native int nativeTextGeneration(); - private native void nativeRegisterPageSwapCallback(); + private native void nativeRegisterPageSwapCallback(int nativeInstance); + private native void nativeDiscardAllTextures(); private native void nativeTileProfilingStart(); private native float nativeTileProfilingStop(); private native void nativeTileProfilingClear(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 14da23ec6628..d99e264a632b 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -497,6 +497,13 @@ public final class WebViewCore { message.sendToTarget(); } + /** + * Clear the picture set. To be called only on the WebCore thread. + */ + /* package */ void clearContent() { + nativeClearContent(); + } + //------------------------------------------------------------------------- // JNI methods //------------------------------------------------------------------------- @@ -1560,7 +1567,7 @@ public final class WebViewCore { // Clear the view so that onDraw() will draw nothing // but white background // (See public method WebView.clearView) - nativeClearContent(); + clearContent(); break; case MESSAGE_RELAY: @@ -2865,6 +2872,6 @@ public final class WebViewCore { private native ArrayList<Rect> nativeGetTouchHighlightRects(int x, int y, int slop); - private native void nativeAutoFillForm(int queryId); - private native void nativeScrollLayer(int layer, Rect rect); + private native void nativeAutoFillForm(int queryId); + private native void nativeScrollLayer(int layer, Rect rect); } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 9d541e068d6d..7d0f98e7897b 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -774,6 +774,7 @@ public class NumberPicker extends LinearLayout { mBeginEditOnUpEvent = false; mAdjustScrollerOnUpEvent = true; if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { + mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); boolean scrollersFinished = mFlingScroller.isFinished() && mAdjustScroller.isFinished(); if (!scrollersFinished) { @@ -1608,23 +1609,11 @@ public class NumberPicker extends LinearLayout { */ private void fling(int velocityY) { mPreviousScrollerY = 0; - Scroller flingScroller = mFlingScroller; - if (mWrapSelectorWheel) { - if (velocityY > 0) { - flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); - } else { - flingScroller.fling(0, Integer.MAX_VALUE, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); - } + if (velocityY > 0) { + mFlingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); } else { - if (velocityY > 0) { - int maxY = mTextSize * (mValue - mMinValue); - flingScroller.fling(0, 0, 0, velocityY, 0, 0, 0, maxY); - } else { - int startY = mTextSize * (mMaxValue - mValue); - int maxY = startY; - flingScroller.fling(0, startY, 0, velocityY, 0, 0, 0, maxY); - } + mFlingScroller.fling(0, Integer.MAX_VALUE, 0, velocityY, 0, 0, 0, Integer.MAX_VALUE); } invalidate(); diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java index 4bd7165786f1..a10615956a20 100644 --- a/core/java/android/widget/SpellChecker.java +++ b/core/java/android/widget/SpellChecker.java @@ -19,6 +19,7 @@ package android.widget; import android.content.Context; import android.text.Editable; import android.text.Selection; +import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.method.WordIterator; import android.text.style.SpellCheckSpan; @@ -44,14 +45,15 @@ public class SpellChecker implements SpellCheckerSessionListener { // No more than this number of words will be parsed on each iteration to ensure a minimum // lock of the UI thread - public static final int MAX_NUMBER_OF_WORDS = 10; + public static final int MAX_NUMBER_OF_WORDS = 50; - // Safe estimate, will ensure that the interval below usually does not have to be updated - public static final int AVERAGE_WORD_LENGTH = 10; + // Rough estimate, such that the word iterator interval usually does not need to be shifted + public static final int AVERAGE_WORD_LENGTH = 7; // When parsing, use a character window of that size. Will be shifted if needed public static final int WORD_ITERATOR_INTERVAL = AVERAGE_WORD_LENGTH * MAX_NUMBER_OF_WORDS; + // Pause between each spell check to keep the UI smooth private final static int SPELL_PAUSE_DURATION = 400; // milliseconds private final TextView mTextView; @@ -74,6 +76,14 @@ public class SpellChecker implements SpellCheckerSessionListener { private Locale mCurrentLocale; + // Shared by all SpellParsers. Cannot be shared with TextView since it may be used + // concurrently due to the asynchronous nature of onGetSuggestions. + private WordIterator mWordIterator; + + private TextServicesManager mTextServicesManager; + + private Runnable mSpellRunnable; + public SpellChecker(TextView textView) { mTextView = textView; @@ -87,19 +97,19 @@ public class SpellChecker implements SpellCheckerSessionListener { mCookie = hashCode(); } - private void setLocale(Locale locale) { + private void resetSession() { closeSession(); - final TextServicesManager textServicesManager = (TextServicesManager) - mTextView.getContext().getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE); - if (!textServicesManager.isSpellCheckerEnabled()) { + + mTextServicesManager = (TextServicesManager) mTextView.getContext(). + getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE); + if (!mTextServicesManager.isSpellCheckerEnabled()) { mSpellCheckerSession = null; } else { - mSpellCheckerSession = textServicesManager.newSpellCheckerSession( + mSpellCheckerSession = mTextServicesManager.newSpellCheckerSession( null /* Bundle not currently used by the textServicesManager */, - locale, this, + mCurrentLocale, this, false /* means any available languages from current spell checker */); } - mCurrentLocale = locale; // Restore SpellCheckSpans in pool for (int i = 0; i < mLength; i++) { @@ -108,9 +118,19 @@ public class SpellChecker implements SpellCheckerSessionListener { } mLength = 0; - mSpellParsers = new SpellParser[0]; + // Remove existing misspelled SuggestionSpans + mTextView.removeMisspelledSpans((Editable) mTextView.getText()); + } - // This class is the global listener for locale change: warn other locale-aware objects + private void setLocale(Locale locale) { + mCurrentLocale = locale; + + resetSession(); + + // Change SpellParsers' wordIterator locale + mWordIterator = new WordIterator(locale); + + // This class is the listener for locale change: warn other locale-aware objects mTextView.onLocaleChanged(); } @@ -127,14 +147,14 @@ public class SpellChecker implements SpellCheckerSessionListener { mSpellCheckerSession.close(); } - stopAllSpellParsers(); - } - - private void stopAllSpellParsers() { final int length = mSpellParsers.length; for (int i = 0; i < length; i++) { mSpellParsers[i].stop(); } + + if (mSpellRunnable != null) { + mTextView.removeCallbacks(mSpellRunnable); + } } private int nextSpellCheckSpanIndex() { @@ -184,6 +204,12 @@ public class SpellChecker implements SpellCheckerSessionListener { // Re-check the entire text start = 0; end = mTextView.getText().length(); + } else { + final boolean spellCheckerActivated = mTextServicesManager.isSpellCheckerEnabled(); + if (isSessionActive() != spellCheckerActivated) { + // Spell checker has been turned of or off since last spellCheck + resetSession(); + } } if (!isSessionActive()) return; @@ -192,7 +218,7 @@ public class SpellChecker implements SpellCheckerSessionListener { final int length = mSpellParsers.length; for (int i = 0; i < length; i++) { final SpellParser spellParser = mSpellParsers[i]; - if (!spellParser.isParsing()) { + if (spellParser.isFinished()) { spellParser.init(start, end); spellParser.parse(); return; @@ -220,7 +246,6 @@ public class SpellChecker implements SpellCheckerSessionListener { TextInfo[] textInfos = new TextInfo[mLength]; int textInfosCount = 0; - final String text = editable.toString(); for (int i = 0; i < mLength; i++) { final SpellCheckSpan spellCheckSpan = mSpellCheckSpans[i]; if (spellCheckSpan.isSpellCheckInProgress()) continue; @@ -230,7 +255,9 @@ public class SpellChecker implements SpellCheckerSessionListener { // Do not check this word if the user is currently editing it if (start >= 0 && end > start && (selectionEnd < start || selectionStart > end)) { - final String word = text.substring(start, end); + final String word = (editable instanceof SpannableStringBuilder) ? + ((SpannableStringBuilder) editable).substring(start, end) : + editable.subSequence(start, end).toString(); spellCheckSpan.setSpellCheckInProgress(true); textInfos[textInfosCount++] = new TextInfo(word, mCookie, mIds[i]); } @@ -283,18 +310,29 @@ public class SpellChecker implements SpellCheckerSessionListener { } } - mTextView.postDelayed(new Runnable() { - @Override - public void run() { - final int length = mSpellParsers.length; - for (int i = 0; i < length; i++) { - final SpellParser spellParser = mSpellParsers[i]; - if (spellParser.isParsing()) { - spellParser.parse(); + scheduleNewSpellCheck(); + } + + private void scheduleNewSpellCheck() { + if (mSpellRunnable == null) { + mSpellRunnable = new Runnable() { + @Override + public void run() { + final int length = mSpellParsers.length; + for (int i = 0; i < length; i++) { + final SpellParser spellParser = mSpellParsers[i]; + if (!spellParser.isFinished()) { + spellParser.parse(); + break; // run one spell parser at a time to bound running time + } } } - } - }, SPELL_PAUSE_DURATION); + }; + } else { + mTextView.removeCallbacks(mSpellRunnable); + } + + mTextView.postDelayed(mSpellRunnable, SPELL_PAUSE_DURATION); } private void createMisspelledSuggestionSpan(Editable editable, SuggestionsInfo suggestionsInfo, @@ -359,7 +397,7 @@ public class SpellChecker implements SpellCheckerSessionListener { SuggestionSpan.FLAG_EASY_CORRECT | SuggestionSpan.FLAG_MISSPELLED); editable.setSpan(suggestionSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - mTextView.invalidateRegion(start, end); + mTextView.invalidateRegion(start, end, false /* No cursor involved */); } private class SpellParser { @@ -369,12 +407,12 @@ public class SpellChecker implements SpellCheckerSessionListener { setRangeSpan((Editable) mTextView.getText(), start, end); } - public void stop() { - removeRangeSpan((Editable) mTextView.getText()); + public boolean isFinished() { + return ((Editable) mTextView.getText()).getSpanStart(mRange) < 0; } - public boolean isParsing() { - return ((Editable) mTextView.getText()).getSpanStart(mRange) >= 0; + public void stop() { + removeRangeSpan((Editable) mTextView.getText()); } private void setRangeSpan(Editable editable, int start, int end) { @@ -391,20 +429,19 @@ public class SpellChecker implements SpellCheckerSessionListener { final int start = editable.getSpanStart(mRange); final int end = editable.getSpanEnd(mRange); - final WordIterator wordIterator = mTextView.getWordIterator(); int wordIteratorWindowEnd = Math.min(end, start + WORD_ITERATOR_INTERVAL); - wordIterator.setCharSequence(editable, start, wordIteratorWindowEnd); + mWordIterator.setCharSequence(editable, start, wordIteratorWindowEnd); // Move back to the beginning of the current word, if any - int wordStart = wordIterator.preceding(start); + int wordStart = mWordIterator.preceding(start); int wordEnd; if (wordStart == BreakIterator.DONE) { - wordEnd = wordIterator.following(start); + wordEnd = mWordIterator.following(start); if (wordEnd != BreakIterator.DONE) { - wordStart = wordIterator.getBeginning(wordEnd); + wordStart = mWordIterator.getBeginning(wordEnd); } } else { - wordEnd = wordIterator.getEnd(wordStart); + wordEnd = mWordIterator.getEnd(wordStart); } if (wordEnd == BreakIterator.DONE) { removeRangeSpan(editable); @@ -470,15 +507,15 @@ public class SpellChecker implements SpellCheckerSessionListener { // iterate word by word int originalWordEnd = wordEnd; - wordEnd = wordIterator.following(wordEnd); + wordEnd = mWordIterator.following(wordEnd); if ((wordIteratorWindowEnd < end) && (wordEnd == BreakIterator.DONE || wordEnd >= wordIteratorWindowEnd)) { wordIteratorWindowEnd = Math.min(end, originalWordEnd + WORD_ITERATOR_INTERVAL); - wordIterator.setCharSequence(editable, originalWordEnd, wordIteratorWindowEnd); - wordEnd = wordIterator.following(originalWordEnd); + mWordIterator.setCharSequence(editable, originalWordEnd, wordIteratorWindowEnd); + wordEnd = mWordIterator.following(originalWordEnd); } if (wordEnd == BreakIterator.DONE) break; - wordStart = wordIterator.getBeginning(wordEnd); + wordStart = mWordIterator.getBeginning(wordEnd); if (wordStart == BreakIterator.DONE) { break; } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index babd8e786699..a1780873de38 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -339,7 +339,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private int mCursorDrawableRes; private final Drawable[] mCursorDrawable = new Drawable[2]; - private int mCursorCount; // Actual current number of used mCursorDrawable: 0, 1 or 2 + private int mCursorCount; // Actual current number of used mCursorDrawable: 0, 1 or 2 (split) private Drawable mSelectHandleLeft; private Drawable mSelectHandleRight; @@ -3210,7 +3210,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } boolean needEditableForNotification = false; - boolean startSpellCheck = false; if (mListeners != null && mListeners.size() != 0) { needEditableForNotification = true; @@ -3222,7 +3221,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener setFilters(t, mFilters); InputMethodManager imm = InputMethodManager.peekInstance(); if (imm != null) imm.restartInput(this); - startSpellCheck = true; } else if (type == BufferType.SPANNABLE || mMovement != null) { text = mSpannableFactory.newSpannable(text); } else if (!(text instanceof CharWrapper)) { @@ -3311,11 +3309,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener sendOnTextChanged(text, 0, oldlen, textLength); onTextChanged(text, 0, oldlen, textLength); - if (startSpellCheck && mSpellChecker != null) { - // This view has to have been previously attached for mSpellChecker to exist - updateSpellCheckSpans(0, textLength); - } - if (needEditableForNotification) { sendAfterTextChanged((Editable) text); } @@ -4329,7 +4322,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (a >= 0 || b >= 0 || c >= 0) { int start = Math.min(Math.min(a, b), c); int end = Math.max(Math.max(a, b), c); - invalidateRegion(start, end); + invalidateRegion(start, end, true /* Also invalidates blinking cursor */); } } @@ -4338,7 +4331,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * * @hide */ - void invalidateRegion(int start, int end) { + void invalidateRegion(int start, int end, boolean invalidateCursor) { if (mLayout == null) { invalidate(); } else { @@ -4364,11 +4357,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int bottom = mLayout.getLineBottom(lineEnd); + if (invalidateCursor) { + for (int i = 0; i < mCursorCount; i++) { + Rect bounds = mCursorDrawable[i].getBounds(); + top = Math.min(top, bounds.top); + bottom = Math.max(bottom, bounds.bottom); + } + } + final int compoundPaddingLeft = getCompoundPaddingLeft(); final int verticalPadding = getExtendedPaddingTop() + getVerticalOffset(true); int left, right; - if (lineStart == lineEnd) { + if (lineStart == lineEnd && !invalidateCursor) { left = (int) mLayout.getPrimaryHorizontal(start); right = (int) (mLayout.getPrimaryHorizontal(end) + 1.0); left += compoundPaddingLeft; @@ -4482,8 +4483,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Resolve drawables as the layout direction has been resolved resolveDrawables(); - - updateSpellCheckSpans(0, mText.length()); + + updateSpellCheckSpans(0, mText.length(), true /* create the spell checker if needed */); } @Override @@ -5517,7 +5518,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * call performClick(), but that won't do anything in * this case.) */ - if (hasOnClickListeners()) { + if (!hasOnClickListeners()) { if (mMovement != null && mText instanceof Editable && mLayout != null && onCheckIsTextEditor()) { InputMethodManager imm = InputMethodManager.peekInstance(); @@ -5554,7 +5555,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * call performClick(), but that won't do anything in * this case.) */ - if (hasOnClickListeners()) { + if (!hasOnClickListeners()) { View v = focusSearch(FOCUS_DOWN); if (v != null) { @@ -7636,7 +7637,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - updateSpellCheckSpans(start, start + after); + updateSpellCheckSpans(start, start + after, false); // Hide the controllers as soon as text is modified (typing, procedural...) // We do not hide the span controllers, since they can be added when a new text is @@ -7794,17 +7795,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - if (newStart < 0 && what instanceof SpellCheckSpan) { - getSpellChecker().removeSpellCheckSpan((SpellCheckSpan) what); + if (mSpellChecker != null && newStart < 0 && what instanceof SpellCheckSpan) { + mSpellChecker.removeSpellCheckSpan((SpellCheckSpan) what); } } /** * Create new SpellCheckSpans on the modified region. */ - private void updateSpellCheckSpans(int start, int end) { - if (isTextEditable() && isSuggestionsEnabled()) { - getSpellChecker().spellCheck(start, end); + private void updateSpellCheckSpans(int start, int end, boolean createSpellChecker) { + if (isTextEditable() && isSuggestionsEnabled() && !(this instanceof ExtractEditText)) { + if (mSpellChecker == null && createSpellChecker) { + mSpellChecker = new SpellChecker(this); + } + if (mSpellChecker != null) { + mSpellChecker.spellCheck(start, end); + } } } @@ -8936,7 +8942,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } void onLocaleChanged() { - removeMisspelledSpans((Editable) mText); // Will be re-created on demand in getWordIterator with the proper new locale mWordIterator = null; } @@ -8976,13 +8981,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return packRangeInLong(offset, offset); } - private SpellChecker getSpellChecker() { - if (mSpellChecker == null) { - mSpellChecker = new SpellChecker(this); - } - return mSpellChecker; - } - private long getLastTouchOffsets() { SelectionModifierCursorController selectionController = getSelectionController(); final int minOffset = selectionController.getMinTouchOffset(); @@ -9835,7 +9833,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener highlightTextDifferences(mSuggestionInfos[i], spanUnionStart, spanUnionEnd); } - // Add to dictionary item is there a span with the misspelled flag + // Add to dictionary item if there is a span with the misspelled flag if (misspelledSpan != null) { final int misspelledStart = spannable.getSpanStart(misspelledSpan); final int misspelledEnd = spannable.getSpanEnd(misspelledSpan); @@ -9921,7 +9919,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int spanStart = editable.getSpanStart(suggestionInfo.suggestionSpan); final int spanEnd = editable.getSpanEnd(suggestionInfo.suggestionSpan); - if (spanStart < 0 || spanEnd < 0) { + if (spanStart < 0 || spanEnd <= spanStart) { // Span has been removed hide(); return; @@ -9937,7 +9935,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // There is no way to know if the word was indeed added. Re-check. // TODO The ExtractEditText should remove the span in the original text instead editable.removeSpan(suggestionInfo.suggestionSpan); - updateSpellCheckSpans(spanStart, spanEnd); + updateSpellCheckSpans(spanStart, spanEnd, false); } else { // SuggestionSpans are removed by replace: save them before SuggestionSpan[] suggestionSpans = editable.getSpans(spanStart, spanEnd, @@ -9989,14 +9987,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // way to assign them a valid range after replacement if (suggestionSpansStarts[i] <= spanStart && suggestionSpansEnds[i] >= spanEnd) { - // TODO The ExtractEditText should restore these spans in the original text - editable.setSpan(suggestionSpans[i], suggestionSpansStarts[i], + setSpan_internal(suggestionSpans[i], suggestionSpansStarts[i], suggestionSpansEnds[i] + lengthDifference, suggestionSpansFlags[i]); } } // Move cursor at the end of the replaced word - Selection.setSelection(editable, spanEnd + lengthDifference); + final int newCursorPosition = spanEnd + lengthDifference; + setCursorPosition_internal(newCursorPosition, newCursorPosition); } hide(); @@ -11469,6 +11467,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener ((Editable) mText).replace(start, end, text); } + /** + * Sets a span on the specified range of text + * @hide + */ + protected void setSpan_internal(Object span, int start, int end, int flags) { + ((Editable) mText).setSpan(span, start, end, flags); + } + + /** + * Moves the cursor to the specified offset position in text + * @hide + */ + protected void setCursorPosition_internal(int start, int end) { + Selection.setSelection(((Editable) mText), start, end); + } + @ViewDebug.ExportedProperty(category = "text") private CharSequence mText; private CharSequence mTransformed; diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index fec4cbc9d402..86118b1d2904 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -19,6 +19,7 @@ package com.android.internal.os; import static android.net.NetworkStats.IFACE_ALL; import static android.net.NetworkStats.UID_ALL; import static android.text.format.DateUtils.SECOND_IN_MILLIS; +import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; @@ -35,6 +36,7 @@ import android.os.ParcelFormatException; import android.os.Parcelable; import android.os.Process; import android.os.SystemClock; +import android.os.SystemProperties; import android.os.WorkSource; import android.telephony.ServiceState; import android.telephony.SignalStrength; @@ -5713,11 +5715,17 @@ public final class BatteryStatsImpl extends BatteryStats { synchronized (this) { if (mNetworkSummaryCache == null || mNetworkSummaryCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) { - try { - mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummary(); - } catch (IllegalStateException e) { - // log problem and return empty object - Log.wtf(TAG, "problem reading network stats", e); + mNetworkSummaryCache = null; + + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + try { + mNetworkSummaryCache = mNetworkStatsFactory.readNetworkStatsSummary(); + } catch (IllegalStateException e) { + Log.wtf(TAG, "problem reading network stats", e); + } + } + + if (mNetworkSummaryCache == null) { mNetworkSummaryCache = new NetworkStats(SystemClock.elapsedRealtime(), 0); } } @@ -5730,12 +5738,18 @@ public final class BatteryStatsImpl extends BatteryStats { synchronized (this) { if (mNetworkDetailCache == null || mNetworkDetailCache.getElapsedRealtimeAge() > SECOND_IN_MILLIS) { - try { - mNetworkDetailCache = mNetworkStatsFactory - .readNetworkStatsDetail().groupedByUid(); - } catch (IllegalStateException e) { - // log problem and return empty object - Log.wtf(TAG, "problem reading network stats", e); + mNetworkDetailCache = null; + + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + try { + mNetworkDetailCache = mNetworkStatsFactory + .readNetworkStatsDetail().groupedByUid(); + } catch (IllegalStateException e) { + Log.wtf(TAG, "problem reading network stats", e); + } + } + + if (mNetworkDetailCache == null) { mNetworkDetailCache = new NetworkStats(SystemClock.elapsedRealtime(), 0); } } diff --git a/core/java/com/android/server/NetworkManagementSocketTagger.java b/core/java/com/android/server/NetworkManagementSocketTagger.java index 8445ad10ae4f..c77992d8f8a9 100644 --- a/core/java/com/android/server/NetworkManagementSocketTagger.java +++ b/core/java/com/android/server/NetworkManagementSocketTagger.java @@ -80,14 +80,15 @@ public final class NetworkManagementSocketTagger extends SocketTagger { } private void tagSocketFd(FileDescriptor fd, int tag, int uid) { - int errno; if (tag == -1 && uid == -1) return; - errno = native_tagSocketFd(fd, tag, uid); - if (errno < 0) { - Log.i(TAG, "tagSocketFd(" + fd.getInt$() + ", " - + tag + ", " + - + uid + ") failed with errno" + errno); + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + final int errno = native_tagSocketFd(fd, tag, uid); + if (errno < 0) { + Log.i(TAG, "tagSocketFd(" + fd.getInt$() + ", " + + tag + ", " + + + uid + ") failed with errno" + errno); + } } } @@ -101,12 +102,13 @@ public final class NetworkManagementSocketTagger extends SocketTagger { private void unTagSocketFd(FileDescriptor fd) { final SocketTags options = threadSocketTags.get(); - int errno; if (options.statsTag == -1 && options.statsUid == -1) return; - errno = native_untagSocketFd(fd); - if (errno < 0) { - Log.w(TAG, "untagSocket(" + fd.getInt$() + ") failed with errno " + errno); + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + final int errno = native_untagSocketFd(fd); + if (errno < 0) { + Log.w(TAG, "untagSocket(" + fd.getInt$() + ") failed with errno " + errno); + } } } @@ -116,16 +118,21 @@ public final class NetworkManagementSocketTagger extends SocketTagger { } public static void setKernelCounterSet(int uid, int counterSet) { - int errno = native_setCounterSet(counterSet, uid); - if (errno < 0) { - Log.w(TAG, "setKernelCountSet(" + uid + ", " + counterSet + ") failed with errno " + errno); + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + final int errno = native_setCounterSet(counterSet, uid); + if (errno < 0) { + Log.w(TAG, "setKernelCountSet(" + uid + ", " + counterSet + ") failed with errno " + + errno); + } } } public static void resetKernelUidStats(int uid) { - int errno = native_deleteTagData(0, uid); - if (errno < 0) { - Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno); + if (SystemProperties.getBoolean(PROP_QTAGUID_ENABLED, false)) { + int errno = native_deleteTagData(0, uid); + if (errno < 0) { + Slog.w(TAG, "problem clearing counters for uid " + uid + " : errno " + errno); + } } } diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 81bf4d5de603..ed6aaa1ea4bb 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -19,6 +19,8 @@ #include "TextLayoutCache.h" #include "TextLayout.h" #include "SkFontHost.h" +#include <unicode/unistr.h> +#include <unicode/normlzr.h> extern "C" { #include "harfbuzz-unicode.h" @@ -30,6 +32,8 @@ namespace android { #define TYPEFACE_ARABIC "/system/fonts/DroidNaskh-Regular.ttf" #define TYPE_FACE_HEBREW_REGULAR "/system/fonts/DroidSansHebrew-Regular.ttf" #define TYPE_FACE_HEBREW_BOLD "/system/fonts/DroidSansHebrew-Bold.ttf" +#define TYPEFACE_BENGALI "/system/fonts/Lohit-Bengali.ttf" +#define TYPEFACE_THAI "/system/fonts/DroidSansThai.ttf" #if USE_TEXT_LAYOUT_CACHE @@ -503,7 +507,8 @@ void TextLayoutEngine::computeValues(SkPaint* paint, const UChar* chars, static void logGlyphs(HB_ShaperItem shaperItem) { LOGD(" -- glyphs count=%d", shaperItem.num_glyphs); for (size_t i = 0; i < shaperItem.num_glyphs; i++) { - LOGD(" -- glyph[%d] = %d, offset.x = %f, offset.y = %f", i, shaperItem.glyphs[i], + LOGD(" -- glyph[%d] = %d, offset.x = %0.2f, offset.y = %0.2f", i, + shaperItem.glyphs[i], HBFixedToFloat(shaperItem.offsets[i].x), HBFixedToFloat(shaperItem.offsets[i].y)); } @@ -519,8 +524,73 @@ void TextLayoutEngine::computeRunValues(SkPaint* paint, const UChar* chars, return; } + UErrorCode error = U_ZERO_ERROR; + bool useNormalizedString = false; + for (ssize_t i = count - 1; i >= 0; --i) { + UChar ch1 = chars[i]; + if (::ublock_getCode(ch1) == UBLOCK_COMBINING_DIACRITICAL_MARKS) { + // So we have found a diacritic, let's get now the main code point which is paired + // with it. As we can have several diacritics in a row, we need to iterate back again +#if DEBUG_GLYPHS + LOGD("The BiDi run '%s' is containing a Diacritic at position %d", + String8(chars, count).string(), int(i)); +#endif + ssize_t j = i - 1; + for (; j >= 0; --j) { + UChar ch2 = chars[j]; + if (::ublock_getCode(ch2) != UBLOCK_COMBINING_DIACRITICAL_MARKS) { + break; + } + } + + // We could not found the main code point, so we will just use the initial chars + if (j < 0) { + break; + } + +#if DEBUG_GLYPHS + LOGD("Found main code point at index %d", int(j)); +#endif + // We found the main code point, so we can normalize the "chunck" and fill + // the remaining with ZWSP so that the Paint.getTextWidth() APIs will still be able + // to get one advance per char + mBuffer.remove(); + Normalizer::normalize(UnicodeString(chars + j, i - j + 1), + UNORM_NFC, 0 /* no options */, mBuffer, error); + if (U_SUCCESS(error)) { + if (!useNormalizedString) { + useNormalizedString = true; + mNormalizedString.setTo(false /* not terminated*/, chars, count); + } + // Set the normalized chars + for (ssize_t k = j; k < j + mBuffer.length(); ++k) { + mNormalizedString.setCharAt(k, mBuffer.charAt(k - j)); + } + // Fill the remain part with ZWSP (ZWNJ and ZWJ would lead to weird results + // because some fonts are missing those glyphs) + for (ssize_t k = j + mBuffer.length(); k <= i; ++k) { + mNormalizedString.setCharAt(k, UNICODE_ZWSP); + } + } + i = j - 1; + } + } + +#if DEBUG_GLYPHS + if (useNormalizedString) { + LOGD("Will use normalized string '%s', length = %d", + String8(mNormalizedString.getTerminatedBuffer(), + mNormalizedString.length()).string(), + mNormalizedString.length()); + } else { + LOGD("Normalization is not needed or cannot be done, using initial string"); + } +#endif + + assert(mNormalizedString.length() == count); + // Set the string properties - mShaperItem.string = chars; + mShaperItem.string = useNormalizedString ? mNormalizedString.getTerminatedBuffer() : chars; mShaperItem.stringLength = count; // Define shaping paint properties @@ -532,14 +602,14 @@ void TextLayoutEngine::computeRunValues(SkPaint* paint, const UChar* chars, // Split the BiDi run into Script runs. Harfbuzz will populate the pos, length and script // into the shaperItem - ssize_t indexFontRun = isRTL ? count - 1 : 0; + ssize_t indexFontRun = isRTL ? mShaperItem.stringLength - 1 : 0; unsigned numCodePoints = 0; jfloat totalAdvance = 0; while ((isRTL) ? - hb_utf16_script_run_prev(&numCodePoints, &mShaperItem.item, chars, - count, &indexFontRun): - hb_utf16_script_run_next(&numCodePoints, &mShaperItem.item, chars, - count, &indexFontRun)) { + hb_utf16_script_run_prev(&numCodePoints, &mShaperItem.item, mShaperItem.string, + mShaperItem.stringLength, &indexFontRun): + hb_utf16_script_run_next(&numCodePoints, &mShaperItem.item, mShaperItem.string, + mShaperItem.stringLength, &indexFontRun)) { ssize_t startScriptRun = mShaperItem.item.pos; size_t countScriptRun = mShaperItem.item.length; @@ -611,7 +681,7 @@ void TextLayoutEngine::computeRunValues(SkPaint* paint, const UChar* chars, #if DEBUG_ADVANCES LOGD("Returned advances"); for (size_t i = 0; i < countScriptRun; i++) { - LOGD(" -- hb-adv[%d] = %f, log_clusters = %d, total = %f", i, + LOGD(" -- hb-adv[%d] = %0.2f, log_clusters = %d, total = %0.2f", i, (*outAdvances)[i], mShaperItem.log_clusters[i], totalFontRunAdvance); } #endif @@ -687,6 +757,20 @@ size_t TextLayoutEngine::shapeFontRun(SkPaint* paint, bool isRTL) { } break; + case HB_Script_Bengali: + typeface = getCachedTypeface(&mBengaliTypeface, TYPEFACE_BENGALI); +#if DEBUG_GLYPHS + LOGD("Using Bengali Typeface"); +#endif + break; + + case HB_Script_Thai: + typeface = getCachedTypeface(&mThaiTypeface, TYPEFACE_THAI); +#if DEBUG_GLYPHS + LOGD("Using Thai Typeface"); +#endif + break; + default: if (!typeface) { typeface = mDefaultTypeface; @@ -716,7 +800,9 @@ size_t TextLayoutEngine::shapeFontRun(SkPaint* paint, bool isRTL) { size_t baseGlyphCount = 0; switch (mShaperItem.item.script) { case HB_Script_Arabic: - case HB_Script_Hebrew: { + case HB_Script_Hebrew: + case HB_Script_Bengali: + case HB_Script_Thai:{ const uint16_t* text16 = (const uint16_t*)mShaperItem.string; SkUnichar firstUnichar = SkUTF16_NextUnichar(&text16); baseGlyphCount = paint->getBaseGlyphCount(firstUnichar); @@ -775,6 +861,13 @@ void TextLayoutEngine::deleteShaperItemGlyphArrays() { SkTypeface* TextLayoutEngine::getCachedTypeface(SkTypeface** typeface, const char path[]) { if (!*typeface) { *typeface = SkTypeface::CreateFromFile(path); + // CreateFromFile(path) can return NULL if the path is non existing + if (!*typeface) { +#if DEBUG_GLYPHS + LOGD("Font path '%s' is not valid, will use default font", path); +#endif + return mDefaultTypeface; + } (*typeface)->ref(); #if DEBUG_GLYPHS LOGD("Created SkTypeface from file '%s' with uniqueID = %d", path, (*typeface)->uniqueID()); diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index fd9ccb100010..510aa18f6788 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -35,6 +35,8 @@ #include <unicode/ubidi.h> #include <unicode/ushape.h> +#include <unicode/unistr.h> + #include "HarfbuzzSkia.h" #include "harfbuzz-shaper.h" @@ -248,11 +250,29 @@ private: SkTypeface* mArabicTypeface; SkTypeface* mHebrewRegularTypeface; SkTypeface* mHebrewBoldTypeface; + SkTypeface* mBengaliTypeface; + SkTypeface* mThaiTypeface; + /** + * Cache of Harfbuzz faces + */ KeyedVector<SkFontID, HB_Face> mCachedHBFaces; + /** + * Cache of glyph array size + */ size_t mShaperItemGlyphArraySize; + /** + * Buffer for containing the ICU normalized form of a run + */ + UnicodeString mNormalizedString; + + /** + * Buffer for normalizing a piece of a run with ICU + */ + UnicodeString mBuffer; + size_t shapeFontRun(SkPaint* paint, bool isRTL); void computeValues(SkPaint* paint, const UChar* chars, diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 84e7432deccc..2573aa6d7582 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -106,7 +106,7 @@ class AudioTrackJniStorage { #define AUDIOTRACK_ERROR_BAD_VALUE -2 #define AUDIOTRACK_ERROR_INVALID_OPERATION -3 #define AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM -16 -#define AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK -17 +#define AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK -17 #define AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT -18 #define AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE -19 #define AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED -20 diff --git a/core/jni/android_server_BluetoothService.cpp b/core/jni/android_server_BluetoothService.cpp index 2aeca86d7828..9dbe77422f8a 100644 --- a/core/jni/android_server_BluetoothService.cpp +++ b/core/jni/android_server_BluetoothService.cpp @@ -1645,6 +1645,25 @@ static jobject getChannelFdNative(JNIEnv *env, jobject object, jstring channelPa fd = dbus_returns_unixfd(env, reply); if (fd == -1) return NULL; + int flags = fcntl(fd, F_GETFL); + if (flags < 0) { + LOGE("Can't get flags with fcntl(): %s (%d)", + strerror(errno), errno); + releaseChannelFdNative(env, object, channelPath); + close(fd); + return NULL; + } + + flags &= ~O_NONBLOCK; + int status = fcntl(fd, F_SETFL, flags); + if (status < 0) { + LOGE("Can't set flags with fcntl(): %s (%d)", + strerror(errno), errno); + releaseChannelFdNative(env, object, channelPath); + close(fd); + return NULL; + } + // Create FileDescriptor object jobject fileDesc = jniCreateFileDescriptor(env, fd); if (fileDesc == NULL) { diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml index 7a5bb6a915b1..568933c0a7f7 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml @@ -63,7 +63,7 @@ </RelativeLayout> <!-- right side: password --> - <LinearLayout + <RelativeLayout android:layout_width="0dip" android:layout_weight="1" android:layout_height="match_parent" @@ -72,6 +72,7 @@ <LinearLayout android:orientation="vertical" + android:layout_centerInParent="true" android:layout_width="330dip" android:layout_height="wrap_content"> @@ -152,6 +153,15 @@ </LinearLayout> - </LinearLayout> + <!-- Area to overlay FaceLock --> + <View android:id="@+id/faceLockAreaView" + android:visibility="invisible" + android:layout_width="512dip" + android:layout_height="512dip" + android:layout_centerInParent="true" + android:background="@color/facelock_color_background" + /> + + </RelativeLayout> </LinearLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml index 6df22cae5fcd..335a6419d069 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml @@ -61,92 +61,109 @@ </RelativeLayout> <!-- bottom: password --> - <LinearLayout + <RelativeLayout android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" - android:orientation="vertical" android:gravity="center"> - <!-- Password entry field --> <LinearLayout - android:orientation="horizontal" - android:layout_width="330dip" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:layout_marginTop="120dip" - android:layout_marginBottom="5dip" - android:background="@drawable/lockscreen_password_field_dark"> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_centerInParent="true" + android:orientation="vertical" + android:gravity="center"> - <EditText android:id="@+id/passwordEntry" + <!-- Password entry field --> + <LinearLayout + android:orientation="horizontal" + android:layout_width="330dip" android:layout_height="wrap_content" - android:layout_width="0dip" - android:layout_weight="1" - android:singleLine="true" - android:textStyle="normal" - android:inputType="textPassword" - android:gravity="center" android:layout_gravity="center" - android:layout_marginLeft="@dimen/keyguard_lockscreen_pin_margin_left" - android:textSize="24sp" - android:textAppearance="?android:attr/textAppearanceMedium" - android:background="@null" - android:textColor="#ffffffff" - android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii" + android:layout_marginTop="120dip" + android:layout_marginBottom="5dip" + android:background="@drawable/lockscreen_password_field_dark"> + + <EditText android:id="@+id/passwordEntry" + android:layout_height="wrap_content" + android:layout_width="0dip" + android:layout_weight="1" + android:singleLine="true" + android:textStyle="normal" + android:inputType="textPassword" + android:gravity="center" + android:layout_gravity="center" + android:layout_marginLeft="@dimen/keyguard_lockscreen_pin_margin_left" + android:textSize="24sp" + android:textAppearance="?android:attr/textAppearanceMedium" + android:background="@null" + android:textColor="#ffffffff" + android:privateImeOptions="com.google.android.inputmethod.latin.forceAscii" /> - <!-- This delete button is only visible for numeric PIN entry --> - <ImageButton android:id="@+id/pinDel" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@android:drawable/ic_input_delete" - android:clickable="true" - android:padding="8dip" - android:layout_gravity="center" - android:background="?android:attr/selectableItemBackground" - android:visibility="gone" + <!-- This delete button is only visible for numeric PIN entry --> + <ImageButton android:id="@+id/pinDel" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@android:drawable/ic_input_delete" + android:clickable="true" + android:padding="8dip" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" /> - <ImageView android:id="@+id/switch_ime_button" + <ImageView android:id="@+id/switch_ime_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_lockscreen_ime" + android:clickable="true" + android:padding="8dip" + android:layout_gravity="center" + android:background="?android:attr/selectableItemBackground" + android:visibility="gone" + /> + + </LinearLayout> + + <View + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="1" + /> + + <!-- Numeric keyboard --> + <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" + android:layout_width="330dip" + android:layout_height="260dip" + android:background="#40000000" + android:keyBackground="@drawable/btn_keyboard_key_ics" + android:layout_marginBottom="80dip" + android:clickable="true" + /> + + <!-- emergency call button --> + <Button android:id="@+id/emergencyCallButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@drawable/ic_lockscreen_ime" - android:clickable="true" - android:padding="8dip" - android:layout_gravity="center" - android:background="?android:attr/selectableItemBackground" + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="8dip" + android:text="@string/lockscreen_emergency_call" android:visibility="gone" - /> + style="@style/Widget.Button.Transparent" + /> </LinearLayout> - <View - android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="1" - /> - - <!-- Numeric keyboard --> - <com.android.internal.widget.PasswordEntryKeyboardView android:id="@+id/keyboard" - android:layout_width="330dip" - android:layout_height="260dip" - android:background="#40000000" - android:keyBackground="@drawable/btn_keyboard_key_ics" - android:layout_marginBottom="80dip" - android:clickable="true" + <!-- Area to overlay FaceLock --> + <View android:id="@+id/faceLockAreaView" + android:visibility="invisible" + android:layout_width="512dip" + android:layout_height="512dip" + android:layout_centerInParent="true" + android:background="@color/facelock_color_background" /> - <!-- emergency call button --> - <Button - android:id="@+id/emergencyCallButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" - android:text="@string/lockscreen_emergency_call" - android:visibility="gone" - style="@style/Widget.Button.Transparent" - /> + </RelativeLayout> - </LinearLayout> </LinearLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml index c65dd83a0387..0b94fc16fd2d 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_sim_pin_landscape.xml @@ -93,29 +93,29 @@ android:layout_marginLeft="8dip" android:layout_marginRight="8dip"> - <Button android:id="@+id/ok" - android:text="@android:string/ok" + <Button android:id="@+id/emergencyCallButton" + android:text="@android:string/lockscreen_emergency_call" android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginRight="8dip" android:textSize="18sp" - /> + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="8dip" + /> - <Button android:id="@+id/emergencyCallButton" - android:text="@android:string/lockscreen_emergency_call" + <Button android:id="@+id/ok" + android:text="@android:string/ok" android:layout_alignParentBottom="true" - android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginLeft="8dip" android:textSize="18sp" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" /> </LinearLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml index 70d18cc7c1ab..802ef822f9c3 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml @@ -72,48 +72,65 @@ android:layout_height="match_parent" android:gravity="center_vertical|center_horizontal"> - <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern" - android:layout_width="354dip" - android:layout_height="354dip" - android:layout_gravity="center_vertical" - /> - - <!-- Emergency and forgot pattern buttons. --> - <LinearLayout - android:orientation="horizontal" - android:layout_width="match_parent" + <RelativeLayout + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_below="@id/lockPattern" - android:layout_alignLeft="@id/lockPattern" - android:layout_alignRight="@id/lockPattern" - android:layout_marginTop="28dip" - android:gravity="center" - style="?android:attr/buttonBarStyle" - android:weightSum="2"> - - <Button android:id="@+id/forgotPatternButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - style="?android:attr/buttonBarButtonStyle" - android:drawableLeft="@drawable/lockscreen_forgot_password_button" - android:drawablePadding="8dip" - android:text="@string/lockscreen_forgot_pattern_button_text" - android:visibility="gone" + android:layout_centerInParent="true" + android:gravity="center_vertical|center_horizontal"> + + <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern" + android:layout_width="354dip" + android:layout_height="354dip" + android:layout_gravity="center_vertical" /> - <Button android:id="@+id/emergencyCallButton" - android:layout_width="wrap_content" + <!-- Emergency and forgot pattern buttons. --> + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" - style="?android:attr/buttonBarButtonStyle" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" - android:text="@string/lockscreen_emergency_call" - android:visibility="gone" - /> + android:orientation="horizontal" + android:layout_below="@id/lockPattern" + android:layout_alignLeft="@id/lockPattern" + android:layout_alignRight="@id/lockPattern" + android:layout_marginTop="28dip" + style="?android:attr/buttonBarStyle" + android:gravity="center" + android:weightSum="2"> + + <Button android:id="@+id/forgotPatternButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + style="?android:attr/buttonBarButtonStyle" + android:drawableLeft="@drawable/lockscreen_forgot_password_button" + android:drawablePadding="8dip" + android:text="@string/lockscreen_forgot_pattern_button_text" + android:visibility="gone" + /> - </LinearLayout> + <Button android:id="@+id/emergencyCallButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + style="?android:attr/buttonBarButtonStyle" + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="8dip" + android:text="@string/lockscreen_emergency_call" + android:visibility="gone" + /> + + </LinearLayout> + + </RelativeLayout> + + <!-- Area to overlay FaceLock --> + <View android:id="@+id/faceLockAreaView" + android:visibility="invisible" + android:layout_width="512dip" + android:layout_height="512dip" + android:layout_centerInParent="true" + android:background="@color/facelock_color_background" + /> </RelativeLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml index 7a623ce1b777..40f24929f9ba 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml @@ -62,52 +62,71 @@ </RelativeLayout> <!-- bottom: lock pattern, emergency dialer and forgot pattern button --> - <LinearLayout + <RelativeLayout android:layout_weight="1" android:layout_width="match_parent" android:layout_height="0dip" - android:orientation="vertical" android:gravity="center"> - <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern" - android:layout_width="354dip" - android:layout_height="354dip" - android:layout_marginTop="50dip"/> - - <!-- Emergency and forgot pattern buttons. --> - <LinearLayout - android:layout_width="match_parent" + <RelativeLayout + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - style="?android:attr/buttonBarStyle" - android:gravity="center" - android:weightSum="2"> + android:layout_centerInParent="true" + android:gravity="center"> - <Button android:id="@+id/forgotPatternButton" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center" - style="?android:attr/buttonBarButtonStyle" - android:drawableLeft="@drawable/lockscreen_forgot_password_button" - android:drawablePadding="8dip" - android:text="@string/lockscreen_forgot_pattern_button_text" - android:visibility="gone" + <com.android.internal.widget.LockPatternView android:id="@+id/lockPattern" + android:layout_width="354dip" + android:layout_height="354dip" + android:layout_marginTop="50dip" /> - <Button android:id="@+id/emergencyCallButton" - android:layout_width="wrap_content" + <!-- Emergency and forgot pattern buttons. --> + <LinearLayout + android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="center" - style="?android:attr/buttonBarButtonStyle" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="8dip" - android:text="@string/lockscreen_emergency_call" - android:visibility="gone" - /> + android:orientation="horizontal" + android:layout_below="@id/lockPattern" + android:layout_alignLeft="@id/lockPattern" + android:layout_alignRight="@id/lockPattern" + style="?android:attr/buttonBarStyle" + android:gravity="center" + android:weightSum="2"> + + <Button android:id="@+id/forgotPatternButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + style="?android:attr/buttonBarButtonStyle" + android:drawableLeft="@drawable/lockscreen_forgot_password_button" + android:drawablePadding="8dip" + android:text="@string/lockscreen_forgot_pattern_button_text" + android:visibility="gone" + /> - </LinearLayout> + <Button android:id="@+id/emergencyCallButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + style="?android:attr/buttonBarButtonStyle" + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="8dip" + android:text="@string/lockscreen_emergency_call" + android:visibility="gone" + /> - </LinearLayout> + </LinearLayout> -</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient> + </RelativeLayout> + <!-- Area to overlay FaceLock --> + <View android:id="@+id/faceLockAreaView" + android:visibility="invisible" + android:layout_width="512dip" + android:layout_height="512dip" + android:layout_centerInParent="true" + android:background="@color/facelock_color_background" + /> + + </RelativeLayout> + +</com.android.internal.widget.LinearLayoutWithDefaultTouchRecepient> diff --git a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml index 59065e11cbfc..3cb19c39390f 100644 --- a/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml +++ b/core/res/res/layout/keyguard_screen_sim_pin_landscape.xml @@ -91,29 +91,29 @@ android:layout_marginLeft="8dip" android:layout_marginRight="8dip"> - <Button android:id="@+id/ok" - android:text="@android:string/ok" + <Button android:id="@+id/emergencyCallButton" + android:text="@android:string/lockscreen_emergency_call" android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginRight="8dip" android:textSize="18sp" - /> + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="4dip" + /> - <Button android:id="@+id/emergencyCallButton" - android:text="@android:string/lockscreen_emergency_call" + <Button android:id="@+id/ok" + android:text="@android:string/ok" android:layout_alignParentBottom="true" - android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginLeft="8dip" android:textSize="18sp" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="4dip" /> </LinearLayout> diff --git a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml index b662e8278b32..722dc262349a 100644 --- a/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml +++ b/core/res/res/layout/keyguard_screen_sim_puk_landscape.xml @@ -153,29 +153,29 @@ android:layout_marginLeft="8dip" android:layout_marginRight="8dip"> - <Button android:id="@+id/ok" - android:text="@android:string/ok" + <Button android:id="@+id/emergencyCallButton" + android:text="@android:string/lockscreen_emergency_call" android:layout_alignParentBottom="true" + android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginRight="8dip" android:textSize="18sp" - /> + android:drawableLeft="@drawable/ic_emergency" + android:drawablePadding="4dip" + /> - <Button android:id="@+id/emergencyCallButton" - android:text="@android:string/lockscreen_emergency_call" + <Button android:id="@+id/ok" + android:text="@android:string/ok" android:layout_alignParentBottom="true" - android:layout_centerHorizontal="true" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1.0" android:layout_marginBottom="8dip" android:layout_marginLeft="8dip" android:textSize="18sp" - android:drawableLeft="@drawable/ic_emergency" - android:drawablePadding="4dip" /> </LinearLayout> diff --git a/core/res/res/layout/twelve_key_entry.xml b/core/res/res/layout/twelve_key_entry.xml index 46301cd46a2d..09c749d451ff 100644 --- a/core/res/res/layout/twelve_key_entry.xml +++ b/core/res/res/layout/twelve_key_entry.xml @@ -144,7 +144,7 @@ android:layout_marginRight="2dip" android:orientation="horizontal"> - <Button android:id="@+id/ok" + <Button android:id="@+id/cancel" android:layout_width="0sp" android:layout_height="fill_parent" android:layout_weight="1" @@ -152,7 +152,7 @@ android:layout_marginRight="2dip" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" - android:text="@android:string/ok" + android:text="@android:string/cancel" /> <Button android:id="@+id/zero" @@ -165,7 +165,7 @@ android:textStyle="bold" /> - <Button android:id="@+id/cancel" + <Button android:id="@+id/ok" android:layout_width="0sp" android:layout_height="fill_parent" android:layout_weight="1" @@ -173,7 +173,7 @@ android:layout_marginRight="2dip" android:textAppearance="?android:attr/textAppearanceMedium" android:textStyle="bold" - android:text="@android:string/cancel" + android:text="@android:string/ok" /> </LinearLayout> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 6f115b342904..80aef2156c10 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1992,11 +1992,11 @@ <string name="save_password_label">Confirm</string> <!-- Toast for double-tap --> - <string name="double_tap_toast">Tip: Double-touch to zoom in and out.</string> + <string name="double_tap_toast">Tip: Double-tap to zoom in and out.</string> <!-- Text to show in the auto complete drop down list on a text view when the WebView can auto fill the entire form, and the user has configured an AutoFill profile [CHAR-LIMIT=8] --> <string name="autofill_this_form">Autofill</string> - <!-- Text to show in the auto complete drop down list on a text view when the WebView can auto fill the entire form but the user has not configured an AutoFill profile [CHAR-LIMIT=16] --> + <!-- Text to show in the auto complete drop down list on a text view when the WebView can auto fill the entire form but the user has not configured an AutoFill profile [CHAR-LIMIT=19] --> <string name="setup_autofill">Set up Autofill</string> <!-- String used to separate FirstName and LastName when writing out a local name diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index b18d88f69a9a..fe5388bdcd83 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -810,7 +810,7 @@ please see themes_device_defaults.xml. <!-- Special theme for the recent apps dialog, to allow customization with overlays. --> - <style name="Theme.Dialog.RecentApplications"> + <style name="Theme.Dialog.RecentApplications" parent="Theme.DeviceDefault.Dialog"> <item name="windowFrame">@null</item> <item name="windowBackground">@android:color/transparent</item> <item name="android:windowAnimationStyle">@android:style/Animation.RecentApplications</item> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java index e22b0189f1dc..e44023bff472 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/unit/WifiClientTest.java @@ -271,4 +271,46 @@ public class WifiClientTest extends AndroidTestCase { } + // Test case 6: test configured network status + @LargeTest + public void testWifiConfiguredNetworkStatus() { + + /* Initialize */ + mWifiManager.setWifiEnabled(false); + sleepAfterWifiEnable(); + + /* Ensure no network is CURRENT */ + List<WifiConfiguration> configList = mWifiManager.getConfiguredNetworks(); + for (WifiConfiguration c : configList) { + assertTrue(c.status != WifiConfiguration.Status.CURRENT); + } + + /* Enable wifi */ + mWifiManager.setWifiEnabled(true); + sleepAfterWifiEnable(); + + /* Ensure connected network is CURRENT */ + String connectedSSID = mWifiManager.getConnectionInfo().getSSID(); + configList = mWifiManager.getConfiguredNetworks(); + for (WifiConfiguration c : configList) { + if (c.SSID.contains(connectedSSID)) { + assertTrue(c.status == WifiConfiguration.Status.CURRENT); + } else { + assertTrue(c.status != WifiConfiguration.Status.CURRENT); + } + } + + /* Disable wifi */ + mWifiManager.setWifiEnabled(false); + sleepAfterWifiEnable(); + + /* Ensure no network is CURRENT */ + configList = mWifiManager.getConfiguredNetworks(); + for (WifiConfiguration c : configList) { + assertTrue(c.status != WifiConfiguration.Status.CURRENT); + } + } + + + } diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd index 95542bc37418..6ace709f3c5f 100644 --- a/docs/html/guide/appendix/api-levels.jd +++ b/docs/html/guide/appendix/api-levels.jd @@ -83,8 +83,14 @@ Android platform.</p> <table> <tr><th>Platform Version</th><th>API Level</th><th>VERSION_CODE</th><th>Notes</th></tr> - - <tr><td><a href="{@docRoot}sdk/android-4.0.html">Android 4.0</a></td> + + <tr><td><a href="{@docRoot}sdk/android-4.0.3.html">Android 4.0.3</a></td> + <td><a href="{@docRoot}sdk/api_diff/15/changes.html" title="Diff Report">15</a></td> + <td>{@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH_MR1}</td> + <td><a href="{@docRoot}sdk/android-4.0-highlights.html">Platform +Highlights</a></td></tr> + + <tr><td><a href="{@docRoot}sdk/android-4.0.html">Android 4.0, 4.0.1, 4.0.2</a></td> <td><a href="{@docRoot}sdk/api_diff/14/changes.html" title="Diff Report">14</a></td> <td>{@link android.os.Build.VERSION_CODES#ICE_CREAM_SANDWICH}</td> <td><a href="{@docRoot}sdk/android-4.0-highlights.html">Platform diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 3eb7286edcdb..bfde56cfcdbc 100644 --- a/docs/html/guide/guide_toc.cs +++ b/docs/html/guide/guide_toc.cs @@ -85,7 +85,7 @@ <li class="toggle-list"> <div><a href="<?cs var:toroot ?>guide/topics/providers/content-providers.html"> <span class="en">Content Providers</span> - </a><span class="new">updated</span></div> + </a></div> <ul> <li><a href="<?cs var:toroot ?>guide/topics/providers/calendar-provider.html"> <span class="en">Calendar Provider</span></a> @@ -119,7 +119,7 @@ </a></li> <li><a href="<?cs var:toroot ?>guide/topics/ui/actionbar.html"> <span class="en">Action Bar</span> - </a> <span class="new">updated</span></li> + </a></li> <li><a href="<?cs var:toroot ?>guide/topics/ui/dialogs.html"> <span class="en">Dialogs</span> </a></li> @@ -253,7 +253,7 @@ <span class="new">new!</span></li> <li><a href="<?cs var:toroot ?>guide/topics/graphics/opengl.html"> <span class="en">OpenGL</span> - </a><span class="new">updated</span></li> + </a></li> </ul> </li> <li class="toggle-list"> @@ -288,7 +288,7 @@ <li class="toggle-list"> <div><a href="<?cs var:toroot ?>guide/topics/media/index.html"> <span class="en">Multimedia and Camera</span> - </a><span class="new">updated</span></div> + </a></div> <ul> <li><a href="<?cs var:toroot ?>guide/topics/media/mediaplayer.html"> <span class="en">Media Playback</span></a> @@ -662,7 +662,7 @@ <ul> <li><a href="<?cs var:toroot ?>guide/publishing/publishing_overview.html"> <span class="en">Publishing Overview</span> - </a><span class="new">new!</span></li> + </a></li> <li><a href="<?cs var:toroot ?>guide/publishing/preparing.html"> <span class="en">Preparing for Release</span> <span class="de" style="display:none">Vorbereitung auf die Veröffentlichung</span> @@ -672,7 +672,7 @@ <span class="ja" style="display:none">公開の準備</span> <span class="zh-CN" style="display:none">准备发布</span> <span class="zh-TW" style="display:none">準備發佈</span> - </a><span class="new">updated</span></li> + </a></li> <li><a href="<?cs var:toroot ?>guide/publishing/app-signing.html"> <span class="en">Signing Your Applications</span> <span class="de" style="display:none">Signieren Ihrer Anwendungen</span> @@ -735,7 +735,7 @@ applications</span> <li class="toggle-list"> <div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/index.html"> <span class="en">UI Guidelines</span> - </a> <span class="new-child">updated</span></div> + </a></div> <ul> <li class="toggle-list"> <div><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/icon_design.html"> @@ -767,7 +767,7 @@ applications</span> </li> <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/widget_design.html"> <span class="en">App Widget Design</span> - </a> <span class="new">updated</span></li> + </a></li> <li><a href="<?cs var:toroot ?>guide/practices/ui_guidelines/activity_task_design.html"> <span class="en">Activity and Task Design</span> </a></li> @@ -799,8 +799,7 @@ applications</span> </a></li> <li><a href="<?cs var:toroot ?>guide/practices/security.html"> <span class="en">Designing for Security</span></a> - <span class="new">new!</span><!-- 11/7/10 --> - </li> + </li> </ul> </li> @@ -845,7 +844,7 @@ applications</span> </a></li> <li><a href="<?cs var:toroot ?>guide/appendix/media-formats.html"> <span class="en">Supported Media Formats</span> - </a> <span class="new">updated</span></li> + </a></li> <li><a href="<?cs var:toroot ?>guide/appendix/g-app-intents.html"> <span class="en">Intents List: Google Apps</span> </a></li> diff --git a/docs/html/images/training/ads-close-to-button.png b/docs/html/images/training/ads-close-to-button.png Binary files differnew file mode 100755 index 000000000000..fcb65aa41a45 --- /dev/null +++ b/docs/html/images/training/ads-close-to-button.png diff --git a/docs/html/images/training/ads-cover-content.png b/docs/html/images/training/ads-cover-content.png Binary files differnew file mode 100755 index 000000000000..f284d65881b7 --- /dev/null +++ b/docs/html/images/training/ads-cover-content.png diff --git a/docs/html/images/training/ads-eclipse-build-path.png b/docs/html/images/training/ads-eclipse-build-path.png Binary files differnew file mode 100755 index 000000000000..fe720fd3adfa --- /dev/null +++ b/docs/html/images/training/ads-eclipse-build-path.png diff --git a/docs/html/images/training/ads-top-banner.png b/docs/html/images/training/ads-top-banner.png Binary files differnew file mode 100755 index 000000000000..8dffe8d2a43e --- /dev/null +++ b/docs/html/images/training/ads-top-banner.png diff --git a/docs/html/images/training/button.png b/docs/html/images/training/button.png Binary files differnew file mode 100755 index 000000000000..1a7944fc4c9e --- /dev/null +++ b/docs/html/images/training/button.png diff --git a/docs/html/images/training/button_with_marks.png b/docs/html/images/training/button_with_marks.png Binary files differnew file mode 100755 index 000000000000..06e0720a805d --- /dev/null +++ b/docs/html/images/training/button_with_marks.png diff --git a/docs/html/images/training/buttons_stretched.png b/docs/html/images/training/buttons_stretched.png Binary files differnew file mode 100755 index 000000000000..bb6741997622 --- /dev/null +++ b/docs/html/images/training/buttons_stretched.png diff --git a/docs/html/images/training/device-mgmt-activate-device-admin.png b/docs/html/images/training/device-mgmt-activate-device-admin.png Binary files differnew file mode 100755 index 000000000000..1be1831e39c1 --- /dev/null +++ b/docs/html/images/training/device-mgmt-activate-device-admin.png diff --git a/docs/html/images/training/hierarchy-layouttimes.png b/docs/html/images/training/hierarchy-layouttimes.png Binary files differnew file mode 100644 index 000000000000..423f1af5150b --- /dev/null +++ b/docs/html/images/training/hierarchy-layouttimes.png diff --git a/docs/html/images/training/hierarchy-linearlayout.png b/docs/html/images/training/hierarchy-linearlayout.png Binary files differnew file mode 100644 index 000000000000..cac4caef0e21 --- /dev/null +++ b/docs/html/images/training/hierarchy-linearlayout.png diff --git a/docs/html/images/training/hierarchy-relativelayout.png b/docs/html/images/training/hierarchy-relativelayout.png Binary files differnew file mode 100644 index 000000000000..b3408e58b9d8 --- /dev/null +++ b/docs/html/images/training/hierarchy-relativelayout.png diff --git a/docs/html/images/training/import-progress.png b/docs/html/images/training/import-progress.png Binary files differnew file mode 100644 index 000000000000..bbb689b51d4e --- /dev/null +++ b/docs/html/images/training/import-progress.png diff --git a/docs/html/images/training/layout-hvga.png b/docs/html/images/training/layout-hvga.png Binary files differnew file mode 100644 index 000000000000..b3403007ab89 --- /dev/null +++ b/docs/html/images/training/layout-hvga.png diff --git a/docs/html/images/training/layout-listitem.png b/docs/html/images/training/layout-listitem.png Binary files differnew file mode 100644 index 000000000000..9cb241df6d45 --- /dev/null +++ b/docs/html/images/training/layout-listitem.png diff --git a/docs/html/images/training/relativelayout1.png b/docs/html/images/training/relativelayout1.png Binary files differnew file mode 100644 index 000000000000..0b593dcde930 --- /dev/null +++ b/docs/html/images/training/relativelayout1.png diff --git a/docs/html/images/training/relativelayout2.png b/docs/html/images/training/relativelayout2.png Binary files differnew file mode 100644 index 000000000000..341b286524af --- /dev/null +++ b/docs/html/images/training/relativelayout2.png diff --git a/docs/html/images/training/sharing/share-text-screenshot.png b/docs/html/images/training/sharing/share-text-screenshot.png Binary files differnew file mode 100644 index 000000000000..089221ccace6 --- /dev/null +++ b/docs/html/images/training/sharing/share-text-screenshot.png diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js index 18f1547d0ed9..8ad970ba7c45 100644 --- a/docs/html/resources/resources-data.js +++ b/docs/html/resources/resources-data.js @@ -508,6 +508,16 @@ var ANDROID_RESOURCES = [ } }, { + tags: ['sample', 'new'], + path: 'samples/training/device-management-policy/index.html', + title: { + en: 'Device Policy Management' + }, + description: { + en: 'This is a security-aware sample application that demonstrates the enforcement of device administration policies on Android 2.2 or above platforms.' + } + }, + { tags: ['sample'], path: 'samples/Home/index.html', title: { @@ -548,6 +558,16 @@ var ANDROID_RESOURCES = [ } }, { + tags: ['sample', 'new'], + path: 'samples/training/ads-and-ux/index.html', + title: { + en: 'Mobile Advertisement Integration' + }, + description: { + en: 'This sample demonstrates the integration of a mobile ad SDK with your application.' + } + }, + { tags: ['sample', 'ui', 'bestpractice', 'layout'], path: 'samples/MultiResolution/index.html', title: { @@ -558,6 +578,16 @@ var ANDROID_RESOURCES = [ } }, { + tags: ['sample', 'new', 'bestpractices'], + path: 'samples/newsreader/index.html', + title: { + en: 'News Reader' + }, + description: { + en: 'A sample app demonstrating best practices to support multiple screen sizes and densities.' + } + }, + { tags: ['sample', 'data'], path: 'samples/NFCDemo/index.html', title: { @@ -853,7 +883,7 @@ var ANDROID_RESOURCES = [ } }, { - tags: ['tutorial', 'gl', 'new'], + tags: ['tutorial', 'gl'], path: 'tutorials/opengl/opengl-es10.html', title: { en: 'OpenGL ES 1.0' @@ -863,7 +893,7 @@ var ANDROID_RESOURCES = [ } }, { - tags: ['tutorial', 'gl', 'new'], + tags: ['tutorial', 'gl'], path: 'tutorials/opengl/opengl-es20.html', title: { en: 'OpenGL ES 2.0' diff --git a/docs/html/resources/samples/images/NewsReader.png b/docs/html/resources/samples/images/NewsReader.png Binary files differnew file mode 100644 index 000000000000..f44c6494f09d --- /dev/null +++ b/docs/html/resources/samples/images/NewsReader.png diff --git a/docs/html/sdk/android-4.0-highlights.jd b/docs/html/sdk/android-4.0-highlights.jd index c1162d4c7de4..922bb0874f38 100644 --- a/docs/html/sdk/android-4.0-highlights.jd +++ b/docs/html/sdk/android-4.0-highlights.jd @@ -298,7 +298,7 @@ profiles</strong></p> linked together and integrated for easy accessibility. At the center is a new <strong>People app</strong> that offers richer profile information, including a large profile picture, phone numbers, addresses and accounts, status updates, -events, and a new button for connecting on integrated social networks. </p> +events, stream items, and a new button for connecting on integrated social networks. </p> <p>The user's own contact information is stored in a new <strong>"Me" profile</strong>, allowing easier sharing with apps and people. All of the @@ -562,7 +562,7 @@ can connect to compatible devices to take advantage of new features such as instant sharing of files, photos, or other media; streaming video or audio from another device; or connecting to compatible printers or other devices.</p> -<p>Android 4.0 also introduces built-in support for connecting to <strong>Bluetooth Health Device Profile (HDP)</strong> devices. With support from third-party apps, users can connect to wireless medical devices and sensors in hospitals, fitness centers, homes, and elsewhere. In addition, for connecting to higher quality Bluetooth audio devices, Android 4.0 adds support for Bluetooth Hands Free Profile (HFP) 1.6.</p> +<p>Android 4.0 also introduces built-in support for connecting to <strong>Bluetooth Health Device Profile (HDP)</strong> devices. With support from third-party apps, users can connect to wireless medical devices and sensors in hospitals, fitness centers, homes, and elsewhere.</p> <h2 id="DeveloperApis" style="clear:right">New Developer Features</h2> @@ -633,21 +633,21 @@ development across the range of Android-powered devices.</p> <h3 id="communication-dev">Communication and sharing</h3> <p>Android 4.0 extends social and sharing features to any application on the -device. Applications can integrate contacts, profile data, and calendar events -from any of the user’s activities or social networks.</p> +device. Applications can integrate contacts, profile data, stream items, +and calendar events from any of the user’s activities or social networks.</p> <p style="margin-top:1em;margin-bottom:.75em;"><strong>Social API</strong></p> <p>A shared social provider and API provide a new unified store for contacts, -profile data, status updates, and photos. Any app or social network with user +profile data, stream items, and photos. Any app or social network with user permission can contribute raw contacts and make them accessible to other apps and networks. Applications with user permission can also read profile data from the provider and display it in their applications.</p> <p>The social API lets applications store standard contact data as well as new -types of content for any given contact, including large profile photos and -recent activity feedback. Recent activity feedback is a standard way for +types of content for any given contact, including large profile photos, stream +items, and recent activity feedback. Recent activity feedback is a standard way for applications to “tag” a contact with common activity, such as when the user calls the contact or sends an email or SMS message. The social provider uses the recent activity feedback as a new signal in ranking, such as for name diff --git a/docs/html/sdk/android-4.0.3.jd b/docs/html/sdk/android-4.0.3.jd new file mode 100644 index 000000000000..68257cd89cbc --- /dev/null +++ b/docs/html/sdk/android-4.0.3.jd @@ -0,0 +1,513 @@ +page.title=Android 4.0.3 Platform +sdk.platform.version=4.0.3 +sdk.platform.apiLevel=15 +@jd:body + +<div id="qv-wrapper"> +<div id="qv"> + +<h2>In this document</h2> +<ol> + <li><a href="#relnotes">Revisions</a></li> + <li><a href="#api">API Overview</a></li> + <li><a href="#Honeycomb">Previous APIs</a></li> + <li><a href="#api-level">API Level</a></li> + <li><a href="#apps">Built-in Applications</a></li> + <li><a href="#locs">Locales</a></li> + <li><a href="#skins">Emulator Skins</a></li> +</ol> + +<h2>Reference</h2> +<ol> +<li><a +href="{@docRoot}sdk/api_diff/14/changes.html">API +Differences Report »</a> </li> +</ol> + +</div> +</div> + +<p><em>API Level:</em> <strong>{@sdkPlatformApiLevel}</strong></p> + +<p>Android {@sdkPlatformVersion} is an incremental release of the Android 4.x +(Ice Cream Sandwich) platform family. This release includes new features for +users and developers, API changes, and various bug fixes.</p> + +<p>For developers, the Android {@sdkPlatformVersion} platform is available as a +downloadable component for the Android SDK. The development platform includes a +fully compliant Android library and system image as well as a set of emulator +skins, sample applications, and more. The downloadable platform includes no +external libraries.</p> + +<p>To start developing or testing against Android {@sdkPlatformVersion}, +use the Android SDK Manager to download the platform into your SDK. For more +information, see <a href="{@docRoot}sdk/adding-components.html">Adding SDK +Components</a>. If you are new to Android, <a +href="{@docRoot}sdk/index.html">download the SDK Starter Package</a> first.</p> + +<p>For a high-level overview of the new user and developer features, see the +<a href="http://developer.android.com/sdk/android-4.0-highlights.html">Platform +Highlights</a>.</p> + + +<h2 id="relnotes">Development Platform Revisions</h2> + +<p>The sections below provide notes about successive revisions of the Android +{@sdkPlatformVersion} development platform for the Android SDK, as denoted by +revision number. To determine what revisions you have installed in your SDK +environment, refer to the "Installed Packages" listing in the Android SDK +Manager.</p> + + +<div class="toggle-content opened" style="padding-left:1em;"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-opened.png" +class="toggle-content-img" alt="" /> + Android {@sdkPlatformVersion}, Revision 1</a> <em>(December 2011)</em> + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em;"> + +<dl> +<dt>Initial release. SDK Tools r14 or higher is required. + <p class="caution"><strong>Important:</strong> To download the new Android + 4.x system components from the Android SDK Manager, you must first update the + SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not, + the Android 4.0 system components will not be available for download.</p> +</dt> +</dl> + + </div> +</div> + + +<h2 id="api">API Overview</h2> + +<p>The sections below provide a technical overview of new APIs in Android 4.0.3.</p> + +<div class="toggle-content closed" style="padding-left:1em;"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" +class="toggle-content-img" alt="" /> + <strong>Table of Contents</strong> + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em;"> + <ol class="toc" style="margin-left:-1em"> + <li><a href="#contacts">Social stream API in contacts provider</a></li> + <li><a href="#calendar">Calendar provider</a></li> + <li><a href="#widgets">Home screen widgets</a></li> + <li><a href="#textservices">Spell-checking</a></li> + <li><a href="#bluetooth">Bluetooth</a></li> + <li><a href="#ui">UI toolkit</a></li> + <li><a href="#accessibility">Accessibility</a></li> + <li><a href="#tts">Text-to-speech</a></li> + <li><a href="#database">Database</a></li> + <li><a href="#intents">Intents</a></li> + <li><a href="#camera">Camera</a></li> + <li><a href="#permissions">Permissions</a></li> + </ol> + </div> +</div> + + + + + +<h3 id="contacts">Social stream API in Contacts provider</h3> + +<p>Applications that use social stream data such as status updates and check-ins +can now sync that data with each of the user’s contacts, providing items in a +stream along with photos for each.</p> + +<p>The database table that contains an individual contact’s social stream is +defined by {@link android.provider.ContactsContract.StreamItems}, the Uri for +which is nested within the {@link android.provider.ContactsContract.RawContacts} +directory to which the stream items belong. Each social stream table includes +several columns for metadata about each stream item, such as an icon +representing the source (an avatar), a label for the item, the primary text +content, comments about the item (such as responses from other people), and +more. Photos associated with a stream are stored in another table, defined by +{@link android.provider.ContactsContract.StreamItemPhotos}, which is available +as a sub-directory of the {@link android.provider.ContactsContract.StreamItems} +Uri.</p> + +<p>See {@link android.provider.ContactsContract.StreamItems} and +{@link android.provider.ContactsContract.StreamItemPhotos} for more information.</p> + +<p>To read or write social stream items for a contact, an application must +request permission from the user by declaring <code><uses-permission +android:name="android.permission.READ_SOCIAL_STREAM"></code> and/or <code><uses-permission +android:name="android.permission.WRITE_SOCIAL_STREAM"></code> in their manifest files.</p> + +<h3 id="calendar">Calendar provider</h4> +<ul> +<li>Adds the class {@link android.provider.CalendarContract.Colors} to represent +a color table in the Calendar provider. The class provivdes fields for accessing +colors available for a given account. Colors are referenced by +{@link android.provider.CalendarContract.ColorsColumns#COLOR_KEY COLOR_KEY} +which must be unique for a given account name/type. These values can only be +updated by the sync adapter.</li> +<li>Adds {@link android.provider.CalendarContract.CalendarColumns#ALLOWED_AVAILABILITY ALLOWED_AVAILABILITY} +and +{@link android.provider.CalendarContract.CalendarColumns#ALLOWED_ATTENDEE_TYPES ALLOWED_ATTENDEE_TYPES} +for exchange/sync support.</li> +<li>Adds {@link android.provider.CalendarContract.AttendeesColumns#TYPE_RESOURCE} +(such as conference rooms) for attendees and +{@link android.provider.CalendarContract.EventsColumns#AVAILABILITY_TENTATIVE}, +as well as {@link android.provider.CalendarContract.EventsColumns#EVENT_COLOR_KEY} +for events.</li> +</ul> + +<h3 id="widgets">Home screen widgets</h3> + +<p>Starting from Android 4.0, home screen widgets should no longer include their +own padding. Instead, the system now automatically adds padding for each widget, +based the characteristics of the current screen. This leads to a more uniform, +consistent presentation of widgets in a grid. To assist applications that host +home screen widgets, the platform provides a new method +{@link android.appwidget.AppWidgetHostView#getDefaultPaddingForWidget(android.content.Context, android.content.ComponentName, android.graphics.Rect) +getDefaultPaddingForWidget()}. Applications can call this method to get the +system-defined padding and account for it when computing the number of cells to +allocate to the widget.</p> + +<h3 id="textservices">Spell-checking</h3> + +<ul> +<li>For apps that accessing spell-checker services, a new {@link +android.view.textservice.SpellCheckerSession#cancel() cancel()} method cancels +any pending and running spell-checker tasks in a session.</li> + +<li>For spell-checker services, a new suggestions flag, +{@link android.view.textservice.SuggestionsInfo#RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS}, +lets the services distinguish higher-confidence suggestions from +lower-confidence ones. For example, a spell-checker could set the flag if an +input word is not in the user dictionary but has likely suggestions, or not set +the flag if an input word is not in the dictionary and has suggestions that are +likely to be less useful. + +<p>Apps connected to the spell-checker can use the {@link +android.view.textservice.SuggestionsInfo#RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS} +flag in combination with other suggestion attributes, as well as the {@link +android.view.textservice.SuggestionsInfo#getSuggestionsAttributes()} and {@link +android.view.textservice.SuggestionsInfo#getSuggestionsCount()} methods, to +determine whether to mark input words as typos and offer suggestions.</p></li> + +<li>A new {@link android.text.style.SuggestionSpan#FLAG_AUTO_CORRECTION} style +for text spans indicates that auto correction is about to be applied to a +word/text that the user is typing/composing. This type of suggestion is rendered +differently, to indicate the auto correction is happening.</li> +</ul> + +<h3 id="bluetooth">Bluetooth</h3> +<p>New public methods {@link +android.bluetooth.BluetoothDevice#fetchUuidsWithSdp()} and {@link +android.bluetooth.BluetoothDevice#getUuids()} let apps determine the features +(UUIDs) supported by a remote device. In the case of {@link +android.bluetooth.BluetoothDevice#fetchUuidsWithSdp()}, the system performs a +service discovery on the remote device to get the UUIDs supported, then +broadcasts the result in an {@link +android.bluetooth.BluetoothDevice#ACTION_UUID} intent.</p> + +<h3 id="ui">UI toolkit</h3> + +<p>New methods {@link android.app.Fragment#setUserVisibleHint(boolean) setUserVisibleHint()} and +{@link android.app.Fragment#getUserVisibleHint() getUserVisibleHint()} allow a +fragment to set a hint of whether or not it is currently user-visible. The +system defers the start of fragments that are not user-visible until the loaders +for visible fragments have run. The visibility hint is "true" by default.</li> +</p> + +<h3 id="graphics">Graphics</h3> + +<ul> +<li>New method {@link android.graphics.SurfaceTexture#setDefaultBufferSize(int +width, int height)} in SurfaceTexture sets the default size of the image +buffers. This method may be used to set the image size when producing images +with {@link android.graphics.Canvas} (via {@link +android.view.Surface#lockCanvas}), or OpenGL ES (via an EGLSurface).</li> +<li>Adds definitions for the enums of the GL_OES_EGL_image_external OpenGL ES extension — +{@link android.opengl.GLES11Ext#GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES}, +{@link android.opengl.GLES11Ext#GL_SAMPLER_EXTERNAL_OES}, +{@link android.opengl.GLES11Ext#GL_TEXTURE_BINDING_EXTERNAL_OES}, and +{@link android.opengl.GLES11Ext#GL_TEXTURE_EXTERNAL_OES}.</li> +</ul> + +<h3 id="accessibility">Accessibility</h3> + +<ul> +<li>Clients of {@link android.widget.RemoteViews} can now use the method {@link +android.widget.RemoteViews#setContentDescription(int, java.lang.CharSequence) +setContentDescription()} to set and get the content description of any View in +the inflated layout.</li> + +<li>The methods {@link android.view.accessibility.AccessibilityRecord#getMaxScrollX()}, +{@link android.view.accessibility.AccessibilityRecord#getMaxScrollY()}, +{@link android.view.accessibility.AccessibilityRecord#setMaxScrollX(int) setMaxScrollX()}, and +{@link android.view.accessibility.AccessibilityRecord#setMaxScrollY(int) setMaxScrollY()} +allow apps to get and set the maximum scroll offset for an +{@link android.view.accessibility.AccessibilityRecord} object.</li> + +<li>When touch-exploration mode is enabled, a new secure setting +{@link android.provider.Settings.Secure#ACCESSIBILITY_SPEAK_PASSWORD} +indicates whether the user requests the IME to speak text entered in password fields, even when +a headset is not in use. By default, no password text is spoken unless a headset +is in use.</li> +</ul> + +<h3 id="tts">Text-to-speech</h3> + +<ul> +<li>Adds the new method {@link +android.speech.tts.TextToSpeech.Engine#getFeatures(java.util.Locale) +getFeatures()}for querying and enabling network TTS support. +<li>Adds a new listener class, {@link +android.speech.tts.UtteranceProgressListener}, that engines can register to +receive notification of speech-sythesis errors.</li> +</ul> + +<h3 id="database">Database</h3> + +<ul> +<li>A new {@link android.database.CrossProcessCursorWrapper} class lets content +providers return results for a cross-process query more effieciently. The new +class is a useful building block for wrapping cursors that will be sent to +processes remotely. It can also transform normal {@link android.database.Cursor} +objects into {@link android.database.CrossProcessCursor} objects +transparently. + +<p>The {@link android.database.CrossProcessCursorWrapper} class fixes common +performance issues and bugs that applications have encountered when +implementing content providers.</p></li> + +<li>The {@link android.database.CursorWindow#CursorWindow(java.lang.String)} +constructor now takes a name string as input. The system no longer distinguishes +between local and remote cursor windows, so {@link +android.database.CursorWindow#CursorWindow(boolean)} is now deprecated.</li> +</ul> + +<h3 id="intents">Intents</h3> + +<p>Adds for categories for targeting common types of applications on the +device, such as {@link android.content.Intent#CATEGORY_APP_BROWSER}, {@link +android.content.Intent#CATEGORY_APP_CALENDAR}, {@link +android.content.Intent#CATEGORY_APP_MAPS}, and more.</li> + +<h3 id="camera">Camera</h3> + +<ul> +<li>{@link android.media.MediaMetadataRetriever} adds the new constant +{@link android.media.MediaMetadataRetriever#METADATA_KEY_LOCATION} to let apps +access retrieve location information for an image or video. </li> + +<li>{@link android.media.CamcorderProfile} adds the QVGA (320x240) resolution +profiles. Quality level is represented by the +{@link android.media.CamcorderProfile#QUALITY_QVGA}.and +{@link android.media.CamcorderProfile#QUALITY_TIME_LAPSE_QVGA} constants.</li> + +<li>New methods {@link android.hardware.Camera.Parameters#setVideoStabilization(boolean) setVideoStabilization()}, +{@link android.hardware.Camera.Parameters#getVideoStabilization() setVideoStabilization()}, and {android.hardware.Camera.Parameters#isVideoStabilizationSupported() isVideoStabilizationSupported()} +let you check and manage video stabilization for a {@link android.hardware.Camera}.</li> +</ul> + +<h3 id="Permissions">Permissions</h3> + +<p>The following are new permissions:</p> +<ul> +<li>{@link android.Manifest.permission#READ_SOCIAL_STREAM} and +{@link android.Manifest.permission#WRITE_SOCIAL_STREAM}: Allow a sync +adapter to read and write social stream data to a contact in the shared +contacts provider.</li> +</ul> + + +<div class="special" style="margin-top:2em"> +<p>For a detailed view of all API changes in Android {@sdkPlatformVersion} (API Level +{@sdkPlatformApiLevel}), see the <a +href="{@docRoot}sdk/api_diff/{@sdkPlatformApiLevel}/changes.html">API Differences Report</a>.</p> +</div> + + +<h2 id="api-level">API Level</h2> + +<p>The Android {@sdkPlatformVersion} API is assigned an integer +identifier—<strong>{@sdkPlatformApiLevel}</strong>—that is stored in the system itself. +This identifier, called the "API level", allows the system to correctly determine whether an +application is compatible with the system, prior to installing the application. </p> + +<p>To use APIs introduced in Android {@sdkPlatformVersion} in your application, you need compile the +application against an Android platform that supports API level {@sdkPlatformApiLevel} or +higher. Depending on your needs, you might also need to add an +<code>android:minSdkVersion="{@sdkPlatformApiLevel}"</code> attribute to the +<a href="{@docRoot}guide/topics/manifest/uses-sdk-element.html">{@code <uses-sdk>}</a> +element.</p> + +<p>For more information, see the <a href="{@docRoot}guide/appendix/api-levels.html">API Levels</a> +document. </p> + + +<h2 id="apps">Built-in Applications</h2> + +<p>The system image included in the downloadable platform provides these +built-in applications:</p> + +<table style="border:0;padding-bottom:0;margin-bottom:0;"> +<tr> +<td style="border:0;padding-bottom:0;margin-bottom:0;"> +<ul> +<li>API Demos</li> +<li>Browser</li> +<li>Calculator</li> +<li>Calendar</li> +<li>Camera</li> +<li>Clock</li> +<li>Custom Locale</li> +<li>Dev Tools</li> +<li>Downloads</li> +<li>Email</li> +<li>Gallery</li> +</ul> +</td> +<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;"> +<ul> +<li>Gestures Builder</li> +<li>Messaging</li> +<li>Music</li> +<li>People</li> +<li>Phone</li> +<li>Search</li> +<li>Settings</li> +<li>Speech Recorder</li> +<li>Widget Preview</li> +</ul> +</td> +</tr> +</table> + + +<h2 id="locs" style="margin-top:.75em;">Locales</h2> + +<p>The system image included in the downloadable SDK platform provides a variety of built-in +locales. In some cases, region-specific strings are available for the locales. In other cases, a +default version of the language is used. The languages that are available in the Android 3.0 system +image are listed below (with <em>language</em>_<em>country/region</em> locale descriptor).</p> + +<table style="border:0;padding-bottom:0;margin-bottom:0;"> +<tr> +<td style="border:0;padding-bottom:0;margin-bottom:0;"> +<ul> +<li>Arabic, Egypt (ar_EG)</li> +<li>Arabic, Israel (ar_IL)</li> +<li>Bulgarian, Bulgaria (bg_BG)</li> +<li>Catalan, Spain (ca_ES)</li> +<li>Czech, Czech Republic (cs_CZ)</li> +<li>Danish, Denmark(da_DK)</li> +<li>German, Austria (de_AT)</li> +<li>German, Switzerland (de_CH)</li> +<li>German, Germany (de_DE)</li> +<li>German, Liechtenstein (de_LI)</li> +<li>Greek, Greece (el_GR)</li> +<li>English, Australia (en_AU)</li> +<li>English, Canada (en_CA)</li> +<li>English, Britain (en_GB)</li> +<li>English, Ireland (en_IE)</li> +<li>English, India (en_IN)</li> +<li>English, New Zealand (en_NZ)</li> +<li>English, Singapore(en_SG)</li> +<li>English, US (en_US)</li> +<li>English, Zimbabwe (en_ZA)</li> +<li>Spanish (es_ES)</li> +<li>Spanish, US (es_US)</li> +<li>Finnish, Finland (fi_FI)</li> +<li>French, Belgium (fr_BE)</li> +<li>French, Canada (fr_CA)</li> +<li>French, Switzerland (fr_CH)</li> +<li>French, France (fr_FR)</li> +<li>Hebrew, Israel (he_IL)</li> +<li>Hindi, India (hi_IN)</li> +</ul> +</td> +<td style="border:0;padding-bottom:0;margin-bottom:0;padding-left:5em;"> +<li>Croatian, Croatia (hr_HR)</li> +<li>Hungarian, Hungary (hu_HU)</li> +<li>Indonesian, Indonesia (id_ID)</li> +<li>Italian, Switzerland (it_CH)</li> +<li>Italian, Italy (it_IT)</li> +<li>Japanese (ja_JP)</li> +<li>Korean (ko_KR)</li> +<li>Lithuanian, Lithuania (lt_LT)</li> +<li>Latvian, Latvia (lv_LV)</li> +<li>Norwegian bokmål, Norway (nb_NO)</li> +<li>Dutch, Belgium (nl_BE)</li> +<li>Dutch, Netherlands (nl_NL)</li> +<li>Polish (pl_PL)</li> +<li>Portuguese, Brazil (pt_BR)</li> +<li>Portuguese, Portugal (pt_PT)</li> +<li>Romanian, Romania (ro_RO)</li> +<li>Russian (ru_RU)</li></li> +<li>Slovak, Slovakia (sk_SK)</li> +<li>Slovenian, Slovenia (sl_SI)</li> +<li>Serbian (sr_RS)</li> +<li>Swedish, Sweden (sv_SE)</li> +<li>Thai, Thailand (th_TH)</li> +<li>Tagalog, Philippines (tl_PH)</li> +<li>Turkish, Turkey (tr_TR)</li> +<li>Ukrainian, Ukraine (uk_UA)</li> +<li>Vietnamese, Vietnam (vi_VN)</li> +<li>Chinese, PRC (zh_CN)</li> +<li>Chinese, Taiwan (zh_TW)</li> +</td> +</tr> +</table> + +<p class="note"><strong>Note:</strong> The Android platform may support more +locales than are included in the SDK system image. All of the supported locales +are available in the <a href="http://source.android.com/">Android Open Source +Project</a>.</p> + +<h2 id="skins">Emulator Skins</h2> + +<p>The downloadable platform includes the following emulator skins:</p> + +<ul> + <li> + QVGA (240x320, low density, small screen) + </li> + <li> + WQVGA400 (240x400, low density, normal screen) + </li> + <li> + WQVGA432 (240x432, low density, normal screen) + </li> + <li> + HVGA (320x480, medium density, normal screen) + </li> + <li> + WVGA800 (480x800, high density, normal screen) + </li> + <li> + WVGA854 (480x854 high density, normal screen) + </li> + <li> + WXGA720 (1280x720, extra-high density, normal screen) + </li> + <li> + WSVGA (1024x600, medium density, large screen) + </li> + <li> + WXGA (1280x800, medium density, xlarge screen) + </li> +</ul> + +<p>To test your application on an emulator that represents the latest Android device, you can create +an AVD with the new WXGA720 skin (it's an xhdpi, normal screen device). Note that the emulator +currently doesn't support the new on-screen navigation bar for devices without hardware navigation +buttons, so when using this skin, you must use keyboard keys <em>Home</em> for the Home button, +<em>ESC</em> for the Back button, and <em>F2</em> or <em>Page-up</em> for the Menu button.</p> + +<p>However, due to performance issues in the emulator when running high-resolution screens such as +the one for the WXGA720 skin, we recommend that you primarily use the traditional WVGA800 skin +(hdpi, normal screen) to test your application.</p> + diff --git a/docs/html/sdk/android-4.0.jd b/docs/html/sdk/android-4.0.jd index e886bdf9ff74..7161b03708b5 100644 --- a/docs/html/sdk/android-4.0.jd +++ b/docs/html/sdk/android-4.0.jd @@ -65,26 +65,42 @@ experience possible on the latest Android-powered devices.</p> <p>To determine what revision of the Android {@sdkPlatformVersion} platform you have installed, refer to the "Installed Packages" listing in the Android SDK Manager.</p> +<p class="caution"><strong>Important:</strong> To download the new Android +4.0 system components from the Android SDK Manager, you must first update the +SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not, +the Android 4.0 system components will not be available for download.</p> <div class="toggle-content opened" style="padding-left:1em;"> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" alt="" /> - Android {@sdkPlatformVersion}, Revision 1</a> <em>(October 2011)</em> + Android {@sdkPlatformVersion}, Revision 2</a> <em>(December 2011)</em> </a></p> <div class="toggle-content-toggleme" style="padding-left:2em;"> + <p>Maintenance update. The system version is 4.0.2.</p> + <dl> + <dt>Dependencies:</dt> + <dd>SDK Tools r14 or higher is required.</dd> + </dl> + </div> +</div> -<dl> -<dt>Initial release. SDK Tools r14 or higher is required. - <p class="caution"><strong>Important:</strong> To download the new Android - 4.0 system components from the Android SDK Manager, you must first update the - SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not, - the Android 4.0 system components will not be available for download.</p> -</dt> -</dl> +<div class="toggle-content closed" style="padding-left:1em;"> + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" +class="toggle-content-img" alt="" /> + Android {@sdkPlatformVersion}, Revision 1</a> <em>(October 2011)</em> + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em;"> + <p>Initial release. The system version is 4.0.1.</p> + <dl> + <dt>Dependencies:</dt> + <dd>SDK Tools r14 or higher is required.</dd> + </dl> </div> </div> diff --git a/docs/html/sdk/api_diff/15/changes.html b/docs/html/sdk/api_diff/15/changes.html new file mode 100644 index 000000000000..6fe88e8c48ca --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes.html @@ -0,0 +1,45 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<!-- on Mon Dec 12 18:47:19 PST 2011 --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +API Differences between 14 and 15 +</TITLE> +<link href="../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</head> +<frameset cols="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9"> +<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9"> + <frame src="changes/jdiff_topleftframe.html" scrolling="no" name="topleftframe" frameborder="1"> + <frame src="changes/alldiffs_index_all.html" scrolling="auto" name="bottomleftframe" frameborder="1"> + </frameset> + <frame src="changes/changes-summary.html" scrolling="auto" name="rightframe" frameborder="1"> +</frameset> +<noframes> +<h2> +Frame Alert +</h2> + +<p> +This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client. +<br> +Link to <a href="changes/changes-summary.html" target="_top">Non-frame version.</A> +</noframes> +</html> diff --git a/docs/html/sdk/api_diff/15/changes/alldiffs_index_additions.html b/docs/html/sdk/api_diff/15/changes/alldiffs_index_additions.html new file mode 100644 index 000000000000..25c2b0af5a92 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/alldiffs_index_additions.html @@ -0,0 +1,620 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +All Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a> + <br> +<font color="#999999">Removals</font> + <br> +<b>Additions</b> + <br> +<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<!-- Field ACCESSIBILITY_SPEAK_PASSWORD --> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD" class="hiddenlink" target="rightframe">ACCESSIBILITY_SPEAK_PASSWORD</A> +</nobr><br> +<!-- Field ACTION_UUID --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.ACTION_UUID" class="hiddenlink" target="rightframe">ACTION_UUID</A> +</nobr><br> +<!-- Field ALLOWED_ATTENDEE_TYPES --> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_ATTENDEE_TYPES" class="hiddenlink" target="rightframe">ALLOWED_ATTENDEE_TYPES</A> +</nobr><br> +<!-- Field ALLOWED_AVAILABILITY --> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_AVAILABILITY" class="hiddenlink" target="rightframe">ALLOWED_AVAILABILITY</A> +</nobr><br> +<!-- Field AVAILABILITY_TENTATIVE --> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.AVAILABILITY_TENTATIVE" class="hiddenlink" target="rightframe">AVAILABILITY_TENTATIVE</A> +</nobr><br> +<!-- Field CALENDAR_COLOR_KEY --> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.CALENDAR_COLOR_KEY" class="hiddenlink" target="rightframe">CALENDAR_COLOR_KEY</A> +</nobr><br> +<!-- Class CalendarContract.Colors --> +<A HREF="pkg_android.provider.html#CalendarContract.Colors" class="hiddenlink" target="rightframe"><b>CalendarContract.Colors</b></A><br> +<!-- Class CalendarContract.ColorsColumns --> +<A HREF="pkg_android.provider.html#CalendarContract.ColorsColumns" class="hiddenlink" target="rightframe"><b><i>CalendarContract.ColorsColumns</i></b></A><br> +<!-- Method callOnClick --> +<nobr><A HREF="android.view.View.html#android.view.View.callOnClick_added()" class="hiddenlink" target="rightframe"><b>callOnClick</b> +()</A></nobr><br> +<!-- Method cancel --> +<nobr><A HREF="android.view.textservice.SpellCheckerSession.html#android.view.textservice.SpellCheckerSession.cancel_added()" class="hiddenlink" target="rightframe"><b>cancel</b> +()</A></nobr><br> +<!-- Field CATEGORY_APP_BROWSER --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_BROWSER" class="hiddenlink" target="rightframe">CATEGORY_APP_BROWSER</A> +</nobr><br> +<!-- Field CATEGORY_APP_CALCULATOR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALCULATOR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALCULATOR</A> +</nobr><br> +<!-- Field CATEGORY_APP_CALENDAR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALENDAR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALENDAR</A> +</nobr><br> +<!-- Field CATEGORY_APP_CONTACTS --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CONTACTS" class="hiddenlink" target="rightframe">CATEGORY_APP_CONTACTS</A> +</nobr><br> +<!-- Field CATEGORY_APP_EMAIL --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_EMAIL" class="hiddenlink" target="rightframe">CATEGORY_APP_EMAIL</A> +</nobr><br> +<!-- Field CATEGORY_APP_GALLERY --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_GALLERY" class="hiddenlink" target="rightframe">CATEGORY_APP_GALLERY</A> +</nobr><br> +<!-- Field CATEGORY_APP_MAPS --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MAPS" class="hiddenlink" target="rightframe">CATEGORY_APP_MAPS</A> +</nobr><br> +<!-- Field CATEGORY_APP_MESSAGING --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MESSAGING" class="hiddenlink" target="rightframe">CATEGORY_APP_MESSAGING</A> +</nobr><br> +<!-- Field CATEGORY_APP_MUSIC --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MUSIC" class="hiddenlink" target="rightframe">CATEGORY_APP_MUSIC</A> +</nobr><br> +<!-- Class ContactsContract.Contacts.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.Contacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.Contacts.StreamItems</b></A><br> +<!-- Class ContactsContract.RawContacts.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.RawContacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.RawContacts.StreamItems</b></A><br> +<!-- Class ContactsContract.StreamItemPhotos --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItemPhotos</b></A><br> +<!-- Class ContactsContract.StreamItemPhotosColumns --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotosColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemPhotosColumns</i></b></A><br> +<!-- Class ContactsContract.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems</b></A><br> +<!-- Class ContactsContract.StreamItems.StreamItemPhotos --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems.StreamItemPhotos</b></A><br> +<!-- Class ContactsContract.StreamItemsColumns --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemsColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemsColumns</i></b></A><br> +<!-- Class CrossProcessCursorWrapper --> +<A HREF="pkg_android.database.html#CrossProcessCursorWrapper" class="hiddenlink" target="rightframe"><b>CrossProcessCursorWrapper</b></A><br> +<!-- Constructor CursorWindow --> +<nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>CursorWindow</b> +(<code>String</code>)</A></nobr> constructor<br> +<!-- Field EVENT_COLOR_KEY --> +<A NAME="E"></A> +<br><font size="+2">E</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.EVENT_COLOR_KEY" class="hiddenlink" target="rightframe">EVENT_COLOR_KEY</A> +</nobr><br> +<!-- Field EXTRA_UUID --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.EXTRA_UUID" class="hiddenlink" target="rightframe">EXTRA_UUID</A> +</nobr><br> +<!-- Method fetchUuidsWithSdp --> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.fetchUuidsWithSdp_added()" class="hiddenlink" target="rightframe"><b>fetchUuidsWithSdp</b> +()</A></nobr><br> +<!-- Field FILL_IN_SELECTOR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SELECTOR" class="hiddenlink" target="rightframe">FILL_IN_SELECTOR</A> +</nobr><br> +<!-- Field FLAG_AUTO_CORRECTION --> +<nobr><A HREF="android.text.style.SuggestionSpan.html#android.text.style.SuggestionSpan.FLAG_AUTO_CORRECTION" class="hiddenlink" target="rightframe">FLAG_AUTO_CORRECTION</A> +</nobr><br> +<!-- Method getDefaultPaddingForWidget --> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.appwidget.AppWidgetHostView.html#android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget_added(android.content.Context, android.content.ComponentName, android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>getDefaultPaddingForWidget</b> +(<code>Context, ComponentName, Rect</code>)</A></nobr><br> +<!-- Method getFeatures --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.getFeatures_added(java.util.Locale)" class="hiddenlink" target="rightframe"><b>getFeatures</b> +(<code>Locale</code>)</A></nobr><br> +<!-- Method getMaxScrollX --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollX_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollX</b> +()</A></nobr><br> +<!-- Method getMaxScrollY --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollY_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollY</b> +()</A></nobr><br> +<!-- Method getSelector --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSelector_added()" class="hiddenlink" target="rightframe"><b>getSelector</b> +()</A></nobr><br> +<!-- Method getUserVisibleHint --> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.getUserVisibleHint_added()" class="hiddenlink" target="rightframe"><b>getUserVisibleHint</b> +()</A></nobr><br> +<!-- Method getUuids --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.getUuids_added()" class="hiddenlink" target="rightframe"><b>getUuids</b> +()</A></nobr><br> +<!-- Method getVideoStabilization --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.getVideoStabilization_added()" class="hiddenlink" target="rightframe"><b>getVideoStabilization</b> +()</A></nobr><br> +<!-- Field GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" class="hiddenlink" target="rightframe">GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES</A> +</nobr><br> +<!-- Field GL_SAMPLER_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_SAMPLER_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_SAMPLER_EXTERNAL_OES</A> +</nobr><br> +<!-- Field GL_TEXTURE_BINDING_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_BINDING_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_BINDING_EXTERNAL_OES</A> +</nobr><br> +<!-- Field GL_TEXTURE_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_EXTERNAL_OES</A> +</nobr><br> +<!-- Method hasOnClickListeners --> +<A NAME="H"></A> +<br><font size="+2">H</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.hasOnClickListeners_added()" class="hiddenlink" target="rightframe"><b>hasOnClickListeners</b> +()</A></nobr><br> +<!-- Field ICE_CREAM_SANDWICH_MR1 --> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1" class="hiddenlink" target="rightframe">ICE_CREAM_SANDWICH_MR1</A> +</nobr><br> +<!-- Method isVideoStabilizationSupported --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.isVideoStabilizationSupported_added()" class="hiddenlink" target="rightframe"><b>isVideoStabilizationSupported</b> +()</A></nobr><br> +<!-- Field KEY_FEATURE_EMBEDDED_SYNTHESIS --> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_EMBEDDED_SYNTHESIS</A> +</nobr><br> +<!-- Field KEY_FEATURE_NETWORK_SYNTHESIS --> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_NETWORK_SYNTHESIS</A> +</nobr><br> +<!-- Field KEYCODE_CALCULATOR --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALCULATOR" class="hiddenlink" target="rightframe">KEYCODE_CALCULATOR</A> +</nobr><br> +<!-- Field KEYCODE_CALENDAR --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALENDAR" class="hiddenlink" target="rightframe">KEYCODE_CALENDAR</A> +</nobr><br> +<!-- Field KEYCODE_CONTACTS --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CONTACTS" class="hiddenlink" target="rightframe">KEYCODE_CONTACTS</A> +</nobr><br> +<!-- Field KEYCODE_MUSIC --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_MUSIC" class="hiddenlink" target="rightframe">KEYCODE_MUSIC</A> +</nobr><br> +<!-- Field LIKE_TRANSACTION --> +<A NAME="L"></A> +<br><font size="+2">L</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.IBinder.html#android.os.IBinder.LIKE_TRANSACTION" class="hiddenlink" target="rightframe">LIKE_TRANSACTION</A> +</nobr><br> +<!-- Method makeMainSelectorActivity --> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.makeMainSelectorActivity_added(java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>makeMainSelectorActivity</b> +(<code>String, String</code>)</A></nobr><br> +<!-- Field METADATA_KEY_LOCATION --> +<nobr><A HREF="android.media.MediaMetadataRetriever.html#android.media.MediaMetadataRetriever.METADATA_KEY_LOCATION" class="hiddenlink" target="rightframe">METADATA_KEY_LOCATION</A> +</nobr><br> +<!-- Method onClose --> +<A NAME="O"></A> +<br><font size="+2">O</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.service.textservice.SpellCheckerService.Session.html#android.service.textservice.SpellCheckerService.Session.onClose_added()" class="hiddenlink" target="rightframe"><b>onClose</b> +()</A></nobr><br> +<!-- Method onGetFeaturesForLanguage --> +<nobr><A HREF="android.speech.tts.TextToSpeechService.html#android.speech.tts.TextToSpeechService.onGetFeaturesForLanguage_added(java.lang.String, java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>onGetFeaturesForLanguage</b> +(<code>String, String, String</code>)</A></nobr><br> +<!-- Field QUALITY_QVGA --> +<A NAME="Q"></A> +<br><font size="+2">Q</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_QVGA" class="hiddenlink" target="rightframe">QUALITY_QVGA</A> +</nobr><br> +<!-- Field QUALITY_TIME_LAPSE_QVGA --> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_TIME_LAPSE_QVGA" class="hiddenlink" target="rightframe">QUALITY_TIME_LAPSE_QVGA</A> +</nobr><br> +<!-- Field READ_SOCIAL_STREAM --> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.READ_SOCIAL_STREAM" class="hiddenlink" target="rightframe">READ_SOCIAL_STREAM</A> +</nobr><br> +<!-- Constructor RemoteException --> +<nobr><A HREF="android.os.RemoteException.html#android.os.RemoteException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>RemoteException</b> +(<code>String</code>)</A></nobr> constructor<br> +<!-- Field RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS --> +<nobr><A HREF="android.view.textservice.SuggestionsInfo.html#android.view.textservice.SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" class="hiddenlink" target="rightframe">RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS</A> +</nobr><br> +<!-- Method setContentDescription --> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.setContentDescription_added(int, java.lang.CharSequence)" class="hiddenlink" target="rightframe"><b>setContentDescription</b> +(<code>int, CharSequence</code>)</A></nobr><br> +<!-- Method setDefaultBufferSize --> +<nobr><A HREF="android.graphics.SurfaceTexture.html#android.graphics.SurfaceTexture.setDefaultBufferSize_added(int, int)" class="hiddenlink" target="rightframe"><b>setDefaultBufferSize</b> +(<code>int, int</code>)</A></nobr><br> +<!-- Method setMaxScrollX --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollX_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollX</b> +(<code>int</code>)</A></nobr><br> +<!-- Method setMaxScrollY --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollY_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollY</b> +(<code>int</code>)</A></nobr><br> +<!-- Method setOffsetNotificationsEnabled --> +<nobr><A HREF="android.service.wallpaper.WallpaperService.Engine.html#android.service.wallpaper.WallpaperService.Engine.setOffsetNotificationsEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setOffsetNotificationsEnabled</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Method setOnUtteranceProgressListener --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceProgressListener_added(android.speech.tts.UtteranceProgressListener)" class="hiddenlink" target="rightframe"><b>setOnUtteranceProgressListener</b> +(<code>UtteranceProgressListener</code>)</A></nobr><br> +<!-- Method setSelector --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSelector_added(android.content.Intent)" class="hiddenlink" target="rightframe"><b>setSelector</b> +(<code>Intent</code>)</A></nobr><br> +<!-- Method setUserVisibleHint --> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.setUserVisibleHint_added(boolean)" class="hiddenlink" target="rightframe"><b>setUserVisibleHint</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Method setVideoStabilization --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.setVideoStabilization_added(boolean)" class="hiddenlink" target="rightframe"><b>setVideoStabilization</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Class TransactionTooLargeException --> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.os.html#TransactionTooLargeException" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b></A><br> +<!-- Field TYPE_RESOURCE --> +<nobr><A HREF="android.provider.CalendarContract.AttendeesColumns.html#android.provider.CalendarContract.AttendeesColumns.TYPE_RESOURCE" class="hiddenlink" target="rightframe">TYPE_RESOURCE</A> +</nobr><br> +<!-- Class UtteranceProgressListener --> +<A NAME="U"></A> +<br><font size="+2">U</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.speech.tts.html#UtteranceProgressListener" class="hiddenlink" target="rightframe"><b>UtteranceProgressListener</b></A><br> +<!-- Field WRITE_SOCIAL_STREAM --> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_SOCIAL_STREAM" class="hiddenlink" target="rightframe">WRITE_SOCIAL_STREAM</A> +</nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/alldiffs_index_all.html b/docs/html/sdk/api_diff/15/changes/alldiffs_index_all.html new file mode 100644 index 000000000000..c4a67daf00b2 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/alldiffs_index_all.html @@ -0,0 +1,828 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +All Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>All Differences</b> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<!-- Field ACCESSIBILITY_SPEAK_PASSWORD --> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD" class="hiddenlink" target="rightframe">ACCESSIBILITY_SPEAK_PASSWORD</A> +</nobr><br> +<!-- Class AccessibilityRecord --> +<A HREF="android.view.accessibility.AccessibilityRecord.html" class="hiddenlink" target="rightframe">AccessibilityRecord</A><br> +<!-- Field ACTION_UUID --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.ACTION_UUID" class="hiddenlink" target="rightframe">ACTION_UUID</A> +</nobr><br> +<!-- Field ALLOWED_ATTENDEE_TYPES --> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_ATTENDEE_TYPES" class="hiddenlink" target="rightframe">ALLOWED_ATTENDEE_TYPES</A> +</nobr><br> +<!-- Field ALLOWED_AVAILABILITY --> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_AVAILABILITY" class="hiddenlink" target="rightframe">ALLOWED_AVAILABILITY</A> +</nobr><br> +<!-- Package android --> +<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br> +<!-- Package android.app --> +<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br> +<!-- Package android.appwidget --> +<A HREF="pkg_android.appwidget.html" class="hiddenlink" target="rightframe">android.appwidget</A><br> +<!-- Package android.bluetooth --> +<A HREF="pkg_android.bluetooth.html" class="hiddenlink" target="rightframe">android.bluetooth</A><br> +<!-- Package android.content --> +<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br> +<!-- Package android.database --> +<A HREF="pkg_android.database.html" class="hiddenlink" target="rightframe">android.database</A><br> +<!-- Package android.graphics --> +<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br> +<!-- Package android.hardware --> +<A HREF="pkg_android.hardware.html" class="hiddenlink" target="rightframe">android.hardware</A><br> +<!-- Package android.media --> +<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br> +<!-- Package android.opengl --> +<A HREF="pkg_android.opengl.html" class="hiddenlink" target="rightframe">android.opengl</A><br> +<!-- Package android.os --> +<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br> +<!-- Package android.provider --> +<A HREF="pkg_android.provider.html" class="hiddenlink" target="rightframe">android.provider</A><br> +<!-- Package android.service.textservice --> +<A HREF="pkg_android.service.textservice.html" class="hiddenlink" target="rightframe">android.service.textservice</A><br> +<!-- Package android.service.wallpaper --> +<A HREF="pkg_android.service.wallpaper.html" class="hiddenlink" target="rightframe">android.service.wallpaper</A><br> +<!-- Package android.speech.tts --> +<A HREF="pkg_android.speech.tts.html" class="hiddenlink" target="rightframe">android.speech.tts</A><br> +<!-- Package android.text.style --> +<A HREF="pkg_android.text.style.html" class="hiddenlink" target="rightframe">android.text.style</A><br> +<!-- Package android.view --> +<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br> +<!-- Package android.view.accessibility --> +<A HREF="pkg_android.view.accessibility.html" class="hiddenlink" target="rightframe">android.view.accessibility</A><br> +<!-- Package android.view.textservice --> +<A HREF="pkg_android.view.textservice.html" class="hiddenlink" target="rightframe">android.view.textservice</A><br> +<!-- Package android.webkit --> +<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br> +<!-- Package android.widget --> +<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br> +<!-- Class AppWidgetHostView --> +<A HREF="android.appwidget.AppWidgetHostView.html" class="hiddenlink" target="rightframe">AppWidgetHostView</A><br> +<!-- Field AVAILABILITY_TENTATIVE --> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.AVAILABILITY_TENTATIVE" class="hiddenlink" target="rightframe">AVAILABILITY_TENTATIVE</A> +</nobr><br> +<!-- Field BIND_ADJUST_WITH_ACTIVITY --> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Context.html#android.content.Context.BIND_ADJUST_WITH_ACTIVITY" class="hiddenlink" target="rightframe">BIND_ADJUST_WITH_ACTIVITY</A> +</nobr><br> +<!-- Class BluetoothDevice --> +<A HREF="android.bluetooth.BluetoothDevice.html" class="hiddenlink" target="rightframe">BluetoothDevice</A><br> +<!-- Class Build.VERSION_CODES --> +<A HREF="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br> +<!-- Field CALENDAR_COLOR_KEY --> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.CALENDAR_COLOR_KEY" class="hiddenlink" target="rightframe">CALENDAR_COLOR_KEY</A> +</nobr><br> +<!-- Class CalendarContract.AttendeesColumns --> +<A HREF="android.provider.CalendarContract.AttendeesColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.AttendeesColumns</i></A><br> +<!-- Class CalendarContract.CalendarColumns --> +<A HREF="android.provider.CalendarContract.CalendarColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.CalendarColumns</i></A><br> +<!-- Class CalendarContract.Colors --> +<A HREF="pkg_android.provider.html#CalendarContract.Colors" class="hiddenlink" target="rightframe"><b>CalendarContract.Colors</b></A><br> +<!-- Class CalendarContract.ColorsColumns --> +<A HREF="pkg_android.provider.html#CalendarContract.ColorsColumns" class="hiddenlink" target="rightframe"><b><i>CalendarContract.ColorsColumns</i></b></A><br> +<!-- Class CalendarContract.EventsColumns --> +<A HREF="android.provider.CalendarContract.EventsColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.EventsColumns</i></A><br> +<!-- Method callOnClick --> +<nobr><A HREF="android.view.View.html#android.view.View.callOnClick_added()" class="hiddenlink" target="rightframe"><b>callOnClick</b> +()</A></nobr><br> +<!-- Class CamcorderProfile --> +<A HREF="android.media.CamcorderProfile.html" class="hiddenlink" target="rightframe">CamcorderProfile</A><br> +<!-- Class Camera.Parameters --> +<A HREF="android.hardware.Camera.Parameters.html" class="hiddenlink" target="rightframe">Camera.Parameters</A><br> +<!-- Method cancel --> +<nobr><A HREF="android.view.textservice.SpellCheckerSession.html#android.view.textservice.SpellCheckerSession.cancel_added()" class="hiddenlink" target="rightframe"><b>cancel</b> +()</A></nobr><br> +<!-- Field CATEGORY_APP_BROWSER --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_BROWSER" class="hiddenlink" target="rightframe">CATEGORY_APP_BROWSER</A> +</nobr><br> +<!-- Field CATEGORY_APP_CALCULATOR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALCULATOR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALCULATOR</A> +</nobr><br> +<!-- Field CATEGORY_APP_CALENDAR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALENDAR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALENDAR</A> +</nobr><br> +<!-- Field CATEGORY_APP_CONTACTS --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CONTACTS" class="hiddenlink" target="rightframe">CATEGORY_APP_CONTACTS</A> +</nobr><br> +<!-- Field CATEGORY_APP_EMAIL --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_EMAIL" class="hiddenlink" target="rightframe">CATEGORY_APP_EMAIL</A> +</nobr><br> +<!-- Field CATEGORY_APP_GALLERY --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_GALLERY" class="hiddenlink" target="rightframe">CATEGORY_APP_GALLERY</A> +</nobr><br> +<!-- Field CATEGORY_APP_MAPS --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MAPS" class="hiddenlink" target="rightframe">CATEGORY_APP_MAPS</A> +</nobr><br> +<!-- Field CATEGORY_APP_MESSAGING --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MESSAGING" class="hiddenlink" target="rightframe">CATEGORY_APP_MESSAGING</A> +</nobr><br> +<!-- Field CATEGORY_APP_MUSIC --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MUSIC" class="hiddenlink" target="rightframe">CATEGORY_APP_MUSIC</A> +</nobr><br> +<!-- Class ContactsContract.Contacts.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.Contacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.Contacts.StreamItems</b></A><br> +<!-- Class ContactsContract.RawContacts.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.RawContacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.RawContacts.StreamItems</b></A><br> +<!-- Class ContactsContract.StreamItemPhotos --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItemPhotos</b></A><br> +<!-- Class ContactsContract.StreamItemPhotosColumns --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotosColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemPhotosColumns</i></b></A><br> +<!-- Class ContactsContract.StreamItems --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems</b></A><br> +<!-- Class ContactsContract.StreamItems.StreamItemPhotos --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems.StreamItemPhotos</b></A><br> +<!-- Class ContactsContract.StreamItemsColumns --> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemsColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemsColumns</i></b></A><br> +<!-- Class Context --> +<A HREF="android.content.Context.html" class="hiddenlink" target="rightframe">Context</A><br> +<!-- Class CrossProcessCursorWrapper --> +<A HREF="pkg_android.database.html#CrossProcessCursorWrapper" class="hiddenlink" target="rightframe"><b>CrossProcessCursorWrapper</b></A><br> +<!-- Class CursorWindow --> +<i>CursorWindow</i><br> + <A HREF="android.database.CursorWindow.html" class="hiddenlink" target="rightframe">android.database</A><br> +<!-- Constructor CursorWindow --> + <nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>CursorWindow</b> +(<code>String</code>)</A></nobr> constructor<br> +<!-- Constructor CursorWindow --> + <nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_changed(boolean)" class="hiddenlink" target="rightframe">CursorWindow +(<code>boolean</code>)</A></nobr> constructor<br> +<!-- Field EVENT_COLOR_KEY --> +<A NAME="E"></A> +<br><font size="+2">E</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.EVENT_COLOR_KEY" class="hiddenlink" target="rightframe">EVENT_COLOR_KEY</A> +</nobr><br> +<!-- Field EXTRA_UUID --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.EXTRA_UUID" class="hiddenlink" target="rightframe">EXTRA_UUID</A> +</nobr><br> +<!-- Method fetchUuidsWithSdp --> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.fetchUuidsWithSdp_added()" class="hiddenlink" target="rightframe"><b>fetchUuidsWithSdp</b> +()</A></nobr><br> +<!-- Field FILL_IN_SELECTOR --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SELECTOR" class="hiddenlink" target="rightframe">FILL_IN_SELECTOR</A> +</nobr><br> +<!-- Field FLAG_AUTO_CORRECTION --> +<nobr><A HREF="android.text.style.SuggestionSpan.html#android.text.style.SuggestionSpan.FLAG_AUTO_CORRECTION" class="hiddenlink" target="rightframe">FLAG_AUTO_CORRECTION</A> +</nobr><br> +<!-- Class Fragment --> +<A HREF="android.app.Fragment.html" class="hiddenlink" target="rightframe">Fragment</A><br> +<!-- Method getDefaultPaddingForWidget --> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.appwidget.AppWidgetHostView.html#android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget_added(android.content.Context, android.content.ComponentName, android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>getDefaultPaddingForWidget</b> +(<code>Context, ComponentName, Rect</code>)</A></nobr><br> +<!-- Method getFeatures --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.getFeatures_added(java.util.Locale)" class="hiddenlink" target="rightframe"><b>getFeatures</b> +(<code>Locale</code>)</A></nobr><br> +<!-- Method getLayoutAlgorithm --> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLayoutAlgorithm_changed()" class="hiddenlink" target="rightframe">getLayoutAlgorithm +()</A></nobr><br> +<!-- Method getMaxScrollX --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollX_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollX</b> +()</A></nobr><br> +<!-- Method getMaxScrollY --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollY_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollY</b> +()</A></nobr><br> +<!-- Method getSelector --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSelector_added()" class="hiddenlink" target="rightframe"><b>getSelector</b> +()</A></nobr><br> +<!-- Method getUserVisibleHint --> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.getUserVisibleHint_added()" class="hiddenlink" target="rightframe"><b>getUserVisibleHint</b> +()</A></nobr><br> +<!-- Method getUuids --> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.getUuids_added()" class="hiddenlink" target="rightframe"><b>getUuids</b> +()</A></nobr><br> +<!-- Method getVideoStabilization --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.getVideoStabilization_added()" class="hiddenlink" target="rightframe"><b>getVideoStabilization</b> +()</A></nobr><br> +<!-- Field GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" class="hiddenlink" target="rightframe">GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES</A> +</nobr><br> +<!-- Field GL_SAMPLER_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_SAMPLER_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_SAMPLER_EXTERNAL_OES</A> +</nobr><br> +<!-- Field GL_TEXTURE_BINDING_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_BINDING_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_BINDING_EXTERNAL_OES</A> +</nobr><br> +<!-- Field GL_TEXTURE_EXTERNAL_OES --> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_EXTERNAL_OES</A> +</nobr><br> +<!-- Class GLES11Ext --> +<A HREF="android.opengl.GLES11Ext.html" class="hiddenlink" target="rightframe">GLES11Ext</A><br> +<!-- Method hasOnClickListeners --> +<A NAME="H"></A> +<br><font size="+2">H</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.hasOnClickListeners_added()" class="hiddenlink" target="rightframe"><b>hasOnClickListeners</b> +()</A></nobr><br> +<!-- Class IBinder --> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.IBinder.html" class="hiddenlink" target="rightframe"><i>IBinder</i></A><br> +<!-- Field ICE_CREAM_SANDWICH_MR1 --> +<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1" class="hiddenlink" target="rightframe">ICE_CREAM_SANDWICH_MR1</A> +</nobr><br> +<!-- Class Intent --> +<A HREF="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br> +<!-- Field INTENT_ACTION_MUSIC_PLAYER --> +<nobr><A HREF="android.provider.MediaStore.html#android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER" class="hiddenlink" target="rightframe">INTENT_ACTION_MUSIC_PLAYER</A> +</nobr><br> +<!-- Method isVideoStabilizationSupported --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.isVideoStabilizationSupported_added()" class="hiddenlink" target="rightframe"><b>isVideoStabilizationSupported</b> +()</A></nobr><br> +<!-- Field KEY_FEATURE_EMBEDDED_SYNTHESIS --> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_EMBEDDED_SYNTHESIS</A> +</nobr><br> +<!-- Field KEY_FEATURE_NETWORK_SYNTHESIS --> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_NETWORK_SYNTHESIS</A> +</nobr><br> +<!-- Field KEYCODE_CALCULATOR --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALCULATOR" class="hiddenlink" target="rightframe">KEYCODE_CALCULATOR</A> +</nobr><br> +<!-- Field KEYCODE_CALENDAR --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALENDAR" class="hiddenlink" target="rightframe">KEYCODE_CALENDAR</A> +</nobr><br> +<!-- Field KEYCODE_CONTACTS --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CONTACTS" class="hiddenlink" target="rightframe">KEYCODE_CONTACTS</A> +</nobr><br> +<!-- Field KEYCODE_MUSIC --> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_MUSIC" class="hiddenlink" target="rightframe">KEYCODE_MUSIC</A> +</nobr><br> +<!-- Class KeyEvent --> +<A HREF="android.view.KeyEvent.html" class="hiddenlink" target="rightframe">KeyEvent</A><br> +<!-- Field LIKE_TRANSACTION --> +<A NAME="L"></A> +<br><font size="+2">L</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.IBinder.html#android.os.IBinder.LIKE_TRANSACTION" class="hiddenlink" target="rightframe">LIKE_TRANSACTION</A> +</nobr><br> +<!-- Method makeMainSelectorActivity --> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.makeMainSelectorActivity_added(java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>makeMainSelectorActivity</b> +(<code>String, String</code>)</A></nobr><br> +<!-- Class Manifest.permission --> +<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br> +<!-- Class MediaMetadataRetriever --> +<A HREF="android.media.MediaMetadataRetriever.html" class="hiddenlink" target="rightframe">MediaMetadataRetriever</A><br> +<!-- Class MediaStore --> +<A HREF="android.provider.MediaStore.html" class="hiddenlink" target="rightframe">MediaStore</A><br> +<!-- Field METADATA_KEY_LOCATION --> +<nobr><A HREF="android.media.MediaMetadataRetriever.html#android.media.MediaMetadataRetriever.METADATA_KEY_LOCATION" class="hiddenlink" target="rightframe">METADATA_KEY_LOCATION</A> +</nobr><br> +<!-- Method onClose --> +<A NAME="O"></A> +<br><font size="+2">O</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.service.textservice.SpellCheckerService.Session.html#android.service.textservice.SpellCheckerService.Session.onClose_added()" class="hiddenlink" target="rightframe"><b>onClose</b> +()</A></nobr><br> +<!-- Method onGetFeaturesForLanguage --> +<nobr><A HREF="android.speech.tts.TextToSpeechService.html#android.speech.tts.TextToSpeechService.onGetFeaturesForLanguage_added(java.lang.String, java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>onGetFeaturesForLanguage</b> +(<code>String, String, String</code>)</A></nobr><br> +<!-- Field QUALITY_QVGA --> +<A NAME="Q"></A> +<br><font size="+2">Q</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_QVGA" class="hiddenlink" target="rightframe">QUALITY_QVGA</A> +</nobr><br> +<!-- Field QUALITY_TIME_LAPSE_QVGA --> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_TIME_LAPSE_QVGA" class="hiddenlink" target="rightframe">QUALITY_TIME_LAPSE_QVGA</A> +</nobr><br> +<!-- Field READ_SOCIAL_STREAM --> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.READ_SOCIAL_STREAM" class="hiddenlink" target="rightframe">READ_SOCIAL_STREAM</A> +</nobr><br> +<!-- Class RemoteException --> +<i>RemoteException</i><br> + <A HREF="android.os.RemoteException.html" class="hiddenlink" target="rightframe">android.os</A><br> +<!-- Constructor RemoteException --> + <nobr><A HREF="android.os.RemoteException.html#android.os.RemoteException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>RemoteException</b> +(<code>String</code>)</A></nobr> constructor<br> +<!-- Class RemoteViews --> +<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br> +<!-- Field RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS --> +<nobr><A HREF="android.view.textservice.SuggestionsInfo.html#android.view.textservice.SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" class="hiddenlink" target="rightframe">RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS</A> +</nobr><br> +<!-- Method setContentDescription --> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.setContentDescription_added(int, java.lang.CharSequence)" class="hiddenlink" target="rightframe"><b>setContentDescription</b> +(<code>int, CharSequence</code>)</A></nobr><br> +<!-- Method setDefaultBufferSize --> +<nobr><A HREF="android.graphics.SurfaceTexture.html#android.graphics.SurfaceTexture.setDefaultBufferSize_added(int, int)" class="hiddenlink" target="rightframe"><b>setDefaultBufferSize</b> +(<code>int, int</code>)</A></nobr><br> +<!-- Method setLayoutAlgorithm --> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLayoutAlgorithm_changed(android.webkit.WebSettings.LayoutAlgorithm)" class="hiddenlink" target="rightframe">setLayoutAlgorithm +(<code>LayoutAlgorithm</code>)</A></nobr><br> +<!-- Method setMaxScrollX --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollX_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollX</b> +(<code>int</code>)</A></nobr><br> +<!-- Method setMaxScrollY --> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollY_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollY</b> +(<code>int</code>)</A></nobr><br> +<!-- Method setOffsetNotificationsEnabled --> +<nobr><A HREF="android.service.wallpaper.WallpaperService.Engine.html#android.service.wallpaper.WallpaperService.Engine.setOffsetNotificationsEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setOffsetNotificationsEnabled</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Method setOnUtteranceCompletedListener --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceCompletedListener_changed(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)" class="hiddenlink" target="rightframe">setOnUtteranceCompletedListener +(<code>OnUtteranceCompletedListener</code>)</A></nobr><br> +<!-- Method setOnUtteranceProgressListener --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceProgressListener_added(android.speech.tts.UtteranceProgressListener)" class="hiddenlink" target="rightframe"><b>setOnUtteranceProgressListener</b> +(<code>UtteranceProgressListener</code>)</A></nobr><br> +<!-- Method setSelector --> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSelector_added(android.content.Intent)" class="hiddenlink" target="rightframe"><b>setSelector</b> +(<code>Intent</code>)</A></nobr><br> +<!-- Class Settings.Secure --> +<A HREF="android.provider.Settings.Secure.html" class="hiddenlink" target="rightframe">Settings.Secure</A><br> +<!-- Method setUserVisibleHint --> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.setUserVisibleHint_added(boolean)" class="hiddenlink" target="rightframe"><b>setUserVisibleHint</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Method setVideoStabilization --> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.setVideoStabilization_added(boolean)" class="hiddenlink" target="rightframe"><b>setVideoStabilization</b> +(<code>boolean</code>)</A></nobr><br> +<!-- Class SpellCheckerService.Session --> +<A HREF="android.service.textservice.SpellCheckerService.Session.html" class="hiddenlink" target="rightframe">SpellCheckerService.Session</A><br> +<!-- Class SpellCheckerSession --> +<A HREF="android.view.textservice.SpellCheckerSession.html" class="hiddenlink" target="rightframe">SpellCheckerSession</A><br> +<!-- Class SuggestionsInfo --> +<A HREF="android.view.textservice.SuggestionsInfo.html" class="hiddenlink" target="rightframe">SuggestionsInfo</A><br> +<!-- Class SuggestionSpan --> +<A HREF="android.text.style.SuggestionSpan.html" class="hiddenlink" target="rightframe">SuggestionSpan</A><br> +<!-- Class SurfaceTexture --> +<A HREF="android.graphics.SurfaceTexture.html" class="hiddenlink" target="rightframe">SurfaceTexture</A><br> +<!-- Class TextToSpeech --> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.speech.tts.TextToSpeech.html" class="hiddenlink" target="rightframe">TextToSpeech</A><br> +<!-- Class TextToSpeech.Engine --> +<A HREF="android.speech.tts.TextToSpeech.Engine.html" class="hiddenlink" target="rightframe">TextToSpeech.Engine</A><br> +<!-- Class TextToSpeechService --> +<A HREF="android.speech.tts.TextToSpeechService.html" class="hiddenlink" target="rightframe">TextToSpeechService</A><br> +<!-- Class TransactionTooLargeException --> +<A HREF="pkg_android.os.html#TransactionTooLargeException" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b></A><br> +<!-- Field TYPE_RESOURCE --> +<nobr><A HREF="android.provider.CalendarContract.AttendeesColumns.html#android.provider.CalendarContract.AttendeesColumns.TYPE_RESOURCE" class="hiddenlink" target="rightframe">TYPE_RESOURCE</A> +</nobr><br> +<!-- Class UtteranceProgressListener --> +<A NAME="U"></A> +<br><font size="+2">U</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.speech.tts.html#UtteranceProgressListener" class="hiddenlink" target="rightframe"><b>UtteranceProgressListener</b></A><br> +<!-- Class View --> +<A NAME="V"></A> +<br><font size="+2">V</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br> +<!-- Class WallpaperService.Engine --> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.service.wallpaper.WallpaperService.Engine.html" class="hiddenlink" target="rightframe">WallpaperService.Engine</A><br> +<!-- Class WebSettings --> +<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br> +<!-- Class WebSettings.LayoutAlgorithm --> +<A HREF="android.webkit.WebSettings.LayoutAlgorithm.html" class="hiddenlink" target="rightframe">WebSettings.LayoutAlgorithm</A><br> +<!-- Field WRITE_SOCIAL_STREAM --> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_SOCIAL_STREAM" class="hiddenlink" target="rightframe">WRITE_SOCIAL_STREAM</A> +</nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/alldiffs_index_changes.html b/docs/html/sdk/api_diff/15/changes/alldiffs_index_changes.html new file mode 100644 index 000000000000..5ee38037824e --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/alldiffs_index_changes.html @@ -0,0 +1,398 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +All Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<!-- Class AccessibilityRecord --> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.accessibility.AccessibilityRecord.html" class="hiddenlink" target="rightframe">AccessibilityRecord</A><br> +<!-- Package android --> +<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br> +<!-- Package android.app --> +<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br> +<!-- Package android.appwidget --> +<A HREF="pkg_android.appwidget.html" class="hiddenlink" target="rightframe">android.appwidget</A><br> +<!-- Package android.bluetooth --> +<A HREF="pkg_android.bluetooth.html" class="hiddenlink" target="rightframe">android.bluetooth</A><br> +<!-- Package android.content --> +<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br> +<!-- Package android.database --> +<A HREF="pkg_android.database.html" class="hiddenlink" target="rightframe">android.database</A><br> +<!-- Package android.graphics --> +<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br> +<!-- Package android.hardware --> +<A HREF="pkg_android.hardware.html" class="hiddenlink" target="rightframe">android.hardware</A><br> +<!-- Package android.media --> +<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br> +<!-- Package android.opengl --> +<A HREF="pkg_android.opengl.html" class="hiddenlink" target="rightframe">android.opengl</A><br> +<!-- Package android.os --> +<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br> +<!-- Package android.provider --> +<A HREF="pkg_android.provider.html" class="hiddenlink" target="rightframe">android.provider</A><br> +<!-- Package android.service.textservice --> +<A HREF="pkg_android.service.textservice.html" class="hiddenlink" target="rightframe">android.service.textservice</A><br> +<!-- Package android.service.wallpaper --> +<A HREF="pkg_android.service.wallpaper.html" class="hiddenlink" target="rightframe">android.service.wallpaper</A><br> +<!-- Package android.speech.tts --> +<A HREF="pkg_android.speech.tts.html" class="hiddenlink" target="rightframe">android.speech.tts</A><br> +<!-- Package android.text.style --> +<A HREF="pkg_android.text.style.html" class="hiddenlink" target="rightframe">android.text.style</A><br> +<!-- Package android.view --> +<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br> +<!-- Package android.view.accessibility --> +<A HREF="pkg_android.view.accessibility.html" class="hiddenlink" target="rightframe">android.view.accessibility</A><br> +<!-- Package android.view.textservice --> +<A HREF="pkg_android.view.textservice.html" class="hiddenlink" target="rightframe">android.view.textservice</A><br> +<!-- Package android.webkit --> +<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br> +<!-- Package android.widget --> +<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br> +<!-- Class AppWidgetHostView --> +<A HREF="android.appwidget.AppWidgetHostView.html" class="hiddenlink" target="rightframe">AppWidgetHostView</A><br> +<!-- Field BIND_ADJUST_WITH_ACTIVITY --> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Context.html#android.content.Context.BIND_ADJUST_WITH_ACTIVITY" class="hiddenlink" target="rightframe">BIND_ADJUST_WITH_ACTIVITY</A> +</nobr><br> +<!-- Class BluetoothDevice --> +<A HREF="android.bluetooth.BluetoothDevice.html" class="hiddenlink" target="rightframe">BluetoothDevice</A><br> +<!-- Class Build.VERSION_CODES --> +<A HREF="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br> +<!-- Class CalendarContract.AttendeesColumns --> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.provider.CalendarContract.AttendeesColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.AttendeesColumns</i></A><br> +<!-- Class CalendarContract.CalendarColumns --> +<A HREF="android.provider.CalendarContract.CalendarColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.CalendarColumns</i></A><br> +<!-- Class CalendarContract.EventsColumns --> +<A HREF="android.provider.CalendarContract.EventsColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.EventsColumns</i></A><br> +<!-- Class CamcorderProfile --> +<A HREF="android.media.CamcorderProfile.html" class="hiddenlink" target="rightframe">CamcorderProfile</A><br> +<!-- Class Camera.Parameters --> +<A HREF="android.hardware.Camera.Parameters.html" class="hiddenlink" target="rightframe">Camera.Parameters</A><br> +<!-- Class Context --> +<A HREF="android.content.Context.html" class="hiddenlink" target="rightframe">Context</A><br> +<!-- Class CursorWindow --> +<i>CursorWindow</i><br> + <A HREF="android.database.CursorWindow.html" class="hiddenlink" target="rightframe">android.database</A><br> +<!-- Constructor CursorWindow --> + <nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_changed(boolean)" class="hiddenlink" target="rightframe">CursorWindow +(<code>boolean</code>)</A></nobr> constructor<br> +<!-- Class Fragment --> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.app.Fragment.html" class="hiddenlink" target="rightframe">Fragment</A><br> +<!-- Method getLayoutAlgorithm --> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLayoutAlgorithm_changed()" class="hiddenlink" target="rightframe">getLayoutAlgorithm +()</A></nobr><br> +<!-- Class GLES11Ext --> +<A HREF="android.opengl.GLES11Ext.html" class="hiddenlink" target="rightframe">GLES11Ext</A><br> +<!-- Class IBinder --> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.IBinder.html" class="hiddenlink" target="rightframe"><i>IBinder</i></A><br> +<!-- Class Intent --> +<A HREF="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br> +<!-- Field INTENT_ACTION_MUSIC_PLAYER --> +<nobr><A HREF="android.provider.MediaStore.html#android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER" class="hiddenlink" target="rightframe">INTENT_ACTION_MUSIC_PLAYER</A> +</nobr><br> +<!-- Class KeyEvent --> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.KeyEvent.html" class="hiddenlink" target="rightframe">KeyEvent</A><br> +<!-- Class Manifest.permission --> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br> +<!-- Class MediaMetadataRetriever --> +<A HREF="android.media.MediaMetadataRetriever.html" class="hiddenlink" target="rightframe">MediaMetadataRetriever</A><br> +<!-- Class MediaStore --> +<A HREF="android.provider.MediaStore.html" class="hiddenlink" target="rightframe">MediaStore</A><br> +<!-- Class RemoteException --> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.RemoteException.html" class="hiddenlink" target="rightframe">RemoteException</A><br> +<!-- Class RemoteViews --> +<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br> +<!-- Method setLayoutAlgorithm --> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLayoutAlgorithm_changed(android.webkit.WebSettings.LayoutAlgorithm)" class="hiddenlink" target="rightframe">setLayoutAlgorithm +(<code>LayoutAlgorithm</code>)</A></nobr><br> +<!-- Method setOnUtteranceCompletedListener --> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceCompletedListener_changed(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)" class="hiddenlink" target="rightframe">setOnUtteranceCompletedListener +(<code>OnUtteranceCompletedListener</code>)</A></nobr><br> +<!-- Class Settings.Secure --> +<A HREF="android.provider.Settings.Secure.html" class="hiddenlink" target="rightframe">Settings.Secure</A><br> +<!-- Class SpellCheckerService.Session --> +<A HREF="android.service.textservice.SpellCheckerService.Session.html" class="hiddenlink" target="rightframe">SpellCheckerService.Session</A><br> +<!-- Class SpellCheckerSession --> +<A HREF="android.view.textservice.SpellCheckerSession.html" class="hiddenlink" target="rightframe">SpellCheckerSession</A><br> +<!-- Class SuggestionsInfo --> +<A HREF="android.view.textservice.SuggestionsInfo.html" class="hiddenlink" target="rightframe">SuggestionsInfo</A><br> +<!-- Class SuggestionSpan --> +<A HREF="android.text.style.SuggestionSpan.html" class="hiddenlink" target="rightframe">SuggestionSpan</A><br> +<!-- Class SurfaceTexture --> +<A HREF="android.graphics.SurfaceTexture.html" class="hiddenlink" target="rightframe">SurfaceTexture</A><br> +<!-- Class TextToSpeech --> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.speech.tts.TextToSpeech.html" class="hiddenlink" target="rightframe">TextToSpeech</A><br> +<!-- Class TextToSpeech.Engine --> +<A HREF="android.speech.tts.TextToSpeech.Engine.html" class="hiddenlink" target="rightframe">TextToSpeech.Engine</A><br> +<!-- Class TextToSpeechService --> +<A HREF="android.speech.tts.TextToSpeechService.html" class="hiddenlink" target="rightframe">TextToSpeechService</A><br> +<!-- Class View --> +<A NAME="V"></A> +<br><font size="+2">V</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br> +<!-- Class WallpaperService.Engine --> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.service.wallpaper.WallpaperService.Engine.html" class="hiddenlink" target="rightframe">WallpaperService.Engine</A><br> +<!-- Class WebSettings --> +<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br> +<!-- Class WebSettings.LayoutAlgorithm --> +<A HREF="android.webkit.WebSettings.LayoutAlgorithm.html" class="hiddenlink" target="rightframe">WebSettings.LayoutAlgorithm</A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/alldiffs_index_removals.html b/docs/html/sdk/api_diff/15/changes/alldiffs_index_removals.html new file mode 100644 index 000000000000..68d2c20bf961 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/alldiffs_index_removals.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +All Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for All Differences" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="alldiffs_index_all.html" xclass="hiddenlink">All Differences</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="alldiffs_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="alldiffs_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.Manifest.permission.html b/docs/html/sdk/api_diff/15/changes/android.Manifest.permission.html new file mode 100644 index 000000000000..37bbd8cb38ec --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.Manifest.permission.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.Manifest.permission +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.<A HREF="../../../../reference/android/Manifest.permission.html" target="_top"><font size="+2"><code>Manifest.permission</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.Manifest.permission.READ_SOCIAL_STREAM"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/Manifest.permission.html#READ_SOCIAL_STREAM" target="_top"><code>READ_SOCIAL_STREAM</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.Manifest.permission.WRITE_SOCIAL_STREAM"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/Manifest.permission.html#WRITE_SOCIAL_STREAM" target="_top"><code>WRITE_SOCIAL_STREAM</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.app.Fragment.html b/docs/html/sdk/api_diff/15/changes/android.app.Fragment.html new file mode 100644 index 000000000000..2b1976eff74d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.app.Fragment.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.app.Fragment +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.app.<A HREF="../../../../reference/android/app/Fragment.html" target="_top"><font size="+2"><code>Fragment</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.app.Fragment.getUserVisibleHint_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/app/Fragment.html#getUserVisibleHint()" target="_top"><code>getUserVisibleHint</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.app.Fragment.setUserVisibleHint_added(boolean)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/app/Fragment.html#setUserVisibleHint(boolean)" target="_top"><code>setUserVisibleHint</code></A>(<code>boolean</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.appwidget.AppWidgetHostView.html b/docs/html/sdk/api_diff/15/changes/android.appwidget.AppWidgetHostView.html new file mode 100644 index 000000000000..59bdb1f6a04b --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.appwidget.AppWidgetHostView.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.appwidget.AppWidgetHostView +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.appwidget.<A HREF="../../../../reference/android/appwidget/AppWidgetHostView.html" target="_top"><font size="+2"><code>AppWidgetHostView</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget_added(android.content.Context, android.content.ComponentName, android.graphics.Rect)"></A> + <nobr><code>Rect</code> <A HREF="../../../../reference/android/appwidget/AppWidgetHostView.html#getDefaultPaddingForWidget(android.content.Context, android.content.ComponentName, android.graphics.Rect)" target="_top"><code>getDefaultPaddingForWidget</code></A>(<code>Context,</nobr> ComponentName<nobr>,</nobr> Rect<nobr><nobr></code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.bluetooth.BluetoothDevice.html b/docs/html/sdk/api_diff/15/changes/android.bluetooth.BluetoothDevice.html new file mode 100644 index 000000000000..a2c87cda716a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.bluetooth.BluetoothDevice.html @@ -0,0 +1,151 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.bluetooth.BluetoothDevice +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.bluetooth.<A HREF="../../../../reference/android/bluetooth/BluetoothDevice.html" target="_top"><font size="+2"><code>BluetoothDevice</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.bluetooth.BluetoothDevice.fetchUuidsWithSdp_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/bluetooth/BluetoothDevice.html#fetchUuidsWithSdp()" target="_top"><code>fetchUuidsWithSdp</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.bluetooth.BluetoothDevice.getUuids_added()"></A> + <nobr><code>ParcelUuid[]</code> <A HREF="../../../../reference/android/bluetooth/BluetoothDevice.html#getUuids()" target="_top"><code>getUuids</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.bluetooth.BluetoothDevice.ACTION_UUID"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/bluetooth/BluetoothDevice.html#ACTION_UUID" target="_top"><code>ACTION_UUID</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.bluetooth.BluetoothDevice.EXTRA_UUID"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/bluetooth/BluetoothDevice.html#EXTRA_UUID" target="_top"><code>EXTRA_UUID</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.content.Context.html b/docs/html/sdk/api_diff/15/changes/android.content.Context.html new file mode 100644 index 000000000000..b3b8f1e76a5f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.content.Context.html @@ -0,0 +1,124 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.content.Context +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.content.<A HREF="../../../../reference/android/content/Context.html" target="_top"><font size="+2"><code>Context</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Context.BIND_ADJUST_WITH_ACTIVITY"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/content/Context.html#BIND_ADJUST_WITH_ACTIVITY" target="_top"><code>BIND_ADJUST_WITH_ACTIVITY</code></font></A></nobr> </TD> + <TD VALIGN="TOP" WIDTH="30%"> +Changed in value from 64 to 128. + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.content.Intent.html b/docs/html/sdk/api_diff/15/changes/android.content.Intent.html new file mode 100644 index 000000000000..dd2f466c91ff --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.content.Intent.html @@ -0,0 +1,214 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.content.Intent +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.content.<A HREF="../../../../reference/android/content/Intent.html" target="_top"><font size="+2"><code>Intent</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.getSelector_added()"></A> + <nobr><code>Intent</code> <A HREF="../../../../reference/android/content/Intent.html#getSelector()" target="_top"><code>getSelector</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.makeMainSelectorActivity_added(java.lang.String, java.lang.String)"></A> + <nobr><code>Intent</code> <A HREF="../../../../reference/android/content/Intent.html#makeMainSelectorActivity(java.lang.String, java.lang.String)" target="_top"><code>makeMainSelectorActivity</code></A>(<code>String,</nobr> String<nobr><nobr></code>)</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.setSelector_added(android.content.Intent)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/content/Intent.html#setSelector(android.content.Intent)" target="_top"><code>setSelector</code></A>(<code>Intent</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_BROWSER"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_BROWSER" target="_top"><code>CATEGORY_APP_BROWSER</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_CALCULATOR"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_CALCULATOR" target="_top"><code>CATEGORY_APP_CALCULATOR</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_CALENDAR"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_CALENDAR" target="_top"><code>CATEGORY_APP_CALENDAR</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_CONTACTS"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_CONTACTS" target="_top"><code>CATEGORY_APP_CONTACTS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_EMAIL"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_EMAIL" target="_top"><code>CATEGORY_APP_EMAIL</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_GALLERY"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_GALLERY" target="_top"><code>CATEGORY_APP_GALLERY</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_MAPS"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_MAPS" target="_top"><code>CATEGORY_APP_MAPS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_MESSAGING"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_MESSAGING" target="_top"><code>CATEGORY_APP_MESSAGING</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.CATEGORY_APP_MUSIC"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/content/Intent.html#CATEGORY_APP_MUSIC" target="_top"><code>CATEGORY_APP_MUSIC</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content.Intent.FILL_IN_SELECTOR"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/content/Intent.html#FILL_IN_SELECTOR" target="_top"><code>FILL_IN_SELECTOR</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.database.CursorWindow.html b/docs/html/sdk/api_diff/15/changes/android.database.CursorWindow.html new file mode 100644 index 000000000000..4ba4252fc660 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.database.CursorWindow.html @@ -0,0 +1,140 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.database.CursorWindow +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.database.<A HREF="../../../../reference/android/database/CursorWindow.html" target="_top"><font size="+2"><code>CursorWindow</code></font></A> +</H2> +<a NAME="constructors"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Constructors" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Constructors</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.database.CursorWindow.ctor_added(java.lang.String)"></A> + <nobr><A HREF="../../../../reference/android/database/CursorWindow.html#CursorWindow(java.lang.String)" target="_top"><code>CursorWindow</code></A>(<code>String</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Constructors" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Constructors</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.database.CursorWindow.ctor_changed(boolean)"></A> + <nobr><A HREF="../../../../reference/android/database/CursorWindow.html#CursorWindow(boolean)" target="_top"><code>CursorWindow</code></A>(<code>boolean</code>) </nobr> + </TD> + <TD VALIGN="TOP" WIDTH="30%"> +<b>Now deprecated</b>.<br> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="methods"></a> +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.graphics.SurfaceTexture.html b/docs/html/sdk/api_diff/15/changes/android.graphics.SurfaceTexture.html new file mode 100644 index 000000000000..ca44add0feea --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.graphics.SurfaceTexture.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.graphics.SurfaceTexture +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.graphics.<A HREF="../../../../reference/android/graphics/SurfaceTexture.html" target="_top"><font size="+2"><code>SurfaceTexture</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.graphics.SurfaceTexture.setDefaultBufferSize_added(int, int)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/graphics/SurfaceTexture.html#setDefaultBufferSize(int, int)" target="_top"><code>setDefaultBufferSize</code></A>(<code>int,</nobr> int<nobr><nobr></code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.hardware.Camera.Parameters.html b/docs/html/sdk/api_diff/15/changes/android.hardware.Camera.Parameters.html new file mode 100644 index 000000000000..02afe902c388 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.hardware.Camera.Parameters.html @@ -0,0 +1,136 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.hardware.Camera.Parameters +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.hardware.<A HREF="../../../../reference/android/hardware/Camera.Parameters.html" target="_top"><font size="+2"><code>Camera.Parameters</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.hardware.Camera.Parameters.getVideoStabilization_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/hardware/Camera.Parameters.html#getVideoStabilization()" target="_top"><code>getVideoStabilization</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.hardware.Camera.Parameters.isVideoStabilizationSupported_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/hardware/Camera.Parameters.html#isVideoStabilizationSupported()" target="_top"><code>isVideoStabilizationSupported</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.hardware.Camera.Parameters.setVideoStabilization_added(boolean)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/hardware/Camera.Parameters.html#setVideoStabilization(boolean)" target="_top"><code>setVideoStabilization</code></A>(<code>boolean</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.media.CamcorderProfile.html b/docs/html/sdk/api_diff/15/changes/android.media.CamcorderProfile.html new file mode 100644 index 000000000000..6b556bcef151 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.media.CamcorderProfile.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.media.CamcorderProfile +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.media.<A HREF="../../../../reference/android/media/CamcorderProfile.html" target="_top"><font size="+2"><code>CamcorderProfile</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.media.CamcorderProfile.QUALITY_QVGA"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/media/CamcorderProfile.html#QUALITY_QVGA" target="_top"><code>QUALITY_QVGA</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.media.CamcorderProfile.QUALITY_TIME_LAPSE_QVGA"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/media/CamcorderProfile.html#QUALITY_TIME_LAPSE_QVGA" target="_top"><code>QUALITY_TIME_LAPSE_QVGA</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.media.MediaMetadataRetriever.html b/docs/html/sdk/api_diff/15/changes/android.media.MediaMetadataRetriever.html new file mode 100644 index 000000000000..8247ea94d11a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.media.MediaMetadataRetriever.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.media.MediaMetadataRetriever +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.media.<A HREF="../../../../reference/android/media/MediaMetadataRetriever.html" target="_top"><font size="+2"><code>MediaMetadataRetriever</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.media.MediaMetadataRetriever.METADATA_KEY_LOCATION"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/media/MediaMetadataRetriever.html#METADATA_KEY_LOCATION" target="_top"><code>METADATA_KEY_LOCATION</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.opengl.GLES11Ext.html b/docs/html/sdk/api_diff/15/changes/android.opengl.GLES11Ext.html new file mode 100644 index 000000000000..50913ad8a9c8 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.opengl.GLES11Ext.html @@ -0,0 +1,143 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.opengl.GLES11Ext +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.opengl.<A HREF="../../../../reference/android/opengl/GLES11Ext.html" target="_top"><font size="+2"><code>GLES11Ext</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.opengl.GLES11Ext.GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/opengl/GLES11Ext.html#GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" target="_top"><code>GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.opengl.GLES11Ext.GL_SAMPLER_EXTERNAL_OES"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/opengl/GLES11Ext.html#GL_SAMPLER_EXTERNAL_OES" target="_top"><code>GL_SAMPLER_EXTERNAL_OES</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.opengl.GLES11Ext.GL_TEXTURE_BINDING_EXTERNAL_OES"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/opengl/GLES11Ext.html#GL_TEXTURE_BINDING_EXTERNAL_OES" target="_top"><code>GL_TEXTURE_BINDING_EXTERNAL_OES</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.opengl.GLES11Ext.GL_TEXTURE_EXTERNAL_OES"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/opengl/GLES11Ext.html#GL_TEXTURE_EXTERNAL_OES" target="_top"><code>GL_TEXTURE_EXTERNAL_OES</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.os.Build.VERSION_CODES.html b/docs/html/sdk/api_diff/15/changes/android.os.Build.VERSION_CODES.html new file mode 100644 index 000000000000..83994577346c --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.os.Build.VERSION_CODES.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.os.Build.VERSION_CODES +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.os.<A HREF="../../../../reference/android/os/Build.VERSION_CODES.html" target="_top"><font size="+2"><code>Build.VERSION_CODES</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/os/Build.VERSION_CODES.html#ICE_CREAM_SANDWICH_MR1" target="_top"><code>ICE_CREAM_SANDWICH_MR1</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.os.IBinder.html b/docs/html/sdk/api_diff/15/changes/android.os.IBinder.html new file mode 100644 index 000000000000..1d090ed4a3bb --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.os.IBinder.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.os.IBinder +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Interface android.os.<A HREF="../../../../reference/android/os/IBinder.html" target="_top"><font size="+2"><code>IBinder</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.os.IBinder.LIKE_TRANSACTION"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/os/IBinder.html#LIKE_TRANSACTION" target="_top"><code>LIKE_TRANSACTION</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.os.RemoteException.html b/docs/html/sdk/api_diff/15/changes/android.os.RemoteException.html new file mode 100644 index 000000000000..55659e3c8307 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.os.RemoteException.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.os.RemoteException +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.os.<A HREF="../../../../reference/android/os/RemoteException.html" target="_top"><font size="+2"><code>RemoteException</code></font></A> +</H2> +<a NAME="constructors"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Constructors" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Constructors</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.os.RemoteException.ctor_added(java.lang.String)"></A> + <nobr><A HREF="../../../../reference/android/os/RemoteException.html#RemoteException(java.lang.String)" target="_top"><code>RemoteException</code></A>(<code>String</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="methods"></a> +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.AttendeesColumns.html b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.AttendeesColumns.html new file mode 100644 index 000000000000..d2c1f617091d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.AttendeesColumns.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider.CalendarContract.AttendeesColumns +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Interface android.provider.<A HREF="../../../../reference/android/provider/CalendarContract.AttendeesColumns.html" target="_top"><font size="+2"><code>CalendarContract.AttendeesColumns</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.AttendeesColumns.TYPE_RESOURCE"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/provider/CalendarContract.AttendeesColumns.html#TYPE_RESOURCE" target="_top"><code>TYPE_RESOURCE</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.CalendarColumns.html b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.CalendarColumns.html new file mode 100644 index 000000000000..60e05ef58135 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.CalendarColumns.html @@ -0,0 +1,136 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider.CalendarContract.CalendarColumns +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Interface android.provider.<A HREF="../../../../reference/android/provider/CalendarContract.CalendarColumns.html" target="_top"><font size="+2"><code>CalendarContract.CalendarColumns</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.CalendarColumns.ALLOWED_ATTENDEE_TYPES"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/CalendarContract.CalendarColumns.html#ALLOWED_ATTENDEE_TYPES" target="_top"><code>ALLOWED_ATTENDEE_TYPES</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.CalendarColumns.ALLOWED_AVAILABILITY"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/CalendarContract.CalendarColumns.html#ALLOWED_AVAILABILITY" target="_top"><code>ALLOWED_AVAILABILITY</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.CalendarColumns.CALENDAR_COLOR_KEY"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/CalendarContract.CalendarColumns.html#CALENDAR_COLOR_KEY" target="_top"><code>CALENDAR_COLOR_KEY</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.EventsColumns.html b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.EventsColumns.html new file mode 100644 index 000000000000..625136000006 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.provider.CalendarContract.EventsColumns.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider.CalendarContract.EventsColumns +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Interface android.provider.<A HREF="../../../../reference/android/provider/CalendarContract.EventsColumns.html" target="_top"><font size="+2"><code>CalendarContract.EventsColumns</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.EventsColumns.AVAILABILITY_TENTATIVE"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/provider/CalendarContract.EventsColumns.html#AVAILABILITY_TENTATIVE" target="_top"><code>AVAILABILITY_TENTATIVE</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.CalendarContract.EventsColumns.EVENT_COLOR_KEY"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/CalendarContract.EventsColumns.html#EVENT_COLOR_KEY" target="_top"><code>EVENT_COLOR_KEY</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.provider.MediaStore.html b/docs/html/sdk/api_diff/15/changes/android.provider.MediaStore.html new file mode 100644 index 000000000000..34ee9a857d1f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.provider.MediaStore.html @@ -0,0 +1,124 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider.MediaStore +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.provider.<A HREF="../../../../reference/android/provider/MediaStore.html" target="_top"><font size="+2"><code>MediaStore</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/MediaStore.html#INTENT_ACTION_MUSIC_PLAYER" target="_top"><code>INTENT_ACTION_MUSIC_PLAYER</code></font></A></nobr> </TD> + <TD VALIGN="TOP" WIDTH="30%"> +<b>Now deprecated</b>.<br> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.provider.Settings.Secure.html b/docs/html/sdk/api_diff/15/changes/android.provider.Settings.Secure.html new file mode 100644 index 000000000000..f1cb57b2c21c --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.provider.Settings.Secure.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider.Settings.Secure +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.provider.<A HREF="../../../../reference/android/provider/Settings.Secure.html" target="_top"><font size="+2"><code>Settings.Secure</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider.Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/provider/Settings.Secure.html#ACCESSIBILITY_SPEAK_PASSWORD" target="_top"><code>ACCESSIBILITY_SPEAK_PASSWORD</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.service.textservice.SpellCheckerService.Session.html b/docs/html/sdk/api_diff/15/changes/android.service.textservice.SpellCheckerService.Session.html new file mode 100644 index 000000000000..019b98a7f6c0 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.service.textservice.SpellCheckerService.Session.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.service.textservice.SpellCheckerService.Session +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.service.textservice.<A HREF="../../../../reference/android/service/textservice/SpellCheckerService.Session.html" target="_top"><font size="+2"><code>SpellCheckerService.Session</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.service.textservice.SpellCheckerService.Session.onClose_added()"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/service/textservice/SpellCheckerService.Session.html#onClose()" target="_top"><code>onClose</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.service.wallpaper.WallpaperService.Engine.html b/docs/html/sdk/api_diff/15/changes/android.service.wallpaper.WallpaperService.Engine.html new file mode 100644 index 000000000000..356cf9de28f3 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.service.wallpaper.WallpaperService.Engine.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.service.wallpaper.WallpaperService.Engine +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.service.wallpaper.<A HREF="../../../../reference/android/service/wallpaper/WallpaperService.Engine.html" target="_top"><font size="+2"><code>WallpaperService.Engine</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.service.wallpaper.WallpaperService.Engine.setOffsetNotificationsEnabled_added(boolean)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/service/wallpaper/WallpaperService.Engine.html#setOffsetNotificationsEnabled(boolean)" target="_top"><code>setOffsetNotificationsEnabled</code></A>(<code>boolean</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.Engine.html b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.Engine.html new file mode 100644 index 000000000000..6f53f8fca31f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.Engine.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.speech.tts.TextToSpeech.Engine +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.speech.tts.<A HREF="../../../../reference/android/speech/tts/TextToSpeech.Engine.html" target="_top"><font size="+2"><code>TextToSpeech.Engine</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/speech/tts/TextToSpeech.Engine.html#KEY_FEATURE_EMBEDDED_SYNTHESIS" target="_top"><code>KEY_FEATURE_EMBEDDED_SYNTHESIS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS"></A> + <nobr><code>String</code> <A HREF="../../../../reference/android/speech/tts/TextToSpeech.Engine.html#KEY_FEATURE_NETWORK_SYNTHESIS" target="_top"><code>KEY_FEATURE_NETWORK_SYNTHESIS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.html b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.html new file mode 100644 index 000000000000..e6e22a554a80 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeech.html @@ -0,0 +1,147 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.speech.tts.TextToSpeech +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.speech.tts.<A HREF="../../../../reference/android/speech/tts/TextToSpeech.html" target="_top"><font size="+2"><code>TextToSpeech</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeech.getFeatures_added(java.util.Locale)"></A> + <nobr><code>Set<String></code> <A HREF="../../../../reference/android/speech/tts/TextToSpeech.html#getFeatures(java.util.Locale)" target="_top"><code>getFeatures</code></A>(<code>Locale</code>)</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeech.setOnUtteranceProgressListener_added(android.speech.tts.UtteranceProgressListener)"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/speech/tts/TextToSpeech.html#setOnUtteranceProgressListener(android.speech.tts.UtteranceProgressListener)" target="_top"><code>setOnUtteranceProgressListener</code></A>(<code>UtteranceProgressListener</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeech.setOnUtteranceCompletedListener_changed(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/speech/tts/TextToSpeech.html#setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)" target="_top"><code>setOnUtteranceCompletedListener</code></A>(<code>OnUtteranceCompletedListener</code>) </nobr> + </TD> + <TD VALIGN="TOP" WIDTH="30%"> +<b>Now deprecated</b>.<br> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeechService.html b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeechService.html new file mode 100644 index 000000000000..e772e1938ba3 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.speech.tts.TextToSpeechService.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.speech.tts.TextToSpeechService +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.speech.tts.<A HREF="../../../../reference/android/speech/tts/TextToSpeechService.html" target="_top"><font size="+2"><code>TextToSpeechService</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts.TextToSpeechService.onGetFeaturesForLanguage_added(java.lang.String, java.lang.String, java.lang.String)"></A> + <nobr><code>Set<String></code> <A HREF="../../../../reference/android/speech/tts/TextToSpeechService.html#onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String)" target="_top"><code>onGetFeaturesForLanguage</code></A>(<code>String,</nobr> String<nobr>,</nobr> String<nobr><nobr></code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.text.style.SuggestionSpan.html b/docs/html/sdk/api_diff/15/changes/android.text.style.SuggestionSpan.html new file mode 100644 index 000000000000..0add186ec586 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.text.style.SuggestionSpan.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.text.style.SuggestionSpan +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.text.style.<A HREF="../../../../reference/android/text/style/SuggestionSpan.html" target="_top"><font size="+2"><code>SuggestionSpan</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.text.style.SuggestionSpan.FLAG_AUTO_CORRECTION"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/text/style/SuggestionSpan.html#FLAG_AUTO_CORRECTION" target="_top"><code>FLAG_AUTO_CORRECTION</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.view.KeyEvent.html b/docs/html/sdk/api_diff/15/changes/android.view.KeyEvent.html new file mode 100644 index 000000000000..70843f63d6e3 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.view.KeyEvent.html @@ -0,0 +1,143 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.KeyEvent +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.view.<A HREF="../../../../reference/android/view/KeyEvent.html" target="_top"><font size="+2"><code>KeyEvent</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.KeyEvent.KEYCODE_CALCULATOR"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/KeyEvent.html#KEYCODE_CALCULATOR" target="_top"><code>KEYCODE_CALCULATOR</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.KeyEvent.KEYCODE_CALENDAR"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/KeyEvent.html#KEYCODE_CALENDAR" target="_top"><code>KEYCODE_CALENDAR</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.KeyEvent.KEYCODE_CONTACTS"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/KeyEvent.html#KEYCODE_CONTACTS" target="_top"><code>KEYCODE_CONTACTS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.KeyEvent.KEYCODE_MUSIC"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/KeyEvent.html#KEYCODE_MUSIC" target="_top"><code>KEYCODE_MUSIC</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.view.View.html b/docs/html/sdk/api_diff/15/changes/android.view.View.html new file mode 100644 index 000000000000..fa772f998435 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.view.View.html @@ -0,0 +1,129 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.View +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.view.<A HREF="../../../../reference/android/view/View.html" target="_top"><font size="+2"><code>View</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.View.callOnClick_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/view/View.html#callOnClick()" target="_top"><code>callOnClick</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.View.hasOnClickListeners_added()"></A> + <nobr><code>boolean</code> <A HREF="../../../../reference/android/view/View.html#hasOnClickListeners()" target="_top"><code>hasOnClickListeners</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.view.accessibility.AccessibilityRecord.html b/docs/html/sdk/api_diff/15/changes/android.view.accessibility.AccessibilityRecord.html new file mode 100644 index 000000000000..b88467c7f71b --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.view.accessibility.AccessibilityRecord.html @@ -0,0 +1,143 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.accessibility.AccessibilityRecord +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.view.accessibility.<A HREF="../../../../reference/android/view/accessibility/AccessibilityRecord.html" target="_top"><font size="+2"><code>AccessibilityRecord</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.accessibility.AccessibilityRecord.getMaxScrollX_added()"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/accessibility/AccessibilityRecord.html#getMaxScrollX()" target="_top"><code>getMaxScrollX</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.accessibility.AccessibilityRecord.getMaxScrollY_added()"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/accessibility/AccessibilityRecord.html#getMaxScrollY()" target="_top"><code>getMaxScrollY</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.accessibility.AccessibilityRecord.setMaxScrollX_added(int)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/view/accessibility/AccessibilityRecord.html#setMaxScrollX(int)" target="_top"><code>setMaxScrollX</code></A>(<code>int</code>)</nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.accessibility.AccessibilityRecord.setMaxScrollY_added(int)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/view/accessibility/AccessibilityRecord.html#setMaxScrollY(int)" target="_top"><code>setMaxScrollY</code></A>(<code>int</code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.view.textservice.SpellCheckerSession.html b/docs/html/sdk/api_diff/15/changes/android.view.textservice.SpellCheckerSession.html new file mode 100644 index 000000000000..0782c9c8a06f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.view.textservice.SpellCheckerSession.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.textservice.SpellCheckerSession +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.view.textservice.<A HREF="../../../../reference/android/view/textservice/SpellCheckerSession.html" target="_top"><font size="+2"><code>SpellCheckerSession</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.textservice.SpellCheckerSession.cancel_added()"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/view/textservice/SpellCheckerSession.html#cancel()" target="_top"><code>cancel</code></A>()</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.view.textservice.SuggestionsInfo.html b/docs/html/sdk/api_diff/15/changes/android.view.textservice.SuggestionsInfo.html new file mode 100644 index 000000000000..bd1859b32c0c --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.view.textservice.SuggestionsInfo.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.textservice.SuggestionsInfo +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.view.textservice.<A HREF="../../../../reference/android/view/textservice/SuggestionsInfo.html" target="_top"><font size="+2"><code>SuggestionsInfo</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Fields" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Fields</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.textservice.SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS"></A> + <nobr><code>int</code> <A HREF="../../../../reference/android/view/textservice/SuggestionsInfo.html#RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" target="_top"><code>RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.LayoutAlgorithm.html b/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.LayoutAlgorithm.html new file mode 100644 index 000000000000..40424ed4e880 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.LayoutAlgorithm.html @@ -0,0 +1,108 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.webkit.WebSettings.LayoutAlgorithm +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.webkit.<A HREF="../../../../reference/android/webkit/WebSettings.LayoutAlgorithm.html" target="_top"><font size="+2"><code>WebSettings.LayoutAlgorithm</code></font></A> +</H2> +<p>Change from deprecated to undeprecated.<br> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.html b/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.html new file mode 100644 index 000000000000..b7005a053dbf --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.webkit.WebSettings.html @@ -0,0 +1,135 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.webkit.WebSettings +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.webkit.<A HREF="../../../../reference/android/webkit/WebSettings.html" target="_top"><font size="+2"><code>WebSettings</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.webkit.WebSettings.getLayoutAlgorithm_changed()"></A> + <nobr><code>LayoutAlgorithm</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#getLayoutAlgorithm()" target="_top"><code>getLayoutAlgorithm</code></A>() </nobr> + </TD> + <TD VALIGN="TOP" WIDTH="30%"> +Change from deprecated to undeprecated.<br> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.webkit.WebSettings.setLayoutAlgorithm_changed(android.webkit.WebSettings.LayoutAlgorithm)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/webkit/WebSettings.html#setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm)" target="_top"><code>setLayoutAlgorithm</code></A>(<code>LayoutAlgorithm</code>) </nobr> + </TD> + <TD VALIGN="TOP" WIDTH="30%"> +Change from deprecated to undeprecated.<br> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/android.widget.RemoteViews.html b/docs/html/sdk/api_diff/15/changes/android.widget.RemoteViews.html new file mode 100644 index 000000000000..50cacaba1f0b --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/android.widget.RemoteViews.html @@ -0,0 +1,122 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.widget.RemoteViews +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Class android.widget.<A HREF="../../../../reference/android/widget/RemoteViews.html" target="_top"><font size="+2"><code>RemoteViews</code></font></A> +</H2> +<a NAME="constructors"></a> +<a NAME="methods"></a> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Methods" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Methods</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.widget.RemoteViews.setContentDescription_added(int, java.lang.CharSequence)"></A> + <nobr><code>void</code> <A HREF="../../../../reference/android/widget/RemoteViews.html#setContentDescription(int, java.lang.CharSequence)" target="_top"><code>setContentDescription</code></A>(<code>int,</nobr> CharSequence<nobr><nobr></code>)</nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<a NAME="fields"></a> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/changes-summary.html b/docs/html/sdk/api_diff/15/changes/changes-summary.html new file mode 100644 index 000000000000..0acb973bcc67 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/changes-summary.html @@ -0,0 +1,275 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Android API Differences Report +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<body class="gc-documentation"> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> + <div id="docTitleContainer"> +<h1>Android API Differences Report</h1> +<p>This report details the changes in the core Android framework API between two <a +href="http://developer.android.com/guide/appendix/api-levels.html" target="_top">API Level</a> +specifications. It shows additions, modifications, and removals for packages, classes, methods, and fields. +The report also includes general statistics that characterize the extent and type of the differences.</p> +<p>This report is based a comparison of the Android API specifications +whose API Level identifiers are given in the upper-right corner of this page. It compares a +newer "to" API to an older "from" API, noting all changes relative to the +older API. So, for example, API elements marked as removed are no longer present in the "to" +API specification.</p> +<p>To navigate the report, use the "Select a Diffs Index" and "Filter the Index" +controls on the left. The report uses text formatting to indicate <em>interface names</em>, +<a href= ><code>links to reference documentation</code></a>, and <a href= >links to change +description</a>. The statistics are accessible from the "Statistics" link in the upper-right corner.</p> +<p>For more information about the Android framework API and SDK, +see the <a href="http://developer.android.com/index.html" target="_top">Android Developers site</a>.</p> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Packages" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=3>Changed Packages</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android"></A> + <nobr><A HREF="pkg_android.html">android</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.app"></A> + <nobr><A HREF="pkg_android.app.html">android.app</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.appwidget"></A> + <nobr><A HREF="pkg_android.appwidget.html">android.appwidget</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.bluetooth"></A> + <nobr><A HREF="pkg_android.bluetooth.html">android.bluetooth</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.content"></A> + <nobr><A HREF="pkg_android.content.html">android.content</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.database"></A> + <nobr><A HREF="pkg_android.database.html">android.database</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.graphics"></A> + <nobr><A HREF="pkg_android.graphics.html">android.graphics</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.hardware"></A> + <nobr><A HREF="pkg_android.hardware.html">android.hardware</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.media"></A> + <nobr><A HREF="pkg_android.media.html">android.media</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.opengl"></A> + <nobr><A HREF="pkg_android.opengl.html">android.opengl</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.os"></A> + <nobr><A HREF="pkg_android.os.html">android.os</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.provider"></A> + <nobr><A HREF="pkg_android.provider.html">android.provider</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.service.textservice"></A> + <nobr><A HREF="pkg_android.service.textservice.html">android.service.textservice</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.service.wallpaper"></A> + <nobr><A HREF="pkg_android.service.wallpaper.html">android.service.wallpaper</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.speech.tts"></A> + <nobr><A HREF="pkg_android.speech.tts.html">android.speech.tts</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.text.style"></A> + <nobr><A HREF="pkg_android.text.style.html">android.text.style</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view"></A> + <nobr><A HREF="pkg_android.view.html">android.view</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.accessibility"></A> + <nobr><A HREF="pkg_android.view.accessibility.html">android.view.accessibility</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.view.textservice"></A> + <nobr><A HREF="pkg_android.view.textservice.html">android.view.textservice</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.webkit"></A> + <nobr><A HREF="pkg_android.webkit.html">android.webkit</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="android.widget"></A> + <nobr><A HREF="pkg_android.widget.html">android.widget</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<!-- End of API section --> +<!-- Start of packages section --> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/classes_index_additions.html b/docs/html/sdk/api_diff/15/changes/classes_index_additions.html new file mode 100644 index 000000000000..16969ea6b225 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/classes_index_additions.html @@ -0,0 +1,91 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Class Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="classes_index_all.html" class="staysblack">All Classes</a> + <br> +<font color="#999999">Removals</font> + <br> +<b>Additions</b> + <br> +<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.provider.html#CalendarContract.Colors" class="hiddenlink" target="rightframe"><b>CalendarContract.Colors</b></A><br> +<A HREF="pkg_android.provider.html#CalendarContract.ColorsColumns" class="hiddenlink" target="rightframe"><b><i>CalendarContract.ColorsColumns</i></b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.Contacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.Contacts.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.RawContacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.RawContacts.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItemPhotos</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotosColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemPhotosColumns</i></b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems.StreamItemPhotos</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemsColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemsColumns</i></b></A><br> +<A HREF="pkg_android.database.html#CrossProcessCursorWrapper" class="hiddenlink" target="rightframe"><b>CrossProcessCursorWrapper</b></A><br> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#U"><font size="-2">U</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.os.html#TransactionTooLargeException" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b></A><br> +<A NAME="U"></A> +<br><font size="+2">U</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#T"><font size="-2">T</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.speech.tts.html#UtteranceProgressListener" class="hiddenlink" target="rightframe"><b>UtteranceProgressListener</b></A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/classes_index_all.html b/docs/html/sdk/api_diff/15/changes/classes_index_all.html new file mode 100644 index 000000000000..e03eba3cc630 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/classes_index_all.html @@ -0,0 +1,345 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Class Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>Classes</b> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.accessibility.AccessibilityRecord.html" class="hiddenlink" target="rightframe">AccessibilityRecord</A><br> +<A HREF="android.appwidget.AppWidgetHostView.html" class="hiddenlink" target="rightframe">AppWidgetHostView</A><br> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.bluetooth.BluetoothDevice.html" class="hiddenlink" target="rightframe">BluetoothDevice</A><br> +<A HREF="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.provider.CalendarContract.AttendeesColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.AttendeesColumns</i></A><br> +<A HREF="android.provider.CalendarContract.CalendarColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.CalendarColumns</i></A><br> +<A HREF="pkg_android.provider.html#CalendarContract.Colors" class="hiddenlink" target="rightframe"><b>CalendarContract.Colors</b></A><br> +<A HREF="pkg_android.provider.html#CalendarContract.ColorsColumns" class="hiddenlink" target="rightframe"><b><i>CalendarContract.ColorsColumns</i></b></A><br> +<A HREF="android.provider.CalendarContract.EventsColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.EventsColumns</i></A><br> +<A HREF="android.media.CamcorderProfile.html" class="hiddenlink" target="rightframe">CamcorderProfile</A><br> +<A HREF="android.hardware.Camera.Parameters.html" class="hiddenlink" target="rightframe">Camera.Parameters</A><br> +<A HREF="pkg_android.provider.html#ContactsContract.Contacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.Contacts.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.RawContacts.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.RawContacts.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItemPhotos</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemPhotosColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemPhotosColumns</i></b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItems.StreamItemPhotos" class="hiddenlink" target="rightframe"><b>ContactsContract.StreamItems.StreamItemPhotos</b></A><br> +<A HREF="pkg_android.provider.html#ContactsContract.StreamItemsColumns" class="hiddenlink" target="rightframe"><b><i>ContactsContract.StreamItemsColumns</i></b></A><br> +<A HREF="android.content.Context.html" class="hiddenlink" target="rightframe">Context</A><br> +<A HREF="pkg_android.database.html#CrossProcessCursorWrapper" class="hiddenlink" target="rightframe"><b>CrossProcessCursorWrapper</b></A><br> +<A HREF="android.database.CursorWindow.html" class="hiddenlink" target="rightframe">CursorWindow</A><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.app.Fragment.html" class="hiddenlink" target="rightframe">Fragment</A><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.opengl.GLES11Ext.html" class="hiddenlink" target="rightframe">GLES11Ext</A><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.IBinder.html" class="hiddenlink" target="rightframe"><i>IBinder</i></A><br> +<A HREF="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.KeyEvent.html" class="hiddenlink" target="rightframe">KeyEvent</A><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br> +<A HREF="android.media.MediaMetadataRetriever.html" class="hiddenlink" target="rightframe">MediaMetadataRetriever</A><br> +<A HREF="android.provider.MediaStore.html" class="hiddenlink" target="rightframe">MediaStore</A><br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.RemoteException.html" class="hiddenlink" target="rightframe">RemoteException</A><br> +<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.provider.Settings.Secure.html" class="hiddenlink" target="rightframe">Settings.Secure</A><br> +<A HREF="android.service.textservice.SpellCheckerService.Session.html" class="hiddenlink" target="rightframe">SpellCheckerService.Session</A><br> +<A HREF="android.view.textservice.SpellCheckerSession.html" class="hiddenlink" target="rightframe">SpellCheckerSession</A><br> +<A HREF="android.view.textservice.SuggestionsInfo.html" class="hiddenlink" target="rightframe">SuggestionsInfo</A><br> +<A HREF="android.text.style.SuggestionSpan.html" class="hiddenlink" target="rightframe">SuggestionSpan</A><br> +<A HREF="android.graphics.SurfaceTexture.html" class="hiddenlink" target="rightframe">SurfaceTexture</A><br> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.speech.tts.TextToSpeech.html" class="hiddenlink" target="rightframe">TextToSpeech</A><br> +<A HREF="android.speech.tts.TextToSpeech.Engine.html" class="hiddenlink" target="rightframe">TextToSpeech.Engine</A><br> +<A HREF="android.speech.tts.TextToSpeechService.html" class="hiddenlink" target="rightframe">TextToSpeechService</A><br> +<A HREF="pkg_android.os.html#TransactionTooLargeException" class="hiddenlink" target="rightframe"><b>TransactionTooLargeException</b></A><br> +<A NAME="U"></A> +<br><font size="+2">U</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="pkg_android.speech.tts.html#UtteranceProgressListener" class="hiddenlink" target="rightframe"><b>UtteranceProgressListener</b></A><br> +<A NAME="V"></A> +<br><font size="+2">V</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#U"><font size="-2">U</font></a> +<a href="#V"><font size="-2">V</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.service.wallpaper.WallpaperService.Engine.html" class="hiddenlink" target="rightframe">WallpaperService.Engine</A><br> +<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br> +<A HREF="android.webkit.WebSettings.LayoutAlgorithm.html" class="hiddenlink" target="rightframe">WebSettings.LayoutAlgorithm</A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/classes_index_changes.html b/docs/html/sdk/api_diff/15/changes/classes_index_changes.html new file mode 100644 index 000000000000..3109b6e7bece --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/classes_index_changes.html @@ -0,0 +1,303 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Class Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="classes_index_all.html" class="staysblack">All Classes</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.accessibility.AccessibilityRecord.html" class="hiddenlink" target="rightframe">AccessibilityRecord</A><br> +<A HREF="android.appwidget.AppWidgetHostView.html" class="hiddenlink" target="rightframe">AppWidgetHostView</A><br> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.bluetooth.BluetoothDevice.html" class="hiddenlink" target="rightframe">BluetoothDevice</A><br> +<A HREF="android.os.Build.VERSION_CODES.html" class="hiddenlink" target="rightframe">Build.VERSION_CODES</A><br> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.provider.CalendarContract.AttendeesColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.AttendeesColumns</i></A><br> +<A HREF="android.provider.CalendarContract.CalendarColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.CalendarColumns</i></A><br> +<A HREF="android.provider.CalendarContract.EventsColumns.html" class="hiddenlink" target="rightframe"><i>CalendarContract.EventsColumns</i></A><br> +<A HREF="android.media.CamcorderProfile.html" class="hiddenlink" target="rightframe">CamcorderProfile</A><br> +<A HREF="android.hardware.Camera.Parameters.html" class="hiddenlink" target="rightframe">Camera.Parameters</A><br> +<A HREF="android.content.Context.html" class="hiddenlink" target="rightframe">Context</A><br> +<A HREF="android.database.CursorWindow.html" class="hiddenlink" target="rightframe">CursorWindow</A><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.app.Fragment.html" class="hiddenlink" target="rightframe">Fragment</A><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.opengl.GLES11Ext.html" class="hiddenlink" target="rightframe">GLES11Ext</A><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.IBinder.html" class="hiddenlink" target="rightframe"><i>IBinder</i></A><br> +<A HREF="android.content.Intent.html" class="hiddenlink" target="rightframe">Intent</A><br> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.KeyEvent.html" class="hiddenlink" target="rightframe">KeyEvent</A><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.Manifest.permission.html" class="hiddenlink" target="rightframe">Manifest.permission</A><br> +<A HREF="android.media.MediaMetadataRetriever.html" class="hiddenlink" target="rightframe">MediaMetadataRetriever</A><br> +<A HREF="android.provider.MediaStore.html" class="hiddenlink" target="rightframe">MediaStore</A><br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.os.RemoteException.html" class="hiddenlink" target="rightframe">RemoteException</A><br> +<A HREF="android.widget.RemoteViews.html" class="hiddenlink" target="rightframe">RemoteViews</A><br> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.provider.Settings.Secure.html" class="hiddenlink" target="rightframe">Settings.Secure</A><br> +<A HREF="android.service.textservice.SpellCheckerService.Session.html" class="hiddenlink" target="rightframe">SpellCheckerService.Session</A><br> +<A HREF="android.view.textservice.SpellCheckerSession.html" class="hiddenlink" target="rightframe">SpellCheckerSession</A><br> +<A HREF="android.view.textservice.SuggestionsInfo.html" class="hiddenlink" target="rightframe">SuggestionsInfo</A><br> +<A HREF="android.text.style.SuggestionSpan.html" class="hiddenlink" target="rightframe">SuggestionSpan</A><br> +<A HREF="android.graphics.SurfaceTexture.html" class="hiddenlink" target="rightframe">SurfaceTexture</A><br> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#V"><font size="-2">V</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.speech.tts.TextToSpeech.html" class="hiddenlink" target="rightframe">TextToSpeech</A><br> +<A HREF="android.speech.tts.TextToSpeech.Engine.html" class="hiddenlink" target="rightframe">TextToSpeech.Engine</A><br> +<A HREF="android.speech.tts.TextToSpeechService.html" class="hiddenlink" target="rightframe">TextToSpeechService</A><br> +<A NAME="V"></A> +<br><font size="+2">V</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.view.View.html" class="hiddenlink" target="rightframe">View</A><br> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#S"><font size="-2">S</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#V"><font size="-2">V</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<A HREF="android.service.wallpaper.WallpaperService.Engine.html" class="hiddenlink" target="rightframe">WallpaperService.Engine</A><br> +<A HREF="android.webkit.WebSettings.html" class="hiddenlink" target="rightframe">WebSettings</A><br> +<A HREF="android.webkit.WebSettings.LayoutAlgorithm.html" class="hiddenlink" target="rightframe">WebSettings.LayoutAlgorithm</A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/classes_index_removals.html b/docs/html/sdk/api_diff/15/changes/classes_index_removals.html new file mode 100644 index 000000000000..e6da73f487d3 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/classes_index_removals.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Class Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Classes" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="classes_index_all.html" class="staysblack">All Classes</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="classes_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="classes_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/constructors_index_additions.html b/docs/html/sdk/api_diff/15/changes/constructors_index_additions.html new file mode 100644 index 000000000000..c834d4ffd96a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/constructors_index_additions.html @@ -0,0 +1,75 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Constructor Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="constructors_index_all.html" class="staysblack">All Constructors</a> + <br> +<font color="#999999">Removals</font> + <br> +<b>Additions</b> + <br> +<A HREF="constructors_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#R"><font size="-2">R</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>CursorWindow</b> +(<code>String</code>)</A></nobr> constructor<br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#C"><font size="-2">C</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.RemoteException.html#android.os.RemoteException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>RemoteException</b> +(<code>String</code>)</A></nobr> constructor<br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/constructors_index_all.html b/docs/html/sdk/api_diff/15/changes/constructors_index_all.html new file mode 100644 index 000000000000..4e8e6923f69b --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/constructors_index_all.html @@ -0,0 +1,78 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Constructor Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>Constructors</b> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="constructors_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#R"><font size="-2">R</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<i>CursorWindow</i><br> + <nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>CursorWindow</b> +(<code>String</code>)</A></nobr> constructor<br> + <nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_changed(boolean)" class="hiddenlink" target="rightframe">CursorWindow +(<code>boolean</code>)</A></nobr> constructor<br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#C"><font size="-2">C</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.RemoteException.html#android.os.RemoteException.ctor_added(java.lang.String)" class="hiddenlink" target="rightframe"><b>RemoteException</b> +(<code>String</code>)</A></nobr> constructor<br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/constructors_index_changes.html b/docs/html/sdk/api_diff/15/changes/constructors_index_changes.html new file mode 100644 index 000000000000..74dc718904f5 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/constructors_index_changes.html @@ -0,0 +1,67 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Constructor Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="constructors_index_all.html" class="staysblack">All Constructors</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.database.CursorWindow.html#android.database.CursorWindow.ctor_changed(boolean)" class="hiddenlink" target="rightframe">CursorWindow +(<code>boolean</code>)</A></nobr> constructor<br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/constructors_index_removals.html b/docs/html/sdk/api_diff/15/changes/constructors_index_removals.html new file mode 100644 index 000000000000..f1a99529b22d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/constructors_index_removals.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Constructor Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Constructors" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="constructors_index_all.html" class="staysblack">All Constructors</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="constructors_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="constructors_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/fields_index_additions.html b/docs/html/sdk/api_diff/15/changes/fields_index_additions.html new file mode 100644 index 000000000000..6012ce8841a4 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/fields_index_additions.html @@ -0,0 +1,345 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Field Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="fields_index_all.html" class="staysblack">All Fields</a> + <br> +<font color="#999999">Removals</font> + <br> +<b>Additions</b> + <br> +<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD" class="hiddenlink" target="rightframe">ACCESSIBILITY_SPEAK_PASSWORD</A> +</nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.ACTION_UUID" class="hiddenlink" target="rightframe">ACTION_UUID</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_ATTENDEE_TYPES" class="hiddenlink" target="rightframe">ALLOWED_ATTENDEE_TYPES</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_AVAILABILITY" class="hiddenlink" target="rightframe">ALLOWED_AVAILABILITY</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.AVAILABILITY_TENTATIVE" class="hiddenlink" target="rightframe">AVAILABILITY_TENTATIVE</A> +</nobr><br> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.CALENDAR_COLOR_KEY" class="hiddenlink" target="rightframe">CALENDAR_COLOR_KEY</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_BROWSER" class="hiddenlink" target="rightframe">CATEGORY_APP_BROWSER</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALCULATOR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALCULATOR</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALENDAR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALENDAR</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CONTACTS" class="hiddenlink" target="rightframe">CATEGORY_APP_CONTACTS</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_EMAIL" class="hiddenlink" target="rightframe">CATEGORY_APP_EMAIL</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_GALLERY" class="hiddenlink" target="rightframe">CATEGORY_APP_GALLERY</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MAPS" class="hiddenlink" target="rightframe">CATEGORY_APP_MAPS</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MESSAGING" class="hiddenlink" target="rightframe">CATEGORY_APP_MESSAGING</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MUSIC" class="hiddenlink" target="rightframe">CATEGORY_APP_MUSIC</A> +</nobr><br> +<A NAME="E"></A> +<br><font size="+2">E</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.EVENT_COLOR_KEY" class="hiddenlink" target="rightframe">EVENT_COLOR_KEY</A> +</nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.EXTRA_UUID" class="hiddenlink" target="rightframe">EXTRA_UUID</A> +</nobr><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SELECTOR" class="hiddenlink" target="rightframe">FILL_IN_SELECTOR</A> +</nobr><br> +<nobr><A HREF="android.text.style.SuggestionSpan.html#android.text.style.SuggestionSpan.FLAG_AUTO_CORRECTION" class="hiddenlink" target="rightframe">FLAG_AUTO_CORRECTION</A> +</nobr><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" class="hiddenlink" target="rightframe">GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_SAMPLER_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_SAMPLER_EXTERNAL_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_BINDING_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_BINDING_EXTERNAL_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_EXTERNAL_OES</A> +</nobr><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1" class="hiddenlink" target="rightframe">ICE_CREAM_SANDWICH_MR1</A> +</nobr><br> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_EMBEDDED_SYNTHESIS</A> +</nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_NETWORK_SYNTHESIS</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALCULATOR" class="hiddenlink" target="rightframe">KEYCODE_CALCULATOR</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALENDAR" class="hiddenlink" target="rightframe">KEYCODE_CALENDAR</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CONTACTS" class="hiddenlink" target="rightframe">KEYCODE_CONTACTS</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_MUSIC" class="hiddenlink" target="rightframe">KEYCODE_MUSIC</A> +</nobr><br> +<A NAME="L"></A> +<br><font size="+2">L</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.IBinder.html#android.os.IBinder.LIKE_TRANSACTION" class="hiddenlink" target="rightframe">LIKE_TRANSACTION</A> +</nobr><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.MediaMetadataRetriever.html#android.media.MediaMetadataRetriever.METADATA_KEY_LOCATION" class="hiddenlink" target="rightframe">METADATA_KEY_LOCATION</A> +</nobr><br> +<A NAME="Q"></A> +<br><font size="+2">Q</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_QVGA" class="hiddenlink" target="rightframe">QUALITY_QVGA</A> +</nobr><br> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_TIME_LAPSE_QVGA" class="hiddenlink" target="rightframe">QUALITY_TIME_LAPSE_QVGA</A> +</nobr><br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.READ_SOCIAL_STREAM" class="hiddenlink" target="rightframe">READ_SOCIAL_STREAM</A> +</nobr><br> +<nobr><A HREF="android.view.textservice.SuggestionsInfo.html#android.view.textservice.SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" class="hiddenlink" target="rightframe">RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS</A> +</nobr><br> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.AttendeesColumns.html#android.provider.CalendarContract.AttendeesColumns.TYPE_RESOURCE" class="hiddenlink" target="rightframe">TYPE_RESOURCE</A> +</nobr><br> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_SOCIAL_STREAM" class="hiddenlink" target="rightframe">WRITE_SOCIAL_STREAM</A> +</nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/fields_index_all.html b/docs/html/sdk/api_diff/15/changes/fields_index_all.html new file mode 100644 index 000000000000..66fbf8f9938f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/fields_index_all.html @@ -0,0 +1,379 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Field Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>Fields</b> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="A"></A> +<br><font size="+2">A</font> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.Settings.Secure.html#android.provider.Settings.Secure.ACCESSIBILITY_SPEAK_PASSWORD" class="hiddenlink" target="rightframe">ACCESSIBILITY_SPEAK_PASSWORD</A> +</nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.ACTION_UUID" class="hiddenlink" target="rightframe">ACTION_UUID</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_ATTENDEE_TYPES" class="hiddenlink" target="rightframe">ALLOWED_ATTENDEE_TYPES</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.ALLOWED_AVAILABILITY" class="hiddenlink" target="rightframe">ALLOWED_AVAILABILITY</A> +</nobr><br> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.AVAILABILITY_TENTATIVE" class="hiddenlink" target="rightframe">AVAILABILITY_TENTATIVE</A> +</nobr><br> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Context.html#android.content.Context.BIND_ADJUST_WITH_ACTIVITY" class="hiddenlink" target="rightframe">BIND_ADJUST_WITH_ACTIVITY</A> +</nobr><br> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html#android.provider.CalendarContract.CalendarColumns.CALENDAR_COLOR_KEY" class="hiddenlink" target="rightframe">CALENDAR_COLOR_KEY</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_BROWSER" class="hiddenlink" target="rightframe">CATEGORY_APP_BROWSER</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALCULATOR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALCULATOR</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CALENDAR" class="hiddenlink" target="rightframe">CATEGORY_APP_CALENDAR</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_CONTACTS" class="hiddenlink" target="rightframe">CATEGORY_APP_CONTACTS</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_EMAIL" class="hiddenlink" target="rightframe">CATEGORY_APP_EMAIL</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_GALLERY" class="hiddenlink" target="rightframe">CATEGORY_APP_GALLERY</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MAPS" class="hiddenlink" target="rightframe">CATEGORY_APP_MAPS</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MESSAGING" class="hiddenlink" target="rightframe">CATEGORY_APP_MESSAGING</A> +</nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.CATEGORY_APP_MUSIC" class="hiddenlink" target="rightframe">CATEGORY_APP_MUSIC</A> +</nobr><br> +<A NAME="E"></A> +<br><font size="+2">E</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.EventsColumns.html#android.provider.CalendarContract.EventsColumns.EVENT_COLOR_KEY" class="hiddenlink" target="rightframe">EVENT_COLOR_KEY</A> +</nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.EXTRA_UUID" class="hiddenlink" target="rightframe">EXTRA_UUID</A> +</nobr><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.FILL_IN_SELECTOR" class="hiddenlink" target="rightframe">FILL_IN_SELECTOR</A> +</nobr><br> +<nobr><A HREF="android.text.style.SuggestionSpan.html#android.text.style.SuggestionSpan.FLAG_AUTO_CORRECTION" class="hiddenlink" target="rightframe">FLAG_AUTO_CORRECTION</A> +</nobr><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES" class="hiddenlink" target="rightframe">GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_SAMPLER_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_SAMPLER_EXTERNAL_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_BINDING_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_BINDING_EXTERNAL_OES</A> +</nobr><br> +<nobr><A HREF="android.opengl.GLES11Ext.html#android.opengl.GLES11Ext.GL_TEXTURE_EXTERNAL_OES" class="hiddenlink" target="rightframe">GL_TEXTURE_EXTERNAL_OES</A> +</nobr><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.Build.VERSION_CODES.html#android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1" class="hiddenlink" target="rightframe">ICE_CREAM_SANDWICH_MR1</A> +</nobr><br> +<nobr><A HREF="android.provider.MediaStore.html#android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER" class="hiddenlink" target="rightframe">INTENT_ACTION_MUSIC_PLAYER</A> +</nobr><br> +<A NAME="K"></A> +<br><font size="+2">K</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_EMBEDDED_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_EMBEDDED_SYNTHESIS</A> +</nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html#android.speech.tts.TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS" class="hiddenlink" target="rightframe">KEY_FEATURE_NETWORK_SYNTHESIS</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALCULATOR" class="hiddenlink" target="rightframe">KEYCODE_CALCULATOR</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CALENDAR" class="hiddenlink" target="rightframe">KEYCODE_CALENDAR</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_CONTACTS" class="hiddenlink" target="rightframe">KEYCODE_CONTACTS</A> +</nobr><br> +<nobr><A HREF="android.view.KeyEvent.html#android.view.KeyEvent.KEYCODE_MUSIC" class="hiddenlink" target="rightframe">KEYCODE_MUSIC</A> +</nobr><br> +<A NAME="L"></A> +<br><font size="+2">L</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.os.IBinder.html#android.os.IBinder.LIKE_TRANSACTION" class="hiddenlink" target="rightframe">LIKE_TRANSACTION</A> +</nobr><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.MediaMetadataRetriever.html#android.media.MediaMetadataRetriever.METADATA_KEY_LOCATION" class="hiddenlink" target="rightframe">METADATA_KEY_LOCATION</A> +</nobr><br> +<A NAME="Q"></A> +<br><font size="+2">Q</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_QVGA" class="hiddenlink" target="rightframe">QUALITY_QVGA</A> +</nobr><br> +<nobr><A HREF="android.media.CamcorderProfile.html#android.media.CamcorderProfile.QUALITY_TIME_LAPSE_QVGA" class="hiddenlink" target="rightframe">QUALITY_TIME_LAPSE_QVGA</A> +</nobr><br> +<A NAME="R"></A> +<br><font size="+2">R</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#T"><font size="-2">T</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.READ_SOCIAL_STREAM" class="hiddenlink" target="rightframe">READ_SOCIAL_STREAM</A> +</nobr><br> +<nobr><A HREF="android.view.textservice.SuggestionsInfo.html#android.view.textservice.SuggestionsInfo.RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS" class="hiddenlink" target="rightframe">RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS</A> +</nobr><br> +<A NAME="T"></A> +<br><font size="+2">T</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#W"><font size="-2">W</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.CalendarContract.AttendeesColumns.html#android.provider.CalendarContract.AttendeesColumns.TYPE_RESOURCE" class="hiddenlink" target="rightframe">TYPE_RESOURCE</A> +</nobr><br> +<A NAME="W"></A> +<br><font size="+2">W</font> +<a href="#A"><font size="-2">A</font></a> +<a href="#B"><font size="-2">B</font></a> +<a href="#C"><font size="-2">C</font></a> +<a href="#E"><font size="-2">E</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#K"><font size="-2">K</font></a> +<a href="#L"><font size="-2">L</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#Q"><font size="-2">Q</font></a> +<a href="#R"><font size="-2">R</font></a> +<a href="#T"><font size="-2">T</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.Manifest.permission.html#android.Manifest.permission.WRITE_SOCIAL_STREAM" class="hiddenlink" target="rightframe">WRITE_SOCIAL_STREAM</A> +</nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/fields_index_changes.html b/docs/html/sdk/api_diff/15/changes/fields_index_changes.html new file mode 100644 index 000000000000..82b093dcb156 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/fields_index_changes.html @@ -0,0 +1,75 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Field Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="fields_index_all.html" class="staysblack">All Fields</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="B"></A> +<br><font size="+2">B</font> +<a href="#I"><font size="-2">I</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Context.html#android.content.Context.BIND_ADJUST_WITH_ACTIVITY" class="hiddenlink" target="rightframe">BIND_ADJUST_WITH_ACTIVITY</A> +</nobr><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#B"><font size="-2">B</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.provider.MediaStore.html#android.provider.MediaStore.INTENT_ACTION_MUSIC_PLAYER" class="hiddenlink" target="rightframe">INTENT_ACTION_MUSIC_PLAYER</A> +</nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/fields_index_removals.html b/docs/html/sdk/api_diff/15/changes/fields_index_removals.html new file mode 100644 index 000000000000..9f62d88abf0d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/fields_index_removals.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Field Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Fields" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="fields_index_all.html" class="staysblack">All Fields</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="fields_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="fields_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/jdiff_help.html b/docs/html/sdk/api_diff/15/changes/jdiff_help.html new file mode 100644 index 000000000000..415299866a34 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/jdiff_help.html @@ -0,0 +1,134 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +JDiff Help +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<TABLE summary="Navigation bar" BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0"> +<TR> +<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> + <TABLE summary="Navigation bar" BORDER="0" CELLPADDING="0" CELLSPACING="3"> + <TR ALIGN="center" VALIGN="top"> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../../reference/index.html" target="_top"><FONT CLASS="NavBarFont1"><B><code>15</code></B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="changes-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Package</FONT> </TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1"> <FONT CLASS="NavBarFont1">Class</FONT> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="jdiff_statistics.html"><FONT CLASS="NavBarFont1"><B>Statistics</B></FONT></A> </TD> + <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>Help</B></FONT> </TD> + </TR> + </TABLE> +</TD> +<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Generated by<br><a href="http://www.jdiff.org" class="staysblack" target="_top">JDiff</a></b></EM></TD> +</TR> +<TR> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2"></FONT> +</TD> + <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell2"><FONT SIZE="-2"> + <A HREF="../changes.html" TARGET="_top"><B>FRAMES</B></A> + <A HREF="jdiff_help.html" TARGET="_top"><B>NO FRAMES</B></A></FONT></TD> +</TR> +</TABLE> +<HR> +<!-- End of nav bar --> +<center> +<H1>JDiff Documentation</H1> +</center> +<BLOCKQUOTE> +JDiff is a <a href="http://java.sun.com/j2se/javadoc/" target="_top">Javadoc</a> doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does. +This help page describes the different parts of the output from JDiff. +</BLOCKQUOTE> +<BLOCKQUOTE> + See the reference page in the <a href="http://www.jdiff.org">source for JDiff</a> for information about how to generate a report like this one. +</BLOCKQUOTE> +<BLOCKQUOTE> +The indexes shown in the top-left frame help show each type of change in more detail. The index "All Differences" contains all the differences between the APIs, in alphabetical order. +These indexes all use the same format: +<ul> +<li>Removed packages, classes, constructors, methods and fields are <strike>struck through</strike>.</li> +<li>Added packages, classes, constructors, methods and fields appear in <b>bold</b>.</li> +<li>Changed packages, classes, constructors, methods and fields appear in normal text.</li> +</ul> +</BLOCKQUOTE> +<BLOCKQUOTE> +You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background. +Links which take you to a Javadoc page are always in a <code>typewriter</code> font. +Just like Javadoc, all interface names are in <i>italic</i>, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3><b><code>Javadoc</code></b></H3> +This is a link to the <a href="../../../../reference/index.html" target="_top">top-level</a> Javadoc page for the new version of the product. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Overview</H3> +The <a href="changes-summary.html">overview</a> is the top-level summary of what was removed, added and changed between versions. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Package</H3> +This is a link to the package containing the current changed class or interface. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Class</H3> +This is highlighted when you are looking at the changed class or interface. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Text Changes</H3> +This is a link to the top-level index of all documentation changes for the current package or class. +If it is not present, then there are no documentation changes for the current package or class. +This link can be removed entirely by not using the <code>-docchanges</code> option. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Statistics</H3> +This is a link to a page which shows statistics about the changes between the two APIs. +This link can be removed entirely by not using the <code>-stats</code> option. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Help</H3> +A link to this Help page for JDiff. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Prev/Next</H3> +These links take you to the previous and next changed package or class. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H3>Frames/No Frames</H3> +These links show and hide the HTML frames. All pages are available with or without frames. +</BLOCKQUOTE> +<BLOCKQUOTE> +<H2>Complex Changes</H2> +There are some complex changes which can occur between versions, for example, when two or more methods with the same name change simultaneously, or when a method or field is moved into or from a superclass. +In these cases, the change will be seen as a removal and an addition, rather than as a change. Unexpected removals or additions are often part of one of these type of changes. +</BLOCKQUOTE> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/jdiff_statistics.html b/docs/html/sdk/api_diff/15/changes/jdiff_statistics.html new file mode 100644 index 000000000000..2c15e7659d0a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/jdiff_statistics.html @@ -0,0 +1,447 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +API Change Statistics +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<body class="gc-documentation"> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;xborder-bottom:none;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="../changes.html" target="_top">Top of Report</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<h1>API Change Statistics</h1> +<p>The overall difference between API Levels 14 and 15 is approximately <span style="color:222;font-weight:bold;">0.14%</span>. +</p> +<br> +<a name="numbers"></a> +<h2>Total of Differences, by Number and Type</h2> +<p> +The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements — that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class. +</p> +<TABLE summary="Number of differences" WIDTH="100%"> +<TR> + <th>Type</th> + <TH ALIGN="center"><b>Additions</b></TH> + <TH ALIGN="center"><b>Changes</b></TH> + <TH ALIGN="center">Removals</TH> + <TH ALIGN="center"><b>Total</b></TH> +</TR> +<TR> + <TD>Packages</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">21</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">21</TD> +</TR> +<TR> + <TD>Classes and <i>Interfaces</i></TD> + <TD ALIGN="right">12</TD> + <TD ALIGN="right">34</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">46</TD> +</TR> +<TR> + <TD>Constructors</TD> + <TD ALIGN="right">2</TD> + <TD ALIGN="right">1</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">3</TD> +</TR> +<TR> + <TD>Methods</TD> + <TD ALIGN="right">25</TD> + <TD ALIGN="right">3</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">28</TD> +</TR> +<TR> + <TD>Fields</TD> + <TD ALIGN="right">38</TD> + <TD ALIGN="right">2</TD> + <TD ALIGN="right">0</TD> + <TD ALIGN="right">40</TD> +</TR> +<TR> + <TD style="background-color:#FAFAFA"><b>Total</b></TD> + <TD style="background-color:#FAFAFA" ALIGN="right"><strong>77</strong></TD> + <TD style="background-color:#FAFAFA" ALIGN="right"><strong>61</strong></TD> + <TD style="background-color:#FAFAFA" ALIGN="right"><strong>0</strong></TD> + <TD style="background-color:#FAFAFA" ALIGN="right"><strong>138</strong></TD> +</TR> +</TABLE> +<br> +<a name="packages"></a> +<h2>Changed Packages, Sorted by Percentage Difference</h2> +<TABLE summary="Packages sorted by percentage difference" WIDTH="100%"> +<TR> + <TH WIDTH="10%">Percentage Difference*</TH> + <TH>Package</TH> +</TR> +<TR> + <TD ALIGN="center">7</TD> + <TD><A HREF="pkg_android.speech.tts.html">android.speech.tts</A></TD> +</TR> +<TR> + <TD ALIGN="center">3</TD> + <TD><A HREF="pkg_android.service.textservice.html">android.service.textservice</A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="pkg_android.provider.html">android.provider</A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="pkg_android.database.html">android.database</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="pkg_android.view.textservice.html">android.view.textservice</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="pkg_android.os.html">android.os</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="pkg_android.service.wallpaper.html">android.service.wallpaper</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="pkg_android.appwidget.html">android.appwidget</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.view.accessibility.html">android.view.accessibility</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.webkit.html">android.webkit</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.bluetooth.html">android.bluetooth</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.media.html">android.media</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.graphics.html">android.graphics</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.text.style.html">android.text.style</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.hardware.html">android.hardware</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.opengl.html">android.opengl</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.content.html">android.content</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.html">android</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.app.html">android.app</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.view.html">android.view</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="pkg_android.widget.html">android.widget</A></TD> +</TR> +</TABLE> +<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p> +<br> +<a name="classes"></a> +<h2>Changed Classes and <i>Interfaces</i>, Sorted by Percentage Difference</h2> +<TABLE summary="Classes sorted by percentage difference" WIDTH="100%"> +<TR WIDTH="20%"> + <TH WIDTH="10%">Percentage<br>Difference*</TH> + <TH><b>Class or <i>Interface</i></b></TH> +</TR> +<TR> + <TD ALIGN="center">33</TD> + <TD><A HREF="android.os.RemoteException.html"> +android.os.RemoteException</A></TD> +</TR> +<TR> + <TD ALIGN="center">25</TD> + <TD><A HREF="android.webkit.WebSettings.LayoutAlgorithm.html"> +android.webkit.WebSettings.LayoutAlgorithm</A></TD> +</TR> +<TR> + <TD ALIGN="center">7</TD> + <TD><A HREF="android.graphics.SurfaceTexture.html"> +android.graphics.SurfaceTexture</A></TD> +</TR> +<TR> + <TD ALIGN="center">7</TD> + <TD><A HREF="android.view.textservice.SpellCheckerSession.html"> +android.view.textservice.SpellCheckerSession</A></TD> +</TR> +<TR> + <TD ALIGN="center">7</TD> + <TD><A HREF="android.bluetooth.BluetoothDevice.html"> +android.bluetooth.BluetoothDevice</A></TD> +</TR> +<TR> + <TD ALIGN="center">6</TD> + <TD><A HREF="android.provider.CalendarContract.CalendarColumns.html"> +<i>android.provider.CalendarContract.CalendarColumns</i></A></TD> +</TR> +<TR> + <TD ALIGN="center">6</TD> + <TD><A HREF="android.service.textservice.SpellCheckerService.Session.html"> +android.service.textservice.SpellCheckerService.Session</A></TD> +</TR> +<TR> + <TD ALIGN="center">6</TD> + <TD><A HREF="android.speech.tts.TextToSpeechService.html"> +android.speech.tts.TextToSpeechService</A></TD> +</TR> +<TR> + <TD ALIGN="center">5</TD> + <TD><A HREF="android.appwidget.AppWidgetHostView.html"> +android.appwidget.AppWidgetHostView</A></TD> +</TR> +<TR> + <TD ALIGN="center">4</TD> + <TD><A HREF="android.view.accessibility.AccessibilityRecord.html"> +android.view.accessibility.AccessibilityRecord</A></TD> +</TR> +<TR> + <TD ALIGN="center">4</TD> + <TD><A HREF="android.database.CursorWindow.html"> +android.database.CursorWindow</A></TD> +</TR> +<TR> + <TD ALIGN="center">4</TD> + <TD><A HREF="android.speech.tts.TextToSpeech.html"> +android.speech.tts.TextToSpeech</A></TD> +</TR> +<TR> + <TD ALIGN="center">4</TD> + <TD><A HREF="android.speech.tts.TextToSpeech.Engine.html"> +android.speech.tts.TextToSpeech.Engine</A></TD> +</TR> +<TR> + <TD ALIGN="center">3</TD> + <TD><A HREF="android.view.textservice.SuggestionsInfo.html"> +android.view.textservice.SuggestionsInfo</A></TD> +</TR> +<TR> + <TD ALIGN="center">3</TD> + <TD><A HREF="android.media.CamcorderProfile.html"> +android.media.CamcorderProfile</A></TD> +</TR> +<TR> + <TD ALIGN="center">3</TD> + <TD><A HREF="android.os.Build.VERSION_CODES.html"> +android.os.Build.VERSION_CODES</A></TD> +</TR> +<TR> + <TD ALIGN="center">3</TD> + <TD><A HREF="android.os.IBinder.html"> +<i>android.os.IBinder</i></A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="android.provider.CalendarContract.AttendeesColumns.html"> +<i>android.provider.CalendarContract.AttendeesColumns</i></A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="android.service.wallpaper.WallpaperService.Engine.html"> +android.service.wallpaper.WallpaperService.Engine</A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="android.text.style.SuggestionSpan.html"> +android.text.style.SuggestionSpan</A></TD> +</TR> +<TR> + <TD ALIGN="center">2</TD> + <TD><A HREF="android.content.Intent.html"> +android.content.Intent</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.provider.MediaStore.html"> +android.provider.MediaStore</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.provider.CalendarContract.EventsColumns.html"> +<i>android.provider.CalendarContract.EventsColumns</i></A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.app.Fragment.html"> +android.app.Fragment</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.media.MediaMetadataRetriever.html"> +android.media.MediaMetadataRetriever</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.widget.RemoteViews.html"> +android.widget.RemoteViews</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.hardware.Camera.Parameters.html"> +android.hardware.Camera.Parameters</A></TD> +</TR> +<TR> + <TD ALIGN="center">1</TD> + <TD><A HREF="android.webkit.WebSettings.html"> +android.webkit.WebSettings</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.opengl.GLES11Ext.html"> +android.opengl.GLES11Ext</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.Manifest.permission.html"> +android.Manifest.permission</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.provider.Settings.Secure.html"> +android.provider.Settings.Secure</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.view.KeyEvent.html"> +android.view.KeyEvent</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.content.Context.html"> +android.content.Context</A></TD> +</TR> +<TR> + <TD ALIGN="center"><1</TD> + <TD><A HREF="android.view.View.html"> +android.view.View</A></TD> +</TR> +</TABLE> +<p style="font-size:10px">* See <a href="#calculation">Calculation of Change Percentages</a>, below.</p> +<br> +<h2 id="calculation">Calculation of Change Percentages</h2> +<p> +The percent change statistic reported for all elements in the "to" API Level specification is defined recursively as follows:</p> +<pre> +Percentage difference = 100 * (added + removed + 2*changed) + ----------------------------------- + sum of public elements in BOTH APIs +</pre> +<p>where <code>added</code> is the number of packages added, <code>removed</code> is the number of packages removed, and <code>changed</code> is the number of packages changed. +This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed. +The definition ensures that if all packages are removed and all new packages are +added, the change will be 100%.</p> + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY></HTML> diff --git a/docs/html/sdk/api_diff/15/changes/jdiff_topleftframe.html b/docs/html/sdk/api_diff/15/changes/jdiff_topleftframe.html new file mode 100644 index 000000000000..36f9836e4478 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/jdiff_topleftframe.html @@ -0,0 +1,63 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Android API Version Differences +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<table class="jdiffIndex" summary="Links to diff index files" BORDER="0" WIDTH="100%" cellspacing="0" cellpadding="0" style="margin:0"> +<TR> + <th class="indexHeader" nowrap> + Select a Diffs Index:</th> +</TR> +<TR> + <TD><FONT CLASS="indexText" size="-2"><A HREF="alldiffs_index_all.html" TARGET="bottomleftframe">All Differences</A></FONT><br></TD> +</TR> +<TR> + <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="packages_index_all.html" TARGET="bottomleftframe">By Package</A></FONT><br></TD> +</TR> +<TR> + <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="classes_index_all.html" TARGET="bottomleftframe">By Class</A></FONT><br></TD> +</TR> +<TR> + <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="constructors_index_all.html" TARGET="bottomleftframe">By Constructor</A></FONT><br></TD> +</TR> +<TR> + <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="methods_index_all.html" TARGET="bottomleftframe">By Method</A></FONT><br></TD> +</TR> +<TR> + <TD NOWRAP><FONT CLASS="indexText" size="-2"><A HREF="fields_index_all.html" TARGET="bottomleftframe">By Field</A></FONT><br></TD> +</TR> +</TABLE> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/methods_index_additions.html b/docs/html/sdk/api_diff/15/changes/methods_index_additions.html new file mode 100644 index 000000000000..260ec1e30c30 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/methods_index_additions.html @@ -0,0 +1,199 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Method Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="methods_index_all.html" class="staysblack">All Methods</a> + <br> +<font color="#999999">Removals</font> + <br> +<b>Additions</b> + <br> +<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.callOnClick_added()" class="hiddenlink" target="rightframe"><b>callOnClick</b> +()</A></nobr><br> +<nobr><A HREF="android.view.textservice.SpellCheckerSession.html#android.view.textservice.SpellCheckerSession.cancel_added()" class="hiddenlink" target="rightframe"><b>cancel</b> +()</A></nobr><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.fetchUuidsWithSdp_added()" class="hiddenlink" target="rightframe"><b>fetchUuidsWithSdp</b> +()</A></nobr><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.appwidget.AppWidgetHostView.html#android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget_added(android.content.Context, android.content.ComponentName, android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>getDefaultPaddingForWidget</b> +(<code>Context, ComponentName, Rect</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.getFeatures_added(java.util.Locale)" class="hiddenlink" target="rightframe"><b>getFeatures</b> +(<code>Locale</code>)</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollX_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollX</b> +()</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollY_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollY</b> +()</A></nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSelector_added()" class="hiddenlink" target="rightframe"><b>getSelector</b> +()</A></nobr><br> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.getUserVisibleHint_added()" class="hiddenlink" target="rightframe"><b>getUserVisibleHint</b> +()</A></nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.getUuids_added()" class="hiddenlink" target="rightframe"><b>getUuids</b> +()</A></nobr><br> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.getVideoStabilization_added()" class="hiddenlink" target="rightframe"><b>getVideoStabilization</b> +()</A></nobr><br> +<A NAME="H"></A> +<br><font size="+2">H</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.hasOnClickListeners_added()" class="hiddenlink" target="rightframe"><b>hasOnClickListeners</b> +()</A></nobr><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.isVideoStabilizationSupported_added()" class="hiddenlink" target="rightframe"><b>isVideoStabilizationSupported</b> +()</A></nobr><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.makeMainSelectorActivity_added(java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>makeMainSelectorActivity</b> +(<code>String, String</code>)</A></nobr><br> +<A NAME="O"></A> +<br><font size="+2">O</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.service.textservice.SpellCheckerService.Session.html#android.service.textservice.SpellCheckerService.Session.onClose_added()" class="hiddenlink" target="rightframe"><b>onClose</b> +()</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeechService.html#android.speech.tts.TextToSpeechService.onGetFeaturesForLanguage_added(java.lang.String, java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>onGetFeaturesForLanguage</b> +(<code>String, String, String</code>)</A></nobr><br> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.setContentDescription_added(int, java.lang.CharSequence)" class="hiddenlink" target="rightframe"><b>setContentDescription</b> +(<code>int, CharSequence</code>)</A></nobr><br> +<nobr><A HREF="android.graphics.SurfaceTexture.html#android.graphics.SurfaceTexture.setDefaultBufferSize_added(int, int)" class="hiddenlink" target="rightframe"><b>setDefaultBufferSize</b> +(<code>int, int</code>)</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollX_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollX</b> +(<code>int</code>)</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollY_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollY</b> +(<code>int</code>)</A></nobr><br> +<nobr><A HREF="android.service.wallpaper.WallpaperService.Engine.html#android.service.wallpaper.WallpaperService.Engine.setOffsetNotificationsEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setOffsetNotificationsEnabled</b> +(<code>boolean</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceProgressListener_added(android.speech.tts.UtteranceProgressListener)" class="hiddenlink" target="rightframe"><b>setOnUtteranceProgressListener</b> +(<code>UtteranceProgressListener</code>)</A></nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSelector_added(android.content.Intent)" class="hiddenlink" target="rightframe"><b>setSelector</b> +(<code>Intent</code>)</A></nobr><br> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.setUserVisibleHint_added(boolean)" class="hiddenlink" target="rightframe"><b>setUserVisibleHint</b> +(<code>boolean</code>)</A></nobr><br> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.setVideoStabilization_added(boolean)" class="hiddenlink" target="rightframe"><b>setVideoStabilization</b> +(<code>boolean</code>)</A></nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/methods_index_all.html b/docs/html/sdk/api_diff/15/changes/methods_index_all.html new file mode 100644 index 000000000000..2f0e7348593b --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/methods_index_all.html @@ -0,0 +1,205 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Method Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>Methods</b> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="C"></A> +<br><font size="+2">C</font> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.callOnClick_added()" class="hiddenlink" target="rightframe"><b>callOnClick</b> +()</A></nobr><br> +<nobr><A HREF="android.view.textservice.SpellCheckerSession.html#android.view.textservice.SpellCheckerSession.cancel_added()" class="hiddenlink" target="rightframe"><b>cancel</b> +()</A></nobr><br> +<A NAME="F"></A> +<br><font size="+2">F</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.fetchUuidsWithSdp_added()" class="hiddenlink" target="rightframe"><b>fetchUuidsWithSdp</b> +()</A></nobr><br> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.appwidget.AppWidgetHostView.html#android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget_added(android.content.Context, android.content.ComponentName, android.graphics.Rect)" class="hiddenlink" target="rightframe"><b>getDefaultPaddingForWidget</b> +(<code>Context, ComponentName, Rect</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.getFeatures_added(java.util.Locale)" class="hiddenlink" target="rightframe"><b>getFeatures</b> +(<code>Locale</code>)</A></nobr><br> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLayoutAlgorithm_changed()" class="hiddenlink" target="rightframe">getLayoutAlgorithm +()</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollX_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollX</b> +()</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.getMaxScrollY_added()" class="hiddenlink" target="rightframe"><b>getMaxScrollY</b> +()</A></nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.getSelector_added()" class="hiddenlink" target="rightframe"><b>getSelector</b> +()</A></nobr><br> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.getUserVisibleHint_added()" class="hiddenlink" target="rightframe"><b>getUserVisibleHint</b> +()</A></nobr><br> +<nobr><A HREF="android.bluetooth.BluetoothDevice.html#android.bluetooth.BluetoothDevice.getUuids_added()" class="hiddenlink" target="rightframe"><b>getUuids</b> +()</A></nobr><br> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.getVideoStabilization_added()" class="hiddenlink" target="rightframe"><b>getVideoStabilization</b> +()</A></nobr><br> +<A NAME="H"></A> +<br><font size="+2">H</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.view.View.html#android.view.View.hasOnClickListeners_added()" class="hiddenlink" target="rightframe"><b>hasOnClickListeners</b> +()</A></nobr><br> +<A NAME="I"></A> +<br><font size="+2">I</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.isVideoStabilizationSupported_added()" class="hiddenlink" target="rightframe"><b>isVideoStabilizationSupported</b> +()</A></nobr><br> +<A NAME="M"></A> +<br><font size="+2">M</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#O"><font size="-2">O</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.makeMainSelectorActivity_added(java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>makeMainSelectorActivity</b> +(<code>String, String</code>)</A></nobr><br> +<A NAME="O"></A> +<br><font size="+2">O</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.service.textservice.SpellCheckerService.Session.html#android.service.textservice.SpellCheckerService.Session.onClose_added()" class="hiddenlink" target="rightframe"><b>onClose</b> +()</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeechService.html#android.speech.tts.TextToSpeechService.onGetFeaturesForLanguage_added(java.lang.String, java.lang.String, java.lang.String)" class="hiddenlink" target="rightframe"><b>onGetFeaturesForLanguage</b> +(<code>String, String, String</code>)</A></nobr><br> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#C"><font size="-2">C</font></a> +<a href="#F"><font size="-2">F</font></a> +<a href="#G"><font size="-2">G</font></a> +<a href="#H"><font size="-2">H</font></a> +<a href="#I"><font size="-2">I</font></a> +<a href="#M"><font size="-2">M</font></a> +<a href="#O"><font size="-2">O</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.widget.RemoteViews.html#android.widget.RemoteViews.setContentDescription_added(int, java.lang.CharSequence)" class="hiddenlink" target="rightframe"><b>setContentDescription</b> +(<code>int, CharSequence</code>)</A></nobr><br> +<nobr><A HREF="android.graphics.SurfaceTexture.html#android.graphics.SurfaceTexture.setDefaultBufferSize_added(int, int)" class="hiddenlink" target="rightframe"><b>setDefaultBufferSize</b> +(<code>int, int</code>)</A></nobr><br> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLayoutAlgorithm_changed(android.webkit.WebSettings.LayoutAlgorithm)" class="hiddenlink" target="rightframe">setLayoutAlgorithm +(<code>LayoutAlgorithm</code>)</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollX_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollX</b> +(<code>int</code>)</A></nobr><br> +<nobr><A HREF="android.view.accessibility.AccessibilityRecord.html#android.view.accessibility.AccessibilityRecord.setMaxScrollY_added(int)" class="hiddenlink" target="rightframe"><b>setMaxScrollY</b> +(<code>int</code>)</A></nobr><br> +<nobr><A HREF="android.service.wallpaper.WallpaperService.Engine.html#android.service.wallpaper.WallpaperService.Engine.setOffsetNotificationsEnabled_added(boolean)" class="hiddenlink" target="rightframe"><b>setOffsetNotificationsEnabled</b> +(<code>boolean</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceCompletedListener_changed(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)" class="hiddenlink" target="rightframe">setOnUtteranceCompletedListener +(<code>OnUtteranceCompletedListener</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceProgressListener_added(android.speech.tts.UtteranceProgressListener)" class="hiddenlink" target="rightframe"><b>setOnUtteranceProgressListener</b> +(<code>UtteranceProgressListener</code>)</A></nobr><br> +<nobr><A HREF="android.content.Intent.html#android.content.Intent.setSelector_added(android.content.Intent)" class="hiddenlink" target="rightframe"><b>setSelector</b> +(<code>Intent</code>)</A></nobr><br> +<nobr><A HREF="android.app.Fragment.html#android.app.Fragment.setUserVisibleHint_added(boolean)" class="hiddenlink" target="rightframe"><b>setUserVisibleHint</b> +(<code>boolean</code>)</A></nobr><br> +<nobr><A HREF="android.hardware.Camera.Parameters.html#android.hardware.Camera.Parameters.setVideoStabilization_added(boolean)" class="hiddenlink" target="rightframe"><b>setVideoStabilization</b> +(<code>boolean</code>)</A></nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/methods_index_changes.html b/docs/html/sdk/api_diff/15/changes/methods_index_changes.html new file mode 100644 index 000000000000..d22fde31835e --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/methods_index_changes.html @@ -0,0 +1,77 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Method Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="methods_index_all.html" class="staysblack">All Methods</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<A NAME="G"></A> +<br><font size="+2">G</font> +<a href="#S"><font size="-2">S</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.getLayoutAlgorithm_changed()" class="hiddenlink" target="rightframe">getLayoutAlgorithm +()</A></nobr><br> +<A NAME="S"></A> +<br><font size="+2">S</font> +<a href="#G"><font size="-2">G</font></a> + <a href="#topheader"><font size="-2">TOP</font></a> +<p><div style="line-height:1.5em;color:black"> +<nobr><A HREF="android.webkit.WebSettings.html#android.webkit.WebSettings.setLayoutAlgorithm_changed(android.webkit.WebSettings.LayoutAlgorithm)" class="hiddenlink" target="rightframe">setLayoutAlgorithm +(<code>LayoutAlgorithm</code>)</A></nobr><br> +<nobr><A HREF="android.speech.tts.TextToSpeech.html#android.speech.tts.TextToSpeech.setOnUtteranceCompletedListener_changed(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener)" class="hiddenlink" target="rightframe">setOnUtteranceCompletedListener +(<code>OnUtteranceCompletedListener</code>)</A></nobr><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/methods_index_removals.html b/docs/html/sdk/api_diff/15/changes/methods_index_removals.html new file mode 100644 index 000000000000..b5aea4f9d673 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/methods_index_removals.html @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Method Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Methods" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="methods_index_all.html" class="staysblack">All Methods</a> + <br> +<font color="#999999">Removals</font> + <br> +<A HREF="methods_index_additions.html"xclass="hiddenlink">Additions</A> + <br> +<A HREF="methods_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/packages_index_additions.html b/docs/html/sdk/api_diff/15/changes/packages_index_additions.html new file mode 100644 index 000000000000..1776064fe6a9 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/packages_index_additions.html @@ -0,0 +1,63 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Package Additions Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="packages_index_all.html" class="staysblack">All Packages</a> + <br> +<font color="#999999">Removals</font> + <br> +<font color="#999999">Additions</font> + <br> +<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<br> +<div id="indexTableEntries"> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/packages_index_all.html b/docs/html/sdk/api_diff/15/changes/packages_index_all.html new file mode 100644 index 000000000000..ef665684fc5f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/packages_index_all.html @@ -0,0 +1,85 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Package Differences Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<b>Packages</b> + <br> +<font color="#999999">Removals</font> + <br> +<font color="#999999">Additions</font> + <br> +<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<br> +<div id="indexTableEntries"> +<A NAME="A"></A> +<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br> +<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br> +<A HREF="pkg_android.appwidget.html" class="hiddenlink" target="rightframe">android.appwidget</A><br> +<A HREF="pkg_android.bluetooth.html" class="hiddenlink" target="rightframe">android.bluetooth</A><br> +<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br> +<A HREF="pkg_android.database.html" class="hiddenlink" target="rightframe">android.database</A><br> +<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br> +<A HREF="pkg_android.hardware.html" class="hiddenlink" target="rightframe">android.hardware</A><br> +<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br> +<A HREF="pkg_android.opengl.html" class="hiddenlink" target="rightframe">android.opengl</A><br> +<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br> +<A HREF="pkg_android.provider.html" class="hiddenlink" target="rightframe">android.provider</A><br> +<A HREF="pkg_android.service.textservice.html" class="hiddenlink" target="rightframe">android.service.textservice</A><br> +<A HREF="pkg_android.service.wallpaper.html" class="hiddenlink" target="rightframe">android.service.wallpaper</A><br> +<A HREF="pkg_android.speech.tts.html" class="hiddenlink" target="rightframe">android.speech.tts</A><br> +<A HREF="pkg_android.text.style.html" class="hiddenlink" target="rightframe">android.text.style</A><br> +<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br> +<A HREF="pkg_android.view.accessibility.html" class="hiddenlink" target="rightframe">android.view.accessibility</A><br> +<A HREF="pkg_android.view.textservice.html" class="hiddenlink" target="rightframe">android.view.textservice</A><br> +<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br> +<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/packages_index_changes.html b/docs/html/sdk/api_diff/15/changes/packages_index_changes.html new file mode 100644 index 000000000000..a2b0a1915225 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/packages_index_changes.html @@ -0,0 +1,85 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Package Changes Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="packages_index_all.html" class="staysblack">All Packages</a> + <br> +<font color="#999999">Removals</font> + <br> +<font color="#999999">Additions</font> + <br> +<b>Changes</b> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<br> +<div id="indexTableEntries"> +<A NAME="A"></A> +<A HREF="pkg_android.html" class="hiddenlink" target="rightframe">android</A><br> +<A HREF="pkg_android.app.html" class="hiddenlink" target="rightframe">android.app</A><br> +<A HREF="pkg_android.appwidget.html" class="hiddenlink" target="rightframe">android.appwidget</A><br> +<A HREF="pkg_android.bluetooth.html" class="hiddenlink" target="rightframe">android.bluetooth</A><br> +<A HREF="pkg_android.content.html" class="hiddenlink" target="rightframe">android.content</A><br> +<A HREF="pkg_android.database.html" class="hiddenlink" target="rightframe">android.database</A><br> +<A HREF="pkg_android.graphics.html" class="hiddenlink" target="rightframe">android.graphics</A><br> +<A HREF="pkg_android.hardware.html" class="hiddenlink" target="rightframe">android.hardware</A><br> +<A HREF="pkg_android.media.html" class="hiddenlink" target="rightframe">android.media</A><br> +<A HREF="pkg_android.opengl.html" class="hiddenlink" target="rightframe">android.opengl</A><br> +<A HREF="pkg_android.os.html" class="hiddenlink" target="rightframe">android.os</A><br> +<A HREF="pkg_android.provider.html" class="hiddenlink" target="rightframe">android.provider</A><br> +<A HREF="pkg_android.service.textservice.html" class="hiddenlink" target="rightframe">android.service.textservice</A><br> +<A HREF="pkg_android.service.wallpaper.html" class="hiddenlink" target="rightframe">android.service.wallpaper</A><br> +<A HREF="pkg_android.speech.tts.html" class="hiddenlink" target="rightframe">android.speech.tts</A><br> +<A HREF="pkg_android.text.style.html" class="hiddenlink" target="rightframe">android.text.style</A><br> +<A HREF="pkg_android.view.html" class="hiddenlink" target="rightframe">android.view</A><br> +<A HREF="pkg_android.view.accessibility.html" class="hiddenlink" target="rightframe">android.view.accessibility</A><br> +<A HREF="pkg_android.view.textservice.html" class="hiddenlink" target="rightframe">android.view.textservice</A><br> +<A HREF="pkg_android.webkit.html" class="hiddenlink" target="rightframe">android.webkit</A><br> +<A HREF="pkg_android.widget.html" class="hiddenlink" target="rightframe">android.widget</A><br> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/packages_index_removals.html b/docs/html/sdk/api_diff/15/changes/packages_index_removals.html new file mode 100644 index 000000000000..9fd0f7e9a8e7 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/packages_index_removals.html @@ -0,0 +1,63 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +Package Removals Index +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY class="gc-documentation" style="padding:12px;"> +<a NAME="topheader"></a> +<table summary="Index for Packages" width="100%" class="jdiffIndex" border="0" cellspacing="0" cellpadding="0" style="padding-bottom:0;margin-bottom:0;"> + <tr> + <th class="indexHeader"> + Filter the Index: + </th> + </tr> + <tr> + <td class="indexText" style="line-height:1.3em;padding-left:2em;"> +<a href="packages_index_all.html" class="staysblack">All Packages</a> + <br> +<font color="#999999">Removals</font> + <br> +<font color="#999999">Additions</font> + <br> +<A HREF="packages_index_changes.html"xclass="hiddenlink">Changes</A> + </td> + </tr> +</table> +<div id="indexTableCaption" style="background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;"> +Listed as: <span style="color:#069"><strong>Added</strong></span>, <span style="color:#069"><strike>Removed</strike></span>, <span style="color:#069">Changed</span></font> +</div> +<br> +<div id="indexTableEntries"> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.app.html b/docs/html/sdk/api_diff/15/changes/pkg_android.app.html new file mode 100644 index 000000000000..1b2e65b1aee9 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.app.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.app +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/app/package-summary.html" target="_top"><font size="+1"><code>android.app</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Fragment"></A> + <nobr><A HREF="android.app.Fragment.html">Fragment</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.appwidget.html b/docs/html/sdk/api_diff/15/changes/pkg_android.appwidget.html new file mode 100644 index 000000000000..46bc1dc03e09 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.appwidget.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.appwidget +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/appwidget/package-summary.html" target="_top"><font size="+1"><code>android.appwidget</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="AppWidgetHostView"></A> + <nobr><A HREF="android.appwidget.AppWidgetHostView.html">AppWidgetHostView</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.bluetooth.html b/docs/html/sdk/api_diff/15/changes/pkg_android.bluetooth.html new file mode 100644 index 000000000000..16e9db7369cd --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.bluetooth.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.bluetooth +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/bluetooth/package-summary.html" target="_top"><font size="+1"><code>android.bluetooth</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="BluetoothDevice"></A> + <nobr><A HREF="android.bluetooth.BluetoothDevice.html">BluetoothDevice</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.content.html b/docs/html/sdk/api_diff/15/changes/pkg_android.content.html new file mode 100644 index 000000000000..036a96e03883 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.content.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.content +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/content/package-summary.html" target="_top"><font size="+1"><code>android.content</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Context"></A> + <nobr><A HREF="android.content.Context.html">Context</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Intent"></A> + <nobr><A HREF="android.content.Intent.html">Intent</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.database.html b/docs/html/sdk/api_diff/15/changes/pkg_android.database.html new file mode 100644 index 000000000000..a8a2963ce37d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.database.html @@ -0,0 +1,134 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.database +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/database/package-summary.html" target="_top"><font size="+1"><code>android.database</code></font></A> +</H2> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CrossProcessCursorWrapper"></A> + <nobr><A HREF="../../../../reference/android/database/CrossProcessCursorWrapper.html" target="_top"><code>CrossProcessCursorWrapper</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CursorWindow"></A> + <nobr><A HREF="android.database.CursorWindow.html">CursorWindow</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.graphics.html b/docs/html/sdk/api_diff/15/changes/pkg_android.graphics.html new file mode 100644 index 000000000000..838846647c20 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.graphics.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.graphics +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/graphics/package-summary.html" target="_top"><font size="+1"><code>android.graphics</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="SurfaceTexture"></A> + <nobr><A HREF="android.graphics.SurfaceTexture.html">SurfaceTexture</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.hardware.html b/docs/html/sdk/api_diff/15/changes/pkg_android.hardware.html new file mode 100644 index 000000000000..7b0273533f9a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.hardware.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.hardware +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/hardware/package-summary.html" target="_top"><font size="+1"><code>android.hardware</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Camera.Parameters"></A> + <nobr><A HREF="android.hardware.Camera.Parameters.html">Camera.Parameters</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.html b/docs/html/sdk/api_diff/15/changes/pkg_android.html new file mode 100644 index 000000000000..3af011e81589 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/package-summary.html" target="_top"><font size="+1"><code>android</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Manifest.permission"></A> + <nobr><A HREF="android.Manifest.permission.html">Manifest.permission</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.media.html b/docs/html/sdk/api_diff/15/changes/pkg_android.media.html new file mode 100644 index 000000000000..e537fc9a326d --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.media.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.media +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/media/package-summary.html" target="_top"><font size="+1"><code>android.media</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CamcorderProfile"></A> + <nobr><A HREF="android.media.CamcorderProfile.html">CamcorderProfile</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="MediaMetadataRetriever"></A> + <nobr><A HREF="android.media.MediaMetadataRetriever.html">MediaMetadataRetriever</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.opengl.html b/docs/html/sdk/api_diff/15/changes/pkg_android.opengl.html new file mode 100644 index 000000000000..dff132d2938a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.opengl.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.opengl +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/opengl/package-summary.html" target="_top"><font size="+1"><code>android.opengl</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="GLES11Ext"></A> + <nobr><A HREF="android.opengl.GLES11Ext.html">GLES11Ext</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.os.html b/docs/html/sdk/api_diff/15/changes/pkg_android.os.html new file mode 100644 index 000000000000..ba005a0f60e6 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.os.html @@ -0,0 +1,148 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.os +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/os/package-summary.html" target="_top"><font size="+1"><code>android.os</code></font></A> +</H2> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="TransactionTooLargeException"></A> + <nobr><A HREF="../../../../reference/android/os/TransactionTooLargeException.html" target="_top"><code>TransactionTooLargeException</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes and Interfaces" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes and Interfaces</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Build.VERSION_CODES"></A> + <nobr><A HREF="android.os.Build.VERSION_CODES.html">Build.VERSION_CODES</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="IBinder"></A> + <nobr><A HREF="android.os.IBinder.html"><I>IBinder</I></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="RemoteException"></A> + <nobr><A HREF="android.os.RemoteException.html">RemoteException</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.provider.html b/docs/html/sdk/api_diff/15/changes/pkg_android.provider.html new file mode 100644 index 000000000000..93209facf450 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.provider.html @@ -0,0 +1,218 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.provider +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/provider/package-summary.html" target="_top"><font size="+1"><code>android.provider</code></font></A> +</H2> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Classes and Interfaces" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Classes and Interfaces</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CalendarContract.Colors"></A> + <nobr><A HREF="../../../../reference/android/provider/CalendarContract.Colors.html" target="_top"><code>CalendarContract.Colors</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CalendarContract.ColorsColumns"></A> + <nobr><A HREF="../../../../reference/android/provider/CalendarContract.ColorsColumns.html" target="_top"><code><I>CalendarContract.ColorsColumns</I></code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.Contacts.StreamItems"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.Contacts.StreamItems.html" target="_top"><code>ContactsContract.Contacts.<br>StreamItems</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.RawContacts.StreamItems"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.RawContacts.StreamItems.html" target="_top"><code>ContactsContract.RawContacts.<br>StreamItems</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.StreamItemPhotos"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.StreamItemPhotos.html" target="_top"><code>ContactsContract.StreamItemPhotos</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.StreamItemPhotosColumns"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.StreamItemPhotosColumns.html" target="_top"><code><I>ContactsContract.StreamItemPhotosColumns</I></code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.StreamItems"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.StreamItems.html" target="_top"><code>ContactsContract.StreamItems</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.StreamItems.StreamItemPhotos"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.StreamItems.StreamItemPhotos.html" target="_top"><code>ContactsContract.StreamItems.<br>StreamItemPhotos</code></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="ContactsContract.StreamItemsColumns"></A> + <nobr><A HREF="../../../../reference/android/provider/ContactsContract.StreamItemsColumns.html" target="_top"><code><I>ContactsContract.StreamItemsColumns</I></code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes and Interfaces" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes and Interfaces</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CalendarContract.AttendeesColumns"></A> + <nobr><A HREF="android.provider.CalendarContract.AttendeesColumns.html"><I>CalendarContract.AttendeesColumns</I></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CalendarContract.CalendarColumns"></A> + <nobr><A HREF="android.provider.CalendarContract.CalendarColumns.html"><I>CalendarContract.CalendarColumns</I></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="CalendarContract.EventsColumns"></A> + <nobr><A HREF="android.provider.CalendarContract.EventsColumns.html"><I>CalendarContract.EventsColumns</I></A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="MediaStore"></A> + <nobr><A HREF="android.provider.MediaStore.html">MediaStore</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="Settings.Secure"></A> + <nobr><A HREF="android.provider.Settings.Secure.html">Settings.Secure</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.service.textservice.html b/docs/html/sdk/api_diff/15/changes/pkg_android.service.textservice.html new file mode 100644 index 000000000000..5a14d82a5fad --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.service.textservice.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.service.textservice +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/service/textservice/package-summary.html" target="_top"><font size="+1"><code>android.service.textservice</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="SpellCheckerService.Session"></A> + <nobr><A HREF="android.service.textservice.SpellCheckerService.Session.html">SpellCheckerService.Session</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.service.wallpaper.html b/docs/html/sdk/api_diff/15/changes/pkg_android.service.wallpaper.html new file mode 100644 index 000000000000..b6f52e4548e7 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.service.wallpaper.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.service.wallpaper +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/service/wallpaper/package-summary.html" target="_top"><font size="+1"><code>android.service.wallpaper</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="WallpaperService.Engine"></A> + <nobr><A HREF="android.service.wallpaper.WallpaperService.Engine.html">WallpaperService.Engine</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.speech.tts.html b/docs/html/sdk/api_diff/15/changes/pkg_android.speech.tts.html new file mode 100644 index 000000000000..1afe9e3a842a --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.speech.tts.html @@ -0,0 +1,148 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.speech.tts +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/speech/tts/package-summary.html" target="_top"><font size="+1"><code>android.speech.tts</code></font></A> +</H2> +<p> +<a NAME="Added"></a> +<TABLE summary="Added Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Added Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="UtteranceProgressListener"></A> + <nobr><A HREF="../../../../reference/android/speech/tts/UtteranceProgressListener.html" target="_top"><code>UtteranceProgressListener</code></A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="TextToSpeech"></A> + <nobr><A HREF="android.speech.tts.TextToSpeech.html">TextToSpeech</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="TextToSpeech.Engine"></A> + <nobr><A HREF="android.speech.tts.TextToSpeech.Engine.html">TextToSpeech.Engine</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="TextToSpeechService"></A> + <nobr><A HREF="android.speech.tts.TextToSpeechService.html">TextToSpeechService</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.text.style.html b/docs/html/sdk/api_diff/15/changes/pkg_android.text.style.html new file mode 100644 index 000000000000..5936ed56cae5 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.text.style.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.text.style +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/text/style/package-summary.html" target="_top"><font size="+1"><code>android.text.style</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="SuggestionSpan"></A> + <nobr><A HREF="android.text.style.SuggestionSpan.html">SuggestionSpan</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.view.accessibility.html b/docs/html/sdk/api_diff/15/changes/pkg_android.view.accessibility.html new file mode 100644 index 000000000000..7cca96d5df55 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.view.accessibility.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.accessibility +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/view/accessibility/package-summary.html" target="_top"><font size="+1"><code>android.view.accessibility</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="AccessibilityRecord"></A> + <nobr><A HREF="android.view.accessibility.AccessibilityRecord.html">AccessibilityRecord</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.view.html b/docs/html/sdk/api_diff/15/changes/pkg_android.view.html new file mode 100644 index 000000000000..a9c91e07cb5e --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.view.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/view/package-summary.html" target="_top"><font size="+1"><code>android.view</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="KeyEvent"></A> + <nobr><A HREF="android.view.KeyEvent.html">KeyEvent</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="View"></A> + <nobr><A HREF="android.view.View.html">View</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.view.textservice.html b/docs/html/sdk/api_diff/15/changes/pkg_android.view.textservice.html new file mode 100644 index 000000000000..2d874b2f6226 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.view.textservice.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.view.textservice +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/view/textservice/package-summary.html" target="_top"><font size="+1"><code>android.view.textservice</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="SpellCheckerSession"></A> + <nobr><A HREF="android.view.textservice.SpellCheckerSession.html">SpellCheckerSession</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="SuggestionsInfo"></A> + <nobr><A HREF="android.view.textservice.SuggestionsInfo.html">SuggestionsInfo</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.webkit.html b/docs/html/sdk/api_diff/15/changes/pkg_android.webkit.html new file mode 100644 index 000000000000..ad6337812138 --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.webkit.html @@ -0,0 +1,126 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.webkit +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/webkit/package-summary.html" target="_top"><font size="+1"><code>android.webkit</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="WebSettings"></A> + <nobr><A HREF="android.webkit.WebSettings.html">WebSettings</A></nobr> + </TD> + <TD> </TD> +</TR> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="WebSettings.LayoutAlgorithm"></A> + <nobr><A HREF="android.webkit.WebSettings.LayoutAlgorithm.html">WebSettings.LayoutAlgorithm</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/changes/pkg_android.widget.html b/docs/html/sdk/api_diff/15/changes/pkg_android.widget.html new file mode 100644 index 000000000000..02e4b8069f0f --- /dev/null +++ b/docs/html/sdk/api_diff/15/changes/pkg_android.widget.html @@ -0,0 +1,119 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<HTML style="overflow:auto;"> +<HEAD> +<meta name="generator" content="JDiff v1.1.0"> +<!-- Generated by the JDiff Javadoc doclet --> +<!-- (http://www.jdiff.org) --> +<meta name="description" content="JDiff is a Javadoc doclet which generates an HTML report of all the packages, classes, constructors, methods, and fields which have been removed, added or changed in any way, including their documentation, when two APIs are compared."> +<meta name="keywords" content="diff, jdiff, javadiff, java diff, java difference, API difference, difference between two APIs, API diff, Javadoc, doclet"> +<TITLE> +android.widget +</TITLE> +<link href="../../../../assets/android-developer-docs.css" rel="stylesheet" type="text/css" /> +<link href="../stylesheet-jdiff.css" rel="stylesheet" type="text/css" /> +<noscript> +<style type="text/css"> +body{overflow:auto;} +#body-content{position:relative; top:0;} +#doc-content{overflow:visible;border-left:3px solid #666;} +#side-nav{padding:0;} +#side-nav .toggle-list ul {display:block;} +#resize-packages-nav{border-bottom:3px solid #666;} +</style> +</noscript> +<style type="text/css"> +</style> +</HEAD> +<BODY> +<!-- Start of nav bar --> +<a name="top"></a> +<div id="header" style="margin-bottom:0;padding-bottom:0;"> +<div id="headerLeft"> +<a href="../../../../index.html" tabindex="-1" target="_top"><img src="../../../../assets/images/bg_logo.png" alt="Android Developers" /></a> +</div> + <div id="headerRight"> + <div id="headerLinks"> +<!-- <img src="/assets/images/icon_world.jpg" alt="" /> --> +<span class="text"> +<!-- <a href="#">English</a> | --> +<nobr><a href="http://developer.android.com" target="_top">Android Developers</a> | <a href="http://www.android.com" target="_top">Android.com</a></nobr> +</span> +</div> + <div class="and-diff-id" style="margin-top:6px;margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td colspan="2" class="diffspechead">API Diff Specification</td> + </tr> + <tr> + <td class="diffspec" style="padding-top:.25em">To Level:</td> + <td class="diffvaluenew" style="padding-top:.25em">15</td> + </tr> + <tr> + <td class="diffspec">From Level:</td> + <td class="diffvalueold">14</td> + </tr> + <tr> + <td class="diffspec">Generated</td> + <td class="diffvalue">2011.12.12 18:47</td> + </tr> + </table> + </div><!-- End and-diff-id --> + <div class="and-diff-id" style="margin-right:8px;"> + <table class="diffspectable"> + <tr> + <td class="diffspec" colspan="2"><a href="jdiff_statistics.html">Statistics</a> + </tr> + </table> + </div> <!-- End and-diff-id --> + </div> <!-- End headerRight --> + </div> <!-- End header --> +<div id="body-content" xstyle="padding:12px;padding-right:18px;"> +<div id="doc-content" style="position:relative;"> +<div id="mainBodyFluid"> +<H2> +Package <A HREF="../../../../reference/android/widget/package-summary.html" target="_top"><font size="+1"><code>android.widget</code></font></A> +</H2> +<p> +<a NAME="Changed"></a> +<TABLE summary="Changed Classes" WIDTH="100%"> +<TR> + <TH VALIGN="TOP" COLSPAN=2>Changed Classes</FONT></TD> +</TH> +<TR BGCOLOR="#FFFFFF" CLASS="TableRowColor"> + <TD VALIGN="TOP" WIDTH="25%"> + <A NAME="RemoteViews"></A> + <nobr><A HREF="android.widget.RemoteViews.html">RemoteViews</A></nobr> + </TD> + <TD> </TD> +</TR> +</TABLE> + + </div> + <div id="footer"> + <div id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> Creative Commons Attribution 2.5</a>. + For details and restrictions, see the <a href="/license.html">Content License</a>. + </div> + <div id="footerlinks"> + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> - + <a href="http://www.android.com/privacy.html">Privacy Policy</a> - + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + </div> + </div> <!-- end footer --> + </div><!-- end doc-content --> + </div> <!-- end body-content --> +<script src="http://www.google-analytics.com/ga.js" type="text/javascript"> +</script> +<script type="text/javascript"> + try { + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._setAllowAnchor(true); + pageTracker._initData(); + pageTracker._trackPageview(); + } catch(e) {} +</script> +</BODY> +</HTML> diff --git a/docs/html/sdk/api_diff/15/stylesheet-jdiff.css b/docs/html/sdk/api_diff/15/stylesheet-jdiff.css new file mode 100644 index 000000000000..edafaa3da3e5 --- /dev/null +++ b/docs/html/sdk/api_diff/15/stylesheet-jdiff.css @@ -0,0 +1,44 @@ + +/* (http://www.jdiff.org) */ + +div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;} +table.diffspectable {border:1px;padding:0px;margin:0px;} +.diffspechead {background-color:#eee;} +.diffspectable tr {border:0px;padding:0px;} +.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;} +td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvaluenew {color:green;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;} +td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;} +tt {font-size:11pt;font-family:monospace;} +.indexHeader { + font-size:96%; + line-height:.8em;} +.jdiffIndex td { + font-size:96%; + xline-height:.8em; + padding:2px; + padding-left:1em;} +.indexText { + font-size:100%; + padding-left:1em;} +#indexTableCaption { + font-size:96%; + margin-top:.25em; + margin-bottom:0; + } +.hiddenlink { + font-size:96%; + line-height:.8em; + text-decoration:none;} +a { + text-decoration:none;} +a:hover { + text-decoration:underline;} +.indexBox { + border: 1px solid red; + margin:1em 0 0 0;} +.letterIndexHead { + font-size: 1.5em;font-weight:9; + margin:0 0 0em 0; + border: 1px solid red;} diff --git a/docs/html/sdk/eclipse-adt.jd b/docs/html/sdk/eclipse-adt.jd index 50b20cea9e64..2445bffa92a2 100644 --- a/docs/html/sdk/eclipse-adt.jd +++ b/docs/html/sdk/eclipse-adt.jd @@ -1,8 +1,8 @@ page.title=ADT Plugin for Eclipse -adt.zip.version=15.0.1 -adt.zip.download=ADT-15.0.1.zip -adt.zip.bytes=6752327 -adt.zip.checksum=2c12a71d7124aa512b8ee016e19c0e69 +adt.zip.version=16.0.0 +adt.zip.download=ADT-16.0.0.zip +adt.zip.bytes=6999205 +adt.zip.checksum=b7e512572580291279469845386b31b6 @jd:body @@ -109,18 +109,49 @@ padding: .25em 1em; </style> - <div class="toggleable opened"> <a href="#" onclick="return toggleDiv(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px" /> +ADT 16.0.0</a> <em>(December 2011)</em> + <div class="toggleme"> +<dl> + <dt>Dependencies:</dt> + + <dd> + <ul> + <li>Eclipse Helios (Version 3.6) or higher is required for ADT +16.0.0.</li> + <li>ADT 16.0.0 is designed for use with <a +href="{@docRoot}sdk/tools-notes.html">SDK Tools r16</a>. If you haven't already installed SDK Tools +r16 into your SDK, use the Android SDK Manager to do so.</li> + </ul> + </dd> + + <dt>General improvements:</dt> + <dd> + <ul> + <li>Added Lint tools to detect common errors in Android projects. (<a +href="http://tools.android.com/recent/lint">more info</a>)</li> + </ul> + </dd> +</dl> + +</div> +</div> + + +<div class="toggleable closed"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" +width="9px" /> ADT 15.0.1</a> <em>(November 2011)</em> <div class="toggleme"> <dl> <dt>Dependencies:</dt> <dd>ADT 15.0.1 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r15</a>. - If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK and AVD Manager to + If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK Manager to do so.</dd> <dt>Bug fixes:</dt> @@ -154,7 +185,7 @@ ADT 15.0.0</a> <em>(October 2011)</em> <dt>Dependencies:</dt> <dd>ADT 15.0.0 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r15</a>. -If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK and AVD Manager to +If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK Manager to do so.</dd> <dt>Bug fixes:</dt> @@ -185,10 +216,10 @@ ADT 14.0.0</a> <em>(October 2011)</em> <dt>Dependencies:</dt> <dd>ADT 14.0.0 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r14</a>. -If you haven't already installed SDK Tools r14 into your SDK, use the Android SDK and AVD Manager to +If you haven't already installed SDK Tools r14 into your SDK, use the Android SDK Manager to do so.</dd> -<dt>Build system</dt> +<dt>Build system:</dt> <dd> <ul> <li>Changed <code>default.properties</code> to <code>project.properties</code> and @@ -211,7 +242,7 @@ see the <a href="http://tools.android.com/recent/buildchangesinrevision14">Andro site</a>.</p> </dd> -<dt>General improvements</dt> +<dt>General improvements:</dt> <dd> <ul> @@ -236,7 +267,7 @@ and deleted without affecting the master copy </ul> </dd> -<dt>XML and Java editors</dt> +<dt>XML and Java editors:</dt> <dd> <ul> <li>Added a new XML formatter that formats all XML files according to the @@ -255,7 +286,7 @@ href="http://tools.android.com/recent/xmleditingimprovements">more info</a>).</l </ul> </dd> -<dt>Layout editor</dt> +<dt>Layout editor:</dt> <dd> <ul> <li>Added tooltip feedback for dragging and resizing operations. For @@ -281,7 +312,7 @@ href="http://tools.android.com/recent/layouteditorcontextmenuimprovements">more </ul> </dd> -<dt>Bug fixes</dt> +<dt>Bug fixes:</dt> <dd>Fixed many bugs and added <a href="http://tools.android.com/recent/miscellaneousrecentfixes">minor improvements</a>, in particular some <a href="http://tools.android.com/recent/linuxfixes">critical bug fixes on @@ -324,7 +355,7 @@ the Android SDK and AVD Manager to do so.</dd> </ul> </dd> -<dt>Build system</dt> +<dt>Build system:</dt> <dd> <ul> <li id="build-option">A new option lets you disable the packaging step in the automatic @@ -336,7 +367,7 @@ the Android SDK and AVD Manager to do so.</dd> </ul> </dd> -<dt>Bug fixes</dt> +<dt>Bug fixes:</dt> <dd>Many bug fixes are part of this release (<a href="http://tools.android.com/recent/adt12bugfixroundup">more info</a>).</dd> @@ -928,7 +959,7 @@ Manager to download the latest SDK Tools into your SDK. For more information, see <a href="{@docRoot}sdk/adding-components.html">Adding SDK Components</a>.</p> </dd> -<dt>General Notes:</dt> +<dt>General notes:</dt> <dd> <ul> <li>AVD Launch dialog now shows scale value.</li> @@ -974,7 +1005,7 @@ bigger than the screen.</li> </ul> </dd> -<dt>DDMS Integration:</dt> +<dt>DDMS integration:</dt> <dd> <ul> <li>Includes the improvements from the standlone DDMS, revision 3.</li> diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 193066bab310..65a1f465c475 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -1,21 +1,21 @@ page.title=Android SDK sdk.redirect=0 -sdk.win_installer=installer_r15-windows.exe -sdk.win_installer_bytes=33902520 -sdk.win_installer_checksum=ee8481cb86a6646a4d963d5142902c5c +sdk.win_installer=installer_r16-windows.exe +sdk.win_installer_bytes=29561554 +sdk.win_installer_checksum=3521dda4904886b05980590f83cf3469 -sdk.win_download=android-sdk_r15-windows.zip -sdk.win_bytes=33895447 -sdk.win_checksum=cc2aadf7120d12b574981461736a96e9 +sdk.win_download=android-sdk_r16-windows.zip +sdk.win_bytes=29562413 +sdk.win_checksum=6b926d0c0a871f1a946e65259984701a -sdk.mac_download=android-sdk_r15-macosx.zip -sdk.mac_bytes=30469921 -sdk.mac_checksum=03d2cdd3565771e8c7a438f1c40cc8a5 +sdk.mac_download=android-sdk_r16-macosx.zip +sdk.mac_bytes=26158334 +sdk.mac_checksum=d1dc2b6f13eed5e3ce5cf26c4e4c47aa -sdk.linux_download=android-sdk_r15-linux.tgz -sdk.linux_bytes=26124434 -sdk.linux_checksum=f529681fd1eda11c6e1e1d44b42c1432 +sdk.linux_download=android-sdk_r16-linux.tgz +sdk.linux_bytes=22048174 +sdk.linux_checksum=3ba457f731d51da3741c29c8830a4583 @jd:body diff --git a/docs/html/sdk/requirements.jd b/docs/html/sdk/requirements.jd index f12d0aa68ed9..c970f6c9c0be 100644 --- a/docs/html/sdk/requirements.jd +++ b/docs/html/sdk/requirements.jd @@ -24,8 +24,8 @@ Android applications using the Android SDK. </p> <h4 style="margin-top:.25em"><em>Eclipse IDE</em></h4> <ul> - <li>Eclipse 3.5 (Galileo) or greater -<p class="note"><strong>Note:</strong> Eclipse 3.4 (Ganymede) is no longer + <li>Eclipse 3.6 (Helios) or greater +<p class="note"><strong>Note:</strong> Eclipse 3.5 (Galileo) is no longer supported with the latest version of ADT.</p></li> <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included in most Eclipse IDE packages) </li> @@ -37,7 +37,7 @@ developing Android applications, we recommend that you install one of these packages: </p> <ul> <li>Eclipse IDE for Java Developers</li> - <li>Eclipse Classic (versions 3.5.1 and higher)</li> + <li>Eclipse Classic</li> <li>Eclipse IDE for Java EE Developers</li> </ul> </li> diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs index 0ae2c6dba37b..f0651ea2c047 100644 --- a/docs/html/sdk/sdk_toc.cs +++ b/docs/html/sdk/sdk_toc.cs @@ -76,11 +76,11 @@ class="new">new!</span></li> </ul> <ul> <li class="toggle-list"> - <div><a href="<?cs var:toroot ?>sdk/android-4.0.html"> - <span class="en">Android 4.0 Platform</span></a> <span class="new">new!</span></div> + <div><a href="<?cs var:toroot ?>sdk/android-4.0-highlights.html"> + <span class="en">Android 4.0.x Platform</span></a> <span class="new">new!</span></div> <ul> - <li><a href="<?cs var:toroot ?>sdk/android-4.0-highlights.html">Platform Highlights</a></li> - <li><a href="<?cs var:toroot ?>sdk/api_diff/14/changes.html">API Differences Report »</a></li> + <li><a href="<?cs var:toroot ?>sdk/android-4.0.3.html">Android 4.0.3 Platform</a> <span class="new">new!</span></li> + <li><a href="<?cs var:toroot ?>sdk/android-4.0.html">Android 4.0 Platform</a> </li> </ul> </li> <li class="toggle-list"> @@ -150,7 +150,7 @@ class="new">new!</span></li> </li> </ul> <ul> - <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r15</a> <span + <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r16</a> <span class="new">new!</span></li> <li><a href="<?cs var:toroot ?>sdk/win-usb.html">Google USB Driver, r4</a></li> <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Support Package, r4</a> @@ -169,7 +169,7 @@ class="new">new!</span></li> <span style="display:none" class="zh-TW"></span> </h2> <ul> - <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 15.0.1 + <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 16.0.0 <span style="display:none" class="de"></span> <span style="display:none" class="es"></span> <span style="display:none" class="fr"></span> diff --git a/docs/html/sdk/tools-notes.jd b/docs/html/sdk/tools-notes.jd index cd03d9fa800d..9a63467274cb 100644 --- a/docs/html/sdk/tools-notes.jd +++ b/docs/html/sdk/tools-notes.jd @@ -9,7 +9,7 @@ href="{@docRoot}sdk/index.html">SDK starter package</a> installs the latest revision of the SDK Tools in the <code><sdk>/tools</code> directory.</p> <p>If you are already using the SDK and you want to update to the latest version -of the SDK Tools, use the <em>Android SDK and AVD Manager</em> to get the +of the SDK Tools, use the <em>Android SDK Manager</em> to get the update, rather than downloading a new SDK starter package. For more information about how to update, see <a href="{@docRoot}sdk/adding-components.html#UpdatingComponents">Updating SDK @@ -20,8 +20,7 @@ Components</a>.</p> <p>The sections below provide notes about successive releases of the SDK Tools, as denoted by revision number. To determine what revision of the SDK -Tools you are using, refer to the "Installed Packages" listing in the Android SDK -and AVD Manager. </p> +Tools you are using, refer to the "Installed Packages" listing in the Android SDK Manager. </p> <p>For a summary of all known issues in SDK Tools, see <a href="http://tools.android.com/knownissues">http://tools.android.com/knownissues</a>.</p> @@ -69,7 +68,57 @@ padding: .25em 1em; <div class="toggleable opened"> <a href="#" onclick="return toggleDiv(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" - width="9px" />SDK Tools, Revision 15</a> <em>(October 2011)</em> + width="9px" /> + SDK Tools, Revision 16</a> <em>(December 2011)</em> + + <div class="toggleme"> + <p class="caution"><strong>Important:</strong> To download the new Android + 4.0 system components from the Android SDK Manager, you must first update the + SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not, + the Android 4.0 system components will not be available for download.</p> + +<dl> +<dt>Dependencies:</dt> +<dd> + <ul> + <li>Android SDK Platform-tools revision 9 or later.</li> + <li>If you are developing in Eclipse with ADT, note that the SDK Tools r16 is designed for use + with ADT 16.0.0 and later. If you haven't already, we highly recommend updating your + <a href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin</a> to 16.0.0.</li> + <li>If you are developing outside Eclipse, you must have <a href="http://ant.apache.org/">Apache + Ant</a> 1.8 or later.</li> +</ul> +</dd> +<dt>General notes:</dt> +<dd> + <ul> + <li>Added Lint tools to detect common errors in Android projects. (<a +href="http://tools.android.com/recent/lint">more info</a>)</li> + <li>Added sensor emulation support, which allows the emulator to read sensor data from a +physical Android device.</li> + <li>Added support for using a webcam to emulate a camera on Mac OS X.</li> + </ul> +</dd> +<dt>Bug fixes:</dt> +<dd> + <ul> + <li>Snapshots now work for Android 4.0 system images.</li> + <li>Fixed several small issues for the build file. + (<a href="http://code.google.com/p/android/issues/detail?id=21023">Issue 21023</a>, + <a href="http://code.google.com/p/android/issues/detail?id=21267">Issue 21267</a>, + <a href="http://code.google.com/p/android/issues/detail?id=21465">Issue 21465</a>, + <a href="http://code.google.com/p/android/issues/detail?id=21525">Issue 21525</a>).</li> + </ul> +</dd> +</dl> +</div> +</div> + +<div class="toggleable closed"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" + width="9px" /> + SDK Tools, Revision 15</a> <em>(October 2011)</em> <div class="toggleme"> <p class="caution"><strong>Important:</strong> To download the new Android @@ -116,7 +165,8 @@ padding: .25em 1em; <div class="toggleable closed"> <a href="#" onclick="return toggleDiv(this)"> <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" - width="9px" />SDK Tools, Revision 14</a> <em>(October 2011)</em> + width="9px" /> + SDK Tools, Revision 14</a> <em>(October 2011)</em> <div class="toggleme"> <p class="note"><strong>Important:</strong> To download the new Android @@ -137,10 +187,11 @@ padding: .25em 1em; <dt>General notes:</dt> <dd> <ul> - <li>Added webcam support to Android 4.0 or later platforms to emulate rear-facing cameras when one webcam is present, - and to emulate both rear-facing and front-facing cameras when two webcams are present. Webcam suport is for Windows and Linux only. + <li>Added webcam support to Android 4.0 or later platforms to emulate rear-facing cameras when + one webcam is present, and to emulate both rear-facing and front-facing cameras when two + webcams are present. Webcam support is for Windows and Linux only. Mac support will come in a later release.</li> - <li>Changed <code>default.properties</code> to <code>project.properties</code> and + <li>Changed <code>default.properties</code> to <code>project.properties</code> and <code>build.properties</code> to <code>ant.properties</code>. Any existing projects that you build with Ant must be updated with the <code>android update project</code> command.</li> @@ -428,7 +479,7 @@ normal tasks: <code>-pre-build</code>, <code>-pre-compile</code>, and for more information.</li> <li>Fixes location control in DDMS to work in any locale not using '.' as a decimal point.</li> -</li> +</ul> </ul> </dd> </dl> diff --git a/docs/html/shareables/training/DeviceManagement.zip b/docs/html/shareables/training/DeviceManagement.zip Binary files differnew file mode 100644 index 000000000000..9f7ec694af47 --- /dev/null +++ b/docs/html/shareables/training/DeviceManagement.zip diff --git a/docs/html/shareables/training/MobileAds.zip b/docs/html/shareables/training/MobileAds.zip Binary files differnew file mode 100644 index 000000000000..468e4ee72511 --- /dev/null +++ b/docs/html/shareables/training/MobileAds.zip diff --git a/docs/html/shareables/training/NewsReader.zip b/docs/html/shareables/training/NewsReader.zip Binary files differnew file mode 100644 index 000000000000..7dda41c7c273 --- /dev/null +++ b/docs/html/shareables/training/NewsReader.zip diff --git a/docs/html/shareables/training/PhotoIntentActivity.zip b/docs/html/shareables/training/PhotoIntentActivity.zip Binary files differnew file mode 100644 index 000000000000..9fcc0e19a7c8 --- /dev/null +++ b/docs/html/shareables/training/PhotoIntentActivity.zip diff --git a/docs/html/training/camera/cameradirect.jd b/docs/html/training/camera/cameradirect.jd new file mode 100644 index 000000000000..d37f2c49e0f5 --- /dev/null +++ b/docs/html/training/camera/cameradirect.jd @@ -0,0 +1,308 @@ +page.title=Controlling the Camera +parent.title=Capturing Photos with the Camera +parent.link=index.html + +trainingnavtop=true +previous.title=Recording Videos Simply +previous.link=videobasics.html + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>This lesson teaches you to</h2> + <ol> + <li><a href="#TaskOpenCamera">Open the Camera Object</a></li> + <li><a href="#camera-preview">Create the Camera Preview</a></li> + <li><a href="#TaskSettings">Modify Camera Settings</a></li> + <li><a href="#TaskOrientation">Set the Preview Orientation</a></li> + <li><a href="#TaskTakePicture">Take a Picture</a></li> + <li><a href="#TaskRestartPreview">Restart the Preview</a></li> + <li><a href="#TaskReleaseCamera">Stop the Preview and Release the Camera</a></li> + </ol> + + <h2>You should also read</h2> + <ul> + <li><a href="{@docRoot}guide/topics/media/camera.html#custom-camera">Building + a Camera App</a></li> + </ul> + </div> +</div> + +<p>In this lesson, we discuss how to control the camera hardware directly using +the framework APIs.</p> + +<p>Directly controlling a device camera requires a lot more code than requesting pictures or videos +from existing camera applications. However, if you want to build a specialized camera application or +or something fully integrated in your app UI, this lesson shows you how.</p> + + +<h2 id="TaskOpenCamera">Open the Camera Object</h2> + +<p>Getting an instance of the {@link android.hardware.Camera} object is the first step in the +process of directly controlling the camera. As Android's own Camera application does, the +recommended way to access the camera is to open {@link android.hardware.Camera} on a separate thread +that's launched from {@link android.app.Activity#onCreate onCreate()}. This approach is a good idea +since it can take a while and might bog down the UI thread. However, in the sample application +associated with this lesson, opening the camera is deferred to the {@link +android.app.Activity#onResume onResume()} method to facilitate code reuse and keep the flow of +control simple.</p> + +<pre> +private void openCameraPerIdAndSetPreview() { + if (! safeCameraOpen(mCameraId)) { + mCameraId = getFirstRearCameraID(); + safeCameraOpen(mCameraId); + } + + mPreview.setCamera(mCamera); +} +</pre> + +<p>Since API level 9, the camera framework supports multiple cameras. If you use the +legacy API and call {@link android.hardware.Camera#open open()} without an +argument, you get the first rear-facing camera. Dealing with multiple cameras +is an advanced topic and beyond the scope of this lesson. If you are really +interested, check out the implementation of {@code getFirstRearCameraID()} in +the sample app (downloadable at the top).</p> + +<p>Calling {@link android.hardware.Camera#open Camera.open()} throws an +exception if the camera is already in use by another application, so we wrap it +in a {@code try} block.</p> + +<pre> +private boolean safeCameraOpen(int id) { + boolean qOpened = false; + + try { + releaseCameraAndPreview(); + mCamera = Camera.open(mCameraId); + qOpened = (mCamera != null); + } catch (Exception e) { + Log.e(getString(R.string.app_name), "failed to open Camera"); + e.printStackTrace(); + } + + return qOpened; +} + +private void releaseCameraAndPreview() { + mPreview.setCamera(null); + if (mCamera != null) { + mCamera.release(); + mCamera = null; + } +} +</pre> + + +<h2 id="camera-preview">Create the Camera Preview</h2> + +<p>Taking a picture usually requires that your users see a preview of their subject before clicking +the shutter. To do so, you can use a {@link android.view.SurfaceView} to draw previews of what the +camera sensor is picking up.</p> + +<h3 id="TaskSetPreview">Preview Class</h3> + +<p>To get started with displaying a preview, you need preview class. The +preview requires an implementation of the {@code +android.view.SurfaceHolder.Callback} interface, which is used to pass image +data from the camera hardware the application.</p> + +<pre> +class Preview extends ViewGroup implements SurfaceHolder.Callback { +... + + SurfaceView mSurfaceView; + SurfaceHolder mHolder; + +... + + Preview(Context context) { + super(context); + + mSurfaceView = new SurfaceView(context); + addView(mSurfaceView); + + // Install a SurfaceHolder.Callback so we get notified when the + // underlying surface is created and destroyed. + mHolder = mSurfaceView.getHolder(); + mHolder.addCallback(this); + mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + } +... +} +</pre> + +<p>The preview class must be passed to the {@link android.hardware.Camera} object before the live +image preview can be started, as seen in {@code setCamera()} method of the sample, +as shown in the next section.</p> + + +<h3 id="TaskStartPreview">Set and Start the Preview</h2> + +<p>A camera instance and its related preview must be created in a specific +order, with the camera object being first. In the sample application, the +process of initializing the camera is encapsulated so that {@link +android.hardware.Camera#startPreview Camera.startPreview()} is called by the +{@code setCamera()} method, whenever the user does something to change the +camera. The preview must also be restarted in the preview class {@code +surfaceChanged()} callback method.</p> + +<pre> +public void setCamera(Camera camera) { + if (mCamera == camera) { return; } + + stopPreviewAndFreeCamera(); + + mCamera = camera; + + if (mCamera != null) { + List<Size> localSizes = mCamera.getParameters().getSupportedPreviewSizes(); + mSupportedPreviewSizes = localSizes; + requestLayout(); + + try { + mCamera.setPreviewDisplay(mHolder); + } catch (IOException e) { + e.printStackTrace(); + } + + /* + Important: Call startPreview() to start updating the preview surface. Preview must + be started before you can take a picture. + */ + mCamera.startPreview(); + } +} +</pre> + + +<h2 id="TaskSettings">Modify Camera Settings</h2> + +<p>Camera settings change the way that the camera takes pictures, from the zoom +level to exposure compensation. This example doesn’t do a whole lot with camera +settings, but the APIs provide a wide array of options. The {@code surfaceChanged()} method in the +sample app demonstrates how to get and set camera parameters:</p> + +<pre> +public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { + // Now that the size is known, set up the camera parameters and begin + // the preview. + Camera.Parameters parameters = mCamera.getParameters(); + parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height); + requestLayout(); + mCamera.setParameters(parameters); + + /* + Important: Call startPreview() to start updating the preview surface. Preview must be + started before you can take a picture. + */ + mCamera.startPreview(); +} +</pre> + + +<h2 id="TaskOrientation">Set the Preview Orientation</h2> + +<p>Most camera applications lock the display into landscape mode because that is the natural +orientation of the camera sensor. This setting does not prevent you from taking portrait-mode +photos, because the orientation of the device is recorded in the EXIF header. The {@link +android.hardware.Camera#setDisplayOrientation setCameraDisplayOrientation()} method lets you change +how the preview is displayed without affecting how the image is recorded. However, in Android prior +to API level 14, you must stop your preview before changing the orientation and then restart it.</p> + + +<h2 id="TaskTakePicture">Take a Picture</h2> + +<p>Use the {@link android.hardware.Camera#takePicture Camera.takePicture()} +method to take a picture once the preview is started. You can create {@link +android.hardware.Camera.PictureCallback} and {@link +android.hardware.Camera.ShutterCallback} objects and pass them into {@link +android.hardware.Camera#takePicture Camera.takePicture()}. Since the Android +Camera application already does a great job capturing JPEG images, you should +probably implement the raw-image callback.</p> + +<p>If you want to grab images continously, you can create a {@link +android.hardware.Camera.PreviewCallback} that implements {@link +android.hardware.Camera.PreviewCallback#onPreviewFrame onPreviewFrame()}. For +something in between, you can capture only selected preview frames, or set up a +delayed action to call {@link android.hardware.Camera#takePicture +takePicture()}.</p> + + +<h2 id="TaskRestartPreview">Restart the Preview</h2> + +<p>After a picture is taken, you must to restart the preview before the user +can take another picture. In the example, the restart is done by overloading +the shutter button, as shown below.</p> + +<pre> +@Override +public void onClick(View v) { + switch(mPreviewState) { + case K_STATE_FROZEN: + mCamera.startPreview(); + mPreviewState = K_STATE_PREVIEW; + break; + + default: + mCamera.takePicture( null, rawCallback, null); + mPreviewState = K_STATE_BUSY; + } // switch + shutterBtnConfig(); +} +</pre> + + +<h2 id="TaskReleaseCamera">Stop the Preview and Release the Camera</h2> + +<p>Once your application is done using the camera, it's time to clean up. In +particular, you must release the {@link android.hardware.Camera} object, or you risk crashing other +applications, including new instances of your own application.</p> + +<p>When should you stop the preview and release the camera? Well, having your +preview surface destroyed is a pretty good hint that it’s time to stop the +preview and release the camera, as shown in these methods from the {@code +Preview} class.</p> + +<pre> +public void surfaceDestroyed(SurfaceHolder holder) { + // Surface will be destroyed when we return, so stop the preview. + if (mCamera != null) { + /* + Call stopPreview() to stop updating the preview surface. + */ + mCamera.stopPreview(); + } +} + +/** + * When this function returns, mCamera will be null. + */ +private void stopPreviewAndFreeCamera() { + + if (mCamera != null) { + /* + Call stopPreview() to stop updating the preview surface. + */ + mCamera.stopPreview(); + + /* + Important: Call release() to release the camera for use by other applications. + Applications should release the camera immediately in onPause() (and re-open() it in + onResume()). + */ + mCamera.release(); + + mCamera = null; + } +} +</pre> + +<p>In the example application, this procedure is also part of the {@code +setCamera()} method, so initializing a camera always begins with stopping the +preview.</p> + diff --git a/docs/html/training/camera/index.jd b/docs/html/training/camera/index.jd new file mode 100644 index 000000000000..400f6368ad97 --- /dev/null +++ b/docs/html/training/camera/index.jd @@ -0,0 +1,60 @@ +page.title=Capturing Photos with the Camera + +trainingnavtop=true +startpage=true +next.title=Taking Photos Simply +next.link=photobasics.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + + +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 1.5 (API level 3) or higher</li> + <li>A device with a camera</li> +</ul> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/media/camera.html">Camera</a></li> + <li><a href="{@docRoot}guide/topics/fundamentals/activities.html">Activities</a></li> +</ul> + + +<h2>Try it out</h2> + +<div class="download-box"> + <a href="{@docRoot}shareables/training/PhotoIntentActivity.zip" class="button">Download the Intent sample</a> + <p class="filename">PhotoIntentActivity.zip</p> +</div> + +</div> +</div> + +<p>The world was a dismal and featureless place before rich media became +prevalent. Remember Gopher? We don't, either. For your app to become +part of your users' lives, give them a way to put their lives into it. +Using the on-board cameras, your application can enable users to augment what +they see around them, make unique avatars, look for zombies around the corner, +or simply share their experiences.</p> + +<p>This class gets you clicking fast with some super-easy ways of +leveraging existing camera applications. In later lessons, you dive deeper +and learn how to control the camera hardware directly.</p> + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="photobasics.html">Taking Photos Simply</a></b></dt> + <dd>Leverage other applications and capture photos with just a few lines of code.</dd> + <dt><b><a href="videobasics.html">Recording Videos Simply</a></b></dt> + <dd>Leverage other applications and record videos with just a few lines of code.</dd> + <dt><b><a href="cameradirect.html">Controlling the Camera</a></b></dt> + <dd>Control the camera hardware directly and implement your own camera application.</dd> +</dl> + diff --git a/docs/html/training/camera/photobasics.jd b/docs/html/training/camera/photobasics.jd new file mode 100644 index 000000000000..002dec728721 --- /dev/null +++ b/docs/html/training/camera/photobasics.jd @@ -0,0 +1,258 @@ +page.title=Taking Photos Simply +parent.title=Capturing Photos with the Camera +parent.link=index.html + +trainingnavtop=true +next.title=Recording Videos Simply +next.link=videobasics.html + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>This lesson teaches you to</h2> + <ol> + <li><a href="#TaskManifest">Request Camera Permission</a></li> + <li><a href="#TaskCaptureIntent">Take a Photo with the Camera App</a></li> + <li><a href="#TaskPhotoView">View the Photo</a></li> + <li><a href="#TaskPath">Save the Photo</a></li> + <li><a href="#TaskGallery">Add the Photo to a Gallery</a></li> + <li><a href="#TaskScalePhoto">Decode a Scaled Image</a></li> + </ol> + + <h2>You should also read</h2> + <ul> + <li><a href="{@docRoot}guide/topics/media/camera.html">Camera</a></li> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent + Filters</a></li> + </ul> + + <h2>Try it out</h2> + <div class="download-box"> + <a href="{@docRoot}shareables/training/PhotoIntentActivity.zip" class="button">Download the +sample</a> + <p class="filename">PhotoIntentActivity.zip</p> + </div> + + </div> +</div> + +<p>This lesson explains how to capture photos using an existing camera +application.</p> + +<p>Suppose you are implementing a crowd-sourced weather service that makes a +global weather map by blending together pictures of the sky taken by devices +running your client app. Integrating photos is only a small part of your +application. You want to take photos with minimal fuss, not reinvent the +camera. Happily, most Android-powered devices already have at least one camera +application installed. In this lesson, you learn how to make it take a picture +for you.</p> + + +<h2 id="TaskManifest">Request Camera Permission</h2> + +<p>If an essential function of your application is taking pictures, then restrict +its visibility in Android Market to devices that have a camera. To advertise +that your application depends on having a camera, put a <a +href="{@docRoot}guide/topics/manifest/uses-feature-element.html"> {@code +<uses-feature>}</a> tag in your manifest file:</p> + +<pre> +<manifest ... > + <uses-feature android:name="android.hardware.camera" /> + ... +</manifest ... > +</pre> + +<p>If your application uses, but does not require a camera in order to function, add {@code +android:required="false"} to the tag. In doing so, Android Market will allow devices without a +camera to download your application. It's then your responsibility to check for the availability +of the camera at runtime by calling {@link +android.content.pm.PackageManager#hasSystemFeature hasSystemFeature(PackageManager.FEATURE_CAMERA)}. +If a camera is not available, you should then disable your camera features.</p> + + +<h2 id="TaskCaptureIntent">Take a Photo with the Camera App</h2> + +<p>The Android way of delegating actions to other applications is to invoke an {@link +android.content.Intent} that describes what you want done. This process involves three pieces: The +{@link android.content.Intent} itself, a call to start the external {@link android.app.Activity}, +and some code to handle the image data when focus returns to your activity.</p> + +<p>Here's a function that invokes an intent to capture a photo.</p> + +<pre> +private void dispatchTakePictureIntent(int actionCode) { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + startActivityForResult(takePictureIntent, actionCode); +} +</pre> + + +<p>Congratulations: with this code, your application has gained the ability to +make another camera application do its bidding! Of course, if no compatible +application is ready to catch the intent, then your app will fall down like a +botched stage dive. Here is a function to check whether an app can handle your intent:</p> + +<pre> +public static boolean isIntentAvailable(Context context, String action) { + final PackageManager packageManager = context.getPackageManager(); + final Intent intent = new Intent(action); + List<ResolveInfo> list = + packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + return list.size() > 0; +} +</pre> + + +<h2 id="TaskPhotoView">View the Photo</h2> + +<p>If the simple feat of taking a photo is not the culmination of your app's +ambition, then you probably want to get the image back from the camera +application and do something with it.</p> + +<p>The Android Camera application encodes the photo in the return {@link android.content.Intent} +delivered to {@link android.app.Activity#onActivityResult onActivityResult()} as a small {@link +android.graphics.Bitmap} in the extras, under the key {@code "data"}. The following code retrieves +this image and displays it in an {@link android.widget.ImageView}.</p> + +<pre> +private void handleSmallCameraPhoto(Intent intent) { + Bundle extras = intent.getExtras(); + mImageBitmap = (Bitmap) extras.get("data"); + mImageView.setImageBitmap(mImageBitmap); +} +</pre> + +<p class="note"><strong>Note:</strong> This thumbnail image from {@code "data"} might be good for an +icon, but not a lot more. Dealing with a full-sized image takes a bit more +work.</p> + + +<h2 id="TaskPath">Save the Photo</h2> + +<p>The Android Camera application saves a full-size photo if you give it a file to +save into. You must provide a path that includes the storage volume, +folder, and file name.</p> + +<p>There is an easy way to get the path for photos, but it works only on Android 2.2 (API level 8) +and later:</p> + +<pre> +storageDir = new File( + Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES + ), + getAlbumName() +); +</pre> + +<p>For earlier API levels, you have to provide the name of the photo +directory yourself.</p> + +<pre> +storageDir = new File ( + Environment.getExternalStorageDirectory() + + PICTURES_DIR + + getAlbumName() +); +</pre> + +<p class="note"><strong>Note:</strong> The path component {@code PICTURES_DIR} is +just {@code Pictures/}, the standard location for shared photos on the external/shared +storage.</p> + + +<h3 id="TaskFileName">Set the file name</h3> + +<p>As shown in the previous section, the file location for an image should be +driven by the device environment. What you need to do yourself is choose a +collision-resistant file-naming scheme. You may wish also to save the path in a +member variable for later use. Here's an example solution:</p> + +<pre> +private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = + new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; + File image = File.createTempFile( + imageFileName, + JPEG_FILE_SUFFIX, + getAlbumDir() + ); + mCurrentPhotoPath = image.getAbsolutePath(); + return image; +} +</pre> + + +<h3 id="TaskIntentFileName">Append the file name onto the Intent</h3> + +<p>Once you have a place to save your image, pass that location to the camera +application via the {@link android.content.Intent}.</p> + +<pre> +File f = createImageFile(); +takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); +</pre> + + +<h2 id="TaskGallery">Add the Photo to a Gallery</h2> + +<p>When you create a photo through an intent, you should know where your image is located, because +you said where to save it in the first place. For everyone else, perhaps the easiest way to make +your photo accessible is to make it accessible from the system's Media Provider.</p> + +<p>The following example method demonstrates how to invoke the system's media scanner to add your +photo to the Media Provider's database, making it available in the Android Gallery application +and to other apps.</p> + +<pre> +private void galleryAddPic() { + Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + File f = new File(mCurrentPhotoPath); + Uri contentUri = Uri.fromFile(f); + mediaScanIntent.setData(contentUri); + this.sendBroadcast(mediaScanIntent); +} +</pre> + + +<h2 id="TaskScalePhoto">Decode a Scaled Image</h2> + +<p>Managing multiple full-sized images can be tricky with limited memory. If +you find your application running out of memory after displaying just a few +images, you can dramatically reduce the amount of dynamic heap used by +expanding the JPEG into a memory array that's already scaled to match the size +of the destination view. The following example method demonstrates this +technique.</p> + +<pre> +private void setPic() { + // Get the dimensions of the View + int targetW = mImageView.getWidth(); + int targetH = mImageView.getHeight(); + + // Get the dimensions of the bitmap + BitmapFactory.Options bmOptions = new BitmapFactory.Options(); + bmOptions.inJustDecodeBounds = true; + BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); + int photoW = bmOptions.outWidth; + int photoH = bmOptions.outHeight; + + // Determine how much to scale down the image + int scaleFactor = Math.min(photoW/targetW, photoH/targetH); + + // Decode the image file into a Bitmap sized to fill the View + bmOptions.inJustDecodeBounds = false; + bmOptions.inSampleSize = scaleFactor; + bmOptions.inPurgeable = true; + + Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); + mImageView.setImageBitmap(bitmap); +} +</pre> + diff --git a/docs/html/training/camera/videobasics.jd b/docs/html/training/camera/videobasics.jd new file mode 100644 index 000000000000..a0f57325dbbb --- /dev/null +++ b/docs/html/training/camera/videobasics.jd @@ -0,0 +1,118 @@ +page.title=Recording Videos Simply +parent.title=Capturing Photos with the Camera +parent.link=index.html + +trainingnavtop=true +previous.title=Recording Photos Simply +previous.link=photobasics.html +next.title=Controlling the Camera +next.link=cameradirect.html + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> + + <h2>This lesson teaches you to</h2> + <ol> + <li><a href="#TaskManifest">Request Camera Permission</a></li> + <li><a href="#TaskCaptureIntent">Record a Video with a Camera App</a> + <li><a href="#TaskVideoView">View the Video</a></li> + </ol> + + <h2>You should also read</h2> + <ul> + <li><a href="{@docRoot}guide/topics/media/camera.html">Camera</a></li> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent + Filters</a></li> + </ul> + + <h2>Try it out</h2> + + <div class="download-box"> + <a href="{@docRoot}shareables/training/PhotoIntentActivity.zip" class="button">Download the +sample</a> + <p class="filename">PhotoIntentActivity.zip</p> + </div> + </div> +</div> + + +<p>This lesson explains how to capture video using existing camera +applications.</p> + +<p>Your application has a job to do, and integrating videos is only a small +part of it. You want to take videos with minimal fuss, and not reinvent the +camcorder. Happily, most Android-powered devices already have a camera application that +records video. In this lesson, you make it do this for you.</p> + + + +<h2 id="TaskManifest">Request Camera Permission</h2> + +<p>To advertise that your application depends on having a camera, put a +{@code <uses-feature>} tag in the manifest file:</p> + +<pre> +<manifest ... > + <uses-feature android:name="android.hardware.camera" /> + ... +</manifest ... > +</pre> + +<p>If your application uses, but does not require a camera in order to function, add {@code +android:required="false"} to the tag. In doing so, Android Market will allow devices without a +camera to download your application. It's then your responsibility to check for the availability +of the camera at runtime by calling {@link +android.content.pm.PackageManager#hasSystemFeature hasSystemFeature(PackageManager.FEATURE_CAMERA)}. +If a camera is not available, you should then disable your camera features.</p> + + +<h2 id="TaskCaptureIntent">Record a Video with a Camera App</h2> + +<p>The Android way of delegating actions to other applications is to invoke +an {@link android.content.Intent} that describes what you want done. This +involves three pieces: the {@link android.content.Intent} itself, a call to start the external +{@link android.app.Activity}, and some code to handle the video when focus returns +to your activity.</p> + +<p>Here's a function that invokes an intent to capture video.</p> + +<pre> +private void dispatchTakeVideoIntent() { + Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); + startActivityForResult(takeVideoIntent, ACTION_TAKE_VIDEO); +} +</pre> + + +<p>It's a good idea to make sure an app exists to handle your intent +before invoking it. Here's a function that checks for apps that can handle your intent:</p> + +<pre> +public static boolean isIntentAvailable(Context context, String action) { + final PackageManager packageManager = context.getPackageManager(); + final Intent intent = new Intent(action); + List<ResolveInfo> list = + packageManager.queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY); + return list.size() > 0; +} +</pre> + + +<h2 id="TaskVideoView">View the Video</h2> + +<p>The Android Camera application returns the video in the {@link android.content.Intent} delivered +to {@link android.app.Activity#onActivityResult onActivityResult()} as a {@link +android.net.Uri} pointing to the video location in storage. The following code +retrieves this image and displays it in a {@link android.widget.VideoView}.</p> + +<pre> +private void handleCameraVideo(Intent intent) { + mVideoUri = intent.getData(); + mVideoView.setVideoURI(mVideoUri); +} +</pre> + diff --git a/docs/html/training/enterprise/device-management-policy.jd b/docs/html/training/enterprise/device-management-policy.jd new file mode 100644 index 000000000000..52f0e37027bf --- /dev/null +++ b/docs/html/training/enterprise/device-management-policy.jd @@ -0,0 +1,220 @@ +page.title=Enhancing Security with Device Management Policies +parent.title=Developing Android Applications for the Enterprise +parent.link=index.html +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#DeclarePolicy">Define and Declare Your Policy</a></li> + <li><a href="#CreateDeviceAdminReceiver">Create a Device Administration Receiver</a></li> + <li><a href="#ActivateDeviceAdmin">Activate the Device Administrator</a></li> + <li><a href="#ImplementDevicePolicyController">Implement the Device Policy Controller</a></li> +</ol> + +<!-- related docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/DeviceManagement.zip" +class="button">Download the sample</a> + <p class="filename">DeviceManagement.zip</p> +</div> + +</div> +</div> + + +<p>Since Android 2.2 (API level 8), the Android platform offes system-level device management +capabilities through the Device Administration APIs.</p> + +<p>In this lesson, you will learn how to create a security-aware application that manages access to +its content by enforcing device management policies. Specifically, the application can be configured +such that it ensures a screen-lock password of sufficient strength is set up before displaying +restricted content to the user.</p> + + +<h2 id="DeclarePolicy">Define and Declare Your Policy</h2> + +<p>First, you need to define the kinds of policy to support at the functional level. Policies may +cover screen-lock password strength, expiration timeout, encryption, etc.</p> + +<p>You must declare the selected policy set, which will be enforced by the application, in the +<code>res/xml/device_admin.xml</code> file. The Android manifest should also reference the +declared policy set.</p> + +<p>Each declared policy corresponds to some number of related device policy methods in {@link +android.app.admin.DevicePolicyManager} (defining minimum password length and minimum number of +uppercase characters are two examples). If an application attempts to invoke methods whose +corresponding policy is not declared in the XML, this will result in a {@link +java.lang.SecurityException} at runtime. Other permissions, +such as <code>force-lock</code>, are available if the application intends to manage +other kinds of policy. As you'll see later, as part of the device administrator activation process, +the list of declared policies will be presented to the user on a system screen.</p> + +<p>The following snippet declares the limit password policy in <code>res/xml/device_admin.xml</code>:</p> + +<pre> +<device-admin xmlns:android="http://schemas.android.com/apk/res/android"> + <uses-policies> + <limit-password /> + </uses-policies> +</device-admin> +</pre> + +<p>Policy declaration XML referenced in Android manifest:</p> + +<pre> +<receiver android:name=".Policy$PolicyAdmin" + android:permission="android.permission.BIND_DEVICE_ADMIN"> + <strong><meta-data android:name="android.app.device_admin" + android:resource="@xml/device_admin" /></strong> + <intent-filter> + <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" /> + </intent-filter> +</receiver> +</pre> + + +<h2 id="CreateDeviceAdminReceiver">Create a Device Administration Receiver</h2> + +<p>Create a Device Administration broadcast receiver, which gets notified of events related to the policies you’ve declared to support. An application can selectively override callback methods.</p> + +<p>In the sample application, Device Admin, when the device administrator is deactivated by the +user, the configured policy is erased from the shared preference. You should consider implementing +business logic that is relevant to your use case. For example, the application might take some +actions to mitigate security risk by implementing some combination of deleting sensitive data on the +device, disabling remote synchronization, alerting an administrator, etc.</p> + +<p>For the broadcast receiver to work, be sure to register it in the Android manifest as illustrated in the above snippet.</p> + +<pre> +public static class PolicyAdmin extends DeviceAdminReceiver { + + @Override + public void onDisabled(Context context, Intent intent) { + // Called when the app is about to be deactivated as a device administrator. + // Deletes previously stored password policy. + super.onDisabled(context, intent); + SharedPreferences prefs = context.getSharedPreferences(APP_PREF, Activity.MODE_PRIVATE); + prefs.edit().clear().commit(); + } +} +</pre> + + +<h2 id="ActivateDeviceAdmin">Activate the Device Administrator</h2> + +<p>Before enforcing any policies, the user needs to manually activate the application as a device +administrator. The snippet below illustrates how to trigger the settings activity in which the +user can activate your application. It is good practice to include the explanatory text to highlight +to users why the application is requesting to be a device administrator, by specifying the +{@link android.app.admin.DevicePolicyManager#EXTRA_ADD_EXPLANATION} extra in the intent.</p> + +<div class="figure" style="width:220px"> +<img src="/images/training/device-mgmt-activate-device-admin.png" /> +<p class="img-caption"><strong>Figure 1.</strong> The user activation screen in which you can +provide a description of your device policies.</p> +</div> + +<pre> +if (!mPolicy.isAdminActive()) { + + Intent activateDeviceAdminIntent = + new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); + + activateDeviceAdminIntent.putExtra( + DevicePolicyManager.EXTRA_DEVICE_ADMIN, + mPolicy.getPolicyAdmin()); + + // It is good practice to include the optional explanation text to + // explain to user why the application is requesting to be a device + // administrator. The system will display this message on the activation + // screen. + activateDeviceAdminIntent.putExtra( + DevicePolicyManager.EXTRA_ADD_EXPLANATION, + getResources().getString(R.string.device_admin_activation_message)); + + startActivityForResult(activateDeviceAdminIntent, + REQ_ACTIVATE_DEVICE_ADMIN); +} +</pre> + +<p>If the user chooses "Activate," the application becomes a device administrator and can begin +configuring and enforcing the policy.</p> + +<p>The application also needs to be prepared to handle set back situations where the user abandons +the activation process by hitting the Cancel button, the Back key, or the Home key. Therefore, +{@link android.app.Activity#onResume onResume()} in the Policy Set Up Activity needs to have logic +to reevaluate the condition and present the Device Administrator Activation option to the user if +needed.</p> + + +<h2 id="ImplementDevicePolicyController">Implement the Device Policy Controller</h2> + +<p>After the device administrator is activated successfully, the application then configures Device +Policy Manager with the requested policy. Keep in mind that new policies are being added to +Android with each release. It is appropriate to perform version checks in your application if using +new policies while supporting older versions of the platform. For example, the Password Minimum +Upper Case policy is only available with API level 11 (Honeycomb) and above. The following code +demonstrates how you can check the version at runtime.</p> + +<pre> +DevicePolicyManager mDPM = (DevicePolicyManager) + context.getSystemService(Context.DEVICE_POLICY_SERVICE); +ComponentName mPolicyAdmin = new ComponentName(context, PolicyAdmin.class); +... +mDPM.setPasswordQuality(mPolicyAdmin, PASSWORD_QUALITY_VALUES[mPasswordQuality]); +mDPM.setPasswordMinimumLength(mPolicyAdmin, mPasswordLength); +if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mDPM.setPasswordMinimumUpperCase(mPolicyAdmin, mPasswordMinUpperCase); +} +</pre> + +<p>At this point, the application is able to enforce the policy. While the application has no access +to the actual screen-lock password used, through the Device Policy Manager API it can determine +whether the existing password satisfies the required policy. If it turns out that the existing +screen-lock password is not sufficient, the device administration API does not automatically take +corrective action. It is the application’s responsibility to explicitly launch the system +password-change screen in the Settings app. For example:</p> + +<pre> +if (!mDPM.isActivePasswordSufficient()) { + ... + // Triggers password change screen in Settings. + Intent intent = + new Intent(DevicePolicyManager.ACTION_SET_NEW_PASSWORD); + startActivity(intent); +} +</pre> + +<p>Normally, the user can select from one of the available lock mechanisms, such as None, Pattern, +PIN (numeric), or Password (alphanumeric). When a password policy is configured, those password +types that are weaker than those defined in the policy are disabled. For example, if the +“Numeric” password quality is configured, the user can select either PIN (numeric) or Password +(alphanumeric) password only.</p> + +<p>Once the device is properly secured by setting up a proper screen-lock password, the application +allows access to the secured content.</p> + +<pre> +if (!mDPM.isAdminActive(..)) { + // Activates device administrator. + ... +} else if (!mDPM.isActivePasswordSufficient()) { + // Launches password set-up screen in Settings. + ... +} else { + // Grants access to secure content. + ... + startActivity(new Intent(context, SecureActivity.class)); +} +</pre> diff --git a/docs/html/training/enterprise/index.jd b/docs/html/training/enterprise/index.jd new file mode 100644 index 000000000000..05bb29c5b55b --- /dev/null +++ b/docs/html/training/enterprise/index.jd @@ -0,0 +1,51 @@ +page.title=Developing Android Applications for the Enterprise + +trainingnavtop=true +startpage=true +next.title=Enhancing Security with Device Management Policies +next.link=device-management-policy.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 2.0 (API Level 5) or higher</li> + <li>Experience with <a href="{@docRoot}guide/topics/media/mediaplayer.html">Media +Playback</a></li> +</ul> + +<!-- related docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/admin/device-admin.html">Device Administration</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/DeviceManagement.zip" +class="button">Download the sample</a> + <p class="filename">DeviceManagement.zip</p> +</div> + +</div> +</div> + + +<p>In this class, you'll learn APIs and techniques you can use when developing applications +for the enterprise.</p> + + +<h2>Lessons</h2> + + +<dl> + <dt><b><a href="device-management-policy.html">Enhancing Security with Device Management +Policies</a></b></dt> + <dd>In this lesson, you will learn how to create a security-aware application that manages +access to its content by enforcing device management policies</dd> +</dl> diff --git a/docs/html/training/id-auth/authenticate.jd b/docs/html/training/id-auth/authenticate.jd new file mode 100644 index 000000000000..31352e72301a --- /dev/null +++ b/docs/html/training/id-auth/authenticate.jd @@ -0,0 +1,253 @@ +page.title=Authenticating to OAuth2 Services +parent.title=Identifying and Authenticating Users +parent.link=index.html + +trainingnavtop=true +previous.title=Identifying Your User +previous.link=identify.html +next.title=Creating a Custom Account Type +next.link=custom_auth.html + +@jd:body + + <!-- This is the training bar --> +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Gather">Gather Information</a></li> + <li><a href="#RequestToken">Request an Auth Token</a></li> + <li><a href="#RequestAgain">Request an Auth Token... Again</a></li> + <li><a href="#ConnectToService">Connect to the Online Service</a></li> +</ol> + </div> +</div> + +<p>In order to securely access an online service, users need to authenticate to +the service—they need to provide proof of their identity. For an +application that accesses a third-party service, the security problem is even +more complicated. Not only does the user need to be authenticated to access the +service, but the application also needs to be authorized to act on the user's +behalf. </p> + +<p>The industry standard way to deal with authentication to third-party services +is the OAuth2 protocol. OAuth2 provides a single value, called an <strong>auth +token</strong>, that represents both the user's identity and the application's +authorization to act on the user's behalf. This lesson demonstrates connecting +to a Google server that supports OAuth2. Although Google services are used as an +example, the techniques demonstrated will work on any service that correctly +supports the OAuth2 protocol.</p> + +<p>Using OAuth2 is good for:</p> +<ul> +<li>Getting permission from the user to access an online service using his or +her account.</li> +<li>Authenticating to an online service on behalf of the user.</li> +<li>Handling authentication errors.</li> +</ul> + + +<h2 id="Gather">Gather Information</h2> + +<p>To begin using OAuth2, you need to know a few things about the API you're trying +to access:</p> + +<ul> +<li>The url of the service you want to access.</li> +<li>The <strong>auth scope</strong>, which is a string that defines the specific +type of access your app is asking for. For instance, the auth scope for +read-only access to Google Tasks is <code>View your tasks</code>, while the auth +scope for read-write access to Google Tasks is <code>Manage Your +Tasks</code>.</li> +<li>A <strong>client id</strong> and <strong>client secret</strong>, which are +strings that identify your app to the service. You need to obtain these strings +directly from the service owner. Google has a self-service system for obtaining +client ids and secrets. The article <a +href="http://code.google.com/apis/tasks/articles/oauth-and-tasks-on-android. +html">Getting Started with the Tasks API and OAuth 2.0 on Android</a> explains +how to use this system to obtain these values for use with the Google Tasks +API.</li> +</ul> + + +<h2 id="RequestToken">Request an Auth Token</h2> + +<p>Now you're ready to request an auth token. Auth tokens usually expire after +some period of time, so you'll have to renew them.</p> + + <!-- TODO: I think a flowchart would be useful here, or perhaps a link to an as-yet-to-be-created +flowchart that lives in the docs. --> + +<p>To get an auth token you first need to request the +{@link android.Manifest.permission#ACCOUNT_MANAGER} +to yourmanifest file. To actually do anything useful with the +token, you'll also need to add the {@link android.Manifest.permission#INTERNET} +permission.</p> + +<code> +<manifest ... > + <uses-permission android:name="android.permission.ACCOUNT_MANAGER" /> + <uses-permission android:name="android.permission.INTERNET" /> + ... +</manifest> +</code> + + +<p>Once your app has these permissions set, you can call {@link +android.accounts.AccountManager#getAuthToken AccountManager.getAuthToken()} to get the +token.</p> + +<p>Watch out! Calling methods on {@link android.accounts.AccountManager} can be tricky! Since +account operations may involve network communication, most of the {@link +android.accounts.AccountManager} methods are asynchronous. This means that instead of doing all of +your auth work in one function, you need to implement it as a series of callbacks. For example:</p> + +<pre> +AccountManager am = AccountManager.get(this); +Bundle options = new Bundle(); + +am.getAuthToken( + myAccount_, // Account retrieved using getAccountsByType() + "Manage your tasks", // Auth scope + options, // Authenticator-specific options + this, // Your activity + new OnTokenAcquired(), // Callback called when a token is successfully acquired + new Handler(new OnError())); // Callback called if an error occurs +</pre> + +<p>In this example, <code>OnTokenAcquired</code> is a class that extends +{@link android.accounts.AccountManagerCallback}. {@link android.accounts.AccountManager} calls +{@link android.accounts.AccountManagerCallback#run run()} on <code>OnTokenAcquired</code> with an +{@link android.accounts.AccountManagerFuture} that contains a {@link android.os.Bundle}. If +the call succeeded, the token is inside +the {@link android.os.Bundle}.</p> + +<p>Here's how you can get the token from the {@link android.os.Bundle}:</p> + +<pre> +private class OnTokenAcquired implements AccountManagerCallback<Bundle> { + @Override + public void run(AccountManagerFuture<Bundle> result) { + // Get the result of the operation from the AccountManagerFuture. + Bundle bundle = result.getResult(); + + // The token is a named value in the bundle. The name of the value + // is stored in the constant AccountManager.KEY_AUTHTOKEN. + token = bundle.getString(AccountManager.KEY_AUTHTOKEN); + ... + } +} +</pre> + +<p>If all goes well, the {@link android.os.Bundle} contains a valid token in the {@link +android.accounts.AccountManager#KEY_AUTHTOKEN} key and you're off to the races. Things don't +always go that smoothly, though...</p> + + +<h2 id="RequestAgain">Request an Auth Token... Again</h2> + +<p>Your first request for an auth token might fail for several reasons:</p> + +<ul> +<li>An error in the device or network caused {@link android.accounts.AccountManager} to fail.</li> +<li>The user decided not to grant your app access to the account.</li> +<li>The stored account credentials aren't sufficient to gain access to the account.</li> +<li>The cached auth token has expired.</li> +</ul> + +<p>Applications can handle the first two cases trivially, usually by simply +showing an error message to the user. If the network is down or the user decided +not to grant access, there's not much that your application can do about it. The +last two cases are a little more complicated, because well-behaved applications +are expected to handle these failures automatically.</p> + +<p>The third failure case, having insufficient credentials, is communicated via the {@link +android.os.Bundle} you receive in your {@link android.accounts.AccountManagerCallback} +(<code>OnTokenAcquired</code> from the previous example). If the {@link android.os.Bundle} includes +an {@link android.content.Intent} in the {@link android.accounts.AccountManager#KEY_INTENT} key, +then the authenticator is telling you that it needs to interact directly with the user before it can +give you a valid token.</p> + +<p>There may be many reasons for the authenticator to return an {@link android.content.Intent}. It +may be the first time the user has logged in to this account. Perhaps the user's account has expired +and they need to log in again, or perhaps their stored credentials are incorrect. Maybe the account +requires two-factor authentication or it needs to activate the camera to do a retina scan. It +doesn't really matter what the reason is. If you want a valid token, you're going to have to fire +off the {@link android.content.Intent} to get it.</p> + +<pre> +private class OnTokenAcquired implements AccountManagerCallback<Bundle> { + @Override + public void run(AccountManagerFuture<Bundle> result) { + ... + Intent launch = (Intent) result.get(AccountManager.KEY_INTENT); + if (launch != null) { + startActivityForResult(launch, 0); + return; + } + } +} +</pre> + +<p>Note that the example uses {@link android.app.Activity#startActivityForResult +startActivityForResult()}, so that you can capture +the result of the {@link android.content.Intent} by implementing {@link +android.app.Activity#onActivityResult onActivityResult()} in +your own activity. This is important! If you don't capture the result from the +authenticator's response {@link android.content.Intent}, +it's impossible to tell whether the user has successfully authenticated or not. +If the result is {@link android.app.Activity#RESULT_OK}, then the +authenticator has updated the stored credentials so that they are sufficient for +the level of access you requested, and you should call {@link +android.accounts.AccountManager#getAuthToken AccountManager.getAuthToken()} again to request the new +auth token.</p> + +<p>The last case, where the token has expired, it is not actually an {@link +android.accounts.AccountManager} failure. The only way to discover whether a token is expired or not +is to contact the server, and it would be wasteful and expensive for {@link +android.accounts.AccountManager} to continually go online to check the state of all of its tokens. +So this is a failure that can only be detected when an application like yours tries to use the auth +token to access an online service.</p> + + +<h2 id="ConnectToService">Connect to the Online Service</h2> + +<p>The example below shows how to connect to a Google server. Since Google uses the +industry standard OAuth2 protocol to +authenticate requests, the techniques discussed here are broadly +applicable. Keep in mind, though, that every +server is different. You may find yourself needing to make minor adjustments to +these instructions to account for your specific +situation.</p> + +<p>The Google APIs require you to supply four values with each request: the API +key, the client ID, the client secret, +and the auth key. The first three come from the Google API Console +website. The last is the string value you +obtained by calling {@link android.accounts.AccountManager#getAuthToken(android.accounts.Account,java.lang.String,android.os.Bundle,android.app.Activity,android.accounts.AccountManagerCallback,android.os.Handler) AccountManager.getAuthToken()}. You pass these to the +Google Server as part of +an HTTP request.</p> + +<pre> +URL url = new URL("https://www.googleapis.com/tasks/v1/users/@me/lists?key=" + <em>your_api_key</em>); +URLConnection conn = (HttpURLConnection) url.openConnection(); +conn.addRequestProperty("client_id", <em>your client id</em>); +conn.addRequestProperty("client_secret", <em>your client secret</em>); +conn.setRequestProperty("Authorization", "OAuth " + token); +</pre> + +<p>If the request returns +an HTTP error code of 401, then your token has been denied. As mentioned in the +last section, the most common reason for +this is that the token has expired. The fix is +simple: call +{@link android.accounts.AccountManager#invalidateAuthToken AccountManager.invalidateAuthToken()} and +repeat the token acquisition dance one +more time.</p> + +<p>Because expired tokens are such a common occurrence, and fixing them is so easy, many +applications just assume the token has expired before even asking for it. If renewing a token is a +cheap operation for your server, you might prefer to call {@link +android.accounts.AccountManager#invalidateAuthToken AccountManager.invalidateAuthToken()} before the +first call to {@link android.accounts.AccountManager#getAuthToken AccountManager.getAuthToken()}, +and spare yourself the need to request an auth token twice.</p> diff --git a/docs/html/training/id-auth/custom_auth.jd b/docs/html/training/id-auth/custom_auth.jd new file mode 100644 index 000000000000..4f59746f51c9 --- /dev/null +++ b/docs/html/training/id-auth/custom_auth.jd @@ -0,0 +1,185 @@ +page.title=Creating a Custom Account Type +parent.title=Identifying and Authenticating Users +parent.link=index.html + +trainingnavtop=true +previous.title=Authenticating to OAuth2 Services +previous.link=authenticate.html + +@jd:body + +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#AccountCode">Implement Your Custom Account Code</a></li> + <li><a href="#Security">Be Smart About Security!</a></li> + <li><a href="#ExtendThatThing">Extend AbstractAccountAuthenticator</a></li> + <li><a href="#TaskFour">Create an Authenticator Service</a></li> + <li><a href="#DistributeService">Distribute Your Service</a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a +href="http://developer.android.com/resources/samples/SampleSyncAdapter/index.html"> +SampleSyncAdapter app</a></li> +</ul> + </div> +</div> + +<p>In the previous lessons, we've talked about using Google accounts to identify Google users and +access Google APIs. But what if you've got your own online service? It turns out +to be relatively straightforward to install new account types on a user's +device. This lesson explains how to create a custom account type that works the +same way as the built-in accounts do. </p> + + +<h2 id="AccountCode">Implement Your Custom Account Code</h2> + +<p>The first thing you'll need is a way to get credentials from the user. This +may be as simple as a dialog box that asks for a name and a password. Or it may +be a more exotic procedure like a one-time password or a biometric scan. Either +way, it's your responsibility to implement the code that:</p> +<ol> + <li>Collects credentials from the user</li> + <li>Authenticates the credentials with the server</li> + <li>Stores the credentials on the device</li> +</ol> + + +<p>Typically all three of these requirements can be handled by one activity. We'll call this the +authenticator activity.</p> + +<p>Because they need to interact with the {@link android.accounts.AccountManager} system, +authenticator activities have certain requirements that normal activities don't. To make it easy to +get things right, the Android framework supplies a base class, {@link +android.accounts.AccountAuthenticatorActivity}, which you can extend to create your own custom +authenticator.</p> + +<p>How you address the first two requirements of an authenticator activity, +credential collection and authentication, is completely up to you. (If there +were only one way to do it, there'd be no need for "custom" account types, after +all.) The third requirement has a canonical, and rather simple, +implementation:</p> + +<pre> +final Account account = new Account(mUsername, <em>your_account_type</em>); +mAccountManager.addAccountExplicitly(account, mPassword, null); +</pre> + + +<h2 id="Security">Be Smart About Security!</h2> + +<p>It's important to understand that {@link android.accounts.AccountManager} is not an encryption +service +or a keychain. It stores account credentials just as you pass them, in <strong>plain +text</strong>. On most devices, this isn't +a particular concern, because it stores them in +a database that is only accessible to root. But on a rooted device, the +credentials would be readable by anyone with {@code adb} access to the device.</p> + +<p>With this in mind, you shouldn't pass the user's actual +password to {@link android.accounts.AccountManager#addAccountExplicitly +AccountManager.addAccountExplicitly()}. Instead, you should store a +cryptographically secure token that would be of limited use to an attacker. If your +user credentials are protecting something valuable, you should carefully +consider doing something similar.</p> + +<p class="caution"><strong>Remember:</strong> When it comes to security code, follow the +"Mythbusters" rule: don't try this at home! Consult a security professional before implementing any +custom account code.</p> + +<p>Now that the security disclaimers are out of the way, it's time to get back to work. +You've already implemented the meat of your custom account code; what's left is +plumbing.</p> + + +<h2 id="ExtendThatThing">Extend AbstractAccountAuthenticator</h2> + +<p>In order for the {@link android.accounts.AccountManager} to work with your custom account +code, you +need a class that implements the interfaces that {@link android.accounts.AccountManager} expects. +This class is the <em>authenticator class</em>.</p> + +<p>The easiest way to create an authenticator class is to extend +{@link android.accounts.AbstractAccountAuthenticator} and implement its abstract methods. If you've +worked through the previous lessons, the abstract methods of +{@link android.accounts.AbstractAccountAuthenticator} should look familiar: they're the opposite +side of +the methods you called in the previous lesson to get account information and +authorization tokens.</p> + +<p>Implementing an authenticator class properly requires a number of separate +pieces of code. First, {@link android.accounts.AbstractAccountAuthenticator} has seven abstract +methods that you must override. Second, you need to add an +<a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">intent filter</a> for +<code>"android.accounts.AccountAuthenticator"</code> to your application +manifest (shown in the next section). Finally, you must supply two XML resources that define, among +other +things, the name of your custom account type and the icon that the system will +display next to accounts of this type.</p> + +<p> You can find a step-by-step guide to implementing a successful authenticator class and the XML +files in the {@link android.accounts.AbstractAccountAuthenticator} documentation. There's also a +sample implementation in the <a +href="http://developer.android.com/resources/samples/SampleSyncAdapter/index.html"> +SampleSyncAdapter sample app</a>.</p> + +<p>As you read through the SampleSyncAdapter code, you'll notice that several of +the methods return an intent in a bundle. This is the same intent that will be +used to launch your custom authenticator activity. If your authenticator +activity needs any special initialization parameters, you can attach them to the +intent using {@link android.content.Intent#putExtra Intent.putExtra()}.</p> + + +<h2 id="TaskFour">Create an Authenticator Service</h2> + +<p>Now that you have an authenticator class, you need a place for it to live. +Account authenticators need to be available to multiple applications and work in +the background, so naturally they're required to run inside a {@link android.app.Service}. We'll +call this the authenticator service.</p> + +<p>Your authenticator service can be very simple. All it needs to do is create +an instance of your authenticator class in {@link android.app.Service#onCreate onCreate()} and call +{@link android.accounts.AbstractAccountAuthenticator#getIBinder getIBinder()} in {@link +android.app.Service#onBind onBind()}. The <a +href="http://developer.android.com/resources/samples/SampleSyncAdapter/index.html"> +SampleSyncAdapter</a> contains a good example of an authenticator service.</p> + +<p>Don't forget to add a {@code <service>} tag to your manifest file +and add an intent filter for the AccountAuthenticator intent and declare the account +authenticator:</p> + +<pre> +<service ...> + <intent-filter> + <action android:name="android.accounts.AccountAuthenticator" /> + </intent-filter> + <meta-data android:name="android.accounts.AccountAuthenticator" + android:resource="@xml/authenticator" /> +</service> +</pre> + + +<h2 id="DistributeService">Distribute Your Service</h2> + +<p>You're done! The system now recognizes your account type, right alongside all +the big name account types like "Google" and "Corporate." You can use the +<strong>Accounts & Sync</strong> Settings page to add an account, and apps that ask for +accounts of your custom type will be able to enumerate and authenticate just as +they would with any other account type.</p> + +<p>Of course, all of this assumes that your account service is actually +installed on the device. If only one app will ever access the service, then +this isn't a big deal—just bundle the service in the app. +But if you want your account service to be used by more than one app, things get +trickier. You don't want to bundle the service with all of your apps and have +multiple copies of it taking up space on your user's device.</p> + +<p>One solution is to place the service in one small, special-purpose APK. When +an app wishes to use your custom account type, it can check the device to see if +your custom account service is available. If not, it can direct the user to +Android Market to download the service. This may seem like a great deal of +trouble at first, but compared with the alternative of re-entering credentials +for every app that uses your custom account, it's refreshingly easy.</p> diff --git a/docs/html/training/id-auth/identify.jd b/docs/html/training/id-auth/identify.jd new file mode 100644 index 000000000000..f18a34fe603f --- /dev/null +++ b/docs/html/training/id-auth/identify.jd @@ -0,0 +1,137 @@ +page.title=Identifying Your User +parent.title=Identifying and Authenticating Users +parent.link=index.html + +trainingnavtop=true +next.title=Authenticating to OAuth2 Services +next.link=authenticate.html + +@jd:body + + +<div id="tb-wrapper"> + <div id="tb"> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#ForYou">Determine if AccountManager for You</a></li> + <li><a href="#TaskTwo">Decide What Type of Account to Use</a></li> + <li><a href="#GetPermission">Request GET_ACCOUNT permission</a></li> + <li><a href="#TaskFive">Query AccountManager for a List of Accounts</a></li> + <li><a href="#IdentifyUser">Use the Account Object to Identify the User</a></li> + <li><a href="#IdIsEnough">Decide Whether Identification is Enough</a></li> +</ol> + </div> +</div> + + +<p>Everyone likes it when you remember their name. One of the simplest, most +effective things you can do to make your app more lovable is to remember who +your user is—especially when the user upgrades to a new device or starts carrying +a tablet as well as a phone. But how do you know who your user is? And how do +you recognize them on a new device?</p> + +<p>For many applications, the answer is the {@link android.accounts.AccountManager} APIs. With the +user's permission, you can use Account Manager to uniquely identify a user +by the online identity that the user has stored on their device.</p> + +<p>Integration with the user's accounts allows you to do a variety of things such as:</p> +<ul> +<li>Auto-fill forms with the user's email address.</li> +<li>Retrieve an ID that is tied to a user, not the device.</li> +</ul> + + +<h2 id="ForYou">Determine if AccountManager for You</h2> + +<p>Applications typically identify the user in three different ways:</p> +<ol type="a"> +<li>Ask the user to type in a username </li> +<li>Use a unique device identifier rather than a user identifier</li> +<li>Retrieve a built-in account from {@link android.accounts.AccountManager}</li> +</ol> + +<p>Option (a) is problematic. First, asking the user to type something before +entering your app will automatically make your app less appealing. Second, +there's no guarantee that the username chosen will be unique. </p> + +<p>Option (b) is less onerous for the user, but it's +<a href="http://android-developers.blogspot.com/2011/03/identifying-app-installations.html">tricky +to get right</a>. More +importantly, it only allows you to remember the user on one device. Imagine the +frustration of someone who upgrades to a shiny new device, only to find that +your app no longer remembers them.</p> + +<p>Option (c) is the preferred technique. Account Manager allows you to get +information about the accounts that are stored on the user's device. As we'll +see in this lesson, using Account Manager lets you identify your user, no matter +how many devices the user may own, by adding just a couple of extra taps to your +UI.</p> + + +<h2 id="TaskTwo">Decide What Type of Account to Use</h2> + +<p>Android devices can store multiple accounts from many different providers. +When you query {@link android.accounts.AccountManager} for account names, you can choose to filter +by +account type. The account type is a string that uniquely identifies the entity +that issued the account. For instance, Google accounts have type "com.google," +while Twitter uses "com.twitter.android.auth.login."</p> + + +<h2 id="GetPermission">Request GET_ACCOUNT permission</h2> + +<p>In order to get a list of accounts on the device, your app needs the {@link +android.Manifest.permission#GET_ACCOUNTS} +permission. Add a <a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">{@code +<uses-permission>}</a> tag in your manifest file to request +this permission:</p> + +<pre> +<manifest ... > + <uses-permission android:name="android.permission.GET_ACCOUNTS" /> + ... +</manifest> +</pre> + + +<h2 id="TaskFive">Query AccountManager for a List of Accounts</h2> + +<p>Once you decide what account type you're interested in, you need to query for accounts of that +type. Get an instance of {@link android.accounts.AccountManager} by calling {@link +android.accounts.AccountManager#get(android.content.Context) AccountManager.get()}. Then use that +instance to call {@link android.accounts.AccountManager#getAccountsByType(java.lang.String) +getAccountsByType()}.</p> + +<pre> +AccountManager am = AccountManager.get(this); // "this" references the current Context + +Account[] accounts = am.getAccountsByType("com.google"); +</pre> + +<p>This returns an array of {@link android.accounts.Account} objects. If there's more than one +{@link android.accounts.Account} in +the array, you should present a dialog asking the user to select one.</p> + + +<h2 id="IdentifyUser">Use the Account Object to Identify the User</h2> + +<p>The {@link android.accounts.Account} object contains an account name, which for Google accounts +is an +email address. You can use this information in several different ways, such as: +<ul> + <li> As suggestions in forms, so the user doesn't need to input account information by +hand.</li> + <li> As a key into your own online database of usage and personalization information.</li> +</ul> +</p> + + +<h2 id="IdIsEnough">Decide Whether Identification is Enough</h2> + +<p>Account names are a good way to identify the user, but the {@link android.accounts.Account} +object by +itself doesn't protect your data or give you access to anything. If you intend +to access private data, you'll need something stronger: authentication. +The next lesson explains how to authenticate to existing online services. The lesson after that +deals with writing a custom authenticator so that you can install your own +account types.</p> diff --git a/docs/html/training/id-auth/index.jd b/docs/html/training/id-auth/index.jd new file mode 100644 index 000000000000..6fbfa6553e3f --- /dev/null +++ b/docs/html/training/id-auth/index.jd @@ -0,0 +1,65 @@ +page.title=Identifying and Authenticating Users + +trainingnavtop=true +startpage=true +next.title=Identifying Your User +next.link=identify.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Requirements and prerequisites</h2> +<ul> + <li>Android 2.0 (API level 5) or higher</li> + <li>Experience with <a href="{@docRoot}guide/topics/fundamentals/services.html">Services</a></li> + <li>Experience with <a href="http://oauth.net/2/">OAuth 2.0</a></li> +</ul> + +<h2>You should also read</h2> +<ul> + <li><a +href="http://developer.android.com/resources/samples/SampleSyncAdapter/index.html"> +SampleSyncAdapter app</a></li> +</ul> + +</div> +</div> + + +<p>Android users get attached to their devices and to applications that they +love. One way to make your application lovable is to make it personal. Android +devices know who your user is, what services they have access to, and where they +store your data. With your user's permission, you can use that information to +make your application a richer, more personal experience.</p> + +<p>In this class, you will learn multiple techniques for interacting with your +user's identity, enabling you to:</p> + +<ul> +<li>Identify the user by detecting and selecting an account +<li>Authenticate the user to make sure they are who they say they are +<li>Gain permission to access the user's online data via services like +the Google APIs +<li>Add a custom account to the user's device to authenticate your own +back-end services +</ul> + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="identify.html">Identifying Your User</a></b></dt> + <dd>Use {@link android.accounts.AccountManager} to learn the user's account name(s).</dd> + + <dt><b><a href="authenticate.html">Authenticating to OAuth2 Services</a></b></dt> + <dd> Use OAuth2 to help users get permission to access web services without needing to type in a +login name or password. </dd> + + <dt><b><a href="custom_auth.html">Creating a Custom Account Type</a></b></dt> + <dd>Add your own account type to the Android Account Manager.</dd> + +</dl> + diff --git a/docs/html/training/improving-layouts/index.jd b/docs/html/training/improving-layouts/index.jd new file mode 100644 index 000000000000..4cc696319817 --- /dev/null +++ b/docs/html/training/improving-layouts/index.jd @@ -0,0 +1,58 @@ +page.title=Improving Performance of Layouts + +trainingnavtop=true +startpage=true +next.title=Optimizing Layout +next.link=optimizing-layout.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 1.5 (API Level 3) or higher</li> +</ul> + +<!-- related docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/ui/declaring-layout.html">XML Layouts</a></li> +</ul> + +</div> +</div> + + + +<p>Layouts are a key part of Android applications that directly affect the user experience. If +implemented poorly, your layout can lead to a memory hungry application with slow UIs. The Android +SDK includes tools to help you identify problems in your layout performance, which when combined the +lessons here, you will be able to implement smooth scrolling interfaces with a minimum memory +footprint.</p> + + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="optimizing-layout.html">Optimizing Layout Hierarchies</a></b></dt> + <dd>In the same way a complex web page can slow down load time, your layout hierarchy +if too complex can also cause performance problems. This lesson shows how you can use SDK tools +to inspect your layout and discover performance bottlenecks.</dd> + <dt><b><a href="reusing-layouts.html">Re-using Layouts with <include/></a></b></dt> + <dd>If your application UI repeats certain layout constructs in multiple places, this lesson +shows you how to create efficient, re-usable layout constructs, then include them in the appropriate +UI layouts.</dd> + <dt><b><a href="loading-ondemand.html">Loading Views On Demand</a></b></dt> + <dd>Beyond simply including one layout component within another layout, you might want to +make the included layout visible only when it's needed, sometime after the activity is running. +This lesson shows how you can improve your layout's initialization performance by loading +portions of your layout on demand.</dd> + <dt><b><a href="smooth-scrolling.html">Making ListView Scrolling Smooth</a></b></dt> + <dd>If you've built an instance of {@link android.widget.ListView} that contains complex or +data-heavy content in each list item, the scroll performance of the list might suffer. This +lesson provides some tips about how you can make your scrolling performance more smooth.</dd> +</dl>
\ No newline at end of file diff --git a/docs/html/training/improving-layouts/loading-ondemand.jd b/docs/html/training/improving-layouts/loading-ondemand.jd new file mode 100644 index 000000000000..659b1ec3cd7d --- /dev/null +++ b/docs/html/training/improving-layouts/loading-ondemand.jd @@ -0,0 +1,86 @@ +page.title=Loading Views On Demand +parent.title=Improving Performance of Layouts +parent.link=index.html + +trainingnavtop=true +previous.title=Re-using Layouts with <include/> +previous.link=reusing-layouts.html +next.title=Making ListView Scrolling Smooth +next.link=smooth-scrolling.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#ViewStub">Define a ViewStub</a></li> + <li><a href="#Load">Load the ViewStub Layout</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}resources/articles/layout-tricks-stubs.html">Using ViewStubs</a></li> +</ul> + +</div> +</div> + + +<p>Sometimes your layout might require complex views that are rarely used. Whether +they are item details, progress indicators, or undo messages, you can reduce memory usage and speed +up rendering by loading the views only when they are needed.</p> + + +<h2 id="ViewStub">Define a ViewStub</h2> + +<p>{@link android.view.ViewStub} is a lightweight view with no dimension and doesn’t draw anything +or participate in the layout. As such, it's cheap to inflate and cheap to leave in a view hierarchy. +Each {@link android.view.ViewStub} simply needs to include the {@code android:layout} attribute to +specify the layout to inflate.</p> + +<p>The following {@link android.view.ViewStub} is for a translucent progress bar overlay. It should +be visible only when new items are being imported into the application.</p> + +<pre> +<ViewStub + android:id="@+id/stub_import" + android:inflatedId="@+id/panel_import" + android:layout="@layout/progress_overlay" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom" /> +</pre> + + +<h2 id="Load">Load the ViewStub Layout</h2> + +<p>When you want to load the layout specified by the {@link android.view.ViewStub}, either set it +visible by calling {@link android.view.View#setVisibility setVisibility(View.VISIBLE)} or call +{@link android.view.ViewStub#inflate()}.</p> + +<pre> +((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); +// or +View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate(); +</pre> + +<p class="note"><strong>Note:</strong> The {@link android.view.ViewStub#inflate()} method returns +the inflated {@link android.view.View} once complete. so you don't need to call {@link +android.app.Activity#findViewById findViewById()} if you need to interact with the layout.</p> + +<p>Once visible/inflated, the {@link android.view.ViewStub} element is no longer part of the view +hierarchy. It is replaced by the inflated layout and the ID for the root view of that layout is +the one specified by the {@code android:inflatedId} attribute of the ViewStub. (The ID {@code +android:id} specified for the {@link android.view.ViewStub} is valid only until the {@link +android.view.ViewStub} layout is visible/inflated.)</p> + +<p class="note"><strong>Note:</strong> One drawback of {@link android.view.ViewStub} is that it +doesn’t currently support the {@code <merge/>} tag in the layouts to be inflated.</p> + + + diff --git a/docs/html/training/improving-layouts/optimizing-layout.jd b/docs/html/training/improving-layouts/optimizing-layout.jd new file mode 100644 index 000000000000..3237780b88e5 --- /dev/null +++ b/docs/html/training/improving-layouts/optimizing-layout.jd @@ -0,0 +1,156 @@ +page.title=Optimizing Layout Hierarchies +parent.title=Improving Performance of Layouts +parent.link=index.html + +trainingnavtop=true +next.title=Re-using Layouts with <include/> +next.link=reusing-layouts.html + +@jd:body + + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Inspect">Inspect Your Layout</a></li> + <li><a href="#Revise">Revise Your Layout</a></li> + <li><a href="#Layoutopt">Use Layoutopt</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/ui/declaring-layout.html">XML Layouts</a></li> + <li><a +href="{@docRoot}guide/topics/resources/layout-resource.html#include- element">Layout +Resource</a></li> +</ul> + +</div> +</div> + + +<p>It is a common misconception that using the basic layout structures leads to the most efficient +layouts. However, each widget and layout you add to your application requires initialization, +layout, and drawing. For example, using nested instances of {@link android.widget.LinearLayout} can +lead to an excessively deep view hierarchy. Furthermore, nesting several instances of {@link +android.widget.LinearLayout} that use the {@code layout_weight} parameter can be especially +expensive as each child needs to be measured twice. This is particularly important when the layout +is inflated repeatedly, such as when used in a {@link android.widget.ListView} or {@link +android.widget.GridView}.</p> + +<p>In this lesson you'll learn to use <a +href="{@docRoot}guide/developing/tools/hierarchy-viewer.html">Heirachy Viewer</a> and <a +href="{@docRoot}guide/developing/tools/layoutopt.html">Layoutopt</a> to examine and optimize your +layout.</p> + + + +<h2 id="Inspect">Inspect Your Layout</h2> + +<p>The Android SDK tools include a tool called <a +href="{@docRoot}guide/developing/tools/hierarchy-viewer.html">Heirachy Viewer</a> that allows +you to analyze your layout while your application is running. Using this tool helps you discover +bottlenecks in the layout performance.</p> + +<p>Hierarchy Viewer works by allowing you to select running processes on a connected device or +emulator, then display the layout tree. The traffic lights on each block represent its Measure, +Layout and Draw performance, helping you identify potential issues.</p> + +<p>For example, figure 1 shows a layout that's used as an item in a {@link +android.widget.ListView}. This layout shows a small bitmap image on the left and two stacked items +of text on the right. It is especially important that layouts that will be inflated multiple +times—such as this one—are optimized as the performance +benefits will be multiplied.</p> + +<img src="{@docRoot}images/training/layout-listitem.png" alt="" /> +<p class="img-caption"><strong>Figure 1.</strong> Conceptual layout for an item in a {@link +android.widget.ListView}.</p> + +<p>The {@code hierarchyviewer} tool is available in {@code <sdk>/tools/}. When opened, +the Hierarchy Viewer shows a list of available devices and its running components. Click +<strong>Load View Hierarchy</strong> to view the layout hierarchy of the selected component. For +example, figure 2 shows the layout for the list item illustrated by figure 1.</p> + +<div style="float:left;width:455px"> +<img src="{@docRoot}images/training/hierarchy-linearlayout.png" alt="" /> +<p class="img-caption"><strong>Figure 2.</strong> Layout hierarchy for the layout in figure 1, +using nested instances of {@link android.widget.LinearLayout}.</p> +</div> + +<div style="float:left;width:155px;margin-left:2em"> +<img src="{@docRoot}images/training/hierarchy-layouttimes.png" alt="" /> +<p class="img-caption"><strong>Figure 3.</strong> Clicking a hierarchy node shows its +performance times.</p> +</div> + +<p style="clear:left">In figure 2, you can see there is a 3-level hierarchy with some problems +laying out the text items. Clicking on the items shows the time taken for each stage of the process +(figure 3). It becomes clear which items are taking the longest to measure, layout, and render, and +where you should spend time optimizing.</p> + +<p>The timings for rendering a complete list item using this layout are:</p> +<ul> + <li>Measure: 0.977ms</li> + <li>Layout: 0.167ms</li> + <li>Draw: 2.717ms</li> +</ul> + + +<h2 id="Revise">Revise Your Layout</h2> + +<p>Because the layout performance above slows down due to a nested {@link +android.widget.LinearLayout}, the performance might improve by flattening the layout—make +the layout shallow and wide, rather than narrow and deep. A {@link android.widget.RelativeLayout} as +the root node allows for such layouts. So, when this design is converted to use {@link +android.widget.RelativeLayout}, you can see that the layout becomes a 2-level hierarchy. Inspection +of the new layout looks like this:</p> + +<img src="{@docRoot}images/training/hierarchy-relativelayout.png" alt="" /> +<p class="img-caption"><strong>Figure 4.</strong> Layout hierarchy for the layout in figure 1, +using {@link android.widget.RelativeLayout}.</p> + +<p>Now rendering a list item takes:</p> +<ul> + <li>Measure: 0.598ms</li> + <li>Layout: 0.110ms</li> + <li>Draw: 2.146ms</li> +</ul> + +<p>Might seem like a small improvement, but this time is multiplied several times because this +layout is used for every item in a list.</p> + +<p>Most of this time difference is due to the use of {@code layout_weight} in the {@link +android.widget.LinearLayout} design, which can slow down the speed of measurement. It is just one +example of how each layout has appropriate uses and you should carefully consider whether using +layout weight is necessary.</p> + + +<h2 id="Layoutopt">Use Layoutopt</h2> + +<p>It is always good practice to also run the <a +href="{@docRoot}guide/developing/tools/layoutopt.html">layoutopt</a> tool on your final layout files +to search for places in your view hierarchy that may be optimized. Layoutopt is also in your SDK +{@code tools/} directory and takes a layout directory name or a space-separated list of layout files +that you'd like to inspect.</p> + +<p>When you run {@code layoutopt} on a layout file, it prints a line number for each issue found, a +description of the issue, and for some types of issues it also suggests a resolution. For +example:</p> + +<pre class="no-pretty-print classic"> +$ layoutopt samples/ +samples/compound.xml + 7:23 The root-level <FrameLayout/> can be replaced with <merge/> + 11:21 This LinearLayout layout or its FrameLayout parent is useless +samples/simple.xml + 7:7 The root-level <FrameLayout/> can be replaced with <merge/> +</pre> + +<p>After you apply the suggested layout optimizations, run Hierarchy Viewer again to inspect the +performance changes.</p> + diff --git a/docs/html/training/improving-layouts/reusing-layouts.jd b/docs/html/training/improving-layouts/reusing-layouts.jd new file mode 100644 index 000000000000..8f9729ac7d68 --- /dev/null +++ b/docs/html/training/improving-layouts/reusing-layouts.jd @@ -0,0 +1,150 @@ +page.title=Re-using Layouts with <include/> +parent.title=Improving Performance of Layouts +parent.link=index.html + +trainingnavtop=true +previous.title=Optimizing Layout Hierarchies +previous.link=optimizing-layout.html +next.title=Loading Views On Demand +next.link=loading-ondemand.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Create">Create a Re-usable Layout</a></li> + <li><a href="#Include">Use the <include> Tag</a></li> + <li><a href="#Merge">Use the <merge> Tag</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}resources/articles/layout-tricks-reuse.html">Creating Reusable UI +Components</a></li> + <li><a href="{@docRoot}resources/articles/layout-tricks-merge.html">Merging Layouts</a></li> + <li><a +href="{@docRoot}guide/topics/resources/layout-resource.html#include-element">Layout +Resource</a></li> +</ul> + +</div> +</div> + + + +<p>Although Android offers a variety of widgets to provide small and re-usable interactive elements, +you might also need to re-use larger components that require a special layout. To efficiently +re-use complete layouts, you can use the {@code <include/>} and {@code <merge/>} tags +to embed another layout inside the current layout.</p> + +<p>Reusing layouts is particularly powerful as it allows you create reusable complex layouts. For +example, a yes/no button panel, or custom progress bar with description text. +It also means that any elements of your application that are common across multiple layouts can be +extracted, managed separately, then included in each layout. So while +you can create individual UI components by writing a custom {@link android.view.View}, you can +do it even more easily by re-using a layout file.</p> + + +<h2 id="Create">Create a Re-usable Layout</h2> + +<p>If you already know the layout that you want to re-use, create a new XML file and define the +layout. For example, here's a layout from the G-Kenya codelab that defines a title bar to be +included in each activity (<code>titlebar.xml</code>):</p> + +<pre> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width=”match_parent” + android:layout_height="wrap_content" + android:background="@color/titlebar_bg"> + + <ImageView android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/gafricalogo" /> +</FrameLayout> +</pre> + +<p>The root {@link android.view.View} should be exactly how you'd like it to appear in each +layout to which you add this layout.</p> + + +<h2 id="Include">Use the <include> Tag</h2> + +<p>Inside the layout to which you want to add the re-usable component, add the {@code +<include/>} tag. For example, here's a layout from the +G-Kenya codelab that includes the title bar from above:</p> + +<p>Here's the layout file:</p> + +<pre> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width=”match_parent” + android:layout_height=”match_parent” + android:background="@color/app_bg" + android:gravity="center_horizontal"> + + <strong><include layout="@layout/titlebar"/></strong> + + <TextView android:layout_width=”match_parent” + android:layout_height="wrap_content" + android:text="@string/hello" + android:padding="10dp" /> + + ... + +</LinearLayout> +</pre> + +<p>You can also override all the layout parameters (any {@code android:layout_*} attributes) of the +included layout's root view by specifying them in the {@code <include/>} tag. For +example:</p> + +<pre> +<include android:id=”@+id/news_title” + android:layout_width=”match_parent” + android:layout_height=”match_parent” + layout=”@layout/title”/> +</pre> + + + +<h2 id="Merge">Use the <merge> Tag</h2> + +<p>The {@code <merge />} tag helps eliminate redundant view groups in your view hierarchy +when including one layout within another. For example, if your main layout is a vertical {@link +android.widget.LinearLayout} in which two consecutive views can be +re-used in multiple layouts, then the re-usable layout in which you place the two views requires its +own root view. However, using another {@link android.widget.LinearLayout} as the root for the +re-usable layout would result in a vertical {@link android.widget.LinearLayout} inside a +vertical {@link android.widget.LinearLayout}. The nested {@link android.widget.LinearLayout} +serves no real purpose other than to slow down your UI performance.</p> + +<p>To avoid including such a redundant view group, you can instead use the +{@code <merge>} element as the root view for the re-usable layout. For example:</p> + +<pre> +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + + <Button + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/add"/> + + <Button + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:text="@string/delete"/> + +</merge> +</pre> + +<p>Now, when you include this layout in another layout (using the {@code <include/>} tag), the +system ignores the {@code <merge>} element and places the two buttons directly in the +layout, in place of the {@code <include/>} tag.</p> + diff --git a/docs/html/training/improving-layouts/smooth-scrolling.jd b/docs/html/training/improving-layouts/smooth-scrolling.jd new file mode 100644 index 000000000000..bc90dd2fa415 --- /dev/null +++ b/docs/html/training/improving-layouts/smooth-scrolling.jd @@ -0,0 +1,124 @@ +page.title=Making ListView Scrolling Smooth +parent.title=Optimizing Performance of Layouts +parent.link=index.html + +trainingnavtop=true +previous.title=Loading Views On Demand +previous.link=loading-ondemand.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#AsyncTask">Use a Background Thread</a></li> + <li><a href="#ViewHolder">Hold View Objects in a View Holder</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}resources/articles/listview-backgrounds.html">ListView +Backgrounds: An Optimization</a></li> +</ul> + +</div> +</div> + +<p>The key to a smoothly scrolling {@link android.widget.ListView} is to keep the application’s main +thread (the UI thread) free from heavy processing. Ensure you do any disk access, network access, or +SQL access in a separate thread. To test the status of your app, you can enable {@link +android.os.StrictMode}.</p> + + +<h2 id="AsyncTask">Use a Background Thread</h2> + +<p>Using a background thread ("worker thread") removes strain from the main thread so it can focus +on drawing the UI. In many cases, using {@link android.os.AsyncTask} provides a simple way to +perform your work outside the main thread. {@link android.os.AsyncTask} automatically queues up all +the {@link android.os.AsyncTask#execute execute()} requests and performs them serially. This +behavior is global to a particular process and means you don’t need to worry about creating your +own thread pool.</p> + +<p>In the sample code below, an {@link android.os.AsyncTask} is used to load +images in a background thread, then apply them to the UI once finished. It also shows a +progress spinner in place of the images while they are loading.</p> + +<pre> +// Using an AsyncTask to load the slow images in a background thread +new AsyncTask<ViewHolder, Void, Bitmap>() { + private ViewHolder v; + + @Override + protected Bitmap doInBackground(ViewHolder... params) { + v = params[0]; + return mFakeImageLoader.getImage(); + } + + @Override + protected void onPostExecute(Bitmap result) { + super.onPostExecute(result); + if (v.position == position) { + // If this item hasn't been recycled already, hide the + // progress and set and show the image + v.progress.setVisibility(View.GONE); + v.icon.setVisibility(View.VISIBLE); + v.icon.setImageBitmap(result); + } + } +}.execute(holder); +</pre> + +<p>Beginning with Android 3.0 (API level 11), an extra feature is available in {@link +android.os.AsyncTask} so you can enable it to run across multiple processor cores. Instead of +calling {@link android.os.AsyncTask#execute execute()} you can specify {@link +android.os.AsyncTask#executeOnExecutor executeOnExecutor()} and multiple requests can be executed at +the same time depending on the number of cores available.</p> + + +<h2 id="ViewHolder">Hold View Objects in a View Holder</h2> + +<p>Your code might call {@link android.app.Activity#findViewById findViewById()} frequently +during the scrolling of {@link android.widget.ListView}, which can slow down performance. Even when +the {@link +android.widget.Adapter} returns an inflated view for recycling, you still need to look up the +elements +and update them. A way around repeated use of {@link android.app.Activity#findViewById +findViewById()} is to use the "view holder" design pattern.</p> + +<p>A {@code ViewHolder} object stores each of the component views inside the tag field of the +Layout, so you can immediately access them without the need to look them up repeatedly. First, you +need to create a class to hold your exact set of views. For example:</p> + +<pre> +static class ViewHolder { + TextView text; + TextView timestamp; + ImageView icon; + ProgressBar progress; + int position; +} +</pre> + +<p>Then populate the {@code ViewHolder} and store it inside the layout.</p> + +<pre> +ViewHolder holder = new ViewHolder(); +holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image); +holder.text = (TextView) convertView.findViewById(R.id.listitem_text); +holder.timestamp = (TextView) convertView.findViewById(R.id.listitem_timestamp); +holder.progress = (ProgressBar) convertView.findViewById(R.id.progress_spinner); +convertView.setTag(holder); +</pre> + +<p>Now you can easily access each view without the need for the look-up, saving valuable processor +cycles.</p> + + + + + diff --git a/docs/html/training/managing-audio/audio-focus.jd b/docs/html/training/managing-audio/audio-focus.jd new file mode 100644 index 000000000000..07a4465f2bed --- /dev/null +++ b/docs/html/training/managing-audio/audio-focus.jd @@ -0,0 +1,183 @@ +page.title=Managing Audio Focus +parent.title=Managing Audio Playback and Focus +parent.link=index.html + +trainingnavtop=true +previous.title=Controlling Your App's Volume and Playback +previous.link=volume-playback.html +next.title=Dealing with Audio Output Hardware +next.link=audio-output.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#RequestFocus">Request the Audio Focus</a></li> + <li><a href="#HandleFocusLoss">Handle the Loss of Audio Focus</a></li> + <li><a href="#DUCK">Duck!</a></li> +</ol> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a></li> +</ul> + +</div> +</div> + + +<p>With multiple apps potentially playing audio it's important to think about how they should +interact. To avoid every music app playing at the same time, Android uses audio focus to moderate +audio playback—only apps that hold the audio focus should play audio.</p> + +<p>Before your app starts playing audio it should request—and receive—the audio focus. +Likewise, it should know how to listen for a loss of audio focus and respond appropriately when that +happens.</p> + + +<h2 id="RequestFocus">Request the Audio Focus</h2> + +<p>Before your app starts playing any audio, it should hold the audio focus for the stream +it will be using. This is done with a call to {@link android.media.AudioManager#requestAudioFocus +requestAudioFocus()} which returns +{@link android.media.AudioManager#AUDIOFOCUS_REQUEST_GRANTED} if your request is successful.</p> + +<p>You must specify which stream you're using and whether you expect to require transient or +permanent audio focus. Request transient focus when you expect to play audio for only a short time +(for example when playing navigation instructions). Request permanent audio focus when you +plan to play audio for the foreseeable future (for example, when playing music).</p> + +<p>The following snippet requests permanent audio focus on the music audio stream. You should +request the audio focus immediately before you begin playback, such as when the user presses +play or the background music for the next game level begins.</p> + +<pre> +AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); +... + +// Request audio focus for playback +int result = am.requestAudioFocus(afChangeListener, + // Use the music stream. + AudioManager.STREAM_MUSIC, + // Request permanent focus. + AudioManager.AUDIOFOCUS_GAIN); + +if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); + // Start playback. +} +</pre> + +<p>Once you've finished playback be sure to call {@link +android.media.AudioManager#abandonAudioFocus abandonAudioFocus()}. This notifies +the system that you no longer require focus and unregisters the associated {@link +android.media.AudioManager.OnAudioFocusChangeListener}. In the case of abandoning transient focus, +this allows any interupted app to continue playback.</p> + +<pre> +// Abandon audio focus when playback complete +am.abandonAudioFocus(afChangeListener); +</pre> + +<p>When requesting transient audio focus you have an additional option: whether or not you want to +enable "ducking." Normally, when a well-behaved audio app loses audio focus it immediately +silences its playback. By requesting a transient audio focus that allows ducking you tell other +audio apps that it’s acceptable for them to keep playing, provided they lower their volume until the +focus returns to them.</p> + +<pre> +// Request audio focus for playback +int result = am.requestAudioFocus(afChangeListener, + // Use the music stream. + AudioManager.STREAM_MUSIC, + // Request permanent focus. + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); + +if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + // Start playback. +} +</pre> + +<p>Ducking is particularly suitable for apps that use the audio stream intermittently, such as for +audible driving directions.</p> + +<p>Whenever another app requests audio focus as described above, its choice between permanent and +transient (with or without support for ducking) audio focus is received by the listener you +registered when requesting focus.</p> + + +<h2 id="HandleFocusLoss">Handle the Loss of Audio Focus</h2> + +<p>If your app can request audio focus, it follows that it will in turn lose that focus when another +app requests it. How your app responds to a loss of audio focus depends on the manner of that +loss.</p> + +<p>The {@link android.media.AudioManager.OnAudioFocusChangeListener#onAudioFocusChange +onAudioFocusChange()} callback method of they audio focus change listener you registered when +requesting audio focus receives a parameter that describes the focus change event. Specifically, +the possible focus loss events mirror the focus request types from the previous +section—permanent loss, transient loss, and transient with ducking permitted.</p> + +<p>Generally speaking, a transient (temporary) loss of audio focus should result in your app +silencing it’s audio stream, but otherwise maintaining the same state. You should continue to +monitor changes in audio focus and be prepared to resume playback where it was paused once you’ve +regained the focus.</p> + +<p>If the audio focus loss is permanent, it’s assumed that another application is now being used to +listen to audio and your app should effectively end itself. In practical terms, that means stopping +playback, removing media button listeners—allowing the new audio player to exclusively handle +those events—and abandoning your audio focus. At that point, you would expect a user action +(pressing play in your app) to be required before you resume playing audio.</p> + +<p>In the following code snippet, we pause the playback or our media player object if the audio +loss is transien and resume it when we have regained the focus. If the loss is permanent, it +unregisters our media button event receiver and stops monitoring audio focus changes.<p> + +<pre> +OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { + public void onAudioFocusChange(int focusChange) { + if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT + // Pause playback + } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { + // Resume playback + } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { + am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); + am.abandonAudioFocus(afChangeListener); + // Stop playback + } + } +}; +</pre> + +<p>In the case of a transient loss of audio focus where ducking is permitted, rather than pausing +playback, you can "duck" instead.</p> + + +<h2 id="DUCK">Duck!</h2> + +<p>Ducking is the process of lowering your audio stream output volume to make transient audio from +another app easier to hear without totally disrupting the audio from your own application.</p> + +<p>In the following code snippet lowers the volume on our media player object when we temporarily +lose focus, then returns it to its previous level when we regain focus.</p> + +<pre> +OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { + public void onAudioFocusChange(int focusChange) { + if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK + // Lower the volume + } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { + // Raise it back to normal + } + } +}; +</pre> + +<p>A loss of audio focus is the most important broadcast to react to, but not the only one. The +system broadcasts a number of intents to alert you to changes in user’s audio experience. +The next lesson demonstrates how to monitor them to improve the user’s overall experience.</p> diff --git a/docs/html/training/managing-audio/audio-output.jd b/docs/html/training/managing-audio/audio-output.jd new file mode 100644 index 000000000000..d5d7e4b97e0c --- /dev/null +++ b/docs/html/training/managing-audio/audio-output.jd @@ -0,0 +1,88 @@ +page.title=Dealing with Audio Output Hardware +parent.title=Managing Audio Playback and Focus +parent.link=index.html + +trainingnavtop=true +previous.title=Managing Audio Focus +previous.link=audio-focus.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#CheckHardware">Check What Hardware is Being Used</a></li> + <li><a href="#HandleChanges">Handle Changes in the Audio Output Hardware</a></li> +</ol> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a></li> +</ul> + + +</div> +</div> + +<p>Users have a number of alternatives when it comes to enjoying the audio from their Android +devices. Most devices have a built-in speaker, headphone jacks for wired headsets, and many also +feature Bluetooth connectivity and support for A2DP audio. </p> + + +<h2 id="CheckHardware">Check What Hardware is Being Used</h2> + +<p>How your app behaves might be affected by which hardware its output is being routed to.</p> + +<p>You can query the {@link android.media.AudioManager} to determine if the audio is currently +being routed to the device speaker, wired headset, or attached Bluetooth device as shown in the +following snippet:</p> + +<pre> +if (isBluetoothA2dpOn()) { + // Adjust output for Bluetooth. +} else if (isSpeakerphoneOn()) { + // Adjust output for Speakerphone. +} else if (isWiredHeadsetOn()) { + // Adjust output for headsets +} else { + // If audio plays and noone can hear it, is it still playing? +} +</pre> + + +<h2 id="HandleChanges">Handle Changes in the Audio Output Hardware</h2> + +<p>When a headset is unplugged, or a Bluetooth device disconnected, the audio stream +automatically reroutes to the built in speaker. If you listen to your music at as high a volume as I +do, that can be a noisy surprise.</p> + +<p>Luckily the system broadcasts an {@link android.media.AudioManager#ACTION_AUDIO_BECOMING_NOISY} +intent when this happens. It’s good practice to register a {@link android.content.BroadcastReceiver} +that listens for this intent whenever you’re playing audio. In the case of music players, users +typically expect the playback to be paused—while for games you may choose to significantly +lower the volume.</p> + +<pre> +private class NoisyAudioStreamReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { + // Pause the playback + } + } +} + +private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY); + +private void startPlayback() { + registerReceiver(myNoisyAudioStreamReceiver(), intentFilter); +} + +private void stopPlayback() { + unregisterReceiver(myNoisyAudioStreamReceiver); +} +</pre> diff --git a/docs/html/training/managing-audio/index.jd b/docs/html/training/managing-audio/index.jd new file mode 100644 index 000000000000..c7df39be7354 --- /dev/null +++ b/docs/html/training/managing-audio/index.jd @@ -0,0 +1,62 @@ +page.title=Managing Audio Playback and Focus + +trainingnavtop=true +startpage=true +next.title=Controlling Your App's Volume and Playback +next.link=volume-playback.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 2.0 (API level 5) or higher</li> + <li>Experience with <a href="{@docRoot}guide/topics/media/mediaplayer.html">Media +Playback</a></li> +</ul> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/fundamentals/services.html">Services</a></li> +</ul> + +</div> +</div> + + +<p>If your app plays audio, it’s important that your users can control the audio in a predictable +manner. To ensure a great user experience, it’s also important that your app manages the audio focus +to ensure multiple apps aren’t playing audio at the same time.</p> + +<p>After this class, you will be able to build apps that respond to hardware audio key presses, +which request audio focus when playing audio, and which respond appropriately to changes in audio +focus caused by the system or other applications.</p> + + + + +<h2>Lessons</h2> + +<!-- Create a list of the lessons in this class along with a short description of each lesson. +These should be short and to the point. It should be clear from reading the summary whether someone +will want to jump to a lesson or not.--> + +<dl> + <dt><b><a href="volume-playback.html">Controlling Your App’s Volume and +Playback</a></b></dt> + <dd>Learn how to ensure your users can control the volume of your app using the hardware or +software volume controls and where available the play, stop, pause, skip, and previous media +playback keys.</dd> + + <dt><b><a href="audio-focus.html">Managing Audio Focus</a></b></dt> + <dd>With multiple apps potentially playing audio it's important to think about how they should +interact. To avoid every music app playing at the same time, Android uses audio focus to moderate +audio playback. Learn how to request the audio focus, listen for a loss of audio focus, and how to +respond when that happens.</dd> + + <dt><b><a href="audio-output.html">Dealing with Audio Output Hardware</a></b></dt> + <dd>Audio can be played from a number of sources. Learn how to find out where the audio is being +played and how to handle a headset being disconnected during playback.</dd> + </dl>
\ No newline at end of file diff --git a/docs/html/training/managing-audio/volume-playback.jd b/docs/html/training/managing-audio/volume-playback.jd new file mode 100644 index 000000000000..7038ddfbd782 --- /dev/null +++ b/docs/html/training/managing-audio/volume-playback.jd @@ -0,0 +1,156 @@ +page.title=Controlling Your App’s Volume and Playback +parent.title=Managing Audio Playback and Focus +parent.link=index.html + +trainingnavtop=true +next.title=Managing Audio Focus +next.link=audio-focus.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#IdentifyStream">Identify Which Audio Stream to Use</a></li> + <li><a href="#HardwareVolumeKeys">Use Hardware Volume Keys to Control Your App’s Audio +Volume</a></li> + <li><a href="#PlaybackControls">Use Hardware Playback Control Keys to Control Your App’s Audio +Playback</a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/media/mediaplayer.html">Media Playback</a></li> +</ul> + +</div> +</div> + + + +<p>A good user experience is a predictable one. If your app plays media it’s important that your +users can control the volume of your app using the hardware or software volume controls of their +device, bluetooth headset, or headphones.</p> + +<p>Similarly, where appropriate and available, the play, stop, pause, skip, and previous media +playback keys should perform their respective actions on the audio stream used by your app.</p> + + +<h2 id="IdentifyStream">Identify Which Audio Stream to Use</h2> + +<p>The first step to creating a predictable audio experience is understanding which audio stream +your app will use.</p> + +<p>Android maintains a separate audio stream for playing music, alarms, notifications, the incoming +call ringer, system sounds, in-call volume, and DTMF tones. This is done primarily to allow users to +control the volume of each stream independently.</p> + +<p>Most of these streams are restricted to system events, so unless your app is a replacement alarm +clock, you’ll almost certainly be playing your audio using the {@link +android.media.AudioManager#STREAM_MUSIC} stream.</p> + + +<h2 id="HardwareVolumeKeys">Use Hardware Volume Keys to Control Your App’s Audio Volume</h2> + +<p>By default, pressing the volume controls modify the volume of the active audio stream. If your +app isn't currently playing anything, hitting the volume keys adjusts the ringer volume.<p> + +<p>If you've got a game or music app, then chances are good that when the user hits the volume keys +they want to control the volume of the game or music, even if they’re currently between songs or +there’s no music in the current game location.</p> + +<p>You may be tempted to try and listen for volume key presses and modify the volume of your +audio stream that way. Resist the urge. Android provides the handy {@link +android.app.Activity#setVolumeControlStream setVolumeControlStream()} method to direct volume key +presses to the audio stream you specify.<p> + +<p>Having identified the audio stream your application +will be using, you should set it as the volume stream target. You should make this call early in +your app’s lifecycle—because you only need to call it once during the activity lifecycle, you +should typically call it within the {@code onCreate()} method (of the {@link +android.app.Activity} or {@link android.app.Fragment} that controls +your media). This ensures that whenever your app is visible, the +volume controls function as the user expects.<p> + +<pre> +setVolumeControlStream(AudioManager.STREAM_MUSIC); +</pre> + + +<p>From this point onwards, pressing the volume keys on the device affect the audio stream you +specify (in this case “music”) whenever the target activity or fragment is visible.</p> + + +<h2 id="PlaybackControls">Use Hardware Playback Control Keys to Control Your App’s Audio +Playback</h2> + +<p>Media playback buttons such as play, pause, stop, skip, and previous are available on some +handsets and many connected or wireless headsets. Whenever a user presses one of these hardware +keys, the system broadcasts an intent with the {@link android.content.Intent#ACTION_MEDIA_BUTTON} +action.</p> + +<p>To respond to media button clicks, you need to register a {@link +android.content.BroadcastReceiver} in your manifest that listens for this action broadcast as shown +below.</p> + +<pre> +<receiver android:name=".RemoteControlReceiver"> + <intent-filter> + <action android:name="android.intent.action.MEDIA_BUTTON" /> + </intent-filter> +</receiver> +</pre> + +<p>The receiver implementation itself needs to extract which key was pressed to cause the broadcast. +The {@link android.content.Intent} includes this under the {@link +android.content.Intent#EXTRA_KEY_EVENT} key, while the {@link android.view.KeyEvent} class includes +a list {@code KEYCODE_MEDIA_*} static constants that represents each of the possible media +buttons, such as {@link android.view.KeyEvent#KEYCODE_MEDIA_PLAY_PAUSE} and {@link +android.view.KeyEvent#KEYCODE_MEDIA_NEXT}.</p> + +<p>The following snippet shows how to extract the media button pressed and affects the media playback accordingly.</p> + +<pre> +public class RemoteControlReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { + KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); + if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) { + // Handle key press. + } + } + } +} +</pre> + +<p>Because multiple applications might want to listen for media button presses, you must +also programmatically control when your app should receive media button press events.</p> + +<p>The following code can be used within your app to register and de-register your media button +event receiver using the {@link android.media.AudioManager}. When registered, your broadcast +receiver is the exclusive receiver of all media button broadcasts.<p> + +<pre> +AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); +... + +// Start listening for button presses +am.registerMediaButtonEventReceiver(RemoteControlReceiver); +... + +// Stop listening for button presses +am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); +</pre> + +<p>Typically, apps should unregister most of their receivers whenever they become inactive or +invisible (such as during the {@link android.app.Activity#onStop onStop()} callback). However, it’s +not that simple for media playback apps—in fact, responding to media playback buttons is most +important when your application isn’t visible and therefore can’t be controlled by the on-screen +UI.</p> + +<p>A better approach is to register and unregister the media button event receiver when your +application gains and losses the audio focus. This is covered in detail in the next lesson.</p> diff --git a/docs/html/training/monetization/ads-and-ux.jd b/docs/html/training/monetization/ads-and-ux.jd new file mode 100644 index 000000000000..2fec6f224b4b --- /dev/null +++ b/docs/html/training/monetization/ads-and-ux.jd @@ -0,0 +1,250 @@ +page.title=Advertising without Compromising User Experience +parent.title=Monetizing your App +parent.link=index.html +@jd:body + + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#ObtainPubAccountAndSDK">Obtain a Publisher Account and Ad SDK</a></li> + <li><a href="#DeclarePermissions">Declare Proper Permissions</a></li> + <li><a href="#SetupAdPlacement">Set Up Ad Placement</a></li> + <li><a href="#InitializeAd">Initialize the Ad</a></li> + <li><a href="#EnableTestMode">Enable Test Mode</a></li> + <li><a href="#ImplementListeners">Implement Ad Event Listeners</a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a href="http://code.google.com/mobile/ads/">AdMob SDK</a></li> +</ul> + + +<h2>Try it out</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/MobileAds.zip" class="button">Download +the sample app</a> + <p class="filename">MobileAds.zip</p> +</div> + + +</div> +</div> + +<p>Advertising is one of the means to monetize (make money with) mobile applications. In this +lesson, you are going to learn how to incorporate banner ads in your Android application.</p> + +<p>While this lesson and the sample application use <a +href="http://code.google.com/mobile/ads/">AdMob</a> to serve ads, the Android platform doesn’t +impose any restrictions on the choice of mobile advertising network. To the extent possible, this +lesson generically highlights concepts that are similar across advertising networks.</p> + +<p>For example, each advertising network may have some network-specific configuration settings such +as geo-targeting and ad-text font size, which may be configurable on some networks but not on +others. This lesson does not touch not these topics in depth and you should consult documentation +provided by the network you choose.</p> + + +<h2 id="ObtainPubAccountAndSDK">Obtain a Publisher Account and Ad SDK</h2> + +<p>In order to integrate advertisements in your application, you first must become a publisher by +registering a publishing account with the mobile advertising network. Typically, an identifier is +provisioned for each application serving advertisements. This is how the advertising network +correlates advertisements served in applications. In the case of AdMob, the identifier is known as +the Publisher ID. You should consult your advertising networks for details.</p> + +<p>Mobile advertising networks typically distribute a specific Android SDK, which consists of code +that takes care of communication, ad refresh, look-and-feel customization, and so on.</p> + +<p>Most advertising networks distribute their SDK as a JAR file. Setting up ad network JAR file in +your Android project is no different from integrating any third-party JAR files. First, copy the +JAR files to the <code>libs/</code> directory of your project. If you’re using Eclipse as IDE, be +sure to add the JAR file to the Build Path. It can be done through <b>Properties > +Java Build Path > Libraries > Add JARs</b>.</p> + +<img src="/images/training/ads-eclipse-build-path.png" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> Eclipse build path settings. +</p> + + +<h2 id="DeclarePermissions">Declare Proper Permissions</h2> + +<p>Because the mobile ads are fetched over the network, mobile advertising SDKs usually +require the declaration of related permissions in the Android manifest. Other kinds of permissions +may also be required.</p> + +<p>For example, here's how you can request the {@link android.Manifest.permission#INTERNET} +permission:</p> + +<pre> +</manifest> + <uses-permission android:name="android.permission.INTERNET" /> + ... + <application>...</application> +</manifest> +</pre> + + +<h2 id="SetupAdPlacement">Set Up Ad Placement</h2> + +<div class="figure" style="width:262px"> +<img src="/images/training/ads-top-banner.png" id="figure2" /> +<p class="img-caption"> + <strong>Figure 2.</strong> Screenshot of the ad layout in the Mobile Ads sample. +</p> +</div> + +<p>Banner ads typically are implemented as a custom {@link android.webkit.WebView} (a view for +viewing web pages). Ads also come in different dimensions and shapes. Once you’ve decided to put an +ad on a particular screen, you can add it in your activity's XML layout. The XML snippet below +illustrates a banner ad displayed on top of a screen.</p> + +<pre> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/ad_catalog_layout" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" > + <com.google.ads.AdView + xmlns:googleads="http://schemas.android.com/apk/lib/com.google.ads" + android:id="@+id/ad" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + googleads:adSize="BANNER" + googleads:adUnitId="@string/admob_id" /> + <TextView android:id="@+id/title" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="@string/banner_top" /> + <TextView android:id="@+id/status" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> +</LinearLayout> +</pre> + +<p>You should consider using alternative ad sizes based on various configurations such as screen +size or screen orientation. This can easily be addressed by <a +href="{@docRoot}guide/topics/resources/providing-resources.html#AlternativeResources">providing +alternative resources</a>. For instance, the above sample layout might placed under the +<code>res/layout/</code> directory as the default layout. If larger ad +sizes are available, you can consider using them for "large" (and above) screens. For example, the +following snippet comes from a layout file in the <code>res/layout-large/</code> directory, which +renders a larger ad for "large" screen sizes.</p> + +<pre> +... +<com.google.ads.AdView + xmlns:googleads="http://schemas.android.com/apk/lib/com.google.ads" + android:id="@+id/ad" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + <strong>googleads:adSize="IAB_LEADERBOARD"</strong> + googleads:adUnitId="@string/admob_id" /> +... +</pre> + +<p>Notice that the custom view name and it’s configuration attributes are network-specific. Ad +networks might support configurations with XML layout attributes (as shown above), runtime APIs, or +both. In the sample application, Mobile Ads, the {@code AdView} ad size +(<code>googleads:adSize</code>) and publisher ID (<code>googleads:adUnitId</code>) are set up in the +XML layout.</p> + +<p>When deciding where to place ads within your application, you should carefully +consider user-experience. For example, you don’t want to fill the screen with +multiple ads that will quite likely annoy your users. In fact, this practice is banned by some ad +networks. Also, avoid placing ads too closely to UI controls to avoid inadvertent clicks.</p> + +<p>Figures 3 and 4 illustrate what <strong>not</strong> to do.</p> + +<div style="float:left;width:275px"> +<img src="/images/training/ads-close-to-button.png" /> +<p class="img-caption"> + <strong>Figure 3.</strong> Avoid putting UI +inputs too closely to an ad banner to prevent inadvertent ad clicks. +</p> +</div> + +<div style="float:left;width:275px;height:530px;margin-left:2em"> +<img src="/images/training/ads-cover-content.png" /> +<p class="img-caption"> + <strong>Figure 4.</strong> Don't overlay ad banner on useful content. +</p> +</div> + + +<h2 id="InitializeAd" style="clear:left">Initialize the Ad</h2> + +<p>After setting up the ad in the XML layout, you can further customize the ad in {@link +android.app.Activity#onCreate Activity.onCreate()} or {@link +android.app.Fragment#onCreateView Fragment.onCreateView()} based on how your application is +architected. Depending on the ad network, possible configuration parameters are: ad size, font +color, keyword, demographics, location targeting, and so on.</p> + +<p>It is important to respect user privacy if certain parameters, such as demographics or location, +are passed to ad networks for targeting purposes. Let your users know and give them a chance to opt +out of these features.</p> + +<p>In the below code snippet, keyword targeting is used. After the keywords are set, the +application calls <code>loadAd()</code> to begin serving ads.</p> + +<pre> +public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + ... + View v = inflater.inflate(R.layout.main, container, false); + mAdStatus = (TextView) v.findViewById(R.id.status); + mAdView = (AdView) v.findViewById(R.id.ad); + mAdView.setAdListener(new MyAdListener()); + + AdRequest adRequest = new AdRequest(); + adRequest.addKeyword("sporting goods"); + mAdView.loadAd(adRequest); + return v; +} +</pre> + + + +<h2 id="EnableTestMode">Enable Test Mode</h2> + +<p>Some ad networks provide a test mode. This is useful during development and testing in which ad +impressions and clicks are not counted.</p> + +<p class="caution"><strong>Important:</strong> Be sure to turn off test mode before publishing your +application.</p> + + +<h2 id="ImplementListeners">Implement Ad Event Listeners</h2> + +<p>Where available, you should consider implementing ad event listeners, which provide callbacks on +various ad-serving events associated with the ad view. Depending on the ad network, the listener +might provide notifications on events such as before the ad is loaded, after the ad is loaded, +whether the ad fails to load, or other events. You can choose to react to these events based on +your specific situation. For example, if the ad fails to load, you can display a custom banner +within the application or create a layout such that the rest of content fills up the screen.</p> + +<p>For example, here are some event callbacks available from AdMob's {@code AdListener} +interface:</p> + +<pre> +private class MyAdListener implements AdListener { + ... + + @Override + public void onFailedToReceiveAd(Ad ad, ErrorCode errorCode) { + mAdStatus.setText(R.string.error_receive_ad); + } + + @Override + public void onReceiveAd(Ad ad) { + mAdStatus.setText(""); + } +} +</pre> + diff --git a/docs/html/training/monetization/index.jd b/docs/html/training/monetization/index.jd new file mode 100644 index 000000000000..f90bfc735622 --- /dev/null +++ b/docs/html/training/monetization/index.jd @@ -0,0 +1,44 @@ +page.title=Monetizing Your App + +trainingnavtop=true +startpage=true +next.title=Advertising without Compromising User Experience +next.link=ads-and-ux.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 1.0 or higher</li> + <li>Experience with <a href="{@docRoot}guide/topics/ui/declaring-layout.html">XML layouts</a></li> +</ul> + + +<h2>Try it out</h2> + +<div class="download-box"> + <a href="http://developer.android.com/shareables/training/MobileAds.zip" class="button">Download +the sample app</a> + <p class="filename">MobileAds.zip</p> +</div> + +</div> +</div> + +<p>Apart from offering paid apps, there are a number of other ways to monetize your mobile applications. In this class, we are going to examine a number of typical methods (more lessons are to come) and their associated technical best practices. Obviously, each application is different and you should experiment with different combinations of these and other monetization methods to determine what works best for you.</p> + +<h2>Lessons</h2> + +<!-- Create a list of the lessons in this class along with a short description of each lesson. +These should be short and to the point. It should be clear from reading the summary whether someone +will want to jump to a lesson or not.--> + +<dl> + <dt><b><a href="ads-and-ux.html">Advertising without Compromising User Experience</a></b></dt> + <dd>In this lesson, you will learn how to monetize your application with mobile +advertisements.</dd> +</dl> diff --git a/docs/html/training/monitoring-device-state/battery-monitoring.jd b/docs/html/training/monitoring-device-state/battery-monitoring.jd new file mode 100644 index 000000000000..a442140aaad8 --- /dev/null +++ b/docs/html/training/monitoring-device-state/battery-monitoring.jd @@ -0,0 +1,156 @@ +page.title=Monitoring the Battery Level and Charging State +parent.title=Monitoring Device State to Optimize Battery Life +parent.link=index.html + +trainingnavtop=true +next.title=Determining and Monitoring the Docking State and Type +next.link=docking-monitoring.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#DetermineChargeState">Determine the Current Charging State</a></li> + <li><a href="#MonitorChargeState">Monitor Changes in Charging State</a></li> + <li><a href="#CurrentLevel">Determine the Current Battery Level</a></li> + <li><a href="#MonitorLevel">Monitor Significant Changes in Battery Level</a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> +</ul> + +</div> +</div> + +<p>When you're altering the frequency of your background updates to reduce the effect of those +updates on battery life, checking the current battery level and charging state is a good place to +start.</p> + +<p>The battery-life impact of performing application updates depends on the battery level and +charging state of the device. The impact of performing updates while the device is charging over AC +is negligible, so in most cases you can maximize your refresh rate whenever the device is connected +to a wall charger. Conversely, if the device is discharging, reducing your update rate helps +prolong the battery life.</p> + +<p>Similarly, you can check the battery charge level, potentially reducing the frequency of—or +even stopping—your updates when the battery charge is nearly exhausted.</p> + + +<h2 id="DetermineChargeState">Determine the Current Charging State</h2> + +<p>Start by determining the current charge status. The {@link android.os.BatteryManager} +broadcasts all battery and charging details in a sticky {@link android.content.Intent} that includes +the charging status.</p> + +<p>Because it's a sticky intent, you don't need to register a {@link +android.content.BroadcastReceiver}—by simply calling {@code registerReceiver} passing in +{@code null} as the receiver as shown in the next snippet, the current battery status intent is +returned. You could pass in an actual {@link android.content.BroadcastReceiver} object here, but +we'll be handling updates in a later section so it's not necessary.</p> + +<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); +Intent batteryStatus = context.registerReceiver(null, ifilter);</pre> + +<p>You can extract both the current charging status and, if the device is being charged, whether +it's charging via USB or AC charger:<p> + +<pre>// Are we charging / charged? +int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1); +boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + +// How are we charging? +int chargePlug = battery.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); +boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; +boolean acCharge = chargePlug == BATTERY_PLUGGED_AC;</pre> + +<p>Typically you should maximize the rate of your background updates in the case where the device is +connected to an AC charger, reduce the rate if the charge is over USB, and lower it +further if the battery is discharging.</p> + + +<h2 id="MonitorChargeState">Monitor Changes in Charging State</h2> + +<p>The charging status can change as easily as a device can be plugged in, so it's important to +monitor the charging state for changes and alter your refresh rate accordingly.</p> + +<p>The {@link android.os.BatteryManager} broadcasts an action whenever the device is connected or +disconnected from power. It's important to to receive these events even while your app isn't +running—particularly as these events should impact how often you start your app in order to +initiate a background update—so you should register a {@link +android.content.BroadcastReceiver} in your manifest to listen for both events by defining the +{@link android.content.Intent#ACTION_POWER_CONNECTED} and {@link +android.content.Intent#ACTION_POWER_DISCONNECTED} within an intent filter.</p> + +<pre><receiver android:name=".PowerConnectionReceiver"> + <intent-filter> + <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> + <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> + </intent-filter> +</receiver></pre> + +<p>Within the associated {@link android.content.BroadcastReceiver} implementation, you can extract +the current charging state and method as described in the previous step.</p> + +<pre>public class PowerConnectionReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || + status == BatteryManager.BATTERY_STATUS_FULL; + + int chargePlug = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usbCharge = chargePlug == BATTERY_PLUGGED_USB; + boolean acCharge = chargePlug == BATTERY_PLUGGED_AC; + } +}</pre> + + +<h2 id="CurrentLevel">Determine the Current Battery Level</h2> + +<p>In some cases it's also useful to determine the current battery level. You may choose to reduce +the rate of your background updates if the battery charge is below a certain level.</p> + +<p>You can find the current battery charge by extracting the current battery level and scale from +the battery status intent as shown here:</p> + +<pre>int level = battery.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); +int scale = battery.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + +float batteryPct = level / (float)scale;</pre> + + +<h2 id="MonitorLevel">Monitor Significant Changes in Battery Level</h2> + +<p>You can't easily continually monitor the battery state, but you don't need to.</p> + +<p>Generally speaking, the impact of constantly monitoring the battery level has a greater +impact on the battery than your app's normal behavior, so it's good practice to only monitor +significant changes in battery level—specifically when the device enters or exits a low +battery state.</p> + +<p>The manifest snippet below is extracted from the intent filter element within a broadcast +receiver. The receiver is triggered whenever the device battery becomes low or exits the low +condition by listening for {@link android.content.Intent#ACTION_BATTERY_LOW} and {@link +android.content.Intent#ACTION_BATTERY_OKAY}.</p> + +<pre><receiver android:name=".BatteryLevelReceiver"> +<intent-filter> + <action android:name="android.intent.action.ACTION_BATTERY_LOW"/> + <action android:name="android.intent.action.ACTION_BATTERY_OKAY"/> + </intent-filter> +</receiver></pre> + +<p>It is generally good practice to disable all your background updates when the battery is +critically low. It doesn't matter how fresh your data is if the phone turns itself off before you +can make use of it.</p> + +<p>In many cases, the act of charging a device is coincident with putting it into a dock. The next +lesson shows you how to determine the current dock state and monitor for changes in device +docking.</p> + diff --git a/docs/html/training/monitoring-device-state/connectivity-monitoring.jd b/docs/html/training/monitoring-device-state/connectivity-monitoring.jd new file mode 100644 index 000000000000..4c7127905939 --- /dev/null +++ b/docs/html/training/monitoring-device-state/connectivity-monitoring.jd @@ -0,0 +1,90 @@ +page.title=Determining and Monitoring the Connectivity Status +parent.title=Monitoring Device State to Optimize Battery Life +parent.link=index.html + +trainingnavtop=true + +previous.title=Determining and Monitoring the Docking State and Type +previous.link=docking-monitoring.html +next.title=Manipulating Broadcast Receivers On Demand +next.link=manifest-receivers.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#DetermineConnection">Determine if you Have an Internet Connection</a></li> + <li><a href="#DetermineType">Determine the Type of your Internet Connection</a></li> + <li><a href="#MonitorChanges">Monitor for Changes in Connectivity</a></li> +</ol> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> +</ul> + +</div> +</div> + +<p>Some of the most common uses for repeating alarms and background services is to schedule regular +updates of application data from Internet resources, cache data, or execute long running downloads. +But if you aren't connected to the Internet, or the connection is too slow to complete your +download, why both waking the device to schedule the update at all?</p> + +<p>You can use the {@link android.net.ConnectivityManager} to check that you're actually +connected to the Internet, and if so, what type of connection is in place.</p> + + +<h2 id="DetermineConnection">Determine if You Have an Internet Connection</h2> + +<p>There's no need to schedule an update based on an Internet resource if you aren't connected to +the Internet. The following snippet shows how to use the {@link android.net.ConnectivityManager} +to query the active network and determine if it has Internet connectivity.</p> + +<pre>ConnectivityManager cm = + (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); + +NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); +boolean isConnected = activeNetwork.isConnectedOrConnecting();</pre> + + +<h2 id="DetermineType">Determine the Type of your Internet Connection</h2> + +<p>It's also possible to determine the type of Internet connection currently available.</p> + +<p>Device connectivity can be provided by mobile data, WiMAX, Wi-Fi, and ethernet connections. By +querying the type of the active network, as shown below, you can alter your refresh rate based on +the bandwidth available.</p> + +<pre>boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI;</pre> + +<p>Mobile data costs tend to be significantly higher than Wi-Fi, so in most cases, your app's update +rate should be lower when on mobile connections. Similarly, downloads of significant size should be +suspended until you have a Wi-Fi connection.</p> + +<p>Having disabled your updates, it's important that you listen for changes in connectivity in order +to resume them once an Internet connection has been established.</p> + + +<h2 id="MonitorChanges">Monitor for Changes in Connectivity</h2> + +<p>The {@link android.net.ConnectivityManager} broadcasts the {@link +android.net.ConnectivityManager#CONNECTIVITY_ACTION} ({@code +"android.net.conn.CONNECTIVITY_CHANGE"}) action whenever the connectivity details have changed. You +can register a broadcast receiver in your manifest to listen for these changes and resume (or +suspend) your background updates accordingly.</p> + +<pre><action android:name="android.net.conn.CONNECTIVITY_CHANGE"/></pre> + +<p>Changes to a device's connectivity can be very frequent—this broadcast is triggered +every time you move between mobile data and Wi-Fi. As a result, it's good practice to monitor +this broadcast only when you've previously suspended updates or downloads in order to resume them. +It's generally sufficient to simply check for Internet connectivity before beginning an update and, +should there be none, suspend further updates until connectivity is restored.</p> + +<p>This technique requires toggling broadcast receivers you've declard in the manifest, which is +described in the next lesson.</p> diff --git a/docs/html/training/monitoring-device-state/docking-monitoring.jd b/docs/html/training/monitoring-device-state/docking-monitoring.jd new file mode 100644 index 000000000000..6a4a9a8e1a91 --- /dev/null +++ b/docs/html/training/monitoring-device-state/docking-monitoring.jd @@ -0,0 +1,90 @@ +page.title=Determining and Monitoring the Docking State and Type +parent.title=Monitoring Device State to Optimize Battery Life +parent.link=index.html + +trainingnavtop=true +previous.title= Monitoring the Battery Level and Charging State +previous.link=battery-monitoring.html +next.title= Determining and Monitoring the Connectivity Status +next.link=connectivity-monitoring.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#CurrentDockState">Request the Audio Focus</a></li> + <li><a href="#DockType">Determine the Current Dock Type</a></li> + <li><a href="#MonitorDockState">Monitor for Changes in the Dock State or Type</a></li> +</ol> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> +</ul> + +</div> +</div> + +<p>Android devices can be docked into several different kinds of docks. These include car or home +docks and digital versus analog docks. The dock-state is typically closely linked to the charging +state as many docks provide power to docked devices.</p> + +<p>How the dock-state of the phone affects your update rate depends on your app. You may choose +to increase the update frequency of a sports center app when it's in the desktop dock, or disable +your updates completely if the device is car docked. Conversely, you may choose to maximize your +updates while car docked if your background service is updating traffic conditions.</p> + +<p>The dock state is also broadcast as a sticky {@link android.content.Intent}, allowing you to +query if the device is docked or not, and if so, in which kind of dock.</p> + + +<h2 id="CurrentDockState">Determine the Current Docking State</h2> + +<p>The dock-state details are included as an extra in a sticky broadcast of the {@link +android.content.Intent#ACTION_DOCK_EVENT} action. Because it's sticky, you don't need to register a +{@link android.content.BroadcastReceiver}. You can simply call {@link +android.content.Context#registerReceiver registerReceiver()} passing in {@code null} as the +broadcast receiver as shown in the next snippet.</p> + +<pre>IntentFilter ifilter = new IntentFilter(Intent.ACTION_DOCK_EVENT); +Intent dockStatus = context.registerReceiver(null, ifilter);</pre> + +<p>You can extract the current docking status from the {@code EXTRA_DOCK_STATE} extra:<p> + +<pre>int dockState = battery.getIntExtra(EXTRA_DOCK_STATE, -1); +boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;</pre> + + +<h2 id="DockType">Determine the Current Dock Type</h2> + +<p>If a device is docked, it can be docked in any one of four different type of dock: +<ul><li>Car</li> +<li>Desk</li> +<li>Low-End (Analog) Desk</li> +<li>High-End (Digital) Desk</li></ul></p> + +<p>Note that the latter two options were only introduced to Android in API level 11, so it's good +practice to check for all three where you are only interested in the type of dock rather than it +being digital or analog specifically:</p> + +<pre>boolean isCar = dockState == EXTRA_DOCK_STATE_CAR; +boolean isDesk = dockState == EXTRA_DOCK_STATE_DESK || + dockState == EXTRA_DOCK_STATE_LE_DESK || + dockState == EXTRA_DOCK_STATE_HE_DESK;</pre> + + +<h2 id="MonitorDockState">Monitor for Changes in the Dock State or Type</h2> + +<p>Whenever the the device is docked or undocked, the {@link +android.content.Intent#ACTION_DOCK_EVENT} action is broadcast. To monitor changes in the +device's dock-state, simply register a broadcast receiver in your application manifest as shown in +the snippet below:</p> + +<pre><action android:name="android.intent.action.ACTION_DOCK_EVENT"/></pre> + +<p>You can extract the dock type and state within the receiver implementation using the same +techniques described in the previous step.</p> diff --git a/docs/html/training/monitoring-device-state/index.jd b/docs/html/training/monitoring-device-state/index.jd new file mode 100644 index 000000000000..e92e1e8a3027 --- /dev/null +++ b/docs/html/training/monitoring-device-state/index.jd @@ -0,0 +1,63 @@ +page.title=Monitoring Device State to Optimize Battery Life + +trainingnavtop=true +startpage=true +next.title=Monitoring the Battery Level and Charging State +next.link=battery-monitoring.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 2.0 (API level 5) or higher</li> + <li>Experience with <a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a></li> +</ul> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/fundamentals/services.html">Services</a> +</ul> + +</div> +</div> + +<p>For your app to be a good citizen, it should seek to limit its impact on the battery life of its +host device. After this class you will be able to build apps that monitor modify their functionality +and behavior based on the state of the host device.</p> + +<p>By taking steps such as disabling background service updates when you lose connectivity, or +reducing the rate of such updates when the battery level is low, you can ensure that the impact of +your app on battery life is minimized, without compromising the user experience.</p> + +<h2>Lessons</h2> + +<!-- Create a list of the lessons in this class along with a short description of each lesson. +These should be short and to the point. It should be clear from reading the summary whether someone +will want to jump to a lesson or not.--> + +<dl> + <dt><b><a href="battery-monitoring.html">Monitoring the Battery Level and Charging State</a></b></dt> + <dd>Learn how to alter your app's update rate by determining, and monitoring, the current battery +level and changes in charging state.</dd> + + <dt><b><a href="docking-monitoring.html">Determining and Monitoring the Docking State and +Type</a></b></dt> + <dd>Optimal refresh rates can vary based on how the host device is being used. Learn how to +determine, and monitor, the docking state and type of dock being used to affect your app's +behavior.</dd> + + <dt><b><a href="connectivity-monitoring.html">Determining and Monitoring the Connectivity +Status</a></b></dt> + <dd>Without Internet connectivity you can't update your app from an online source. Learn how to +check the connectivity status to alter your background update rate. You'll also learn to check for +Wi-Fi or mobile connectivity before beginning high-bandwidth operations.</dd> + + <dt><b><a href="manifest-receivers.html">Manipulating Broadcast Receivers On Demand</a></b></dt> + <dd>Broadcast receivers that you've declared in the manifest can be toggled at runtime to disable +those that aren't necessary due to the current device state. Learn to improve +efficiency by toggling and cascading state change receivers and delay actions until the device is in +a specific state.</dd> +</dl>
\ No newline at end of file diff --git a/docs/html/training/monitoring-device-state/manifest-receivers.jd b/docs/html/training/monitoring-device-state/manifest-receivers.jd new file mode 100644 index 000000000000..bf5462a1e7c3 --- /dev/null +++ b/docs/html/training/monitoring-device-state/manifest-receivers.jd @@ -0,0 +1,64 @@ +page.title=Manipulating Broadcast Receivers On Demand +parent.title=Monitoring Device State to Optimize Battery Life +parent.link=index.html + +trainingnavtop=true + +previous.title=Determining and Monitoring the Connectivity Status +previous.link=connectivity-monitoring.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="ToggleReceivers">Toggle and Cascade State Change Receivers to Improve +Efficiency</a></li> +</ol> + + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and Intent Filters</a> +</ul> + +</div> +</div> + +<p>The simplest way to monitor device state changes is to create a {@link +android.content.BroadcastReceiver} for each state you're monitoring and register each of them in +your application manifest. Then within each of these receivers you simply reschedule your recurring +alarms based on the current device state.</p> + +<p>A side-effect of this approach is that your app will wake the device each time any of these +receivers is triggered—potentially much more frequently than required.</p> + +<p>A better approach is to disable or enable the broadcast receivers at runtime. That way you can +use the receivers you declared in the manifest as passive alarms that are triggered by system events +only when necessary.</p> + + +<h2 id="ToggleReceivers">Toggle and Cascade State Change Receivers to Improve Efficiency </h2> + +<p>Use can use the {@link android.content.pm.PackageManager} to toggle the enabled state on any +component defined in the manifest, including whichever broadcast receivers you wish to enable or +disable as shown in the snippet below:</p> + +<pre>ComponentName receiver = new ComponentName(context, myReceiver.class); + +PackageManager pm = context.getPackageManager(); + +pm.setComponentEnabledSetting(receiver, + PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP)</pre> + +<p>Using this technique, if you determine that connectivity has been lost, you can disable all of +your receivers except the connectivity-change receiver. Conversely, once you are connected you can +stop listening for connectivity changes and simply check to see if you're online immediately before +performing an update and rescheduling a recurring update alarm.</p> + +<p>You can use the same technique to delay a download that requires higher bandwidth to complete. +Simply enable a broadcast receiver that listens for connectivity changes and initiates the +download only after you are connected to Wi-Fi.</p> diff --git a/docs/html/training/multiple-apks/api.jd b/docs/html/training/multiple-apks/api.jd new file mode 100644 index 000000000000..292e5d0488ee --- /dev/null +++ b/docs/html/training/multiple-apks/api.jd @@ -0,0 +1,379 @@ +page.title=Creating Multiple APKs for Different API Levels +parent.title=Creating and Maintaining Multiple APKs +parent.link=index.html + +trainingnavtop=true +next.title=Creating Multiple APKs for Different Screen Sizes +next.link=screensize.html + +@jd:body + +<style type="text/css"> +.blueCell { background-color: #9fc5e8;} +.greenCell { background-color: #b6d7a8;} +.redCell { background-color: #ea9999;} +.blackCell { background-color: #000000;} +</style> + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Confirm">Confirm You Need Multiple APKs</a></li> + <li><a href="#ChartReqs">Chart Your Requirements</a></li> + <li><a href="#CreateLibrary">Put All Common Code and Resources in a Library Project</a></li> + <li><a href="#CreateAPKs">Create New APK Projects</a></li> + <li><a href="#AdjustManifests">Adjust the Manifests</a></li> + <li><a href="#PreLaunch">Go Over Pre-launch Checklist</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="http://developer.android.com/guide/market/publishing/multiple-apks.html">Multiple APK +Support</a></li> + <li><a +href="http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html"> +How to have your (Cup)cake and eat it too</a></li> +</ul> + +</div> +</div> + + +<p>When developing your Android application to take advantage of multiple APKs on Android Market, +it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches +further into the development process. This lesson shows you how to create multiple APKs of your +app, each covering a slightly different range of API levels. You will also gain some tools +necessary to make maintaining a multiple APK codebase as painless as possible.</p> + + +<h2 id="Confirm">Confirm You Need Multiple APKs</h2> + +<p>When trying to create an application that works across multiple generations of the Android +platform, naturally you want your application to take advantage of new features on new devices, +without sacrificing backwards compatibility. It may seem at the outset as though multiple APK +support is the best solution, but this often isn’t the case. The <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#ApiLevelOptions">Using Single APK +Instead</a> section of the multiple APK developer guide includes some useful information on how to +accomplish this with a single APK, including use of our support library. You can also learn how to +write code that runs only at certain API levels in a single APK, without resorting to +computationally expensive techniques like reflection from <a +href="http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html"> +this article</a>.</p> + +<p>If you can manage it, confining your application to a single APK has several +advantages, including:</p> + +<ul> +<li>Publishing and testing are easier</li> +<li>There’s only one codebase to maintain</li> +<li>Your application can adapt to device configuration changes</li> +<li>App restore across devices just works</li> +<li>You don’t have to worry about market preference, behavior from "upgrades" from one APK to the +next, or which APK goes with which class of devices +</ul> + +<p>The rest of this lesson assumes that you’ve researched the topic, studiously absorbed the +material in the resources linked, and determined that multiple APKs are the right path for your +application.</p> + +<h2 id="ChartReqs">Chart Your Requirements</h2> + +<p>Start off by creating a simple chart to quickly determine how many APKs you need, and what API +range each APK covers. For handy reference, the <a +href="{@docRoot}resources/dashboard/platform-versions.html">Platform Versions</a> page of the +Android Developer website provides data about the relative number of active devices running a given +version of the Android platform. Also, although it sounds easy at first, keeping track of which set +of API levels each APK is going to target gets difficult rather quickly, especially if there’s going +to be some overlap (there often is). Fortunately, it’s easy to chart out your requirements quickly, +easily, and have an easy reference for later.</p> + +<p>In order to create your multiple APK chart, start out with a row of cells representing the +various API levels of the Android platform. Throw an extra cell at the end to represent future +versions of Android.</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td>3</td> + <td>4</td> + <td>5</td> + <td>6</td> + <td>7</td> + <td>8</td> + <td>9</td> + <td>10</td> + <td>11</td> + <td>12</td> + <td>13</td> + <td>+</td> + </tr> + </tbody> +</table> + +<p>Now just color in the chart such that each color represents an APK. Here’s one example of how +you might apply each APK to a certain range of API levels.</p> + +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">3</td> + <td class="blueCell">4</td> + <td class="blueCell">5</td> + <td class="blueCell">6</td> + <td class="greenCell">7</td> + <td class="greenCell">8</td> + <td class="greenCell">9</td> + <td class="greenCell">10</td> + <td class="redCell">11</td> + <td class="redCell">12</td> + <td class="redCell">13</td> + <td class="redCell">+</td> + </tr> + </tbody> +</table> + +<p>Once you’ve created this chart, distribute it to your team. Team communication on your project +just got immediately simpler, since instead of asking "How’s the APK for API levels 3 to 6, er, you +know, the Android 1.x one. How’s that coming along?" You can simply say "How’s the Blue APK coming +along?"</p> + +<h2 id="CreateLibrary">Put All Common Code and Resources in a Library Project</h2> +<p>Whether you’re modifying an existing Android application or starting one from scratch, this is +the first thing that you should do to the codebase, and by the far the most important. Everything +that goes into the library project only needs to be updated once (think language-localized strings, +color themes, bugs fixed in shared code), which improves your development time and reduces the +likelihood of mistakes that could have been easily avoided.</p> + +<p class="note"><strong>Note:</strong> While the implementation details of how to create and +include library projects are beyond the scope of this lesson, you can get up to speed quickly on +their creation at the following links:</p> +<ul> +<li><a +href="{@docRoot}guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject">Setting up +a library project (Eclipse)</a></li> +<li><a +href="{@docRoot}guide/developing/projects/projects-cmdline.html#SettingUpLibraryProject">Setting up +a library project (Command line)</a></li> +</ul> + + +<p>If you’re converting an existing application to use multiple APK support, +scour your codebase for every localized string file, list of values, theme +colors, menu icons and layout that isn’t going to change across APKs, and put +it all in the library project. Code that isn’t going to change much should +also go in the library project. You’ll likely find yourself extending these +classes to add a method or two from APK to APK.</p> + +<p>If, on the other hand, you’re creating the application from scratch, try as +much as possible to write code in the library project <em>first</em>, then only move it down to an +individual APK if necessary. This is much easier to manage in the long run than adding it to one, +then another, then another, then months later trying to figure out whether this blob can be moved up +to the library section without screwing anything up.</p> + +<h2 id="CreateAPKs">Create New APK Projects</h2> +<p>There should be a separate Android project for each APK you’re going to release. For easy +organization, place the library project and all related APK projects under the same parent folder. +Also remember that each APK needs to have the same package name, although they don’t necessarily +need to share the package name with the library. If you were to have 3 APKs following the scheme +described earlier, your root directory might look like this:</p> + +<pre class="no-pretty-print classic"> +alexlucas:~/code/multi-apks-root$ ls +foo-blue +foo-green +foo-lib +foo-red +</pre> + +<p>Once the projects are created, add the library project as a reference to each APK project. If +possible, define your starting Activity in the library project, and extend that Activity in your APK +project. Having a starting activity defined in the library project gives you a chance to put all +your application initialization in one place, so that each individual APK doesn’t have to +re-implement "universal" tasks like initializing Analytics, running licensing checks, and any other +initialization procedures that don’t change much from APK to APK.</p> + + +<h2 id="AdjustManifests">Adjust the Manifests</h2> +<p>When a user downloads an application which uses multiple APKs through Android Market, the correct +APK to use is chosen using two simple rules:</p> +<ul> +<li>The manifest has to show that particular APK is eligible</li> +<li>Of the eligible APKs, highest version number wins</li> +</ul> +<p> +By way of example, let’s take the set of multiple APKs described earlier, and assume that we haven’t +set a max API level for any of the APKs. Taken individually, the possible range of each APK would +look like this:</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">3</td> + <td class="blueCell">4</td> + <td class="blueCell">5</td> + <td class="blueCell">6</td> + <td class="blueCell">7</td> + <td class="blueCell">8</td> + <td class="blueCell">9</td> + <td class="blueCell">10</td> + <td class="blueCell">11</td> + <td class="blueCell">12</td> + <td class="blueCell">13</td> + <td class="blueCell">+</td> + </tr> + <tr> + <td class="blackCell">3</td> + <td class="blackCell">4</td> + <td class="blackCell">5</td> + <td class="blackCell">6</td> + <td class="greenCell">7</td> + <td class="greenCell">8</td> + <td class="greenCell">9</td> + <td class="greenCell">10</td> + <td class="greenCell">11</td> + <td class="greenCell">12</td> + <td class="greenCell">13</td> + <td class="greenCell">+</td> + </tr> + <tr> + <td class="blackCell">3</td> + <td class="blackCell">4</td> + <td class="blackCell">5</td> + <td class="blackCell">6</td> + <td class="blackCell">7</td> + <td class="blackCell">8</td> + <td class="blackCell">9</td> + <td class="blackCell">10</td> + <td class="redCell">11</td> + <td class="redCell">12</td> + <td class="redCell">13</td> + <td class="redCell">+</td> + </tr> + </tbody> +</table> +<p> +Because it is required that an APK with a higher minSdkVersion also have a +higher version code, we know that in terms of versionCode values, red ≥ +green ≥ blue. Therefore we can effectively collapse the chart to look like this:</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">3</td> + <td class="blueCell">4</td> + <td class="blueCell">5</td> + <td class="blueCell">6</td> + <td class="greenCell">7</td> + <td class="greenCell">8</td> + <td class="greenCell">9</td> + <td class="greenCell">10</td> + <td class="redCell">11</td> + <td class="redCell">12</td> + <td class="redCell">13</td> + <td class="redCell">+</td> + </tr> + </tbody> +</table> + +<p> +Now, let’s further assume that the Red APK has some requirement on it that the other two don’t. The +Market Filters page of the Android Developer guide has a whole list of possible culprits. For the +sake of example, let’s assume that red requires a front-facing camera. In fact, the entire point of +the red APK is to combine the front-facing camera with sweet new functionality that was added in API +11. But, it turns out, not all devices that support API 11 even HAVE front-facing cameras! The +horror!</p> + +<p>Fortunately, if a user is browsing Market from one such device, Android Market will look at the +manifest, see that Red lists the front-facing camera as a requirement, and quietly ignore it, having +determined that Red and that device are not a match made in digital heaven. It will then see that +Green is not only forward-compatible with devices with API 11 (since no maxSdkVersion was defined), +but also doesn’t care whether or not there’s a front-facing camera! The app can still be downloaded +from Android Market by the user, because despite the whole front-camera mishap, there was still an +APK that supported that particular API level.</p> + +<p> In order to keep all your APKs on separate "tracks", it’s important to have a good version code +scheme. The recommended one can be found on the <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#VersionCodes">Version Codes</a> area of +our developer guide. Since the example set of APKs is only dealing with one of 3 possible +dimensions, it would be sufficient to separate each APK by 1000, set the first couple digits to the +minSdkVersion for that particular APK, and increment from there. This might look like:</p> + +<p>Blue: 03001, 03002, 03003, 03004...<br /> +Green: 07001, 07002, 07003, 07004...<br /> +Red:11001, 11002, 11003, 11004...</p> + +<p> Putting this all together, your Android Manifests would likely look something like the following:</p> +<p>Blue:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="03001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="3" /> + ... +</pre> + +<p>Green:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="07001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="7" /> + ... +</pre> + +<p>Red:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="11001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="11" /> + ... +</pre> + +<h2 id="PreLaunch">Go Over Pre-launch Checklist</h2> +<p> Before uploading to Android Market, double-check the following items. Remember that these are specifically relevant to multiple APKs, and in no way represent a complete checklist for all applications being uploaded to Android Market.</p> + +<ul> +<li>All APKs must have the same package name</li> +<li>All APKs must be signed with the same certificate</li> +<li>If the APKs overlap in platform version, the one with the higher minSdkVersion must have a higher version code</li> +<li>Double check your manifest filters for conflicting information (an APK that only supports cupcake on XLARGE screens isn’t going to be seen by anybody)</li> +<li>Each APK's manifest must be unique across at least one of supported screen, openGL texture, or platform version</li> +<li>Try to test each APK on at least one device. Barring that, you have one of the most customizable device emulators in the business sitting on your development machine. Go nuts!</li> +</ul> + +<p>It’s also worth inspecting the compiled APK before pushing to market, to make sure there aren’t +any surprises that could hide your application in Market. This is actually quite simple using the +"aapt" tool. Aapt (the Android Asset Packaging Tool) is part of the build process for creating and +packaging your Android applications, and is also a very handy tool for inspecting them. </p> + +<pre class="no-pretty-print classic"> +>aapt dump badging +package: name='com.example.hello' versionCode='1' versionName='1.0' +sdkVersion:'11' +uses-permission:'android.permission.SEND_SMS' +application-label:'Hello' +application-icon-120:'res/drawable-ldpi/icon.png' +application-icon-160:'res/drawable-mdpi/icon.png' +application-icon-240:'res/drawable-hdpi/icon.png' +application: label='Hello' icon='res/drawable-mdpi/icon.png' +launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' +uses-feature:'android.hardware.telephony' +uses-feature:'android.hardware.touchscreen' +main +supports-screens: 'small' 'normal' 'large' 'xlarge' +supports-any-density: 'true' +locales: '--_--' +densities: '120' '160' '240' +</pre> + +<p>When you examine aapt output, be sure to check that you don’t have conflicting values for +supports-screens and compatible-screens, and that you don’t have unintended "uses-feature" values +that were added as a result of permissions you set in the manifest. In the example above, the APK +won’t be visible to very many devices.</p> +<p>Why? By adding the required permission SEND_SMS, the feature requirement of android.hardware.telephony was implicitly added. Since API 11 is Honeycomb (the version of Android optimized specifically for tablets), and no Honeycomb devices have telephony hardware in them, Market will filter out this APK in all cases, until future devices come along which are higher in API level AND possess telephony hardware. +</p> +<p>Fortunately this is easily fixed by adding the following to your manifest:</p> +<pre> +<uses-feature android:name="android.hardware.telephony" android:required="false" /> +</pre> +<p>Once you’ve completed the pre-launch checklist, upload your APKs to Android Market. It may take a bit for the application to show up when browsing Android Market, but when it does, perform one last check. Download the application onto any test devices you may have, to make sure that the APKs are targeting the intended devices. Congratulations, you’re done!</p> diff --git a/docs/html/training/multiple-apks/index.jd b/docs/html/training/multiple-apks/index.jd new file mode 100644 index 000000000000..eee926c147e4 --- /dev/null +++ b/docs/html/training/multiple-apks/index.jd @@ -0,0 +1,72 @@ +page.title=Creating and Maintaining Multiple APKs + +trainingnavtop=true +startpage=true +next.title=Creating Multiple APKs for Different API Levels +next.link=api.html + +@jd:body + + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> + +<ul> + <li>Android 1.0 and higher</li> + <li>You must have an <a href="http://market.android.com/publish">Android Market</a> publisher +account</li> +</ul> + +<!-- related docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="http://developer.android.com/guide/market/publishing/multiple-apks.html">Multiple APK +Support</a></li> +</ul> + +</div> +</div> + +<p>Multiple APK support is a feature in Android Market that allows you to publish multiple APKs +under the same application listing. Each APK is a complete instance of your application, optimized +to target specific device configurations. Each APK can target a specific set of GL +textures, API levels, screen sizes, or some combination thereof.</p> + +<p>This class shows you how to write your multiple APK application using any one of these +configuration variables. Each lesson covers basics about how to organize your codebase and target +the right devices, as well as the smart way to avoid pitfalls such as unnecessary redundancy across +your codebase, and making mistakes in your manifest that could render an APK invisible to all +devices in Android Market. By going through any of these lessons, you'll know how to develop +multiple APKs the smart way, make sure they're targeting the devices you want them to, +and know how to catch mistakes <em>before</em> your app goes live.</p> + + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="api.html">Creating Multiple APKs for Different API Levels</a></b></dt> + <dd>Learn how to target different versions of the Android platform using multiple APKs. Also +learn how to organize your codebase, what to do with your manifest, and how to investigate your APK +configuration using the <code>aapt</code> tool before pushing live.</dd> + + <dt><b><a href="screensize.html">Creating Multiple APKs for Different Screen Sizes</a></b></dt> + <dd>Learn how to target Android devices by screen size using multiple APKs. Also learn how to +organize your codebase, what to do with your manifest, and how to investigate your APK configuration +using the <code>aapt</code> tool before pushing live.</dd> + + <dt><b><a href="texture.html">Creating Multiple APKs for Different GL Textures</a></b></dt> + <dd>Learn how to target Android devices based on their support for GL texture. Also learn +how to organize your codebase, what to do with your manifest, and how to investigate your APK +configuration using the <code>aapt</code> tool before pushing live.</dd> + + <dt><b><a href="multiple.html">Creating Multiple APKs with 2+ Dimensions</a></b></dt> + <dd>Learn how to target different Android devices based on more than one configuration +variable (screen size, API version, GL texture). Examples in the lesson target using a combination +of API level and screen size. Also learn how to organize your codebase, what to do with your +manifest, and how to investigate your APK configuration using the <code>aapt</code> tool before +pushing live.</dd> +</dl> diff --git a/docs/html/training/multiple-apks/multiple.jd b/docs/html/training/multiple-apks/multiple.jd new file mode 100644 index 000000000000..f8723797e3f4 --- /dev/null +++ b/docs/html/training/multiple-apks/multiple.jd @@ -0,0 +1,475 @@ +page.title=Creating Multiple APKs with 2+ Dimensions +parent.title=Creating and Maintaining Multiple APKs +parent.link=index.html + +trainingnavtop=true +previous.title=Creating Multiple APKs for Different GL Textures +previous.link=texture.html + +@jd:body + +<style> +.blueCell { background-color: #9fc5e8;} +.greenCell { background-color: #b6d7a8;} +.redCell { background-color: #ea9999;} +.purpleCell { background-color: #b4a7d6;} +.blackCell { background-color: #000000;} +</style> + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Confirm">Confirm You Need Multiple APKs</a></li> + <li><a href="#ChartReqs">Chart Your Requirements</a></li> + <li><a href="#CreateLibrary">Put All Common Code and Resources in a Library Project.</a></li> + <li><a href="#CreateAPKs">Create New APK Projects</a></li> + <li><a href="#AdjustManifests">Adjust the Manifests</a></li> + <li><a href="#PreLaunch">Go Over Pre-launch Checklist</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="http://developer.android.com/guide/market/publishing/multiple-apks.html">Multiple APK +Support</a></li> +</ul> + +</div> +</div> + +<p>When developing your Android application to take advantage of multiple APKs on Android Market, +it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches +further into the development process. This lesson shows you how to create multiple APKs of your +app, each covering a different class of screen size. You will also gain some tools necessary to +make maintaining a multiple APK codebase as painless as possible.</p> + + +<h2 id="Confirm">Confirm You Need Multiple APKs</h2> + +<p>When trying to create an application that works across the huge range of available Android +devices, naturally you want your application look its best on each individual device. You want to +take advantage of the space of large screens but still work on small ones, to use new Android API +features or visual textures available on cutting edge devices but not abandon older ones. It may +seem at the outset as though multiple APK support is the best solution, but this often isn’t the +case. The <a href="{@docRoot}guide/market/publishing/multiple-apks.html#ApiLevelOptions">Using +Single APK Instead</a> section of the multiple APK guide includes some useful information on how to +accomplish all of this with a single APK, including use of our <a +href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html">support library</a>, +and links to resources throughout the Android Developer guide.</p> + +<p>If you can manage it, confining your application to a single APK has several advantages, +including:</p> + +<ul> +<li>Publishing and Testing are easier</li> +<li>There’s only one codebase to maintain</li> +<li>Your application can adapt to device configuration changes</li> +<li>App restore across devices just works</li> +<li>You don’t have to worry about market preference, behavior from "upgrades" from one APK to the +next, or which APK goes with which class of devices</li> +</ul> + +<p>The rest of this lesson assumes that you’ve researched the topic, studiously absorbed the +material in the resources linked, and determined that multiple APKs are the right path for your +application.</p> + + +<h2 id="ChartReqs">Chart Your Requirements</h2> + +<p>Start off by creating a simple chart to quickly determine how many APKs you need, and what screen +size(s) each APK covers. Fortunately, it’s easy to chart out your requirements quickly, easily, and +have an easy reference for later. Let’s say you want to split your APKs across two dimensions, API +and screen size. Create a table with a row and column for each possible pair of values, and color +in some "blobs", each color representing one APK.</p> + +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td>3</td> + <td>4</td> + <td>5</td> + <td>6</td> + <td>7</td> + <td>8</td> + <td>9</td> + <td>10</td> + <td>11</td> + <td>12</td> + <td>+</td> + </tr> + <tr> + <td>small</td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>normal</td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>large</td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>large</td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + </tbody> +</table> + +<p> +Above is an example with four APKs. Blue is for all small/normal screen devices, Green is for large +screen devices, and Red is for xlarge screen devices, all with an API range of 3-10. Purple is a +special case, as it’s for all screen sizes, but only for API 11 and up. More importantly, just by +glancing at this chart, you immediately know which APK covers any given API/screen-size combo. To +boot, you also have swanky codenames for each one, since "Have we tested red on the ?" is a lot +easier to ask your cubie than "Have we tested the 3-to-10 xlarge APK against the Xoom?" Print this +chart out and hand it to every person working on your codebase. Life just got a lot easier.</p> + +<h2 id="CreateLibrary">Put All Common Code and Resources in a Library Project.</h2> + +<p>Whether you’re modifying an existing Android application or starting one from scratch, this is +the first thing that you should do to the codebase, and by the far the most important. Everything +that goes into the library project only needs to be updated once (think language-localized strings, +color themes, bugs fixed in shared code), which improves your development time and reduces the +likelihood of mistakes that could have been easily avoided.</p> + +<p class="note"><strong>Note:</strong> While the implementation details of how to create and +include library projects are beyond the scope of this lesson, you can get up to speed quickly on +their creation at the following links:</p> +<ul> +<li><a +href="{@docRoot}guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject">Setting up +a library project (Eclipse)</a></li> +<li><a +href="{@docRoot}guide/developing/projects/projects-cmdline.html#SettingUpLibraryProject">Setting up +a library project (Command line)</a></li> +</ul> + +<p>If you’re converting an existing application to use multiple APK support, +scour your codebase for every localized string file, list of values, theme +colors, menu icons and layout that isn’t going to change across APKs, and put +it all in the library project. Code that isn’t going to change much should +also go in the library project. You’ll likely find yourself extending these +classes to add a method or two from APK to APK.</p> + +<p>If, on the other hand, you’re creating the application from scratch, try as +much as possible to write code in the library project <em>first</em>, then only move it down to an +individual APK if necessary. This is much easier to manage in the long run than adding it to one, +then another, then another, then months later trying to figure out whether this blob can be moved up +to the library section without screwing anything up.</p> + +<h2 id="CreateAPKs">Create New APK Projects</h2> +<p>There should be a separate Android project for each APK you’re going to release. For easy +organization, place the library project and all related APK projects under the same parent folder. +Also remember that each APK needs to have the same package name, although they don’t necessarily +need to share the package name with the library. If you were to have 3 APKs following the scheme +described earlier, your root directory might look like this:</p> + +<pre class="no-pretty-print classic"> +alexlucas:~/code/multi-apks-root$ ls +foo-blue +foo-green +foo-lib +foo-purple +foo-red +</pre> + +<p>Once the projects are created, add the library project as a reference to each APK project. If +possible, define your starting Activity in the library project, and extend that Activity in your APK +project. Having a starting activity defined in the library project gives you a chance to put all +your application initialization in one place, so that each individual APK doesn’t have to +re-implement "universal" tasks like initializing Analytics, running licensing checks, and any other +initialization procedures that don’t change much from APK to APK.</p> + + +<h2 id="AdjustManifests">Adjust the Manifests</h2> +<p>When a user downloads an application which uses multiple APKs through Android Market, the correct +APK to use is chosen using two simple rules: + +<ul> +<li>The manifest has to show that particular APK is eligible</li> +<li>Of the eligible APKs, highest version number wins.</li> +</ul> + +<p>By way of example, let’s take the set of multiple APKs described earlier, and assume that each +APK has been set to support all screen sizes larger than its "target" screen size. Let’s look at +the sample chart from earlier:</p> + +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td>3</td> + <td>4</td> + <td>5</td> + <td>6</td> + <td>7</td> + <td>8</td> + <td>9</td> + <td>10</td> + <td>11</td> + <td>12</td> + <td>+</td> + </tr> + <tr> + <td>small</td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>normal</td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="blueCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>large</td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="greenCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + <tr> + <td>large</td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="redCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + <td class="purpleCell"></td> + </tr> + </tbody> +</table> +<p>Since it’s okay for coverage to overlap, we can describe the area covered by each APK like +so:</p> +<ul> +<li>Blue covers all screens, minSDK 3.</li> +<li>Green covers Large screens and higher, minSDK 3.</li> +<li>Red covers XLarge screens (generally tablets), minSDK of 9.</li> +<li>Purple covers all screens, minSDK of 11.</li> +</ul> +<p>Note that there’s a <em>lot</em> of overlap in those rules. For instance, an +XLarge device with API 11 can conceivably run any one of the 4 APKs specified. +However, by using the "highest version number wins" rule, we can set an order of +preference as follows:</p> +<p> +Purple ≥ Red ≥ Green ≥ Blue +</p><p> +Why allow all the overlap? Let’s pretend that the Purple APK has some requirement on it that the +other two don’t. The <a href="{@docRoot}guide/appendix/market-filters.html">Market Filters page</a> +of the Android Developer guide has a whole list of possible culprits. For the sake of example, +let’s assume that Purple requires a front-facing camera. In fact, the entire point of Purple is to +use entertaining things with the front-facing camera! But, it turns out, not all API 11+ devices +even HAVE front-facing cameras! The horror!</p> + +<p>Fortunately, if a user is browsing Market from one such device, Android Market will look at the +manifest, see that Purple lists the front-facing camera as a requirement, and quietly ignore it, +having determined that Purple and that device are not a match made in digital heaven. It will then +see that Red is not only compatible with xlarge devices, but also doesn’t care whether or not +there’s a front-facing camera! The app can still be downloaded from Android Market by the user, +because despite the whole front-camera mishap, there was still an APK that supported that particular +API level.</p> + +<p> In order to keep all your APKs on separate "tracks", it’s important to have a good version code +scheme. The recommended one can be found on the <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#VersionCodes">Version Codes</a> area of +our developer guide. It’s worth reading the whole section, but the basic gist is for this set of +APKs, we’d use two digits to represent the minSDK, two to represent the min/max screen size, and 3 +to represent the build number. That way, when the device upgraded to a new version of Android, +(say, from 10 to 11), any APKs that are now eligible and preferred over the currently installed one +would be seen by the device as an "upgrade". The version number scheme, when applied to the example +set of APKs, might look like:</p> + +<p>Blue: 0304001, 0304002, 0304003...<br /> +Green: 0334001, 0334002, 0334003<br /> +Red: 0344001, 0344002, 0344003...<br /> +Purple: 1104001, 1104002, 1104003...<br /> +</p> + +<p> Putting this all together, your Android Manifests would likely look something like the +following:</p> +<p>Blue:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="0304001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="3" /> + <supports-screens android:smallScreens="true" + android:normalScreens="true" + android:largeScreens="true" + android:xlargeScreens="true" /> + ... +</pre> + +<p>Green:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="0334001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="3" /> + <supports-screens android:smallScreens="false" + android:normalScreens="false" + android:largeScreens="true" + android:xlargeScreens="true" /> + ... +</pre> + +<p>Red:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="0344001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="3" /> + <supports-screens android:smallScreens="false" + android:normalScreens="false" + android:largeScreens="false" + android:xlargeScreens="true" /> + ... +</pre> + +<p>Purple:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="1104001" android:versionName="1.0" package="com.example.foo"> + <uses-sdk android:minSdkVersion="11" /> + <supports-screens android:smallScreens="true" + android:normalScreens="true" + android:largeScreens="true" + android:xlargeScreens="true" /> + ... +</pre> + +<p> +Note that technically, multiple APK’s will work with either the supports-screens tag, or the +compatible-screens tag. Supports-screens is generally preferred, and it’s generally a really bad +idea to use both- It makes things needlessly complicated, and increases the opportunity for errors. + Also note that instead of taking advantage of the default values (small and normal are always true +by default), the manifests explicitly set the value for each screen size. This can save you +headaches down the line - By way of example, a manifest with a target SDK of < 9 will have xlarge +automatically set to false, since that size didn’t exist yet. So be explicit! +</p> + +<h2 id="PreLaunch">Go Over Pre-launch Checklist</h2> +<p> Before uploading to Android Market, double-check the following items. Remember that these are +specifically relevant to multiple APKs, and in no way represent a complete checklist for all +applications being uploaded to Android Market.</p> +<ul> +<li>All APKs must have the same package name.</li> +<li>All APKs must be signed with the same certificate.</li> +<li>If the APKs overlap in platform version, the one with the higher minSdkVersion must have a +higher version code.</li> +<li>Every screen size you want your APK to support, set to true in the manifest. Every screen size +you want it to avoid, set to false.</li> +<li>Double check your manifest filters for conflicting information (an APK that only supports +cupcake on XLARGE screens isn’t going to be seen by anybody)</li> +<li>Each APK's manifest must be unique across at least one of supported screen, OpenGL texture, or +platform version.</li> +<li>Try to test each APK on at least one device. Barring that, you have one of the most +customizable device emulators in the business sitting on your development machine. Go nuts!</li> +</ul> + +<p>It’s also worth inspecting the compiled APK before pushing to market, to make sure there aren’t +any surprises that could hide your application in Market. This is actually quite simple using the +"aapt" tool. Aapt (the Android Asset Packaging Tool) is part of the build process for creating and +packaging your Android applications, and is also a very handy tool for inspecting them. </p> + +<pre class="no-pretty-print classic"> +>aapt dump badging +package: name='com.example.hello' versionCode='1' versionName='1.0' +sdkVersion:'11' +uses-permission:'android.permission.SEND_SMS' +application-label:'Hello' +application-icon-120:'res/drawable-ldpi/icon.png' +application-icon-160:'res/drawable-mdpi/icon.png' +application-icon-240:'res/drawable-hdpi/icon.png' +application: label='Hello' icon='res/drawable-mdpi/icon.png' +launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' +uses-feature:'android.hardware.telephony' +uses-feature:'android.hardware.touchscreen' +main +supports-screens: 'xlarge' +supports-any-density: 'true' +locales: '--_--' +densities: '120' '160' '240' +</pre> + +<p>When you examine aapt output, be sure to check that you don’t have conflicting values for +supports-screens and compatible-screens, and that you don’t have unintended "uses-feature" values +that were added as a result of permissions you set in the manifest. In the example above, the APK +will be invisible to most, if not all devices.</p> +<p>Why? By adding the required permission SEND_SMS, the feature requirement of android.hardware.telephony was implicitly added. Since most (if not all) xlarge devices are tablets without telephony hardware in them, Market will filter out this APK in these cases, until future devices come along which are both large enough to report as xlarge screen size, and possess telephony hardware. +</p> +<p>Fortunately this is easily fixed by adding the following to your manifest:<p> +<pre> +<uses-feature android:name="android.hardware.telephony" android:required="false" /> +</pre> + +<p>Once you’ve completed the pre-launch checklist, upload your APKs to Android Market. It may take a bit for the application to show up when browsing Android Market, but when it does, perform one last check. Download the application onto any test devices you may have to make sure that the APKs are targeting the intended devices. Congratulations, you’re done!</p> diff --git a/docs/html/training/multiple-apks/screensize.jd b/docs/html/training/multiple-apks/screensize.jd new file mode 100644 index 000000000000..28611ec2026d --- /dev/null +++ b/docs/html/training/multiple-apks/screensize.jd @@ -0,0 +1,355 @@ +page.title=Creating Multiple APKs for Different Screen Sizes +parent.title=Creating and Maintaining Multiple APKs +parent.link=index.html + +trainingnavtop=true +previous.title=Creating Multiple APKs for Different API Levels +previous.link=api.html +next.title=Creating Multiple APKs for Different GL Textures +next.link=texture.html + +@jd:body + +<style type="text/css"> +.blueCell { background-color: #9fc5e8;} +.greenCell { background-color: #b6d7a8;} +.redCell { background-color: #ea9999;} +.blackCell { background-color: #000000;} +</style> + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Confirm">Confirm You Need Multiple APKs</a></li> + <li><a href="#ChartReqs">Chart Your Requirements</a></li> + <li><a href="#CreateLibrary">Put All Common Code and Resources in a Library Project.</a></li> + <li><a href="#CreateAPKs">Create New APK Projects</a></li> + <li><a href="#AdjustManifests">Adjust the Manifests</a></li> + <li><a href="#PreLaunch">Go Over Pre-launch Checklist</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="http://developer.android.com/guide/market/publishing/multiple-apks.html">Multiple APK +Support</a></li> + <li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li> +</ul> + +</div> +</div> + + +<p>When developing your Android application to take advantage of multiple APKs on Android Market, +it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches +further into the development process. This lesson shows you how to create multiple APKs of your +app, each covering a different class of screen size. You will also gain some tools necessary to +make maintaining a multiple APK codebase as painless as possible.</p> + + +<h2 id="Confirm">Confirm You Need Multiple APKs</h2> + +<p>When trying to create an application that works across multiple sizes of Android devices, +naturally you want your application to take advantage of all the available space on larger devices, +without sacrificing compatibility or usability on the smaller screens. It may seem at the outset as +though multiple APK support is the best solution, but this often isn’t the case. The <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#ApiLevelOptions">Using Single APK +Instead</a> section of the multiple APK developer guide includes some useful information on how to +accomplish this with a single APK, including use of our support library. You should also read the +guide to <a href="{@docRoot}guide/practices/screens_support.html">supporting multiple screens</a>, +and there’s even a <a +href="http://android-developers.blogspot.com/2011/03/fragments-for-all.html">support library</a> you +can download using the Android SDK, which lets you use fragments on pre-Honeycomb devices (making +multiple-screen support in a single APK much easier).</p> + +<p>If you can manage it, confining your application to a single APK has several advantages, +including:</p> + +<ul> +<li>Publishing and testing are easier</li> +<li>There’s only one codebase to maintain</li> +<li>Your application can adapt to device configuration changes</li> +<li>App restore across devices just works</li> +<li>You don’t have to worry about market preference, behavior from "upgrades" from one APK to the +next, or which APK goes with which class of devices</li> +</ul> + +<p>The rest of this lesson assumes that you’ve researched the topic, studiously absorbed the +material in the resources linked, and determined that multiple APKs are the right path for your +application.</p> + +<h2 id="ChartReqs">Chart Your Requirements</h2> + +<p>Start off by creating a simple chart to quickly determine how many APKs you need, and what screen +size(s) each APK covers. Fortunately, it’s easy to chart out your requirements quickly and easily, +and have a reference for later. Start out with a row of cells representing the various screen sizes +available on the Android platform.</p> + +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td>small</td> + <td>normal</td> + <td>large</td> + <td>xlarge</td> + </tr> + </tbody> +</table> +<p> +Now just color in the chart such that each color represents an APK. Here’s one example of how you +might apply each APK to a certain range of screen sizes.</p> + +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">small</td> + <td class="blueCell">normal</td> + <td class="greenCell">large</td> + <td class="redCell">xlarge</td> + </tr> + </tbody> +</table> +<p> +Depending on your needs, you could also have two APKs, "small and everything else" or "xlarge and +everything else". Coloring in the chart also makes intra-team communication easier—You can +now simply refer to each APK as "blue", "green", or "red", no matter how many different screen types +it covers.</p> + +<h2 id="CreateLibrary">Put All Common Code and Resources in a Library Project.</h2> +<p>Whether you’re modifying an existing Android application or starting one from scratch, this is +the first thing that you should do to the codebase, and by the far the most important. Everything +that goes into the library project only needs to be updated once (think language-localized strings, +color themes, bugs fixed in shared code), which improves your development time and reduces the +likelihood of mistakes that could have been easily avoided.</p> + +<p class="note"><strong>Note:</strong> While the implementation details of how to create and +include library projects are beyond the scope of this lesson, you can get up to speed quickly on +their creation at the following links:</p> +<ul> +<li><a +href="{@docRoot}guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject">Setting up +a library project (Eclipse)</a></li> +<li><a +href="{@docRoot}guide/developing/projects/projects-cmdline.html#SettingUpLibraryProject">Setting up +a library project (Command line)</a></li> +</ul> + + + +<p>If you’re converting an existing application to use multiple APK support, +scour your codebase for every localized string file, list of values, theme +colors, menu icons and layout that isn’t going to change across APKs, and put +it all in the library project. Code that isn’t going to change much should +also go in the library project. You’ll likely find yourself extending these +classes to add a method or two from APK to APK.</p> + +<p>If, on the other hand, you’re creating the application from scratch, try as +much as possible to write code in the library project <em>first</em>, then only move it down to an +individual APK if necessary. This is much easier to manage in the long run than adding it to one, +then another, then another, then months later trying to figure out whether this blob can be moved up +to the library section without screwing anything up.</p> + + + +<h2 id="CreateAPKs">Create New APK Projects</h2> +<p>There should be a separate Android project for each APK you’re going to release. For easy +organization, place the library project and all related APK projects under the same parent folder. +Also remember that each APK needs to have the same package name, although they don’t necessarily +need to share the package name with the library. If you were to have 3 APKs following the scheme +described earlier, your root directory might look like this:</p> + +<pre class="no-pretty-print classic"> +alexlucas:~/code/multi-apks-root$ ls +foo-blue +foo-green +foo-lib +foo-red +</pre> + +<p>Once the projects are created, add the library project as a reference to each APK project. If +possible, define your starting Activity in the library project, and extend that Activity in your APK +project. Having a starting activity defined in the library project gives you a chance to put all +your application initialization in one place, so that each individual APK doesn’t have to +re-implement "universal" tasks like initializing Analytics, running licensing checks, and any other +initialization procedures that don’t change much from APK to APK.</p> + + +<h2 id="AdjustManifests">Adjust the Manifests</h2> +<p>When a user downloads an application which uses multiple APKs through Android Market, the correct +APK to use is chosen using two simple rules:</p> +<ul> +<li>The manifest has to show that particular APK is eligible</li> +<li>Of the eligible APKs, highest version number wins</li> +</ul> + +<p> +By way of example, let’s take the set of multiple APKs described earlier, and assume that each APK +has been set to support all screen sizes larger than its "target" screen size. Taken individually, +the possible range of each APK would look like this: +</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">small</td> + <td class="blueCell">normal</td> + <td class="blueCell">large</td> + <td class="blueCell">xlarge</td> + </tr> + <tr> + <td class="blackCell">small</td> + <td class="blackCell">normal</td> + <td class="greenCell">large</td> + <td class="greenCell">xlarge</td> + </tr> + <tr> + <td class="blackCell">small</td> + <td class="blackCell">normal</td> + <td class="blackCell">large</td> + <td class="redCell">xlarge</td> + </tr> + </tbody> +</table> +<p> +However, by using the "highest version number wins" rule, if we set the versionCode attribute in +each APK such that red ≥ green ≥ blue, the chart effectively collapses down to this:</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">small</td> + <td class="blueCell">normal</td> + <td class="greenCell">large</td> + <td class="redCell">xlarge</td> + </tr> + </tbody> +</table> +<p> +Now, let’s further assume that the Red APK has some requirement on it that the other two don’t. The +<a href="{@docRoot}guide/appendix/market-filters.html">Market Filters page</a> of the Android +Developer guide has a whole list of possible culprits. For the sake of example, let’s assume that +red requires a front-facing camera. In fact, the entire point of the red APK is to use the extra +available screen space to do entertaining things with that front-facing camera. But, it turns out, +not all xlarge devices even HAVE front-facing cameras! The horror!</p> + +<p>Fortunately, if a user is browsing Market from one such device, Android Market will look at the +manifest, see that Red lists the front-facing camera as a requirement, and quietly ignore it, having +determined that Red and that device are not a match made in digital heaven. It will then see that +Green is not only compatible with xlarge devices, but also doesn’t care whether or not there’s a +front-facing camera! The app can still be downloaded from Android Market by the user, because +despite the whole front-camera mishap, there was still an APK that supported that particular screen +size.</p> + +<p> In order to keep all your APKs on separate "tracks", it’s important to have a good version code +scheme. The recommended one can be found on the <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#VersionCodes">Version Codes</a> area of +our developer guide. Since the example set of APKs is only dealing with one of 3 possible +dimensions, it would be sufficient to separate each APK by 1000 and increment from there. This +might look like:</p> + +<p>Blue: 1001, 1002, 1003, 1004...<br /> +Green: 2001, 2002, 2003, 2004...<br /> +Red:3001, 3002, 3003, 3004...</p> + +<p> Putting this all together, your Android Manifests would likely look something like the +following:</p> + +<p>Blue:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="1001" android:versionName="1.0" package="com.example.foo"> + <supports-screens android:smallScreens="true" + android:normalScreens="true" + android:largeScreens="true" + android:xlargeScreens="true" /> + ... +</pre> + +<p>Green:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="2001" android:versionName="1.0" package="com.example.foo"> + <supports-screens android:smallScreens="false" + android:normalScreens="false" + android:largeScreens="true" + android:xlargeScreens="true" /> + ... +</pre> + +<p>Red:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="3001" android:versionName="1.0" package="com.example.foo"> + <supports-screens android:smallScreens="false" + android:normalScreens="false" + android:largeScreens="false" + android:xlargeScreens="true" /> + ... +</pre> +<p> +Note that technically, multiple APK’s will work with either the supports-screens +tag, or the compatible-screens tag. Supports-screens is generally preferred, +and it’s generally a really bad idea to use both tags in the same manifest. It +makes things needlessly complicated, and increases the opportunity for errors. +Also note that instead of taking advantage of the default values (small and +normal are always true by default), the manifests explicitly set the value for +each screen size. This can save you headaches down the line. For instance, a manifest with a +target SDK of < 9 will have xlarge automatically set to false, since that size didn’t exist yet. +So be explicit! +</p> + +<h2 id="PreLaunch">Go Over Pre-launch Checklist</h2> +<p> Before uploading to Android Market, double-check the following items. Remember that these are +specifically relevant to multiple APKs, and in no way represent a complete checklist for all +applications being uploaded to Android Market.</p> +<ul> +<li>All APKs must have the same package name</li> +<li>All APKs must be signed with the same certificate</li> +<li>Every screen size you want your APK to support, set to true in the manifest. Every screen size +you want it to avoid, set to false</li> +<li>Double check your manifest filters for conflicting information (an APK that only supports +cupcake on XLARGE screens isn’t going to be seen by anybody)</li> +<li>Each APK's manifest must be unique across at least one of supported screen, openGL texture, or +platform version</li> +<li>Try to test each APK on at least one device. Barring that, you have one of the most +customizable device emulators in the business sitting on your development machine. Go nuts!</li> +</ul> + +<p>It’s also worth inspecting the compiled APK before pushing to market, to make sure there aren’t +any surprises that could hide your application in Market. This is actually quite simple using the +"aapt" tool. Aapt (the Android Asset Packaging Tool) is part of the build process for creating and +packaging your Android applications, and is also a very handy tool for inspecting them. </p> + +<pre class="no-pretty-print classic"> +>aapt dump badging +package: name='com.example.hello' versionCode='1' versionName='1.0' +sdkVersion:'11' +uses-permission:'android.permission.SEND_SMS' +application-label:'Hello' +application-icon-120:'res/drawable-ldpi/icon.png' +application-icon-160:'res/drawable-mdpi/icon.png' +application-icon-240:'res/drawable-hdpi/icon.png' +application: label='Hello' icon='res/drawable-mdpi/icon.png' +launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' +uses-feature:'android.hardware.telephony' +uses-feature:'android.hardware.touchscreen' +main +supports-screens: 'xlarge' +supports-any-density: 'true' +locales: '--_--' +densities: '120' '160' '240' +</pre> + +<p>When you examine aapt output, be sure to check that you don’t have conflicting values for +supports-screens and compatible-screens, and that you don’t have unintended "uses-feature" values +that were added as a result of permissions you set in the manifest. In the example above, the APK +will be invisible to most, if not all devices.</p> +<p>Why? By adding the required permission SEND_SMS, the feature requirement of android.hardware.telephony was implicitly added. Since most (if not all) xlarge devices are tablets without telephony hardware in them, Market will filter out this APK in these cases, until future devices come along which are both large enough to report as xlarge screen size, and possess telephony hardware. +</p> +<p>Fortunately this is easily fixed by adding the following to your +manifest:</p> +<pre> +<uses-feature android:name="android.hardware.telephony" android:required="false" /> +</pre> +<p>Once you’ve completed the pre-launch checklist, upload your APKs to Android Market. It may take a bit for the application to show up when browsing Android Market, but when it does, perform one last check. Download the application onto any test devices you may have to make sure that the APKs are targeting the intended devices. Congratulations, you’re done!</p> diff --git a/docs/html/training/multiple-apks/texture.jd b/docs/html/training/multiple-apks/texture.jd new file mode 100644 index 000000000000..6f75ef347e63 --- /dev/null +++ b/docs/html/training/multiple-apks/texture.jd @@ -0,0 +1,299 @@ +page.title=Creating Multiple APKs for Different GL Textures +parent.title=Creating and Maintaining Multiple APKs +parent.link=index.html + +trainingnavtop=true +previous.title=Creating Multiple APKs for Different Screen Sizes +previous.link=screensize.html +next.title=Creating Multiple APKs with 2+ Dimensions +next.link=multiple.html + +@jd:body + +<style type="text/css"> +.blueCell { background-color: #9fc5e8;} +.greenCell { background-color: #b6d7a8;} +.redCell { background-color: #ea9999;} +</style> + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#Confirm">Confirm You Need Multiple APKs</a></li> + <li><a href="#ChartReqs">Chart Your Requirements</a></li> + <li><a href="#CreateLibrary">Put All Common Code and Resources in a Library Project</a></li> + <li><a href="#CreateAPKs">Create New APK Projects</a></li> + <li><a href="#AdjustManifests">Adjust the Manifests</a></li> + <li><a href="#PreLaunch">Go Over Pre-launch Checklist</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="http://developer.android.com/guide/market/publishing/multiple-apks.html">Multiple APK +Support</a></li> +</ul> + +</div> +</div> + +<p>When developing your Android application to take advantage of multiple APKs on Android Market, it’s important to adopt some good practices from the get-go, and prevent unnecessary headaches further into the development process. This lesson shows you how to create multiple APKs of your app, each supporting a different subset of OpenGL texture formats. You will also gain some tools necessary to make maintaining a multiple APK codebase as painless as possible.</p> + + +<h2 id="Confirm">Confirm You Need Multiple APKs</h2> + +<p>When trying to create an application that works across all available Android-powered +devices, naturally you want your application look its best on each individual device, regardless of +the fact they don’t all support the same set of GL textures. It may seem at the outset as though +multiple APK support is the best solution, but this often isn’t the case. The <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#ApiLevelOptions">Using Single APK +Instead</a> section of the multiple APK developer guide includes some useful information on how to +accomplish this with a single APK, including how to <a +href="{@docRoot}guide/market/publishing/multiple-apks.html#TextureOptions">detect supported texture +formats at runtime</a>. Depending on your situation, it might be easier to bundle all formats with +your application, and simply pick which one to use at runtime.</p> + +<p>If you can manage it, confining your application to a single APK has several advantages, +including:</p> +<ul> +<li>Publishing and Testing are easier</li> +<li>There’s only one codebase to maintain</li> +<li>Your application can adapt to device configuration changes</li> +<li>App restore across devices just works</li> +<li>You don’t have to worry about market preference, behavior from "upgrades" from one APK to the +next, or which APK goes with which class of devices</li> +</ul> + +<p>The rest of this lesson assumes that you’ve researched the topic, studiously absorbed the +material in the resources linked, and determined that multiple APKs are the right path for your +application.</p> + + +<h2 id="ChartReqs">Chart Your Requirements</h2> + +<p>The Android Developer Guide provides a handy reference of some of common supported textures on +the <a href="{@docRoot}guide/topics/manifest/supports-gl-texture-element.html">supports-gl-texture +page</a>. This page also contains some hints as to which phones (or families of phones) support +particular texture formats. Note that it’s generally a good idea for one of your APKs to support +ETC1, as that texture format is supported by all Android-powered devices that support the OpenGL ES +2.0 spec.</p> + +<p>Since most Android-powered devices support more than one texture format, you need to establish an +order of preference. Create a chart including all the formats that your application is going to +support. The left-most cell is going to be the lowest priority (It will probably be ETC1, a really +solid default in terms of performance and compatibility). Then color in the chart such that each +cell represents an APK.</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td class="blueCell">ETC1</td> + <td class="greenCell">ATI</td> + <td class="redCell">PowerVR</td> + </tr> + </tbody> +</table> + +<p> +Coloring in the chart does more than just make this guide less monochromatic - It also has a way of +making intra-team communication easier- You can now simply refer to each APK as "blue", "green", or +"red", instead of "The one that supports ETC1 texture formats", etc.</p> + +<h2 id="CreateLibrary">Put All Common Code and Resources in a Library Project</h2> +<p>Whether you’re modifying an existing Android application or starting one from scratch, this is +the first thing that you should do to the codebase, and by the far the most important. Everything +that goes into the library project only needs to be updated once (think language-localized strings, +color themes, bugs fixed in shared code), which improves your development time and reduces the +likelihood of mistakes that could have been easily avoided.</p> + +<p class="note"><strong>Note:</strong> While the implementation details of how to create and +include library projects are beyond the scope of this lesson, you can get up to speed quickly on +their creation at the following links:</p> +<ul> +<li><a +href="{@docRoot}guide/developing/projects/projects-eclipse.html#SettingUpLibraryProject">Setting up +a library project (Eclipse)</a></li> +<li><a +href="{@docRoot}guide/developing/projects/projects-cmdline.html#SettingUpLibraryProject">Setting up +a library project (Command line)</a></li> +</ul> + +<p>If you’re converting an existing application to use multiple APK support, +scour your codebase for every localized string file, list of values, theme +colors, menu icons and layout that isn’t going to change across APKs, and put +it all in the library project. Code that isn’t going to change much should +also go in the library project. You’ll likely find yourself extending these +classes to add a method or two from APK to APK.</p> + +<p>If, on the other hand, you’re creating the application from scratch, try as +much as possible to write code in the library project <em>first</em>, then only move it down to an +individual APK if necessary. This is much easier to manage in the long run than adding it to one, +then another, then another, then months later trying to figure out whether this blob can be moved up +to the library section without screwing anything up.</p> + +<h2 id="CreateAPKs">Create New APK Projects</h2> +<p>There should be a separate Android project for each APK you’re going to release. For easy +organization, place the library project and all related APK projects under the same parent folder. +Also remember that each APK needs to have the same package name, although they don’t necessarily +need to share the package name with the library. If you were to have 3 APKs following the scheme +described earlier, your root directory might look like this:</p> + +<pre class="no-pretty-print classic"> +alexlucas:~/code/multi-apks-root$ ls +foo-blue +foo-green +foo-lib +foo-red +</pre> + + +<p>Once the projects are created, add the library project as a reference to each APK project. If +possible, define your starting Activity in the library project, and extend that Activity in your APK +project. Having a starting activity defined in the library project gives you a chance to put all +your application initialization in one place, so that each individual APK doesn’t have to +re-implement "universal" tasks like initializing Analytics, running licensing checks, and any other +initialization procedures that don’t change much from APK to APK.</p> + + +<h2 id="AdjustManifests">Adjust the Manifests</h2> +<p>When a user downloads an application which uses multiple APKs through Android Market, the correct +APK to use is chosen using some simple rules:</p> + +<ul> +<li>The manifest has to show that particular APK is eligible</li> +<li>Of the eligible APKs, highest version number wins</li> +<li>If <em>any</em> of the texture formats listed in your APK are supported by the device on market, +that device is considered eligible</li> +</ul> + +<p>With regards to GL Textures, that last rule is important. It means that you should, for +instance, be <em>very</em> careful about using different GL formats in the same application. If you +were to use PowerVR 99% of the time, but use ETC1 for, say, your splash screen... Then your manifest +would necessarily indicate support for both formats. A device that <em>only</em> supported ETC1 +would be deemed compatible, your app would download, and the user would see some thrilling crash +messages. The common case is going to be that if you’re using multiple APKs specifically to target +different devices based on GL texture support, it’s going to be one texture format per APK.</p> + +<p>This actually makes texture support a little bit different than the other two multiple APK +dimensions, API level and screen size. Any given device only has one API level, and one screen +size, and it’s up to the APK to support a range of them. With textures, the APK will generally +support one texture, and the device will support many. There will often be overlap in terms of one +device supporting many APKs, but the solution is the same: Version codes.</p> + +<p>By way of example, take a few devices, and see how many of the APKs defined earlier fit each +device.</p> +<table cellpadding="10" cellspacing="0" border="1"> + <tbody> + <tr> + <td>FooPhone</td> + <td>Nexus S</td> + <td>Evo</td> + </tr> + <tr> + <td class="blueCell">ETC1</td> + <td class="blueCell">ETC1</td> + <td class="blueCell">ETC1</td> + </tr> + <tr> + <td></td> + <td class="greenCell">PowerVR</td> + <td class="redCell">ATI TC</td> + </tr> + </tbody> +</table> +<p> Assuming that PowerVR and ATI formats are both preferred over ETC1 when available, than +according to the "highest version number wins" rule, if we set the versionCode attribute in each APK +such that red ≥ green ≥ blue, then both Red and Green will always be chosen over Blue on +devices which support them, and should a device ever come along which supports both Red and Green, +red will be chosen. +</p> + +<p> In order to keep all your APKs on separate "tracks," it’s important to have a good version code +scheme. The recommended one can be found on the Version Codes area of our developer guide. Since +the example set of APKs is only dealing with one of 3 possible dimensions, it would be sufficient to +separate each APK by 1000 and increment from there. This might look like:</p> + +<p>Blue: 1001, 1002, 1003, 1004...<br /> +Green: 2001, 2002, 2003, 2004...<br /> +Red:3001, 3002, 3003, 3004...</p> + +<p> Putting this all together, your Android Manifests would likely look something like the +following:</p> +<p>Blue:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="1001" android:versionName="1.0" package="com.example.foo"> + <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> + ... +</pre> + +<p>Green:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="2001" android:versionName="1.0" package="com.example.foo"> + <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" /> + ... +</pre> + +<p>Red:</p> +<pre> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + android:versionCode="3001" android:versionName="1.0" package="com.example.foo"> + <supports-gl-texture android:name="GL_IMG_texture_compression_pvrtc" /> + ... +</pre> + +<h2 id="PreLaunch">Go Over Pre-launch Checklist</h2> +<p>Before uploading to Android Market, double-check the following items. Remember that these are +specifically relevant to multiple APKs, and in no way represent a complete checklist for all +applications being uploaded to Android Market.</p> + +<ul> +<li>All APKs must have the same package name</li> +<li>All APKs must be signed with the same certificate</li> +<li>Double check your manifest filters for conflicting information (an APK that only supports +cupcake on XLARGE screens isn’t going to be seen by anybody)</li> +<li>Each APK's manifest must be unique across at least one of supported screen, OpenGL texture, or +platform version</li> +<li>Try to test each APK on at least one device. Barring that, you have one of the most +customizable device emulators in the business sitting on your development machine. Go nuts!</li> +</ul> + +<p>It’s also worth inspecting the compiled APK before pushing to market, to make sure there aren’t +any surprises that could hide your application in Market. This is actually quite simple using the +"aapt" tool. Aapt (the Android Asset Packaging Tool) is part of the build process for creating and +packaging your Android applications, and is also a very handy tool for inspecting them. </p> + +<pre class="no-pretty-print classic"> +>aapt dump badging +package: name='com.example.hello' versionCode='1' versionName='1.0' +sdkVersion:'11' +uses-permission:'android.permission.SEND_SMS' +application-label:'Hello' +application-icon-120:'res/drawable-ldpi/icon.png' +application-icon-160:'res/drawable-mdpi/icon.png' +application-icon-240:'res/drawable-hdpi/icon.png' +application: label='Hello' icon='res/drawable-mdpi/icon.png' +launchable-activity: name='com.example.hello.HelloActivity' label='Hello' icon='' +uses-feature:'android.hardware.telephony' +uses-feature:'android.hardware.touchscreen' +main +supports-screens: 'xlarge' +supports-any-density: 'true' +locales: '--_--' +densities: '120' '160' '240' +</pre> + +<p>When you examine aapt output, be sure to check that you don’t have conflicting values for +supports-screens and compatible-screens, and that you don’t have unintended "uses-feature" values +that were added as a result of permissions you set in the manifest. In the example above, the APK +will be invisible to most, if not all devices.</p> +<p>Why? By adding the required permission SEND_SMS, the feature requirement of android.hardware.telephony was implicitly added. Since most (if not all) xlarge devices are tablets without telephony hardware in them, Market will filter out this APK in these cases, until future devices come along which are both large enough to report as xlarge screen size, and possess telephony hardware. +</p> +<p>Fortunately this is easily fixed by adding the following to your manifest:</p> +<pre> +<uses-feature android:name="android.hardware.telephony" android:required="false" /> +</pre> +<p>Once you’ve completed the pre-launch checklist, upload your APKs to Android Market. It may take a bit for the application to show up when browsing Android Market, but when it does, perform one last check. Download the application onto any test devices you may have to make sure that the APKs are targeting the intended devices. Congratulations, you’re done!</p> diff --git a/docs/html/training/multiscreen/adaptui.jd b/docs/html/training/multiscreen/adaptui.jd new file mode 100644 index 000000000000..34e9d7df7f8d --- /dev/null +++ b/docs/html/training/multiscreen/adaptui.jd @@ -0,0 +1,258 @@ +page.title=Implementing Adaptative UI Flows +parent.title=Designing for Multiple Screens +parent.link=index.html + +trainingnavtop=true +previous.title=Supporting Different Screen Densities +previous.link=screendensities.html + +@jd:body + + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> + +<ol> + <li><a href="#TaskDetermineCurLayout">Determine the Current Layout</a></li> + <li><a href="#TaskReactToLayout">React According to Current Layout</a></li> + <li><a href="#TaskReuseFrag">Reuse Fragments in Other Activities</a></li> + <li><a href="#TaskHandleConfigChanges">Handle Screen Configuration Changes</a></li> +</ol> + +<h2>You should also read</h2> + +<ul> + <li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets and +Handsets</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> +<a href="http://developer.android.com/shareables/training/NewsReader.zip" class="button">Download + the sample app</a> +<p class="filename">NewsReader.zip</p> +</div> + + +</div> +</div> + +<p>Depending on the layout that your application is currently showing, the UI +flow may be different. For example, if your application is in the dual-pane +mode, clicking on an item on the left pane will simply display the content on +the right pane; if it is in single-pane mode, the content should be displayed +on its own (in a different activity).</p> + + +<h2 id="TaskDetermineCurLayout">Determine the Current Layout</h2> + +<p>Since your implementation of each layout will be a little different, one of +the first things you will probably have to do is determine what layout the user is currently +viewing. For example, you might want to know whether the user is in "single +pane" mode or "dual pane" mode. You can do that by querying if a given view +exists and is visible:</p> + +<pre class="prettyprint"> +public class NewsReaderActivity extends FragmentActivity { + boolean mIsDualPane; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main_layout); + + View articleView = findViewById(R.id.article); + mIsDualPane = articleView != null && + articleView.getVisibility() == View.VISIBLE; + } +} +</pre> + +<p>Notice that this code queries whether the "article" pane is available or not, +which is much more flexible than hard-coding a query for a specific layout.</p> + +<p>Another example of how you can adapt to the existence of different +components is to check whether they are available before performing an operation on +them. For example, in the News Reader sample app, there is a button that opens a +menu, but that button only exists when running on versions older than Android 3.0 (because it's +function is taken over by the {@link android.app.ActionBar} on API level 11+). So, to add the event +listener for this button, you can do:</p> + +<pre class="prettyprint"> +Button catButton = (Button) findViewById(R.id.categorybutton); +OnClickListener listener = /* create your listener here */; +if (catButton != null) { + catButton.setOnClickListener(listener); +} +</pre> + + +<h2 id="TaskReactToLayout">React According to Current Layout</h2> + +<p>Some actions may have a different result depending on the current layout. +For example, in the News Reader sample, clicking on a headline from the +headlines list opens the article in the right hand-side pane if the UI +is in dual pane mode, but will launch a separate activity if the UI is in +single-pane mode:</p> + +<pre> +@Override +public void onHeadlineSelected(int index) { + mArtIndex = index; + if (mIsDualPane) { + /* display article on the right pane */ + mArticleFragment.displayArticle(mCurrentCat.getArticle(index)); + } else { + /* start a separate activity */ + Intent intent = new Intent(this, ArticleActivity.class); + intent.putExtra("catIndex", mCatIndex); + intent.putExtra("artIndex", index); + startActivity(intent); + } +} +</pre> + +<p>Likewise, if the app is in dual-pane mode, it should set up the action bar +with tabs for navigation, whereas if the app is in single-pane mode, it should set +up navigation with a spinner widget. So your code should also check which case is +appropriate:</p> + +<pre> +final String CATEGORIES[] = { "Top Stories", "Politics", "Economy", "Technology" }; + +public void onCreate(Bundle savedInstanceState) { + .... + if (mIsDualPane) { + /* use tabs for navigation */ + actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_TABS); + int i; + for (i = 0; i < CATEGORIES.length; i++) { + actionBar.addTab(actionBar.newTab().setText( + CATEGORIES[i]).setTabListener(handler)); + } + actionBar.setSelectedNavigationItem(selTab); + } + else { + /* use list navigation (spinner) */ + actionBar.setNavigationMode(android.app.ActionBar.NAVIGATION_MODE_LIST); + SpinnerAdapter adap = new ArrayAdapter<String>(this, + R.layout.headline_item, CATEGORIES); + actionBar.setListNavigationCallbacks(adap, handler); + } +} +</pre> + + +<h2 id="TaskReuseFrag">Reuse Fragments in Other Activities</h2> + +<p>A recurring pattern in designing for multiple screens is having a portion of +your interface that's implemented as a pane on some screen configurations and +as a separate activity on other configurations. For example, in the News Reader +sample, the news article text is presented in the right side pane on +large screens, but is a separate activity on smaller screens.</p> + +<p>In cases like this, you can usually avoid code duplication by reusing the +same {@link android.app.Fragment} subclass in several activities. For example, +<code>ArticleFragment</code> +is used in the dual-pane layout:</p> + +{@sample development/samples/training/multiscreen/newsreader/res/layout/twopanes.xml all} + +<p>And reused (without a layout) in the activity layout for smaller screens +(<code>ArticleActivity</code>):</p> + +<pre> +ArticleFragment frag = new ArticleFragment(); +getSupportFragmentManager().beginTransaction().add(android.R.id.content, frag).commit(); +</pre> + +<p>Naturally, this has the same effect as declaring the fragment in an XML +layout, but in this case an XML layout is unnecessary work because the article fragment +is the only component of this activity.</p> + +<p>One very important point to keep in mind when designing your fragments is +to not create a strong coupling to a specific activity. You can usually do that +by defining an interface that abstracts all the ways in which the fragment +needs to interact with its host activity, and then the host activity +implements that interface:</p> + +<p>For example, the News Reader app's <code>HeadlinesFragment</code> does precisely that:</p> + +<pre> +public class HeadlinesFragment extends ListFragment { + ... + OnHeadlineSelectedListener mHeadlineSelectedListener = null; + + /* Must be implemented by host activity */ + public interface OnHeadlineSelectedListener { + public void onHeadlineSelected(int index); + } + ... + + public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) { + mHeadlineSelectedListener = listener; + } +} +</pre> + +<p>Then, when the user selects a headline, the fragment notifies the listener specified by the host +activity (as opposed to notifying a specific hard-coded activity):</p> + +<pre> +public class HeadlinesFragment extends ListFragment { + ... + @Override + public void onItemClick(AdapterView<?> parent, + View view, int position, long id) { + if (null != mHeadlineSelectedListener) { + mHeadlineSelectedListener.onHeadlineSelected(position); + } + } + ... +} +</pre> + +<p>This technique is discussed further in the guide to <a +href="{@docRoot}guide/practices/tablets-and-handsets.html">Supporting Tablets and Handsets</a>.</p> + + +<h2 id="TaskHandleConfigChanges">Handle Screen Configuration Changes</h2> + +<p>If you are using separate activities to implement separate parts of your interface, +you have to keep in mind that it may be necessary to react to certain +configuration changes (such as a rotation change) in order to keep your +interface consistent.</p> + +<p>For example, on a typical 7" tablet running Android 3.0 or higher, the News Reader sample uses a +separate activity to display the news article when running in portrait mode, +but uses a two-pane layout when in landscape mode.</p> + +<p>This means that when the user is in portrait mode and the activity for viewing an article is +onscreen, you need to detect that the orientation changed to landscape and +react appropriately by ending the activity and return to the main activity so the content can +display in the two-pane layout:</p> + +<pre> +public class ArticleActivity extends FragmentActivity { + int mCatIndex, mArtIndex; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mCatIndex = getIntent().getExtras().getInt("catIndex", 0); + mArtIndex = getIntent().getExtras().getInt("artIndex", 0); + + // If should be in two-pane mode, finish to return to main activity + if (getResources().getBoolean(R.bool.has_two_panes)) { + finish(); + return; + } + ... +} +</pre> + + diff --git a/docs/html/training/multiscreen/index.jd b/docs/html/training/multiscreen/index.jd new file mode 100644 index 000000000000..a986cef18804 --- /dev/null +++ b/docs/html/training/multiscreen/index.jd @@ -0,0 +1,87 @@ +page.title=Designing for Multiple Screens + +trainingnavtop=true +startpage=true +next.title=Supporting Different Screen Sizes +next.link=screensizes.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Dependencies and prerequisites</h2> + +<ul> + <li>Android 1.6 or higher (2.1+ for the sample app)</li> + <li>Basic knowledge of <a +href="http://developer.android.com/guide/topics/fundamentals/activities.html">Activities</a> and +<a href="http://developer.android.com/guide/topics/fundamentals/fragments.html">Fragments</a></li> + <li>Experience building an Android <a +href="http://developer.android.com/guide/topics/ui/index.html"> User Interface</a></li> + <li>Several features require the use of the <a +href="{@docRoot}sdk/compatibility-library.html">support library</a></li> +</ul> + +<h2>You should also read</h2> + +<ul> + <li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> +<a href="http://developer.android.com/shareables/training/NewsReader.zip" class="button">Download + the sample app</a> +<p class="filename">NewsReader.zip</p> +</div> + +</div> +</div> + +<p>Android powers hundreds of device types with several different screen sizes, +ranging from small phones to large TV sets. Therefore, it’s important +that you design your application to be compatible with all screen sizes so it’s available to as many +users as possible.</p> + +<p>But being compatible with different device types is not enough. Each screen +size offers different possibilities and challenges for user interaction, so in +order to truly satisfy and impress your users, your application must go beyond merely +<em>supporting</em> multiple screens: it must <em>optimize</em> the user +experience for each screen configuration.</p> + +<p>This class shows you how to implement a user interface that's +optimized for several screen configurations.</p> + +<p>The code in each lesson comes from a sample application that demonstrates best practices in +optimizing for multiple screens. You can download the sample (to the right) and use it as a source +of reusable code for your own application.</p> + +<p class="note"><strong>Note:</strong> This class and the associated sample use the <a +href="{@docRoot}sdk/compatibility-library.html">support library</a> in order to use the {@link +android.app.Fragment} APIs on versions lower than Android 3.0. You must download and add the +library to your application in order to use all APIs in this class.</p> + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="screensizes.html">Supporting Different Screen Sizes</a></b></dt> + <dd>This lesson walks you through how to design layouts that adapts + several different screen sizes (using flexible dimensions for + views, {@link android.widget.RelativeLayout}, screen size and orientation qualifiers, + alias filters, and nine-patch bitmaps).</dd> + + <dt><b><a href="screendensities.html">Supporting Different Screen + Densities</a></b></dt> + <dd>This lesson shows you how to support screens that have different + pixel densities (using density-independent pixels and providing + bitmaps appropriate for each density).</dd> + + <dt><b><a href="adaptui.html">Implementing Adaptative UI Flows</a></b></dt> + <dd>This lesson shows you how to implement your UI flow in a way + that adapts to several screen size/density combinations + (run-time detection of active layout, reacting according to + current layout, handling screen configuration changes).</dd> +</dl> diff --git a/docs/html/training/multiscreen/screendensities.jd b/docs/html/training/multiscreen/screendensities.jd new file mode 100644 index 000000000000..7d6ff4486f1d --- /dev/null +++ b/docs/html/training/multiscreen/screendensities.jd @@ -0,0 +1,127 @@ +page.title=Supporting Different Densities +parent.title=Designing for Multiple Screens +parent.link=index.html + +trainingnavtop=true +previous.title=Supporting Different Screen Sizes +previous.link=screensizes.html +next.title=Implementing Adaptative UI Flows +next.link=adaptui.html + +@jd:body + + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#TaskUseDP">Use Density-independent Pixels</a></li> + <li><a href="#TaskProvideAltBmp">Provide Alternative Bitmaps</a></li> +</ol> + +<h2>You should also read</h2> + +<ul> + <li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li> + <li><a href="{@docRoot}guide/practices/ui_guidelines/icon_design.html">Icon Design +Guidelines</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> +<a href="http://developer.android.com/shareables/training/NewsReader.zip" class="button">Download + the sample app</a> +<p class="filename">NewsReader.zip</p> +</div> + + +</div> +</div> + +<p>This lesson shows you how to support different screen densities +by providing different resources and using resolution-independent units of +measurements.</p> + +<h2 id="TaskUseDP">Use Density-independent Pixels</h2> + +<p>One common pitfall you must avoid when designing your layouts is using +absolute pixels to define distances or sizes. Defining layout dimensions with +pixels is a problem because different screens have different pixel densities, +so the same number of pixels may correspond to different physical sizes on +different devices. Therefore, when specifying dimensions, always use either +<code>dp</code> or <code>sp</code> units. A <code>dp</code> is a density-independent pixel +that corresponds to the physical size of a pixel at 160 dpi. An <code>sp</code> is the same +base unit, but is scaled by the user's preferred text size (it’s a +scale-independent pixel), so you should use this measurement unit when defining +text size (but never for layout sizes).</p> + +<p>For example, when you specify spacing between two views, use <code>dp</code> +rather than <code>px</code>:</p> + +<pre> +<Button android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/clickme" + android:layout_marginTop="20dp" /> +</pre> + +<p>When specifying text size, always use <code>sp</code>:</p> + +<pre> +<TextView android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="20sp" /> +</pre> + + +<h2 id="TaskProvideAltBmp">Provide Alternative Bitmaps</h2> + +<p>Since Android runs in devices with a wide variety of screen densities, +you should always provide your bitmap resources tailored to each of +the generalized density buckets: low, medium, high and extra-high density. +This will help you achieve good graphical quality and performance on all +screen densities.</p> + +<p>To generate these images, you should start with your raw resource in +vector format and generate the images for each density using the following +size scale:</p> + +<p><ul> + <li><code>xhdpi</code>: 2.0 + <li><code>hdpi</code>: 1.5 + <li><code>mdpi</code>: 1.0 (baseline) + <li><code>ldpi</code>: 0.75 +</ul></p> + +<p>This means that if you generate a 200x200 image for <code>xhdpi</code> +devices, you should generate the same resource in 150x150 for <code>hdpi</code>, +100x100 for <code>mdpi</code> and finally a 75x75 image for <code>ldpi</code> +devices.</p> + +<p>Then, place the generated image files in the appropriate subdirectory +under <code>res/</code> and the system will pick the correct one automatically +based on the screen density of the device your application is running on:</p> + +<pre class="classic no-pretty-print"> +MyProject/ + res/ + drawable-xhdpi/ + awesomeimage.png + drawable-hdpi/ + awesomeimage.png + drawable-mdpi/ + awesomeimage.png + drawable-ldpi/ + awesomeimage.png +</pre> + +<p>Then, any time you reference <code>@drawable/awesomeimage</code>, the system selects the +appropriate bitmap based on the screen's dpi.</p> + +<p>For more tips and guidelines for creating icon assets for your application, see the <a +href="{@docRoot}guide/practices/ui_guidelines/icon_design.html">Icon Design +Guidelines</a>.</p> + diff --git a/docs/html/training/multiscreen/screensizes.jd b/docs/html/training/multiscreen/screensizes.jd new file mode 100644 index 000000000000..2db0b67bb922 --- /dev/null +++ b/docs/html/training/multiscreen/screensizes.jd @@ -0,0 +1,376 @@ +page.title=Supporting Different Screen Sizes +parent.title=Designing for Multiple Screens +parent.link=index.html + +trainingnavtop=true +next.title=Supporting Different Screen Densities +next.link=screendensities.html + +@jd:body + + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#TaskUseWrapMatchPar">Use "wrap_content" and "match_parent"</a></li> + <li><a href="#TaskUseRelativeLayout">Use RelativeLayout</a></li> + <li><a href="#TaskUseSizeQuali">Use Size Qualifiers</a></li> + <li><a href="#TaskUseSWQuali">Use the Smallest-width Qualifier</a></li> + <li><a href="#TaskUseAliasFilters">Use Layout Aliases</a></li> + <li><a href="#TaskUseOriQuali">Use Orientation Qualifiers</a></li> + <li><a href="#TaskUse9Patch">Use Nine-patch Bitmaps</a></li> +</ol> + +<h2>You should also read</h2> + +<ul> + <li><a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a></li> +</ul> + +<h2>Try it out</h2> + +<div class="download-box"> +<a href="http://developer.android.com/shareables/training/NewsReader.zip" class="button">Download + the sample app</a> +<p class="filename">NewsReader.zip</p> +</div> + +</div> +</div> + +<p>This lesson shows you how to support different screen sizes by:</p> +<ul> + <li>Ensuring your layout can be adequately resized to fit the screen</li> + <li>Providing appropriate UI layout according to screen configuration</li> + <li>Ensuring the correct layout is applied to the correct screen</li> + <li>Providing bitmaps that scale correctly</li> +</ul> + + +<h2 id="TaskUseWrapMatchPar">Use "wrap_content" and "match_parent"</h2> + +<p>To ensure that your layout is flexible and adapts to different screen sizes, +you should use <code>"wrap_content"</code> and <code>"match_parent"</code> for the width +and height of some view components. If you use <code>"wrap_content"</code>, the width +or height of the view is set to the minimum size necessary to fit the content +within that view, while <code>"match_parent"</code> (also known as +<code>"fill_parent"</code> before API level 8) makes the component expand to match the size of its +parent view.</p> + +<p>By using the <code>"wrap_content"</code> and <code>"match_parent"</code> size values instead of +hard-coded sizes, your views either use only the space required for that +view or expand to fill the available space, respectively. For example:</p> + +{@sample development/samples/training/multiscreen/newsreader/res/layout/onepane_with_bar.xml all} + +<p>Notice how the sample uses <code>"wrap_content"</code> and <code>"match_parent"</code> +for component sizes rather than specific dimensions. This allows the layout +to adapt correctly to different screen sizes and orientations.</p> + +<p>For example, this is what this layout looks like in portrait and landscape +mode. Notice that the sizes of the components adapt automatically to the +width and height:</p> + +<img src="{@docRoot}images/training/layout-hvga.png" /> +<p class="img-caption"><strong>Figure 1.</strong> The News Reader sample app in portrait (left) +and landscape (right).</p> + + +<h2 id="TaskUseRelativeLayout">Use RelativeLayout</h2> + +<p>You can construct fairly complex layouts using nested instances of {@link +android.widget.LinearLayout} and +combinations of <code>"wrap_content"</code> and <code>"match_parent"</code> sizes. +However, {@link android.widget.LinearLayout} does not allow you to precisely control the +spacial relationships of child views; views in a {@link android.widget.LinearLayout} simply line up +side-by-side. If you need child views to be oriented in variations other than a straight line, a +better solution is often to use a {@link android.widget.RelativeLayout}, which allows +you to specify your layout in terms of the spacial relationships between +components. For instance, you can align one child view on the left side and another view on +the right side of the screen.</p> + +<p>For example:</p> + +<pre> +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent"> + <TextView + android:id="@+id/label" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Type here:"/> + <EditText + android:id="@+id/entry" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/label"/> + <Button + android:id="@+id/ok" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/entry" + android:layout_alignParentRight="true" + android:layout_marginLeft="10dp" + android:text="OK" /> + <Button + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toLeftOf="@id/ok" + android:layout_alignTop="@id/ok" + android:text="Cancel" /> +</RelativeLayout> +</pre> + +<p>Figure 2 shows how this layout appears on a QVGA screen.</p> + +<img src="{@docRoot}images/training/relativelayout1.png" /> +<p class="img-caption"><strong>Figure 2.</strong> Screenshot on a QVGA screen (small screen).</p> + +<p>Figure 3 shows how it appears on a larger screen.</p> + +<img src="{@docRoot}images/training/relativelayout2.png" /> +<p class="img-caption"><strong>Figure 3.</strong> Screenshot on a WSVGA screen (large screen).</p> + +<p>Notice that although the size of the components changed, their +spatial relationships are preserved as specified by the {@link +android.widget.RelativeLayout.LayoutParams}.</p> + + +<h2 id="TaskUseSizeQuali">Use Size Qualifiers</h2> + +<p>There's only so much mileage you can get from a flexible layout or relative layout +like the one in the previous sections. While those layouts adapt to +different screens by stretching the space within and around components, they +may not provide the best user experience for each screen size. Therefore, your +application should not only implement flexible layouts, but should also provide +several alternative layouts to target different screen configurations. You do +so by using <a href="http://developer.android.com/guide/practices/screens_support.html#qualifiers">configuration qualifiers</a>, which allows the runtime +to automatically select the appropriate resource based on the current device’s +configuration (such as a different layout design for different screen sizes).</p> + +<p>For example, many applications implement the "two pane" pattern for large +screens (the app might show a list of items on one pane and the content on +another pane). Tablets and TVs are large enough for both panes to fit +simultaneously on screen, but phone screens have to show them separately. So, +to implement these layouts, you could have the following files:</p> + +<ul> + <li><code>res/layout/main.xml</code>, single-pane (default) layout: + +{@sample development/samples/training/multiscreen/newsreader/res/layout/onepane.xml all} +</li> + <li><code>res/layout-xlarge/main.xml</code>, two-pane layout: + +{@sample development/samples/training/multiscreen/newsreader/res/layout/twopanes.xml all} +</li> +</ul> + +<p>Notice the <code>xlarge</code> qualifier in the directory name of the second layout. This layout +will be selected on devices with screens classified as extra-large (for example, 10" tablets). The +other layout (without qualifiers) will be selected for smaller devices.</p> + + +<h2 id="TaskUseSWQuali">Use the Smallest-width Qualifier</h2> + +<p>One of the difficulties developers had in pre-3.2 Android devices was the +"large" screen size bin, which encompasses the Dell Streak, the original Galaxy +Tab, and 7" tablets in general. However, many applications may want to show +different layouts for different devices in this category (such as for 5" and 7" devices), even +though they are all considered to be "large" screens. That's why Android introduced the +"Smallest-width" qualifier (amongst others) in Android 3.2.</p> + +<p>The Smallest-width qualifier allows you to target screens that have a certain minimum +width given in dp. For example, the typical 7" tablet has a minimum width of +600 dp, so if you want your UI to have two panes on those screens (but a single +list on smaller screens), you can use the same two layouts from the previous section for single +and two-pane layouts, but instead of the <code>xlarge</code> size qualifier, use +<code>sw600dp</code> to indicate the two-pane layout is for screens on which the smallest-width +is 600 dp:</p> + +<ul> + <li><code>res/layout/main.xml</code>, single-pane (default) layout: + +{@sample development/samples/training/multiscreen/newsreader/res/layout/onepane.xml all} +</li> + <li><code>res/layout-sw600dp/main.xml</code>, two-pane layout: + +{@sample development/samples/training/multiscreen/newsreader/res/layout/twopanes.xml all} +</li> +</ul> + +<p>This means that devices whose smallest width is greater than or equal to +600dp will select the <code>layout-sw600dp/main.xml</code> (two-pane) layout, +while smaller screens will select the <code>layout/main.xml</code> (single-pane) +layout.</p> + +<p>However, this won't work well on pre-3.2 devices, because they don't +recognize <code>sw600dp</code> as a size qualifier, so you still have to use the <code>xlarge</code> +qualifier as well. So, you should have a file named +<code>res/layout-xlarge/main.xml</code> +which is identical to <code>res/layout-sw600dp/main.xml</code>. In the next section +you'll see a technique that allows you to avoid duplicating the layout files this way.</p> + + +<h2 id="TaskUseAliasFilters">Use Layout Aliases</h2> + +<p>The smallest-width qualifier is available only on Android 3.2 and above. +Therefore, you should also still use the abstract size bins (small, normal, +large and xlarge) to be compatible with earlier versions. For example, if you +want to design your UI so that it shows a single-pane UI on phones but a +multi-pane UI on 7" tablets and larger devices, you'd have to supply these +files:</p> + +<p><ul> +<li><code>res/layout/main.xml:</code> single-pane layout</li> +<li><code>res/layout-xlarge:</code> multi-pane layout</li> +<li><code>res/layout-sw600dp:</code> multi-pane layout</li> +</ul></p> + +<p>The last two files are identical, because one of them will be matched by +Android 3.2 devices, and the other one is for the benefit of tablets with +earlier versions of Android.</p> + +<p>To avoid this duplication of the same file for tablets (and the maintenance +headache resulting from it), you can use alias files. For example, you can define the following +layouts:</p> + +<ul> +<li><code>res/layout/main.xml</code>, single-pane layout</li> +<li><code>res/layout/main_twopanes.xml</code>, two-pane layout</li> +</ul> + +<p>And add these two files:</p> + +<p><ul> +<li><code>res/values-xlarge/layout.xml</code>: +<pre> +<resources> + <item name="main" type="layout">@layout/main_twopanes</item> +</resources> +</pre> +</li> + +<li><code>res/values-sw600dp/layout.xml</code>: +<pre> +<resources> + <item name="main" type="layout">@layout/main_twopanes</item> +</resources> +</pre> + +</li> +</ul></p> + +<p>These latter two files have identical content, but they don’t actually define +the layout. They merely set up {@code main} to be an alias to {@code main_twopanes}. Since +these files have <code>xlarge</code> and <code>sw600dp</code> selectors, they are +applied to tablets regardless of Android version (pre-3.2 tablets match +{@code xlarge}, and post-3.2 will match <code>sw600dp</code>).</p> + + +<h2 id="TaskUseOriQuali">Use Orientation Qualifiers</h2> + +<p>Some layouts work well in both landscape and portrait orientations, but most of them can +benefit from adjustments. In the News Reader sample app, here is how the layout +behaves in each screen size and orientation:</p> + +<p><ul> +<li><b>small screen, portrait:</b> single pane, with logo</li> +<li><b>small screen, landscape:</b> single pane, with logo</li> +<li><b>7" tablet, portrait:</b> single pane, with action bar</li> +<li><b>7" tablet, landscape:</b> dual pane, wide, with action bar</li> +<li><b>10" tablet, portrait:</b> dual pane, narrow, with action bar</li> +<li><b>10" tablet, landscape:</b> dual pane, wide, with action bar</li> +</ul></p> + +<p>So each of these layouts is defined in an XML file in the +<code>res/layout/</code> directory. To then assign each layout to the various screen +configurations, the app uses layout aliases to match them to +each configuration:</p> + +<p><code>res/layout/onepane.xml:</code></p> +{@sample development/samples/training/multiscreen/newsreader/res/layout/onepane.xml all} + +<p><code>res/layout/onepane_with_bar.xml:</code></p> +{@sample development/samples/training/multiscreen/newsreader/res/layout/onepane_with_bar.xml all} + +<p><code>res/layout/twopanes.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/layout/twopanes.xml all} + +<p><code>res/layout/twopanes_narrow.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/layout/twopanes_narrow.xml all} + +<p>Now that all possible layouts are defined, it's just a matter of mapping the correct layout to +each configuration using the configuration qualifiers. You can now do it using the layout alias +technique:</p> + +<p><code>res/values/layouts.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/values/layouts.xml all} + +<p><code>res/values-sw600dp-land/layouts.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/values-sw600dp-land/layouts.xml +all} + +<p><code>res/values-sw600dp-port/layouts.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/values-sw600dp-port/layouts.xml +all} + +<p><code>res/values-xlarge-land/layouts.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/values-xlarge-land/layouts.xml all} + +<p><code>res/values-xlarge-port/layouts.xml</code>:</p> +{@sample development/samples/training/multiscreen/newsreader/res/values-xlarge-port/layouts.xml all} + + + +<h2 id="TaskUse9Patch">Use Nine-patch Bitmaps</h2> + +<p>Supporting different screen sizes usually means that your image resources +must also be capable of adapting to different sizes. For example, a button +background must fit whichever button shape it is applied to.</p> + +<p>If you use simple images on components that can change size, you will +quickly notice that the results are somewhat less than impressive, since the +runtime will stretch or shrink your images uniformly. The solution is using nine-patch bitmaps, +which are specially +formatted PNG files that indicate which areas can and cannot be stretched.</p> + +<p>Therefore, when designing bitmaps that will be used on components with +variable size, always use nine-patches. To convert a bitmap into a nine-patch, +you can start with a regular image (figure 4, shown with in 4x zoom for clarity).</p> + +<img src="{@docRoot}images/training/button.png" /> +<p class="img-caption"><strong>Figure 4.</strong> <code>button.png</code></p> + +<p>And then run it through the <ode +href="{@docRoot}guide/developing/tools/draw9patch.html"><code>draw9patch</code></a> utility of the +SDK (which is located in the <code>tools/</code> directory), in which you can mark the areas that +should be stretched by drawing pixels along the left and top borders. You can also mark the area +that should hold the content by drawing pixels along the right and bottom borders, resulting in +figure 5.</p> + +<img src="{@docRoot}images/training/button_with_marks.png" /> +<p class="img-caption"><strong>Figure 5.</strong> <code>button.9.png</code></p> + +<p>Notice the black pixels along the borders. The ones on the top and left +borders indicate the places where the image can be stretched, and the ones on +the right and bottom borders indicate where the content should be +placed.</p> + +<p>Also, notice the <code>.9.png</code> extension. You must use this +extension, since this is how the framework detects that this is a nine-patch +image, as opposed to a regular PNG image.</p> + +<p>When you apply this background to a component (by setting +<code>android:background="@drawable/button"</code>), the framework stretches +the image correctly to accommodate the size of the button, as shown in various sizes in figure +6.</p> + +<img src="{@docRoot}images/training/buttons_stretched.png" /> +<p class="img-caption"><strong>Figure 6.</strong> A button using the <code>button.9.png</code> +nine-patch in various sizes.</p> + diff --git a/docs/html/training/sharing/index.jd b/docs/html/training/sharing/index.jd new file mode 100644 index 000000000000..cb133c393c41 --- /dev/null +++ b/docs/html/training/sharing/index.jd @@ -0,0 +1,46 @@ +page.title=Sharing Content + +trainingnavtop=true +startpage=true +next.title=Sending Content to Other Apps +next.link=send.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- Required platform, tools, add-ons, devices, knowledge, etc. --> +<h2>Dependencies and prerequisites</h2> +<ul> + <li>Android 1.0 or higher (greater requirements where noted)</li> + <li>Experience with <a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and +Intent Filters</a></li> +</ul> + +</div> +</div> + + +<p>One of the great things about Android applications is their ability to communicate and +integrate with each other. Why reinvent functionality that isn't core to your application when it +already exists in another application?</p> + +<p>This class shows some common ways you can send and receive content between +applications using {@link android.content.Intent} APIs and the {@link +android.view.ActionProvider}.</p> + + +<h2>Lessons</h2> + +<dl> + <dt><b><a href="send.html">Sending Content to Other Apps</a></b></dt> + <dd>Learn how to set up your application to be able to send text and binary data to other +applications with intents.</dd> + + <dt><b><a href="receive.html">Receiving Content from Other Apps</a></b></dt> + <dd>Learn how to set up your application to receive text and binary data from intents.</dd> + + <dt><b><a href="shareaction.html">Adding an Easy Share Action</a></b></dt> + <dd>Learn how to add a "share" action item to your action bar.</dd> +</dl> diff --git a/docs/html/training/sharing/receive.jd b/docs/html/training/sharing/receive.jd new file mode 100644 index 000000000000..b2cac304325d --- /dev/null +++ b/docs/html/training/sharing/receive.jd @@ -0,0 +1,149 @@ +page.title=Receiving Content from Other Apps +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +previous.title=Sending Content to Other Apps +previous.link=send.html +next.title=Adding an Easy Share Action +next.link=shareaction.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#update-manifest">Update Your Manifest</a></li> + <li><a href="#handling-content">Handle the Incoming Content</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and +Intent Filters</a></li> +</ul> + +</div> +</div> + +<p>Just as your application can send data to other applications, so too can it easily receive data +from applications. Think about how users interact with your application, and what data types you +want to receive from other applications. For example, a social networking application would likely +be interested in receiving text content, like an interesting web URL, from another app. The +<a href="https://market.android.com/details?id=com.google.android.apps.plus">Google+ Android +application</a> +accepts both text <em>and</em> single or multiple images. With this app, a user can easily start a +new Google+ post with photos from the Android Gallery app.</p> + + +<h2 id="update-manifest">Update Your Manifest</h2> + +<p>Intent filters inform the system what intents an application component is willing to accept. +Just as you constructed an intent with action {@link android.content.Intent#ACTION_SEND} in the +<a href="{@docRoot}training/sharing/send.html">Send Content to Other Apps Using Intents</a> +lesson, you create intent filters in order to be able to receive intents with this action. You +define an intent filter in your manifest, using the +<code><a +href="{@docRoot}guide/topics/intents/intents-filters.html#ifs"><intent-filter></a></code> +element. For example, if your application handles receiving text content, a single image of any +type, or multiple images of any type, your manifest would look like:</p> + +<pre> +<activity android:name=".ui.MyActivity" > + <intent-filter> + <action android:name="android.intent.action.SEND" /> + <category android:name="android.intent.category.DEFAULT" /> + <data android:mimeType="image/*" /> + </intent-filter> + <intent-filter> + <action android:name="android.intent.action.SEND" /> + <category android:name="android.intent.category.DEFAULT" /> + <data android:mimeType="text/plain" /> + </intent-filter> + <intent-filter> + <action android:name="android.intent.action.SEND_MULTIPLE" /> + <category android:name="android.intent.category.DEFAULT" /> + <data android:mimeType="image/*" /> + </intent-filter> +</activity> +</pre> + +<p class="note"><strong>Note:</strong> For more information on intent filters and intent resolution +please read <a href="{@docRoot}guide/topics/intents/intents-filters.html#ifs">Intents and Intent +Filters</a></p> + +<p>When another application tries to share any of these things by constructing an intent and passing +it to {@link android.content.Context#startActivity(android.content.Intent) startActivity()}, your +application will be listed as an option in the intent chooser (see figure 1). If the user selects +your application, the corresponding activity (<code>.ui.MyActivity</code> in the example above) will +be started. It is then up to you to handle the content appropriately within your code and UI.</p> + + +<h2 id="handling-content">Handle the Incoming Content</h2> + +<p>To handle the content delivered by an {@link android.content.Intent}, start by calling {@link +android.content.Intent#getIntent(String) getIntent()} +to get {@link android.content.Intent} object. Once you have the object, you can examine its +contents to determine what to do next. Keep in mind that if this activity can be started from other +parts of the system, such as the launcher, then you will need to take this into consideration when +examining the intent.</p> + +<pre> +void onCreate (Bundle savedInstanceState) { + ... + // Get intent, action and MIME type + Intent intent = getIntent(); + String action = intent.getAction(); + String type = intent.getType(); + + if (Intent.ACTION_SEND.equals(action) && type != null) { + if ("text/plain".equals(type)) { + handleSendText(intent); // Handle text being sent + } else if (type.startsWith("image/")) { + handleSendImage(intent); // Handle single image being sent + } + } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { + if (type.startsWith("image/")) { + handleSendMultipleImages(intent); // Handle multiple images being sent + } + } else { + // Handle other intents, such as being started from the home screen + } + ... +} + +void handleSendText(Intent intent) { + String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); + if (sharedText != null) { + // Update UI to reflect text being shared + } +} + +void handleSendImage(Intent intent) { + Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); + if (imageUri != null) { + // Update UI to reflect image being shared + } +} + +void handleSendMultipleImages(Intent intent) { + ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); + if (imageUris != null) { + // Update UI to reflect multiple images being shared + } +} +</pre> + +<p class="caution"><strong>Caution:</strong> Take extra care to check the incoming data, you never +know what some other application may send you. For example, the wrong MIME type might be set, or the +image being sent might be extremely large. Also, remember to process binary data in a separate +thread rather than the main ("UI") thread.</p> + +<p>Updating the UI can be as simple as populating an {@link android.widget.EditText}, or it can +be more complicated like applying an interesting photo filter to an image. It's really specific +to your application what happens next.</p> + diff --git a/docs/html/training/sharing/send.jd b/docs/html/training/sharing/send.jd new file mode 100644 index 000000000000..d151ed03c7db --- /dev/null +++ b/docs/html/training/sharing/send.jd @@ -0,0 +1,194 @@ +page.title=Sending Content to Other Apps +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +next.title=Receiving Content from Other Apps +next.link=receive.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#send-text-content">Send Text Content</a></li> + <li><a href="#send-binary-content">Send Binary Content</a></li> + <li><a href="#send-multiple-content">Send Multiple Pieces of Content</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/intents/intents-filters.html">Intents and +Intent Filters</a></li> +</ul> + +</div> +</div> + +<p>When you construct an intent, you must specify the action you want the intent to "trigger." +Android defines several actions, including {@link android.content.Intent#ACTION_SEND} which, as +you can probably guess, indicates that the intent is sending data from one activity to another, +even across process boundaries. To send data to another activity, all you need to do is speicify +the data and its type, the system will identify compatible receiving activities and display them +to the user (if there are multiple options) or immediately start the activity (if there is only +one option). Similarly, you can advertise the data types that your activities support receiving +from other applications by specifying them in your manifest.</p> + +<p>Sending and receiving data between applications with intents is most commonly used for social +sharing of content. Intents allow users to share information quickly and easily, using their +favorite social applications.</p> + +<p><strong>Note:</strong> The best way to add a share action item to an +{@link android.app.ActionBar} is to use {@link android.widget.ShareActionProvider}, which became +available in API level 14. {@link android.widget.ShareActionProvider} is discussed in the lesson +about <a href="shareaction.html">Adding an Easy Share Action</a>.</p> + + +<h2 id="send-text-content">Send Text Content</h2> + +<div class="figure" style="width:220px"> +<img src="{@docRoot}images/training/sharing/share-text-screenshot.png" alt="" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> Screenshot of {@link android.content.Intent#ACTION_SEND} intent chooser +on a handset. +</p> +</div> + +<p>The most straightforward and common use of the {@link android.content.Intent#ACTION_SEND} +action is sending text content from one activity to another. For example, the built-in Browser +app can share the URL of the currently-displayed page as text with any application. This is useful +for sharing an article or website with friends via email or social networking. Here is the code to +implement this type of sharing:</p> + +<pre> +Intent sendIntent = new Intent(); +sendIntent.setAction(Intent.ACTION_SEND); +sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); +sendIntent.setType("text/plain"); +startActivity(sendIntent); +</pre> + +<p>If there's an installed application with a filter that matches +{@link android.content.Intent#ACTION_SEND} and MIME type text/plain, the Android system will run +it; if more than one application matches, the system displays a disambiguation dialog (a "chooser") +that allows the user to choose an app. If you call +{@link android.content.Intent#createChooser(android.content.Intent, CharSequence) +Intent.createChooser()} +for the intent, Android will <strong>always</strong> display the chooser. This has some +advantages:</p> + +<ul> + <li>Even if the user has previously selected a default action for this intent, the chooser will +still be displayed.</li> + <li>If no applications match, Android displays a system message.</li> + <li>You can specify a title for the chooser dialog.</li> +</ul> + +<p>Here's the updated code:</p> + +<pre> +Intent sendIntent = new Intent(); +sendIntent.setAction(Intent.ACTION_SEND); +sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send."); +sendIntent.setType("text/plain"); +startActivity(<strong>Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)</strong>); +</pre> + +<p>The resulting dialog is shown in figure 1.</p> + +<p>Optionally, you can set some standard extras for the intent: +{@link android.content.Intent#EXTRA_EMAIL}, {@link android.content.Intent#EXTRA_CC}, +{@link android.content.Intent#EXTRA_BCC}, {@link android.content.Intent#EXTRA_SUBJECT}. However, +if the receiving application is not designed to use them, nothing will happen. You can use +custom extras as well, but there's no effect unless the receiving application understands them. +Typically, you'd use custom extras defined by the receiving application itself.</p> + +<p class="note"><strong>Note:</strong> Some e-mail applications, such as Gmail, expect a +{@link java.lang.String String[]} for extras like {@link android.content.Intent#EXTRA_EMAIL} and +{@link android.content.Intent#EXTRA_CC}, use +{@link android.content.Intent#putExtra(String,String[]) putExtra(String, String[])} to add these +to your intent.</p> + + +<h2 id="send-binary-content">Send Binary Content</h2> + +<p>Binary data is shared using the {@link android.content.Intent#ACTION_SEND} action combined with +setting the appropriate MIME type and placing the URI to the data in an extra named {@link +android.content.Intent#EXTRA_STREAM}. This is commonly used to share an image but can be used to +share any type of binary content:</p> + +<pre> +Intent shareIntent = new Intent(); +shareIntent.setAction(Intent.ACTION_SEND); +shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage); +shareIntent.setType("image/jpeg"); +startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to))); +</pre> + +<p>Note the following:</p> +<ul> + <li>You can use a MIME type of {@code "*/*"}, but this will only match activities that are able to +handle generic data streams.</li> + <li>The receiving application needs permission to access the data the {@link android.net.Uri} +points to. There are a number of ways to handle this: + <ul> + <li>Write the data to a file on external/shared storage (such as the SD card), which all apps +can read. Use {@link android.net.Uri#fromFile(java.io.File) Uri.fromFile()} to create the +{@link android.net.Uri} that can be passed to the share intent. However, keep in mind that not +all applications process a {@code file://} style {@link android.net.Uri}.</li> + <li>Write the data to a file in your own application directory using {@link +android.content.Context#openFileOutput(java.lang.String, int) openFileOutput()} with mode {@link +android.content.Context#MODE_WORLD_READABLE} after which {@link +android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()} can be used to +return a {@link java.io.File}. As with the previous option, {@link +android.net.Uri#fromFile(java.io.File) Uri.fromFile()} will create a {@code file://} style {@link +android.net.Uri} for your share intent.</li> + <li>Media files like images, videos and audio can be scanned and added to the system {@link +android.provider.MediaStore} using {@link +android.media.MediaScannerConnection#scanFile(android.content.Context, java.lang.String[], +java.lang.String[], android.media.MediaScannerConnection.OnScanCompletedListener) scanFile()}. The +{@link +android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, +android.net.Uri) onScanCompleted()} callback returns a {@code content://} style {@link +android.net.Uri} suitable for including in your share intent.</li> + <li>Images can be inserted into the system {@link android.provider.MediaStore} using {@link +android.provider.MediaStore.Images.Media#insertImage(android.content.ContentResolver, +android.graphics.Bitmap, java.lang.String, java.lang.String) insertImage()} which will return a +{@code content://} style {@link android.net.Uri} suitable for including in a share intent.</li> + <li>Store the data in your own {@link android.content.ContentProvider}, make sure that other +apps have the correct permission to access your provider (or use <a +href="{@docRoot}guide/topics/security/security.html#uri">per-URI permissions</a>).</li> + </ul> + </li> +</ul> + + +<h2 id="send-multiple-content">Send Multiple Pieces of Content</h2> + +<p>To share multiple pieces of content, use the {@link android.content.Intent#ACTION_SEND_MULTIPLE} +action together with a list of URIs pointing to the content. The MIME type varies according to the +mix of content you're sharing. For example, if you share 3 JPEG images, the type is still {@code +"image/jpeg"}. For a mixture of image types, it should be {@code "image/*"} to match an activity +that handles any type of image. You should only use {@code "*/*"} if you're sharing out a wide +variety of types. As previously stated, it's up to the receiving application to parse and process +your data. Here's an example:</p> + +<pre> +ArrayList<Uri> imageUris = new ArrayList<Uri>(); +imageUris.add(imageUri1); // Add your image URIs here +imageUris.add(imageUri2); + +Intent shareIntent = new Intent(); +shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE); +shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris); +shareIntent.setType("image/*"); +startActivity(Intent.createChooser(shareIntent, "Share images to..")); +</pre> + +<p>As before, make sure the provided {@link android.net.Uri URIs} point to data that a receiving +application can access.</p> + diff --git a/docs/html/training/sharing/shareaction.jd b/docs/html/training/sharing/shareaction.jd new file mode 100644 index 000000000000..f6be745b93b8 --- /dev/null +++ b/docs/html/training/sharing/shareaction.jd @@ -0,0 +1,115 @@ +page.title=Adding an Easy Share Action +parent.title=Sharing Content +parent.link=index.html + +trainingnavtop=true +previous.title=Receiving Content from Other Apps +previous.link=receive.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<!-- table of contents --> +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#update-menus">Update Menu Declarations</a></li> + <li><a href="#set-share-intent">Set the Share Intent</a></li> +</ol> + +<!-- other docs (NOT javadocs) --> +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a></li> +</ul> + +</div> +</div> + + +<p>Implementing an effective and user friendly share action in your {@link android.app.ActionBar} +is made even easier with the introduction of {@link android.view.ActionProvider} in Android 4.0 +(API Level 14). An {@link android.view.ActionProvider}, once attached to a menu item in the action +bar, handles both the appearance and behavior of that item. In the case of {@link +android.widget.ShareActionProvider}, you provide a share intent and it does the rest.</p> + +<p class="note"><strong>Note: </strong> {@link android.widget.ShareActionProvider} is available +starting with API Level 14 and higher.</p> + + +<div class="figure" style="width:200px"> +<img src="{@docRoot}images/ui/actionbar-shareaction.png" alt="" id="figure1" /> +<p class="img-caption"> + <strong>Figure 1.</strong> The {@link android.widget.ShareActionProvider} in the Gallery app. +</p> +</div> + +<h2 id="update-menus">Update Menu Declarations</h2> + +<p>To get started with {@link android.widget.ShareActionProvider ShareActionProviders}, define the <code>android:actionProviderClass</code> attribute for the corresponding <code><item></code> in your <a href="{@docRoot}guide/topics/resources/menu-resource.html">menu resource</a> file:</p> + +<pre> +<menu xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@+id/menu_item_share" + android:showAsAction="ifRoom" + android:title="Share" + <strong>android:actionProviderClass="android.widget.ShareActionProvider"</strong> /> + ... +</menu> +</pre> + +<p>This delegates responsibility for the item's appearance and function to +{@link android.widget.ShareActionProvider}. However, you will need to tell the provider what you +would like to share.</p> + + +<h2 id="set-share-intent">Set the Share Intent</h2> + +<p>In order for {@link android.widget.ShareActionProvider} to function, you must provide it a share +intent. This share intent should be the same as described in the <a +href="{@docRoot}training/sharing/send.html">Sending Content to Other Apps</a> +lesson, with action {@link android.content.Intent#ACTION_SEND} and additional data set via extras +like {@link android.content.Intent#EXTRA_TEXT} and {@link android.content.Intent#EXTRA_STREAM}. To +assign a share intent, first find the corresponding {@link android.view.MenuItem} while inflating +your menu resource in your {@link android.app.Activity} or {@link android.app.Fragment}. Next, call +{@link android.view.MenuItem#getActionProvider() MenuItem.getActionProvider()} to retreive an +instance of {@link android.widget.ShareActionProvider}. Use {@link +android.widget.ShareActionProvider#setShareIntent(android.content.Intent) setShareIntent()} to +update the share intent associated with that action item. Here's an example:</p> + +<pre> +private ShareActionProvider mShareActionProvider; +... + +@Override +public boolean onCreateOptionsMenu(Menu menu) { + // Inflate menu resource file. + getMenuInflater().inflate(R.menu.share_menu, menu); + + // Locate MenuItem with ShareActionProvider + MenuItem item = menu.findItem(R.id.menu_item_share); + + // Fetch and store ShareActionProvider + mShareActionProvider = (ShareActionProvider) item.getActionProvider(); + + // Return true to display menu + return true; +} + +// Call to update the share intent +private void setShareIntent(Intent shareIntent) { + if (mShareActionProvider != null) { + mShareActionProvider.setShareIntent(shareIntent); + } +} +</pre> + +<p>You may only need to set the share intent once during the creation of your menus, or you may +want to set it and then update it as the UI changes. For example, when you view photos full screen +in the Gallery app, the sharing intent changes as you flip between photos.</p> + +<p>For further discussion about the {@link android.widget.ShareActionProvider}, see the <a +href="{@docRoot}guide/topics/ui/actionbar.html#ActionProvider">Action Bar</a> guide.</p> + + diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index cb3d8338bc84..b10604289c7e 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -75,15 +75,15 @@ public: size_t size; union { void* raw; - short* i16; - int8_t* i8; + short* i16; // signed 16-bit + int8_t* i8; // unsigned 8-bit, offset by 0x80 }; }; /* As a convenience, if a callback is supplied, a handler thread * is automatically created with the appropriate priority. This thread - * invokes the callback when a new buffer becomes availlable or an underrun condition occurs. + * invokes the callback when a new buffer becomes available or an underrun condition occurs. * Parameters: * * event: type of event notified (see enum AudioTrack::event_type). @@ -94,8 +94,8 @@ public: * written. * - EVENT_UNDERRUN: unused. * - EVENT_LOOP_END: pointer to an int indicating the number of loops remaining. - * - EVENT_MARKER: pointer to an uin32_t containing the marker position in frames. - * - EVENT_NEW_POS: pointer to an uin32_t containing the new position in frames. + * - EVENT_MARKER: pointer to an uint32_t containing the marker position in frames. + * - EVENT_NEW_POS: pointer to an uint32_t containing the new position in frames. * - EVENT_BUFFER_END: unused. */ @@ -135,9 +135,10 @@ public: * flags: Reserved for future use. * cbf: Callback function. If not null, this function is called periodically * to request new PCM data. + * user: Context for use by the callback receiver. * notificationFrames: The callback function is called each time notificationFrames PCM - * frames have been comsumed from track input buffer. - * user Context for use by the callback receiver. + * frames have been consumed from track input buffer. + * sessionId: Specific session ID, or zero to use default. */ AudioTrack( int streamType, @@ -152,11 +153,11 @@ public: int sessionId = 0); /* Creates an audio track and registers it with AudioFlinger. With this constructor, - * The PCM data to be rendered by AudioTrack is passed in a shared memory buffer + * the PCM data to be rendered by AudioTrack is passed in a shared memory buffer * identified by the argument sharedBuffer. This prototype is for static buffer playback. - * PCM data must be present into memory before the AudioTrack is started. - * The Write() and Flush() methods are not supported in this case. - * It is recommented to pass a callback function to be notified of playback end by an + * PCM data must be present in memory before the AudioTrack is started. + * The write() and flush() methods are not supported in this case. + * It is recommended to pass a callback function to be notified of playback end by an * EVENT_UNDERRUN event. */ @@ -172,15 +173,15 @@ public: int sessionId = 0); /* Terminates the AudioTrack and unregisters it from AudioFlinger. - * Also destroys all resources assotiated with the AudioTrack. + * Also destroys all resources associated with the AudioTrack. */ ~AudioTrack(); /* Initialize an uninitialized AudioTrack. * Returned status (from utils/Errors.h) can be: - * - NO_ERROR: successful intialization - * - INVALID_OPERATION: AudioTrack is already intitialized + * - NO_ERROR: successful initialization + * - INVALID_OPERATION: AudioTrack is already initialized * - BAD_VALUE: invalid parameter (channels, format, sampleRate...) * - NO_INIT: audio server or audio hardware not initialized * */ @@ -199,13 +200,13 @@ public: /* Result of constructing the AudioTrack. This must be checked - * before using any AudioTrack API (except for set()), using + * before using any AudioTrack API (except for set()), because using * an uninitialized AudioTrack produces undefined results. * See set() method above for possible return codes. */ status_t initCheck() const; - /* Returns this track's latency in milliseconds. + /* Returns this track's estimated latency in milliseconds. * This includes the latency due to AudioTrack buffer size, AudioMixer (if any) * and audio hardware driver. */ @@ -233,8 +234,8 @@ public: void stop(); bool stopped() const; - /* flush a stopped track. All pending buffers are discarded. - * This function has no effect if the track is not stoped. + /* Flush a stopped track. All pending buffers are discarded. + * This function has no effect if the track is not stopped. */ void flush(); @@ -244,26 +245,25 @@ public: */ void pause(); - /* mute or unmutes this track. - * While mutted, the callback, if set, is still called. + /* Mute or unmute this track. + * While muted, the callback, if set, is still called. */ void mute(bool); bool muted() const; - - /* set volume for this track, mostly used for games' sound effects - * left and right volumes. Levels must be <= 1.0. + /* Set volume for this track, mostly used for games' sound effects + * left and right volumes. Levels must be >= 0.0 and <= 1.0. */ status_t setVolume(float left, float right); void getVolume(float* left, float* right); - /* set the send level for this track. An auxiliary effect should be attached - * to the track with attachEffect(). Level must be <= 1.0. + /* Set the send level for this track. An auxiliary effect should be attached + * to the track with attachEffect(). Level must be >= 0.0 and <= 1.0. */ status_t setAuxEffectSendLevel(float level); void getAuxEffectSendLevel(float* level); - /* set sample rate for this track, mostly used for games' sound effects + /* Set sample rate for this track, mostly used for games' sound effects */ status_t setSampleRate(int sampleRate); uint32_t getSampleRate(); @@ -274,8 +274,8 @@ public: * * loopStart: loop start expressed as the number of PCM frames played since AudioTrack start. * loopEnd: loop end expressed as the number of PCM frames played since AudioTrack start. - * loopCount: number of loops to execute. Calling setLoop() with loopCount == 0 cancels any pending or - * active loop. loopCount = -1 means infinite looping. + * loopCount: number of loops to execute. Calling setLoop() with loopCount == 0 cancels any + * pending or active loop. loopCount = -1 means infinite looping. * * For proper operation the following condition must be respected: * (loopEnd-loopStart) <= framecount() @@ -283,10 +283,9 @@ public: status_t setLoop(uint32_t loopStart, uint32_t loopEnd, int loopCount); status_t getLoop(uint32_t *loopStart, uint32_t *loopEnd, int *loopCount); - - /* Sets marker position. When playback reaches the number of frames specified, a callback with event - * type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker notification - * callback. + /* Sets marker position. When playback reaches the number of frames specified, a callback with + * event type EVENT_MARKER is called. Calling setMarkerPosition with marker == 0 cancels marker + * notification callback. * If the AudioTrack has been opened with no callback function associated, the operation will fail. * * Parameters: @@ -301,10 +300,10 @@ public: status_t getMarkerPosition(uint32_t *marker); - /* Sets position update period. Every time the number of frames specified has been played, - * a callback with event type EVENT_NEW_POS is called. - * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification - * callback. + /* Sets position update period. Every time the number of frames specified has been played, + * a callback with event type EVENT_NEW_POS is called. + * Calling setPositionUpdatePeriod with updatePeriod == 0 cancels new position notification + * callback. * If the AudioTrack has been opened with no callback function associated, the operation will fail. * * Parameters: @@ -318,12 +317,11 @@ public: status_t setPositionUpdatePeriod(uint32_t updatePeriod); status_t getPositionUpdatePeriod(uint32_t *updatePeriod); - /* Sets playback head position within AudioTrack buffer. The new position is specified - * in number of frames. + * in number of frames. * This method must be called with the AudioTrack in paused or stopped state. - * Note that the actual position set is <position> modulo the AudioTrack buffer size in frames. - * Therefore using this method makes sense only when playing a "static" audio buffer + * Note that the actual position set is <position> modulo the AudioTrack buffer size in frames. + * Therefore using this method makes sense only when playing a "static" audio buffer * as opposed to streaming. * The getPosition() method on the other hand returns the total number of frames played since * playback start. @@ -335,12 +333,12 @@ public: * Returned status (from utils/Errors.h) can be: * - NO_ERROR: successful operation * - INVALID_OPERATION: the AudioTrack is not stopped. - * - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack buffer + * - BAD_VALUE: The specified position is beyond the number of frames present in AudioTrack buffer */ status_t setPosition(uint32_t position); status_t getPosition(uint32_t *position); - /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids + /* Forces AudioTrack buffer full condition. When playing a static buffer, this method avoids * rewriting the buffer before restarting playback after a stop. * This method must be called with the AudioTrack in paused or stopped state. * @@ -350,7 +348,7 @@ public: */ status_t reload(); - /* returns a handle on the audio output used by this AudioTrack. + /* Returns a handle on the audio output used by this AudioTrack. * * Parameters: * none. @@ -360,18 +358,17 @@ public: */ audio_io_handle_t getOutput(); - /* returns the unique ID associated to this track. + /* Returns the unique session ID associated with this track. * * Parameters: * none. * * Returned value: - * AudioTrack ID. + * AudioTrack session ID. */ int getSessionId(); - - /* Attach track auxiliary output to specified effect. Used effectId = 0 + /* Attach track auxiliary output to specified effect. Use effectId = 0 * to detach track from effect. * * Parameters: @@ -385,9 +382,9 @@ public: */ status_t attachAuxEffect(int effectId); - /* obtains a buffer of "frameCount" frames. The buffer must be + /* Obtains a buffer of "frameCount" frames. The buffer must be * filled entirely. If the track is stopped, obtainBuffer() returns - * STOPPED instead of NO_ERROR as long as there are buffers availlable, + * STOPPED instead of NO_ERROR as long as there are buffers available, * at which point NO_MORE_BUFFERS is returned. * Buffers will be returned until the pool (buffercount()) * is exhausted, at which point obtainBuffer() will either block @@ -403,10 +400,9 @@ public: status_t obtainBuffer(Buffer* audioBuffer, int32_t waitCount); void releaseBuffer(Buffer* audioBuffer); - /* As a convenience we provide a write() interface to the audio buffer. * This is implemented on top of lockBuffer/unlockBuffer. For best - * performance + * performance use callbacks. Return actual number of bytes written. * */ ssize_t write(const void* buffer, size_t size); diff --git a/include/media/IAudioTrack.h b/include/media/IAudioTrack.h index 47d530be5bd9..3fa2bf8ab7ca 100644 --- a/include/media/IAudioTrack.h +++ b/include/media/IAudioTrack.h @@ -46,13 +46,13 @@ public: */ virtual void stop() = 0; - /* flush a stopped track. All pending buffers are discarded. - * This function has no effect if the track is not stoped. + /* Flush a stopped track. All pending buffers are discarded. + * This function has no effect if the track is not stopped. */ virtual void flush() = 0; - /* mute or unmutes this track. - * While mutted, the callback, if set, is still called. + /* Mute or unmute this track. + * While muted, the callback, if set, is still called. */ virtual void mute(bool) = 0; @@ -67,7 +67,7 @@ public: */ virtual status_t attachAuxEffect(int effectId) = 0; - /* get this tracks control block */ + /* get this track's control block */ virtual sp<IMemory> getCblk() const = 0; }; diff --git a/include/private/media/AudioTrackShared.h b/include/private/media/AudioTrackShared.h index 20abd513e2fc..046d5e97ee45 100644 --- a/include/private/media/AudioTrackShared.h +++ b/include/private/media/AudioTrackShared.h @@ -59,8 +59,8 @@ struct audio_track_cblk_t // The data members are grouped so that members accessed frequently and in the same context // are in the same line of data cache. - Mutex lock; - Condition cv; + Mutex lock; // sizeof(int) + Condition cv; // sizeof(int) volatile uint32_t user; volatile uint32_t server; uint32_t userBase; diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 6f3051ad783e..4310bed85506 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -500,8 +500,8 @@ status_t SurfaceTexture::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, eglDestroySyncKHR(dpy, fence); } - ST_LOGV("dequeueBuffer: returning slot=%d buf=%p flags=%#x", buf, - mSlots[buf].mGraphicBuffer->handle, returnFlags); + ST_LOGV("dequeueBuffer: returning slot=%d buf=%p flags=%#x", *outBuf, + mSlots[*outBuf].mGraphicBuffer->handle, returnFlags); return returnFlags; } diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index f293cba652f5..f2205f65974e 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -73,6 +73,17 @@ void Caches::init() { glBufferData(GL_ARRAY_BUFFER, sizeof(gMeshVertices), gMeshVertices, GL_STATIC_DRAW); mCurrentBuffer = meshBuffer; + mCurrentIndicesBuffer = 0; + mCurrentPositionPointer = this; + mCurrentTexCoordsPointer = this; + + mTexCoordsArrayEnabled = false; + + mScissorX = mScissorY = mScissorWidth = mScissorHeight = 0; + + glActiveTexture(gTextureUnits[0]); + mTextureUnit = 0; + mRegionMesh = NULL; blend = false; @@ -218,21 +229,99 @@ void Caches::flush(FlushMode mode) { // VBO /////////////////////////////////////////////////////////////////////////////// -void Caches::bindMeshBuffer() { - bindMeshBuffer(meshBuffer); +bool Caches::bindMeshBuffer() { + return bindMeshBuffer(meshBuffer); } -void Caches::bindMeshBuffer(const GLuint buffer) { +bool Caches::bindMeshBuffer(const GLuint buffer) { if (mCurrentBuffer != buffer) { glBindBuffer(GL_ARRAY_BUFFER, buffer); mCurrentBuffer = buffer; + return true; } + return false; } -void Caches::unbindMeshBuffer() { +bool Caches::unbindMeshBuffer() { if (mCurrentBuffer) { glBindBuffer(GL_ARRAY_BUFFER, 0); mCurrentBuffer = 0; + return true; + } + return false; +} + +bool Caches::bindIndicesBuffer(const GLuint buffer) { + if (mCurrentIndicesBuffer != buffer) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer); + mCurrentIndicesBuffer = buffer; + return true; + } + return false; +} + +bool Caches::unbindIndicesBuffer() { + if (mCurrentIndicesBuffer) { + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); + mCurrentIndicesBuffer = 0; + return true; + } + return false; +} + +void Caches::bindPositionVertexPointer(bool force, GLuint slot, GLvoid* vertices, GLsizei stride) { + if (force || vertices != mCurrentPositionPointer) { + glVertexAttribPointer(slot, 2, GL_FLOAT, GL_FALSE, stride, vertices); + mCurrentPositionPointer = vertices; + } +} + +void Caches::bindTexCoordsVertexPointer(bool force, GLuint slot, GLvoid* vertices) { + if (force || vertices != mCurrentTexCoordsPointer) { + glVertexAttribPointer(slot, 2, GL_FLOAT, GL_FALSE, gMeshStride, vertices); + mCurrentTexCoordsPointer = vertices; + } +} + +void Caches::resetVertexPointers() { + mCurrentPositionPointer = this; + mCurrentTexCoordsPointer = this; +} + +void Caches::resetTexCoordsVertexPointer() { + mCurrentTexCoordsPointer = this; +} + +void Caches::enableTexCoordsVertexArray() { + if (!mTexCoordsArrayEnabled) { + glEnableVertexAttribArray(Program::kBindingTexCoords); + mCurrentTexCoordsPointer = this; + mTexCoordsArrayEnabled = true; + } +} + +void Caches::disbaleTexCoordsVertexArray() { + if (mTexCoordsArrayEnabled) { + glDisableVertexAttribArray(Program::kBindingTexCoords); + mTexCoordsArrayEnabled = false; + } +} + +void Caches::activeTexture(GLuint textureUnit) { + if (mTextureUnit != textureUnit) { + glActiveTexture(gTextureUnits[textureUnit]); + mTextureUnit = textureUnit; + } +} + +void Caches::setScissor(GLint x, GLint y, GLint width, GLint height) { + if (x != mScissorX || y != mScissorY || width != mScissorWidth || height != mScissorHeight) { + glScissor(x, y, width, height); + + mScissorX = x; + mScissorY = y; + mScissorWidth = width; + mScissorHeight = height; } } @@ -254,13 +343,13 @@ TextureVertex* Caches::getRegionMesh() { } glGenBuffers(1, &mRegionMeshIndices); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mRegionMeshIndices); + bindIndicesBuffer(mRegionMeshIndices); glBufferData(GL_ELEMENT_ARRAY_BUFFER, REGION_MESH_QUAD_COUNT * 6 * sizeof(uint16_t), regionIndices, GL_STATIC_DRAW); delete[] regionIndices; } else { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mRegionMeshIndices); + bindIndicesBuffer(mRegionMeshIndices); } return mRegionMesh; diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h index 5e58a9e6e7b6..d264971b372c 100644 --- a/libs/hwui/Caches.h +++ b/libs/hwui/Caches.h @@ -70,6 +70,12 @@ static const GLsizei gVertexAAWidthOffset = 2 * sizeof(float); static const GLsizei gVertexAALengthOffset = 3 * sizeof(float); static const GLsizei gMeshCount = 4; +static const GLenum gTextureUnits[] = { + GL_TEXTURE0, + GL_TEXTURE1, + GL_TEXTURE2 +}; + /////////////////////////////////////////////////////////////////////////////// // Debug /////////////////////////////////////////////////////////////////////////////// @@ -91,15 +97,6 @@ class ANDROID_API Caches: public Singleton<Caches> { CacheLogger mLogger; - GLuint mCurrentBuffer; - - // Used to render layers - TextureVertex* mRegionMesh; - GLuint mRegionMeshIndices; - - mutable Mutex mGarbageLock; - Vector<Layer*> mLayerGarbage; - public: enum FlushMode { kFlushMode_Layers = 0, @@ -147,17 +144,53 @@ public: /** * Binds the VBO used to render simple textured quads. */ - void bindMeshBuffer(); + bool bindMeshBuffer(); /** * Binds the specified VBO if needed. */ - void bindMeshBuffer(const GLuint buffer); + bool bindMeshBuffer(const GLuint buffer); /** * Unbinds the VBO used to render simple textured quads. */ - void unbindMeshBuffer(); + bool unbindMeshBuffer(); + + bool bindIndicesBuffer(const GLuint buffer); + bool unbindIndicesBuffer(); + + /** + * Binds an attrib to the specified float vertex pointer. + * Assumes a stride of gMeshStride and a size of 2. + */ + void bindPositionVertexPointer(bool force, GLuint slot, GLvoid* vertices, + GLsizei stride = gMeshStride); + + /** + * Binds an attrib to the specified float vertex pointer. + * Assumes a stride of gMeshStride and a size of 2. + */ + void bindTexCoordsVertexPointer(bool force, GLuint slot, GLvoid* vertices); + + /** + * Resets the vertex pointers. + */ + void resetVertexPointers(); + void resetTexCoordsVertexPointer(); + + void enableTexCoordsVertexArray(); + void disbaleTexCoordsVertexArray(); + + /** + * Activate the specified texture unit. The texture unit must + * be specified using an integer number (0 for GL_TEXTURE0 etc.) + */ + void activeTexture(GLuint textureUnit); + + /** + * Sets the scissor for the current surface. + */ + void setScissor(GLint x, GLint y, GLint width, GLint height); /** * Returns the mesh used to draw regions. Calling this method will @@ -203,6 +236,27 @@ public: ResourceCache resourceCache; private: + GLuint mCurrentBuffer; + GLuint mCurrentIndicesBuffer; + void* mCurrentPositionPointer; + void* mCurrentTexCoordsPointer; + + bool mTexCoordsArrayEnabled; + + GLuint mTextureUnit; + + GLint mScissorX; + GLint mScissorY; + GLint mScissorWidth; + GLint mScissorHeight; + + // Used to render layers + TextureVertex* mRegionMesh; + GLuint mRegionMeshIndices; + + mutable Mutex mGarbageLock; + Vector<Layer*> mLayerGarbage; + DebugLevel mDebugLevel; bool mInitialized; }; // class Caches diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 158f78503689..3c6a952e09f0 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -22,8 +22,10 @@ #include <utils/Log.h> +#include "Caches.h" #include "Debug.h" #include "FontRenderer.h" +#include "Caches.h" namespace android { namespace uirenderer { @@ -34,10 +36,28 @@ namespace uirenderer { #define DEFAULT_TEXT_CACHE_WIDTH 1024 #define DEFAULT_TEXT_CACHE_HEIGHT 256 - -// We should query these values from the GL context #define MAX_TEXT_CACHE_WIDTH 2048 -#define MAX_TEXT_CACHE_HEIGHT 2048 +#define TEXTURE_BORDER_SIZE 2 + +/////////////////////////////////////////////////////////////////////////////// +// CacheTextureLine +/////////////////////////////////////////////////////////////////////////////// + +bool CacheTextureLine::fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY) { + if (glyph.fHeight + TEXTURE_BORDER_SIZE > mMaxHeight) { + return false; + } + + if (mCurrentCol + glyph.fWidth + TEXTURE_BORDER_SIZE < mMaxWidth) { + *retOriginX = mCurrentCol + 1; + *retOriginY = mCurrentRow + 1; + mCurrentCol += glyph.fWidth + TEXTURE_BORDER_SIZE; + mDirty = true; + return true; + } + + return false; +} /////////////////////////////////////////////////////////////////////////////// // Font @@ -104,10 +124,10 @@ void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y) { int width = (int) glyph->mBitmapWidth; int height = (int) glyph->mBitmapHeight; - mState->appendMeshQuad(nPenX, nPenY, 0, u1, v2, - nPenX + width, nPenY, 0, u2, v2, - nPenX + width, nPenY - height, 0, u2, v1, - nPenX, nPenY - height, 0, u1, v1); + mState->appendMeshQuad(nPenX, nPenY, u1, v2, + nPenX + width, nPenY, u2, v2, + nPenX + width, nPenY - height, u2, v1, + nPenX, nPenY - height, u1, v1, glyph->mCachedTextureLine->mCacheTexture); } void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, @@ -118,8 +138,9 @@ void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, uint32_t endX = glyph->mStartX + glyph->mBitmapWidth; uint32_t endY = glyph->mStartY + glyph->mBitmapHeight; - uint32_t cacheWidth = mState->getCacheWidth(); - const uint8_t* cacheBuffer = mState->getTextTextureData(); + CacheTexture *cacheTexture = glyph->mCachedTextureLine->mCacheTexture; + uint32_t cacheWidth = cacheTexture->mWidth; + const uint8_t* cacheBuffer = cacheTexture->mTexture; uint32_t cacheX = 0, cacheY = 0; int32_t bX = 0, bY = 0; @@ -133,10 +154,9 @@ void Font::drawCachedGlyph(CachedGlyphInfo* glyph, int x, int y, bitmap[bY * bitmapW + bX] = tempCol; } } - } -Font::CachedGlyphInfo* Font::getCachedGlyph(SkPaint* paint, glyph_t textUnit) { +CachedGlyphInfo* Font::getCachedGlyph(SkPaint* paint, glyph_t textUnit) { CachedGlyphInfo* cachedGlyph = NULL; ssize_t index = mCachedGlyphs.indexOfKey(textUnit); if (index >= 0) { @@ -245,7 +265,7 @@ void Font::updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyp // Get the bitmap for the glyph paint->findImage(skiaGlyph); - glyph->mIsValid = mState->cacheBitmap(skiaGlyph, &startX, &startY); + mState->cacheBitmap(skiaGlyph, glyph, &startX, &startY); if (!glyph->mIsValid) { return; @@ -259,8 +279,8 @@ void Font::updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyp glyph->mBitmapWidth = skiaGlyph.fWidth; glyph->mBitmapHeight = skiaGlyph.fHeight; - uint32_t cacheWidth = mState->getCacheWidth(); - uint32_t cacheHeight = mState->getCacheHeight(); + uint32_t cacheWidth = glyph->mCachedTextureLine->mCacheTexture->mWidth; + uint32_t cacheHeight = glyph->mCachedTextureLine->mCacheTexture->mHeight; glyph->mBitmapMinU = (float) startX / (float) cacheWidth; glyph->mBitmapMinV = (float) startY / (float) cacheHeight; @@ -270,7 +290,7 @@ void Font::updateGlyphCache(SkPaint* paint, const SkGlyph& skiaGlyph, CachedGlyp mState->mUploadTexture = true; } -Font::CachedGlyphInfo* Font::cacheGlyph(SkPaint* paint, glyph_t glyph) { +CachedGlyphInfo* Font::cacheGlyph(SkPaint* paint, glyph_t glyph) { CachedGlyphInfo* newGlyph = new CachedGlyphInfo(); mCachedGlyphs.add(glyph, newGlyph); @@ -319,27 +339,29 @@ FontRenderer::FontRenderer() { mInitialized = false; mMaxNumberOfQuads = 1024; mCurrentQuadIndex = 0; - mTextureId = 0; mTextMeshPtr = NULL; - mTextTexture = NULL; + mCurrentCacheTexture = NULL; + mLastCacheTexture = NULL; + mCacheTextureSmall = NULL; + mCacheTexture128 = NULL; + mCacheTexture256 = NULL; + mCacheTexture512 = NULL; mIndexBufferID = 0; - mPositionAttrSlot = -1; - mTexcoordAttrSlot = -1; - mCacheWidth = DEFAULT_TEXT_CACHE_WIDTH; - mCacheHeight = DEFAULT_TEXT_CACHE_HEIGHT; + mSmallCacheWidth = DEFAULT_TEXT_CACHE_WIDTH; + mSmallCacheHeight = DEFAULT_TEXT_CACHE_HEIGHT; char property[PROPERTY_VALUE_MAX]; if (property_get(PROPERTY_TEXT_CACHE_WIDTH, property, NULL) > 0) { if (sLogFontRendererCreate) { INIT_LOGD(" Setting text cache width to %s pixels", property); } - mCacheWidth = atoi(property); + mSmallCacheWidth = atoi(property); } else { if (sLogFontRendererCreate) { - INIT_LOGD(" Using default text cache width of %i pixels", mCacheWidth); + INIT_LOGD(" Using default text cache width of %i pixels", mSmallCacheWidth); } } @@ -347,10 +369,10 @@ FontRenderer::FontRenderer() { if (sLogFontRendererCreate) { INIT_LOGD(" Setting text cache width to %s pixels", property); } - mCacheHeight = atoi(property); + mSmallCacheHeight = atoi(property); } else { if (sLogFontRendererCreate) { - INIT_LOGD(" Using default text cache height of %i pixels", mCacheHeight); + INIT_LOGD(" Using default text cache height of %i pixels", mSmallCacheHeight); } } @@ -365,11 +387,10 @@ FontRenderer::~FontRenderer() { if (mInitialized) { delete[] mTextMeshPtr; - delete[] mTextTexture; - } - - if (mTextureId) { - glDeleteTextures(1, &mTextureId); + delete mCacheTextureSmall; + delete mCacheTexture128; + delete mCacheTexture256; + delete mCacheTexture512; } Vector<Font*> fontsToDereference = mActiveFonts; @@ -391,20 +412,21 @@ void FontRenderer::flushAllAndInvalidate() { } } -bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_t* retOriginY) { +uint8_t* FontRenderer::allocateTextureMemory(int width, int height) { + uint8_t* textureMemory = new uint8_t[width * height]; + memset(textureMemory, 0, width * height * sizeof(uint8_t)); + + return textureMemory; +} + +void FontRenderer::cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph, + uint32_t* retOriginX, uint32_t* retOriginY) { + cachedGlyph->mIsValid = false; // If the glyph is too tall, don't cache it - if (glyph.fHeight + 2 > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) { - if (mCacheHeight < MAX_TEXT_CACHE_HEIGHT) { - // Default cache not large enough for large glyphs - resize cache to - // max size and try again - flushAllAndInvalidate(); - initTextTexture(true); - } - if (glyph.fHeight + 2 > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) { - LOGE("Font size to large to fit in cache. width, height = %i, %i", - (int) glyph.fWidth, (int) glyph.fHeight); - return false; - } + if (glyph.fHeight + TEXTURE_BORDER_SIZE > mCacheLines[mCacheLines.size() - 1]->mMaxHeight) { + LOGE("Font size to large to fit in cache. width, height = %i, %i", + (int) glyph.fWidth, (int) glyph.fHeight); + return; } // Now copy the bitmap into the cache texture @@ -412,9 +434,11 @@ bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint3 uint32_t startY = 0; bool bitmapFit = false; + CacheTextureLine *cacheLine; for (uint32_t i = 0; i < mCacheLines.size(); i++) { bitmapFit = mCacheLines[i]->fitBitmap(glyph, &startX, &startY); if (bitmapFit) { + cacheLine = mCacheLines[i]; break; } } @@ -427,27 +451,33 @@ bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint3 for (uint32_t i = 0; i < mCacheLines.size(); i++) { bitmapFit = mCacheLines[i]->fitBitmap(glyph, &startX, &startY); if (bitmapFit) { + cacheLine = mCacheLines[i]; break; } } // if we still don't fit, something is wrong and we shouldn't draw if (!bitmapFit) { - LOGE("Bitmap doesn't fit in cache. width, height = %i, %i", - (int) glyph.fWidth, (int) glyph.fHeight); - return false; + return; } } + cachedGlyph->mCachedTextureLine = cacheLine; + *retOriginX = startX; *retOriginY = startY; uint32_t endX = startX + glyph.fWidth; uint32_t endY = startY + glyph.fHeight; - uint32_t cacheWidth = mCacheWidth; + uint32_t cacheWidth = cacheLine->mMaxWidth; - uint8_t* cacheBuffer = mTextTexture; + CacheTexture *cacheTexture = cacheLine->mCacheTexture; + if (cacheTexture->mTexture == NULL) { + // Large-glyph texture memory is allocated only as needed + cacheTexture->mTexture = allocateTextureMemory(cacheTexture->mWidth, cacheTexture->mHeight); + } + uint8_t* cacheBuffer = cacheTexture->mTexture; uint8_t* bitmapBuffer = (uint8_t*) glyph.fImage; unsigned int stride = glyph.rowBytes(); @@ -458,30 +488,17 @@ bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint3 cacheBuffer[cacheY * cacheWidth + cacheX] = mGammaTable[tempCol]; } } - - return true; + cachedGlyph->mIsValid = true; } -void FontRenderer::initTextTexture(bool largeFonts) { - mCacheLines.clear(); - if (largeFonts) { - mCacheWidth = MAX_TEXT_CACHE_WIDTH; - mCacheHeight = MAX_TEXT_CACHE_HEIGHT; - } - - mTextTexture = new uint8_t[mCacheWidth * mCacheHeight]; - memset(mTextTexture, 0, mCacheWidth * mCacheHeight * sizeof(uint8_t)); - - mUploadTexture = false; - - if (mTextureId != 0) { - glDeleteTextures(1, &mTextureId); - } - glGenTextures(1, &mTextureId); - glBindTexture(GL_TEXTURE_2D, mTextureId); +CacheTexture* FontRenderer::createCacheTexture(int width, int height, bool allocate) { + uint8_t* textureMemory = allocate ? allocateTextureMemory(width, height) : NULL; + GLuint textureId; + glGenTextures(1, &textureId); + glBindTexture(GL_TEXTURE_2D, textureId); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // Initialize texture dimensions - glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, mCacheWidth, mCacheHeight, 0, + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, 0); mLinearFiltering = false; @@ -491,36 +508,61 @@ void FontRenderer::initTextTexture(bool largeFonts) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - // Split up our cache texture into lines of certain widths + return new CacheTexture(textureMemory, textureId, width, height); +} + +void FontRenderer::initTextTexture() { + mCacheLines.clear(); + + // Next, use other, separate caches for large glyphs. + uint16_t maxWidth = 0; + if (Caches::hasInstance()) { + maxWidth = Caches::getInstance().maxTextureSize; + } + if (maxWidth > MAX_TEXT_CACHE_WIDTH || maxWidth == 0) { + maxWidth = MAX_TEXT_CACHE_WIDTH; + } + if (mCacheTextureSmall != NULL) { + delete mCacheTextureSmall; + delete mCacheTexture128; + delete mCacheTexture256; + delete mCacheTexture512; + } + mCacheTextureSmall = createCacheTexture(mSmallCacheWidth, mSmallCacheHeight, true); + mCacheTexture128 = createCacheTexture(maxWidth, 256, false); + mCacheTexture256 = createCacheTexture(maxWidth, 256, false); + mCacheTexture512 = createCacheTexture(maxWidth, 512, false); + mCurrentCacheTexture = mCacheTextureSmall; + + mUploadTexture = false; + // Split up our default cache texture into lines of certain widths int nextLine = 0; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 18, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 18, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 26, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 26, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 26, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 26, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 34, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 34, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 34, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 34, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - mCacheLines.push(new CacheTextureLine(mCacheWidth, 42, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, 42, nextLine, 0, mCacheTextureSmall)); nextLine += mCacheLines.top()->mMaxHeight; - if (largeFonts) { - int nextSize = 76; - // Make several new lines with increasing font sizes - while (nextSize < (int)(mCacheHeight - nextLine - (2 * nextSize))) { - mCacheLines.push(new CacheTextureLine(mCacheWidth, nextSize, nextLine, 0)); - nextLine += mCacheLines.top()->mMaxHeight; - nextSize += 50; - } - } - mCacheLines.push(new CacheTextureLine(mCacheWidth, mCacheHeight - nextLine, nextLine, 0)); + mCacheLines.push(new CacheTextureLine(mSmallCacheWidth, mSmallCacheHeight - nextLine, + nextLine, 0, mCacheTextureSmall)); + + // The first cache is split into 2 lines of height 128, the rest have just one cache line. + mCacheLines.push(new CacheTextureLine(maxWidth, 128, 0, 0, mCacheTexture128)); + mCacheLines.push(new CacheTextureLine(maxWidth, 128, 128, 0, mCacheTexture128)); + mCacheLines.push(new CacheTextureLine(maxWidth, 256, 0, 0, mCacheTexture256)); + mCacheLines.push(new CacheTextureLine(maxWidth, 512, 0, 0, mCacheTexture512)); } // Avoid having to reallocate memory and render quad by quad void FontRenderer::initVertexArrayBuffers() { - uint32_t numIndicies = mMaxNumberOfQuads * 6; - uint32_t indexBufferSizeBytes = numIndicies * sizeof(uint16_t); + uint32_t numIndices = mMaxNumberOfQuads * 6; + uint32_t indexBufferSizeBytes = numIndices * sizeof(uint16_t); uint16_t* indexBufferData = (uint16_t*) malloc(indexBufferSizeBytes); // Four verts, two triangles , six indices per quad @@ -538,13 +580,12 @@ void FontRenderer::initVertexArrayBuffers() { } glGenBuffers(1, &mIndexBufferID); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBufferID); + Caches::getInstance().bindIndicesBuffer(mIndexBufferID); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexBufferSizeBytes, indexBufferData, GL_STATIC_DRAW); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); free(indexBufferData); - uint32_t coordSize = 3; + uint32_t coordSize = 2; uint32_t uvSize = 2; uint32_t vertsPerQuad = 4; uint32_t vertexBufferSize = mMaxNumberOfQuads * vertsPerQuad * coordSize * uvSize; @@ -570,22 +611,28 @@ void FontRenderer::checkInit() { } void FontRenderer::checkTextureUpdate() { - if (!mUploadTexture) { + if (!mUploadTexture && mLastCacheTexture == mCurrentCacheTexture) { return; } - glBindTexture(GL_TEXTURE_2D, mTextureId); - + Caches& caches = Caches::getInstance(); + GLuint lastTextureId = 0; // Iterate over all the cache lines and see which ones need to be updated for (uint32_t i = 0; i < mCacheLines.size(); i++) { CacheTextureLine* cl = mCacheLines[i]; - if(cl->mDirty) { + if (cl->mDirty && cl->mCacheTexture->mTexture != NULL) { + CacheTexture* cacheTexture = cl->mCacheTexture; uint32_t xOffset = 0; uint32_t yOffset = cl->mCurrentRow; - uint32_t width = mCacheWidth; + uint32_t width = cl->mMaxWidth; uint32_t height = cl->mMaxHeight; - void* textureData = mTextTexture + yOffset*width; + void* textureData = cacheTexture->mTexture + (yOffset * width); + if (cacheTexture->mTextureId != lastTextureId) { + caches.activeTexture(0); + glBindTexture(GL_TEXTURE_2D, cacheTexture->mTextureId); + lastTextureId = cacheTexture->mTextureId; + } glTexSubImage2D(GL_TEXTURE_2D, 0, xOffset, yOffset, width, height, GL_ALPHA, GL_UNSIGNED_BYTE, textureData); @@ -593,57 +640,72 @@ void FontRenderer::checkTextureUpdate() { } } + glBindTexture(GL_TEXTURE_2D, mCurrentCacheTexture->mTextureId); + mLastCacheTexture = mCurrentCacheTexture; + mUploadTexture = false; } void FontRenderer::issueDrawCommand() { checkTextureUpdate(); - float* vtx = mTextMeshPtr; - float* tex = vtx + 3; + Caches& caches = Caches::getInstance(); + caches.bindIndicesBuffer(mIndexBufferID); + if (!mDrawn) { + float* buffer = mTextMeshPtr; + int offset = 2; - glVertexAttribPointer(mPositionAttrSlot, 3, GL_FLOAT, false, 20, vtx); - glVertexAttribPointer(mTexcoordAttrSlot, 2, GL_FLOAT, false, 20, tex); + bool force = caches.unbindMeshBuffer(); + caches.bindPositionVertexPointer(force, caches.currentProgram->position, buffer); + caches.bindTexCoordsVertexPointer(force, caches.currentProgram->texCoords, + buffer + offset); + } - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIndexBufferID); glDrawElements(GL_TRIANGLES, mCurrentQuadIndex * 6, GL_UNSIGNED_SHORT, NULL); mDrawn = true; } -void FontRenderer::appendMeshQuad(float x1, float y1, float z1, float u1, float v1, float x2, - float y2, float z2, float u2, float v2, float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4) { +void FontRenderer::appendMeshQuad(float x1, float y1, float u1, float v1, + float x2, float y2, float u2, float v2, + float x3, float y3, float u3, float v3, + float x4, float y4, float u4, float v4, CacheTexture* texture) { + if (mClip && (x1 > mClip->right || y1 < mClip->top || x2 < mClip->left || y4 > mClip->bottom)) { return; } + if (texture != mCurrentCacheTexture) { + if (mCurrentQuadIndex != 0) { + // First, draw everything stored already which uses the previous texture + issueDrawCommand(); + mCurrentQuadIndex = 0; + } + // Now use the new texture id + mCurrentCacheTexture = texture; + } const uint32_t vertsPerQuad = 4; - const uint32_t floatsPerVert = 5; + const uint32_t floatsPerVert = 4; float* currentPos = mTextMeshPtr + mCurrentQuadIndex * vertsPerQuad * floatsPerVert; (*currentPos++) = x1; (*currentPos++) = y1; - (*currentPos++) = z1; (*currentPos++) = u1; (*currentPos++) = v1; (*currentPos++) = x2; (*currentPos++) = y2; - (*currentPos++) = z2; (*currentPos++) = u2; (*currentPos++) = v2; (*currentPos++) = x3; (*currentPos++) = y3; - (*currentPos++) = z3; (*currentPos++) = u3; (*currentPos++) = v3; (*currentPos++) = x4; (*currentPos++) = y4; - (*currentPos++) = z4; (*currentPos++) = u4; (*currentPos++) = v4; @@ -723,6 +785,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(SkPaint* paint, const ch return image; } + mDrawn = false; mClip = NULL; mBounds = NULL; @@ -750,6 +813,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(SkPaint* paint, const ch image.image = dataBuffer; image.penX = penX; image.penY = penY; + return image; } @@ -762,11 +826,6 @@ bool FontRenderer::renderText(SkPaint* paint, const Rect* clip, const char *text return false; } - if (mPositionAttrSlot < 0 || mTexcoordAttrSlot < 0) { - LOGE("Font renderer unable to draw, attribute slots undefined"); - return false; - } - mDrawn = false; mBounds = bounds; mClip = clip; @@ -914,9 +973,12 @@ void FontRenderer::verticalBlur(float* weights, int32_t radius, void FontRenderer::blurImage(uint8_t *image, int32_t width, int32_t height, int32_t radius) { float *gaussian = new float[2 * radius + 1]; computeGaussianWeights(gaussian, radius); + uint8_t* scratch = new uint8_t[width * height]; + horizontalBlur(gaussian, radius, image, scratch, width, height); verticalBlur(gaussian, radius, scratch, image, width, height); + delete[] gaussian; delete[] scratch; } diff --git a/libs/hwui/FontRenderer.h b/libs/hwui/FontRenderer.h index 1922812b387e..b34fdfafd02f 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -55,6 +55,77 @@ namespace uirenderer { class FontRenderer; +class CacheTexture { +public: + CacheTexture(){} + CacheTexture(uint8_t* texture, GLuint textureId, uint16_t width, uint16_t height) : + mTexture(texture), mTextureId(textureId), mWidth(width), mHeight(height) {} + ~CacheTexture() { + if (mTexture != NULL) { + delete[] mTexture; + } + if (mTextureId != 0) { + glDeleteTextures(1, &mTextureId); + } + } + + uint8_t* mTexture; + GLuint mTextureId; + uint16_t mWidth; + uint16_t mHeight; +}; + +class CacheTextureLine { +public: + CacheTextureLine(uint16_t maxWidth, uint16_t maxHeight, uint32_t currentRow, + uint32_t currentCol, CacheTexture* cacheTexture): + mMaxHeight(maxHeight), + mMaxWidth(maxWidth), + mCurrentRow(currentRow), + mCurrentCol(currentCol), + mDirty(false), + mCacheTexture(cacheTexture){ + } + + bool fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY); + + uint16_t mMaxHeight; + uint16_t mMaxWidth; + uint32_t mCurrentRow; + uint32_t mCurrentCol; + bool mDirty; + CacheTexture *mCacheTexture; +}; + +struct CachedGlyphInfo { + // Has the cache been invalidated? + bool mIsValid; + // Location of the cached glyph in the bitmap + // in case we need to resize the texture or + // render to bitmap + uint32_t mStartX; + uint32_t mStartY; + uint32_t mBitmapWidth; + uint32_t mBitmapHeight; + // Also cache texture coords for the quad + float mBitmapMinU; + float mBitmapMinV; + float mBitmapMaxU; + float mBitmapMaxV; + // Minimize how much we call freetype + uint32_t mGlyphIndex; + uint32_t mAdvanceX; + uint32_t mAdvanceY; + // Values below contain a glyph's origin in the bitmap + int32_t mBitmapLeft; + int32_t mBitmapTop; + // Auto-kerning + SkFixed mLsbDelta; + SkFixed mRsbDelta; + CacheTextureLine* mCachedTextureLine; +}; + + /////////////////////////////////////////////////////////////////////////////// // Font /////////////////////////////////////////////////////////////////////////////// @@ -101,33 +172,6 @@ protected: void measure(SkPaint* paint, const char* text, uint32_t start, uint32_t len, int numGlyphs, Rect *bounds); - struct CachedGlyphInfo { - // Has the cache been invalidated? - bool mIsValid; - // Location of the cached glyph in the bitmap - // in case we need to resize the texture or - // render to bitmap - uint32_t mStartX; - uint32_t mStartY; - uint32_t mBitmapWidth; - uint32_t mBitmapHeight; - // Also cache texture coords for the quad - float mBitmapMinU; - float mBitmapMinV; - float mBitmapMaxU; - float mBitmapMaxV; - // Minimize how much we call freetype - uint32_t mGlyphIndex; - uint32_t mAdvanceX; - uint32_t mAdvanceY; - // Values below contain a glyph's origin in the bitmap - int32_t mBitmapLeft; - int32_t mBitmapTop; - // Auto-kerning - SkFixed mLsbDelta; - SkFixed mRsbDelta; - }; - Font(FontRenderer* state, uint32_t fontId, float fontSize, int flags, uint32_t italicStyle, uint32_t scaleX, SkPaint::Style style, uint32_t strokeWidth); @@ -178,11 +222,6 @@ public: mGammaTable = gammaTable; } - void setAttributeBindingSlots(int positionSlot, int texCoordSlot) { - mPositionAttrSlot = positionSlot; - mTexcoordAttrSlot = texCoordSlot; - } - void setFont(SkPaint* paint, uint32_t fontId, float fontSize); bool renderText(SkPaint* paint, const Rect* clip, const char *text, uint32_t startIndex, uint32_t len, int numGlyphs, int x, int y, Rect* bounds); @@ -214,19 +253,28 @@ public: mLinearFiltering = linearFiltering; const GLenum filtering = linearFiltering ? GL_LINEAR : GL_NEAREST; - glBindTexture(GL_TEXTURE_2D, mTextureId); + glBindTexture(GL_TEXTURE_2D, mCurrentCacheTexture->mTextureId); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); } - return mTextureId; - } - - uint32_t getCacheWidth() const { - return mCacheWidth; + return mCurrentCacheTexture->mTextureId; } - uint32_t getCacheHeight() const { - return mCacheHeight; + uint32_t getCacheSize() const { + uint32_t size = 0; + if (mCacheTextureSmall != NULL && mCacheTextureSmall->mTexture != NULL) { + size += mCacheTextureSmall->mWidth * mCacheTextureSmall->mHeight; + } + if (mCacheTexture128 != NULL && mCacheTexture128->mTexture != NULL) { + size += mCacheTexture128->mWidth * mCacheTexture128->mHeight; + } + if (mCacheTexture256 != NULL && mCacheTexture256->mTexture != NULL) { + size += mCacheTexture256->mWidth * mCacheTexture256->mHeight; + } + if (mCacheTexture512 != NULL && mCacheTexture512->mTexture != NULL) { + size += mCacheTexture512->mWidth * mCacheTexture512->mHeight; + } + return size; } protected: @@ -234,41 +282,11 @@ protected: const uint8_t* mGammaTable; - struct CacheTextureLine { - uint16_t mMaxHeight; - uint16_t mMaxWidth; - uint32_t mCurrentRow; - uint32_t mCurrentCol; - bool mDirty; - - CacheTextureLine(uint16_t maxWidth, uint16_t maxHeight, uint32_t currentRow, - uint32_t currentCol): - mMaxHeight(maxHeight), - mMaxWidth(maxWidth), - mCurrentRow(currentRow), - mCurrentCol(currentCol), - mDirty(false) { - } - - bool fitBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY) { - if (glyph.fHeight + 2 > mMaxHeight) { - return false; - } - - if (mCurrentCol + glyph.fWidth + 2 < mMaxWidth) { - *retOriginX = mCurrentCol + 1; - *retOriginY = mCurrentRow + 1; - mCurrentCol += glyph.fWidth + 2; - mDirty = true; - return true; - } - - return false; - } - }; - - void initTextTexture(bool largeFonts = false); - bool cacheBitmap(const SkGlyph& glyph, uint32_t *retOriginX, uint32_t *retOriginY); + uint8_t* allocateTextureMemory(int width, int height); + void initTextTexture(); + CacheTexture *createCacheTexture(int width, int height, bool allocate); + void cacheBitmap(const SkGlyph& glyph, CachedGlyphInfo* cachedGlyph, + uint32_t *retOriginX, uint32_t *retOriginY); void flushAllAndInvalidate(); void initVertexArrayBuffers(); @@ -279,12 +297,13 @@ protected: void precacheLatin(SkPaint* paint); void issueDrawCommand(); - void appendMeshQuad(float x1, float y1, float z1, float u1, float v1, float x2, float y2, - float z2, float u2, float v2, float x3, float y3, float z3, float u3, float v3, - float x4, float y4, float z4, float u4, float v4); + void appendMeshQuad(float x1, float y1, float u1, float v1, + float x2, float y2, float u2, float v2, + float x3, float y3, float u3, float v3, + float x4, float y4, float u4, float v4, CacheTexture* texture); - uint32_t mCacheWidth; - uint32_t mCacheHeight; + uint32_t mSmallCacheWidth; + uint32_t mSmallCacheHeight; Vector<CacheTextureLine*> mCacheLines; uint32_t getRemainingCacheCapacity(); @@ -292,12 +311,14 @@ protected: Font* mCurrentFont; Vector<Font*> mActiveFonts; - // Texture to cache glyph bitmaps - uint8_t* mTextTexture; - const uint8_t* getTextTextureData() const { - return mTextTexture; - } - GLuint mTextureId; + CacheTexture* mCurrentCacheTexture; + CacheTexture* mLastCacheTexture; + CacheTexture* mCacheTextureSmall; + CacheTexture* mCacheTexture128; + CacheTexture* mCacheTexture256; + CacheTexture* mCacheTexture512; + + void checkTextureUpdate(); bool mUploadTexture; @@ -308,9 +329,6 @@ protected: uint32_t mIndexBufferID; - int32_t mPositionAttrSlot; - int32_t mTexcoordAttrSlot; - const Rect* mClip; Rect* mBounds; bool mDrawn; diff --git a/libs/hwui/GammaFontRenderer.h b/libs/hwui/GammaFontRenderer.h index 54c208ef52d7..99f08f032769 100644 --- a/libs/hwui/GammaFontRenderer.h +++ b/libs/hwui/GammaFontRenderer.h @@ -50,7 +50,7 @@ struct GammaFontRenderer { FontRenderer* renderer = mRenderers[fontRenderer]; if (!renderer) return 0; - return renderer->getCacheHeight() * renderer->getCacheWidth(); + return renderer->getCacheSize(); } private: diff --git a/libs/hwui/GradientCache.cpp b/libs/hwui/GradientCache.cpp index aacf22a19e7e..a88a59a0b480 100644 --- a/libs/hwui/GradientCache.cpp +++ b/libs/hwui/GradientCache.cpp @@ -171,8 +171,8 @@ void GradientCache::generateTexture(SkBitmap* bitmap, Texture* texture) { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->rowBytesAsPixels(), texture->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap->getPixels()); - texture->setFilter(GL_LINEAR, GL_LINEAR); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE); + texture->setFilter(GL_LINEAR); + texture->setWrap(GL_CLAMP_TO_EDGE); } }; // namespace uirenderer diff --git a/libs/hwui/LayerCache.cpp b/libs/hwui/LayerCache.cpp index 52981259336e..d304b374850e 100644 --- a/libs/hwui/LayerCache.cpp +++ b/libs/hwui/LayerCache.cpp @@ -20,6 +20,7 @@ #include <utils/Log.h> +#include "Caches.h" #include "Debug.h" #include "LayerCache.h" #include "Properties.h" @@ -108,8 +109,8 @@ Layer* LayerCache::get(const uint32_t width, const uint32_t height) { layer->generateTexture(); layer->bindTexture(); - layer->setFilter(GL_NEAREST, GL_NEAREST); - layer->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE, false); + layer->setFilter(GL_NEAREST); + layer->setWrap(GL_CLAMP_TO_EDGE, false); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); #if DEBUG_LAYERS @@ -140,7 +141,7 @@ bool LayerCache::resize(Layer* layer, const uint32_t width, const uint32_t heigh uint32_t oldWidth = layer->getWidth(); uint32_t oldHeight = layer->getHeight(); - glActiveTexture(GL_TEXTURE0); + Caches::getInstance().activeTexture(0); layer->bindTexture(); layer->setSize(entry.mWidth, entry.mHeight); layer->allocateTexture(GL_RGBA, GL_UNSIGNED_BYTE); diff --git a/libs/hwui/LayerRenderer.cpp b/libs/hwui/LayerRenderer.cpp index e2d9ea35f49d..38630b8e2742 100644 --- a/libs/hwui/LayerRenderer.cpp +++ b/libs/hwui/LayerRenderer.cpp @@ -182,14 +182,15 @@ void LayerRenderer::generateMesh() { Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) { LAYER_RENDERER_LOGD("Requesting new render layer %dx%d", width, height); - GLuint fbo = Caches::getInstance().fboCache.get(); + Caches& caches = Caches::getInstance(); + GLuint fbo = caches.fboCache.get(); if (!fbo) { LOGW("Could not obtain an FBO"); return NULL; } - glActiveTexture(GL_TEXTURE0); - Layer* layer = Caches::getInstance().layerCache.get(width, height); + caches.activeTexture(0); + Layer* layer = caches.layerCache.get(width, height); if (!layer) { LOGW("Could not obtain a layer"); return NULL; @@ -220,7 +221,7 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque fbo, width, height); glBindFramebuffer(GL_FRAMEBUFFER, previousFbo); - Caches::getInstance().fboCache.put(fbo); + caches.fboCache.put(fbo); layer->deleteTexture(); delete layer; @@ -233,7 +234,6 @@ Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque layer->getTexture(), 0); glDisable(GL_SCISSOR_TEST); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_SCISSOR_TEST); @@ -275,7 +275,7 @@ Layer* LayerRenderer::createTextureLayer(bool isOpaque) { layer->region.clear(); layer->setRenderTarget(GL_NONE); // see ::updateTextureLayer() - glActiveTexture(GL_TEXTURE0); + Caches::getInstance().activeTexture(0); layer->generateTexture(); return layer; @@ -407,7 +407,7 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) { glGenTextures(1, &texture); if ((error = glGetError()) != GL_NO_ERROR) goto error; - glActiveTexture(GL_TEXTURE0); + caches.activeTexture(0); glBindTexture(GL_TEXTURE_2D, texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); @@ -459,6 +459,8 @@ bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) { } error: + glEnable(GL_SCISSOR_TEST); + #if DEBUG_OPENGL if (error != GL_NO_ERROR) { LOGD("GL error while copying layer into bitmap = 0x%x", error); diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index 1d7b99dfc81e..75c6d0aebf49 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -103,12 +103,6 @@ static const Blender gBlendsSwap[] = { { SkXfermode::kScreen_Mode, GL_ONE_MINUS_DST_COLOR, GL_ONE } }; -static const GLenum gTextureUnits[] = { - GL_TEXTURE0, - GL_TEXTURE1, - GL_TEXTURE2 -}; - /////////////////////////////////////////////////////////////////////////////// // Constructors/destructor /////////////////////////////////////////////////////////////////////////////// @@ -133,8 +127,6 @@ OpenGLRenderer::~OpenGLRenderer() { /////////////////////////////////////////////////////////////////////////////// void OpenGLRenderer::setViewport(int width, int height) { - glDisable(GL_DITHER); - glViewport(0, 0, width, height); mOrthoMatrix.loadOrtho(0, width, height, 0, -1, 1); mWidth = width; @@ -143,7 +135,11 @@ void OpenGLRenderer::setViewport(int width, int height) { mFirstSnapshot->height = height; mFirstSnapshot->viewport.set(0, 0, width, height); - mDirtyClip = false; + glDisable(GL_DITHER); + glEnable(GL_SCISSOR_TEST); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + glEnableVertexAttribArray(Program::kBindingPosition); } void OpenGLRenderer::prepare(bool opaque) { @@ -156,17 +152,15 @@ void OpenGLRenderer::prepareDirty(float left, float top, float right, float bott mSnapshot = new Snapshot(mFirstSnapshot, SkCanvas::kMatrix_SaveFlag | SkCanvas::kClip_SaveFlag); mSnapshot->fbo = getTargetFbo(); - mSaveCount = 1; glViewport(0, 0, mWidth, mHeight); + mCaches.setScissor(left, mSnapshot->height - bottom, right - left, bottom - top); - glEnable(GL_SCISSOR_TEST); - glScissor(left, mSnapshot->height - bottom, right - left, bottom - top); mSnapshot->setClip(left, top, right, bottom); + mDirtyClip = false; if (!opaque) { - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); } } @@ -200,20 +194,22 @@ void OpenGLRenderer::interrupt() { } } mCaches.unbindMeshBuffer(); + mCaches.unbindIndicesBuffer(); + mCaches.resetVertexPointers(); + mCaches.disbaleTexCoordsVertexArray(); } void OpenGLRenderer::resume() { sp<Snapshot> snapshot = (mSnapshot != NULL) ? mSnapshot : mFirstSnapshot; glViewport(0, 0, snapshot->viewport.getWidth(), snapshot->viewport.getHeight()); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glEnable(GL_SCISSOR_TEST); dirtyClip(); - glDisable(GL_DITHER); - + mCaches.activeTexture(0); glBindFramebuffer(GL_FRAMEBUFFER, snapshot->fbo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); mCaches.blend = true; glEnable(GL_BLEND); @@ -453,7 +449,7 @@ bool OpenGLRenderer::createLayer(sp<Snapshot> snapshot, float left, float top, return false; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Layer* layer = mCaches.layerCache.get(bounds.getWidth(), bounds.getHeight()); if (!layer) { return false; @@ -554,9 +550,8 @@ bool OpenGLRenderer::createFboLayer(Layer* layer, Rect& bounds, sp<Snapshot> sna #endif // Clear the FBO, expand the clear region by 1 to get nice bilinear filtering - glScissor(clip.left - 1.0f, bounds.getHeight() - clip.bottom - 1.0f, + mCaches.setScissor(clip.left - 1.0f, bounds.getHeight() - clip.bottom - 1.0f, clip.getWidth() + 2.0f, clip.getHeight() + 2.0f); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); dirtyClip(); @@ -596,7 +591,7 @@ void OpenGLRenderer::composeLayer(sp<Snapshot> current, sp<Snapshot> previous) { mCaches.unbindMeshBuffer(); - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); // When the layer is stored in an FBO, we can save a bit of fillrate by // drawing only the dirty region @@ -773,7 +768,7 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { layer->setFilter(GL_LINEAR); setupDrawModelViewTranslate(rect.left, rect.top, rect.right, rect.bottom); } - setupDrawMesh(&mesh[0].position[0], &mesh[0].texture[0]); + setupDrawMeshIndices(&mesh[0].position[0], &mesh[0].texture[0]); for (size_t i = 0; i < count; i++) { const android::Rect* r = &rects[i]; @@ -802,7 +797,6 @@ void OpenGLRenderer::composeLayerRegion(Layer* layer, const Rect& rect) { glDrawElements(GL_TRIANGLES, numQuads * 6, GL_UNSIGNED_SHORT, NULL); } - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); finishDrawTexture(); #if DEBUG_LAYERS_AS_REGIONS @@ -911,10 +905,8 @@ void OpenGLRenderer::clearLayerRegions() { setupDrawProgram(); setupDrawPureColorUniforms(); setupDrawModelViewTranslate(0.0f, 0.0f, 0.0f, 0.0f, true); + setupDrawVertices(&mesh[0].position[0]); - mCaches.unbindMeshBuffer(); - glVertexAttribPointer(mCaches.currentProgram->position, 2, GL_FLOAT, GL_FALSE, - gVertexStride, &mesh[0].position[0]); glDrawArrays(GL_TRIANGLES, 0, count * 6); glEnable(GL_SCISSOR_TEST); @@ -973,7 +965,10 @@ void OpenGLRenderer::concatMatrix(SkMatrix* matrix) { void OpenGLRenderer::setScissorFromClip() { Rect clip(*mSnapshot->clipRect); clip.snapToPixelBoundaries(); - glScissor(clip.left, mSnapshot->height - clip.bottom, clip.getWidth(), clip.getHeight()); + + mCaches.setScissor(clip.left, mSnapshot->height - clip.bottom, + clip.getWidth(), clip.getHeight()); + mDirtyClip = false; } @@ -1019,7 +1014,6 @@ void OpenGLRenderer::setupDraw(bool clear) { mColorA = mColorR = mColorG = mColorB = 0.0f; mTextureUnit = 0; mTrackDirtyRegions = true; - mTexCoordsSlot = -1; } void OpenGLRenderer::setupDrawWithTexture(bool isAlpha8) { @@ -1031,6 +1025,10 @@ void OpenGLRenderer::setupDrawWithExternalTexture() { mDescription.hasExternalTexture = true; } +void OpenGLRenderer::setupDrawNoTexture() { + mCaches.disbaleTexCoordsVertexArray(); +} + void OpenGLRenderer::setupDrawAALine() { mDescription.isAA = true; } @@ -1205,25 +1203,21 @@ void OpenGLRenderer::setupDrawColorFilterUniforms() { } void OpenGLRenderer::setupDrawSimpleMesh() { - mCaches.bindMeshBuffer(); - glVertexAttribPointer(mCaches.currentProgram->position, 2, GL_FLOAT, GL_FALSE, - gMeshStride, 0); + bool force = mCaches.bindMeshBuffer(); + mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position, 0); + mCaches.unbindIndicesBuffer(); } void OpenGLRenderer::setupDrawTexture(GLuint texture) { bindTexture(texture); - glUniform1i(mCaches.currentProgram->getUniform("sampler"), mTextureUnit++); - - mTexCoordsSlot = mCaches.currentProgram->getAttrib("texCoords"); - glEnableVertexAttribArray(mTexCoordsSlot); + mTextureUnit++; + mCaches.enableTexCoordsVertexArray(); } void OpenGLRenderer::setupDrawExternalTexture(GLuint texture) { bindExternalTexture(texture); - glUniform1i(mCaches.currentProgram->getUniform("sampler"), mTextureUnit++); - - mTexCoordsSlot = mCaches.currentProgram->getAttrib("texCoords"); - glEnableVertexAttribArray(mTexCoordsSlot); + mTextureUnit++; + mCaches.enableTexCoordsVertexArray(); } void OpenGLRenderer::setupDrawTextureTransform() { @@ -1236,22 +1230,34 @@ void OpenGLRenderer::setupDrawTextureTransformUniforms(mat4& transform) { } void OpenGLRenderer::setupDrawMesh(GLvoid* vertices, GLvoid* texCoords, GLuint vbo) { + bool force = false; if (!vertices) { - mCaches.bindMeshBuffer(vbo == 0 ? mCaches.meshBuffer : vbo); + force = mCaches.bindMeshBuffer(vbo == 0 ? mCaches.meshBuffer : vbo); } else { - mCaches.unbindMeshBuffer(); + force = mCaches.unbindMeshBuffer(); } - glVertexAttribPointer(mCaches.currentProgram->position, 2, GL_FLOAT, GL_FALSE, - gMeshStride, vertices); - if (mTexCoordsSlot >= 0) { - glVertexAttribPointer(mTexCoordsSlot, 2, GL_FLOAT, GL_FALSE, gMeshStride, texCoords); + + mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position, vertices); + if (mCaches.currentProgram->texCoords >= 0) { + mCaches.bindTexCoordsVertexPointer(force, mCaches.currentProgram->texCoords, texCoords); + } + + mCaches.unbindIndicesBuffer(); +} + +void OpenGLRenderer::setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords) { + bool force = mCaches.unbindMeshBuffer(); + mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position, vertices); + if (mCaches.currentProgram->texCoords >= 0) { + mCaches.bindTexCoordsVertexPointer(force, mCaches.currentProgram->texCoords, texCoords); } } void OpenGLRenderer::setupDrawVertices(GLvoid* vertices) { - mCaches.unbindMeshBuffer(); - glVertexAttribPointer(mCaches.currentProgram->position, 2, GL_FLOAT, GL_FALSE, - gVertexStride, vertices); + bool force = mCaches.unbindMeshBuffer(); + mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position, + vertices, gVertexStride); + mCaches.unbindIndicesBuffer(); } /** @@ -1267,24 +1273,29 @@ void OpenGLRenderer::setupDrawVertices(GLvoid* vertices) { */ void OpenGLRenderer::setupDrawAALine(GLvoid* vertices, GLvoid* widthCoords, GLvoid* lengthCoords, float boundaryWidthProportion) { - mCaches.unbindMeshBuffer(); - glVertexAttribPointer(mCaches.currentProgram->position, 2, GL_FLOAT, GL_FALSE, - gAAVertexStride, vertices); + bool force = mCaches.unbindMeshBuffer(); + mCaches.bindPositionVertexPointer(force, mCaches.currentProgram->position, + vertices, gAAVertexStride); + mCaches.resetTexCoordsVertexPointer(); + mCaches.unbindIndicesBuffer(); + int widthSlot = mCaches.currentProgram->getAttrib("vtxWidth"); glEnableVertexAttribArray(widthSlot); glVertexAttribPointer(widthSlot, 1, GL_FLOAT, GL_FALSE, gAAVertexStride, widthCoords); + int lengthSlot = mCaches.currentProgram->getAttrib("vtxLength"); glEnableVertexAttribArray(lengthSlot); glVertexAttribPointer(lengthSlot, 1, GL_FLOAT, GL_FALSE, gAAVertexStride, lengthCoords); + int boundaryWidthSlot = mCaches.currentProgram->getUniform("boundaryWidth"); glUniform1f(boundaryWidthSlot, boundaryWidthProportion); + // Setting the inverse value saves computations per-fragment in the shader int inverseBoundaryWidthSlot = mCaches.currentProgram->getUniform("inverseBoundaryWidth"); glUniform1f(inverseBoundaryWidthSlot, (1 / boundaryWidthProportion)); } void OpenGLRenderer::finishDrawTexture() { - glDisableVertexAttribArray(mTexCoordsSlot); } /////////////////////////////////////////////////////////////////////////////// @@ -1364,7 +1375,7 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); @@ -1385,7 +1396,7 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* pai return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); @@ -1405,7 +1416,7 @@ void OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHei return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); @@ -1490,7 +1501,7 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); @@ -1544,7 +1555,7 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); Texture* texture = mCaches.textureCache.get(bitmap); if (!texture) return; const AutoTexture autoCleanup(texture); @@ -1623,6 +1634,7 @@ void OpenGLRenderer::drawAARect(float left, float top, float right, float bottom } setupDraw(); + setupDrawNoTexture(); setupDrawAALine(); setupDrawColor(color); setupDrawColorFilter(); @@ -1733,6 +1745,7 @@ void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) { getAlphaAndMode(paint, &alpha, &mode); setupDraw(); + setupDrawNoTexture(); if (isAA) { setupDrawAALine(); } @@ -1942,6 +1955,7 @@ void OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) { TextureVertex* vertex = &pointsData[0]; setupDraw(); + setupDrawNoTexture(); setupDrawPoint(strokeWidth); setupDrawColor(paint->getColor(), alpha); setupDrawColorFilter(); @@ -1992,7 +2006,7 @@ void OpenGLRenderer::drawRoundRect(float left, float top, float right, float bot float rx, float ry, SkPaint* paint) { if (mSnapshot->isIgnored()) return; - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.roundRectShapeCache.getRoundRect( right - left, bottom - top, rx, ry, paint); drawShape(left, top, texture, paint); @@ -2001,7 +2015,7 @@ void OpenGLRenderer::drawRoundRect(float left, float top, float right, float bot void OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) { if (mSnapshot->isIgnored()) return; - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.circleShapeCache.getCircle(radius, paint); drawShape(x - radius, y - radius, texture, paint); } @@ -2009,7 +2023,7 @@ void OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) void OpenGLRenderer::drawOval(float left, float top, float right, float bottom, SkPaint* paint) { if (mSnapshot->isIgnored()) return; - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.ovalShapeCache.getOval(right - left, bottom - top, paint); drawShape(left, top, texture, paint); } @@ -2023,7 +2037,7 @@ void OpenGLRenderer::drawArc(float left, float top, float right, float bottom, return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.arcShapeCache.getArc(right - left, bottom - top, startAngle, sweepAngle, useCenter, paint); drawShape(left, top, texture, paint); @@ -2033,7 +2047,7 @@ void OpenGLRenderer::drawRectAsShape(float left, float top, float right, float b SkPaint* paint) { if (mSnapshot->isIgnored()) return; - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.rectShapeCache.getRect(right - left, bottom - top, paint); drawShape(left, top, texture, paint); } @@ -2117,6 +2131,8 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, getAlphaAndMode(paint, &alpha, &mode); if (mHasShadow) { + mCaches.activeTexture(0); + mCaches.dropShadowCache.setFontRenderer(fontRenderer); const ShadowTexture* shadow = mCaches.dropShadowCache.get( paint, text, bytesCount, count, mShadowRadius); @@ -2131,7 +2147,6 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, shadowColor = 0xffffffff; } - glActiveTexture(gTextureUnits[0]); setupDraw(); setupDrawWithTexture(true); setupDrawAlpha8Color(shadowColor, shadowAlpha < 255 ? shadowAlpha : alpha); @@ -2147,8 +2162,6 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, setupDrawMesh(NULL, (GLvoid*) gMeshTextureOffset); glDrawArrays(GL_TRIANGLE_STRIP, 0, gMeshCount); - - finishDrawTexture(); } if (paint->getAlpha() == 0 && paint->getXfermode() == NULL) { @@ -2161,7 +2174,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, linearFilter = fabs(y - (int) y) > 0.0f || fabs(x - (int) x) > 0.0f; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); setupDraw(); setupDrawDirtyRegionsDisabled(); setupDrawWithTexture(true); @@ -2184,12 +2197,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, #else bool hasActiveLayer = false; #endif - mCaches.unbindMeshBuffer(); - // Tell font renderer the locations of position and texture coord - // attributes so it can bind its data properly - int positionSlot = mCaches.currentProgram->position; - fontRenderer.setAttributeBindingSlots(positionSlot, mTexCoordsSlot); if (fontRenderer.renderText(paint, clip, text, 0, bytesCount, count, x, y, hasActiveLayer ? &bounds : NULL)) { #if RENDER_LAYERS_AS_REGIONS @@ -2202,16 +2210,13 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count, #endif } - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glDisableVertexAttribArray(mCaches.currentProgram->getAttrib("texCoords")); - drawTextDecorations(text, bytesCount, length, oldX, oldY, paint); } void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) { if (mSnapshot->isIgnored()) return; - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); const PathTexture* texture = mCaches.pathCache.get(path, paint); if (!texture) return; @@ -2228,7 +2233,7 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) { return; } - glActiveTexture(gTextureUnits[0]); + mCaches.activeTexture(0); int alpha; SkXfermode::Mode mode; @@ -2434,6 +2439,7 @@ void OpenGLRenderer::drawColorRect(float left, float top, float right, float bot } setupDraw(); + setupDrawNoTexture(); setupDrawColor(color); setupDrawShader(); setupDrawColorFilter(); diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h index cd9ff936f4f1..019e9b28b434 100644 --- a/libs/hwui/OpenGLRenderer.h +++ b/libs/hwui/OpenGLRenderer.h @@ -498,6 +498,7 @@ private: */ void setupDrawWithTexture(bool isAlpha8 = false); void setupDrawWithExternalTexture(); + void setupDrawNoTexture(); void setupDrawAALine(); void setupDrawPoint(float pointSize); void setupDrawColor(int color); @@ -530,6 +531,7 @@ private: void setupDrawTextureTransform(); void setupDrawTextureTransformUniforms(mat4& transform); void setupDrawMesh(GLvoid* vertices, GLvoid* texCoords = NULL, GLuint vbo = 0); + void setupDrawMeshIndices(GLvoid* vertices, GLvoid* texCoords); void setupDrawVertices(GLvoid* vertices); void setupDrawAALine(GLvoid* vertices, GLvoid* distanceCoords, GLvoid* lengthCoords, float strokeWidth); @@ -601,8 +603,6 @@ private: GLuint mTextureUnit; // Track dirty regions, true by default bool mTrackDirtyRegions; - // Texture coordinates slot - int mTexCoordsSlot; friend class DisplayListRenderer; diff --git a/libs/hwui/Patch.cpp b/libs/hwui/Patch.cpp index 47a2c99dd60a..27f530c48fa6 100644 --- a/libs/hwui/Patch.cpp +++ b/libs/hwui/Patch.cpp @@ -197,7 +197,8 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, } if (verticesCount > 0) { - Caches::getInstance().bindMeshBuffer(meshBuffer); + Caches& caches = Caches::getInstance(); + caches.bindMeshBuffer(meshBuffer); if (!mUploaded) { glBufferData(GL_ARRAY_BUFFER, sizeof(TextureVertex) * verticesCount, mVertices, GL_DYNAMIC_DRAW); @@ -206,6 +207,7 @@ void Patch::updateVertices(const float bitmapWidth, const float bitmapHeight, glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(TextureVertex) * verticesCount, mVertices); } + caches.resetVertexPointers(); } PATCH_LOGD(" patch: new vertices count = %d", verticesCount); diff --git a/libs/hwui/Program.cpp b/libs/hwui/Program.cpp index 972dd87a5d71..701314d3c0b8 100644 --- a/libs/hwui/Program.cpp +++ b/libs/hwui/Program.cpp @@ -25,80 +25,107 @@ namespace uirenderer { // Base program /////////////////////////////////////////////////////////////////////////////// -Program::Program(const char* vertex, const char* fragment) { +// TODO: Program instance should be created from a factory method +Program::Program(const ProgramDescription& description, const char* vertex, const char* fragment) { mInitialized = false; + mHasColorUniform = false; + mHasSampler = false; + mUse = false; - vertexShader = buildShader(vertex, GL_VERTEX_SHADER); - if (vertexShader) { + // No need to cache compiled shaders, rely instead on Android's + // persistent shaders cache + mVertexShader = buildShader(vertex, GL_VERTEX_SHADER); + if (mVertexShader) { + mFragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER); + if (mFragmentShader) { + mProgramId = glCreateProgram(); - fragmentShader = buildShader(fragment, GL_FRAGMENT_SHADER); - if (fragmentShader) { + glAttachShader(mProgramId, mVertexShader); + glAttachShader(mProgramId, mFragmentShader); - id = glCreateProgram(); - glAttachShader(id, vertexShader); - glAttachShader(id, fragmentShader); - glLinkProgram(id); + position = bindAttrib("position", kBindingPosition); + if (description.hasTexture || description.hasExternalTexture) { + texCoords = bindAttrib("texCoords", kBindingTexCoords); + } else { + texCoords = -1; + } + + glLinkProgram(mProgramId); GLint status; - glGetProgramiv(id, GL_LINK_STATUS, &status); + glGetProgramiv(mProgramId, GL_LINK_STATUS, &status); if (status != GL_TRUE) { LOGE("Error while linking shaders:"); GLint infoLen = 0; - glGetProgramiv(id, GL_INFO_LOG_LENGTH, &infoLen); + glGetProgramiv(mProgramId, GL_INFO_LOG_LENGTH, &infoLen); if (infoLen > 1) { GLchar log[infoLen]; - glGetProgramInfoLog(id, infoLen, 0, &log[0]); + glGetProgramInfoLog(mProgramId, infoLen, 0, &log[0]); LOGE("%s", log); } - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); - glDeleteProgram(id); + + glDetachShader(mProgramId, mVertexShader); + glDetachShader(mProgramId, mFragmentShader); + + glDeleteShader(mVertexShader); + glDeleteShader(mFragmentShader); + + glDeleteProgram(mProgramId); } else { mInitialized = true; } + } else { + glDeleteShader(mVertexShader); } } - mUse = false; - if (mInitialized) { - position = addAttrib("position"); transform = addUniform("transform"); } } Program::~Program() { if (mInitialized) { - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); - glDeleteProgram(id); + glDetachShader(mProgramId, mVertexShader); + glDetachShader(mProgramId, mFragmentShader); + + glDeleteShader(mVertexShader); + glDeleteShader(mFragmentShader); + + glDeleteProgram(mProgramId); } } int Program::addAttrib(const char* name) { - int slot = glGetAttribLocation(id, name); - attributes.add(name, slot); + int slot = glGetAttribLocation(mProgramId, name); + mAttributes.add(name, slot); return slot; } +int Program::bindAttrib(const char* name, ShaderBindings bindingSlot) { + glBindAttribLocation(mProgramId, bindingSlot, name); + mAttributes.add(name, bindingSlot); + return bindingSlot; +} + int Program::getAttrib(const char* name) { - ssize_t index = attributes.indexOfKey(name); + ssize_t index = mAttributes.indexOfKey(name); if (index >= 0) { - return attributes.valueAt(index); + return mAttributes.valueAt(index); } return addAttrib(name); } int Program::addUniform(const char* name) { - int slot = glGetUniformLocation(id, name); - uniforms.add(name, slot); + int slot = glGetUniformLocation(mProgramId, name); + mUniforms.add(name, slot); return slot; } int Program::getUniform(const char* name) { - ssize_t index = uniforms.indexOfKey(name); + ssize_t index = mUniforms.indexOfKey(name); if (index >= 0) { - return uniforms.valueAt(index); + return mUniforms.valueAt(index); } return addUniform(name); } @@ -127,10 +154,11 @@ void Program::set(const mat4& projectionMatrix, const mat4& modelViewMatrix, const mat4& transformMatrix, bool offset) { mat4 t(projectionMatrix); if (offset) { - // offset screenspace xy by an amount that compensates for typical precision issues - // in GPU hardware that tends to paint hor/vert lines in pixels shifted up and to the left. - // This offset value is based on an assumption that some hardware may use as little - // as 12.4 precision, so we offset by slightly more than 1/16. + // offset screenspace xy by an amount that compensates for typical precision + // issues in GPU hardware that tends to paint hor/vert lines in pixels shifted + // up and to the left. + // This offset value is based on an assumption that some hardware may use as + // little as 12.4 precision, so we offset by slightly more than 1/16. t.translate(.375, .375, 0); } t.multiply(transformMatrix); @@ -140,20 +168,24 @@ void Program::set(const mat4& projectionMatrix, const mat4& modelViewMatrix, } void Program::setColor(const float r, const float g, const float b, const float a) { - glUniform4f(getUniform("color"), r, g, b, a); + if (!mHasColorUniform) { + mColorUniform = getUniform("color"); + mHasColorUniform = true; + } + glUniform4f(mColorUniform, r, g, b, a); } void Program::use() { - glUseProgram(id); + glUseProgram(mProgramId); + if (texCoords >= 0 && !mHasSampler) { + glUniform1i(getUniform("sampler"), 0); + mHasSampler = true; + } mUse = true; - - glEnableVertexAttribArray(position); } void Program::remove() { mUse = false; - - glDisableVertexAttribArray(position); } }; // namespace uirenderer diff --git a/libs/hwui/Program.h b/libs/hwui/Program.h index 764cb0583b24..eed909dcf783 100644 --- a/libs/hwui/Program.h +++ b/libs/hwui/Program.h @@ -17,27 +17,280 @@ #ifndef ANDROID_HWUI_PROGRAM_H #define ANDROID_HWUI_PROGRAM_H +#include <utils/KeyedVector.h> + #include <GLES2/gl2.h> #include <GLES2/gl2ext.h> -#include <utils/KeyedVector.h> +#include <SkXfermode.h> #include "Matrix.h" +#include "Properties.h" namespace android { namespace uirenderer { +/////////////////////////////////////////////////////////////////////////////// +// Defines +/////////////////////////////////////////////////////////////////////////////// + +// Debug +#if DEBUG_PROGRAMS + #define PROGRAM_LOGD(...) LOGD(__VA_ARGS__) +#else + #define PROGRAM_LOGD(...) +#endif + +#define COLOR_COMPONENT_THRESHOLD (1.0f - (0.5f / PANEL_BIT_DEPTH)) +#define COLOR_COMPONENT_INV_THRESHOLD (0.5f / PANEL_BIT_DEPTH) + +#define PROGRAM_KEY_TEXTURE 0x1 +#define PROGRAM_KEY_A8_TEXTURE 0x2 +#define PROGRAM_KEY_BITMAP 0x4 +#define PROGRAM_KEY_GRADIENT 0x8 +#define PROGRAM_KEY_BITMAP_FIRST 0x10 +#define PROGRAM_KEY_COLOR_MATRIX 0x20 +#define PROGRAM_KEY_COLOR_LIGHTING 0x40 +#define PROGRAM_KEY_COLOR_BLEND 0x80 +#define PROGRAM_KEY_BITMAP_NPOT 0x100 +#define PROGRAM_KEY_SWAP_SRC_DST 0x2000 + +#define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600 +#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800 + +// Encode the xfermodes on 6 bits +#define PROGRAM_MAX_XFERMODE 0x1f +#define PROGRAM_XFERMODE_SHADER_SHIFT 26 +#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20 +#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14 + +#define PROGRAM_BITMAP_WRAPS_SHIFT 9 +#define PROGRAM_BITMAP_WRAPT_SHIFT 11 + +#define PROGRAM_GRADIENT_TYPE_SHIFT 33 +#define PROGRAM_MODULATE_SHIFT 35 + +#define PROGRAM_IS_POINT_SHIFT 36 + +#define PROGRAM_HAS_AA_SHIFT 37 + +#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 38 +#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 39 + +/////////////////////////////////////////////////////////////////////////////// +// Types +/////////////////////////////////////////////////////////////////////////////// + +typedef uint64_t programid; + +/////////////////////////////////////////////////////////////////////////////// +// Program description +/////////////////////////////////////////////////////////////////////////////// + +/** + * Describe the features required for a given program. The features + * determine the generation of both the vertex and fragment shaders. + * A ProgramDescription must be used in conjunction with a ProgramCache. + */ +struct ProgramDescription { + enum ColorModifier { + kColorNone, + kColorMatrix, + kColorLighting, + kColorBlend + }; + + enum Gradient { + kGradientLinear, + kGradientCircular, + kGradientSweep + }; + + ProgramDescription() { + reset(); + } + + // Texturing + bool hasTexture; + bool hasAlpha8Texture; + bool hasExternalTexture; + bool hasTextureTransform; + + // Modulate, this should only be set when setColor() return true + bool modulate; + + // Shaders + bool hasBitmap; + bool isBitmapNpot; + + bool isAA; + + bool hasGradient; + Gradient gradientType; + + SkXfermode::Mode shadersMode; + + bool isBitmapFirst; + GLenum bitmapWrapS; + GLenum bitmapWrapT; + + // Color operations + ColorModifier colorOp; + SkXfermode::Mode colorMode; + + // Framebuffer blending (requires Extensions.hasFramebufferFetch()) + // Ignored for all values < SkXfermode::kPlus_Mode + SkXfermode::Mode framebufferMode; + bool swapSrcDst; + + bool isPoint; + float pointSize; + + /** + * Resets this description. All fields are reset back to the default + * values they hold after building a new instance. + */ + void reset() { + hasTexture = false; + hasAlpha8Texture = false; + hasExternalTexture = false; + hasTextureTransform = false; + + isAA = false; + + modulate = false; + + hasBitmap = false; + isBitmapNpot = false; + + hasGradient = false; + gradientType = kGradientLinear; + + shadersMode = SkXfermode::kClear_Mode; + + isBitmapFirst = false; + bitmapWrapS = GL_CLAMP_TO_EDGE; + bitmapWrapT = GL_CLAMP_TO_EDGE; + + colorOp = kColorNone; + colorMode = SkXfermode::kClear_Mode; + + framebufferMode = SkXfermode::kClear_Mode; + swapSrcDst = false; + + isPoint = false; + pointSize = 0.0f; + } + + /** + * Indicates, for a given color, whether color modulation is required in + * the fragment shader. When this method returns true, the program should + * be provided with a modulation color. + */ + bool setColor(const float r, const float g, const float b, const float a) { + modulate = a < COLOR_COMPONENT_THRESHOLD || r < COLOR_COMPONENT_THRESHOLD || + g < COLOR_COMPONENT_THRESHOLD || b < COLOR_COMPONENT_THRESHOLD; + return modulate; + } + + /** + * Indicates, for a given color, whether color modulation is required in + * the fragment shader. When this method returns true, the program should + * be provided with a modulation color. + */ + bool setAlpha8Color(const float r, const float g, const float b, const float a) { + modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD || + g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD; + return modulate; + } + + /** + * Computes the unique key identifying this program. + */ + programid key() const { + programid key = 0; + if (hasTexture) key |= PROGRAM_KEY_TEXTURE; + if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; + if (hasBitmap) { + key |= PROGRAM_KEY_BITMAP; + if (isBitmapNpot) { + key |= PROGRAM_KEY_BITMAP_NPOT; + key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; + key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; + } + } + if (hasGradient) key |= PROGRAM_KEY_GRADIENT; + key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT; + if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST; + if (hasBitmap && hasGradient) { + key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT; + } + switch (colorOp) { + case kColorMatrix: + key |= PROGRAM_KEY_COLOR_MATRIX; + break; + case kColorLighting: + key |= PROGRAM_KEY_COLOR_LIGHTING; + break; + case kColorBlend: + key |= PROGRAM_KEY_COLOR_BLEND; + key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT; + break; + case kColorNone: + break; + } + key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT; + if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST; + if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT; + if (isPoint) key |= programid(0x1) << PROGRAM_IS_POINT_SHIFT; + if (isAA) key |= programid(0x1) << PROGRAM_HAS_AA_SHIFT; + if (hasExternalTexture) key |= programid(0x1) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT; + if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT; + return key; + } + + /** + * Logs the specified message followed by the key identifying this program. + */ + void log(const char* message) const { +#if DEBUG_PROGRAMS + programid k = key(); + PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32), + uint32_t(k & 0xffffffff)); +#endif + } + +private: + inline uint32_t getEnumForWrap(GLenum wrap) const { + switch (wrap) { + case GL_CLAMP_TO_EDGE: + return 0; + case GL_REPEAT: + return 1; + case GL_MIRRORED_REPEAT: + return 2; + } + return 0; + } + +}; // struct ProgramDescription + /** * A program holds a vertex and a fragment shader. It offers several utility * methods to query attributes and uniforms. */ class Program { public: + enum ShaderBindings { + kBindingPosition, + kBindingTexCoords + }; + /** * Creates a new program with the specified vertex and fragment * shaders sources. */ - Program(const char* vertex, const char* fragment); + Program(const ProgramDescription& description, const char* vertex, const char* fragment); virtual ~Program(); /** @@ -94,6 +347,11 @@ public: int position; /** + * Name of the texCoords attribute if it exists, -1 otherwise. + */ + int texCoords; + + /** * Name of the transform uniform. */ int transform; @@ -107,6 +365,11 @@ protected: int addAttrib(const char* name); /** + * Binds the specified attribute name to the specified slot. + */ + int bindAttrib(const char* name, ShaderBindings bindingSlot); + + /** * Adds a uniform with the specified name. * * @return The OpenGL name of the uniform. @@ -121,19 +384,22 @@ private: */ GLuint buildShader(const char* source, GLenum type); - // Name of the OpenGL program - GLuint id; - - // Name of the shaders - GLuint vertexShader; - GLuint fragmentShader; + // Name of the OpenGL program and shaders + GLuint mProgramId; + GLuint mVertexShader; + GLuint mFragmentShader; // Keeps track of attributes and uniforms slots - KeyedVector<const char*, int> attributes; - KeyedVector<const char*, int> uniforms; + KeyedVector<const char*, int> mAttributes; + KeyedVector<const char*, int> mUniforms; bool mUse; bool mInitialized; + + bool mHasColorUniform; + int mColorUniform; + + bool mHasSampler; }; // class Program }; // namespace uirenderer diff --git a/libs/hwui/ProgramCache.cpp b/libs/hwui/ProgramCache.cpp index c2383f4c7256..a7f1277cf22c 100644 --- a/libs/hwui/ProgramCache.cpp +++ b/libs/hwui/ProgramCache.cpp @@ -388,7 +388,7 @@ Program* ProgramCache::generateProgram(const ProgramDescription& description, pr String8 vertexShader = generateVertexShader(description); String8 fragmentShader = generateFragmentShader(description); - Program* program = new Program(vertexShader.string(), fragmentShader.string()); + Program* program = new Program(description, vertexShader.string(), fragmentShader.string()); return program; } diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h index 5c7197b620cd..e3ed79eced8c 100644 --- a/libs/hwui/ProgramCache.h +++ b/libs/hwui/ProgramCache.h @@ -23,10 +23,9 @@ #include <GLES2/gl2.h> -#include <SkXfermode.h> - #include "Debug.h" #include "Program.h" +#include "Properties.h" namespace android { namespace uirenderer { @@ -42,243 +41,11 @@ namespace uirenderer { #define PROGRAM_LOGD(...) #endif -// TODO: This should be set in properties -#define PANEL_BIT_DEPTH 20 -#define COLOR_COMPONENT_THRESHOLD (1.0f - (0.5f / PANEL_BIT_DEPTH)) -#define COLOR_COMPONENT_INV_THRESHOLD (0.5f / PANEL_BIT_DEPTH) - -#define PROGRAM_KEY_TEXTURE 0x1 -#define PROGRAM_KEY_A8_TEXTURE 0x2 -#define PROGRAM_KEY_BITMAP 0x4 -#define PROGRAM_KEY_GRADIENT 0x8 -#define PROGRAM_KEY_BITMAP_FIRST 0x10 -#define PROGRAM_KEY_COLOR_MATRIX 0x20 -#define PROGRAM_KEY_COLOR_LIGHTING 0x40 -#define PROGRAM_KEY_COLOR_BLEND 0x80 -#define PROGRAM_KEY_BITMAP_NPOT 0x100 -#define PROGRAM_KEY_SWAP_SRC_DST 0x2000 - -#define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600 -#define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800 - -// Encode the xfermodes on 6 bits -#define PROGRAM_MAX_XFERMODE 0x1f -#define PROGRAM_XFERMODE_SHADER_SHIFT 26 -#define PROGRAM_XFERMODE_COLOR_OP_SHIFT 20 -#define PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT 14 - -#define PROGRAM_BITMAP_WRAPS_SHIFT 9 -#define PROGRAM_BITMAP_WRAPT_SHIFT 11 - -#define PROGRAM_GRADIENT_TYPE_SHIFT 33 -#define PROGRAM_MODULATE_SHIFT 35 - -#define PROGRAM_IS_POINT_SHIFT 36 - -#define PROGRAM_HAS_AA_SHIFT 37 - -#define PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT 38 -#define PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT 39 - -/////////////////////////////////////////////////////////////////////////////// -// Types -/////////////////////////////////////////////////////////////////////////////// - -typedef uint64_t programid; - /////////////////////////////////////////////////////////////////////////////// // Cache /////////////////////////////////////////////////////////////////////////////// /** - * Describe the features required for a given program. The features - * determine the generation of both the vertex and fragment shaders. - * A ProgramDescription must be used in conjunction with a ProgramCache. - */ -struct ProgramDescription { - enum ColorModifier { - kColorNone, - kColorMatrix, - kColorLighting, - kColorBlend - }; - - enum Gradient { - kGradientLinear, - kGradientCircular, - kGradientSweep - }; - - ProgramDescription() { - reset(); - } - - // Texturing - bool hasTexture; - bool hasAlpha8Texture; - bool hasExternalTexture; - bool hasTextureTransform; - - // Modulate, this should only be set when setColor() return true - bool modulate; - - // Shaders - bool hasBitmap; - bool isBitmapNpot; - - bool isAA; - - bool hasGradient; - Gradient gradientType; - - SkXfermode::Mode shadersMode; - - bool isBitmapFirst; - GLenum bitmapWrapS; - GLenum bitmapWrapT; - - // Color operations - ColorModifier colorOp; - SkXfermode::Mode colorMode; - - // Framebuffer blending (requires Extensions.hasFramebufferFetch()) - // Ignored for all values < SkXfermode::kPlus_Mode - SkXfermode::Mode framebufferMode; - bool swapSrcDst; - - bool isPoint; - float pointSize; - - /** - * Resets this description. All fields are reset back to the default - * values they hold after building a new instance. - */ - void reset() { - hasTexture = false; - hasAlpha8Texture = false; - hasExternalTexture = false; - hasTextureTransform = false; - - isAA = false; - - modulate = false; - - hasBitmap = false; - isBitmapNpot = false; - - hasGradient = false; - gradientType = kGradientLinear; - - shadersMode = SkXfermode::kClear_Mode; - - isBitmapFirst = false; - bitmapWrapS = GL_CLAMP_TO_EDGE; - bitmapWrapT = GL_CLAMP_TO_EDGE; - - colorOp = kColorNone; - colorMode = SkXfermode::kClear_Mode; - - framebufferMode = SkXfermode::kClear_Mode; - swapSrcDst = false; - - isPoint = false; - pointSize = 0.0f; - } - - /** - * Indicates, for a given color, whether color modulation is required in - * the fragment shader. When this method returns true, the program should - * be provided with a modulation color. - */ - bool setColor(const float r, const float g, const float b, const float a) { - modulate = a < COLOR_COMPONENT_THRESHOLD || r < COLOR_COMPONENT_THRESHOLD || - g < COLOR_COMPONENT_THRESHOLD || b < COLOR_COMPONENT_THRESHOLD; - return modulate; - } - - /** - * Indicates, for a given color, whether color modulation is required in - * the fragment shader. When this method returns true, the program should - * be provided with a modulation color. - */ - bool setAlpha8Color(const float r, const float g, const float b, const float a) { - modulate = a < COLOR_COMPONENT_THRESHOLD || r > COLOR_COMPONENT_INV_THRESHOLD || - g > COLOR_COMPONENT_INV_THRESHOLD || b > COLOR_COMPONENT_INV_THRESHOLD; - return modulate; - } - - /** - * Computes the unique key identifying this program. - */ - programid key() const { - programid key = 0; - if (hasTexture) key |= PROGRAM_KEY_TEXTURE; - if (hasAlpha8Texture) key |= PROGRAM_KEY_A8_TEXTURE; - if (hasBitmap) { - key |= PROGRAM_KEY_BITMAP; - if (isBitmapNpot) { - key |= PROGRAM_KEY_BITMAP_NPOT; - key |= getEnumForWrap(bitmapWrapS) << PROGRAM_BITMAP_WRAPS_SHIFT; - key |= getEnumForWrap(bitmapWrapT) << PROGRAM_BITMAP_WRAPT_SHIFT; - } - } - if (hasGradient) key |= PROGRAM_KEY_GRADIENT; - key |= programid(gradientType) << PROGRAM_GRADIENT_TYPE_SHIFT; - if (isBitmapFirst) key |= PROGRAM_KEY_BITMAP_FIRST; - if (hasBitmap && hasGradient) { - key |= (shadersMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_SHADER_SHIFT; - } - switch (colorOp) { - case kColorMatrix: - key |= PROGRAM_KEY_COLOR_MATRIX; - break; - case kColorLighting: - key |= PROGRAM_KEY_COLOR_LIGHTING; - break; - case kColorBlend: - key |= PROGRAM_KEY_COLOR_BLEND; - key |= (colorMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_COLOR_OP_SHIFT; - break; - case kColorNone: - break; - } - key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT; - if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST; - if (modulate) key |= programid(0x1) << PROGRAM_MODULATE_SHIFT; - if (isPoint) key |= programid(0x1) << PROGRAM_IS_POINT_SHIFT; - if (isAA) key |= programid(0x1) << PROGRAM_HAS_AA_SHIFT; - if (hasExternalTexture) key |= programid(0x1) << PROGRAM_HAS_EXTERNAL_TEXTURE_SHIFT; - if (hasTextureTransform) key |= programid(0x1) << PROGRAM_HAS_TEXTURE_TRANSFORM_SHIFT; - return key; - } - - /** - * Logs the specified message followed by the key identifying this program. - */ - void log(const char* message) const { -#if DEBUG_PROGRAMS - programid k = key(); - PROGRAM_LOGD("%s (key = 0x%.8x%.8x)", message, uint32_t(k >> 32), - uint32_t(k & 0xffffffff)); -#endif - } - -private: - inline uint32_t getEnumForWrap(GLenum wrap) const { - switch (wrap) { - case GL_CLAMP_TO_EDGE: - return 0; - case GL_REPEAT: - return 1; - case GL_MIRRORED_REPEAT: - return 2; - } - return 0; - } - -}; // struct ProgramDescription - -/** * Generates and caches program. Programs are generated based on * ProgramDescriptions. */ diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 8c01e3afcac1..2eae0f18bbb8 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -73,6 +73,9 @@ enum DebugLevel { #define PROPERTY_TEXT_BLACK_GAMMA_THRESHOLD "ro.text_gamma.black_threshold" #define PROPERTY_TEXT_WHITE_GAMMA_THRESHOLD "ro.text_gamma.white_threshold" +// TODO: This should be set by a system property +#define PANEL_BIT_DEPTH 20 + // Converts a number of mega-bytes into bytes #define MB(s) s * 1024 * 1024 diff --git a/libs/hwui/Rect.h b/libs/hwui/Rect.h index edc90e1f052f..fff9f6c4d812 100644 --- a/libs/hwui/Rect.h +++ b/libs/hwui/Rect.h @@ -29,17 +29,6 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// class Rect { - static inline float min(float a, float b) { return (a<b) ? a : b; } - static inline float max(float a, float b) { return (a>b) ? a : b; } - Rect intersectWith(float l, float t, float r, float b) const { - Rect tmp; - tmp.left = max(left, l); - tmp.top = max(top, t); - tmp.right = min(right, r); - tmp.bottom = min(bottom, b); - return tmp; - } - public: float left; float top; @@ -115,7 +104,7 @@ public: } bool intersects(float l, float t, float r, float b) const { - return !intersectWith(l,t,r,b).isEmpty(); + return !intersectWith(l, t, r, b).isEmpty(); } bool intersects(const Rect& r) const { @@ -123,7 +112,8 @@ public: } bool intersect(float l, float t, float r, float b) { - Rect tmp(intersectWith(l,t,r,b)); + Rect tmp(l, t, r, b); + intersectWith(tmp); if (!tmp.isEmpty()) { set(tmp); return true; @@ -135,6 +125,14 @@ public: return intersect(r.left, r.top, r.right, r.bottom); } + bool contains(float l, float t, float r, float b) { + return l >= left && t >= top && r <= right && b <= bottom; + } + + bool contains(const Rect& r) { + return contains(r.left, r.top, r.right, r.bottom); + } + bool unionWith(const Rect& r) { if (r.left < r.right && r.top < r.bottom) { if (left < right && top < bottom) { @@ -172,6 +170,26 @@ public: LOGD("Rect[l=%f t=%f r=%f b=%f]", left, top, right, bottom); } +private: + static inline float min(float a, float b) { return (a < b) ? a : b; } + static inline float max(float a, float b) { return (a > b) ? a : b; } + + void intersectWith(Rect& tmp) const { + tmp.left = max(left, tmp.left); + tmp.top = max(top, tmp.top); + tmp.right = min(right, tmp.right); + tmp.bottom = min(bottom, tmp.bottom); + } + + Rect intersectWith(float l, float t, float r, float b) const { + Rect tmp; + tmp.left = max(left, l); + tmp.top = max(top, t); + tmp.right = min(right, r); + tmp.bottom = min(bottom, b); + return tmp; + } + }; // class Rect }; // namespace uirenderer diff --git a/libs/hwui/SkiaShader.cpp b/libs/hwui/SkiaShader.cpp index 32e75330599b..66993a48e088 100644 --- a/libs/hwui/SkiaShader.cpp +++ b/libs/hwui/SkiaShader.cpp @@ -20,6 +20,7 @@ #include <SkMatrix.h> +#include "Caches.h" #include "SkiaShader.h" #include "Texture.h" #include "Matrix.h" @@ -31,12 +32,6 @@ namespace uirenderer { // Support /////////////////////////////////////////////////////////////////////////////// -static const GLenum gTextureUnitsMap[] = { - GL_TEXTURE0, - GL_TEXTURE1, - GL_TEXTURE2 -}; - static const GLint gTileModes[] = { GL_CLAMP_TO_EDGE, // == SkShader::kClamp_TileMode GL_REPEAT, // == SkShader::kRepeat_Mode @@ -129,7 +124,7 @@ void SkiaBitmapShader::describe(ProgramDescription& description, const Extension void SkiaBitmapShader::setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, GLuint* textureUnit) { GLuint textureSlot = (*textureUnit)++; - glActiveTexture(gTextureUnitsMap[textureSlot]); + Caches::getInstance().activeTexture(textureSlot); Texture* texture = mTexture; mTexture = NULL; @@ -223,7 +218,7 @@ void SkiaLinearGradientShader::describe(ProgramDescription& description, void SkiaLinearGradientShader::setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, GLuint* textureUnit) { GLuint textureSlot = (*textureUnit)++; - glActiveTexture(gTextureUnitsMap[textureSlot]); + Caches::getInstance().activeTexture(textureSlot); Texture* texture = mGradientCache->get(mColors, mPositions, mCount, mTileX); @@ -335,7 +330,7 @@ void SkiaSweepGradientShader::describe(ProgramDescription& description, void SkiaSweepGradientShader::setupProgram(Program* program, const mat4& modelView, const Snapshot& snapshot, GLuint* textureUnit) { GLuint textureSlot = (*textureUnit)++; - glActiveTexture(gTextureUnitsMap[textureSlot]); + Caches::getInstance().activeTexture(textureSlot); Texture* texture = mGradientCache->get(mColors, mPositions, mCount); diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp index a3ee63b08555..bbefec6502cf 100644 --- a/libs/hwui/TextDropShadowCache.cpp +++ b/libs/hwui/TextDropShadowCache.cpp @@ -137,8 +137,8 @@ ShadowTexture* TextDropShadowCache::get(SkPaint* paint, const char* text, uint32 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, texture->width, texture->height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, shadow.image); - texture->setFilter(GL_LINEAR, GL_LINEAR); - texture->setWrap(GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE); + texture->setFilter(GL_LINEAR); + texture->setWrap(GL_CLAMP_TO_EDGE); if (size < mMaxSize) { if (mDebugEnabled) { diff --git a/libs/hwui/Texture.h b/libs/hwui/Texture.h index a4aed0706b48..1adf2c77e7c3 100644 --- a/libs/hwui/Texture.h +++ b/libs/hwui/Texture.h @@ -49,7 +49,7 @@ struct Texture { GLenum renderTarget = GL_TEXTURE_2D) { if (firstWrap || force || wrapS != this->wrapS || wrapT != this->wrapT) { - firstWrap = true; + firstWrap = false; this->wrapS = wrapS; this->wrapT = wrapT; diff --git a/location/java/android/location/Country.java b/location/java/android/location/Country.java index 939bd4af109c..7c1485d88a3e 100755 --- a/location/java/android/location/Country.java +++ b/location/java/android/location/Country.java @@ -18,6 +18,7 @@ package android.location; import android.os.Parcel; import android.os.Parcelable; +import android.os.SystemClock; import java.util.Locale; @@ -58,8 +59,14 @@ public class Country implements Parcelable { private final int mSource; private int mHashCode; + + /** + * Time that this object was created (which we assume to be the time that the source was + * consulted). This time is in milliseconds since boot up. + */ + private final long mTimestamp; + /** - * * @param countryIso the ISO 3166-1 two letters country code. * @param source where the countryIso came from, could be one of below * values @@ -78,11 +85,23 @@ public class Country implements Parcelable { } mCountryIso = countryIso.toUpperCase(Locale.US); mSource = source; + mTimestamp = SystemClock.elapsedRealtime(); + } + + private Country(final String countryIso, final int source, long timestamp) { + if (countryIso == null || source < COUNTRY_SOURCE_NETWORK + || source > COUNTRY_SOURCE_LOCALE) { + throw new IllegalArgumentException(); + } + mCountryIso = countryIso.toUpperCase(Locale.US); + mSource = source; + mTimestamp = timestamp; } public Country(Country country) { mCountryIso = country.mCountryIso; mSource = country.mSource; + mTimestamp = country.mTimestamp; } /** @@ -106,9 +125,17 @@ public class Country implements Parcelable { return mSource; } + /** + * Returns the time that this object was created (which we assume to be the time that the source + * was consulted). + */ + public final long getTimestamp() { + return mTimestamp; + } + public static final Parcelable.Creator<Country> CREATOR = new Parcelable.Creator<Country>() { public Country createFromParcel(Parcel in) { - return new Country(in.readString(), in.readInt()); + return new Country(in.readString(), in.readInt(), in.readLong()); } public Country[] newArray(int size) { @@ -123,8 +150,14 @@ public class Country implements Parcelable { public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mCountryIso); parcel.writeInt(mSource); + parcel.writeLong(mTimestamp); } + /** + * Returns true if this {@link Country} is equivalent to the given object. This ignores + * the timestamp value and just checks for equivalence of countryIso and source values. + * Returns false otherwise. + */ @Override public boolean equals(Object object) { if (object == this) { @@ -132,6 +165,7 @@ public class Country implements Parcelable { } if (object instanceof Country) { Country c = (Country) object; + // No need to check the equivalence of the timestamp return mCountryIso.equals(c.getCountryIso()) && mSource == c.getSource(); } return false; @@ -150,8 +184,8 @@ public class Country implements Parcelable { } /** - * Compare the specified country to this country object ignoring the mSource - * field, return true if the countryIso fields are equal + * Compare the specified country to this country object ignoring the source + * and timestamp fields, return true if the countryIso fields are equal * * @param country the country to compare * @return true if the specified country's countryIso field is equal to this @@ -160,4 +194,9 @@ public class Country implements Parcelable { public boolean equalsIgnoreSource(Country country) { return country != null && mCountryIso.equals(country.getCountryIso()); } + + @Override + public String toString() { + return "Country {ISO=" + mCountryIso + ", source=" + mSource + ", time=" + mTimestamp + "}"; + } } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 4f9eb2bbf2ff..c5d17eb3cfa0 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -449,7 +449,7 @@ public class AudioTrack // AudioTrack subclasses too. try { stop(); - } catch(IllegalStateException ise) { + } catch(IllegalStateException ise) { // don't raise an exception, we're releasing the resources. } native_release(); @@ -488,7 +488,7 @@ public class AudioTrack public int getSampleRate() { return mSampleRate; } - + /** * Returns the current playback rate in Hz. */ @@ -590,22 +590,22 @@ public class AudioTrack static public int getNativeOutputSampleRate(int streamType) { return native_get_output_sample_rate(streamType); } - + /** * Returns the minimum buffer size required for the successful creation of an AudioTrack * object to be created in the {@link #MODE_STREAM} mode. Note that this size doesn't * guarantee a smooth playback under load, and higher values should be chosen according to - * the expected frequency at which the buffer will be refilled with additional data to play. + * the expected frequency at which the buffer will be refilled with additional data to play. * @param sampleRateInHz the sample rate expressed in Hertz. - * @param channelConfig describes the configuration of the audio channels. + * @param channelConfig describes the configuration of the audio channels. * See {@link AudioFormat#CHANNEL_OUT_MONO} and * {@link AudioFormat#CHANNEL_OUT_STEREO} - * @param audioFormat the format in which the audio data is represented. - * See {@link AudioFormat#ENCODING_PCM_16BIT} and + * @param audioFormat the format in which the audio data is represented. + * See {@link AudioFormat#ENCODING_PCM_16BIT} and * {@link AudioFormat#ENCODING_PCM_8BIT} * @return {@link #ERROR_BAD_VALUE} if an invalid parameter was passed, - * or {@link #ERROR} if the implementation was unable to query the hardware for its output - * properties, + * or {@link #ERROR} if the implementation was unable to query the hardware for its output + * properties, * or the minimum buffer size expressed in bytes. */ static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat) { @@ -623,18 +623,18 @@ public class AudioTrack loge("getMinBufferSize(): Invalid channel configuration."); return AudioTrack.ERROR_BAD_VALUE; } - - if ((audioFormat != AudioFormat.ENCODING_PCM_16BIT) + + if ((audioFormat != AudioFormat.ENCODING_PCM_16BIT) && (audioFormat != AudioFormat.ENCODING_PCM_8BIT)) { loge("getMinBufferSize(): Invalid audio format."); return AudioTrack.ERROR_BAD_VALUE; } - + if ( (sampleRateInHz < 4000) || (sampleRateInHz > 48000) ) { loge("getMinBufferSize(): " + sampleRateInHz +"Hz is not a supported sample rate."); return AudioTrack.ERROR_BAD_VALUE; } - + int size = native_get_min_buff_size(sampleRateInHz, channelCount, audioFormat); if ((size == -1) || (size == 0)) { loge("getMinBufferSize(): error querying hardware"); @@ -667,7 +667,7 @@ public class AudioTrack public void setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener listener) { setPlaybackPositionUpdateListener(listener, null); } - + /** * Sets the listener the AudioTrack notifies when a previously set marker is reached or * for each periodic playback head position update. @@ -676,7 +676,7 @@ public class AudioTrack * @param listener * @param handler the Handler that will receive the event notification messages. */ - public void setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener listener, + public void setPlaybackPositionUpdateListener(OnPlaybackPositionUpdateListener listener, Handler handler) { synchronized (mPositionListenerLock) { mPositionListener = listener; @@ -684,7 +684,7 @@ public class AudioTrack if (listener != null) { mEventHandlerDelegate = new NativeEventHandlerDelegate(this, handler); } - + } @@ -917,7 +917,7 @@ public class AudioTrack return ERROR_INVALID_OPERATION; } - if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0) + if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0) || (offsetInBytes + sizeInBytes > audioData.length)) { return ERROR_BAD_VALUE; } @@ -948,12 +948,12 @@ public class AudioTrack && (sizeInShorts > 0)) { mState = STATE_INITIALIZED; } - + if (mState != STATE_INITIALIZED) { return ERROR_INVALID_OPERATION; } - if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0) + if ( (audioData == null) || (offsetInShorts < 0 ) || (sizeInShorts < 0) || (offsetInShorts + sizeInShorts > audioData.length)) { return ERROR_BAD_VALUE; } @@ -1047,7 +1047,7 @@ public class AudioTrack * by the playback head. */ void onMarkerReached(AudioTrack track); - + /** * Called on the listener to periodically notify it that the playback head has reached * a multiple of the notification period. @@ -1066,7 +1066,7 @@ public class AudioTrack private class NativeEventHandlerDelegate { private final AudioTrack mAudioTrack; private final Handler mHandler; - + NativeEventHandlerDelegate(AudioTrack track, Handler handler) { mAudioTrack = track; // find the looper for our new event handler @@ -1077,7 +1077,7 @@ public class AudioTrack // no given handler, use the looper the AudioTrack was created in looper = mInitializationLooper; } - + // construct the event handler with this looper if (looper != null) { // implement the event handler delegate @@ -1111,9 +1111,9 @@ public class AudioTrack }; } else { mHandler = null; - } + } } - + Handler getHandler() { return mHandler; } @@ -1133,7 +1133,7 @@ public class AudioTrack } if (track.mEventHandlerDelegate != null) { - Message m = + Message m = track.mEventHandlerDelegate.getHandler().obtainMessage(what, arg1, arg2, obj); track.mEventHandlerDelegate.getHandler().sendMessage(m); } diff --git a/media/java/android/media/audiofx/AudioEffect.java b/media/java/android/media/audiofx/AudioEffect.java index 673f9f4db805..85be26733023 100644 --- a/media/java/android/media/audiofx/AudioEffect.java +++ b/media/java/android/media/audiofx/AudioEffect.java @@ -386,7 +386,7 @@ public class AudioEffect { default: throw (new RuntimeException( "Cannot initialize effect engine for type: " + type - + "Error: " + initResult)); + + " Error: " + initResult)); } } mId = id[0]; diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 7e55fbd7e73e..6868d9924545 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -1,4 +1,4 @@ -/* //device/extlibs/pv/android/AudioTrack.cpp +/* frameworks/base/media/libmedia/AudioTrack.cpp ** ** Copyright 2007, The Android Open Source Project ** @@ -477,7 +477,7 @@ bool AudioTrack::muted() const status_t AudioTrack::setVolume(float left, float right) { - if (left > 1.0f || right > 1.0f) { + if (left < 0.0f || left > 1.0f || right < 0.0f || right > 1.0f) { return BAD_VALUE; } @@ -809,9 +809,7 @@ status_t AudioTrack::createTrack_l( LOGE("Could not get control block"); return NO_INIT; } - mAudioTrack.clear(); mAudioTrack = track; - mCblkMemory.clear(); mCblkMemory = cblk; mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer()); android_atomic_or(CBLK_DIRECTION_OUT, &mCblk->flags); @@ -1322,7 +1320,7 @@ audio_track_cblk_t::audio_track_cblk_t() uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount) { - uint32_t u = this->user; + uint32_t u = user; u += frameCount; // Ensure that user is never ahead of server for AudioRecord @@ -1331,16 +1329,16 @@ uint32_t audio_track_cblk_t::stepUser(uint32_t frameCount) if (bufferTimeoutMs == MAX_STARTUP_TIMEOUT_MS-1) { bufferTimeoutMs = MAX_RUN_TIMEOUT_MS; } - } else if (u > this->server) { - LOGW("stepServer occured after track reset"); - u = this->server; + } else if (u > server) { + LOGW("stepServer occurred after track reset"); + u = server; } if (u >= userBase + this->frameCount) { userBase += this->frameCount; } - this->user = u; + user = u; // Clear flow control error condition as new data has been written/read to/from buffer. if (flags & CBLK_UNDERRUN_MSK) { @@ -1357,7 +1355,7 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount) return false; } - uint32_t s = this->server; + uint32_t s = server; s += frameCount; if (flags & CBLK_DIRECTION_MSK) { @@ -1370,9 +1368,9 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount) // while the mixer is processing a block: in this case, // stepServer() is called After the flush() has reset u & s and // we have s > u - if (s > this->user) { - LOGW("stepServer occured after track reset"); - s = this->user; + if (s > user) { + LOGW("stepServer occurred after track reset"); + s = user; } } @@ -1388,7 +1386,7 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount) serverBase += this->frameCount; } - this->server = s; + server = s; if (!(flags & CBLK_INVALID_MSK)) { cv.signal(); @@ -1399,7 +1397,7 @@ bool audio_track_cblk_t::stepServer(uint32_t frameCount) void* audio_track_cblk_t::buffer(uint32_t offset) const { - return (int8_t *)this->buffers + (offset - userBase) * this->frameSize; + return (int8_t *)buffers + (offset - userBase) * frameSize; } uint32_t audio_track_cblk_t::framesAvailable() @@ -1410,8 +1408,8 @@ uint32_t audio_track_cblk_t::framesAvailable() uint32_t audio_track_cblk_t::framesAvailable_l() { - uint32_t u = this->user; - uint32_t s = this->server; + uint32_t u = user; + uint32_t s = server; if (flags & CBLK_DIRECTION_MSK) { uint32_t limit = (s < loopStart) ? s : loopStart; @@ -1423,8 +1421,8 @@ uint32_t audio_track_cblk_t::framesAvailable_l() uint32_t audio_track_cblk_t::framesReady() { - uint32_t u = this->user; - uint32_t s = this->server; + uint32_t u = user; + uint32_t s = server; if (flags & CBLK_DIRECTION_MSK) { if (u < loopEnd) { @@ -1469,4 +1467,3 @@ bool audio_track_cblk_t::tryLock() // ------------------------------------------------------------------------- }; // namespace android - diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp index d0d9ca65fd71..3539e3f10f0e 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerRenderer.cpp @@ -376,7 +376,7 @@ void NuPlayer::Renderer::onDrainVideoQueue() { bool tooLate = (mVideoLateByUs > 40000); if (tooLate) { - ALOGV("video late by %lld us (%.2f secs)", lateByUs, lateByUs / 1E6); + ALOGV("video late by %lld us (%.2f secs)", mVideoLateByUs, mVideoLateByUs / 1E6); } else { ALOGV("rendering video at media time %.2f secs", mediaTimeUs / 1E6); } diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp index e72adc4a24e8..6d2829814f8e 100644 --- a/media/libmediaplayerservice/nuplayer/RTSPSource.cpp +++ b/media/libmediaplayerservice/nuplayer/RTSPSource.cpp @@ -38,7 +38,8 @@ NuPlayer::RTSPSource::RTSPSource( mFlags(0), mState(DISCONNECTED), mFinalResult(OK), - mDisconnectReplyID(0) { + mDisconnectReplyID(0), + mSeekGeneration(0) { if (headers) { mExtraHeaders = *headers; @@ -146,14 +147,21 @@ status_t NuPlayer::RTSPSource::getDuration(int64_t *durationUs) { } status_t NuPlayer::RTSPSource::seekTo(int64_t seekTimeUs) { + sp<AMessage> msg = new AMessage(kWhatPerformSeek, mReflector->id()); + msg->setInt32("generation", ++mSeekGeneration); + msg->setInt64("timeUs", seekTimeUs); + msg->post(200000ll); + + return OK; +} + +void NuPlayer::RTSPSource::performSeek(int64_t seekTimeUs) { if (mState != CONNECTED) { - return UNKNOWN_ERROR; + return; } mState = SEEKING; mHandler->seek(seekTimeUs); - - return OK; } bool NuPlayer::RTSPSource::isSeekable() { @@ -168,6 +176,20 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { mDisconnectReplyID = replyID; finishDisconnectIfPossible(); return; + } else if (msg->what() == kWhatPerformSeek) { + int32_t generation; + CHECK(msg->findInt32("generation", &generation)); + + if (generation != mSeekGeneration) { + // obsolete. + return; + } + + int64_t seekTimeUs; + CHECK(msg->findInt64("timeUs", &seekTimeUs)); + + performSeek(seekTimeUs); + return; } CHECK_EQ(msg->what(), (int)kWhatNotify); @@ -208,21 +230,32 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { break; } - const TrackInfo &info = mTracks.editItemAt(trackIndex); - sp<AnotherPacketSource> source = info.mSource; + TrackInfo *info = &mTracks.editItemAt(trackIndex); + + sp<AnotherPacketSource> source = info->mSource; if (source != NULL) { -#if 1 uint32_t rtpTime; CHECK(accessUnit->meta()->findInt32("rtp-time", (int32_t *)&rtpTime)); + if (!info->mNPTMappingValid) { + // This is a live stream, we didn't receive any normal + // playtime mapping. Assume the first packets correspond + // to time 0. + + ALOGV("This is a live stream, assuming time = 0"); + + info->mRTPTime = rtpTime; + info->mNormalPlaytimeUs = 0ll; + info->mNPTMappingValid = true; + } + int64_t nptUs = - ((double)rtpTime - (double)info.mRTPTime) - / info.mTimeScale + ((double)rtpTime - (double)info->mRTPTime) + / info->mTimeScale * 1000000ll - + info.mNormalPlaytimeUs; + + info->mNormalPlaytimeUs; accessUnit->meta()->setInt64("timeUs", nptUs); -#endif source->queueAccessUnit(accessUnit); } @@ -278,6 +311,7 @@ void NuPlayer::RTSPSource::onMessageReceived(const sp<AMessage> &msg) { TrackInfo *info = &mTracks.editItemAt(trackIndex); info->mRTPTime = rtpTime; info->mNormalPlaytimeUs = nptUs; + info->mNPTMappingValid = true; break; } @@ -305,6 +339,7 @@ void NuPlayer::RTSPSource::onConnected() { info.mTimeScale = timeScale; info.mRTPTime = 0; info.mNormalPlaytimeUs = 0ll; + info.mNPTMappingValid = false; if ((isAudio && mAudioTrack == NULL) || (isVideo && mVideoTrack == NULL)) { diff --git a/media/libmediaplayerservice/nuplayer/RTSPSource.h b/media/libmediaplayerservice/nuplayer/RTSPSource.h index 66eab7254df0..59d06ada8662 100644 --- a/media/libmediaplayerservice/nuplayer/RTSPSource.h +++ b/media/libmediaplayerservice/nuplayer/RTSPSource.h @@ -56,6 +56,7 @@ private: enum { kWhatNotify = 'noti', kWhatDisconnect = 'disc', + kWhatPerformSeek = 'seek', }; enum State { @@ -76,6 +77,7 @@ private: int32_t mTimeScale; uint32_t mRTPTime; int64_t mNormalPlaytimeUs; + bool mNPTMappingValid; }; AString mURL; @@ -95,12 +97,16 @@ private: sp<AnotherPacketSource> mAudioTrack; sp<AnotherPacketSource> mVideoTrack; + int32_t mSeekGeneration; + sp<AnotherPacketSource> getSource(bool audio); void onConnected(); void onDisconnected(const sp<AMessage> &msg); void finishDisconnectIfPossible(); + void performSeek(int64_t seekTimeUs); + DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); }; diff --git a/media/libstagefright/foundation/ABitReader.cpp b/media/libstagefright/foundation/ABitReader.cpp index f07dd4f7fa90..5499c32bbaba 100644 --- a/media/libstagefright/foundation/ABitReader.cpp +++ b/media/libstagefright/foundation/ABitReader.cpp @@ -79,7 +79,13 @@ void ABitReader::skipBits(size_t n) { } void ABitReader::putBits(uint32_t x, size_t n) { - CHECK_LE(mNumBitsLeft + n, 32u); + CHECK_LE(n, 32u); + + while (mNumBitsLeft + n > 32) { + mNumBitsLeft -= 8; + --mData; + ++mSize; + } mReservoir = (mReservoir >> n) | (x << (32 - n)); mNumBitsLeft += n; diff --git a/media/libstagefright/rtsp/AAMRAssembler.cpp b/media/libstagefright/rtsp/AAMRAssembler.cpp index 547b202e85c8..9d72b1fd9a85 100644 --- a/media/libstagefright/rtsp/AAMRAssembler.cpp +++ b/media/libstagefright/rtsp/AAMRAssembler.cpp @@ -79,13 +79,17 @@ ARTPAssembler::AssemblyStatus AAMRAssembler::assembleMore( } static size_t getFrameSize(bool isWide, unsigned FT) { - static const size_t kFrameSizeNB[8] = { - 95, 103, 118, 134, 148, 159, 204, 244 + static const size_t kFrameSizeNB[9] = { + 95, 103, 118, 134, 148, 159, 204, 244, 39 }; - static const size_t kFrameSizeWB[9] = { - 132, 177, 253, 285, 317, 365, 397, 461, 477 + static const size_t kFrameSizeWB[10] = { + 132, 177, 253, 285, 317, 365, 397, 461, 477, 40 }; + if (FT == 15) { + return 1; + } + size_t frameSize = isWide ? kFrameSizeWB[FT] : kFrameSizeNB[FT]; // Round up bits to bytes and add 1 for the header byte. @@ -161,8 +165,8 @@ ARTPAssembler::AssemblyStatus AAMRAssembler::addPacket( unsigned FT = (toc >> 3) & 0x0f; if ((toc & 3) != 0 - || (mIsWide && FT > 8) - || (!mIsWide && FT > 7)) { + || (mIsWide && FT > 9 && FT != 15) + || (!mIsWide && FT > 8 && FT != 15)) { queue->erase(queue->begin()); ++mNextExpectedSeqNo; diff --git a/media/libstagefright/rtsp/ARTSPConnection.cpp b/media/libstagefright/rtsp/ARTSPConnection.cpp index 0fbbb9ee3a71..d8107bcc38bb 100644 --- a/media/libstagefright/rtsp/ARTSPConnection.cpp +++ b/media/libstagefright/rtsp/ARTSPConnection.cpp @@ -659,6 +659,7 @@ bool ARTSPConnection::receiveRTSPReponse() { } AString line; + ssize_t lastDictIndex = -1; for (;;) { if (!receiveLine(&line)) { break; @@ -668,7 +669,21 @@ bool ARTSPConnection::receiveRTSPReponse() { break; } - ALOGV("line: %s", line.c_str()); + ALOGV("line: '%s'", line.c_str()); + + if (line.c_str()[0] == ' ' || line.c_str()[0] == '\t') { + // Support for folded header values. + + if (lastDictIndex < 0) { + // First line cannot be a continuation of the previous one. + return false; + } + + AString &value = response->mHeaders.editValueAt(lastDictIndex); + value.append(line); + + continue; + } ssize_t colonPos = line.find(":"); if (colonPos < 0) { @@ -681,9 +696,12 @@ bool ARTSPConnection::receiveRTSPReponse() { key.tolower(); line.erase(0, colonPos + 1); - line.trim(); - response->mHeaders.add(key, line); + lastDictIndex = response->mHeaders.add(key, line); + } + + for (size_t i = 0; i < response->mHeaders.size(); ++i) { + response->mHeaders.editValueAt(i).trim(); } unsigned long contentLength = 0; diff --git a/media/libstagefright/rtsp/MyHandler.h b/media/libstagefright/rtsp/MyHandler.h index dd049c29d534..21ef298bf6ca 100644 --- a/media/libstagefright/rtsp/MyHandler.h +++ b/media/libstagefright/rtsp/MyHandler.h @@ -1100,6 +1100,8 @@ struct MyHandler : public AHandler { float npt1, npt2; if (!ASessionDescription::parseNTPRange(val.c_str(), &npt1, &npt2)) { // This is a live stream and therefore not seekable. + + LOGI("This is a live stream"); return; } @@ -1386,12 +1388,14 @@ private: msg->setInt32("what", kWhatConnected); msg->post(); - for (size_t i = 0; i < mTracks.size(); ++i) { - TrackInfo *info = &mTracks.editItemAt(i); + if (mSeekable) { + for (size_t i = 0; i < mTracks.size(); ++i) { + TrackInfo *info = &mTracks.editItemAt(i); - postNormalPlayTimeMapping( - i, - info->mNormalPlayTimeRTP, info->mNormalPlayTimeUs); + postNormalPlayTimeMapping( + i, + info->mNormalPlayTimeRTP, info->mNormalPlayTimeUs); + } } mFirstAccessUnit = false; diff --git a/media/mediaserver/main_mediaserver.cpp b/media/mediaserver/main_mediaserver.cpp index 7094cfa3a1f2..b5f85f9e1681 100644 --- a/media/mediaserver/main_mediaserver.cpp +++ b/media/mediaserver/main_mediaserver.cpp @@ -15,11 +15,6 @@ ** limitations under the License. */ -// System headers required for setgroups, etc. -#include <sys/types.h> -#include <unistd.h> -#include <grp.h> - #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> @@ -29,7 +24,6 @@ #include <CameraService.h> #include <MediaPlayerService.h> #include <AudioPolicyService.h> -#include <private/android_filesystem_config.h> using namespace android; diff --git a/nfc-extras/tests/src/com/android/nfc_extras/BasicNfcEeTest.java b/nfc-extras/tests/src/com/android/nfc_extras/tests/BasicNfcEeTest.java index e1025aa2e9b8..389dfbe05f23 100644 --- a/nfc-extras/tests/src/com/android/nfc_extras/BasicNfcEeTest.java +++ b/nfc-extras/tests/src/com/android/nfc_extras/tests/BasicNfcEeTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.nfc_extras; +package com.android.nfc_extras.tests; import android.content.Context; import android.nfc.NfcAdapter; @@ -48,7 +48,7 @@ public class BasicNfcEeTest extends InstrumentationTestCase { @Override protected void setUp() throws Exception { super.setUp(); - mContext = getInstrumentation().getContext(); + mContext = getInstrumentation().getTargetContext(); mAdapterExtras = NfcAdapterExtras.get(NfcAdapter.getDefaultAdapter(mContext)); mEe = mAdapterExtras.getEmbeddedExecutionEnvironment(); } diff --git a/opengl/libs/ETC1/etc1.cpp b/opengl/libs/ETC1/etc1.cpp index 5ed2c3c49f1b..97d10851def3 100644 --- a/opengl/libs/ETC1/etc1.cpp +++ b/opengl/libs/ETC1/etc1.cpp @@ -149,13 +149,13 @@ inline int divideBy255(int d) { static inline int convert8To4(int b) { int c = b & 0xff; - return divideBy255(b * 15); + return divideBy255(c * 15); } static inline int convert8To5(int b) { int c = b & 0xff; - return divideBy255(b * 31); + return divideBy255(c * 31); } static diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index a6a33039674b..5a927c6f4fce 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -63,7 +63,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { // database gets upgraded properly. At a minimum, please confirm that 'upgradeVersion' // is properly propagated through your change. Not doing so will result in a loss of user // settings. - private static final int DATABASE_VERSION = 74; + private static final int DATABASE_VERSION = 75; private Context mContext; @@ -987,6 +987,11 @@ public class DatabaseHelper extends SQLiteOpenHelper { } if (upgradeVersion == 73) { + upgradeVibrateSettingFromNone(db); + upgradeVersion = 74; + } + + if (upgradeVersion == 74) { // URL from which WebView loads a JavaScript based screen-reader. db.beginTransaction(); SQLiteStatement stmt = null; @@ -999,7 +1004,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { db.endTransaction(); if (stmt != null) stmt.close(); } - upgradeVersion = 74; + upgradeVersion = 75; } // *** Remember to update DATABASE_VERSION above! @@ -1107,6 +1112,28 @@ public class DatabaseHelper extends SQLiteOpenHelper { } } + private void upgradeVibrateSettingFromNone(SQLiteDatabase db) { + int vibrateSetting = getIntValueFromSystem(db, Settings.System.VIBRATE_ON, 0); + // If the ringer vibrate value is invalid, set it to the default + if ((vibrateSetting & 3) == AudioManager.VIBRATE_SETTING_OFF) { + vibrateSetting = AudioService.getValueForVibrateSetting(0, + AudioManager.VIBRATE_TYPE_RINGER, AudioManager.VIBRATE_SETTING_ONLY_SILENT); + } + // Apply the same setting to the notification vibrate value + vibrateSetting = AudioService.getValueForVibrateSetting(vibrateSetting, + AudioManager.VIBRATE_TYPE_NOTIFICATION, vibrateSetting); + + SQLiteStatement stmt = null; + try { + stmt = db.compileStatement("INSERT OR REPLACE INTO system(name,value)" + + " VALUES(?,?);"); + loadSetting(stmt, Settings.System.VIBRATE_ON, vibrateSetting); + } finally { + if (stmt != null) + stmt.close(); + } + } + private void upgradeScreenTimeout(SQLiteDatabase db) { // Change screen timeout to current default db.beginTransaction(); diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png Binary files differindex 620858170ae0..02da243d07c9 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_rotate_on.png diff --git a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png Binary files differindex fe4d31834858..d645a3c213cb 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_sysbar_wifi_on.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png Binary files differindex 2536d92ba2b4..9c117ae4789e 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_rotate_on.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png Binary files differindex 44e35773e045..4f51201dc5d2 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_wifi_on.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_rotate_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_rotate_on.png Binary files differindex b37539646cec..35d85e18dcee 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_rotate_on.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_rotate_on.png diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_wifi_on.png b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_wifi_on.png Binary files differindex 54e3d1ef6bc8..bc1628fa7e3b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_wifi_on.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_sysbar_wifi_on.png diff --git a/policy/src/com/android/internal/policy/impl/IconUtilities.java b/policy/src/com/android/internal/policy/impl/IconUtilities.java index 4564f904e83e..e997355583a0 100644 --- a/policy/src/com/android/internal/policy/impl/IconUtilities.java +++ b/policy/src/com/android/internal/policy/impl/IconUtilities.java @@ -38,6 +38,8 @@ import android.text.StaticLayout; import android.text.TextPaint; import android.util.DisplayMetrics; import android.util.Log; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; import android.content.res.Resources; import android.content.Context; @@ -74,9 +76,13 @@ final class IconUtilities { mIconTextureWidth = mIconTextureHeight = mIconWidth + (int)(blurPx*2); mBlurPaint.setMaskFilter(new BlurMaskFilter(blurPx, BlurMaskFilter.Blur.NORMAL)); - mGlowColorPressedPaint.setColor(0xffffc300); + + TypedValue value = new TypedValue(); + mGlowColorPressedPaint.setColor(context.getTheme().resolveAttribute( + android.R.attr.colorPressedHighlight, value, true) ? value.data : 0xffffc300); mGlowColorPressedPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30)); - mGlowColorFocusedPaint.setColor(0xffff8e00); + mGlowColorFocusedPaint.setColor(context.getTheme().resolveAttribute( + android.R.attr.colorFocusedHighlight, value, true) ? value.data : 0xffff8e00); mGlowColorFocusedPaint.setMaskFilter(TableMaskFilter.CreateClipTable(0, 30)); ColorMatrix cm = new ColorMatrix(); diff --git a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java index bf1496bc3b81..4bba71bac5fe 100644 --- a/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java +++ b/policy/src/com/android/internal/policy/impl/KeyguardViewManager.java @@ -139,6 +139,7 @@ public class KeyguardViewManager implements KeyguardWindowController { lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_HARDWARE_ACCELERATED; } + lp.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY; lp.setTitle("Keyguard"); mWindowLayoutParams = lp; diff --git a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java index 67a6855d8b61..e3c0601b5dc3 100644 --- a/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java +++ b/policy/src/com/android/internal/policy/impl/LockPatternKeyguardView.java @@ -52,6 +52,7 @@ import android.os.Handler; import android.os.Message; import android.os.IBinder; import android.os.Parcelable; +import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; @@ -101,8 +102,8 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler private View mLockScreen; private View mUnlockScreen; - private volatile boolean mScreenOn = false; - private volatile boolean mWindowFocused = false; + private boolean mScreenOn; + private boolean mWindowFocused = false; private boolean mEnableFallback = false; // assume no fallback UI until we know better private boolean mShowLockBeforeUnlock = false; @@ -311,6 +312,7 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler mWindowController = controller; mHasOverlay = false; mPluggedIn = mUpdateMonitor.isDevicePluggedIn(); + mScreenOn = ((PowerManager)context.getSystemService(Context.POWER_SERVICE)).isScreenOn(); mUpdateMonitor.registerInfoCallback(this); @@ -1304,8 +1306,11 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler } if (mFaceLockAreaView != null) { + int[] faceLockPosition; + faceLockPosition = new int[2]; + mFaceLockAreaView.getLocationInWindow(faceLockPosition); startFaceLock(mFaceLockAreaView.getWindowToken(), - mFaceLockAreaView.getLeft(), mFaceLockAreaView.getTop(), + faceLockPosition[0], faceLockPosition[1], mFaceLockAreaView.getWidth(), mFaceLockAreaView.getHeight()); } } @@ -1323,14 +1328,14 @@ public class LockPatternKeyguardView extends KeyguardViewBase implements Handler }; // Tells the FaceLock service to start displaying its UI and perform recognition - public void startFaceLock(IBinder windowToken, int x, int y, int h, int w) + public void startFaceLock(IBinder windowToken, int x, int y, int w, int h) { if (usingFaceLock()) { synchronized (mFaceLockServiceRunningLock) { if (!mFaceLockServiceRunning) { if (DEBUG) Log.d(TAG, "Starting FaceLock"); try { - mFaceLockService.startUi(windowToken, x, y, h, w); + mFaceLockService.startUi(windowToken, x, y, w, h); } catch (RemoteException e) { Log.e(TAG, "Caught exception starting FaceLock: " + e.toString()); return; diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java index af86ae954794..f1fe43b70e16 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java @@ -1816,22 +1816,42 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { @Override public boolean dispatchKeyShortcutEvent(KeyEvent ev) { - // Perform the shortcut (mPreparedPanel can be null since - // global shortcuts (such as search) don't rely on a - // prepared panel or menu). - boolean handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev, - Menu.FLAG_PERFORM_NO_CLOSE); - if (handled) { - if (mPreparedPanel != null) { - mPreparedPanel.isHandled = true; + // If the panel is already prepared, then perform the shortcut using it. + boolean handled; + if (mPreparedPanel != null) { + handled = performPanelShortcut(mPreparedPanel, ev.getKeyCode(), ev, + Menu.FLAG_PERFORM_NO_CLOSE); + if (handled) { + if (mPreparedPanel != null) { + mPreparedPanel.isHandled = true; + } + return true; } - return true; } // Shortcut not handled by the panel. Dispatch to the view hierarchy. final Callback cb = getCallback(); - return cb != null && !isDestroyed() && mFeatureId < 0 ? cb.dispatchKeyShortcutEvent(ev) - : super.dispatchKeyShortcutEvent(ev); + handled = cb != null && !isDestroyed() && mFeatureId < 0 + ? cb.dispatchKeyShortcutEvent(ev) : super.dispatchKeyShortcutEvent(ev); + if (handled) { + return true; + } + + // If the panel is not prepared, then we may be trying to handle a shortcut key + // combination such as Control+C. Temporarily prepare the panel then mark it + // unprepared again when finished to ensure that the panel will again be prepared + // the next time it is shown for real. + if (mPreparedPanel == null) { + PanelFeatureState st = getPanelState(FEATURE_OPTIONS_PANEL, true); + preparePanel(st, ev); + handled = performPanelShortcut(st, ev.getKeyCode(), ev, + Menu.FLAG_PERFORM_NO_CLOSE); + st.isPrepared = false; + if (handled) { + return true; + } + } + return false; } @Override @@ -2562,6 +2582,8 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (targetPreHoneycomb || (targetPreIcs && targetHcNeedsOptions && noActionBar)) { addFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY); + } else { + clearFlags(WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY); } if (mAlwaysReadCloseOnTouchAttr || getContext().getApplicationInfo().targetSdkVersion diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 92260d620e7a..1a252fa77fef 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -301,9 +301,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { GlobalActions mGlobalActions; volatile boolean mPowerKeyHandled; // accessed from input reader and handler thread boolean mPendingPowerKeyUpCanceled; - RecentApplicationsDialog mRecentAppsDialog; Handler mHandler; + static final int RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS = 0; + static final int RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW = 1; + static final int RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH = 2; + + RecentApplicationsDialog mRecentAppsDialog; + int mRecentAppsDialogHeldModifiers; + private static final int LID_ABSENT = -1; private static final int LID_CLOSED = 0; private static final int LID_OPEN = 1; @@ -715,7 +721,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_DIALOG) { - showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); + showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS); } else if (mLongPressOnHomeBehavior == LONG_PRESS_HOME_RECENT_SYSTEM_UI) { try { mStatusBarService.toggleRecentApps(); @@ -726,10 +732,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } /** - * Create (if necessary) and launch the recent apps dialog, or hide it if it is - * already shown. + * Create (if necessary) and show or dismiss the recent apps dialog according + * according to the requested behavior. */ - void showOrHideRecentAppsDialog(final int heldModifiers, final boolean dismissIfShown) { + void showOrHideRecentAppsDialog(final int behavior) { mHandler.post(new Runnable() { @Override public void run() { @@ -737,12 +743,33 @@ public class PhoneWindowManager implements WindowManagerPolicy { mRecentAppsDialog = new RecentApplicationsDialog(mContext); } if (mRecentAppsDialog.isShowing()) { - if (dismissIfShown) { - mRecentAppsDialog.dismiss(); + switch (behavior) { + case RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS: + mRecentAppsDialog.dismiss(); + break; + case RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH: + mRecentAppsDialog.dismissAndSwitch(); + break; + case RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW: + default: + break; } } else { - mRecentAppsDialog.setHeldModifiers(heldModifiers); - mRecentAppsDialog.show(); + switch (behavior) { + case RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS: + mRecentAppsDialog.show(); + break; + case RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW: + try { + mWindowManager.setInTouchMode(false); + } catch (RemoteException e) { + } + mRecentAppsDialog.show(); + break; + case RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH: + default: + break; + } } } }); @@ -1649,7 +1676,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } else if (keyCode == KeyEvent.KEYCODE_APP_SWITCH) { if (down && repeatCount == 0) { - showOrHideRecentAppsDialog(0, true /*dismissIfShown*/); + showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_SHOW_OR_DISMISS); } return -1; } @@ -1685,6 +1712,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + // Invoke shortcuts using Meta. + if (down && repeatCount == 0 + && (metaState & KeyEvent.META_META_ON) != 0) { + final KeyCharacterMap kcm = event.getKeyCharacterMap(); + Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, + metaState & ~(KeyEvent.META_META_ON + | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); + if (shortcutIntent != null) { + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + try { + mContext.startActivity(shortcutIntent); + } catch (ActivityNotFoundException ex) { + Slog.w(TAG, "Dropping shortcut key combination because " + + "the activity to which it is registered was not found: " + + "META+" + KeyEvent.keyCodeToString(keyCode), ex); + } + return -1; + } + } + // Handle application launch keys. if (down && repeatCount == 0) { String category = sApplicationLaunchKeyCategories.get(keyCode); @@ -1698,9 +1745,29 @@ public class PhoneWindowManager implements WindowManagerPolicy { + "the activity to which it is registered was not found: " + "keyCode=" + keyCode + ", category=" + category, ex); } + return -1; } } + // Display task switcher for ALT-TAB or Meta-TAB. + if (down && repeatCount == 0 && keyCode == KeyEvent.KEYCODE_TAB) { + if (mRecentAppsDialogHeldModifiers == 0) { + final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK; + if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON) + || KeyEvent.metaStateHasModifiers( + shiftlessModifiers, KeyEvent.META_META_ON)) { + mRecentAppsDialogHeldModifiers = shiftlessModifiers; + showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_EXIT_TOUCH_MODE_AND_SHOW); + return -1; + } + } + } else if (!down && mRecentAppsDialogHeldModifiers != 0 + && (metaState & mRecentAppsDialogHeldModifiers) == 0) { + mRecentAppsDialogHeldModifiers = 0; + showOrHideRecentAppsDialog(RECENT_APPS_BEHAVIOR_DISMISS_AND_SWITCH); + } + + // Let the application handle the key. return 0; } @@ -1722,39 +1789,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { final KeyCharacterMap kcm = event.getKeyCharacterMap(); final int keyCode = event.getKeyCode(); final int metaState = event.getMetaState(); - final boolean initialDown = event.getAction() == KeyEvent.ACTION_DOWN - && event.getRepeatCount() == 0; - - if (initialDown) { - // Invoke shortcuts using Meta as a fallback. - if ((metaState & KeyEvent.META_META_ON) != 0) { - Intent shortcutIntent = mShortcutManager.getIntent(kcm, keyCode, - metaState & ~(KeyEvent.META_META_ON - | KeyEvent.META_META_LEFT_ON | KeyEvent.META_META_RIGHT_ON)); - if (shortcutIntent != null) { - shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - try { - mContext.startActivity(shortcutIntent); - } catch (ActivityNotFoundException ex) { - Slog.w(TAG, "Dropping shortcut key combination because " - + "the activity to which it is registered was not found: " - + "META+" + KeyEvent.keyCodeToString(keyCode), ex); - } - return null; - } - } - - // Display task switcher for ALT-TAB or Meta-TAB. - if (keyCode == KeyEvent.KEYCODE_TAB) { - final int shiftlessModifiers = event.getModifiers() & ~KeyEvent.META_SHIFT_MASK; - if (KeyEvent.metaStateHasModifiers(shiftlessModifiers, KeyEvent.META_ALT_ON) - || KeyEvent.metaStateHasModifiers( - shiftlessModifiers, KeyEvent.META_META_ON)) { - showOrHideRecentAppsDialog(shiftlessModifiers, false /*dismissIfShown*/); - return null; - } - } - } // Check for fallback actions specified by the key character map. if (getFallbackAction(kcm, keyCode, metaState, mFallbackAction)) { @@ -3843,8 +3877,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { & ~mResettingSystemUiFlags & ~mForceClearedSystemUiFlags; int diff = visibility ^ mLastSystemUiFlags; - final boolean needsMenu = (mFocusedWindow.getAttrs().flags - & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0; + final boolean needsMenu = mFocusedWindow.getNeedsMenuLw(mTopFullscreenOpaqueWindowState); if (diff == 0 && mLastFocusNeedsMenu == needsMenu && mFocusedApp == mFocusedWindow.getAppToken()) { return 0; diff --git a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java index aa00fbdd246f..b9903dd906ea 100644 --- a/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java +++ b/policy/src/com/android/internal/policy/impl/RecentApplicationsDialog.java @@ -71,8 +71,6 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } }; - private int mHeldModifiers; - public RecentApplicationsDialog(Context context) { super(context, com.android.internal.R.style.Theme_Dialog_RecentApplications); @@ -124,17 +122,6 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener } } - /** - * Sets the modifier keys that are being held to keep the dialog open, or 0 if none. - * Used to make the recent apps dialog automatically dismiss itself when the modifiers - * all go up. - * @param heldModifiers The held key modifiers, such as {@link KeyEvent#META_ALT_ON}. - * Should exclude shift. - */ - public void setHeldModifiers(int heldModifiers) { - mHeldModifiers = heldModifiers; - } - @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_TAB) { @@ -174,30 +161,27 @@ public class RecentApplicationsDialog extends Dialog implements OnClickListener return super.onKeyDown(keyCode, event); } - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - if (mHeldModifiers != 0 && (event.getModifiers() & mHeldModifiers) == 0) { - final int numIcons = mIcons.length; - RecentTag tag = null; - for (int i = 0; i < numIcons; i++) { - if (mIcons[i].getVisibility() != View.VISIBLE) { + /** + * Dismiss the dialog and switch to the selected application. + */ + public void dismissAndSwitch() { + final int numIcons = mIcons.length; + RecentTag tag = null; + for (int i = 0; i < numIcons; i++) { + if (mIcons[i].getVisibility() != View.VISIBLE) { + break; + } + if (i == 0 || mIcons[i].hasFocus()) { + tag = (RecentTag) mIcons[i].getTag(); + if (mIcons[i].hasFocus()) { break; } - if (i == 0 || mIcons[i].hasFocus()) { - tag = (RecentTag) mIcons[i].getTag(); - if (mIcons[i].hasFocus()) { - break; - } - } - } - if (tag != null) { - switchTo(tag); } - dismiss(); - return true; } - - return super.onKeyUp(keyCode, event); + if (tag != null) { + switchTo(tag); + } + dismiss(); } /** diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index 0ec773114218..fb8091f85861 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -63,8 +63,8 @@ namespace android { -static const char* kDeadlockedString = "AudioFlinger may be deadlocked\n"; -static const char* kHardwareLockedString = "Hardware lock is taken\n"; +static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n"; +static const char kHardwareLockedString[] = "Hardware lock is taken\n"; //static const nsecs_t kStandbyTimeInNsecs = seconds(3); static const float MAX_GAIN = 4096.0f; @@ -80,14 +80,16 @@ static const int8_t kMaxTrackStartupRetries = 50; static const int8_t kMaxTrackRetriesDirect = 2; static const int kDumpLockRetries = 50; -static const int kDumpLockSleep = 20000; +static const int kDumpLockSleepUs = 20000; -static const nsecs_t kWarningThrottle = seconds(5); +// don't warn about blocked writes or record buffer overflows more often than this +static const nsecs_t kWarningThrottleNs = seconds(5); // RecordThread loop sleep time upon application overrun or audio HAL read error static const int kRecordThreadSleepUs = 5000; -static const nsecs_t kSetParametersTimeout = seconds(2); +// maximum time to wait for setParameters to complete +static const nsecs_t kSetParametersTimeoutNs = seconds(2); // minimum sleep time for the mixer thread loop when tracks are active but in underrun static const uint32_t kMinThreadSleepTimeUs = 5000; @@ -147,7 +149,7 @@ out: return rc; } -static const char *audio_interfaces[] = { +static const char * const audio_interfaces[] = { "primary", "a2dp", "usb", @@ -320,7 +322,7 @@ static bool tryLock(Mutex& mutex) locked = true; break; } - usleep(kDumpLockSleep); + usleep(kDumpLockSleepUs); } return locked; } @@ -395,7 +397,7 @@ sp<IAudioTrack> AudioFlinger::createTrack( int lSessionId; if (streamType >= AUDIO_STREAM_CNT) { - LOGE("invalid stream type"); + LOGE("createTrack() invalid stream type %d", streamType); lStatus = BAD_VALUE; goto Exit; } @@ -427,6 +429,7 @@ sp<IAudioTrack> AudioFlinger::createTrack( // prevent same audio session on different output threads uint32_t sessions = t->hasAudioSession(*sessionId); if (sessions & PlaybackThread::TRACK_SESSION) { + LOGE("createTrack() session ID %d already in use", *sessionId); lStatus = BAD_VALUE; goto Exit; } @@ -657,6 +660,7 @@ status_t AudioFlinger::setStreamVolume(int stream, float value, int output) } if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT) { + LOGE("setStreamVolume() invalid stream %d", stream); return BAD_VALUE; } @@ -691,6 +695,7 @@ status_t AudioFlinger::setStreamMute(int stream, bool muted) if (stream < 0 || uint32_t(stream) >= AUDIO_STREAM_CNT || uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) { + LOGE("setStreamMute() invalid stream %d", stream); return BAD_VALUE; } @@ -988,7 +993,6 @@ AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, int i AudioFlinger::ThreadBase::~ThreadBase() { mParamCond.broadcast(); - mNewParameters.clear(); // do not lock the mutex in destructor releaseWakeLock_l(); if (mPowerManager != 0) { @@ -999,7 +1003,7 @@ AudioFlinger::ThreadBase::~ThreadBase() void AudioFlinger::ThreadBase::exit() { - // keep a strong ref on ourself so that we wont get + // keep a strong ref on ourself so that we won't get // destroyed in the middle of requestExitAndWait() sp <ThreadBase> strongMe = this; @@ -1044,7 +1048,7 @@ status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs) mWaitWorkCV.signal(); // wait condition with timeout in case the thread loop has exited // before the request could be processed - if (mParamCond.waitRelative(mLock, kSetParametersTimeout) == NO_ERROR) { + if (mParamCond.waitRelative(mLock, kSetParametersTimeoutNs) == NO_ERROR) { status = mParamStatus; mWaitWorkCV.signal(); } else { @@ -1526,8 +1530,10 @@ sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTra for (size_t i = 0; i < mTracks.size(); ++i) { sp<Track> t = mTracks[i]; if (t != 0) { - if (sessionId == t->sessionId() && - strategy != AudioSystem::getStrategyForStream((audio_stream_type_t)t->type())) { + uint32_t actual = AudioSystem::getStrategyForStream((audio_stream_type_t)t->type()); + if (sessionId == t->sessionId() && strategy != actual) { + LOGE("createTrack_l() mismatched strategy; expected %u but found %u", + strategy, actual); lStatus = BAD_VALUE; goto Exit; } @@ -1967,7 +1973,7 @@ bool AudioFlinger::MixerThread::threadLoop() // during mixing and effect process as the audio buffers could be deleted // or modified if an effect is created or deleted lockEffectChains_l(effectChains); - } + } if (LIKELY(mixerStatus == MIXER_TRACKS_READY)) { // mix buffers... @@ -2012,11 +2018,11 @@ bool AudioFlinger::MixerThread::threadLoop() } // sleepTime == 0 means we must write to audio hardware if (sleepTime == 0) { - for (size_t i = 0; i < effectChains.size(); i ++) { - effectChains[i]->process_l(); - } - // enable changes in effect chain - unlockEffectChains(effectChains); + for (size_t i = 0; i < effectChains.size(); i ++) { + effectChains[i]->process_l(); + } + // enable changes in effect chain + unlockEffectChains(effectChains); mLastWriteTime = systemTime(); mInWrite = true; mBytesWritten += mixBufferSize; @@ -2029,7 +2035,7 @@ bool AudioFlinger::MixerThread::threadLoop() nsecs_t delta = now - mLastWriteTime; if (!mStandby && delta > maxPeriod) { mNumDelayedWrites++; - if ((now - lastWarning) > kWarningThrottle) { + if ((now - lastWarning) > kWarningThrottleNs) { LOGW("write blocked for %llu msecs, %d delayed writes, thread %p", ns2ms(delta), mNumDelayedWrites, this); lastWarning = now; @@ -2344,7 +2350,7 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l() } if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) { // do not accept frame count changes if tracks are open as the track buffer - // size depends on frame count and correct behavior would not be garantied + // size depends on frame count and correct behavior would not be guaranteed // if frame count is changed after track creation if (!mTracks.isEmpty()) { status = INVALID_OPERATION; @@ -2415,7 +2421,7 @@ bool AudioFlinger::MixerThread::checkForNewParameters_l() mParamCond.signal(); // wait for condition with time out in case the thread calling ThreadBase::setParameters() // already timed out waiting for the status and will never signal the condition. - mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs); } return reconfig; } @@ -2891,7 +2897,7 @@ bool AudioFlinger::DirectOutputThread::checkForNewParameters_l() mParamCond.signal(); // wait for condition with time out in case the thread calling ThreadBase::setParameters() // already timed out waiting for the status and will never signal the condition. - mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs); } return reconfig; } @@ -4411,7 +4417,7 @@ bool AudioFlinger::RecordThread::threadLoop() else { if (!mActiveTrack->setOverflow()) { nsecs_t now = systemTime(); - if ((now - lastWarning) > kWarningThrottle) { + if ((now - lastWarning) > kWarningThrottleNs) { LOGW("RecordThread: buffer overflow"); lastWarning = now; } @@ -4734,7 +4740,7 @@ bool AudioFlinger::RecordThread::checkForNewParameters_l() mParamCond.signal(); // wait for condition with time out in case the thread calling ThreadBase::setParameters() // already timed out waiting for the status and will never signal the condition. - mWaitWorkCV.waitRelative(mLock, kSetParametersTimeout); + mWaitWorkCV.waitRelative(mLock, kSetParametersTimeoutNs); } return reconfig; } diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 116711587951..45f18691b26a 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -58,10 +58,16 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) t->needs = 0; t->volume[0] = UNITY_GAIN; t->volume[1] = UNITY_GAIN; + // no initialization needed + // t->prevVolume[0] + // t->prevVolume[1] t->volumeInc[0] = 0; t->volumeInc[1] = 0; t->auxLevel = 0; t->auxInc = 0; + // no initialization needed + // t->prevAuxLevel + // t->frameCount t->channelCount = 2; t->enabled = 0; t->format = 16; @@ -78,19 +84,19 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) } } - AudioMixer::~AudioMixer() - { - track_t* t = mState.tracks; - for (int i=0 ; i<32 ; i++) { - delete t->resampler; - t++; - } - delete [] mState.outputTemp; - delete [] mState.resampleTemp; - } +AudioMixer::~AudioMixer() +{ + track_t* t = mState.tracks; + for (int i=0 ; i<32 ; i++) { + delete t->resampler; + t++; + } + delete [] mState.outputTemp; + delete [] mState.resampleTemp; +} - int AudioMixer::getTrackName() - { +int AudioMixer::getTrackName() +{ uint32_t names = mTrackNames; uint32_t mask = 1; int n = 0; @@ -104,18 +110,18 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) return TRACK0 + n; } return -1; - } +} - void AudioMixer::invalidateState(uint32_t mask) - { +void AudioMixer::invalidateState(uint32_t mask) +{ if (mask) { mState.needsChanged |= mask; mState.hook = process__validate; } } - void AudioMixer::deleteTrackName(int name) - { +void AudioMixer::deleteTrackName(int name) +{ name -= TRACK0; if (uint32_t(name) < MAX_NUM_TRACKS) { ALOGV("deleteTrackName(%d)", name); @@ -135,7 +141,7 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) track.volumeInc[1] = 0; mTrackNames &= ~(1<<name); } - } +} status_t AudioMixer::enable(int name) { @@ -450,33 +456,33 @@ void AudioMixer::process__validate(state_t* state) countActiveTracks, state->enabledTracks, all16BitsStereoNoResample, resampling, volumeRamp); - state->hook(state); - - // Now that the volume ramp has been done, set optimal state and - // track hooks for subsequent mixer process - if (countActiveTracks) { - int allMuted = 1; - uint32_t en = state->enabledTracks; - while (en) { - const int i = 31 - __builtin_clz(en); - en &= ~(1<<i); - track_t& t = state->tracks[i]; - if (!t.doesResample() && t.volumeRL == 0) - { - t.needs |= NEEDS_MUTE_ENABLED; - t.hook = track__nop; - } else { - allMuted = 0; - } - } - if (allMuted) { - state->hook = process__nop; - } else if (all16BitsStereoNoResample) { - if (countActiveTracks == 1) { - state->hook = process__OneTrack16BitsStereoNoResampling; - } - } - } + state->hook(state); + + // Now that the volume ramp has been done, set optimal state and + // track hooks for subsequent mixer process + if (countActiveTracks) { + int allMuted = 1; + uint32_t en = state->enabledTracks; + while (en) { + const int i = 31 - __builtin_clz(en); + en &= ~(1<<i); + track_t& t = state->tracks[i]; + if (!t.doesResample() && t.volumeRL == 0) + { + t.needs |= NEEDS_MUTE_ENABLED; + t.hook = track__nop; + } else { + allMuted = 0; + } + } + if (allMuted) { + state->hook = process__nop; + } else if (all16BitsStereoNoResample) { + if (countActiveTracks == 1) { + state->hook = process__OneTrack16BitsStereoNoResampling; + } + } + } } static inline @@ -993,7 +999,7 @@ void AudioMixer::process__genericNoResampling(state_t* state) } - // generic code with resampling +// generic code with resampling void AudioMixer::process__genericResampling(state_t* state) { int32_t* const outTemp = state->outputTemp; @@ -1173,7 +1179,7 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) } in1 = buff; b1.frameCount = numFrames; - } else { + } else { in1 = b1.i16; } frameCount1 = b1.frameCount; @@ -1215,4 +1221,3 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) // ---------------------------------------------------------------------------- }; // namespace android - diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index 75c91700e352..da9e2b550100 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -65,10 +65,10 @@ public: FORMAT = 0x4001, MAIN_BUFFER = 0x4002, AUX_BUFFER = 0x4003, - // for TARGET RESAMPLE + // for target RESAMPLE SAMPLE_RATE = 0x4100, RESET = 0x4101, - // for TARGET VOLUME (8 channels max) + // for target RAMP_VOLUME and VOLUME (8 channels max) VOLUME0 = 0x4200, VOLUME1 = 0x4201, AUXLEVEL = 0x4210, diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp index 840d70d7417b..bc4c90c2c08e 100644 --- a/services/audioflinger/AudioPolicyService.cpp +++ b/services/audioflinger/AudioPolicyService.cpp @@ -31,7 +31,6 @@ #include <utils/threads.h> #include "AudioPolicyService.h" #include <cutils/properties.h> -#include <dlfcn.h> #include <hardware_legacy/power.h> #include <media/AudioEffect.h> #include <media/EffectsFactoryApi.h> diff --git a/services/audioflinger/AudioPolicyService.h b/services/audioflinger/AudioPolicyService.h index d898a530cc8c..88cb1e9c88f2 100644 --- a/services/audioflinger/AudioPolicyService.h +++ b/services/audioflinger/AudioPolicyService.h @@ -19,6 +19,7 @@ #include <cutils/misc.h> #include <cutils/config_utils.h> +#include <utils/String8.h> #include <utils/Vector.h> #include <utils/SortedVector.h> #include <binder/BinderService.h> @@ -31,8 +32,6 @@ namespace android { -class String8; - // ---------------------------------------------------------------------------- class AudioPolicyService : diff --git a/services/input/InputDispatcher.cpp b/services/input/InputDispatcher.cpp index 382f4d92fc7e..5f31f0506f6c 100644 --- a/services/input/InputDispatcher.cpp +++ b/services/input/InputDispatcher.cpp @@ -4312,12 +4312,23 @@ bool InputDispatcher::InputState::trackKey(const KeyEntry* entry, mKeyMementos.removeAt(index); return true; } + /* FIXME: We can't just drop the key up event because that prevents creating + * popup windows that are automatically shown when a key is held and then + * dismissed when the key is released. The problem is that the popup will + * not have received the original key down, so the key up will be considered + * to be inconsistent with its observed state. We could perhaps handle this + * by synthesizing a key down but that will cause other problems. + * + * So for now, allow inconsistent key up events to be dispatched. + * #if DEBUG_OUTBOUND_EVENT_DETAILS LOGD("Dropping inconsistent key up event: deviceId=%d, source=%08x, " "keyCode=%d, scanCode=%d", entry->deviceId, entry->source, entry->keyCode, entry->scanCode); #endif return false; + */ + return true; } case AKEY_EVENT_ACTION_DOWN: { diff --git a/services/java/com/android/server/CountryDetectorService.java b/services/java/com/android/server/CountryDetectorService.java index 3081ebefd05a..ab61a3c003b8 100644 --- a/services/java/com/android/server/CountryDetectorService.java +++ b/services/java/com/android/server/CountryDetectorService.java @@ -16,6 +16,8 @@ package com.android.server; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.HashMap; import com.android.server.location.ComprehensiveCountryDetector; @@ -30,6 +32,8 @@ import android.os.IBinder; import android.os.Looper; import android.os.Process; import android.os.RemoteException; +import android.util.PrintWriterPrinter; +import android.util.Printer; import android.util.Slog; /** @@ -75,7 +79,7 @@ public class CountryDetectorService extends ICountryDetector.Stub implements Run } } - private final static String TAG = "CountryDetectorService"; + private final static String TAG = "CountryDetector"; private final HashMap<IBinder, Receiver> mReceivers; private final Context mContext; @@ -201,4 +205,20 @@ public class CountryDetectorService extends ICountryDetector.Stub implements Run boolean isSystemReady() { return mSystemReady; } + + @Override + protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) { + try { + final Printer p = new PrintWriterPrinter(fout); + p.println("CountryDetectorService state:"); + p.println(" Number of listeners=" + mReceivers.keySet().size()); + if (mCountryDetector == null) { + p.println(" ComprehensiveCountryDetector not initialized"); + } else { + p.println(" " + mCountryDetector.toString()); + } + } catch (Exception e) { + Slog.e(TAG, "Failed to dump CountryDetectorService: ", e); + } + } } diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index f7bf8b530b79..b21e8575ebb6 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -16,11 +16,8 @@ package com.android.server; -import static android.Manifest.permission.ACCESS_NETWORK_STATE; -import static android.Manifest.permission.CHANGE_NETWORK_STATE; -import static android.Manifest.permission.CHANGE_WIFI_STATE; +import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.DUMP; -import static android.Manifest.permission.MANAGE_NETWORK_POLICY; import static android.Manifest.permission.SHUTDOWN; import static android.net.NetworkStats.SET_DEFAULT; import static android.net.NetworkStats.TAG_NONE; @@ -48,7 +45,6 @@ import android.net.NetworkUtils; import android.net.RouteInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration.KeyMgmt; -import android.os.Binder; import android.os.INetworkManagementService; import android.os.SystemClock; import android.os.SystemProperties; @@ -207,12 +203,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void registerObserver(INetworkManagementEventObserver obs) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); Slog.d(TAG, "Registering observer"); mObservers.add(obs); } @Override public void unregisterObserver(INetworkManagementEventObserver obs) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); Slog.d(TAG, "Unregistering observer"); mObservers.remove(mObservers.indexOf(obs)); } @@ -366,7 +364,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public String[] listInterfaces() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { return NativeDaemonEvent.filterMessageList( mConnector.executeForList("interface", "list"), InterfaceListResult); @@ -377,7 +375,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public InterfaceConfiguration getInterfaceConfig(String iface) { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NativeDaemonEvent event; try { @@ -421,7 +419,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceConfig(String iface, InterfaceConfiguration cfg) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); LinkAddress linkAddr = cfg.getLinkAddress(); if (linkAddr == null || linkAddr.getAddress() == null) { throw new IllegalStateException("Null LinkAddress given"); @@ -443,7 +441,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceDown(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final InterfaceConfiguration ifcg = getInterfaceConfig(iface); ifcg.setInterfaceDown(); setInterfaceConfig(iface, ifcg); @@ -451,7 +449,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceUp(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final InterfaceConfiguration ifcg = getInterfaceConfig(iface); ifcg.setInterfaceUp(); setInterfaceConfig(iface, ifcg); @@ -459,7 +457,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceIpv6PrivacyExtensions(String iface, boolean enable) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute( "interface", "ipv6privacyextensions", iface, enable ? "enable" : "disable"); @@ -472,7 +470,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub IPv6 addresses on interface down, but we need to do full clean up here */ @Override public void clearInterfaceAddresses(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("interface", "clearaddrs", iface); } catch (NativeDaemonConnectorException e) { @@ -482,7 +480,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void enableIpv6(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("interface", "ipv6", iface, "enable"); } catch (NativeDaemonConnectorException e) { @@ -492,7 +490,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void disableIpv6(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("interface", "ipv6", iface, "disable"); } catch (NativeDaemonConnectorException e) { @@ -502,25 +500,25 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void addRoute(String interfaceName, RouteInfo route) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); modifyRoute(interfaceName, ADD, route, DEFAULT); } @Override public void removeRoute(String interfaceName, RouteInfo route) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); modifyRoute(interfaceName, REMOVE, route, DEFAULT); } @Override public void addSecondaryRoute(String interfaceName, RouteInfo route) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); modifyRoute(interfaceName, ADD, route, SECONDARY); } @Override public void removeSecondaryRoute(String interfaceName, RouteInfo route) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); modifyRoute(interfaceName, REMOVE, route, SECONDARY); } @@ -579,7 +577,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public RouteInfo[] getRoutes(String interfaceName) { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); ArrayList<RouteInfo> routes = new ArrayList<RouteInfo>(); // v4 routes listed as: @@ -662,7 +660,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public boolean getIpForwardingEnabled() throws IllegalStateException{ - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NativeDaemonEvent event; try { @@ -678,7 +676,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setIpForwardingEnabled(boolean enable) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("ipfwd", enable ? "enable" : "disable"); } catch (NativeDaemonConnectorException e) { @@ -688,7 +686,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void startTethering(String[] dhcpRange) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // cmd is "tether start first_start first_stop second_start second_stop ..." // an odd number of addrs will fail @@ -706,7 +704,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void stopTethering() { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("tether", "stop"); } catch (NativeDaemonConnectorException e) { @@ -716,7 +714,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public boolean isTetheringStarted() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NativeDaemonEvent event; try { @@ -732,7 +730,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void tetherInterface(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("tether", "interface", "add", iface); } catch (NativeDaemonConnectorException e) { @@ -742,7 +740,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void untetherInterface(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("tether", "interface", "remove", iface); } catch (NativeDaemonConnectorException e) { @@ -752,7 +750,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public String[] listTetheredInterfaces() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { return NativeDaemonEvent.filterMessageList( mConnector.executeForList("tether", "interface", "list"), @@ -764,7 +762,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setDnsForwarders(String[] dns) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final Command cmd = new Command("tether", "dns", "set"); for (String s : dns) { @@ -780,7 +778,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public String[] getDnsForwarders() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { return NativeDaemonEvent.filterMessageList( mConnector.executeForList("tether", "dns", "list"), TetherDnsFwdTgtListResult); @@ -817,7 +815,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void enableNat(String internalInterface, String externalInterface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { modifyNat("enable", internalInterface, externalInterface); } catch (SocketException e) { @@ -827,7 +825,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void disableNat(String internalInterface, String externalInterface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { modifyNat("disable", internalInterface, externalInterface); } catch (SocketException e) { @@ -837,7 +835,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public String[] listTtys() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { return NativeDaemonEvent.filterMessageList( mConnector.executeForList("list_ttys"), TtyListResult); @@ -849,7 +847,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void attachPppd( String tty, String localAddr, String remoteAddr, String dns1Addr, String dns2Addr) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("pppd", "attach", tty, NetworkUtils.numericToInetAddress(localAddr).getHostAddress(), @@ -863,7 +861,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void detachPppd(String tty) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("pppd", "detach", tty); } catch (NativeDaemonConnectorException e) { @@ -874,8 +872,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void startAccessPoint( WifiConfiguration wifiConfig, String wlanIface, String softapIface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); - mContext.enforceCallingOrSelfPermission(CHANGE_WIFI_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { wifiFirmwareReload(wlanIface, "AP"); mConnector.execute("softap", "start", wlanIface); @@ -905,8 +902,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub /* @param mode can be "AP", "STA" or "P2P" */ @Override public void wifiFirmwareReload(String wlanIface, String mode) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); - mContext.enforceCallingOrSelfPermission(CHANGE_WIFI_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("softap", "fwreload", wlanIface, mode); } catch (NativeDaemonConnectorException e) { @@ -916,8 +912,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void stopAccessPoint(String wlanIface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); - mContext.enforceCallingOrSelfPermission(CHANGE_WIFI_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("softap", "stopap"); mConnector.execute("softap", "stop", wlanIface); @@ -929,8 +924,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setAccessPoint(WifiConfiguration wifiConfig, String wlanIface, String softapIface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); - mContext.enforceCallingOrSelfPermission(CHANGE_WIFI_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { if (wifiConfig == null) { mConnector.execute("softap", "set", wlanIface, softapIface); @@ -945,19 +939,19 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public NetworkStats getNetworkStatsSummary() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return mStatsFactory.readNetworkStatsSummary(); } @Override public NetworkStats getNetworkStatsDetail() { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return mStatsFactory.readNetworkStatsDetail(UID_ALL); } @Override public void setInterfaceQuota(String iface, long quotaBytes) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -980,7 +974,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void removeInterfaceQuota(String iface) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -1006,7 +1000,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceAlert(String iface, long alertBytes) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -1034,7 +1028,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void removeInterfaceAlert(String iface) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -1058,7 +1052,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setGlobalAlert(long alertBytes) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -1073,7 +1067,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setUidNetworkRules(int uid, boolean rejectOnQuotaInterfaces) { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); // silently discard when control disabled // TODO: eventually migrate to be always enabled @@ -1102,21 +1096,19 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public boolean isBandwidthControlEnabled() { - mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return mBandwidthControlEnabled; } @Override public NetworkStats getNetworkStatsUidDetail(int uid) { - if (Binder.getCallingUid() != uid) { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); - } + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return mStatsFactory.readNetworkStatsDetail(uid); } @Override public NetworkStats getNetworkStatsTethering(String[] ifacePairs) { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); if (ifacePairs.length % 2 != 0) { throw new IllegalArgumentException( @@ -1168,7 +1160,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setInterfaceThrottle(String iface, int rxKbps, int txKbps) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("interface", "setthrottle", iface, rxKbps, txKbps); } catch (NativeDaemonConnectorException e) { @@ -1177,8 +1169,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub } private int getInterfaceThrottle(String iface, boolean rx) { - mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); - final NativeDaemonEvent event; try { event = mConnector.execute("interface", "getthrottle", iface, rx ? "rx" : "tx"); @@ -1201,17 +1191,19 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public int getInterfaceRxThrottle(String iface) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return getInterfaceThrottle(iface, true); } @Override public int getInterfaceTxThrottle(String iface) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); return getInterfaceThrottle(iface, false); } @Override public void setDefaultInterfaceForDns(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("resolver", "setdefaultif", iface); } catch (NativeDaemonConnectorException e) { @@ -1221,7 +1213,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void setDnsServersForInterface(String iface, String[] servers) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final Command cmd = new Command("resolver", "setifdns", iface); for (String s : servers) { @@ -1240,7 +1232,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void flushDefaultDnsCache() { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("resolver", "flushdefaultif"); } catch (NativeDaemonConnectorException e) { @@ -1250,7 +1242,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void flushInterfaceDnsCache(String iface) { - mContext.enforceCallingOrSelfPermission(CHANGE_NETWORK_STATE, TAG); + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { mConnector.execute("resolver", "flushif", iface); } catch (NativeDaemonConnectorException e) { diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java index 16643ffc43fa..52087854c07b 100644 --- a/services/java/com/android/server/WifiService.java +++ b/services/java/com/android/server/WifiService.java @@ -61,6 +61,7 @@ import android.text.TextUtils; import android.util.Slog; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @@ -112,6 +113,10 @@ public class WifiService extends IWifiManager.Stub { private int mScanLocksAcquired; private int mScanLocksReleased; + /* A mapping from UID to scan count */ + private HashMap<Integer, Integer> mScanCount = + new HashMap<Integer, Integer>(); + private final List<Multicaster> mMulticasters = new ArrayList<Multicaster>(); private int mMulticastEnabled; @@ -152,8 +157,12 @@ public class WifiService extends IWifiManager.Stub { /* Wifi disabled due to airplane mode on */ private static final int WIFI_DISABLED_AIRPLANE_ON = 3; - private AtomicInteger mWifiState = new AtomicInteger(WIFI_DISABLED); + /* Persisted state that tracks the wifi & airplane interaction from settings */ + private AtomicInteger mPersistWifiState = new AtomicInteger(WIFI_DISABLED); + /* Tracks current airplane mode state */ private AtomicBoolean mAirplaneModeOn = new AtomicBoolean(false); + /* Tracks whether wifi is enabled from WifiStateMachine's perspective */ + private boolean mWifiEnabled; private boolean mIsReceiverRegistered = false; @@ -373,8 +382,8 @@ public class WifiService extends IWifiManager.Stub { mAirplaneModeOn.set(isAirplaneModeOn()); /* On airplane mode disable, restore wifi state if necessary */ if (!mAirplaneModeOn.get() && (testAndClearWifiSavedState() || - mWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE)) { - persistWifiEnabled(true); + mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE)) { + persistWifiState(true); } updateWifiState(); } @@ -391,7 +400,12 @@ public class WifiService extends IWifiManager.Stub { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) { - // reset & clear notification on any wifi state change + int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, + WifiManager.WIFI_STATE_DISABLED); + + mWifiEnabled = (wifiState == WifiManager.WIFI_STATE_ENABLED); + + // reset & clear notification on any wifi state change resetNotification(); } else if (intent.getAction().equals( WifiManager.NETWORK_STATE_CHANGED_ACTION)) { @@ -435,7 +449,7 @@ public class WifiService extends IWifiManager.Stub { */ public void checkAndStartWifi() { mAirplaneModeOn.set(isAirplaneModeOn()); - mWifiState.set(getPersistedWifiState()); + mPersistWifiState.set(getPersistedWifiState()); /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */ boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState(); Slog.i(TAG, "WifiService starting up with Wi-Fi " + @@ -472,29 +486,30 @@ public class WifiService extends IWifiManager.Stub { private boolean shouldWifiBeEnabled() { if (mAirplaneModeOn.get()) { - return mWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE; + return mPersistWifiState.get() == WIFI_ENABLED_AIRPLANE_OVERRIDE; } else { - return mWifiState.get() != WIFI_DISABLED; + return mPersistWifiState.get() != WIFI_DISABLED; } } - private void persistWifiEnabled(boolean enabled) { + private void persistWifiState(boolean enabled) { final ContentResolver cr = mContext.getContentResolver(); boolean airplane = mAirplaneModeOn.get() && isAirplaneToggleable(); if (enabled) { if (airplane) { - mWifiState.set(WIFI_ENABLED_AIRPLANE_OVERRIDE); + mPersistWifiState.set(WIFI_ENABLED_AIRPLANE_OVERRIDE); } else { - mWifiState.set(WIFI_ENABLED); + mPersistWifiState.set(WIFI_ENABLED); } } else { if (airplane) { - mWifiState.set(WIFI_DISABLED_AIRPLANE_ON); + mPersistWifiState.set(WIFI_DISABLED_AIRPLANE_ON); } else { - mWifiState.set(WIFI_DISABLED); + mPersistWifiState.set(WIFI_DISABLED); } } - Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, mWifiState.get()); + + Settings.Secure.putInt(cr, Settings.Secure.WIFI_ON, mPersistWifiState.get()); } @@ -517,6 +532,15 @@ public class WifiService extends IWifiManager.Stub { */ public void startScan(boolean forceActive) { enforceChangePermission(); + + int uid = Binder.getCallingUid(); + int count = 0; + synchronized (mScanCount) { + if (mScanCount.containsKey(uid)) { + count = mScanCount.get(uid); + } + mScanCount.put(uid, ++count); + } mWifiStateMachine.startScan(forceActive); } @@ -545,7 +569,6 @@ public class WifiService extends IWifiManager.Stub { */ public synchronized boolean setWifiEnabled(boolean enable) { enforceChangePermission(); - if (DBG) { Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n"); } @@ -559,16 +582,20 @@ public class WifiService extends IWifiManager.Stub { * Caller might not have WRITE_SECURE_SETTINGS, * only CHANGE_WIFI_STATE is enforced */ - long ident = Binder.clearCallingIdentity(); - persistWifiEnabled(enable); - Binder.restoreCallingIdentity(ident); + + /* Avoids overriding of airplane state when wifi is already in the expected state */ + if (enable != mWifiEnabled) { + long ident = Binder.clearCallingIdentity(); + persistWifiState(enable); + Binder.restoreCallingIdentity(ident); + } if (enable) { if (!mIsReceiverRegistered) { registerForBroadcasts(); mIsReceiverRegistered = true; } - } else if (mIsReceiverRegistered){ + } else if (mIsReceiverRegistered) { mContext.unregisterReceiver(mReceiver); mIsReceiverRegistered = false; } @@ -663,7 +690,12 @@ public class WifiService extends IWifiManager.Stub { */ public List<WifiConfiguration> getConfiguredNetworks() { enforceAccessPermission(); - return mWifiStateMachine.syncGetConfiguredNetworks(); + if (mWifiStateMachineChannel != null) { + return mWifiStateMachine.syncGetConfiguredNetworks(mWifiStateMachineChannel); + } else { + Slog.e(TAG, "mWifiStateMachineChannel is not initialized"); + return null; + } } /** @@ -840,7 +872,7 @@ public class WifiService extends IWifiManager.Stub { * of WifiLock & device idle status unless wifi enabled status is toggled */ - mWifiStateMachine.setDriverStart(true); + mWifiStateMachine.setDriverStart(true, mEmergencyCallbackMode); mWifiStateMachine.reconnectCommand(); } @@ -854,7 +886,7 @@ public class WifiService extends IWifiManager.Stub { * TODO: if a stop is issued, wifi is brought up only by startWifi * unless wifi enabled status is toggled */ - mWifiStateMachine.setDriverStart(false); + mWifiStateMachine.setDriverStart(false, mEmergencyCallbackMode); } @@ -972,6 +1004,13 @@ public class WifiService extends IWifiManager.Stub { } mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, mIdleIntent); } + + //Start scan stats tracking when device unplugged + if (pluggedType == 0) { + synchronized (mScanCount) { + mScanCount.clear(); + } + } mPluggedType = pluggedType; } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, @@ -1074,11 +1113,11 @@ public class WifiService extends IWifiManager.Stub { mWifiStateMachine.setWifiEnabled(true); mWifiStateMachine.setScanOnlyMode( strongestLockMode == WifiManager.WIFI_MODE_SCAN_ONLY); - mWifiStateMachine.setDriverStart(true); + mWifiStateMachine.setDriverStart(true, mEmergencyCallbackMode); mWifiStateMachine.setHighPerfModeEnabled(strongestLockMode == WifiManager.WIFI_MODE_FULL_HIGH_PERF); } else { - mWifiStateMachine.setDriverStart(false); + mWifiStateMachine.setDriverStart(false, mEmergencyCallbackMode); } } else { mWifiStateMachine.setWifiEnabled(false); @@ -1162,6 +1201,13 @@ public class WifiService extends IWifiManager.Stub { pw.println("Locks held:"); mLocks.dump(pw); + pw.println("Scan count since last plugged in"); + synchronized (mScanCount) { + for(int sc : mScanCount.keySet()) { + pw.println("UID: " + sc + " Scan count: " + mScanCount.get(sc)); + } + } + pw.println(); pw.println("WifiWatchdogStateMachine dump"); mWifiWatchdogStateMachine.dump(pw); diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index df58e83186ac..4067f6e40a5d 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -7945,6 +7945,7 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println(" p[rocesses] [PACKAGE_NAME]: process state"); pw.println(" o[om]: out of memory management"); pw.println(" prov[iders] [COMP_SPEC ...]: content provider state"); + pw.println(" provider [COMP_SPEC]: provider client-side state"); pw.println(" s[ervices] [COMP_SPEC ...]: service state"); pw.println(" service [COMP_SPEC]: service client-side state"); pw.println(" package [PACKAGE_NAME]: all state related to given package"); @@ -8027,6 +8028,23 @@ public final class ActivityManagerService extends ActivityManagerNative dumpOomLocked(fd, pw, args, opti, true); } return; + } else if ("provider".equals(cmd)) { + String[] newArgs; + String name; + if (opti >= args.length) { + name = null; + newArgs = EMPTY_STRING_ARRAY; + } else { + name = args[opti]; + opti++; + newArgs = new String[args.length - opti]; + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, args.length - opti); + } + if (!dumpProvider(fd, pw, name, newArgs, 0, dumpAll)) { + pw.println("No providers match: " + name); + pw.println("Use -h for help."); + } + return; } else if ("providers".equals(cmd) || "prov".equals(cmd)) { synchronized (this) { dumpProvidersLocked(fd, pw, args, opti, true, null); @@ -8611,6 +8629,110 @@ public final class ActivityManagerService extends ActivityManagerNative } } + /** + * There are three ways to call this: + * - no provider specified: dump all the providers + * - a flattened component name that matched an existing provider was specified as the + * first arg: dump that one provider + * - the first arg isn't the flattened component name of an existing provider: + * dump all providers whose component contains the first arg as a substring + */ + protected boolean dumpProvider(FileDescriptor fd, PrintWriter pw, String name, String[] args, + int opti, boolean dumpAll) { + ArrayList<ContentProviderRecord> providers = new ArrayList<ContentProviderRecord>(); + + if ("all".equals(name)) { + synchronized (this) { + for (ContentProviderRecord r1 : mProvidersByClass.values()) { + providers.add(r1); + } + } + } else { + ComponentName componentName = name != null + ? ComponentName.unflattenFromString(name) : null; + int objectId = 0; + if (componentName == null) { + // Not a '/' separated full component name; maybe an object ID? + try { + objectId = Integer.parseInt(name, 16); + name = null; + componentName = null; + } catch (RuntimeException e) { + } + } + + synchronized (this) { + for (ContentProviderRecord r1 : mProvidersByClass.values()) { + if (componentName != null) { + if (r1.name.equals(componentName)) { + providers.add(r1); + } + } else if (name != null) { + if (r1.name.flattenToString().contains(name)) { + providers.add(r1); + } + } else if (System.identityHashCode(r1) == objectId) { + providers.add(r1); + } + } + } + } + + if (providers.size() <= 0) { + return false; + } + + boolean needSep = false; + for (int i=0; i<providers.size(); i++) { + if (needSep) { + pw.println(); + } + needSep = true; + dumpProvider("", fd, pw, providers.get(i), args, dumpAll); + } + return true; + } + + /** + * Invokes IApplicationThread.dumpProvider() on the thread of the specified provider if + * there is a thread associated with the provider. + */ + private void dumpProvider(String prefix, FileDescriptor fd, PrintWriter pw, + final ContentProviderRecord r, String[] args, boolean dumpAll) { + String innerPrefix = prefix + " "; + synchronized (this) { + pw.print(prefix); pw.print("PROVIDER "); + pw.print(r); + pw.print(" pid="); + if (r.proc != null) pw.println(r.proc.pid); + else pw.println("(not running)"); + if (dumpAll) { + r.dump(pw, innerPrefix); + } + } + if (r.proc != null && r.proc.thread != null) { + pw.println(" Client:"); + pw.flush(); + try { + TransferPipe tp = new TransferPipe(); + try { + r.proc.thread.dumpProvider( + tp.getWriteFd().getFileDescriptor(), r.provider.asBinder(), args); + tp.setBufferPrefix(" "); + // Short timeout, since blocking here can + // deadlock with the application. + tp.go(fd, 2000); + } finally { + tp.kill(); + } + } catch (IOException ex) { + pw.println(" Failure while dumping the provider: " + ex); + } catch (RemoteException ex) { + pw.println(" Got a RemoteException while dumping the service"); + } + } + } + static class ItemMatcher { ArrayList<ComponentName> components; ArrayList<String> strings; @@ -8950,6 +9072,9 @@ public final class ActivityManagerService extends ActivityManagerNative return needSep; } + /** + * Prints a list of ServiceRecords (dumpsys activity services) + */ boolean dumpServicesLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) { boolean needSep = false; diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index b1551a6554f3..bc8ce7ddf651 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -118,7 +118,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { "192.168.48.2", "192.168.48.254", }; - private String[] mDnsServers; + private String[] mDefaultDnsServers; private static final String DNS_DEFAULT_SERVER1 = "8.8.8.8"; private static final String DNS_DEFAULT_SERVER2 = "8.8.4.4"; @@ -171,9 +171,9 @@ public class Tethering extends INetworkManagementEventObserver.Stub { updateConfiguration(); // TODO - remove and rely on real notifications of the current iface - mDnsServers = new String[2]; - mDnsServers[0] = DNS_DEFAULT_SERVER1; - mDnsServers[1] = DNS_DEFAULT_SERVER2; + mDefaultDnsServers = new String[2]; + mDefaultDnsServers[0] = DNS_DEFAULT_SERVER1; + mDefaultDnsServers[1] = DNS_DEFAULT_SERVER2; } void updateConfiguration() { @@ -1244,7 +1244,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } try { - mNMService.setDnsForwarders(mDnsServers); + mNMService.setDnsForwarders(mDefaultDnsServers); } catch (Exception e) { transitionTo(mSetDnsForwardersErrorState); return false; @@ -1320,7 +1320,19 @@ public class Tethering extends INetworkManagementEventObserver.Stub { try { linkProperties = mConnService.getLinkProperties(upType); } catch (RemoteException e) { } - if (linkProperties != null) iface = linkProperties.getInterfaceName(); + if (linkProperties != null) { + iface = linkProperties.getInterfaceName(); + String[] dnsServers = mDefaultDnsServers; + Collection<InetAddress> dnses = linkProperties.getDnses(); + if (dnses != null) { + dnsServers = NetworkUtils.makeStrings(dnses); + } + try { + mNMService.setDnsForwarders(dnsServers); + } catch (Exception e) { + transitionTo(mSetDnsForwardersErrorState); + } + } } notifyTetheredOfNewUpstreamIface(iface); } diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java index 55e067853372..72cf51253479 100644 --- a/services/java/com/android/server/connectivity/Vpn.java +++ b/services/java/com/android/server/connectivity/Vpn.java @@ -482,6 +482,7 @@ public class Vpn extends INetworkManagementEventObserver.Stub { if (state.exists()) { throw new IllegalStateException("Cannot delete the state"); } + new File("/data/misc/vpn/abort").delete(); // Check if we need to restart any of the daemons. boolean restart = false; diff --git a/services/java/com/android/server/location/ComprehensiveCountryDetector.java b/services/java/com/android/server/location/ComprehensiveCountryDetector.java index bb9e60f6e072..2d6a148012de 100755 --- a/services/java/com/android/server/location/ComprehensiveCountryDetector.java +++ b/services/java/com/android/server/location/ComprehensiveCountryDetector.java @@ -20,16 +20,19 @@ import android.content.Context; import android.location.Country; import android.location.CountryListener; import android.location.Geocoder; +import android.os.SystemClock; import android.provider.Settings; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.text.TextUtils; +import android.util.Log; import android.util.Slog; import java.util.Locale; import java.util.Timer; import java.util.TimerTask; +import java.util.concurrent.ConcurrentLinkedQueue; /** * This class is used to detect the country where the user is. The sources of @@ -55,10 +58,15 @@ import java.util.TimerTask; */ public class ComprehensiveCountryDetector extends CountryDetectorBase { - private final static String TAG = "ComprehensiveCountryDetector"; + private final static String TAG = "CountryDetector"; /* package */ static final boolean DEBUG = false; /** + * Max length of logs to maintain for debugging. + */ + private static final int MAX_LENGTH_DEBUG_LOGS = 20; + + /** * The refresh interval when the location based country was used */ private final static long LOCATION_REFRESH_INTERVAL = 1000 * 60 * 60 * 24; // 1 day @@ -66,26 +74,58 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { protected CountryDetectorBase mLocationBasedCountryDetector; protected Timer mLocationRefreshTimer; - private final int mPhoneType; private Country mCountry; - private TelephonyManager mTelephonyManager; + private final TelephonyManager mTelephonyManager; private Country mCountryFromLocation; private boolean mStopped = false; - private ServiceState mLastState; - private PhoneStateListener mPhoneStateListener = new PhoneStateListener() { - @Override - public void onServiceStateChanged(ServiceState serviceState) { - // TODO: Find out how often we will be notified, if this method is called too - // many times, let's consider querying the network. - Slog.d(TAG, "onServiceStateChanged"); - // We only care the state change - if (mLastState == null || mLastState.getState() != serviceState.getState()) { - detectCountry(true, true); - mLastState = new ServiceState(serviceState); - } - } - }; + private PhoneStateListener mPhoneStateListener; + + /** + * List of the most recent country state changes for debugging. This should have + * a max length of MAX_LENGTH_LOGS. + */ + private final ConcurrentLinkedQueue<Country> mDebugLogs = new ConcurrentLinkedQueue<Country>(); + + /** + * Most recent {@link Country} result that was added to the debug logs {@link #mDebugLogs}. + * We keep track of this value to help prevent adding many of the same {@link Country} objects + * to the logs. + */ + private Country mLastCountryAddedToLogs; + + /** + * Object used to synchronize access to {@link #mLastCountryAddedToLogs}. Be careful if + * using it to synchronize anything else in this file. + */ + private final Object mObject = new Object(); + + /** + * Start time of the current session for which the detector has been active. + */ + private long mStartTime; + + /** + * Stop time of the most recent session for which the detector was active. + */ + private long mStopTime; + + /** + * The sum of all the time intervals in which the detector was active. + */ + private long mTotalTime; + + /** + * Number of {@link PhoneStateListener#onServiceStateChanged(ServiceState state)} events that + * have occurred for the current session for which the detector has been active. + */ + private int mCountServiceStateChanges; + + /** + * Total number of {@link PhoneStateListener#onServiceStateChanged(ServiceState state)} events + * that have occurred for all time intervals in which the detector has been active. + */ + private int mTotalCountServiceStateChanges; /** * The listener for receiving the notification from LocationBasedCountryDetector. @@ -104,7 +144,6 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { public ComprehensiveCountryDetector(Context context) { super(context); mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); - mPhoneType = mTelephonyManager.getPhoneType(); } @Override @@ -115,6 +154,7 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { @Override public void stop() { + // Note: this method in this subclass called only by tests. Slog.i(TAG, "Stop the detector."); cancelLocationRefresh(); removePhoneStateListener(); @@ -138,17 +178,50 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { if (result == null) { result = getLocaleCountry(); } + addToLogs(result); return result; } /** + * Attempt to add this {@link Country} to the debug logs. + */ + private void addToLogs(Country country) { + if (country == null) { + return; + } + // If the country (ISO and source) are the same as before, then there is no + // need to add this country as another entry in the logs. Synchronize access to this + // variable since multiple threads could be calling this method. + synchronized (mObject) { + if (mLastCountryAddedToLogs != null && mLastCountryAddedToLogs.equals(country)) { + return; + } + mLastCountryAddedToLogs = country; + } + // Manually maintain a max limit for the list of logs + if (mDebugLogs.size() >= MAX_LENGTH_DEBUG_LOGS) { + mDebugLogs.poll(); + } + if (Log.isLoggable(TAG, Log.DEBUG)) { + Slog.d(TAG, country.toString()); + } + mDebugLogs.add(country); + } + + private boolean isNetworkCountryCodeAvailable() { + // On CDMA TelephonyManager.getNetworkCountryIso() just returns SIM country. We don't want + // to prioritize it over location based country, so ignore it. + final int phoneType = mTelephonyManager.getPhoneType(); + if (DEBUG) Slog.v(TAG, " phonetype=" + phoneType); + return phoneType == TelephonyManager.PHONE_TYPE_GSM; + } + + /** * @return the country from the mobile network. */ protected Country getNetworkBasedCountry() { String countryIso = null; - // TODO: The document says the result may be unreliable on CDMA networks. Shall we use - // it on CDMA phone? We may test the Android primarily used countries. - if (mPhoneType == TelephonyManager.PHONE_TYPE_GSM) { + if (isNetworkCountryCodeAvailable()) { countryIso = mTelephonyManager.getNetworkCountryIso(); if (!TextUtils.isEmpty(countryIso)) { return new Country(countryIso, Country.COUNTRY_SOURCE_NETWORK); @@ -226,9 +299,14 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { removePhoneStateListener(); stopLocationBasedDetector(); cancelLocationRefresh(); + mStopTime = SystemClock.elapsedRealtime(); + mTotalTime += mStopTime; } else if (prevListener == null) { addPhoneStateListener(); detectCountry(false, true); + mStartTime = SystemClock.elapsedRealtime(); + mStopTime = 0; + mCountServiceStateChanges = 0; } } @@ -316,9 +394,9 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { private void notifyIfCountryChanged(final Country country, final Country detectedCountry) { if (detectedCountry != null && mListener != null && (country == null || !country.equals(detectedCountry))) { - Slog.d(TAG, - "The country was changed from " + country != null ? country.getCountryIso() : - country + " to " + detectedCountry.getCountryIso()); + if (Log.isLoggable(TAG, Log.DEBUG)) { + Slog.d(TAG, "" + country + " --> " + detectedCountry); + } notifyListener(detectedCountry); } } @@ -356,20 +434,19 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { } protected synchronized void addPhoneStateListener() { - if (mPhoneStateListener == null && mPhoneType == TelephonyManager.PHONE_TYPE_GSM) { - mLastState = null; + if (mPhoneStateListener == null) { mPhoneStateListener = new PhoneStateListener() { @Override public void onServiceStateChanged(ServiceState serviceState) { - // TODO: Find out how often we will be notified, if this - // method is called too - // many times, let's consider querying the network. - Slog.d(TAG, "onServiceStateChanged"); - // We only care the state change - if (mLastState == null || mLastState.getState() != serviceState.getState()) { - detectCountry(true, true); - mLastState = new ServiceState(serviceState); + mCountServiceStateChanges++; + mTotalCountServiceStateChanges++; + + if (!isNetworkCountryCodeAvailable()) { + return; } + if (DEBUG) Slog.d(TAG, "onServiceStateChanged: " + serviceState.getState()); + + detectCountry(true, true); } }; mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE); @@ -386,4 +463,30 @@ public class ComprehensiveCountryDetector extends CountryDetectorBase { protected boolean isGeoCoderImplemented() { return Geocoder.isPresent(); } + + @Override + public String toString() { + long currentTime = SystemClock.elapsedRealtime(); + long currentSessionLength = 0; + StringBuilder sb = new StringBuilder(); + sb.append("ComprehensiveCountryDetector{"); + // The detector hasn't stopped yet --> still running + if (mStopTime == 0) { + currentSessionLength = currentTime - mStartTime; + sb.append("timeRunning=" + currentSessionLength + ", "); + } else { + // Otherwise, it has already stopped, so take the last session + sb.append("lastRunTimeLength=" + (mStopTime - mStartTime) + ", "); + } + sb.append("totalCountServiceStateChanges=" + mTotalCountServiceStateChanges + ", "); + sb.append("currentCountServiceStateChanges=" + mCountServiceStateChanges + ", "); + sb.append("totalTime=" + (mTotalTime + currentSessionLength) + ", "); + sb.append("currentTime=" + currentTime + ", "); + sb.append("countries="); + for (Country country : mDebugLogs) { + sb.append("\n " + country.toString()); + } + sb.append("}"); + return sb.toString(); + } } diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index 8c0f1e01f843..51adebef27e7 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -153,6 +153,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int VERSION_INIT = 1; private static final int VERSION_ADDED_SNOOZE = 2; private static final int VERSION_ADDED_RESTRICT_BACKGROUND = 3; + private static final int VERSION_ADDED_METERED = 4; private static final long KB_IN_BYTES = 1024; private static final long MB_IN_BYTES = KB_IN_BYTES * 1024; @@ -175,6 +176,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final String ATTR_WARNING_BYTES = "warningBytes"; private static final String ATTR_LIMIT_BYTES = "limitBytes"; private static final String ATTR_LAST_SNOOZE = "lastSnooze"; + private static final String ATTR_METERED = "metered"; private static final String ATTR_UID = "uid"; private static final String ATTR_POLICY = "policy"; @@ -819,9 +821,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } final boolean hasLimit = policy.limitBytes != LIMIT_DISABLED; - if (hasLimit) { + if (hasLimit || policy.metered) { final long quotaBytes; - if (policy.lastSnooze >= start) { + if (!hasLimit) { + // metered network, but no policy limit; we still need to + // restrict apps, so push really high quota. + quotaBytes = Long.MAX_VALUE; + } else if (policy.lastSnooze >= start) { // snoozing past quota, but we still need to restrict apps, // so push really high quota. quotaBytes = Long.MAX_VALUE; @@ -891,7 +897,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final NetworkTemplate template = buildTemplateMobileAll(subscriberId); mNetworkPolicy.put(template, new NetworkPolicy( - template, cycleDay, warningBytes, LIMIT_DISABLED, SNOOZE_NEVER)); + template, cycleDay, warningBytes, LIMIT_DISABLED, SNOOZE_NEVER, true)); writePolicyLocked(); } } @@ -935,11 +941,25 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { lastSnooze = SNOOZE_NEVER; } + final boolean metered; + if (version >= VERSION_ADDED_METERED) { + metered = readBooleanAttribute(in, ATTR_METERED); + } else { + switch (networkTemplate) { + case MATCH_MOBILE_3G_LOWER: + case MATCH_MOBILE_4G: + case MATCH_MOBILE_ALL: + metered = true; + break; + default: + metered = false; + } + } final NetworkTemplate template = new NetworkTemplate( networkTemplate, subscriberId); mNetworkPolicy.put(template, new NetworkPolicy( - template, cycleDay, warningBytes, limitBytes, lastSnooze)); + template, cycleDay, warningBytes, limitBytes, lastSnooze, metered)); } else if (TAG_UID_POLICY.equals(tag)) { final int uid = readIntAttribute(in, ATTR_UID); @@ -994,7 +1014,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.startDocument(null, true); out.startTag(null, TAG_POLICY_LIST); - writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_RESTRICT_BACKGROUND); + writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_METERED); writeBooleanAttribute(out, ATTR_RESTRICT_BACKGROUND, mRestrictBackground); // write all known network policies @@ -1011,6 +1031,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { writeLongAttribute(out, ATTR_WARNING_BYTES, policy.warningBytes); writeLongAttribute(out, ATTR_LIMIT_BYTES, policy.limitBytes); writeLongAttribute(out, ATTR_LAST_SNOOZE, policy.lastSnooze); + writeBooleanAttribute(out, ATTR_METERED, policy.metered); out.endTag(null, TAG_NETWORK_POLICY); } diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java index 871ed682e629..6a8267951603 100644 --- a/services/java/com/android/server/net/NetworkStatsService.java +++ b/services/java/com/android/server/net/NetworkStatsService.java @@ -268,6 +268,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } public void systemReady() { + if (!isBandwidthControlEnabled()) { + Slog.w(TAG, "bandwidth controls disabled, unable to track stats"); + return; + } + synchronized (mStatsLock) { // read historical network stats from disk, since policy service // might need them right away. we delay loading detailed UID stats @@ -543,7 +548,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // TODO: switch to data layer stats once kernel exports // for now, read network layer stats and flatten across all ifaces - final NetworkStats networkLayer = mNetworkManager.getNetworkStatsUidDetail(uid); + final long token = Binder.clearCallingIdentity(); + final NetworkStats networkLayer; + try { + networkLayer = mNetworkManager.getNetworkStatsUidDetail(uid); + } finally { + Binder.restoreCallingIdentity(token); + } + final NetworkStats dataLayer = new NetworkStats( networkLayer.getElapsedRealtime(), networkLayer.size()); @@ -1060,8 +1072,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } // clear UID from current stats snapshot - mLastPollUidSnapshot = mLastPollUidSnapshot.withoutUid(uid); - mLastPollNetworkXtSnapshot = computeNetworkXtSnapshotFromUid(mLastPollUidSnapshot); + if (mLastPollUidSnapshot != null) { + mLastPollUidSnapshot = mLastPollUidSnapshot.withoutUid(uid); + mLastPollNetworkXtSnapshot = computeNetworkXtSnapshotFromUid(mLastPollUidSnapshot); + } // clear kernel stats associated with UID resetKernelUidStats(uid); @@ -1644,6 +1658,15 @@ public class NetworkStatsService extends INetworkStatsService.Stub { return telephony.getSubscriberId(); } + private boolean isBandwidthControlEnabled() { + try { + return mNetworkManager.isBandwidthControlEnabled(); + } catch (RemoteException e) { + // ignored; service lives in system_server + return false; + } + } + /** * Key uniquely identifying a {@link NetworkStatsHistory} for a UID. */ diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index aa7bf2d1b7ce..75bda4155295 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -562,6 +562,33 @@ final class WindowState implements WindowManagerPolicy.WindowState { return mAttrs; } + public boolean getNeedsMenuLw(WindowManagerPolicy.WindowState bottom) { + int index = -1; + WindowState ws = this; + while (true) { + if ((ws.mAttrs.privateFlags + & WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY) != 0) { + return (ws.mAttrs.flags & WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0; + } + // If we reached the bottom of the range of windows we are considering, + // assume no menu is needed. + if (ws == bottom) { + return false; + } + // The current window hasn't specified whether menu key is needed; + // look behind it. + // First, we may need to determine the starting position. + if (index < 0) { + index = mService.mWindows.indexOf(ws); + } + index--; + if (index < 0) { + return false; + } + ws = mService.mWindows.get(index); + } + } + public int getSystemUiVisibility() { return mSystemUiVisibility; } diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index 7c61e9a0bc68..36a25677a8d2 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -434,7 +434,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-11-05T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 5, 1024L, 1024L, SNOOZE_NEVER); + sTemplateWifi, 5, 1024L, 1024L, SNOOZE_NEVER, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -445,7 +445,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-10-20T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 20, 1024L, 1024L, SNOOZE_NEVER); + sTemplateWifi, 20, 1024L, 1024L, SNOOZE_NEVER, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -456,7 +456,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-01-30T00:00:00.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER); + sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } @@ -467,14 +467,14 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { final long expectedCycle = parseTime("2007-02-28T23:59:59.000Z"); final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER); + sTemplateWifi, 30, 1024L, 1024L, SNOOZE_NEVER, false); final long actualCycle = computeLastCycleBoundary(currentTime, policy); assertTimeEquals(expectedCycle, actualCycle); } public void testNextCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER); + sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, false); final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); // walk forwards, ensuring that cycle boundaries don't get stuck @@ -489,7 +489,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { public void testLastCycleSane() throws Exception { final NetworkPolicy policy = new NetworkPolicy( - sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER); + sTemplateWifi, 31, WARNING_DISABLED, LIMIT_DISABLED, SNOOZE_NEVER, false); final LinkedHashSet<Long> seen = new LinkedHashSet<Long>(); // walk backwards, ensuring that cycle boundaries look sane @@ -547,7 +547,7 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { replay(); setNetworkPolicies(new NetworkPolicy( - sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, SNOOZE_NEVER)); + sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, SNOOZE_NEVER, false)); future.get(); verifyAndReset(); } @@ -604,8 +604,9 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { future = expectMeteredIfacesChanged(); replay(); - setNetworkPolicies(new NetworkPolicy( - sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, SNOOZE_NEVER)); + setNetworkPolicies( + new NetworkPolicy(sTemplateWifi, CYCLE_DAY, 1 * MB_IN_BYTES, 2 * MB_IN_BYTES, + SNOOZE_NEVER, false)); future.get(); verifyAndReset(); } @@ -704,6 +705,45 @@ public class NetworkPolicyManagerServiceTest extends AndroidTestCase { } } + public void testMeteredNetworkWithoutLimit() throws Exception { + NetworkState[] state = null; + NetworkStats stats = null; + Future<Void> future; + Future<String> tagFuture; + + final long TIME_FEB_15 = 1171497600000L; + final long TIME_MAR_10 = 1173484800000L; + final int CYCLE_DAY = 15; + + setCurrentTimeMillis(TIME_MAR_10); + + // bring up wifi network with metered policy + state = new NetworkState[] { buildWifi() }; + stats = new NetworkStats(getElapsedRealtime(), 1) + .addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L); + + { + expectCurrentTime(); + expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce(); + expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis())) + .andReturn(stats).atLeastOnce(); + expectPolicyDataEnable(TYPE_WIFI, true); + + expectRemoveInterfaceQuota(TEST_IFACE); + expectSetInterfaceQuota(TEST_IFACE, Long.MAX_VALUE); + + expectClearNotifications(); + future = expectMeteredIfacesChanged(TEST_IFACE); + + replay(); + setNetworkPolicies( + new NetworkPolicy(sTemplateWifi, CYCLE_DAY, WARNING_DISABLED, LIMIT_DISABLED, + SNOOZE_NEVER, true)); + future.get(); + verifyAndReset(); + } + } + private static long parseTime(String time) { final Time result = new Time(); result.parse3339(time); diff --git a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java index fbc171b71c87..90b5a2ee57f0 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkStatsServiceTest.java @@ -802,6 +802,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase { mNetManager.setGlobalAlert(anyLong()); expectLastCall().atLeastOnce(); + + expect(mNetManager.isBandwidthControlEnabled()).andReturn(true).atLeastOnce(); } private void expectNetworkState(NetworkState... state) throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/location/LocationBasedCountryDetectorTest.java b/services/tests/servicestests/src/com/android/server/location/LocationBasedCountryDetectorTest.java index 60677dff0d8d..5f5d6684f383 100755 --- a/services/tests/servicestests/src/com/android/server/location/LocationBasedCountryDetectorTest.java +++ b/services/tests/servicestests/src/com/android/server/location/LocationBasedCountryDetectorTest.java @@ -213,7 +213,7 @@ public class LocationBasedCountryDetectorTest extends AndroidTestCase { // QueryThread should be set to NULL assertNull(detector.getQueryThread()); assertTrue(countryListener.notified()); - assertEquals(countryListener.getCountry(), country); + assertEquals("us", countryListener.getCountry().toLowerCase()); } public void testFindingCountryCancelled() { @@ -238,7 +238,7 @@ public class LocationBasedCountryDetectorTest extends AndroidTestCase { // QueryThread should be set to NULL assertNull(detector.getQueryThread()); assertTrue(countryListener.notified()); - assertEquals(countryListener.getCountry(), country); + assertEquals("us", countryListener.getCountry().toLowerCase()); } public void testFindingLocationCancelled() { @@ -339,7 +339,7 @@ public class LocationBasedCountryDetectorTest extends AndroidTestCase { assertNull(detector.getQueryThread()); // CountryListener should be notified assertTrue(countryListener.notified()); - assertEquals(countryListener.getCountry(), country); + assertEquals("us", countryListener.getCountry().toLowerCase()); } private void waitForTimerReset(TestCountryDetector detector) { diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java index 4ed42b423f31..0dceafe73520 100644 --- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java +++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBench.java @@ -95,8 +95,10 @@ public class RsBench extends Activity { switch (item.getItemId()) { case R.id.benchmark_all: mView.setBenchmarkMode(-1); + mView.suspendRendering(false); return true; case R.id.benchmark_one: + mView.suspendRendering(true); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Pick a Test"); builder.setItems(mView.getTestNames(), @@ -106,11 +108,13 @@ public class RsBench extends Activity { "Starting to benchmark: " + mView.getTestNames()[item], Toast.LENGTH_SHORT).show(); mView.setBenchmarkMode(item); + mView.suspendRendering(false); } }); builder.show(); return true; case R.id.debug_mode: + mView.suspendRendering(true); AlertDialog.Builder debugBuilder = new AlertDialog.Builder(this); debugBuilder.setTitle("Pick a Test"); debugBuilder.setItems(mView.getTestNames(), @@ -120,6 +124,7 @@ public class RsBench extends Activity { "Switching to: " + mView.getTestNames()[item], Toast.LENGTH_SHORT).show(); mView.setDebugMode(item); + mView.suspendRendering(false); } }); debugBuilder.show(); diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java index 8c67026135ba..4ac7dd5a9b70 100644 --- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java +++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchRS.java @@ -266,6 +266,10 @@ public class RsBenchRS { mScript.invoke_setBenchmarkMode(benchNum); } + public void pause(boolean pause) { + mScript.set_gPauseRendering(pause); + } + private void initRS() { mScript = new ScriptC_rsbench(mRS, mRes, R.raw.rsbench); diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java index 004e6bf4131f..124071e59590 100644 --- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java +++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/RsBenchView.java @@ -92,6 +92,10 @@ public class RsBenchView extends RSSurfaceView { mRender.setBenchmarkMode(benchNum); } + void suspendRendering(boolean pause) { + mRender.pause(pause); + } + void setDebugMode(int num) { mRender.setDebugMode(num); } diff --git a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs index cb15449a6874..27e5b114bdc2 100644 --- a/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs +++ b/tests/RenderScriptTests/PerfTest/src/com/android/perftest/rsbench.rs @@ -51,6 +51,7 @@ typedef struct TestScripts_s { TestScripts *gTestScripts; bool gLoadComplete = false; +bool gPauseRendering = false; static float gDt = 0; @@ -257,6 +258,10 @@ int root(void) { return 1; } + if (gPauseRendering) { + rsgDrawText("Paused", 50, 50); + return 30; + } if (gIsDebugMode) { debug(); } else { diff --git a/tests/TileBenchmark/res/layout/main.xml b/tests/TileBenchmark/res/layout/main.xml index 577c466e3847..1b39d5d1a4aa 100644 --- a/tests/TileBenchmark/res/layout/main.xml +++ b/tests/TileBenchmark/res/layout/main.xml @@ -18,46 +18,52 @@ android:layout_width="match_parent" android:layout_height="match_parent" > - <LinearLayout - android:id="@+id/top" - android:layout_width="match_parent" + <HorizontalScrollView + android:id="@+id/horizontalScrollView" + android:layout_width="wrap_content" android:layout_height="wrap_content" > - <Spinner - android:id="@+id/movement" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:prompt="@string/movement_method" - /> - <Spinner - android:id="@+id/velocity" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:gravity="center_horizontal" - android:prompt="@string/desired_scroll_velocity" - /> - <ToggleButton - android:id="@+id/capture" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textOn="@string/capture_stop" - android:textOff="@string/capture_start" - /> - <EditText - android:id="@+id/url" - android:layout_width="0dip" - android:layout_height="wrap_content" - android:inputType="textUri" - android:imeOptions="actionGo" - android:layout_weight="1" - /> - <Button - android:id="@+id/inspect" - android:layout_width="wrap_content" + <LinearLayout + android:id="@+id/top" + android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/inspect_log" - /> - </LinearLayout> + > + <Spinner + android:id="@+id/movement" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:prompt="@string/movement_method" + /> + <Spinner + android:id="@+id/velocity" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:prompt="@string/desired_scroll_velocity" + /> + <ToggleButton + android:id="@+id/capture" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textOn="@string/capture_stop" + android:textOff="@string/capture_start" + /> + <EditText + android:id="@+id/url" + android:layout_width="400dp" + android:layout_height="wrap_content" + android:inputType="textUri" + android:imeOptions="actionGo|flagNoExtractUi" + android:layout_weight="1" + /> + <Button + android:id="@+id/inspect" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/inspect_log" + /> + </LinearLayout> + </HorizontalScrollView> <com.test.tilebenchmark.ProfiledWebView android:id="@+id/web" android:layout_width="match_parent" diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java index e7a21ad8437d..d38d006f1546 100644 --- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java +++ b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfileActivity.java @@ -276,6 +276,7 @@ public class ProfileActivity extends Activity { settings.setEnableSmoothTransition(true); settings.setBuiltInZoomControls(true); settings.setLoadWithOverviewMode(true); + settings.setProperty("use_minimal_memory", "false"); // prefetch tiles, as browser does mWeb.setWebViewClient(new LoggingWebViewClient()); // URL text entry diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java index 10802b449d03..83f166844d13 100644 --- a/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java +++ b/tests/TileBenchmark/src/com/test/tilebenchmark/ProfiledWebView.java @@ -33,8 +33,7 @@ public class ProfiledWebView extends WebView { private ProfileCallback mCallback; private long mContentInvalMillis; private boolean mHadToBeForced = false; - private int mTestCount = 0; - private static final int LOAD_STALL_MILLIS = 5000; // nr of millis after load, + private static final int LOAD_STALL_MILLIS = 2000; // nr of millis after load, // before test is forced public ProfiledWebView(Context context) { @@ -76,13 +75,6 @@ public class ProfiledWebView extends WebView { mIsScrolling = autoScrolling; mCallback = callback; mIsTesting = false; - mContentInvalMillis = System.currentTimeMillis(); - registerPageSwapCallback(); - contentInvalidateAll(); - invalidate(); - - mTestCount++; - final int testCount = mTestCount; if (autoScrolling) { // after a while, force it to start even if the pages haven't swapped @@ -93,13 +85,12 @@ public class ProfiledWebView extends WebView { @Override public void onFinish() { - if (testCount == mTestCount && !mIsTesting) { - mHadToBeForced = true; - Log.d("ProfiledWebView", "num " + testCount - + " forcing a page swap with a scroll..."); - scrollBy(0, 1); - invalidate(); // ensure a redraw so that auto-scrolling can occur - } + // invalidate all content, and kick off redraw + registerPageSwapCallback(); + discardAllTextures(); + invalidate(); + + mContentInvalMillis = System.currentTimeMillis(); } }.start(); } diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java index 568a48500d28..d34541195d40 100644 --- a/wifi/java/android/net/wifi/WifiConfigStore.java +++ b/wifi/java/android/net/wifi/WifiConfigStore.java @@ -22,6 +22,7 @@ import android.net.DhcpInfoInternal; import android.net.LinkAddress; import android.net.LinkProperties; import android.net.NetworkUtils; +import android.net.NetworkInfo.DetailedState; import android.net.ProxyProperties; import android.net.RouteInfo; import android.net.wifi.WifiConfiguration.IpAssignment; @@ -31,6 +32,9 @@ import android.net.wifi.WifiConfiguration.Status; import android.net.wifi.NetworkUpdateResult; import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; import android.os.Environment; +import android.os.Message; +import android.os.Handler; +import android.os.HandlerThread; import android.text.TextUtils; import android.util.Log; @@ -50,6 +54,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; /** * This class provides the API to manage configured @@ -136,6 +141,13 @@ class WifiConfigStore { private static final String EXCLUSION_LIST_KEY = "exclusionList"; private static final String EOS = "eos"; + private static HandlerThread sDiskWriteHandlerThread; + private static DiskWriteHandler sDiskWriteHandler; + private static Object sDiskWriteHandlerSync = new Object(); + /* Tracks multiple writes on the same thread */ + private static int sWriteSequence = 0; + private static final int WRITE = 1; + /** * Initialize context, fetch the list of configured networks * and enable all stored networks in supplicant. @@ -153,10 +165,8 @@ class WifiConfigStore { */ static List<WifiConfiguration> getConfiguredNetworks() { List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); - synchronized (sConfiguredNetworks) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { - networks.add(new WifiConfiguration(config)); - } + for(WifiConfiguration config : sConfiguredNetworks.values()) { + networks.add(new WifiConfiguration(config)); } return networks; } @@ -167,15 +177,13 @@ class WifiConfigStore { */ static void enableAllNetworks() { boolean networkEnabledStateChanged = false; - synchronized (sConfiguredNetworks) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { - if(config != null && config.status == Status.DISABLED) { - if(WifiNative.enableNetworkCommand(config.networkId, false)) { - networkEnabledStateChanged = true; - config.status = Status.ENABLED; - } else { - loge("Enable network failed on " + config.networkId); - } + for(WifiConfiguration config : sConfiguredNetworks.values()) { + if(config != null && config.status == Status.DISABLED) { + if(WifiNative.enableNetworkCommand(config.networkId, false)) { + networkEnabledStateChanged = true; + config.status = Status.ENABLED; + } else { + loge("Enable network failed on " + config.networkId); } } } @@ -226,12 +234,10 @@ class WifiConfigStore { static void selectNetwork(int netId) { // Reset the priority of each network at start or if it goes too high. if (sLastPriority == -1 || sLastPriority > 1000000) { - synchronized (sConfiguredNetworks) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { - if (config.networkId != INVALID_NETWORK_ID) { - config.priority = 0; - addOrUpdateNetworkNative(config); - } + for(WifiConfiguration config : sConfiguredNetworks.values()) { + if (config.networkId != INVALID_NETWORK_ID) { + config.priority = 0; + addOrUpdateNetworkNative(config); } } sLastPriority = 0; @@ -264,15 +270,31 @@ class WifiConfigStore { /* enable a new network */ if (newNetwork && netId != INVALID_NETWORK_ID) { WifiNative.enableNetworkCommand(netId, false); - synchronized (sConfiguredNetworks) { - sConfiguredNetworks.get(netId).status = Status.ENABLED; - } + sConfiguredNetworks.get(netId).status = Status.ENABLED; } WifiNative.saveConfigCommand(); sendConfiguredNetworksChangedBroadcast(); return result; } + static void updateStatus(int netId, DetailedState state) { + if (netId != INVALID_NETWORK_ID) { + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config == null) return; + switch (state) { + case CONNECTED: + config.status = Status.CURRENT; + break; + case DISCONNECTED: + config.status = Status.ENABLED; + break; + default: + //do nothing, retain the existing state + break; + } + } + } + /** * Forget the specified network and save config * @@ -281,12 +303,10 @@ class WifiConfigStore { static void forgetNetwork(int netId) { if (WifiNative.removeNetworkCommand(netId)) { WifiNative.saveConfigCommand(); - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) { - sConfiguredNetworks.remove(netId); - sNetworkIds.remove(configKey(config)); - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) { + sConfiguredNetworks.remove(netId); + sNetworkIds.remove(configKey(config)); } writeIpAndProxyConfigurations(); sendConfiguredNetworksChangedBroadcast(); @@ -319,13 +339,11 @@ class WifiConfigStore { */ static boolean removeNetwork(int netId) { boolean ret = WifiNative.removeNetworkCommand(netId); - synchronized (sConfiguredNetworks) { - if (ret) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) { - sConfiguredNetworks.remove(netId); - sNetworkIds.remove(configKey(config)); - } + if (ret) { + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) { + sConfiguredNetworks.remove(netId); + sNetworkIds.remove(configKey(config)); } } sendConfiguredNetworksChangedBroadcast(); @@ -349,10 +367,8 @@ class WifiConfigStore { static boolean enableNetworkWithoutBroadcast(int netId, boolean disableOthers) { boolean ret = WifiNative.enableNetworkCommand(netId, disableOthers); - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) config.status = Status.ENABLED; - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) config.status = Status.ENABLED; if (disableOthers) { markAllNetworksDisabledExcept(netId); @@ -375,13 +391,11 @@ class WifiConfigStore { */ static boolean disableNetwork(int netId, int reason) { boolean ret = WifiNative.disableNetworkCommand(netId); - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - /* Only change the reason if the network was not previously disabled */ - if (config != null && config.status != Status.DISABLED) { - config.status = Status.DISABLED; - config.disableReason = reason; - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + /* Only change the reason if the network was not previously disabled */ + if (config != null && config.status != Status.DISABLED) { + config.status = Status.DISABLED; + config.disableReason = reason; } sendConfiguredNetworksChangedBroadcast(); return ret; @@ -450,10 +464,8 @@ class WifiConfigStore { * Fetch the link properties for a given network id */ static LinkProperties getLinkProperties(int netId) { - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) return new LinkProperties(config.linkProperties); - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) return new LinkProperties(config.linkProperties); return null; } @@ -493,15 +505,13 @@ class WifiConfigStore { static void setIpConfiguration(int netId, DhcpInfoInternal dhcpInfo) { LinkProperties linkProperties = dhcpInfo.makeLinkProperties(); - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) { - // add old proxy details - if(config.linkProperties != null) { - linkProperties.setHttpProxy(config.linkProperties.getHttpProxy()); - } - config.linkProperties = linkProperties; + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) { + // add old proxy details + if(config.linkProperties != null) { + linkProperties.setHttpProxy(config.linkProperties.getHttpProxy()); } + config.linkProperties = linkProperties; } } @@ -509,14 +519,12 @@ class WifiConfigStore { * clear IP configuration for a given network id */ static void clearIpConfiguration(int netId) { - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null && config.linkProperties != null) { - // Clear everything except proxy - ProxyProperties proxy = config.linkProperties.getHttpProxy(); - config.linkProperties.clear(); - config.linkProperties.setHttpProxy(proxy); - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null && config.linkProperties != null) { + // Clear everything except proxy + ProxyProperties proxy = config.linkProperties.getHttpProxy(); + config.linkProperties.clear(); + config.linkProperties.setHttpProxy(proxy); } } @@ -536,11 +544,9 @@ class WifiConfigStore { * Return if the specified network is using static IP */ static boolean isUsingStaticIp(int netId) { - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null && config.ipAssignment == IpAssignment.STATIC) { - return true; - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null && config.ipAssignment == IpAssignment.STATIC) { + return true; } return false; } @@ -555,67 +561,62 @@ class WifiConfigStore { String listStr = WifiNative.listNetworksCommand(); sLastPriority = 0; - synchronized (sConfiguredNetworks) { - sConfiguredNetworks.clear(); - sNetworkIds.clear(); + sConfiguredNetworks.clear(); + sNetworkIds.clear(); - if (listStr == null) - return; + if (listStr == null) + return; - String[] lines = listStr.split("\n"); - // Skip the first line, which is a header - for (int i = 1; i < lines.length; i++) { - String[] result = lines[i].split("\t"); - // network-id | ssid | bssid | flags - WifiConfiguration config = new WifiConfiguration(); - try { - config.networkId = Integer.parseInt(result[0]); - } catch(NumberFormatException e) { - continue; - } - if (result.length > 3) { - if (result[3].indexOf("[CURRENT]") != -1) - config.status = WifiConfiguration.Status.CURRENT; - else if (result[3].indexOf("[DISABLED]") != -1) - config.status = WifiConfiguration.Status.DISABLED; - else - config.status = WifiConfiguration.Status.ENABLED; - } else { + String[] lines = listStr.split("\n"); + // Skip the first line, which is a header + for (int i = 1; i < lines.length; i++) { + String[] result = lines[i].split("\t"); + // network-id | ssid | bssid | flags + WifiConfiguration config = new WifiConfiguration(); + try { + config.networkId = Integer.parseInt(result[0]); + } catch(NumberFormatException e) { + continue; + } + if (result.length > 3) { + if (result[3].indexOf("[CURRENT]") != -1) + config.status = WifiConfiguration.Status.CURRENT; + else if (result[3].indexOf("[DISABLED]") != -1) + config.status = WifiConfiguration.Status.DISABLED; + else config.status = WifiConfiguration.Status.ENABLED; - } - readNetworkVariables(config); - if (config.priority > sLastPriority) { - sLastPriority = config.priority; - } - sConfiguredNetworks.put(config.networkId, config); - sNetworkIds.put(configKey(config), config.networkId); + } else { + config.status = WifiConfiguration.Status.ENABLED; + } + readNetworkVariables(config); + if (config.priority > sLastPriority) { + sLastPriority = config.priority; } + sConfiguredNetworks.put(config.networkId, config); + sNetworkIds.put(configKey(config), config.networkId); } + readIpAndProxyConfigurations(); sendConfiguredNetworksChangedBroadcast(); } static void updateIpAndProxyFromWpsConfig(int netId, WpsInfo wpsConfig) { - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get(netId); - if (config != null) { - config.ipAssignment = wpsConfig.ipAssignment; - config.proxySettings = wpsConfig.proxySettings; - config.linkProperties = wpsConfig.linkProperties; - writeIpAndProxyConfigurations(); - } + WifiConfiguration config = sConfiguredNetworks.get(netId); + if (config != null) { + config.ipAssignment = wpsConfig.ipAssignment; + config.proxySettings = wpsConfig.proxySettings; + config.linkProperties = wpsConfig.linkProperties; + writeIpAndProxyConfigurations(); } } /* Mark all networks except specified netId as disabled */ private static void markAllNetworksDisabledExcept(int netId) { - synchronized (sConfiguredNetworks) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { - if(config != null && config.networkId != netId) { - if (config.status != Status.DISABLED) { - config.status = Status.DISABLED; - config.disableReason = WifiConfiguration.DISABLED_UNKNOWN_REASON; - } + for(WifiConfiguration config : sConfiguredNetworks.values()) { + if(config != null && config.networkId != netId) { + if (config.status != Status.DISABLED) { + config.status = Status.DISABLED; + config.disableReason = WifiConfiguration.DISABLED_UNKNOWN_REASON; } } } @@ -627,15 +628,46 @@ class WifiConfigStore { private static void writeIpAndProxyConfigurations() { - DataOutputStream out = null; - try { - out = new DataOutputStream(new BufferedOutputStream( - new FileOutputStream(ipConfigFile))); + /* Make a copy */ + List<WifiConfiguration> networks = new ArrayList<WifiConfiguration>(); + for(WifiConfiguration config : sConfiguredNetworks.values()) { + networks.add(new WifiConfiguration(config)); + } + + /* Do a delayed write to disk on a seperate handler thread */ + synchronized (sDiskWriteHandlerSync) { + if (++sWriteSequence == 1) { + sDiskWriteHandlerThread = new HandlerThread("WifiConfigThread"); + sDiskWriteHandlerThread.start(); + sDiskWriteHandler = new DiskWriteHandler(sDiskWriteHandlerThread.getLooper()); + } + } + + sDiskWriteHandler.sendMessage(Message.obtain(sDiskWriteHandler, WRITE, networks)); + } + + private static class DiskWriteHandler extends Handler { + + DiskWriteHandler(android.os.Looper l) { + super(l); + } - out.writeInt(IPCONFIG_FILE_VERSION); + public void handleMessage(Message msg) { - synchronized (sConfiguredNetworks) { - for(WifiConfiguration config : sConfiguredNetworks.values()) { + if (msg.what != WRITE) { + throw new RuntimeException("Unsupported message in WifiConfigStore: " + msg); + } + + List<WifiConfiguration> networks = (List<WifiConfiguration>) msg.obj; + + DataOutputStream out = null; + try { + out = new DataOutputStream(new BufferedOutputStream( + new FileOutputStream(ipConfigFile))); + + out.writeInt(IPCONFIG_FILE_VERSION); + + for(WifiConfiguration config : networks) { boolean writeToFile = false; try { @@ -720,17 +752,26 @@ class WifiConfigStore { } out.writeUTF(EOS); } - } - } catch (IOException e) { - loge("Error writing data file"); - } finally { - if (out != null) { - try { - out.close(); - } catch (Exception e) {} + } catch (IOException e) { + loge("Error writing data file"); + } finally { + if (out != null) { + try { + out.close(); + } catch (Exception e) {} + } + + //Quit if no more writes sent + synchronized (sDiskWriteHandlerSync) { + if (--sWriteSequence == 0) { + getLooper().quit(); + sDiskWriteHandlerThread = null; + sDiskWriteHandler= null; + } + } } - } + } } private static void readIpAndProxyConfigurations() { @@ -806,44 +847,42 @@ class WifiConfigStore { } while (true); if (id != -1) { - synchronized (sConfiguredNetworks) { - WifiConfiguration config = sConfiguredNetworks.get( - sNetworkIds.get(id)); + WifiConfiguration config = sConfiguredNetworks.get( + sNetworkIds.get(id)); - if (config == null) { - loge("configuration found for missing network, ignored"); - } else { - config.linkProperties = linkProperties; - switch (ipAssignment) { - case STATIC: - case DHCP: - config.ipAssignment = ipAssignment; - break; - case UNASSIGNED: - //Ignore - break; - default: - loge("Ignore invalid ip assignment while reading"); - break; - } + if (config == null) { + loge("configuration found for missing network, ignored"); + } else { + config.linkProperties = linkProperties; + switch (ipAssignment) { + case STATIC: + case DHCP: + config.ipAssignment = ipAssignment; + break; + case UNASSIGNED: + //Ignore + break; + default: + loge("Ignore invalid ip assignment while reading"); + break; + } - switch (proxySettings) { - case STATIC: - config.proxySettings = proxySettings; - ProxyProperties proxyProperties = - new ProxyProperties(proxyHost, proxyPort, exclusionList); - linkProperties.setHttpProxy(proxyProperties); - break; - case NONE: - config.proxySettings = proxySettings; - break; - case UNASSIGNED: - //Ignore - break; - default: - loge("Ignore invalid proxy settings while reading"); - break; - } + switch (proxySettings) { + case STATIC: + config.proxySettings = proxySettings; + ProxyProperties proxyProperties = + new ProxyProperties(proxyHost, proxyPort, exclusionList); + linkProperties.setHttpProxy(proxyProperties); + break; + case NONE: + config.proxySettings = proxySettings; + break; + case UNASSIGNED: + //Ignore + break; + default: + loge("Ignore invalid proxy settings while reading"); + break; } } } else { @@ -1061,10 +1100,7 @@ class WifiConfigStore { * when written. For example, wep key is stored as * irrespective * of the value sent to the supplicant */ - WifiConfiguration sConfig; - synchronized (sConfiguredNetworks) { - sConfig = sConfiguredNetworks.get(netId); - } + WifiConfiguration sConfig = sConfiguredNetworks.get(netId); if (sConfig == null) { sConfig = new WifiConfiguration(); sConfig.networkId = netId; @@ -1072,10 +1108,8 @@ class WifiConfigStore { readNetworkVariables(sConfig); - synchronized (sConfiguredNetworks) { - sConfiguredNetworks.put(netId, sConfig); - sNetworkIds.put(configKey(sConfig), netId); - } + sConfiguredNetworks.put(netId, sConfig); + sNetworkIds.put(configKey(sConfig), netId); NetworkUpdateResult result = writeIpAndProxyConfigurationsOnChange(sConfig, config); result.setNetworkId(netId); diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java index d5b404e6c799..7bb927b96ee0 100644 --- a/wifi/java/android/net/wifi/WifiInfo.java +++ b/wifi/java/android/net/wifi/WifiInfo.java @@ -70,7 +70,6 @@ public class WifiInfo implements Parcelable { private InetAddress mIpAddress; private String mMacAddress; - private boolean mExplicitConnect; WifiInfo() { mSSID = null; @@ -80,7 +79,6 @@ public class WifiInfo implements Parcelable { mRssi = -9999; mLinkSpeed = -1; mHiddenSSID = false; - mExplicitConnect = false; } /** @@ -98,7 +96,6 @@ public class WifiInfo implements Parcelable { mLinkSpeed = source.mLinkSpeed; mIpAddress = source.mIpAddress; mMacAddress = source.mMacAddress; - mExplicitConnect = source.mExplicitConnect; } } @@ -175,22 +172,6 @@ public class WifiInfo implements Parcelable { mNetworkId = id; } - - /** - * @hide - */ - public boolean isExplicitConnect() { - return mExplicitConnect; - } - - /** - * @hide - */ - public void setExplicitConnect(boolean explicitConnect) { - this.mExplicitConnect = explicitConnect; - } - - /** * Each configured network has a unique small integer ID, used to identify * the network when performing operations on the supplicant. This method @@ -279,8 +260,7 @@ public class WifiInfo implements Parcelable { append(mSupplicantState == null ? none : mSupplicantState). append(", RSSI: ").append(mRssi). append(", Link speed: ").append(mLinkSpeed). - append(", Net ID: ").append(mNetworkId). - append(", Explicit connect: ").append(mExplicitConnect); + append(", Net ID: ").append(mNetworkId); return sb.toString(); } @@ -304,7 +284,6 @@ public class WifiInfo implements Parcelable { dest.writeString(getSSID()); dest.writeString(mBSSID); dest.writeString(mMacAddress); - dest.writeByte(mExplicitConnect ? (byte)1 : (byte)0); mSupplicantState.writeToParcel(dest, flags); } @@ -324,7 +303,6 @@ public class WifiInfo implements Parcelable { info.setSSID(in.readString()); info.mBSSID = in.readString(); info.mMacAddress = in.readString(); - info.mExplicitConnect = in.readByte() == 1 ? true : false; info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in); return info; } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 40ac2a05597c..1a0e0dad5f85 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -413,6 +413,13 @@ public class WifiManager { private static final int MAX_RSSI = -55; /** + * Number of RSSI levels used in the framework to initiate + * {@link #RSSI_CHANGED_ACTION} broadcast + * @hide + */ + public static final int RSSI_LEVELS = 5; + + /** * Auto settings in the driver. The driver could choose to operate on both * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band. * @hide diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index ae8f4661dde9..71d7c01e52de 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -276,6 +276,8 @@ public class WifiStateMachine extends StateMachine { static final int CMD_CLEAR_BLACKLIST = BASE + 58; /* Save configuration */ static final int CMD_SAVE_CONFIG = BASE + 59; + /* Get configured networks*/ + static final int CMD_GET_CONFIGURED_NETWORKS = BASE + 60; /* Supplicant commands after driver start*/ /* Initiate a scan */ @@ -368,6 +370,10 @@ public class WifiStateMachine extends StateMachine { private static final int SUCCESS = 1; private static final int FAILURE = -1; + /* Phone in emergency call back mode */ + private static final int IN_ECM_STATE = 1; + private static final int NOT_IN_ECM_STATE = 0; + /** * The maximum number of times we will retry a connection to an access point * for which we have failed in acquiring an IP address from DHCP. A value of @@ -533,11 +539,6 @@ public class WifiStateMachine extends StateMachine { private final WorkSource mLastRunningWifiUids = new WorkSource(); private final IBatteryStats mBatteryStats; - private boolean mNextWifiActionExplicit = false; - private int mLastExplicitNetworkId; - private long mLastNetworkChoiceTime; - private static final long EXPLICIT_CONNECT_ALLOWED_DELAY_MS = 2 * 60 * 1000; - public WifiStateMachine(Context context, String wlanInterface) { super(TAG); @@ -778,11 +779,11 @@ public class WifiStateMachine extends StateMachine { /** * TODO: doc */ - public void setDriverStart(boolean enable) { + public void setDriverStart(boolean enable, boolean ecm) { if (enable) { sendMessage(CMD_START_DRIVER); } else { - sendMessage(CMD_STOP_DRIVER); + sendMessage(obtainMessage(CMD_STOP_DRIVER, ecm ? IN_ECM_STATE : NOT_IN_ECM_STATE, 0)); } } @@ -848,8 +849,11 @@ public class WifiStateMachine extends StateMachine { return result; } - public List<WifiConfiguration> syncGetConfiguredNetworks() { - return WifiConfigStore.getConfiguredNetworks(); + public List<WifiConfiguration> syncGetConfiguredNetworks(AsyncChannel channel) { + Message resultMsg = channel.sendMessageSynchronously(CMD_GET_CONFIGURED_NETWORKS); + List<WifiConfiguration> result = (List<WifiConfiguration>) resultMsg.obj; + resultMsg.recycle(); + return result; } /** @@ -1458,14 +1462,11 @@ public class WifiStateMachine extends StateMachine { * be displayed in the status bar, and only send the * broadcast if that much more coarse-grained number * changes. This cuts down greatly on the number of - * broadcasts, at the cost of not mWifiInforming others + * broadcasts, at the cost of not informing others * interested in RSSI of all the changes in signal * level. */ - // TODO: The second arg to the call below needs to be a symbol somewhere, but - // it's actually the size of an array of icons that's private - // to StatusBar Policy. - int newSignalLevel = WifiManager.calculateSignalLevel(newRssi, 4); + int newSignalLevel = WifiManager.calculateSignalLevel(newRssi, WifiManager.RSSI_LEVELS); if (newSignalLevel != mLastSignalLevel) { sendRssiChangeBroadcast(newRssi); } @@ -1640,10 +1641,11 @@ public class WifiStateMachine extends StateMachine { mWifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID); mWifiInfo.setRssi(MIN_RSSI); mWifiInfo.setLinkSpeed(-1); - mWifiInfo.setExplicitConnect(false); - /* send event to CM & network change broadcast */ setNetworkDetailedState(DetailedState.DISCONNECTED); + WifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED); + + /* send event to CM & network change broadcast */ sendNetworkStateChangeBroadcast(mLastBssid); /* Clear network properties */ @@ -1726,6 +1728,7 @@ public class WifiStateMachine extends StateMachine { } else { configureLinkProperties(); setNetworkDetailedState(DetailedState.CONNECTED); + WifiConfigStore.updateStatus(mLastNetworkId, DetailedState.CONNECTED); sendNetworkStateChangeBroadcast(mLastBssid); } } @@ -1816,6 +1819,10 @@ public class WifiStateMachine extends StateMachine { case CMD_SAVE_CONFIG: mReplyChannel.replyToMessage(message, message.what, FAILURE); break; + case CMD_GET_CONFIGURED_NETWORKS: + mReplyChannel.replyToMessage(message, message.what, + WifiConfigStore.getConfiguredNetworks()); + break; case CMD_ENABLE_RSSI_POLL: mEnableRssiPolling = (message.arg1 == 1); break; @@ -2576,16 +2583,25 @@ public class WifiStateMachine extends StateMachine { WifiNative.setBluetoothCoexistenceScanModeCommand(mBluetoothConnectionActive); break; case CMD_STOP_DRIVER: - /* Already doing a delayed stop */ - if (mInDelayedStop) { + int mode = message.arg1; + + /* Already doing a delayed stop && not in ecm state */ + if (mInDelayedStop && mode != IN_ECM_STATE) { if (DBG) log("Already in delayed stop"); break; } mInDelayedStop = true; mDelayedStopCounter++; if (DBG) log("Delayed stop message " + mDelayedStopCounter); - sendMessageDelayed(obtainMessage(CMD_DELAYED_STOP_DRIVER, mDelayedStopCounter, - 0), DELAYED_DRIVER_STOP_MS); + + if (mode == IN_ECM_STATE) { + /* send a shut down immediately */ + sendMessage(obtainMessage(CMD_DELAYED_STOP_DRIVER, mDelayedStopCounter, 0)); + } else { + /* send regular delayed shut down */ + sendMessageDelayed(obtainMessage(CMD_DELAYED_STOP_DRIVER, + mDelayedStopCounter, 0), DELAYED_DRIVER_STOP_MS); + } break; case CMD_START_DRIVER: if (mInDelayedStop) { @@ -2824,10 +2840,6 @@ public class WifiStateMachine extends StateMachine { mSupplicantStateTracker.sendMessage(CMD_CONNECT_NETWORK); WifiNative.reconnectCommand(); - mLastExplicitNetworkId = netId; - mLastNetworkChoiceTime = SystemClock.elapsedRealtime(); - mNextWifiActionExplicit = true; - if (DBG) log("Setting wifi connect explicit for netid " + netId); /* Expect a disconnection from the old connection */ transitionTo(mDisconnectingState); break; @@ -2849,13 +2861,6 @@ public class WifiStateMachine extends StateMachine { mWifiInfo.setSSID(fetchSSID()); mWifiInfo.setBSSID(mLastBssid); mWifiInfo.setNetworkId(mLastNetworkId); - if (mNextWifiActionExplicit && - mWifiInfo.getNetworkId() == mLastExplicitNetworkId && - SystemClock.elapsedRealtime() < mLastNetworkChoiceTime + - EXPLICIT_CONNECT_ALLOWED_DELAY_MS) { - mWifiInfo.setExplicitConnect(true); - } - mNextWifiActionExplicit = false; /* send event to CM & network change broadcast */ setNetworkDetailedState(DetailedState.OBTAINING_IPADDR); sendNetworkStateChangeBroadcast(mLastBssid); diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java index b27c60f44524..0ca3852a0bdc 100644 --- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java +++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java @@ -1030,7 +1030,7 @@ public class WifiWatchdogStateMachine extends StateMachine { mHasConnectedWifiManager = true; } mWifiManager.disableNetwork(networkId, WifiConfiguration.DISABLED_DNS_FAILURE); - if (mShowDisabledNotification && mConnectionInfo.isExplicitConnect()) { + if (mShowDisabledNotification) { setDisabledNetworkNotificationVisible(true); } transitionTo(mNotConnectedState); |