diff options
341 files changed, 28741 insertions, 2219 deletions
@@ -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) @@ -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 9610853..9eb2075 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 d5d65c1..02e1f1c 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 0ec007c..c0ba543 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 0c761fc..9e88bc6 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 c4a4fea..e6d28ef 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 473a2d1..f427e78 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 a8c9cba..1abb7de 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 1253fe7..a362778 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 1b8a4f5..d83d2e6 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 5f5ba50..e420bfd 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 d71a8d6..b609c26 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 092a0c8..116ca48 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 4e5598b..e3b1f54 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 2d2a90d..ac05682 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 4f19010..d38b8da 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 72431f3..10c1195 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 02839db..53cdf21 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 1b24f0c..d9ea700 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 a73067a..9fe0bed 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 b266bb6..226e079 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 c25ebb7..24569fa 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 f4a390e..ed59b03 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 5282e61..2b8a458 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 231f913..b708750 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 b73d900..1e8a2f7 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 5ae65df..121c6f2 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 0000000..b9e6a44 --- /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 239d9e8..11226a9 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 ed2af10..0f26a34 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 443acf6..3f793bb 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 1102a47..0d34b90 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 7a9d82c..72966ef 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 48fe0df..24a3066 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 d0841dd..a99ac03 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 e74fec6..c0eb65b 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 7d729c6..c7cd662 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 1d66cbe..f6418ce 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 c194559..0da867f 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 3a71e7e..f862613 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 a284a17..b1e1132 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 14da23e..d99e264 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 9d541e0..7d0f98e 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 4bd7165..a106159 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 babd8e7..a178087 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 fec4cbc..86118b1 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 8445ad1..c77992d 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 81bf4d5..ed6aaa1 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 fd9ccb1..510aa18 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 84e7432..2573aa6 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 2aeca86..9dbe774 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 7a5bb6a..568933c 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 6df22ca..335a641 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 c65dd83..0b94fc1 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 70d18cc..802ef82 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 7a623ce..40f2492 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 59065e1..3cb19c3 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 b662e82..722dc26 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 46301cd..09c749d 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 f702657..80aef21 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1992,7 +1992,7 @@ <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> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index b18d88f..fe5388b 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 e22b018..e44023b 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/data/fonts/AndroidEmoji.ttf b/data/fonts/AndroidEmoji.ttf Binary files differnew file mode 100644 index 0000000..d543f75 --- /dev/null +++ b/data/fonts/AndroidEmoji.ttf diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml index e23004b..47cdae7 100644 --- a/data/fonts/fallback_fonts.xml +++ b/data/fonts/fallback_fonts.xml @@ -71,6 +71,11 @@ </family> <family> <fileset> + <file>AndroidEmoji.ttf</file> + </fileset> + </family> + <family> + <fileset> <file>DroidSansFallback.ttf</file> </fileset> </family> diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk index 3f51eb3..9dca329 100644 --- a/data/fonts/fonts.mk +++ b/data/fonts/fonts.mk @@ -32,6 +32,7 @@ PRODUCT_COPY_FILES := \ frameworks/base/data/fonts/DroidSansMono.ttf:system/fonts/DroidSansMono.ttf \ frameworks/base/data/fonts/DroidSansArmenian.ttf:system/fonts/DroidSansArmenian.ttf \ frameworks/base/data/fonts/DroidSansGeorgian.ttf:system/fonts/DroidSansGeorgian.ttf \ + frameworks/base/data/fonts/AndroidEmoji.ttf:system/fonts/AndroidEmoji.ttf \ frameworks/base/data/fonts/Clockopia.ttf:system/fonts/Clockopia.ttf \ frameworks/base/data/fonts/AndroidClock.ttf:system/fonts/AndroidClock.ttf \ frameworks/base/data/fonts/AndroidClock_Highlight.ttf:system/fonts/AndroidClock_Highlight.ttf \ diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd index 95542bc..7d119ca 100644 --- a/docs/html/guide/appendix/api-levels.jd +++ b/docs/html/guide/appendix/api-levels.jd @@ -83,12 +83,17 @@ 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 rowspan="2"><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 -Highlights</a></td></tr> + </tr> <tr><td><a href="{@docRoot}sdk/android-3.2.html">Android 3.2</a></td> <td><a href="{@docRoot}sdk/api_diff/13/changes.html" title="Diff Report">13</a></td> diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs index 3eb7286..ef91d35 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> @@ -244,7 +244,7 @@ <li class="toggle-list"> <div><a href="<?cs var:toroot ?>guide/topics/graphics/index.html"> <span class="en">Graphics</span> - </a><span class="new-child">new!</span></div> + </a> <span class="new-child">new!</span></div> <ul> <li><a href="<?cs var:toroot ?>guide/topics/graphics/2d-graphics.html"> <span class="en">Canvas and Drawables</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 0000000..fcb65aa --- /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 0000000..f284d65 --- /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 0000000..fe720fd --- /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 0000000..8dffe8d --- /dev/null +++ b/docs/html/images/training/ads-top-banner.png diff --git a/docs/html/images/training/app-navigation-ancestral-navigate-back.png b/docs/html/images/training/app-navigation-ancestral-navigate-back.png Binary files differnew file mode 100644 index 0000000..573bede --- /dev/null +++ b/docs/html/images/training/app-navigation-ancestral-navigate-back.png diff --git a/docs/html/images/training/app-navigation-ancestral-navigate-up.png b/docs/html/images/training/app-navigation-ancestral-navigate-up.png Binary files differnew file mode 100644 index 0000000..1ec6fd8 --- /dev/null +++ b/docs/html/images/training/app-navigation-ancestral-navigate-up.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-buttons.png b/docs/html/images/training/app-navigation-descendant-lateral-buttons.png Binary files differnew file mode 100644 index 0000000..adc9850 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-buttons.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-children.png b/docs/html/images/training/app-navigation-descendant-lateral-children.png Binary files differnew file mode 100644 index 0000000..cd24407 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-children.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-desc.png b/docs/html/images/training/app-navigation-descendant-lateral-desc.png Binary files differnew file mode 100644 index 0000000..2946f37 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-desc.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-lists.png b/docs/html/images/training/app-navigation-descendant-lateral-lists.png Binary files differnew file mode 100644 index 0000000..69c2e08 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-lists.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-paging-companion.png b/docs/html/images/training/app-navigation-descendant-lateral-paging-companion.png Binary files differnew file mode 100644 index 0000000..3893097 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-paging-companion.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-paging.png b/docs/html/images/training/app-navigation-descendant-lateral-paging.png Binary files differnew file mode 100644 index 0000000..8c67217 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-paging.png diff --git a/docs/html/images/training/app-navigation-descendant-lateral-tabs.png b/docs/html/images/training/app-navigation-descendant-lateral-tabs.png Binary files differnew file mode 100644 index 0000000..3eab186 --- /dev/null +++ b/docs/html/images/training/app-navigation-descendant-lateral-tabs.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-multipane-bad.png b/docs/html/images/training/app-navigation-multiple-sizes-multipane-bad.png Binary files differnew file mode 100644 index 0000000..e69319a --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-multipane-bad.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-multipane-good.png b/docs/html/images/training/app-navigation-multiple-sizes-multipane-good.png Binary files differnew file mode 100644 index 0000000..3588318 --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-multipane-good.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-multipane-screen-map.png b/docs/html/images/training/app-navigation-multiple-sizes-multipane-screen-map.png Binary files differnew file mode 100644 index 0000000..08895cf --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-multipane-screen-map.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-strategy-collapse.png b/docs/html/images/training/app-navigation-multiple-sizes-strategy-collapse.png Binary files differnew file mode 100644 index 0000000..90ed9fb --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-strategy-collapse.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-strategy-show-hide.png b/docs/html/images/training/app-navigation-multiple-sizes-strategy-show-hide.png Binary files differnew file mode 100644 index 0000000..e344a47 --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-strategy-show-hide.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-strategy-stack.png b/docs/html/images/training/app-navigation-multiple-sizes-strategy-stack.png Binary files differnew file mode 100644 index 0000000..250b869 --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-strategy-stack.png diff --git a/docs/html/images/training/app-navigation-multiple-sizes-strategy-stretch.png b/docs/html/images/training/app-navigation-multiple-sizes-strategy-stretch.png Binary files differnew file mode 100644 index 0000000..aff2230 --- /dev/null +++ b/docs/html/images/training/app-navigation-multiple-sizes-strategy-stretch.png diff --git a/docs/html/images/training/app-navigation-screen-planning-erd.png b/docs/html/images/training/app-navigation-screen-planning-erd.png Binary files differnew file mode 100644 index 0000000..a9cf429 --- /dev/null +++ b/docs/html/images/training/app-navigation-screen-planning-erd.png diff --git a/docs/html/images/training/app-navigation-screen-planning-exhaustive-map.png b/docs/html/images/training/app-navigation-screen-planning-exhaustive-map.png Binary files differnew file mode 100644 index 0000000..b5d3743 --- /dev/null +++ b/docs/html/images/training/app-navigation-screen-planning-exhaustive-map.png diff --git a/docs/html/images/training/app-navigation-wireframing-map-example-phone.png b/docs/html/images/training/app-navigation-wireframing-map-example-phone.png Binary files differnew file mode 100644 index 0000000..9e1f4df --- /dev/null +++ b/docs/html/images/training/app-navigation-wireframing-map-example-phone.png diff --git a/docs/html/images/training/app-navigation-wireframing-map-example-tablet-alt.png b/docs/html/images/training/app-navigation-wireframing-map-example-tablet-alt.png Binary files differnew file mode 100644 index 0000000..de6fc23 --- /dev/null +++ b/docs/html/images/training/app-navigation-wireframing-map-example-tablet-alt.png diff --git a/docs/html/images/training/app-navigation-wireframing-map-example-tablet.png b/docs/html/images/training/app-navigation-wireframing-map-example-tablet.png Binary files differnew file mode 100644 index 0000000..7c8374b --- /dev/null +++ b/docs/html/images/training/app-navigation-wireframing-map-example-tablet.png diff --git a/docs/html/images/training/app-navigation-wireframing-wires-phone.png b/docs/html/images/training/app-navigation-wireframing-wires-phone.png Binary files differnew file mode 100644 index 0000000..5c04350 --- /dev/null +++ b/docs/html/images/training/app-navigation-wireframing-wires-phone.png diff --git a/docs/html/images/training/app-navigation-wireframing-wires-tablet.png b/docs/html/images/training/app-navigation-wireframing-wires-tablet.png Binary files differnew file mode 100644 index 0000000..5ac7ef3 --- /dev/null +++ b/docs/html/images/training/app-navigation-wireframing-wires-tablet.png diff --git a/docs/html/images/training/button.png b/docs/html/images/training/button.png Binary files differnew file mode 100755 index 0000000..1a7944f --- /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 0000000..06e0720 --- /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 0000000..bb67419 --- /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 0000000..1be1831 --- /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 0000000..423f1af --- /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 0000000..cac4cae --- /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 0000000..b3408e5 --- /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 0000000..bbb689b --- /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 0000000..b340300 --- /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 0000000..9cb241d --- /dev/null +++ b/docs/html/images/training/layout-listitem.png diff --git a/docs/html/images/training/oauth_dance.png b/docs/html/images/training/oauth_dance.png Binary files differnew file mode 100644 index 0000000..c519e92 --- /dev/null +++ b/docs/html/images/training/oauth_dance.png diff --git a/docs/html/images/training/relativelayout1.png b/docs/html/images/training/relativelayout1.png Binary files differnew file mode 100644 index 0000000..0b593dc --- /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 0000000..341b286 --- /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 0000000..0c9f46e --- /dev/null +++ b/docs/html/images/training/sharing/share-text-screenshot.png diff --git a/docs/html/images/training/training-prof.png b/docs/html/images/training/training-prof.png Binary files differnew file mode 100644 index 0000000..ad91db2 --- /dev/null +++ b/docs/html/images/training/training-prof.png diff --git a/docs/html/index.jd b/docs/html/index.jd index bb7721d..ac89264 100644 --- a/docs/html/index.jd +++ b/docs/html/index.jd @@ -129,16 +129,16 @@ href="{@docRoot}resources/dashboard/platform-versions.html">Learn more »</ 'sdk': { 'layout':"imgLeft", 'icon':"sdk-small.png", - 'name':"Android 4.0", + 'name':"Android 4.0.3", 'img':"ics-android.png", - 'title':"Ice Cream Sandwich!", - 'desc': "<p>Android 4.0 is here, delivering a unified UI for phones and tablets and " -+ "innovative features for users and developers. Check out the <a " + 'title':"Android 4.0.3", + 'desc': "<p>Android 4.0.3 is an update to the Ice Cream Sandwich release that adds a " ++ "handful of new features for users and developers. Check out the <a " + "href='http://developer.android.com/sdk/android-4.0-highlights.html'>Platform Highlights</a> " -+ "for an overview of the new features in Android 4.0.</p>" -+ "<p>For more information about API changes, read the " -+ "<a href='{@docRoot}sdk/android-4.0.html'>platform notes</a> and <a " -+ "href='{@docRoot}sdk/api_diff/14/changes.html'>diff report</a>. If you're new to Android, " ++ "for an overview of all features in Android 4.0.x.</p>" ++ "<p>For information about API changes in 4.0.3 (API level 15), read the " ++ "<a href='{@docRoot}sdk/android-4.0.3.html'>platform notes</a> and <a " ++ "href='{@docRoot}sdk/api_diff/15/changes.html'>diff report</a>. If you're new to Android, " + "get started with the <a href='/sdk/index.html'>SDK starter package</a>.</p>" }, diff --git a/docs/html/resources/resources-data.js b/docs/html/resources/resources-data.js index 18f1547..8ad970b 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/resources_toc.cs b/docs/html/resources/resources_toc.cs index c7dd916..f21e0be 100644 --- a/docs/html/resources/resources_toc.cs +++ b/docs/html/resources/resources_toc.cs @@ -1,5 +1,242 @@ <ul> <li> + <h2><span class="en">Android Training</span> + </h2> + <ul> + + <li><a href="<?cs var:toroot ?>training/index.html"> + <span class="en">Orientation</span> + </a> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/multiscreen/index.html"> + <span class="en">Designing for Multiple Screens</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/multiscreen/screensizes.html"> + <span class="en">Supporting Different Screen Sizes</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/multiscreen/screendensities.html"> + <span class="en">Supporting Different Screen Densities</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/multiscreen/adaptui.html"> + <span class="en">Implementing Adaptive UI Flows</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/improving-layouts/index.html"> + <span class="en">Improving Layout Performance</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/improving-layouts/optimizing-layout.html"> + <span class="en">Optimizing Layout Hierarchies</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/improving-layouts/reusing-layouts.html"> + <span class="en">Re-using Layouts with <include/></span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/improving-layouts/loading-ondemand.html"> + <span class="en">Loading Views On Demand</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/improving-layouts/smooth-scrolling.html"> + <span class="en">Making ListView Scrolling Smooth</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/managing-audio/index.html"> + <span class="en">Managing Audio Playback</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/managing-audio/volume-playback.html"> + <span class="en">Controlling Your App’s Volume and Playback</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/managing-audio/audio-focus.html"> + <span class="en">Managing Audio Focus</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/managing-audio/audio-output.html"> + <span class="en">Dealing with Audio Output Hardware</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/monitoring-device-state/index.html"> + <span class="en">Optimizing Battery Life</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/monitoring-device-state/battery-monitoring.html"> + <span class="en">Monitoring the Battery Level and Charging State</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/monitoring-device-state/docking-monitoring.html"> + <span class="en">Determining and Monitoring the Docking State and Type</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/monitoring-device-state/connectivity-monitoring.html"> + <span class="en">Determining and Monitoring the Connectivity Status</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/monitoring-device-state/manifest-receivers.html"> + <span class="en">Manipulating Broadcast Receivers On Demand</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/id-auth/index.html"> + <span class="en">Remembering Users</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/id-auth/identify.html"> + <span class="en">Remembering Your User</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/id-auth/authenticate.html"> + <span class="en">Authenticating to OAuth2 Services</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/id-auth/custom_auth.html"> + <span class="en">Creating a Custom Account Type</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/sharing/index.html"> + <span class="en">Sharing Content</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/sharing/send.html"> + <span class="en">Sending Content to Other Apps</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/sharing/receive.html"> + <span class="en">Receiving Content from Other Apps</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/sharing/shareaction.html"> + <span class="en">Adding an Easy Share Action</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/camera/index.html"> + <span class="en">Capturing Photos</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/camera/photobasics.html"> + <span class="en">Taking Photos Simply</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/camera/videobasics.html"> + <span class="en">Recording Videos Simply</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/camera/cameradirect.html"> + <span class="en">Controlling the Camera</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/multiple-apks/index.html"> + <span class="en">Maintaining Multiple APKs</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/multiple-apks/api.html"> + <span class="en">Creating Multiple APKs for Different API Levels</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/multiple-apks/screensize.html"> + <span class="en">Creating Multiple APKs for Different Screen Sizes</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/multiple-apks/texture.html"> + <span class="en">Creating Multiple APKs for Different GL Textures</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/multiple-apks/multiple.html"> + <span class="en">Creating Multiple APKs with 2+ Dimensions</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/enterprise/index.html"> + <span class="en">Developing for Enterprise</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/enterprise/device-management-policy.html"> + <span class="en">Enhancing Secirity with Device Management Policies</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/monetization/index.html"> + <span class="en">Monetizing Your App</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/monetization/ads-and-ux.html"> + <span class="en">Advertising without Compromising User Experience</span> + </a> + </li> + </ul> + </li> + + <li class="toggle-list"> + <div><a href="<?cs var:toroot ?>training/design-navigation/index.html"> + <span class="en">Designing Effective Navigation</span> + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/design-navigation/screen-planning.html"> + <span class="en">Planning Screens and Their Relationships</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/design-navigation/multiple-sizes.html"> + <span class="en">Planning for Multiple Touchscreen Sizes</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/design-navigation/descendant-lateral.html"> + <span class="en">Providing Descendant and Lateral Navigation</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/design-navigation/ancestral-temporal.html"> + <span class="en">Providing Ancestral and Temporal Navigation</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/design-navigation/wireframing.html"> + <span class="en">Putting it All Together: Wireframing the Example App</span> + </a> + </li> + </ul> + </li> + </ul> + </li> + + + <li> <h2><span class="en">Technical Resources</span> </h2> <ul> 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 0000000..f44c649 --- /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 c1162d4..922bb08 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 0000000..c1ad120 --- /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/15/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.0.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.x 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 {@link android.graphics.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 {@link 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 e886bdf..7161b03 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 0000000..6fe88e8 --- /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 0000000..25c2b0a --- /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 0000000..c4a67da --- /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 0000000..5ee3803 --- /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 0000000..68d2c20 --- /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 0000000..37bbd8c --- /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 0000000..2b1976e --- /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 0000000..59bdb1f --- /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 0000000..a2c87cd --- /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 0000000..b3b8f1e --- /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 0000000..dd2f466 --- /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 0000000..4ba4252 --- /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 0000000..ca44add --- /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 0000000..02afe90 --- /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 0000000..6b556bc --- /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 0000000..8247ea9 --- /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 0000000..50913ad --- /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 0000000..8399457 --- /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 0000000..1d090ed --- /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 0000000..55659e3 --- /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 0000000..d2c1f61 --- /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 0000000..60e05ef --- /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 0000000..6251360 --- /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 0000000..34ee9a8 --- /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 0000000..f1cb57b --- /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 0000000..019b98a --- /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 0000000..356cf9d --- /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 0000000..6f53f8f --- /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 0000000..e6e22a5 --- /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 0000000..e772e19 --- /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 0000000..0add186 --- /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 0000000..70843f6 --- /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 0000000..fa772f9 --- /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 0000000..b88467c --- /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 0000000..0782c9c --- /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 0000000..bd1859b --- /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 0000000..40424ed --- /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 0000000..b7005a0 --- /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 0000000..50cacab --- /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 0000000..0acb973 --- /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 0000000..16969ea --- /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 0000000..e03eba3 --- /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 0000000..3109b6e --- /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 0000000..e6da73f --- /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 0000000..c834d4f --- /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 0000000..4e8e692 --- /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 0000000..74dc718 --- /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 0000000..f1a9952 --- /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 0000000..6012ce8 --- /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 0000000..66fbf8f --- /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 0000000..82b093d --- /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 0000000..9f62d88 --- /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 0000000..4152998 --- /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 0000000..2c15e76 --- /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 0000000..36f9836 --- /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 0000000..260ec1e --- /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 0000000..2f0e734 --- /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 0000000..d22fde3 --- /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 0000000..b5aea4f --- /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 0000000..1776064 --- /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 0000000..ef66568 --- /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 0000000..a2b0a19 --- /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 0000000..9fd0f7e --- /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 0000000..1b2e65b --- /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 0000000..46bc1dc --- /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 0000000..16e9db7 --- /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 0000000..036a96e --- /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 0000000..a8a2963 --- /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 0000000..8388466 --- /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 0000000..7b02735 --- /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 0000000..3af011e --- /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 0000000..e537fc9 --- /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 0000000..dff132d --- /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 0000000..ba005a0 --- /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 0000000..93209fa --- /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 0000000..5a14d82 --- /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 0000000..b6f52e4 --- /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 0000000..1afe9e3 --- /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 0000000..5936ed5 --- /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 0000000..7cca96d --- /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 0000000..a9c91e0 --- /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 0000000..2d874b2 --- /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 0000000..ad63378 --- /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 0000000..02e4b80 --- /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 0000000..edafaa3 --- /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/compatibility-library.jd b/docs/html/sdk/compatibility-library.jd index 8b19fb47..df71552 100644 --- a/docs/html/sdk/compatibility-library.jd +++ b/docs/html/sdk/compatibility-library.jd @@ -4,7 +4,7 @@ page.title=Support Package <div id="qv-wrapper"> <div id="qv"> - + <h2>In this document</h2> <ol> <li><a href="#Notes">Revisions</a></li> @@ -35,7 +35,8 @@ worry less about platform versions.</p> <p class="note"><strong>Note:</strong> The Support Package includes more than one support library. Each one has a different <em>minimum API level</em>. For example, one library requires API -level 4 or higher, while another requires API level 13 or higher (v13 is a superset of v4 and includes additional +level 4 or higher, while another requires API level 13 or higher (v13 is a superset of v4 and +includes additional support classes to work with v13 APIs). The minimum version is indicated by the directory name, such as {@code v4/} and {@code v13/}.</p> @@ -46,12 +47,64 @@ by the directory name, such as {@code v4/} and {@code v13/}.</p> the Support Package, as denoted by revision number.</p> - <div class="toggle-content open"> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" /> - Support Package, revision 4 (October 2011) + Support Package, revision 6 (December 2011) + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em"> + <p class="note"><strong>Note:</strong> Reference for support library APIs are now available with + the framework references, for example: {@link android.support.v4.app}.</p> +<dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Changes to ViewPager: + <ul> + <li>Added extra decorative view support for {@link android.support.v4.view.ViewPager}. + Decorative views may be supplied as child views of a pager in XML layout.</li> + <li>Added {@link android.support.v4.view.PagerAdapter#getPageTitle + PagerAdapter.getPageTitle()} to supply title strings for pages, which defaults to no + title for each page.</li> + <li>Added {@link android.support.v4.view.PagerTitleStrip}, a non-interactive title + strip, that can be added as a child of ViewPager. Developers can supply text + appearance and color, as well as layout sizing and gravity information.</li> + <li>Updated {@link android.support.v4.view.PagerAdapter} methods to take ViewGroup + objects, rather than View to avoid class casting in adapter implementations.</li> + <li>Updated {@link android.support.v4.view.ViewPager} to use Launcher-style + fling behavior.</li> + <li>Bug fixes for user interface interaction and test automation.</li> + </ul> + </li> + + <li>Support for Fragments: + <ul> + <li>Changed {@code setStartDeferred()} method to {@link + android.support.v4.app.Fragment#setUserVisibleHint}.</li> + <li>Added deferred start for off-screen pages to improve performance.</li> + </ul> + </li> + + <li>Support for Accessiblity APIs: + <ul> + <li>Updated {@link android.support.v4.view.AccessibilityDelegateCompat} methods + to return empty lists instead of null.</li> + <li>Added new APIs needed by the v4 samples.</li> + </ul> + </li> + + </ul> + </dd> + </dl> + </div> + +<div class="toggle-content closed"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" /> + Support Package, revision 5 (December 2011) </a></p> <div class="toggle-content-toggleme" style="padding-left:2em"> @@ -61,36 +114,67 @@ the Support Package, as denoted by revision number.</p> <ul> <li>Support for Accessiblity APIs: <ul> - <li>Added <code>AccessibilityDelegateCompat</code> to support - {@link android.view.View.AccessibilityDelegate}.</li> + <li>Added {@link android.support.v4.view.AccessibilityDelegateCompat} + to support {@link android.view.View.AccessibilityDelegate}.</li> - <li>Added <code>AccessibilityEventCompat</code> to support - {@link android.view.accessibility.AccessibilityEvent}.</li> + <li>Added {@link android.support.v4.view.accessibility.AccessibilityEventCompat} + to support {@link android.view.accessibility.AccessibilityEvent}.</li> - <li>Added <code>AccessibilityManagerCompat</code> to support - {@link android.view.accessibility.AccessibilityManager}.</li> + <li>Added {@link android.support.v4.view.accessibility.AccessibilityManagerCompat} + to support {@link android.view.accessibility.AccessibilityManager}.</li> - <li>Added <code>AccessibilityNodeInfoCompat</code> to support - {@link android.view.accessibility.AccessibilityNodeInfo}.</li> + <li>Added {@link android.support.v4.view.accessibility.AccessibilityNodeInfoCompat} + to support {@link android.view.accessibility.AccessibilityNodeInfo}.</li> - <li>Added <code>AccessibilityRecordCompat</code> to support - {@link android.view.accessibility.AccessibilityRecord}.</li> + <li>Added {@link android.support.v4.view.accessibility.AccessibilityRecordCompat} + to support {@link android.view.accessibility.AccessibilityRecord}.</li> - <li>Added <code>AccessibilityServiceInfoCompat</code> to support - {@link android.accessibilityservice.AccessibilityServiceInfo}.</li> + <li>Added {@link + android.support.v4.accessibilityservice.AccessibilityServiceInfoCompat} + to support {@link android.accessibilityservice.AccessibilityServiceInfo}.</li> - <li>Added <code>ViewGroupCompat</code> + <li>Added {@link android.support.v4.view.ViewGroupCompat} to support accessibility features in {@link android.view.ViewGroup}. </li> - <li>Modified <code>ViewCompat</code> + <li>Modified {@link android.support.v4.view.ViewCompat} to support accessibility features in {@link android.view.View}.</li> </ul> </li> + <li>Changes to ViewPager: + <ul> + <li>Added support for margins between pages. + An optional {@link android.graphics.drawable.Drawable} can be provided + to fill the margins.</li> + <li>Added support for {@link android.widget.EdgeEffect}.</li> + <li>Added support for keyboard navigation</li> + <li>Added support to control how many pages are kept to either side + of the current page.</li> + <li>Improved touch physics.</li> + <li>Bug fixes for user interface behavior.</li> + </ul> + </li> + </ul> + </dd> + </dl> + </div> + +<div class="toggle-content closed"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" /> + Support Package, revision 4 (October 2011) + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> <li>Added <code>EdgeEffectCompat</code> to support {@link android.widget.EdgeEffect}.</li> - + <li>Added <code>LocalBroadcastManager</code> to allow applications to easily register for and receive intents within a single application without broadcasting them globally.</li> @@ -106,18 +190,6 @@ the Support Package, as denoted by revision number.</p> <li>Various bug fixes.</li> </ul> </li> - <li>Changes to <code>ViewPager</code>: - <ul> - <li>Added support for margins between pages. - An optional {@link android.graphics.drawable.Drawable} can be provided - to fill the margins.</li> - <li>Added support for {@link android.widget.EdgeEffect}.</li> - <li>Added support for keyboard navigation</li> - <li>Added support to control how many pages are kept to either side - of the current page.</li> - <li>Improved touch physics.</li> - </ul> - </li> <li>Fixed a {@link android.content.Loader} bug that caused issues in canceling {@link android.os.AsyncTask}s when running on Froyo and older @@ -142,7 +214,7 @@ the Support Package, as denoted by revision number.</p> Compatibility Package, revision 3 (July 2011) </a></p> - <div class="toggle-content-toggleme" style="padding-left:2em"> + <div class="toggle-content-toggleme" style="padding-left:2em"> <dl> <dt>Changes for v4 support library:</dt> <dd> @@ -196,13 +268,14 @@ Android 3.2 and higher (all other APIs in the v4 library are already available w Compatibility Package, revision 2 (May 2011) </a></p> - <div class="toggle-content-toggleme" style="padding-left:2em"> + <div class="toggle-content-toggleme" style="padding-left:2em"> <dl> <dt>Changes for v4 library:</dt> <dd> <ul> <li>Support for fragment animations</li> - <li>Fix {@code Fragment.onActivityResult()} bug</li> + <li>Fix {@code android.support.v4.app.Fragment#onActivityResult Fragment.onActivityResult()} + bug</li> </ul> </dd> </dl> @@ -218,7 +291,7 @@ Android 3.2 and higher (all other APIs in the v4 library are already available w Compatibility Package, revision 1 (March 2011) </a></p> - <div class="toggle-content-toggleme" style="padding-left:2em"> + <div class="toggle-content-toggleme" style="padding-left:2em"> <p>Initial release with the v4 library.</p> </div> @@ -232,7 +305,7 @@ Android 3.2 and higher (all other APIs in the v4 library are already available w Manager. To install:</p> <ol> - <li>Launch the SDK and AVD Manager. + <li>Launch the SDK and AVD Manager. <p>From Eclipse, you can select <strong>Window</strong> > <strong>Android SDK and AVD Manager</strong>. Or, launch {@code SDK Manager.exe} from the {@code <sdk>/} directory (on Windows only) or {@code android} from the {@code @@ -259,10 +332,9 @@ libs/} directory. <p>For example, the library that supports API level 4 and up is located at {@code <sdk>/extras/android/support/v4/android-support-v4.jar}.</p> </li> - <li>Add the JAR to your project build path. + <li>Add the JAR to your project build path. <p>In Eclipse, right-click the JAR file in the Package Explorer, select <strong>Build -Path</strong> > <strong>Add to Build Path</strong>. You should then see the JAR file appear in a -new directory called Referenced Libraries.</p> +Path</strong> > <strong>Add to Build Path</strong>.</p> </li> </ol> @@ -271,7 +343,7 @@ provided APIs are available in the {@code android.support} package (for example, {@code android.support.v4}).</p> <p class="note"><strong>Tip:</strong> To see the library APIs in action, take a look at the sample -apps in {@code extras/android/support/<version>/samples/}.</p> +apps in {@code <sdk>/extras/android/support/<version>/samples/}.</p> <p class="warning"><strong>Warning:</strong> Be certain that you not confuse the standard {@code android} packages with those in {@code android.support} library. Some code completion tools @@ -309,17 +381,20 @@ differences, however. Most notably:</p> <ul> <li>When creating an activity to use fragments, you must declare your activity to extend the -{@code FragmentActivity} class (instead of the traditional {@link android.app.Activity} -class).</li> - <li>To manage your fragments and loaders, you must use the methods {@code -FragmentActivity.getSupportFragmentManager()} and {@code -FragmentActivity.getSupportLoaderManager()} (instead of the {@link -android.app.Activity#getFragmentManager()} and {@link android.app.Activity#getLoaderManager()} -methods).</li> +{@link android.support.v4.app.FragmentActivity} class (instead of the traditional +{@link android.app.Activity} class).</li> + <li>To manage your fragments and loaders, you must use the methods + {@link android.support.v4.app.FragmentActivity#getSupportFragmentManager + FragmentActivity.getSupportFragmentManager()} and + {@link android.support.v4.app.FragmentActivity#getSupportLoaderManager + FragmentActivity.getSupportLoaderManager()} (instead of the + {@link android.app.Activity#getFragmentManager()} and + {@link android.app.Activity#getLoaderManager()} methods).</li> <li>The {@link android.app.ActionBar} is <strong>not supported</strong> by the library. However, when creating your <a href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a>, you can declare which items should be added to the Action Bar when it's available (on -Android 3.0 or later). You can do so with the {@code MenuCompat.setShowAsAction()} method. For +Android 3.0 or later). You can do so with the +{@link android.support.v4.view.MenuCompat#setShowAsAction MenuCompat.setShowAsAction()} method, for example: <pre> public boolean onCreateOptionsMenu(Menu menu) { @@ -329,16 +404,19 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } </pre> +<p>Also see the <a href="{@docRoot}resources/samples/ActionBarCompat/index.html">Action Bar +Compatibility</a> sample for a demonstration of how to use {@link android.app.ActionBar} on Android +3.0+ and also support action bar functionality on older versions.</p> </li> </ul> <div class="note"><p><strong>Tip:</strong> To enable the Holographic theme on devices running Android 3.0 or higher, declare in your manifest file that your application targets -API level 11. For example:</p> +API level 11, for example:</p> <pre> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" /> </pre> -<p>This way, your application automatically receives the Holographic theme and the Action Bar for +<p>This way, your application automatically receives the Holographic theme and the Action Bar for each activity when running on Android 3.0 and higher.</p> </div> @@ -349,29 +427,29 @@ Apps for Android 3.0</a>.</p> <h2 id="Docs">Reference Docs</h2> -<p>The libraries currently do not provide reference documentation for the included APIs. To generate -your own set using the {@code javadoc} tool, perform the following from a command (as appropriate -for the library version you're using). In this example, documentation is generated for the v4 -library:</p> +<p>The reference documentation for the Support Packages is included as part of the Android +online developer documentation:</p> -<pre class="no-pretty-print"> -cd <sdk>/extras/android/support/v4/ -mkdir docs -javadoc -sourcepath src/java/ -subpackages android.support.v4 -d docs -</pre> -<p>Open the {@code docs/index.html} file to begin browsing the generated documentation.</p> +<ul> + <li><a href="{@docRoot}reference/android/support/v4/app/package-summary.html">Support Package + API 4 Reference</a></li> + <li><a href="{@docRoot}reference/android/support/v13/app/package-summary.html">Support Package + API 13 Reference</a></li> +</ul> <h2 id="Samples">Samples</h2> <p>If you want to see some code that uses the support libraries, samples are included with the -Support Package, inside each support library directory. For example, at {@code -extras/android/support/v4/samples/}.</p> +Support Package, inside each support library directory, for example; {@code +<sdk>/extras/android/support/v4/samples/}. You can also view these samples as part of the +Android online developer documentation:</p> + +<ul> + <li><a href="{@docRoot}resources/samples/Support4Demos/index.html">Support API 4 Demos</a></li> + <li><a href="{@docRoot}resources/samples/Support13Demos/index.html">Support API 13 Demos</a></li> +</ul> <p>Additionally, the <a href="http://code.google.com/p/iosched/">Google I/O App</a> is a complete application that uses the v4 support library to provide a single APK for both handsets and tablets and also demonstrates some of Android's best practices in Android UI design.</p> - - - - diff --git a/docs/html/sdk/eclipse-adt.jd b/docs/html/sdk/eclipse-adt.jd index 50b20ce..f15da78 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.1 +adt.zip.download=ADT-16.0.1.zip +adt.zip.bytes=7000078 +adt.zip.checksum=03a2a23650ddac128c8b9e8aaf0aa433 @jd:body @@ -109,18 +109,82 @@ 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.1</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.1.</li> + <li>ADT 16.0.1 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>Bug fixes:</dt> + <dd> + <ul> + <li>Fixed build issue where the 9-patch could be packaged as normal bitmap in some cases.</li> + <li>Fixed minor issues in the <a href="http://tools.android.com/recent/lint">Lint</a> + tool.</li> + <li>Fixed minor issues in the SDK Manager.</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 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 tool 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 +218,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 +249,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 +275,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 +300,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 +319,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 +345,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 +388,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 +400,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 +992,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 +1038,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 193066b..65a1f46 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 f12d0aa..c970f6c 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 0ae2c6d..5f6a57f 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,10 +150,10 @@ 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> + <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Support Package, r6</a> <span class="new">new!</span></li> </ul> </li> @@ -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.1 <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 cd03d9f..91bcb7d 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,58 @@ 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. + (<a href="http://tools.android.com/recent/sensoremulation">more info</a>)</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 +166,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 +188,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> @@ -149,7 +201,7 @@ padding: .25em 1em; commands, see the <a href="{@docRoot}guide/developing/building/building-cmdline.html#AntReference">Ant Command Reference</a>.</li> - <li>Changed how library projects are built.</a></li> + <li>Changed how library projects are built.</li> <li>Improved incremental builds, so that resource compilation runs less frequently. Builds no longer run when you edit strings or layouts (unless you add a new <code>id</code>) and no longer run once for each library project.</li> @@ -428,7 +480,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 0000000..9f7ec69 --- /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 0000000..468e4ee --- /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 0000000..7dda41c --- /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 0000000..9fcc0e1 --- /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 0000000..03ad119 --- /dev/null +++ b/docs/html/training/camera/cameradirect.jd @@ -0,0 +1,287 @@ +page.title=Controlling the Camera +parent.title=Capturing Photos +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. In a more basic implementation, +opening the camera can be deferred to the {@link +android.app.Activity#onResume onResume()} method to facilitate code reuse and keep the flow of +control simple.</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(id); + 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> + +<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.</p> + + +<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 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 snippet below, 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 changes only the preview size; +see the source code of the Camera application for many more.</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()}.</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 this example, the restart is done by overloading +the shutter button.</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>Earlier in the lesson, this procedure was 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 0000000..d209c7e --- /dev/null +++ b/docs/html/training/camera/index.jd @@ -0,0 +1,61 @@ +page.title=Capturing Photos + +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="http://developer.android.com/shareables/training/PhotoIntentActivity.zip" +class="button">Download the 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 0000000..e6ab43e --- /dev/null +++ b/docs/html/training/camera/photobasics.jd @@ -0,0 +1,259 @@ +page.title=Taking Photos Simply +parent.title=Capturing Photos +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="http://developer.android.com/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 0000000..a3512b0 --- /dev/null +++ b/docs/html/training/camera/videobasics.jd @@ -0,0 +1,118 @@ +page.title=Recording Videos Simply +parent.title=Capturing Photos +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="http://developer.android.com/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/design-navigation/ancestral-temporal.jd b/docs/html/training/design-navigation/ancestral-temporal.jd new file mode 100644 index 0000000..d12fd5c --- /dev/null +++ b/docs/html/training/design-navigation/ancestral-temporal.jd @@ -0,0 +1,69 @@ +page.title=Providing Ancestral and Temporal Navigation +parent.title=Designing Effective Navigation +parent.link=index.html + +trainingnavtop=true +previous.title=Providing Descendant and Lateral Navigation +previous.link=descendant-lateral.html +next.title=Putting it All Together: Wireframing… +next.link=wireframing.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to:</h2> +<ol> + <li><a href="#temporal-navigation">Support Temporal Navigation: <em>Back</em></a></li> + <li><a href="#ancestral-navigation">Provide Ancestral Navigation: <em>Up</em> and <em>Home</em></a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">Tasks and Back Stack</a></li> +</ul> + +</div> +</div> + + +<p>Now that users can navigate <a href="descendant-lateral.html">deep into</a> the application's screen hierarchy, we need to provide a method for navigating up the hierarchy, to parent and ancestor screens. Additionally, we should ensure that temporal navigation via the BACK button is respected to respect Android conventions.</p> + + +<h2 id="temporal-navigation">Support Temporal Navigation: <em>Back</em></h2> + +<p>Temporal navigation, or navigation between historical screens, is deeply rooted in the Android system. All Android users expect the BACK button to take them to the previous screen, regardless of other state. The set of historical screens is always rooted at the user's Launcher application (the phone's "home" screen). That is, pressing BACK enough times should land you back at the Launcher, after which the BACK button will do nothing.</p> + + +<img src="{@docRoot}images/training/app-navigation-ancestral-navigate-back.png" + alt="The BACK button behavior after entering the Email app from the People (or Contacts) app" id="figure-navigate-back"> + +<p class="img-caption"><strong>Figure 1.</strong> The BACK button behavior after entering the Email app from the People (or Contacts) app.</p> + + +<p>Applications generally don't have to worry about managing the BACK button themselves; the system handles <a href="{@docRoot}guide/topics/fundamentals/tasks-and-back-stack.html">tasks and the <em>back stack</em></a>, or the list of previous screens, automatically. The BACK button by default simply traverses this list of screens, removing the current screen from the list upon being pressed.</p> + +<p>There are, however, cases where you may want to override the behavior for BACK. For example, if your screen contains an embedded web browser where users can interact with page elements to navigate between web pages, you may wish to trigger the embedded browser's default <em>back</em> behavior when users press the device's BACK button. Upon reaching the beginning of the browser's internal history, you should always defer to the system's default behavior for the BACK button.</p> + + +<h2 id="ancestral-navigation">Provide Ancestral Navigation: <em>Up</em> and <em>Home</em></h2> + +<p>Before Android 3.0, the most common form of ancestral navigation was the <em>Home</em> metaphor. This was generally implemented as a <em>Home</em> item accessible via the device's MENU button, or a <em>Home</em> button at the top-left of the screen, usually as a component of the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>. Upon selecting <em>Home</em>, the user would be taken to the screen at the top of the screen hierarchy, generally known as the application's home screen.</p> + +<p>Providing direct access to the application's home screen can give the user a sense of comfort and security. Regardless of where they are in the application, if they get lost in the app, they can select <em>Home</em> to arrive back at the familiar home screen.</p> + +<p>Android 3.0 introduced the <em>Up</em> metaphor, which is presented in the Action Bar as a substitute for the <em>Home</em> button described above. Upon tapping <em>Up</em>, the user should be taken to the parent screen in the hierarchy. This navigation step is usually the previous screen (as described with the BACK button discussion above), but this is not universally the case. Thus, developers must ensure that <em>Up</em> for each screen navigates to a single, predetermined parent screen.</p> + + +<img src="{@docRoot}images/training/app-navigation-ancestral-navigate-up.png" + alt="Example behavior for UP navigation after entering the Email app from the People app" id="figure-navigate-up"> + +<p class="img-caption"><strong>Figure 2.</strong> Example behavior for up navigation after entering the Email app from the People app.</p> + + +<p>In some cases, it's appropriate for <em>Up</em> to perform an action rather than navigating to a parent screen. Take for example, the Gmail application for Android 3.0-based tablets. When viewing a mail conversation while holding the device in landscape, the conversation list, as well as the conversation details are presented side-by-side. This is a form of parent-child screen grouping, as discussed in a <a href="multiple-sizes.html">previous lesson</a>. However, when viewing a mail conversation in the portrait orientation, only the conversation details are shown. The <em>Up</em> button is used to temporarily show the parent pane, which slides in from the left of the screen. Pressing the <em>Up</em> button again while the left pane is visible exits the context of the individual conversation, up to a full-screen list of conversations.</p> + +<p class="note"><strong>Implementation Note:</strong> As a best practice, when implementing either <em>Home</em> or <em>Up</em>, make sure to clear the back stack of any descendent screens. For <em>Home</em>, the only remaining screen on the back stack should be the home screen. For <em>Up</em> navigation, the current screen should be removed from the back stack, unless BACK navigates across screen hierarchies. You can use the {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP} intent flag to achieve this.</p> + +<p>In the last lesson, we apply the concepts discussed in all of the lessons so far to create interaction design wireframes for our example news application.</p>
\ No newline at end of file diff --git a/docs/html/training/design-navigation/descendant-lateral.jd b/docs/html/training/design-navigation/descendant-lateral.jd new file mode 100644 index 0000000..ebfd913 --- /dev/null +++ b/docs/html/training/design-navigation/descendant-lateral.jd @@ -0,0 +1,128 @@ +page.title=Providing Descendant and Lateral Navigation +parent.title=Designing Effective Navigation +parent.link=index.html + +trainingnavtop=true +previous.title=Planning for Multiple Touchscreen Sizes +previous.link=multiple-sizes.html +next.title=Providing Ancestral and Temporal Navigation +next.link=ancestral-temporal.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you about:</h2> +<ol> + <li><a href="#buttons">Buttons and Simple Targets</a></li> + <li><a href="#lists">Lists, Grids, Carousels, and Stacks</a></li> + <li><a href="#tabs">Tabs</a></li> + <li><a href="#paging">Horizontal Paging</a></li> +</ol> + +</div> +</div> + + +<p>One way of providing access to the full range of an application's screens is to expose hierarchical navigation. In this lesson we discuss <em>descendant navigation</em>, allowing users to descend 'down' a screen hierarchy into a child screen, and <em>lateral navigation</em>, allowing users to access sibling screens.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-desc.png" + alt="Descendant and lateral navigation" id="figure-desc"> + +<p class="img-caption"><strong>Figure 1.</strong> Descendant and lateral navigation.</p> + + +<p>There are two types of sibling screens: collection-related and section-related screens. <em>Collection-related</em> screens represent individual items in the collection represented by the parent. <em>Section-related</em> screens represent different sections of information about the parent. For example, one section may show textual information about an object while another may provide a map of the object's geographic location. The number of section-related screens for a given parent is generally small.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-children.png" + alt="Collection-related children and section-related children" id="figure-children"> + +<p class="img-caption"><strong>Figure 2.</strong> Collection-related children and section-related children.</p> + + +<p>Descendant and lateral navigation can be provided using lists, tabs, and other user interface patterns. <em>User interface patterns</em>, much like software design patterns, are generalized, common solutions to recurring interaction design problems. We explore a few common lateral navigation patterns in the sections below.</p> + + +<h2 id="buttons">Buttons and Simple Targets</h2> + +<p>For section-related screens, offering touchable and keyboard-focusable targets in the parent is generally the most straightforward and familiar kind of touch-based navigation interface. Examples of such targets include buttons, fixed-size list views, or text links, although the latter is not an ideal UI (user interface) element for touch-based navigation. Upon selecting one of these targets, the child screen is opened, replacing the current context (screen) entirely. Buttons and other simple targets are rarely used for representing items in a collection.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-buttons.png" + alt="Example button-based navigation interface with relevant screen map excerpt. Also shows dashboard pattern discussed below." id="figure-buttons"> + +<p class="img-caption"><strong>Figure 3.</strong> Example button-based navigation interface with relevant screen map excerpt. Also shows dashboard pattern discussed below.</p> + + +<p>A common, button-based pattern for accessing different top-level application sections, is the dashboard pattern. A <em>dashboard</em> is a grid of large, iconic buttons that constitutes the entirety, or most of, the parent screen. The grid generally has either 2 or 3 rows and columns, depending on the number of top-level sections in the app. This pattern is a great way to present all the sections of the app in a visually rich way. The large touch targets also make this UI very easy to use. Dashboards are best used when each section is equally important, as determined by product decisions or better yet, real-world usage. However, this pattern doesn't visually work well on larger screens, and requires users to take an extra step to jump directly into the app's content.</p> + +<p>More sophisticated user interfaces can make use of a variety of other user interaction patterns to improve content immediacy and presentation uniqueness, all the while remaining intuitive.</p> + + +<h2 id="lists">Lists, Grids, Carousels, and Stacks</h2> + +<p>For collection-related screens, and especially for textual information, vertically scrolling lists are often the most straightforward and familiar kind of interface. For more visual or media-rich content items such as photos or videos, vertically scrolling grids of items, horizontally scrolling lists (sometimes referred to as <em>carousels</em>), or stacks (sometimes referred to as <em>cards</em>) can be used instead. These UI elements are generally best used for presenting item collections or large sets of child screens (for example, a list of stories or a list of 10 or more news topics), rather than a small set of unrelated, sibling child screens.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-lists.png" + alt="Example list-, grid-, and carousel-based navigation interfaces with relevant screen map excerpt" id="figure-lists"> + +<p class="img-caption"><strong>Figure 4.</strong> Example list-, grid-, and carousel-based navigation interfaces with relevant screen map excerpt.</p> + + +<p>There are several issues with this pattern. Deep, list-based navigation, known as <em>drill-down list navigation</em>, where lists lead to more lists which lead to even more lists, is often inefficient and cumbersome. The number of touches required to access a piece of content with this kind of navigation is generally very high, leading to a poor user experience—especially for users on-the-go.</p> + +<p>Using vertical lists can also lead to awkward user interactions and poor use of whitespace on larger screens, as list items generally span the entire width of the screen yet have a fixed height. One way to alleviate this is to provide additional information, such as text summaries, that fills the available horizontal space. Another way is to provide additional information in a separate horizontal pane adjacent to the list.</p> + + +<h2 id="tabs">Tabs</h2> + +<p>Using tabs is a very popular solution for lateral navigation. This pattern allows grouping of sibling screens, in that the tab content container in the parent screen can embed child screens that otherwise would be entirely separate contexts. Tabs are most appropriate for small sets (4 or fewer) of section-related screens.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-tabs.png" + alt="Example phone and tablet tab-based navigation interfaces with relevant screen map excerpt" id="figure-tabs"> + +<p class="img-caption"><strong>Figure 5.</strong> Example phone and tablet tab-based navigation interfaces with relevant screen map excerpt.</p> + + +<p>Several best practices apply when using tabs. Tabs should be persistent across immediate related screens. Only the designated content region should change when selecting a tab, and tab indicators should remain available at all times. Additionally, tab switches should not be treated as history. For example, if a user switches from a tab <em>A</em> to another tab <em>B</em>, pressing the BACK button (more on that in the <a href="ancestral-temporal.html">next lesson</a>) should not re-select tab <em>A</em>. Tabs are usually laid out horizontally, although other presentations of tab navigation such as using a drop-down list in the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> are sometimes appropriate. Lastly, and most importantly, <em>tabs should always run along the top of the screen</em>, and should not be aligned to the bottom of the screen.</p> + +<p>There are some obvious immediate benefits of tabs over simpler list- and button-based navigation:</p> + +<ul> + <li>Since there is a single, initially-selected tab, users have immediate access to that tab's content from the parent screen.</li> + <li>Users can navigate quickly between related screens, without needing to first revisit the parent. <p class="note"><strong>Note</strong>: when switching tabs, it is important to maintain this tab-switching immediacy; do not block access to tab indicators by showing modal dialogs while loading content.</p></li> +</ul> + +<p>A common criticism is that space must be reserved for the tab indicators, detracting from the space available to tab contents. This consequence is usually acceptable, and the tradeoff commonly weighs in favor of using this pattern. You should also feel free to customize tab indicators, showing text and/or icons to make optimal use of vertical space. When adjusting indicator heights however, ensure that tab indicators are large enough for a human finger to touch without error.</p> + + +<h2 id="paging">Horizontal Paging</h2> + +<p>Another popular lateral navigation pattern is horizontal paging. This pattern applies best to collection-related sibling screens, such as a list of categories (world, business, technology, and health stories). Like tabs, this pattern also allows grouping screens in that the parent presents the contents of child screens embedded within its own layout.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-paging.png" + alt="Example horizontal paging navigation interface with relevant screen map excerpt" id="figure-paging"> + +<p class="img-caption"><strong>Figure 6.</strong> Example horizontal paging navigation interface with relevant screen map excerpt.</p> + + +<p>In a horizontal paging UI, a single child screen (referred to as a <em>page</em> here) is presented one at a time. Users are able to navigate to sibling screens by touching and dragging the screen horizontally in the direction of the desired adjacent page. This gestural interaction is often complemented by another UI element indicating the current page and available pages, to aid discoverability and provide more context to the user. This practice is especially necessary when using this pattern for lateral navigation of section-related sibling screens. Examples of such elements include tick marks, scrolling labels, and tabs.</p> + + +<img src="{@docRoot}images/training/app-navigation-descendant-lateral-paging-companion.png" + alt="Example paging companion UI elements" id="figure-paging-companion"> + +<p class="img-caption"><strong>Figure 7.</strong> Example paging companion UI elements.</p> + + +<p>It's also best to avoid this pattern when child screens contain horizontal panning surfaces (such as maps), as these conflicting interactions may deter your screen's usability.</p> + +<p>Additionally, for sibling-related screens, horizontal paging is most appropriate where there is some similarity in content type and when the number of siblings is relatively small. In these cases, this pattern can be used along with tabs above the content region to maximize the interface's intuitiveness. For collection-related screens, horizontal paging is most intuitive when there is a natural ordered relationship between screens, for example if each page represents consecutive calendar days. For infinite collections (again, calendar days), especially those with content in both directions, this paging mechanism can work quite well.</p> + +<p>In the next lesson, we discuss mechanisms for allowing users to navigate up our information hierarchy and back, to previously visited screens.</p>
\ No newline at end of file diff --git a/docs/html/training/design-navigation/example-wireframe-device-template.svg b/docs/html/training/design-navigation/example-wireframe-device-template.svg new file mode 100644 index 0000000..875ceb2 --- /dev/null +++ b/docs/html/training/design-navigation/example-wireframe-device-template.svg @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="2557.27px" height="2565.22px" viewBox="0 0 2557.27 2565.22" enable-background="new 0 0 2557.27 2565.22"
+ xml:space="preserve">
+<g id="_x31_0_x22__Tablet">
+ <path fill="#231F20" d="M2231.371,1201.779H951.401c-41.851,0-75.898-34.048-75.898-75.898V325.899
+ c0-41.851,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.048,75.898,75.898v799.981
+ C2307.27,1167.731,2273.222,1201.779,2231.371,1201.779z"/>
+ <g>
+ <path fill="#FFFFFF" d="M2231.371,269.185c31.273,0,56.715,25.442,56.715,56.715v799.981c0,31.272-25.441,56.715-56.715,56.715
+ H951.401c-31.272,0-56.715-25.442-56.715-56.715V325.899c0-31.272,25.442-56.715,56.715-56.715H2231.371 M2231.371,266.185
+ H951.401c-32.927,0-59.715,26.788-59.715,59.715v799.981c0,32.927,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.788,59.715-59.715V325.899C2291.086,292.973,2264.298,266.185,2231.371,266.185L2231.371,266.185z"/>
+ </g>
+ <g>
+ <rect x="949.886" y="324.39" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M2231.386,325.89v800h-1280v-800H2231.386 M2234.386,322.89h-3h-1280h-3v3v800v3h3h1280h3v-3v-800V322.89
+ L2234.386,322.89z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1591.386,310.613c-8.276,0-15.011-6.75-15.011-15.047
+ c0-8.296,6.734-15.047,15.011-15.047c8.277,0,15.012,6.751,15.012,15.047C1606.397,303.862,1599.663,310.613,1591.386,310.613z"/>
+ <rect x="951.401" y="1070.058" fill="#231F20" width="1279.97" height="55.823"/>
+</g>
+<g id="_x37__x22__Tablet">
+ <path fill="#231F20" d="M2118.382,2163.106h-1023.97c-41.851,0-75.898-34.048-75.898-75.898v-599.981
+ c0-41.851,34.048-75.898,75.898-75.898h1023.97c41.85,0,75.898,34.048,75.898,75.898v599.981
+ C2194.28,2129.059,2160.231,2163.106,2118.382,2163.106z"/>
+ <g>
+ <path fill="#FFFFFF" d="M2118.382,1430.512c31.273,0,56.715,25.442,56.715,56.715v599.981c0,31.272-25.441,56.715-56.715,56.715
+ h-1023.97c-31.272,0-56.715-25.442-56.715-56.715v-599.981c0-31.272,25.442-56.715,56.715-56.715H2118.382 M2118.382,1427.512
+ h-1023.97c-32.927,0-59.715,26.788-59.715,59.715v599.981c0,32.927,26.788,59.715,59.715,59.715h1023.97
+ c32.927,0,59.715-26.788,59.715-59.715v-599.981C2178.097,1454.3,2151.309,1427.512,2118.382,1427.512L2118.382,1427.512z"/>
+ </g>
+ <g>
+ <rect x="1092.896" y="1485.718" fill="#FFFFFF" width="1027.001" height="602.999"/>
+ <path fill="#FFFFFF" d="M2118.397,1487.218v599.999H1094.396v-599.999H2118.397 M2121.397,1484.218h-3H1094.396h-3v3v599.999v3h3
+ h1024.001h3v-3v-599.999V1484.218L2121.397,1484.218z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1606.396,1471.94c-8.277,0-15.011-6.751-15.011-15.048
+ c0-8.296,6.734-15.048,15.011-15.048s15.011,6.752,15.011,15.048C1621.408,1465.189,1614.673,1471.94,1606.396,1471.94z"/>
+ <rect x="1094.412" y="2031.386" fill="#231F20" width="1023.97" height="55.822"/>
+</g>
+<g id="Small_Handset">
+ <path fill="#231F20" d="M638.641,353.435c-0.329-24.343-2.396-48.913-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.769,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.215-1.602,51.165
+ c0,0-0.382,483.339-0.235,493.405c0.038,2.578,0.051,4.727,0.063,6.696l0.005,0.692c0.054,9.696,0.086,15.549,2.573,48.66
+ c2.718,36.187,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.368,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.193,7.275,0.39,10.803,0.588c16.6,0.921,32.279,1.792,53.264,1.792
+ c14.896,0,31.371-0.44,50.365-1.346c66.147-3.153,98.891-6.913,118.057-20.855c18.6-13.532,22.909-33.763,25.762-47.162l0.12-0.569
+ c3.372-15.818,3.445-51.611,3.445-62.362C638.641,822.225,638.641,398.058,638.641,353.435z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M640.947,922.112l-0.281,1.875c-0.072,0.478-0.702,4.665-1.37,8.28
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.314,13.785-25.246,24.332c-13.561,7.974-44.078,14.006-53.068,15.188
+ c-10.188,1.34-47.461,4.192-65.38,5.005c-16.789,0.761-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.007
+ c-18.312,0-31.146-0.512-41.738-0.991c-17.919-0.812-55.19-3.665-65.378-5.005c-8.989-1.181-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.241-25.249-24.331c-3.354-6.324-5.581-15.876-6.858-22.776c-0.679-3.678-1.283-7.586-1.335-7.917
+ l-0.29-1.878"/>
+ <g>
+ <path fill="#FFFFFF" d="M431.933,269.931c10.201,0,27.874,0.14,36.709,0.24c7.614,0.088,18.293,0.725,26.884,1.236l0.5,0.028
+ c2.512,0.15,4.87,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.722,0.531,1.806,1.179,1.945,2.255l0.032,0.244
+ c0.188,1.366-0.313,2.429-1.491,3.162c-0.987,0.615-1.323,0.715-2.397,0.715c-0.333,0-0.727-0.009-1.237-0.024l-1.704-0.035
+ c-3.76-0.057-11.223-0.741-18.543-1.436c-6.699-0.639-23.176-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.927,0-12.207,0.246-18.626,0.462l-0.784,0.026l-0.321,0.011c-2.095,0.07-4.106,0.138-5.936,0.191
+ c-5.415,0.16-11.042,0.538-16.006,0.872l-0.072,0.005l-0.324,0.023l-0.772,0.051c-1.764,0.118-3.423,0.229-4.936,0.315
+ c-1.136,0.066-2.321,0.142-3.51,0.219l-0.379,0.025c-3.293,0.214-6.697,0.435-9.014,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.919-0.193-1.602-0.633-2.027-1.306c-0.586-0.927-0.539-2.034-0.419-2.538c0.204-0.858,1.296-2.674,2.896-2.985
+ c1.384-0.269,5.948-0.476,11.28-0.719l4.125-0.19c7.029-0.332,32.182-1.323,41.398-1.381
+ C428.767,269.935,430.263,269.931,431.933,269.931 M431.933,266.931c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.798,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.365-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.944-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.018-1.241
+ C459.904,267.071,442.253,266.931,431.933,266.931L431.933,266.931z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M445.643,987.952c-11.699,0-21.22-9.546-21.22-21.277
+ c0-11.733,9.521-21.277,21.22-21.277c11.702,0,21.221,9.544,21.221,21.277C466.864,978.406,457.344,987.952,445.643,987.952"/>
+ <g>
+ <rect x="284.144" y="337.931" fill="#FFFFFF" width="323" height="536.333"/>
+ <path fill="#FFFFFF" d="M605.644,339.431v533.333h-320V339.431H605.644 M608.644,336.431h-3h-320h-3v3v533.333v3h3h320h3v-3
+ V339.431V336.431L608.644,336.431z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M444.618,286.874c20.732,0,40.963,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.385c0.173,23.873,0.312,42.728,0.355,46.401
+ c0.117,10.022,0.228,207.919,0.228,216.126c0,4.869,0.025,31.566,0.052,59.639l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.779c0.042,11.215,0.119,32.094-1.44,38.838
+ c-1.78,7.698-8.244,17.708-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.626-51.374,5.173-72.876,6.077
+ c-10.138,0.424-24.322,0.659-39.936,0.659c-14.254,0-27.824-0.205-36.3-0.544c-16.596-0.67-49.325-3.385-61.491-4.595
+ c-11.772-1.168-32.573-4.617-37.803-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.724-6.917
+ c-7.469-4.026-9.602-5.683-15.219-14.077c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.274,0.038-2.434,0.038-3.438
+ c0-8.102-0.566-120.259-0.689-136.374c-0.113-14.793-0.229-94.735-0.229-104.809c0-2.889-0.045-15.856-0.105-32.624
+ c-0.126-36.406-0.318-102.758-0.238-110.091c0.037-3.612,0.074-16.622,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.424-26.02,5.927-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112C434.558,286.917,439.625,286.874,444.618,286.874
+ M444.618,283.874c-5.001,0-10.086,0.043-15.113,0.128c-37.576,0.63-79.049,3.433-105.659,7.14
+ c-29.075,4.048-49.77,9.947-56.267,25.578c-5.725,13.776-5.925,26.097-6.156,40.364c-0.026,1.593-0.053,3.209-0.087,4.854
+ c-0.225,10.652-0.353,54.645-0.446,86.768l-0.001,0.445l-0.004,1.244l-0.002,0.76c-0.047,16.132-0.084,28.875-0.121,32.421
+ c-0.083,7.611,0.125,77.486,0.238,110.132c0.058,16.105,0.105,29.675,0.105,32.613c0,10.084,0.116,90.068,0.229,104.832
+ c0.123,16.079,0.689,128.219,0.689,136.351c0,0.979-0.018,2.108-0.037,3.347l-0.003,0.242c-0.139,9.21-0.372,24.627,4.85,32.428
+ c5.956,8.901,8.404,10.799,16.288,15.049c6.922,3.727,16.654,5.9,22.468,7.198l2.034,0.458c5.271,1.21,26.278,4.697,38.166,5.876
+ c12.167,1.209,44.961,3.932,61.666,4.607c8.541,0.342,22.156,0.547,36.421,0.547c15.646,0,29.873-0.235,40.062-0.661
+ c21.574-0.907,61.38-4.469,73.163-6.103c21.919-3.052,38.875-6.766,49.035-10.74c13.888-5.436,20.922-16.394,22.875-24.837
+ c1.511-6.537,1.575-23.83,1.517-39.525l-0.01-3.776c0-2.751-0.012-15.48-0.026-32.014l-0.013-14.213l-0.023-24.959
+ c-0.027-28.071-0.052-54.768-0.052-59.636c0-8.711-0.111-206.141-0.228-216.162c-0.044-3.633-0.181-22.327-0.355-46.388
+ l-0.017-2.384l-0.021-2.963c-0.275-37.599-0.618-84.392-0.755-92.91c-0.252-15.714-0.886-30.699-5.795-41.329
+ c-5.154-11.158-15.382-15.758-24.564-19.194c-9.274-3.474-23.76-6.253-46.969-9.013c-22.378-2.659-28.904-3.237-45.017-4.375
+ C485.72,284.593,465.419,283.874,444.618,283.874L444.618,283.874z"/>
+ </g>
+ <rect x="285.645" y="339.207" fill="#231F20" width="319.998" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M318.743,891.191c0,0-6.818,6.286-7.376,6.774
+ c-0.555,0.492-0.138,1.467,0.559,1.882c0.695,0.415,6.891,6.876,6.891,6.876l3.062-0.148l-6.334-6.39c0,0,6.82-0.09,9.604,0.11
+ c2.783,0.202,5.082,1.66,6.682,2.839c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.009c0,0-1.812-3.269-5.638-6.114
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.495L318.743,891.191z"/>
+ <rect x="392.356" y="888.479" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="399.31" y="895.032" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="399.31" y="901.099" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.86"/>
+ <rect x="399.31" y="907.514" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="487.511,887.038 473.048,901.12 474.717,902.724
+ 487.722,889.967 500.443,902.583 502.182,901.191 496.55,895.754 496.55,888.922 494.326,888.922 494.326,893.453 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="480.973,902.516 478.68,904.12 478.68,911.23
+ 496.412,911.23 496.412,904.12 494.255,902.305 494.255,909.209 480.973,909.209 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M571.515,901.24l2.348,2.962v1.463c0,0,3.686,4.25,5.074,5.368
+ c1.393,1.114,1.738,0.626,2.227,0.138c0.488-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.067
+ l-1.637-2.091"/>
+ <g>
+ <path fill="#FFFFFF" d="M566.586,888.603c3.648,0,6.616,2.968,6.616,6.616s-2.968,6.616-6.616,6.616s-6.616-2.968-6.616-6.616
+ S562.938,888.603,566.586,888.603 M566.586,885.603c-5.311,0-9.616,4.305-9.616,9.616s4.305,9.616,9.616,9.616
+ s9.616-4.305,9.616-9.616S571.897,885.603,566.586,885.603L566.586,885.603z"/>
+ </g>
+</g>
+<g id="Large_Handset">
+ <path fill="#231F20" d="M673.591,1461.043c-14.578-14.986-32.588-18.381-47.061-21.108c-16.369-3.083-46.477-7.304-96.95-9.899
+ c-22.281-1.145-39.93-1.675-56.9-1.71c-16.97,0.035-34.619,0.565-56.9,1.71c-50.474,2.596-80.581,6.816-96.95,9.899
+ c-14.473,2.728-32.483,6.122-47.061,21.108c-14.422,14.822-16.753,39.393-17.124,63.735c0,44.624,0,588.79,0,658.161
+ c0,10.75,0.083,46.543,3.885,62.361l0.135,0.569c3.218,13.398,8.076,33.63,29.048,47.161c21.61,13.943,58.53,17.703,133.114,20.855
+ c19.343,0.818,36.362,1.255,51.852,1.332c15.49-0.077,32.509-0.514,51.852-1.332c74.584-3.152,111.504-6.912,133.114-20.855
+ c20.972-13.531,25.831-33.763,29.048-47.161l0.135-0.569c3.802-15.818,3.885-51.611,3.885-62.361c0-69.371,0-613.537,0-658.161
+ C690.344,1500.436,688.013,1475.865,673.591,1461.043z"/>
+ <g>
+ <path fill="#FFFFFF" d="M472.7,1438.325c16.802,0.035,34.199,0.559,56.366,1.696c49.911,2.567,79.543,6.714,95.613,9.74
+ c13.767,2.595,29.372,5.535,41.744,18.254c11.974,12.306,13.949,34.584,14.292,56.838v658.086c0,39.165-2.26,54.418-3.608,60.024
+ l-0.142,0.596c-3.008,12.524-7.135,29.71-24.74,41.069c-19.537,12.604-56.878,16.256-128.115,19.267
+ c-19.208,0.812-36.032,1.246-51.43,1.323c-15.397-0.077-32.221-0.511-51.429-1.323c-71.238-3.011-108.579-6.662-128.116-19.267
+ c-17.605-11.359-21.732-28.545-24.746-41.093l-0.129-0.546c-1.354-5.633-3.614-20.886-3.614-60.051v-658.086
+ c0.342-22.254,2.318-44.532,14.291-56.837c12.373-12.72,27.978-15.66,41.746-18.255c16.068-3.026,45.7-7.173,95.612-9.74
+ C438.46,1438.884,455.857,1438.36,472.7,1438.325 M472.707,1435.325H472.7h-0.006c-16.889,0.035-34.331,0.56-56.554,1.7
+ c-50.081,2.576-79.854,6.745-96.013,9.788c-14.207,2.678-30.307,5.712-43.341,19.111c-12.71,13.062-14.788,36.021-15.14,58.883
+ l0,658.132c0,39.477,2.316,55.008,3.697,60.752l0.127,0.537c3.134,13.05,7.424,30.91,26.039,42.921
+ c20.12,12.981,57.826,16.709,129.615,19.743c19.268,0.815,36.127,1.249,51.541,1.326c15.444-0.077,32.303-0.511,51.572-1.326
+ c71.789-3.034,109.495-6.762,129.615-19.743c18.615-12.011,22.901-29.858,26.031-42.89l0.143-0.602
+ c1.377-5.728,3.689-21.242,3.689-60.719v-658.086c-0.352-22.908-2.43-45.866-15.142-58.93
+ c-13.033-13.398-29.131-16.433-43.335-19.109c-16.164-3.044-45.939-7.213-96.018-9.789
+ C506.997,1435.885,489.567,1435.36,472.707,1435.325L472.707,1435.325z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M456.361,1471.519c11.529,0,31.394,0.157,41.302,0.271c8.57,0.098,20.592,0.813,30.257,1.39l0.569,0.033
+ c2.824,0.168,5.476,0.325,7.827,0.454c9.554,0.521,18.347,1.056,20.965,1.861c2.168,0.67,2.292,1.63,2.45,2.851l0.035,0.27
+ c0.23,1.671-0.41,3.029-1.851,3.926c-1.162,0.724-1.623,0.86-2.896,0.86c-0.377,0-0.824-0.01-1.399-0.026l-1.914-0.04
+ c-4.237-0.064-12.645-0.834-20.891-1.617c-7.518-0.717-26.046-1.49-35.98-1.751c-9.945-0.258-29.553-0.258-36.935-0.258
+ c-5.585,0-14.102,0.288-20.939,0.521l-0.885,0.028l-0.238,0.008c-2.401,0.081-4.708,0.158-6.803,0.219
+ c-6.091,0.181-12.423,0.607-18.01,0.982l-0.062,0.004l-0.365,0.026l-1.025,0.068c-1.928,0.128-3.743,0.249-5.4,0.344
+ c-1.277,0.074-2.609,0.159-3.946,0.247l-0.4,0.025c-3.536,0.23-7.543,0.491-10.191,0.491c-1.27,0-2.19-0.059-2.74-0.175
+ c-1.137-0.239-1.985-0.79-2.521-1.638c-0.725-1.146-0.667-2.517-0.519-3.142c0.256-1.078,1.562-3.253,3.552-3.639
+ c1.584-0.308,6.483-0.53,12.685-0.812l0.061-0.003l4.639-0.215c7.912-0.374,36.221-1.488,46.59-1.554
+ C452.799,1471.522,454.482,1471.519,456.361,1471.519 M456.361,1468.519c-1.885,0-3.574,0.004-4.997,0.012
+ c-10.468,0.066-38.811,1.184-46.715,1.557l-4.636,0.215c-6.603,0.3-11.373,0.516-13.178,0.866
+ c-3.435,0.667-5.44,3.965-5.898,5.889c-0.334,1.411-0.274,3.581,0.902,5.44c0.97,1.535,2.504,2.562,4.438,2.97
+ c0.775,0.164,1.841,0.239,3.357,0.239c2.722,0,6.618-0.252,10.386-0.497l0.402-0.026c1.328-0.087,2.652-0.172,3.922-0.245
+ c1.954-0.111,4.129-0.26,6.451-0.414l0.376-0.026c5.577-0.375,11.897-0.801,17.952-0.98c2.167-0.062,4.562-0.144,7.053-0.228
+ l0.88-0.028c7.207-0.244,15.375-0.519,20.843-0.519c7.372,0,26.95,0,36.857,0.257c9.872,0.259,28.29,1.024,35.773,1.738
+ c8.311,0.789,16.788,1.564,21.13,1.631l1.897,0.039c0.583,0.018,1.059,0.027,1.461,0.027c1.839,0,2.843-0.294,4.481-1.313
+ c2.449-1.524,3.629-4.039,3.238-6.882l-0.033-0.25c-0.185-1.429-0.529-4.089-4.54-5.327c-2.685-0.827-9.41-1.321-21.687-1.99
+ c-2.345-0.129-4.992-0.286-7.812-0.454l-0.575-0.033c-9.708-0.578-21.788-1.296-30.396-1.395
+ C487.829,1468.677,467.971,1468.519,456.361,1468.519L456.361,1468.519z"/>
+ </g>
+ <g>
+ <rect x="290.286" y="1546.873" fill="#FFFFFF" width="363" height="643"/>
+ <path fill="#FFFFFF" d="M651.786,1548.373v640h-360v-640H651.786 M654.786,1545.373h-3h-360h-3v3v640v3h3h360h3v-3v-640V1545.373
+ L654.786,1545.373z"/>
+ </g>
+ <rect x="291.786" y="1548.373" fill="#231F20" width="360" height="24.184"/>
+</g>
+</svg>
diff --git a/docs/html/training/design-navigation/example-wireframe-phone.svg b/docs/html/training/design-navigation/example-wireframe-phone.svg new file mode 100644 index 0000000..96e9e33 --- /dev/null +++ b/docs/html/training/design-navigation/example-wireframe-phone.svg @@ -0,0 +1,1958 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="2699.51px" height="3512.62px" viewBox="0 0 2699.51 3512.62" enable-background="new 0 0 2699.51 3512.62"
+ xml:space="preserve">
+<font horiz-adv-x="2048">
+<!-- Droid is a trademark of Google and may be registered in certain jurisdictions. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="DroidSerif" units-per-em="2048" underline-position="-154" underline-thickness="102"/>
+<missing-glyph horiz-adv-x="1024" d="M102,0l0,1462l820,0l0,-1462M201,98l622,0l0,1266l-622,0z"/>
+<glyph unicode=" " horiz-adv-x="532"/>
+<glyph unicode="," horiz-adv-x="512" d="M397,86C397,43 391,1 379,-40C367,-81 348,-118 321,-153C294,-188 259,-219 217,-246C174,-274 122,-297 61,-315l0,86C128,-208 178,-182 209,-151C240,-120 256,-85 256,-45C256,-32 252,-20 245,-11C238,-2 228,6 217,13C206,20 194,26 181,33C168,40 156,48 145,57C134,66 124,78 117,92C110,105 106,122 106,143C106,182 119,212 145,233C170,254 202,264 240,264C261,264 281,260 300,253C319,245 335,234 350,219C365,204 376,185 385,163C393,140 397,115 397,86z"/>
+<glyph unicode="-" horiz-adv-x="635" d="M51,481l0,154l533,0l0,-154z"/>
+<glyph unicode="." horiz-adv-x="586" d="M164,125C164,152 167,174 174,192C181,209 190,223 202,234C213,245 227,252 243,257C258,262 275,264 293,264C310,264 327,262 343,257C358,252 372,245 384,234C395,223 405,209 412,192C419,174 422,152 422,125C422,99 419,77 412,59C405,41 395,27 384,16C372,5 358,-2 343,-7C327,-12 310,-14 293,-14C275,-14 258,-12 243,-7C227,-2 213,5 202,16C190,27 181,41 174,59C167,77 164,99 164,125z"/>
+<glyph unicode="A" horiz-adv-x="1444" d="M414,489l-78,-215C330,258 325,242 322,227C319,211 317,197 317,186C317,151 328,126 351,110C373,94 407,86 453,86l47,0l0,-86l-500,0l0,86l39,0C59,86 76,88 90,93C104,97 117,105 128,117C139,129 150,145 161,166C171,187 182,213 195,246l454,1216l160,0l463,-1267C1280,174 1288,156 1297,142C1305,128 1315,117 1326,109C1337,100 1350,94 1365,91C1380,88 1397,86 1417,86l27,0l0,-86l-563,0l0,86l47,0C1010,86 1051,119 1051,184C1051,195 1050,207 1047,219C1044,231 1039,245 1034,260l-82,229M788,950C767,1011 747,1068 730,1121C712,1174 697,1225 686,1274C681,1249 676,1226 670,1203C663,1180 656,1156 649,1132C642,1108 633,1083 624,1057C615,1030 604,1001 592,969l-139,-377l462,0z"/>
+<glyph unicode="E" horiz-adv-x="1276" d="M479,102l395,0C907,102 935,107 958,116C981,125 1000,137 1015,152C1030,167 1042,185 1051,206C1060,226 1066,247 1069,270l14,88l107,0l-14,-358l-1098,0l0,86l26,0C127,86 148,88 169,91C189,94 207,100 222,109C237,118 250,132 259,151C268,169 272,193 272,223l0,1006C272,1261 268,1287 259,1306C250,1325 238,1340 223,1351C208,1361 190,1368 170,1371C149,1374 127,1376 104,1376l-26,0l0,86l1032,0l10,-358l-106,0l-10,88C1001,1215 996,1236 989,1257C981,1277 970,1295 956,1310C941,1325 923,1338 902,1347C880,1356 854,1360 823,1360l-344,0l0,-545l494,0l0,-100l-494,0z"/>
+<glyph unicode="N" horiz-adv-x="1563" d="M1165,0l-768,1180l0,-947C397,201 402,175 411,156C420,137 432,122 447,112C462,101 479,94 500,91C521,88 542,86 565,86l27,0l0,-86l-514,0l0,86l26,0C127,86 149,88 170,91C190,94 208,101 223,112C238,122 250,137 259,156C268,175 272,201 272,233l0,1004C272,1267 268,1291 259,1310C250,1328 237,1342 222,1352C207,1362 189,1369 169,1372C148,1375 127,1376 104,1376l-26,0l0,86l375,0l733,-1132l0,907C1186,1267 1182,1291 1173,1310C1164,1328 1151,1342 1136,1352C1121,1362 1103,1369 1083,1372C1062,1375 1041,1376 1018,1376l-27,0l0,86l514,0l0,-86l-26,0C1456,1376 1434,1374 1414,1371C1393,1368 1375,1361 1360,1351C1345,1340 1333,1325 1324,1306C1315,1287 1311,1261 1311,1229l0,-1229z"/>
+<glyph unicode="P" horiz-adv-x="1237" d="M78,0l0,86l26,0C127,86 149,88 170,91C190,94 208,101 223,112C238,122 250,137 259,156C268,175 272,201 272,233l0,1004C272,1267 268,1291 259,1310C250,1328 237,1342 222,1352C207,1362 189,1369 169,1372C148,1375 127,1376 104,1376l-26,0l0,86l575,0C739,1462 814,1452 877,1433C940,1413 993,1385 1034,1348C1075,1311 1106,1266 1127,1213C1147,1160 1157,1101 1157,1034C1157,973 1148,915 1129,859C1110,803 1078,754 1035,711C992,668 935,633 865,608C795,582 709,569 608,569l-129,0l0,-346C479,193 484,169 493,151C502,132 514,118 529,109C544,100 562,94 583,91C603,88 624,86 647,86l68,0l0,-86M479,666l109,0C650,666 703,673 747,686C791,699 827,720 855,749C883,778 904,815 917,861C930,906 936,961 936,1026C936,1083 930,1133 919,1176C908,1218 889,1253 864,1281C839,1309 806,1330 766,1344C725,1357 676,1364 618,1364l-139,0z"/>
+<glyph unicode="V" horiz-adv-x="1382" d="M614,0l-442,1268C165,1289 157,1307 148,1321C139,1335 129,1346 118,1354C107,1362 94,1368 79,1371C64,1374 47,1376 27,1376l-27,0l0,86l563,0l0,-86l-47,0C475,1376 444,1368 424,1353C403,1337 393,1312 393,1278C393,1267 395,1255 398,1243C401,1231 405,1217 410,1202l225,-665C656,476 673,418 688,361C703,304 716,250 727,201C738,250 750,303 765,358C780,413 798,473 821,537l226,651C1052,1205 1057,1221 1060,1236C1063,1251 1065,1265 1065,1276C1065,1311 1054,1337 1032,1353C1009,1368 975,1376 930,1376l-47,0l0,86l499,0l0,-86l-39,0C1323,1376 1306,1374 1292,1370C1277,1366 1264,1358 1253,1347C1241,1335 1230,1319 1220,1298C1210,1277 1199,1250 1188,1217l-424,-1217z"/>
+<glyph unicode="a" horiz-adv-x="1153" d="M301,297C301,233 315,185 342,154C369,122 410,106 467,106C508,106 546,113 580,126C613,139 642,158 666,183C689,208 707,238 720,273C733,308 739,348 739,391l0,166l-131,-6C550,548 502,541 463,530C424,518 392,502 368,481C344,460 327,434 317,403C306,372 301,337 301,297M549,1016C510,1016 478,1011 454,1000C429,989 410,973 397,953C383,933 374,909 369,882C364,855 362,825 362,793C305,793 262,803 233,822C203,841 188,875 188,922C188,957 198,987 217,1012C236,1037 263,1057 297,1073C330,1088 369,1100 414,1107C459,1114 506,1118 557,1118C620,1118 674,1112 721,1100C768,1087 807,1067 838,1039C869,1011 893,975 909,930C924,885 932,829 932,764l0,-531C932,204 934,181 939,162C944,143 951,128 961,117C971,106 984,98 1001,93C1017,88 1036,86 1059,86l6,0l0,-86l-277,0l-32,176l-17,0C718,147 697,121 677,97C657,73 635,52 611,35C587,18 560,4 530,-5C499,-15 463,-20 420,-20C375,-20 333,-13 294,0C255,13 221,33 193,60C164,87 142,121 126,162C110,203 102,251 102,307C102,416 141,496 218,549C295,602 412,630 569,635l170,6l0,123C739,801 737,835 733,866C729,897 720,923 707,946C694,968 675,985 650,998C625,1010 591,1016 549,1016z"/>
+<glyph unicode="b" horiz-adv-x="1257" d="M1145,551C1145,452 1136,367 1118,295C1099,223 1072,164 1037,117C1002,70 958,36 906,14C854,-9 794,-20 727,-20C688,-20 652,-16 620,-7C588,2 559,14 534,30C508,46 485,65 466,87C446,109 429,133 414,160l-13,0l-36,-160l-328,0l0,86l16,0C76,86 98,88 119,91C139,94 157,101 172,112C187,122 199,137 208,156C217,175 221,201 221,233l0,1098C221,1361 217,1385 208,1404C199,1422 186,1436 171,1446C156,1456 138,1463 118,1466C97,1469 76,1470 53,1470l-16,0l0,86l377,0l0,-376C414,1157 414,1130 413,1100C412,1069 411,1040 410,1012C409,980 407,947 406,913l8,0C429,944 447,973 466,998C485,1023 508,1045 533,1063C558,1080 587,1094 619,1104C651,1113 687,1118 727,1118C794,1118 854,1107 906,1085C958,1062 1002,1028 1037,982C1072,935 1099,876 1118,805C1136,734 1145,649 1145,551M692,987C639,987 594,978 559,961C523,943 494,916 473,880C452,844 437,799 428,744C419,689 414,625 414,551C414,480 419,417 428,362C437,307 452,261 474,224C495,187 524,159 560,140C595,121 640,111 694,111C739,111 778,121 810,140C841,159 867,187 888,224C908,261 923,308 932,363C941,418 946,481 946,553C946,626 941,689 932,744C923,798 908,843 888,879C867,915 841,942 809,960C776,978 737,987 692,987z"/>
+<glyph unicode="c" horiz-adv-x="1008" d="M580,-20C512,-20 449,-9 392,12C335,33 285,66 244,111C203,156 171,215 148,286C125,357 113,442 113,543C113,652 125,744 148,818C171,891 203,950 244,995C285,1040 333,1071 389,1090C444,1109 504,1118 569,1118C612,1118 654,1114 697,1106C739,1097 777,1084 811,1067C845,1050 873,1028 894,1002C915,975 926,944 926,909C926,862 911,828 880,809C849,790 804,780 743,780C743,812 740,842 735,871C730,900 721,925 708,947C695,968 677,985 655,998C632,1010 604,1016 569,1016C530,1016 494,1009 463,994C431,979 404,954 381,918C358,882 341,834 329,773C317,712 311,636 311,545C311,400 335,291 384,220C432,149 511,113 621,113C684,113 740,126 787,153C834,180 870,214 893,256C903,248 911,237 918,224C925,211 928,195 928,176C928,153 921,129 906,106C891,83 870,62 841,43C812,24 775,9 732,-2C689,-14 638,-20 580,-20z"/>
+<glyph unicode="d" horiz-adv-x="1257" d="M1036,225C1036,195 1041,171 1050,153C1059,134 1071,120 1086,110C1101,100 1119,94 1140,91C1160,88 1181,86 1204,86l17,0l0,-86l-347,0l-22,184l-8,0C829,153 811,125 792,100C772,75 749,53 724,36C699,18 670,4 638,-5C606,-15 570,-20 530,-20C463,-20 403,-9 351,14C299,36 255,70 220,117C185,163 158,222 140,293C122,364 113,449 113,547C113,646 122,731 140,803C158,875 185,934 220,981C255,1028 299,1062 351,1085C403,1107 463,1118 530,1118C569,1118 605,1114 637,1105C669,1096 698,1084 724,1068C749,1052 772,1033 792,1011C812,989 829,965 844,938l12,0C854,971 852,1003 850,1032C849,1057 847,1083 846,1108C845,1133 844,1151 844,1163l0,168C844,1361 840,1385 831,1404C822,1422 809,1436 794,1446C779,1456 761,1463 741,1466C720,1469 699,1470 676,1470l-17,0l0,86l377,0M565,111C618,111 663,120 699,138C734,155 763,182 785,218C806,254 822,299 831,354C840,409 844,473 844,547C844,618 840,681 831,736C822,791 806,837 785,874C763,911 734,939 698,958C662,977 617,987 563,987C518,987 480,977 448,958C416,939 390,910 370,873C349,836 334,790 325,735C316,680 311,616 311,545C311,400 331,291 370,219C409,147 474,111 565,111z"/>
+<glyph unicode="e" horiz-adv-x="1096" d="M563,1008C487,1008 429,977 388,916C347,854 322,764 315,645l471,0C786,699 782,748 774,793C766,838 753,876 736,908C719,940 696,965 668,982C639,999 604,1008 563,1008M588,-20C514,-20 448,-7 389,18C330,43 280,79 239,127C198,175 167,234 146,304C124,373 113,452 113,541C113,732 152,876 231,973C310,1070 422,1118 567,1118C633,1118 692,1108 745,1087C798,1066 842,1036 879,995C916,954 944,903 964,842C983,781 993,710 993,629l0,-94l-682,0C312,460 320,396 334,343C347,289 367,245 393,210C418,175 450,150 487,134C524,117 567,109 616,109C651,109 684,113 715,121C745,129 772,140 797,153C822,166 844,182 863,199C882,216 897,233 909,252C918,248 927,240 936,227C944,214 948,199 948,182C948,161 941,139 926,116C911,92 889,70 859,50C829,30 792,13 747,0C702,-13 649,-20 588,-20z"/>
+<glyph unicode="f" horiz-adv-x="756" d="M688,86l0,-86l-633,0l0,86l27,0C105,86 127,88 148,91C168,94 186,101 201,112C216,122 228,137 237,156C246,175 250,201 250,233l0,768l-187,0l0,97l187,0l0,102C250,1261 258,1315 275,1362C292,1409 316,1448 347,1480C378,1512 416,1536 461,1553C506,1569 556,1577 612,1577C665,1577 710,1574 747,1567C784,1560 813,1550 836,1537C858,1524 874,1509 884,1492C894,1475 899,1455 899,1434C899,1415 895,1399 887,1385C878,1370 867,1358 852,1349C837,1339 819,1332 799,1327C778,1322 756,1319 731,1319C731,1340 729,1360 725,1380C720,1399 713,1417 703,1432C692,1447 678,1460 661,1469C644,1478 622,1483 596,1483C567,1483 542,1477 523,1466C503,1455 487,1438 475,1416C463,1393 455,1366 450,1333C445,1300 442,1262 442,1219l0,-121l289,0l0,-97l-289,0l0,-768C442,201 447,175 456,156C465,137 477,122 492,112C507,101 524,94 545,91C566,88 587,86 610,86z"/>
+<glyph unicode="g" horiz-adv-x="1102" d="M1077,1055C1077,1040 1075,1027 1071,1014C1066,1001 1060,989 1051,980C1042,970 1031,962 1018,957C1004,951 988,948 969,948C969,956 968,964 966,972C964,980 961,988 956,995C951,1002 944,1007 935,1012C926,1016 915,1018 901,1018C884,1018 868,1016 854,1012C840,1008 826,1002 813,993C836,964 856,931 871,892C886,853 893,804 893,745C893,694 885,648 870,605C855,562 832,524 802,493C771,462 733,437 687,420C640,402 586,393 524,393C516,393 507,393 497,394C487,394 477,394 467,395C457,395 448,396 439,397C430,398 423,398 418,399C405,392 392,385 380,377C368,369 358,360 349,350C340,340 332,329 327,316C322,303 319,289 319,274C319,257 322,244 329,234C335,224 344,216 355,211C366,205 380,201 396,200C411,198 428,197 446,197l232,0C739,197 791,189 834,174C877,159 912,138 939,111C966,84 985,51 998,14C1010,-24 1016,-65 1016,-109C1016,-168 1005,-221 984,-268C962,-315 929,-355 884,-388C839,-421 783,-447 715,-465C646,-483 566,-492 473,-492C330,-492 224,-466 153,-413C82,-360 47,-287 47,-193C47,-153 54,-118 68,-88C82,-58 101,-32 125,-11C148,10 175,28 206,41C237,54 269,64 303,70C289,76 275,84 262,94C249,104 237,116 226,130C215,144 207,160 200,178C193,196 190,216 190,238C190,279 201,314 222,344C243,373 277,402 324,430C295,442 269,459 246,480C223,501 203,525 188,552C172,579 160,608 152,640C143,672 139,705 139,739C139,798 147,851 163,898C179,945 203,984 235,1017C267,1050 307,1075 355,1092C403,1109 459,1118 524,1118C549,1118 573,1116 597,1113C621,1109 643,1104 664,1098C684,1091 702,1084 719,1076C735,1068 748,1060 758,1051C768,1062 780,1074 793,1087C806,1100 821,1112 838,1123C855,1134 873,1143 893,1150C912,1157 933,1161 956,1161C977,1161 995,1158 1010,1153C1025,1147 1037,1139 1047,1130C1057,1120 1065,1109 1070,1096C1075,1083 1077,1069 1077,1055M213,-180C213,-210 217,-238 225,-264C233,-290 247,-312 267,-331C287,-350 314,-364 348,-375C382,-386 425,-391 477,-391C550,-391 611,-385 659,-372C706,-360 744,-343 772,-321C800,-299 820,-273 831,-242C842,-212 848,-179 848,-143C848,-112 844,-86 835,-65C826,-45 812,-29 795,-17C777,-6 755,2 729,7C703,12 673,14 639,14l-201,0C409,14 382,12 355,7C328,2 304,-8 283,-22C262,-36 245,-56 232,-81C219,-106 213,-139 213,-180M332,745C332,658 347,594 376,553C405,512 452,492 518,492C551,492 580,497 603,507C626,517 644,532 659,553C674,574 684,600 691,633C697,665 700,703 700,748C700,840 686,908 658,952C630,996 583,1018 516,1018C450,1018 403,996 375,951C346,906 332,837 332,745z"/>
+<glyph unicode="i" horiz-adv-x="655" d="M74,86C97,86 118,88 139,91C159,94 177,100 192,109C207,118 220,132 229,151C238,169 242,193 242,223l0,649C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l366,0l0,-865C434,201 439,175 448,156C457,137 469,122 484,112C499,101 516,94 537,91C558,88 579,86 602,86l27,0l0,-86l-582,0l0,86M213,1430C213,1454 216,1474 222,1490C228,1506 236,1519 247,1529C258,1539 270,1546 284,1550C298,1554 313,1556 330,1556C346,1556 361,1554 375,1550C389,1546 401,1539 412,1529C422,1519 430,1506 437,1490C443,1474 446,1454 446,1430C446,1406 443,1386 437,1370C430,1354 422,1341 412,1331C401,1321 389,1314 375,1310C361,1305 346,1303 330,1303C313,1303 298,1305 284,1310C270,1314 258,1321 247,1331C236,1341 228,1354 222,1370C216,1386 213,1406 213,1430z"/>
+<glyph unicode="l" horiz-adv-x="635" d="M53,86C76,86 98,88 119,91C139,94 157,101 172,112C187,122 199,137 208,156C217,175 221,201 221,233l0,1098C221,1361 217,1385 208,1404C199,1422 186,1436 171,1446C156,1456 138,1463 118,1466C97,1469 76,1470 53,1470l-26,0l0,86l387,0l0,-1323C414,201 418,175 427,156C436,137 448,122 463,112C478,101 496,94 517,91C537,88 559,86 582,86l26,0l0,-86l-581,0l0,86z"/>
+<glyph unicode="m" horiz-adv-x="1935" d="M608,86l0,-86l-551,0l0,86l27,0C107,86 129,88 148,91C167,94 184,101 198,112C212,122 223,137 231,156C238,175 242,201 242,233l0,639C242,902 238,926 230,945C222,963 211,977 197,987C183,997 166,1004 147,1007C128,1010 107,1012 84,1012l-6,0l0,86l321,0l27,-166l10,0C457,970 478,1001 501,1026C524,1050 548,1069 574,1083C599,1096 626,1106 655,1111C683,1116 713,1118 745,1118C778,1118 810,1115 840,1108C870,1101 898,1091 924,1076C949,1061 972,1042 993,1019C1013,995 1029,966 1042,932l17,0C1080,970 1102,1001 1126,1026C1150,1050 1176,1069 1203,1083C1230,1096 1258,1106 1288,1111C1317,1116 1348,1118 1380,1118C1432,1118 1479,1110 1520,1095C1561,1079 1596,1055 1625,1023C1654,990 1676,949 1691,898C1706,847 1714,787 1714,717l0,-484C1714,201 1718,175 1726,156C1734,137 1745,122 1759,112C1773,101 1790,94 1809,91C1828,88 1849,86 1872,86l6,0l0,-86l-356,0l0,707C1522,752 1518,791 1511,826C1503,861 1491,890 1474,914C1457,938 1434,956 1407,969C1380,981 1346,987 1307,987C1264,987 1229,979 1200,963C1171,946 1147,924 1129,896C1111,868 1098,836 1091,799C1083,762 1079,723 1079,682l0,-449C1079,201 1083,175 1091,156C1099,137 1110,122 1124,112C1138,101 1155,94 1174,91C1193,88 1214,86 1237,86l6,0l0,-86l-356,0l0,707C887,752 883,791 876,826C868,861 856,890 839,914C822,938 799,956 772,969C745,981 711,987 672,987C627,987 590,978 560,960C529,942 505,918 486,887C467,856 454,821 446,781C438,741 434,699 434,655l0,-432C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86z"/>
+<glyph unicode="n" horiz-adv-x="1321" d="M608,86l0,-86l-551,0l0,86l17,0C97,86 119,88 140,91C160,94 178,101 193,112C208,122 220,137 229,156C238,175 242,201 242,233l0,639C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l331,0l27,-166l10,0C457,970 480,1001 504,1026C527,1050 552,1069 579,1083C605,1096 633,1106 663,1111C692,1116 723,1118 756,1118C810,1118 858,1110 901,1095C943,1079 979,1055 1009,1023C1038,990 1061,949 1077,898C1092,847 1100,787 1100,717l0,-484C1100,201 1104,175 1112,156C1119,137 1130,122 1144,112C1158,101 1175,94 1194,91C1213,88 1234,86 1257,86l7,0l0,-86l-357,0l0,707C907,752 903,791 895,826C887,861 874,890 857,914C839,938 816,956 787,969C758,981 723,987 682,987C635,987 596,978 565,960C533,942 507,918 488,887C469,856 455,821 447,781C438,741 434,699 434,655l0,-432C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86z"/>
+<glyph unicode="o" horiz-adv-x="1182" d="M1069,551C1069,358 1028,215 947,121C865,27 745,-20 588,-20C514,-20 448,-8 389,15C330,38 281,74 240,121C199,168 167,228 146,300C124,371 113,455 113,551C113,742 154,885 235,978C316,1071 435,1118 594,1118C668,1118 734,1107 793,1084C852,1061 902,1026 943,979C984,932 1015,873 1037,802C1058,731 1069,647 1069,551M311,551C311,475 316,408 326,350C336,292 352,244 375,205C397,166 426,136 462,116C497,96 541,86 592,86C643,86 687,96 722,116C757,136 786,166 808,205C830,244 846,292 856,350C865,408 870,475 870,551C870,627 865,694 855,751C845,808 829,856 807,895C785,933 756,962 721,981C685,1000 641,1010 590,1010C539,1010 495,1000 460,981C425,962 396,933 374,895C352,856 336,808 326,751C316,694 311,627 311,551z"/>
+<glyph unicode="p" horiz-adv-x="1257" d="M692,987C639,987 594,978 559,961C523,943 494,916 473,880C452,844 437,799 428,744C419,689 414,625 414,551C414,480 419,417 428,362C437,307 452,261 474,224C495,187 524,159 560,140C595,121 640,111 694,111C739,111 778,121 810,140C841,159 867,187 888,224C908,261 923,308 932,363C941,418 946,481 946,553C946,626 941,689 932,744C923,798 908,843 888,879C867,915 841,942 809,960C776,978 737,987 692,987M1145,551C1145,452 1136,367 1118,295C1099,223 1072,164 1037,117C1002,70 958,36 906,14C854,-9 794,-20 727,-20C688,-20 652,-16 620,-7C588,2 559,14 534,30C508,46 485,65 466,87C446,109 429,133 414,160l-8,0C407,125 409,92 410,61C411,48 411,35 412,22C412,8 412,-5 413,-17C413,-29 413,-40 414,-49C414,-59 414,-67 414,-72l0,-196C414,-298 419,-322 428,-340C437,-359 449,-373 464,-382C479,-392 497,-398 518,-401C538,-404 559,-406 582,-406l6,0l0,-86l-551,0l0,86l16,0C76,-406 98,-404 119,-401C139,-398 157,-391 172,-380C187,-370 199,-355 208,-335C217,-316 221,-290 221,-258l0,1130C221,902 217,926 208,945C199,963 186,977 171,987C156,997 138,1004 118,1007C97,1010 76,1012 53,1012l-26,0l0,86l358,0l21,-185l8,0C429,944 447,973 466,998C485,1023 508,1045 533,1063C558,1080 587,1094 619,1104C651,1113 687,1118 727,1118C794,1118 854,1107 906,1085C958,1062 1002,1028 1037,982C1072,935 1099,876 1118,805C1136,734 1145,649 1145,551z"/>
+<glyph unicode="q" horiz-adv-x="1257" d="M1221,-492l-613,0l0,86l68,0C699,-406 721,-404 742,-401C762,-398 780,-391 795,-380C810,-370 822,-355 831,-335C840,-316 844,-290 844,-258l0,176C844,-59 844,-32 845,-1C846,29 847,58 848,86C849,118 851,151 852,184l-8,0C829,153 811,125 792,100C772,75 749,53 724,36C699,18 670,4 638,-5C606,-15 570,-20 530,-20C463,-20 403,-9 351,14C299,36 255,70 220,117C185,163 158,222 140,293C122,364 113,449 113,547C113,646 122,731 140,803C158,875 185,934 220,981C255,1028 299,1062 351,1085C403,1107 463,1118 530,1118C569,1118 605,1114 637,1105C669,1096 698,1084 724,1068C749,1052 772,1033 792,1011C812,989 829,965 844,938l12,0l37,160l328,0l0,-86l-17,0C1181,1012 1160,1010 1139,1007C1118,1004 1101,997 1086,987C1071,976 1059,961 1050,942C1041,922 1036,896 1036,864l0,-1130C1036,-296 1041,-320 1050,-338C1059,-357 1071,-371 1086,-381C1101,-391 1119,-398 1140,-401C1160,-404 1181,-406 1204,-406l17,0M565,111C618,111 663,120 699,138C734,155 763,182 785,218C806,254 822,299 831,354C840,409 844,473 844,547C844,618 840,681 831,736C822,791 806,837 785,874C763,911 734,939 698,958C662,977 617,987 563,987C518,987 480,977 448,958C416,939 390,910 370,873C349,836 334,790 325,735C316,680 311,616 311,545C311,400 331,291 370,219C409,147 474,111 565,111z"/>
+<glyph unicode="r" horiz-adv-x="965" d="M659,0l-591,0l0,86l6,0C97,86 119,88 140,91C160,94 178,101 193,112C208,122 220,137 229,156C238,175 242,201 242,233l0,639C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l315,0l39,-203l10,0C445,926 459,955 473,982C487,1009 504,1032 525,1053C545,1073 570,1089 600,1101C630,1112 668,1118 713,1118C788,1118 843,1105 880,1079C916,1053 934,1016 934,969C934,948 931,928 924,910C917,892 905,877 890,864C875,851 855,841 831,834C807,827 778,823 743,823C743,880 735,921 719,946C703,971 675,983 635,983C610,983 587,976 567,962C547,947 530,928 515,905C500,881 487,854 477,823C466,792 458,761 452,729C445,696 441,664 438,632C435,600 434,571 434,545l0,-322C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86l57,0z"/>
+<glyph unicode="s" horiz-adv-x="924" d="M430,-20C379,-20 332,-15 291,-6C249,3 213,16 184,35C155,53 132,76 116,103C100,130 92,161 92,197C92,224 97,247 106,266C115,284 126,298 139,309C152,320 166,327 181,332C196,336 209,338 221,338C221,302 225,268 232,237C239,206 252,178 269,155C286,131 309,112 338,99C366,85 401,78 442,78C479,78 511,83 539,92C567,101 591,113 610,130C629,146 643,166 653,189C663,212 668,237 668,264C668,289 664,311 657,330C649,348 636,365 617,381C598,397 572,413 539,430C506,447 465,466 416,487C363,510 318,533 279,555C240,576 207,600 182,625C157,650 138,679 125,712C112,744 106,782 106,827C106,874 115,915 134,951C152,987 178,1017 212,1042C246,1066 287,1084 334,1097C381,1110 434,1116 492,1116C541,1116 584,1111 621,1101C658,1091 690,1078 715,1061C740,1044 759,1024 772,1001C785,978 791,953 791,928C791,891 778,861 753,839C727,816 690,805 643,805C643,874 629,927 601,965C572,1003 528,1022 467,1022C432,1022 403,1018 378,1010C353,1002 333,991 318,976C302,961 290,944 283,924C276,904 272,882 272,858C272,832 277,810 286,791C295,772 310,754 331,738C351,722 377,707 410,692C442,677 481,660 526,641C580,618 626,596 665,574C704,552 736,528 761,502C786,476 804,447 816,414C828,381 834,344 834,301C834,248 824,201 805,161C786,121 758,88 723,61C688,34 645,13 596,0C546,-13 491,-20 430,-20z"/>
+<glyph unicode="t" horiz-adv-x="721" d="M543,88C568,88 590,89 611,92C632,95 653,98 674,102l0,-90C665,8 654,4 640,0C626,-4 611,-7 595,-10C578,-13 561,-16 543,-17C525,-19 508,-20 492,-20C440,-20 395,-14 358,-3C321,8 290,25 266,50C242,75 224,107 213,148C201,189 195,238 195,297l0,684l-156,0l0,82C64,1063 91,1068 121,1078C150,1088 176,1105 199,1128C222,1153 241,1184 256,1219C270,1254 282,1297 293,1350l94,0l0,-252l268,0l0,-117l-268,0l0,-690C387,221 401,170 430,137C458,104 496,88 543,88z"/>
+<glyph unicode="u" horiz-adv-x="1300" d="M1079,223C1079,193 1084,169 1093,151C1102,132 1114,118 1129,109C1144,100 1162,94 1183,91C1203,88 1224,86 1247,86l6,0l0,-86l-325,0l-27,166l-10,0C870,127 848,96 823,72C798,48 771,29 743,16C715,2 686,-7 655,-12C624,-17 592,-20 559,-20C505,-20 457,-12 415,3C373,18 338,42 309,75C280,108 259,149 244,200C229,251 221,311 221,381l0,491C221,902 217,926 208,945C199,963 186,977 171,987C156,997 138,1004 118,1007C97,1010 76,1012 53,1012l-6,0l0,86l367,0l0,-707C414,346 418,307 425,272C432,237 443,208 460,184C476,160 498,142 526,130C553,117 588,111 629,111C674,111 713,119 746,135C778,151 805,174 826,203C847,232 862,266 872,307C882,348 887,393 887,442l0,422C887,896 883,922 874,942C865,961 853,976 838,987C823,997 805,1004 785,1007C764,1010 742,1012 719,1012l-6,0l0,86l366,0z"/>
+<glyph unicode="v" horiz-adv-x="1186" d="M8,1012l0,86l512,0l0,-86l-26,0C453,1012 422,1004 402,988C381,972 371,947 371,913C371,902 372,890 375,879C378,867 382,853 387,838l139,-387C535,427 544,401 553,372C562,343 571,314 580,286C588,258 595,232 602,207C609,182 613,160 616,143l7,0C626,158 632,176 640,198C647,219 656,243 666,269C675,294 685,320 696,347C706,374 716,399 725,424l147,399C879,840 884,856 887,871C890,886 891,900 891,911C891,946 880,972 858,988C835,1004 801,1012 756,1012l-15,0l0,86l439,0l0,-86l-25,0C1135,1012 1118,1010 1104,1006C1090,1001 1077,993 1066,981C1055,969 1044,953 1034,932C1023,911 1012,885 999,852l-323,-852l-187,0l-329,903C152,924 144,942 135,956C126,970 116,981 105,990C94,998 81,1004 66,1007C51,1010 34,1012 14,1012z"/>
+<glyph unicode="—" horiz-adv-x="2048" d="M2058,489l-2068,0l0,121l2068,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Droid is a trademark of Google and may be registered in certain jurisdictions. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="DroidSerif-Bold" units-per-em="2048" underline-position="-154" underline-thickness="102"/>
+<missing-glyph horiz-adv-x="1229" d="M193,1462l841,0l0,-1462l-841,0M297,104l633,0l0,1254l-633,0z"/>
+<glyph unicode=" " horiz-adv-x="532"/>
+<glyph unicode="," horiz-adv-x="602" d="M459,86C459,43 452,1 439,-40C426,-81 404,-118 375,-153C346,-188 308,-219 262,-246C215,-274 159,-297 92,-315l0,106C122,-198 148,-188 171,-177C193,-166 212,-155 227,-142C242,-130 253,-116 261,-101C268,-86 272,-69 272,-49C272,-36 268,-26 261,-17C254,-9 245,-1 234,6C223,13 211,21 198,29C185,36 173,46 162,58C151,70 141,85 134,103C127,120 123,143 123,170C123,216 137,251 165,275C193,299 228,311 270,311C328,311 374,291 408,251C442,211 459,156 459,86z"/>
+<glyph unicode="A" horiz-adv-x="1542" d="M446,481l-59,-176C382,288 376,269 371,247C365,224 362,205 362,188C362,175 365,163 370,153C375,143 382,135 391,129C400,122 410,117 421,114C432,111 443,109 455,109l86,0l0,-109l-533,0l0,109l25,0C51,109 68,111 83,115C98,119 112,127 125,138C138,149 150,164 162,183C173,202 185,227 197,258l444,1204l281,0l428,-1206C1360,227 1371,204 1382,185C1393,166 1405,151 1418,140C1431,129 1444,121 1459,116C1474,111 1489,109 1505,109l37,0l0,-109l-676,0l0,109l80,0C956,109 966,111 977,114C988,117 997,121 1006,128C1014,134 1021,142 1026,152C1031,162 1034,174 1034,188C1034,205 1032,221 1028,236C1024,251 1020,265 1016,276l-72,205M795,942C788,965 780,990 773,1016C765,1041 757,1067 750,1094C742,1121 735,1147 728,1174C721,1200 714,1225 709,1249C703,1228 696,1206 688,1181C680,1156 672,1131 663,1105C654,1079 645,1053 636,1027C627,1001 618,976 610,952l-121,-346l414,0z"/>
+<glyph unicode="C" horiz-adv-x="1368" d="M870,143C920,143 965,149 1004,161C1043,172 1077,187 1108,206C1139,225 1166,246 1189,269C1212,292 1232,315 1249,338C1260,330 1268,318 1275,301C1281,284 1284,267 1284,250C1284,221 1276,191 1261,160C1246,128 1220,99 1184,72C1148,45 1100,23 1041,6C982,-11 908,-20 821,-20C702,-20 599,-2 510,34C421,70 348,121 289,187C230,253 186,332 157,425C128,518 113,620 113,733C113,844 128,945 158,1037C188,1129 233,1208 292,1274C351,1340 424,1391 513,1428C601,1465 703,1483 819,1483C898,1483 966,1477 1025,1465C1083,1452 1131,1435 1170,1414C1209,1393 1238,1368 1257,1339C1276,1310 1286,1278 1286,1245C1286,1220 1281,1196 1270,1175C1259,1153 1242,1134 1221,1118C1199,1102 1172,1090 1140,1081C1108,1072 1071,1067 1030,1067C1030,1101 1026,1135 1019,1169C1012,1202 999,1233 982,1260C964,1287 941,1310 912,1327C883,1344 848,1352 805,1352C740,1352 686,1338 641,1311C596,1284 561,1244 534,1191C507,1138 487,1074 475,997C463,920 457,832 457,733C457,634 464,548 479,474C494,400 517,339 550,290C583,241 625,204 678,180C730,155 794,143 870,143z"/>
+<glyph unicode="D" horiz-adv-x="1571" d="M1458,758C1458,646 1443,544 1412,451C1381,358 1336,278 1275,211C1214,144 1138,93 1048,56C957,19 852,0 733,0l-676,0l0,109l86,0C158,109 172,111 185,114C198,117 209,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,987C248,1256 245,1278 240,1295C235,1311 227,1323 218,1332C208,1341 197,1347 184,1350C171,1353 158,1354 143,1354l-86,0l0,108l676,0C846,1462 948,1447 1038,1418C1127,1388 1203,1344 1266,1285C1328,1226 1376,1152 1409,1064C1442,976 1458,874 1458,758M1112,758C1112,953 1076,1099 1005,1194C933,1289 827,1337 688,1337l-117,0l0,-1210l115,0C756,127 818,142 871,171C924,200 969,241 1005,296C1040,351 1067,417 1085,495C1103,572 1112,660 1112,758z"/>
+<glyph unicode="G" horiz-adv-x="1575" d="M866,-20C739,-20 629,-2 535,34C440,70 362,121 299,187C236,253 190,332 159,425C128,518 113,620 113,733C113,844 129,945 162,1037C195,1129 243,1208 307,1274C371,1340 451,1391 546,1428C641,1465 752,1483 877,1483C962,1483 1037,1477 1101,1465C1164,1452 1218,1435 1261,1414C1304,1393 1336,1368 1357,1339C1378,1310 1389,1278 1389,1245C1389,1221 1383,1199 1372,1178C1361,1157 1344,1138 1321,1122C1298,1106 1271,1094 1238,1085C1205,1076 1167,1071 1124,1071C1124,1112 1119,1150 1109,1185C1099,1220 1084,1249 1063,1274C1042,1299 1015,1318 983,1332C951,1345 913,1352 870,1352C795,1352 732,1338 680,1311C627,1284 585,1244 552,1191C519,1138 495,1074 480,997C465,920 457,832 457,733C457,634 465,547 481,471C496,394 522,330 557,278C592,226 637,187 693,160C748,133 816,119 897,119C922,119 948,120 973,122C998,124 1023,128 1047,133l0,301C1047,489 1035,527 1010,548C985,569 949,580 901,580l-27,0l0,108l644,0l0,-108l-27,0C1470,580 1452,578 1437,573C1422,568 1409,559 1399,547C1389,535 1382,519 1377,500C1372,480 1370,455 1370,426l0,-336C1290,53 1209,26 1128,8C1047,-11 959,-20 866,-20z"/>
+<glyph unicode="H" horiz-adv-x="1677" d="M913,0l0,109l88,0C1016,109 1029,111 1042,114C1055,117 1066,123 1076,132C1085,141 1093,155 1098,172C1103,189 1106,213 1106,242l0,458l-535,0l0,-458C571,213 574,189 580,172C585,155 593,141 602,132C611,123 622,117 635,114C648,111 661,109 676,109l88,0l0,-109l-707,0l0,109l86,0C158,109 171,111 184,114C197,117 208,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,986C248,1255 245,1277 240,1294C234,1310 226,1322 217,1331C207,1340 196,1346 183,1349C170,1352 157,1353 143,1353l-86,0l0,109l707,0l0,-109l-88,0C661,1353 648,1352 635,1349C622,1346 611,1339 602,1330C593,1321 585,1307 580,1290C574,1273 571,1249 571,1220l0,-395l535,0l0,395C1106,1249 1103,1273 1098,1290C1093,1307 1085,1321 1076,1330C1066,1339 1055,1346 1042,1349C1029,1352 1016,1353 1001,1353l-88,0l0,109l707,0l0,-109l-86,0C1520,1353 1507,1352 1494,1349C1481,1346 1470,1339 1461,1330C1451,1321 1443,1307 1438,1290C1433,1273 1430,1249 1430,1220l0,-989C1430,204 1433,183 1439,167C1444,150 1452,138 1462,130C1471,121 1482,116 1495,113C1507,110 1520,109 1534,109l86,0l0,-109z"/>
+<glyph unicode="I" horiz-adv-x="821" d="M57,0l0,109l86,0C158,109 172,111 185,114C198,117 209,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,978C248,1249 245,1273 240,1290C235,1307 227,1321 218,1330C209,1339 198,1346 185,1349C172,1352 158,1353 143,1353l-86,0l0,109l707,0l0,-109l-86,0C663,1353 650,1352 637,1349C624,1346 612,1339 603,1330C594,1321 586,1307 581,1290C576,1273 573,1249 573,1220l0,-978C573,213 576,189 581,172C586,155 594,141 603,132C612,123 624,117 637,114C650,111 663,109 678,109l86,0l0,-109z"/>
+<glyph unicode="N" horiz-adv-x="1614" d="M1200,0l-799,1128l0,-886C401,213 404,189 410,172C415,155 423,141 432,132C441,123 453,117 466,114C479,111 492,109 506,109l86,0l0,-109l-535,0l0,109l86,0C158,109 171,111 184,114C197,117 208,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,987C248,1256 245,1278 240,1295C234,1311 226,1323 217,1332C207,1341 196,1347 183,1350C170,1353 157,1354 143,1354l-86,0l0,108l455,0l723,-1022l0,789C1235,1256 1232,1278 1227,1295C1221,1311 1213,1323 1204,1332C1194,1341 1183,1347 1170,1350C1157,1353 1144,1354 1130,1354l-86,0l0,108l535,0l0,-108l-86,0C1479,1354 1466,1353 1453,1350C1440,1347 1429,1340 1420,1331C1410,1322 1402,1308 1397,1291C1392,1274 1389,1250 1389,1221l0,-1221z"/>
+<glyph unicode="O" horiz-adv-x="1612" d="M1499,733C1499,620 1484,518 1454,425C1423,332 1379,253 1320,187C1261,121 1188,70 1103,34C1017,-2 918,-20 807,-20C690,-20 589,-2 502,34C415,70 342,121 285,187C228,253 185,333 156,426C127,519 113,622 113,735C113,848 127,951 156,1044C185,1136 228,1215 286,1280C343,1345 416,1396 503,1432C590,1467 692,1485 809,1485C920,1485 1018,1467 1104,1432C1189,1396 1261,1345 1320,1280C1379,1214 1423,1135 1454,1043C1484,950 1499,847 1499,733M457,733C457,635 463,548 476,471C489,394 509,330 537,277C565,224 601,183 646,155C690,127 744,113 807,113C871,113 925,127 970,155C1014,183 1050,224 1077,277C1104,330 1124,394 1137,471C1149,548 1155,635 1155,733C1155,831 1149,918 1137,995C1124,1072 1104,1137 1077,1190C1050,1243 1014,1283 970,1311C926,1338 872,1352 809,1352C745,1352 691,1338 646,1311C601,1283 565,1243 537,1190C509,1137 489,1072 476,995C463,918 457,831 457,733z"/>
+<glyph unicode="S" horiz-adv-x="1200" d="M541,-20C449,-20 372,-11 311,6C250,23 201,46 164,73C127,100 100,131 85,165C69,199 61,233 61,266C61,301 68,331 81,355C94,379 111,399 133,414C154,429 179,440 207,447C234,454 263,457 293,457C293,398 300,347 314,303C328,258 347,221 372,192C397,162 426,140 461,125C495,110 532,102 573,102C613,102 649,108 680,119C711,130 738,146 760,166C782,186 799,210 810,237C821,264 827,293 827,324C827,359 820,390 806,417C792,444 771,469 743,492C714,515 679,537 636,558C593,579 542,601 485,625C414,654 354,685 305,716C256,747 216,780 186,816C156,852 135,891 122,933C109,975 102,1021 102,1071C102,1134 115,1190 140,1241C165,1292 200,1335 245,1371C290,1407 343,1435 404,1454C465,1473 532,1483 604,1483C679,1483 744,1477 799,1465C854,1452 899,1435 935,1414C970,1393 997,1368 1014,1339C1031,1310 1040,1278 1040,1245C1040,1221 1035,1199 1025,1178C1014,1157 999,1139 978,1124C957,1109 930,1097 899,1088C867,1079 830,1075 788,1075C788,1104 784,1135 777,1168C769,1201 756,1231 739,1260C722,1288 699,1311 672,1330C644,1349 610,1358 571,1358C544,1358 518,1354 493,1346C468,1338 447,1326 429,1310C410,1294 396,1274 385,1251C374,1227 369,1200 369,1169C369,1140 374,1113 383,1088C392,1063 410,1038 435,1014C460,989 494,965 538,941C581,916 638,890 707,862C777,833 837,804 886,774C935,744 976,712 1008,678C1039,643 1062,606 1077,565C1091,524 1098,478 1098,428C1098,362 1085,302 1059,247C1033,192 996,144 947,105C898,66 840,35 772,13C703,-9 626,-20 541,-20z"/>
+<glyph unicode="T" horiz-adv-x="1337" d="M831,242C831,213 834,189 839,172C844,155 852,141 862,132C871,123 882,117 895,114C908,111 921,109 936,109l86,0l0,-109l-707,0l0,109l86,0C416,109 430,111 443,114C456,117 467,123 476,132C485,141 493,155 498,172C503,189 506,213 506,242l0,1095l-164,0C311,1337 286,1334 265,1327C244,1320 228,1311 215,1299C202,1286 192,1271 186,1253C179,1235 175,1215 172,1192l-14,-127l-138,0l11,397l1276,0l10,-397l-137,0l-15,127C1162,1215 1158,1235 1152,1253C1145,1271 1136,1286 1123,1299C1110,1311 1093,1320 1072,1327C1051,1334 1026,1337 995,1337l-164,0z"/>
+<glyph unicode="W" horiz-adv-x="2185" d="M1237,1448l283,-782C1532,634 1543,602 1554,569C1564,536 1573,504 1582,474C1591,444 1598,416 1605,391C1612,366 1617,344 1620,326C1625,351 1631,378 1637,408C1643,438 1650,470 1657,503C1664,536 1671,569 1679,604C1686,639 1694,672 1702,705l108,442C1812,1155 1814,1164 1817,1175C1819,1186 1821,1196 1823,1207C1825,1217 1827,1227 1828,1236C1829,1245 1829,1252 1829,1257C1829,1292 1819,1317 1798,1332C1777,1347 1743,1354 1698,1354l-47,0l0,108l534,0l0,-108l-39,0C2126,1354 2108,1352 2093,1348C2078,1344 2064,1336 2052,1325C2040,1313 2029,1297 2020,1276C2010,1255 2000,1228 1991,1194l-318,-1194l-233,0l-344,961l-295,-961l-254,0l-375,1245C166,1266 159,1284 150,1298C141,1312 131,1323 120,1332C108,1340 95,1346 80,1349C65,1352 47,1354 27,1354l-27,0l0,108l684,0l0,-108l-47,0C596,1354 565,1346 545,1330C524,1314 514,1289 514,1255C514,1244 516,1227 521,1206C525,1184 530,1164 535,1145l137,-473C679,646 687,618 696,588C704,557 712,527 719,496C726,465 733,435 739,406C745,377 749,352 752,330C761,374 772,415 783,454C794,492 805,531 817,571l270,877z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Bold" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="500"/>
+<glyph unicode=" " horiz-adv-x="500"/>
+<glyph unicode="(" horiz-adv-x="692" d="M87,621C87,887 137,1104 238,1273C338,1442 465,1551 620,1602l6,-1l51,-141C564,1400 477,1304 416,1171C355,1038 325,856 325,623l0,-91C325,299 355,116 416,-17C477,-150 564,-247 677,-308l-51,-137l-6,-1C465,-395 338,-286 238,-118C137,50 87,267 87,534z"/>
+<glyph unicode=")" horiz-adv-x="694" d="M603,534C603,275 552,59 451,-113C350,-285 223,-396 70,-446l-6,1l-51,137C122,-247 205,-150 264,-17C323,116 352,299 352,532l0,91C352,856 323,1040 264,1173C205,1306 122,1403 13,1464l51,137l6,1C223,1552 350,1441 451,1269C552,1097 603,881 603,621z"/>
+<glyph unicode="," horiz-adv-x="580" d="M423,-8l-100,-282l-180,0l0,530l280,0z"/>
+<glyph unicode="D" horiz-adv-x="1327" d="M132,0l0,1400l494,0C801,1400 946,1345 1059,1236C1172,1127 1228,986 1228,815l0,-231C1228,412 1172,272 1059,163C946,54 801,0 626,0M411,1183l0,-967l215,0C723,216 801,250 860,319C919,388 948,476 948,584l0,233C948,924 919,1011 860,1080C801,1149 723,1183 626,1183z"/>
+<glyph unicode="E" horiz-adv-x="1110" d="M943,615l-533,0l0,-399l633,0l0,-216l-913,0l0,1400l910,0l0,-217l-630,0l0,-351l533,0z"/>
+<glyph unicode="H" horiz-adv-x="1412" d="M1280,0l-280,0l0,581l-589,0l0,-581l-279,0l0,1400l279,0l0,-603l589,0l0,603l280,0z"/>
+<glyph unicode="I" horiz-adv-x="583" d="M431,0l-279,0l0,1400l279,0z"/>
+<glyph unicode="L" horiz-adv-x="1110" d="M411,216l644,0l0,-216l-924,0l0,1400l280,0z"/>
+<glyph unicode="N" horiz-adv-x="1412" d="M1280,0l-280,0l-583,954l-6,-2l0,-952l-279,0l0,1400l279,0l583,-952l6,2l0,950l280,0z"/>
+<glyph unicode="O" horiz-adv-x="1377" d="M1283,574C1283,402 1228,260 1117,148C1006,36 863,-20 686,-20C510,-20 367,36 258,148C149,260 94,402 94,574l0,252C94,997 149,1138 258,1251C367,1364 510,1420 685,1420C862,1420 1006,1364 1117,1251C1228,1138 1283,997 1283,826M1003,828C1003,937 975,1026 918,1096C861,1166 784,1201 685,1201C587,1201 511,1166 456,1097C401,1027 374,937 374,828l0,-254C374,463 402,373 457,303C512,233 588,198 686,198C785,198 863,233 919,303C975,373 1003,463 1003,574z"/>
+<glyph unicode="P" horiz-adv-x="1273" d="M410,488l0,-488l-280,0l0,1400l546,0C838,1400 966,1358 1061,1273C1155,1188 1202,1078 1202,944C1202,809 1155,700 1061,615C966,530 838,488 676,488M410,705l266,0C757,705 818,728 860,773C901,818 922,875 922,942C922,1010 901,1067 860,1114C818,1160 757,1183 676,1183l-266,0z"/>
+<glyph unicode="R" horiz-adv-x="1273" d="M410,560l0,-560l-280,0l0,1400l500,0C792,1400 919,1364 1010,1291C1101,1218 1147,1117 1147,987C1147,914 1128,852 1090,800C1051,748 995,706 921,673C1004,648 1063,608 1100,551C1137,494 1155,424 1155,341l0,-104C1155,198 1161,158 1172,115C1183,72 1201,41 1226,20l0,-20l-288,0C912,21 895,55 888,102C880,149 876,195 876,239l0,100C876,408 856,463 817,502C778,541 722,560 651,560M410,777l214,0C707,777 768,794 808,827C847,860 867,909 867,974C867,1038 847,1089 807,1127C767,1164 708,1183 630,1183l-220,0z"/>
+<glyph unicode="S" horiz-adv-x="1250" d="M881,372C881,425 863,467 826,498C789,529 722,559 624,588C463,635 342,692 261,758C180,824 140,915 140,1030C140,1145 185,1239 275,1312C365,1384 484,1420 631,1420C788,1420 912,1381 1004,1304C1096,1226 1140,1123 1137,996l-2,-6l-271,0C864,1061 844,1114 804,1151C764,1188 705,1206 628,1206C557,1206 505,1190 471,1158C437,1125 420,1082 420,1029C420,980 439,941 478,911C516,880 585,849 686,816C843,772 962,716 1042,648C1121,580 1161,489 1161,374C1161,253 1114,158 1021,87C927,16 803,-20 648,-20C497,-20 367,18 260,93C152,168 100,279 103,427l2,6l271,0C376,350 400,290 449,251C498,212 564,193 648,193C725,193 783,209 822,242C861,275 881,318 881,372z"/>
+<glyph unicode="T" horiz-adv-x="1152" d="M1127,1183l-412,0l0,-1183l-280,0l0,1183l-407,0l0,217l1099,0z"/>
+<glyph unicode="W" horiz-adv-x="1762" d="M1255,430l6,0l192,970l289,0l-334,-1400l-266,0l-259,916l-6,0l-257,-916l-267,0l-334,1400l289,0l193,-969l6,0l259,969l229,0z"/>
+<glyph unicode="a" horiz-adv-x="1070" d="M722,0C713,21 705,45 699,71C692,96 688,123 685,152C657,102 619,61 572,29C524,-4 467,-20 400,-20C289,-20 204,8 144,64C84,120 54,196 54,293C54,395 94,474 174,530C253,586 369,614 522,614l159,0l0,83C681,748 668,787 641,814C614,841 574,855 521,855C474,855 438,844 413,822C388,800 375,770 375,731l-270,0l-2,6C98,825 137,901 218,965C299,1028 406,1060 539,1060C665,1060 767,1029 845,966C922,903 961,812 961,695l0,-430C961,217 965,171 972,128C979,85 991,42 1007,0M468,188C519,188 563,200 602,224C641,248 667,276 681,308l0,147l-160,0C459,455 412,440 381,411C350,382 334,346 334,303C334,268 346,241 370,220C393,199 426,188 468,188z"/>
+<glyph unicode="c" horiz-adv-x="1042" d="M551,196C602,196 643,211 674,240C705,269 721,307 721,355l254,0l3,-6C981,244 941,157 858,86C775,15 672,-20 551,-20C396,-20 276,29 191,128C105,227 62,352 62,505l0,29C62,686 105,812 191,911C276,1010 396,1060 550,1060C679,1060 784,1023 863,950C942,877 981,781 978,662l-2,-6l-255,0C721,709 706,754 675,790C644,825 603,843 550,843C476,843 423,814 390,756C357,697 341,623 341,534l0,-29C341,414 357,339 390,282C422,225 476,196 551,196z"/>
+<glyph unicode="d" horiz-adv-x="1130" d="M66,511C66,676 102,808 175,909C247,1010 349,1060 480,1060C533,1060 582,1049 625,1026C668,1003 705,971 737,929l0,571l280,0l0,-1500l-237,0l-25,129C722,80 682,43 636,18C590,-7 537,-20 478,-20C347,-20 246,27 174,121C102,214 66,338 66,491M346,491C346,400 362,329 394,277C426,224 478,198 549,198C592,198 629,207 660,224C691,241 717,265 737,297l0,438C717,768 692,794 661,813C630,832 593,841 551,841C480,841 428,811 395,750C362,689 346,610 346,511z"/>
+<glyph unicode="e" horiz-adv-x="1043" d="M571,-20C411,-20 286,28 196,123C106,218 61,341 61,491l0,38C61,684 105,812 192,912C279,1011 398,1061 549,1060C686,1060 794,1018 871,935C948,852 986,738 986,593l0,-148l-635,0l-2,-6C352,367 374,309 415,264C456,219 518,196 599,196C658,196 709,202 750,213C791,224 835,241 883,264l69,-177C913,58 860,33 793,12C726,-9 652,-20 571,-20M549,843C490,843 445,824 413,786C380,747 360,697 353,634l3,-6l355,0l0,23C711,711 698,758 671,792C644,826 604,843 549,843z"/>
+<glyph unicode="f" horiz-adv-x="694" d="M179,0l0,843l-158,0l0,197l158,0l0,115C179,1272 213,1362 281,1425C349,1488 445,1520 568,1520C593,1520 618,1518 643,1515C668,1511 695,1506 724,1500l-24,-208C683,1295 668,1297 653,1299C638,1300 622,1301 603,1301C556,1301 520,1288 496,1263C471,1238 459,1202 459,1155l0,-115l212,0l0,-197l-212,0l0,-843z"/>
+<glyph unicode="h" horiz-adv-x="1130" d="M383,907C417,956 458,993 507,1020C556,1047 609,1060 668,1060C779,1060 867,1024 930,952C993,879 1024,768 1024,617l0,-617l-280,0l0,619C744,700 730,757 703,791C676,824 635,841 580,841C535,841 497,834 464,820C431,805 404,785 383,758l0,-758l-280,0l0,1500l280,0z"/>
+<glyph unicode="i" horiz-adv-x="530" d="M405,0l-280,0l0,1040l280,0M405,1289l-280,0l0,211l280,0z"/>
+<glyph unicode="l" horiz-adv-x="530" d="M405,0l-280,0l0,1500l280,0z"/>
+<glyph unicode="m" horiz-adv-x="1774" d="M370,1040l13,-140C418,951 463,990 516,1018C569,1046 631,1060 702,1060C772,1060 832,1045 882,1015C932,985 969,939 994,878C1028,935 1073,980 1128,1012C1183,1044 1247,1060 1320,1060C1427,1060 1511,1024 1573,951C1634,878 1665,766 1665,617l0,-617l-280,0l0,618C1385,701 1371,759 1343,792C1315,825 1273,841 1218,841C1173,841 1135,831 1102,812C1069,793 1044,766 1025,733C1025,722 1025,713 1026,706C1027,698 1027,690 1027,683l0,-683l-280,0l0,618C747,699 733,757 705,791C677,824 635,841 580,841C537,841 499,833 468,818C436,802 410,780 390,752l0,-752l-280,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1130" d="M366,1040l13,-149C414,944 457,986 509,1016C561,1045 619,1060 684,1060C791,1060 875,1026 936,958C996,890 1026,783 1026,637l0,-637l-280,0l0,637C746,711 732,764 705,795C678,826 637,841 582,841C538,841 500,833 467,818C434,802 407,780 386,751l0,-751l-280,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1130" d="M64,530C64,685 108,813 196,912C284,1011 406,1060 562,1060C719,1060 841,1011 930,912C1018,813 1062,685 1062,530l0,-20C1062,353 1018,226 930,128C841,29 719,-20 564,-20C407,-20 285,29 197,128C108,226 64,353 64,510M344,510C344,415 362,339 397,282C432,225 487,196 564,196C639,196 695,225 730,282C765,339 782,415 782,510l0,20C782,622 764,697 729,756C694,814 638,843 562,843C487,843 432,814 397,756C362,697 344,622 344,530z"/>
+<glyph unicode="p" horiz-adv-x="1130" d="M1063,491C1063,338 1027,214 955,121C882,27 781,-20 651,-20C594,-20 545,-10 502,11C459,31 421,61 390,100l0,-500l-280,0l0,1440l250,0l18,-124C410,962 448,998 493,1023C538,1048 590,1060 649,1060C780,1060 881,1010 954,909C1027,808 1063,676 1063,511M783,511C783,609 766,689 732,750C698,811 646,841 575,841C531,841 494,832 463,815C432,798 408,773 390,741l0,-454C408,257 432,234 463,219C494,204 532,196 577,196C648,196 701,223 734,276C767,329 783,400 783,491z"/>
+<glyph unicode="r" horiz-adv-x="703" d="M664,799l-104,2C517,801 482,793 454,776C426,759 405,736 390,706l0,-706l-280,0l0,1040l260,0l12,-152C407,942 439,984 479,1015C519,1045 565,1060 617,1060C632,1060 645,1059 658,1057C670,1054 682,1051 694,1048z"/>
+<glyph unicode="s" horiz-adv-x="1036" d="M691,288C691,319 676,346 645,368C614,390 558,409 475,426C350,451 255,489 190,538C125,587 92,653 92,737C92,826 131,903 209,966C286,1029 389,1060 517,1060C650,1060 757,1029 837,966C917,903 955,824 951,731l-1,-6l-271,0C679,766 665,800 637,827C609,854 569,867 516,867C469,867 431,856 403,834C375,811 361,783 361,750C361,718 375,692 404,672C433,652 490,634 575,617C705,592 802,554 867,504C931,454 963,386 963,299C963,206 922,129 841,70C759,10 651,-20 518,-20C377,-20 266,15 185,86C103,156 64,236 68,325l2,6l257,0C329,276 348,235 384,210C420,185 467,172 524,172C577,172 619,183 648,204C677,225 691,253 691,288z"/>
+<glyph unicode="t" horiz-adv-x="718" d="M448,1295l0,-255l223,0l0,-197l-223,0l0,-518C448,279 457,246 474,227C491,208 516,198 551,198C570,198 587,199 601,202C615,204 632,208 653,213l30,-202C654,1 625,-7 594,-12C563,-17 529,-20 494,-20C390,-20 310,10 253,69C196,128 168,218 168,339l0,504l-147,0l0,197l147,0l0,255z"/>
+<glyph unicode="u" horiz-adv-x="1130" d="M752,139C719,88 678,48 629,21C580,-6 524,-20 461,-20C349,-20 261,17 198,92C135,166 103,281 103,437l0,603l280,0l0,-605C383,344 396,282 422,249C447,215 487,198 541,198C588,198 629,206 663,221C696,236 723,257 744,286l0,754l279,0l0,-1040l-259,0z"/>
+<glyph unicode="…" horiz-adv-x="1556" d="M420,0l-280,0l0,246l280,0M894,0l-280,0l0,246l280,0M1368,0l-280,0l0,246l280,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Thin" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="480"/>
+<glyph unicode=" " horiz-adv-x="480"/>
+<glyph unicode="A" horiz-adv-x="1200" d="M947,416l-695,0l-158,-416l-61,0l534,1400l66,0l534,-1400l-61,0M274,472l652,0l-298,782l-25,78l-6,0l-25,-78z"/>
+<glyph unicode="E" horiz-adv-x="1100" d="M928,702l-684,0l0,-646l784,0l0,-56l-840,0l0,1400l840,0l0,-56l-784,0l0,-586l684,0z"/>
+<glyph unicode="N" horiz-adv-x="1400" d="M1218,0l-56,0l-912,1297l-6,-2l0,-1295l-56,0l0,1400l56,0l912,-1295l6,2l0,1293l56,0z"/>
+<glyph unicode="a" horiz-adv-x="1061" d="M833,192C796,129 742,78 670,39C597,0 510,-20 408,-20C309,-20 231,7 175,60C118,113 90,184 90,274C90,362 132,435 216,494C300,553 405,582 532,582l301,0l0,150C833,817 805,884 749,932C693,980 614,1004 512,1004C417,1004 340,982 282,937C223,892 194,834 194,763l-47,1l-2,6C141,850 173,918 242,975C310,1032 400,1060 512,1060C625,1060 717,1032 786,975C855,918 889,837 889,730l0,-520C889,173 891,138 896,103C900,68 907,34 917,0l-62,0C846,47 841,81 838,103C835,125 833,149 833,176M408,36C513,36 601,59 674,104C746,149 799,212 833,295l0,231l-299,0C425,526 334,501 259,452C184,403 146,342 146,270C146,201 170,145 218,102C265,58 329,36 408,36z"/>
+<glyph unicode="c" horiz-adv-x="1060" d="M564,36C652,36 729,60 794,107C859,154 892,225 892,320l48,0l2,-6C945,213 908,132 832,71C756,10 667,-20 564,-20C427,-20 319,28 240,124C160,220 120,345 120,500l0,40C120,694 160,819 240,916C319,1012 427,1060 562,1060C671,1060 762,1028 836,965C909,901 945,812 942,698l-2,-6l-48,0C892,793 860,870 797,924C734,977 655,1004 562,1004C438,1004 343,960 276,873C209,786 176,675 176,540l0,-40C176,364 209,253 276,166C343,79 439,36 564,36z"/>
+<glyph unicode="e" horiz-adv-x="1030" d="M547,-20C406,-20 297,26 219,119C140,211 101,332 101,482l0,60C101,693 142,817 223,914C304,1011 407,1060 531,1060C654,1060 751,1022 822,946C893,869 928,765 928,633l0,-81l-771,0l0,-10l0,-60C157,350 190,243 255,160C320,77 417,36 547,36C614,36 675,47 730,69C785,91 833,122 872,161l29,-45C859,75 811,42 756,17C701,-8 632,-20 547,-20M531,1004C428,1004 343,967 277,893C211,819 174,726 165,614l3,-6l704,0l0,30C872,745 842,833 783,902C723,970 639,1004 531,1004z"/>
+<glyph unicode="i" horiz-adv-x="456" d="M256,0l-56,0l0,1040l56,0M256,1364l-56,0l0,136l56,0z"/>
+<glyph unicode="l" horiz-adv-x="456" d="M256,0l-56,0l0,1500l56,0z"/>
+<glyph unicode="m" horiz-adv-x="1848" d="M208,1040l7,-214C248,900 297,958 360,999C423,1040 500,1060 591,1060C682,1060 755,1038 812,993C869,948 908,878 929,784C960,871 1008,939 1074,988C1140,1037 1223,1061 1322,1061C1439,1061 1527,1024 1588,949C1649,874 1679,756 1679,595l0,-594l-56,0l0,596C1623,746 1596,852 1541,913C1486,974 1413,1005 1322,1005C1207,1005 1120,974 1060,911C1000,848 962,768 945,669C946,657 946,645 947,632C948,619 948,607 948,594l0,-594l-56,0l0,535l-1,0C891,545 891,553 891,560C891,567 891,573 892,580l0,16C892,745 865,851 810,912C755,973 682,1004 591,1004C478,1004 391,974 332,913C272,852 233,773 216,676l0,-676l-56,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1100" d="M216,1040l7,-208C256,905 303,961 364,1001C425,1040 500,1060 589,1060C705,1060 792,1024 850,953C907,882 936,769 936,614l0,-614l-56,0l0,616C880,759 854,859 802,917C750,975 679,1004 589,1004C480,1004 396,973 338,912C279,851 241,771 224,673l0,-673l-56,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1100" d="M85,540C85,692 128,817 214,914C300,1011 412,1060 549,1060C687,1060 799,1012 886,915C972,818 1015,693 1015,540l0,-40C1015,347 972,223 886,126C800,29 688,-20 551,-20C413,-20 301,29 215,126C128,223 85,347 85,500M141,500C141,371 178,261 252,171C326,81 426,36 551,36C674,36 773,81 848,171C922,261 959,371 959,500l0,40C959,667 922,776 847,867C772,958 673,1004 549,1004C425,1004 326,958 252,867C178,776 141,667 141,540z"/>
+<glyph unicode="p" horiz-adv-x="1100" d="M980,500C980,340 945,213 874,120C803,27 706,-20 582,-20C500,-20 429,-4 368,29C307,61 259,105 224,160l0,-560l-56,0l0,1440l44,0l11,-185C259,919 307,969 367,1006C426,1042 497,1060 580,1060C705,1060 803,1011 874,914C945,817 980,685 980,520M924,520C924,663 895,780 836,870C777,959 692,1004 580,1004C481,1004 403,980 347,932C290,883 249,823 224,751l0,-496C251,188 294,135 355,96C415,56 491,36 582,36C693,36 778,78 837,162C895,245 924,358 924,500z"/>
+<glyph unicode="s" horiz-adv-x="1000" d="M818,256C818,310 794,359 746,404C698,449 615,484 496,509C369,535 278,569 221,611C164,652 136,714 136,795C136,870 168,933 233,984C297,1035 383,1060 492,1060C609,1060 701,1033 769,979C836,924 868,854 865,768l-2,-6l-47,0C816,828 787,885 729,933C670,980 591,1004 492,1004C393,1004 318,983 268,942C217,900 192,852 192,797C192,743 214,697 257,660C300,622 385,589 512,561C630,534 720,498 782,451C843,404 874,339 874,256C874,174 840,108 772,57C703,6 613,-20 500,-20C376,-20 279,7 209,62C138,117 105,183 110,260l2,6l46,0C163,185 199,126 266,90C332,54 410,36 500,36C597,36 675,58 732,102C789,146 818,197 818,256z"/>
+<glyph unicode="t" horiz-adv-x="708" d="M318,1320l0,-280l300,0l0,-56l-300,0l0,-676C318,209 336,139 373,98C410,57 458,36 518,36C535,36 551,37 566,38C580,39 599,42 622,45l10,-51C615,-11 598,-15 580,-17C561,-19 541,-20 520,-20C436,-20 372,6 328,58C284,110 262,193 262,308l0,676l-206,0l0,56l206,0l0,280z"/>
+<glyph unicode="w" horiz-adv-x="1520" d="M360,304l54,-213l6,-1l69,214l237,736l56,0l238,-736l68,-214l6,1l55,213l215,736l64,0l-308,-1040l-55,0l-265,776l-44,162l-6,0l-46,-162l-261,-776l-55,0l-308,1040l64,0z"/>
+<glyph unicode="x" horiz-adv-x="960" d="M479,582l337,458l69,0l-371,-506l391,-534l-69,0l-357,485l-356,-485l-69,0l391,534l-371,506l69,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Regular" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="498"/>
+<glyph unicode=" " horiz-adv-x="498"/>
+<glyph unicode="(" horiz-adv-x="652" d="M106,642C106,915 152,1132 245,1293C338,1454 457,1560 604,1611l6,0l37,-112C533,1436 446,1337 385,1204C324,1071 294,884 294,644l0,-122C294,281 324,92 385,-43C446,-179 533,-278 647,-341l-36,-104l-6,0C458,-394 338,-287 245,-126C152,35 106,251 106,524z"/>
+<glyph unicode=")" horiz-adv-x="661" d="M543,524C543,251 496,35 403,-126C310,-287 190,-394 43,-445l-6,0l-36,104C114,-278 202,-179 263,-43C324,92 355,281 355,522l0,122C355,885 324,1073 263,1210C202,1346 114,1445 1,1508l36,103l6,0C190,1560 310,1454 403,1293C496,1132 543,915 543,642z"/>
+<glyph unicode="," horiz-adv-x="530" d="M350,-8l-98,-240l-94,0l4,249l0,211l188,0z"/>
+<glyph unicode="-" horiz-adv-x="890" d="M734,622l-578,0l0,149l578,0z"/>
+<glyph unicode="." horiz-adv-x="523" d="M343,0l-191,0l0,194l191,0z"/>
+<glyph unicode="0" horiz-adv-x="1118" d="M1005,494C1005,335 965,209 886,118C807,26 698,-20 561,-20C424,-20 315,26 236,118C156,210 116,335 116,494l0,412C116,1064 156,1189 235,1282C314,1374 422,1420 559,1420C696,1420 805,1374 885,1282C965,1189 1005,1064 1005,906M816,945C816,1046 794,1125 750,1183C706,1241 642,1270 559,1270C476,1270 413,1241 370,1183C327,1125 305,1046 305,945l0,-489C305,355 327,275 371,217C414,158 478,129 561,129C644,129 708,158 751,216C794,274 816,354 816,456z"/>
+<glyph unicode="1" horiz-adv-x="1118" d="M698,0l-189,0l0,1225l-282,-3l0,156l471,42z"/>
+<glyph unicode="2" horiz-adv-x="1118" d="M986,0l-835,0l0,149l432,506C661,756 713,833 739,884C765,935 778,987 778,1042C778,1108 760,1163 723,1206C686,1249 634,1270 566,1270C487,1270 425,1245 381,1194C336,1143 314,1081 314,1006l-181,0l-2,6C128,1126 166,1223 246,1302C326,1381 433,1420 566,1420C689,1420 786,1387 859,1321C931,1254 967,1161 967,1040C967,955 945,879 902,813C859,746 783,645 674,510l-295,-356l3,-5l604,0z"/>
+<glyph unicode="3" horiz-adv-x="1118" d="M562,787C643,787 702,808 741,851C780,893 799,951 799,1025C799,1096 778,1155 735,1201C692,1247 630,1270 547,1270C482,1270 427,1247 382,1202C337,1157 315,1101 315,1034l-181,0l-2,6C129,1153 168,1244 249,1315C330,1385 429,1420 547,1420C683,1420 791,1386 870,1317C949,1248 988,1149 988,1021C988,956 970,897 935,844C899,791 850,749 787,719C859,692 914,651 953,595C991,539 1010,471 1010,390C1010,262 967,162 881,89C795,16 684,-20 547,-20C427,-20 324,14 237,83C150,152 109,251 112,382l2,6l181,0C295,315 318,254 365,204C412,154 472,129 547,129C632,129 699,153 748,200C797,247 821,309 821,386C821,471 799,535 755,577C711,618 647,639 562,639l-178,0l0,148z"/>
+<glyph unicode="5" horiz-adv-x="1118" d="M172,622l81,778l695,0l0,-169l-534,0l-47,-401C398,852 433,870 470,885C507,899 550,906 599,907C724,908 823,868 895,785C966,702 1002,589 1002,446C1002,305 965,193 892,108C819,23 712,-20 571,-20C450,-20 350,12 270,77C189,141 151,236 154,362l2,6l170,0C326,292 349,233 394,192C439,150 498,129 571,129C647,129 706,157 749,214C792,270 813,347 813,444C813,533 792,606 749,661C706,716 647,743 572,743C496,743 441,732 406,710C371,687 345,653 328,606z"/>
+<glyph unicode="D" horiz-adv-x="1347" d="M161,0l0,1400l448,0C795,1400 945,1344 1058,1231C1171,1118 1227,973 1227,795l0,-191C1227,425 1171,280 1058,168C945,56 795,0 609,0M350,1250l0,-1101l259,0C742,149 846,192 923,277C1000,362 1038,471 1038,604l0,193C1038,928 1000,1037 923,1122C846,1207 742,1250 609,1250z"/>
+<glyph unicode="F" horiz-adv-x="1090" d="M949,619l-605,0l0,-619l-189,0l0,1400l894,0l0,-150l-705,0l0,-482l605,0z"/>
+<glyph unicode="J" horiz-adv-x="1090" d="M741,1400l189,0l0,-994C930,275 890,172 810,95C729,18 625,-20 496,-20C365,-20 260,14 183,83C106,151 69,250 72,380l2,6l181,0C255,299 276,234 318,192C359,150 419,129 496,129C568,129 627,154 673,204C718,254 741,321 741,406z"/>
+<glyph unicode="L" horiz-adv-x="1090" d="M349,149l698,0l0,-149l-887,0l0,1400l189,0z"/>
+<glyph unicode="N" horiz-adv-x="1400" d="M1238,0l-189,0l-693,1075l-6,-2l0,-1073l-189,0l0,1400l189,0l693,-1073l6,2l0,1071l189,0z"/>
+<glyph unicode="P" horiz-adv-x="1256" d="M344,542l0,-542l-189,0l0,1400l543,0C849,1400 967,1360 1052,1281C1137,1201 1179,1098 1179,971C1179,843 1137,740 1053,661C968,582 850,542 698,542M344,691l354,0C795,691 868,718 917,772C966,825 990,891 990,969C990,1048 966,1114 917,1169C868,1223 795,1250 698,1250l-354,0z"/>
+<glyph unicode="S" horiz-adv-x="1256" d="M958,371C958,432 934,481 887,519C839,557 754,591 633,622C489,657 377,709 298,778C219,846 179,932 179,1037C179,1147 221,1238 306,1311C391,1384 502,1420 641,1420C791,1420 910,1378 999,1295C1088,1211 1130,1113 1127,1002l-2,-6l-180,0C945,1075 917,1141 860,1193C803,1244 730,1270 641,1270C550,1270 482,1249 437,1207C391,1164 368,1108 368,1039C368,978 393,927 444,887C495,846 579,811 698,781C845,743 957,691 1033,626C1109,560 1147,476 1147,373C1147,259 1102,165 1011,91C920,17 802,-20 658,-20C520,-20 398,18 293,94C188,169 137,270 140,397l2,6l180,0C322,315 356,247 425,200C493,153 571,129 658,129C749,129 821,152 876,197C931,242 958,300 958,371z"/>
+<glyph unicode="T" horiz-adv-x="1190" d="M1158,1250l-471,0l0,-1250l-189,0l0,1250l-467,0l0,150l1127,0z"/>
+<glyph unicode="V" horiz-adv-x="1256" d="M593,368l32,-119l6,0l33,119l371,1032l205,0l-531,-1400l-162,0l-531,1400l205,0z"/>
+<glyph unicode="a" horiz-adv-x="1069" d="M758,0C752,29 747,55 744,79C740,103 737,127 736,151C702,102 658,62 605,29C551,-4 491,-20 425,-20C316,-20 232,8 174,64C116,119 87,195 87,292C87,391 127,469 208,526C288,582 398,610 537,610l199,0l0,103C736,775 718,823 683,858C647,893 594,910 524,910C462,910 413,895 377,865C340,835 322,798 322,754l-180,-2l-1,6C136,834 171,903 245,966C318,1029 415,1060 535,1060C654,1060 749,1030 820,970C890,910 925,824 925,711l0,-501C925,172 927,136 931,102C935,67 942,33 953,0M453,138C522,138 583,155 635,190C686,225 720,265 736,311l0,171l-205,0C452,482 390,463 345,425C299,386 276,341 276,288C276,242 291,206 321,179C350,152 394,138 453,138z"/>
+<glyph unicode="b" horiz-adv-x="1128" d="M1038,481C1038,330 1002,209 929,118C856,26 754,-20 625,-20C554,-20 492,-6 440,21C388,48 345,89 311,143l-31,-143l-145,0l0,1500l189,0l0,-587C358,960 400,997 450,1022C499,1047 557,1060 623,1060C754,1060 856,1009 929,906C1002,803 1038,668 1038,501M849,501C849,620 827,718 782,793C737,868 668,906 576,906C515,906 464,892 423,863C381,834 348,796 324,747l0,-449C349,246 382,206 423,177C464,148 515,133 578,133C670,133 738,165 783,228C827,291 849,376 849,481z"/>
+<glyph unicode="c" horiz-adv-x="1069" d="M556,129C617,129 671,148 719,187C766,226 790,273 790,329l170,0l2,-6C965,234 925,154 842,85C759,15 663,-20 556,-20C412,-20 299,30 216,130C133,230 91,353 91,500l0,40C91,685 133,808 216,909C299,1010 413,1060 556,1060C675,1060 773,1024 851,952C928,880 966,792 963,688l-2,-6l-171,0C790,745 767,798 722,843C677,888 621,910 556,910C465,910 396,873 350,800C303,726 280,639 280,540l0,-40C280,399 303,312 350,239C396,166 465,129 556,129z"/>
+<glyph unicode="d" horiz-adv-x="1128" d="M91,501C91,668 127,803 200,906C273,1009 375,1060 506,1060C569,1060 625,1049 673,1026C721,1003 762,969 797,925l0,575l189,0l0,-1500l-145,0l-30,135C776,84 734,45 683,19C632,-7 572,-20 504,-20C375,-20 274,26 201,118C128,209 91,330 91,481M280,481C280,376 302,291 347,228C391,165 459,133 552,133C611,133 660,146 700,173C739,199 772,236 797,283l0,479C772,807 739,842 699,868C659,893 611,906 554,906C461,906 392,868 347,793C302,718 280,620 280,501z"/>
+<glyph unicode="e" horiz-adv-x="1048" d="M592,-20C434,-20 311,28 222,124C133,219 89,345 89,500l0,42C89,692 134,816 225,914C315,1011 426,1060 557,1060C691,1060 793,1020 862,940C931,860 966,748 966,604l0,-105l-681,0l-2,-5C280,387 304,299 355,231C406,163 485,129 592,129C653,129 705,136 750,151C795,165 838,184 880,208l47,-134C896,51 853,29 798,10C743,-10 675,-20 592,-20M557,910C485,910 426,885 379,836C332,786 303,722 292,645l2,-6l483,0l0,20C777,737 760,798 726,843C691,888 635,910 557,910z"/>
+<glyph unicode="g" horiz-adv-x="1128" d="M101,501C101,668 137,803 210,906C283,1009 385,1060 516,1060C584,1060 643,1047 694,1020C745,993 787,953 822,902l24,138l150,0l0,-1046C996,-139 957,-242 878,-313C799,-384 685,-420 537,-420C486,-420 432,-413 373,-399C314,-385 261,-366 216,-343l29,148C283,-215 328,-231 380,-243C432,-255 484,-261 535,-261C630,-261 699,-240 742,-198C785,-156 807,-92 807,-6l0,120C772,70 731,37 682,14C633,-9 577,-20 514,-20C384,-20 283,26 210,118C137,209 101,330 101,481M289,481C289,376 311,291 356,228C400,165 468,133 561,133C620,133 669,146 709,172C749,198 782,235 807,283l0,478C782,806 749,841 709,867C668,893 620,906 563,906C470,906 401,868 356,793C311,718 289,620 289,501z"/>
+<glyph unicode="h" horiz-adv-x="1128" d="M324,900C360,951 405,990 459,1018C512,1046 572,1060 637,1060C751,1060 839,1027 902,960C965,893 996,791 996,652l0,-652l-189,0l0,654C807,739 788,803 750,844C711,885 655,906 580,906C521,906 471,895 428,872C385,849 350,817 324,776l0,-776l-189,0l0,1500l189,0z"/>
+<glyph unicode="i" horiz-adv-x="493" d="M341,0l-189,0l0,1040l189,0M341,1307l-189,0l0,193l189,0z"/>
+<glyph unicode="l" horiz-adv-x="493" d="M341,0l-189,0l0,1500l189,0z"/>
+<glyph unicode="m" horiz-adv-x="1782" d="M304,1040l13,-137C352,953 397,992 450,1019C503,1046 566,1060 637,1060C712,1060 777,1044 832,1011C886,978 926,929 953,863C986,924 1030,972 1085,1007C1140,1042 1206,1060 1281,1060C1395,1060 1485,1024 1551,951C1617,878 1650,768 1650,622l0,-622l-189,0l0,624C1461,727 1441,799 1402,842C1362,885 1303,906 1225,906C1156,906 1100,883 1059,836C1018,789 994,731 987,660l0,-660l-189,0l0,624C798,721 778,793 737,838C696,883 638,906 561,906C501,906 452,894 413,870C374,845 344,811 324,768l0,-768l-189,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1128" d="M308,1040l13,-155C356,940 400,983 454,1014C507,1045 568,1060 637,1060C751,1060 839,1027 902,962C965,896 996,794 996,657l0,-657l-189,0l0,653C807,744 788,809 751,848C714,887 657,906 580,906C520,906 469,894 427,870C384,845 351,812 327,769l0,-769l-189,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1128" d="M89,530C89,684 132,811 217,911C302,1010 418,1060 563,1060C710,1060 826,1010 911,911C996,812 1038,685 1038,530l0,-21C1038,354 996,228 911,129C826,30 711,-20 565,-20C418,-20 302,30 217,129C132,228 89,354 89,509M278,509C278,399 302,308 351,237C399,165 470,129 565,129C658,129 728,165 777,237C825,308 849,399 849,509l0,21C849,639 825,729 776,802C727,874 656,910 563,910C470,910 399,874 351,802C302,729 278,639 278,530z"/>
+<glyph unicode="p" horiz-adv-x="1128" d="M1036,481C1036,330 1000,209 927,118C854,26 753,-20 624,-20C559,-20 501,-9 451,13C401,35 359,68 324,111l0,-511l-189,0l0,1440l145,0l30,-138C345,953 388,993 440,1020C492,1047 553,1060 622,1060C752,1060 854,1009 927,906C1000,803 1036,668 1036,501M848,501C848,619 824,716 776,792C728,868 658,906 565,906C508,906 460,893 420,868C380,843 348,808 324,765l0,-497C349,224 381,190 421,166C460,141 509,129 567,129C659,129 729,162 777,227C824,292 848,377 848,481z"/>
+<glyph unicode="r" horiz-adv-x="691" d="M636,872l-98,6C485,878 441,866 406,842C371,818 343,784 324,740l0,-740l-189,0l0,1040l170,0l13,-161C347,935 385,979 431,1012C476,1044 529,1060 588,1060C603,1060 617,1059 630,1057C643,1054 653,1052 662,1049z"/>
+<glyph unicode="s" horiz-adv-x="1047" d="M766,280C766,322 750,356 717,382C684,408 623,431 532,451C407,477 311,514 244,562C177,609 143,673 143,752C143,837 180,909 253,970C326,1030 421,1060 538,1060C658,1060 755,1028 830,964C905,900 940,825 937,740l-2,-6l-180,0C755,778 735,818 694,855C653,892 601,910 538,910C469,910 418,895 384,865C349,835 332,799 332,758C332,717 347,686 377,663C406,640 467,620 559,601C689,574 788,536 855,487C922,438 955,373 955,293C955,201 917,126 841,68C765,9 666,-20 543,-20C408,-20 302,14 225,81C147,148 110,227 114,316l2,6l180,0C299,255 325,207 374,176C422,145 478,129 543,129C613,129 668,143 707,171C746,199 766,235 766,280z"/>
+<glyph unicode="t" horiz-adv-x="652" d="M373,1291l0,-251l233,0l0,-140l-233,0l0,-630C373,221 382,186 400,165C418,144 442,133 472,133C490,133 510,135 532,139C554,142 571,147 582,152l42,-127C604,12 575,1 536,-7C497,-16 459,-20 423,-20C350,-20 292,7 249,60C206,113 184,195 184,308l0,592l-161,0l0,140l161,0l0,251z"/>
+<glyph unicode="u" horiz-adv-x="1128" d="M810,156C777,99 734,56 681,26C628,-5 567,-20 498,-20C383,-20 293,16 228,89C163,162 131,274 131,427l0,613l189,0l0,-615C320,314 337,238 371,196C405,154 458,133 529,133C598,133 656,147 701,175C746,202 780,241 803,292l0,748l189,0l0,-1040l-169,0z"/>
+<glyph unicode="v" horiz-adv-x="997" d="M486,307l18,-79l6,0l20,79l247,733l193,0l-392,-1040l-143,0l-395,1040l193,0z"/>
+<glyph unicode="w" horiz-adv-x="1508" d="M405,379l25,-139l6,0l27,139l213,661l151,0l213,-661l30,-155l6,0l32,155l159,661l197,0l-308,-1040l-153,0l-212,633l-40,166l-6,0l-37,-166l-208,-633l-152,0l-308,1040l197,0z"/>
+<glyph unicode="y" horiz-adv-x="997" d="M459,385l35,-134l6,0l263,789l210,0l-447,-1200C499,-230 460,-291 411,-342C362,-394 294,-420 209,-420C193,-420 173,-418 150,-415C127,-412 109,-408 96,-405l19,149C109,-255 120,-256 148,-258C175,-260 193,-261 200,-261C242,-261 276,-244 301,-209C326,-174 349,-134 369,-87l47,108l-395,1019l210,0z"/>
+</font>
+
+ <g id="Photo_Detail">
+ <g id="Small_Handset_15_">
+ <path fill="#231F20" d="M1873.721,1612.564c-0.328-24.343-2.395-48.913-15.186-63.736c-12.93-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.77,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.1,1.364-0.141,1.817c-1.322,14.792-1.566,45.215-1.602,51.166
+ c0,0-0.382,483.339-0.235,493.404c0.038,2.578,0.052,4.728,0.063,6.697l0.005,0.691c0.054,9.697,0.087,15.549,2.573,48.66
+ c2.719,36.188,9.689,50.865,19.32,61.77c8.688,9.843,20.217,15.713,37.381,19.035c1.895,0.368,3.672,0.723,5.411,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.695,0.192,7.275,0.39,10.803,0.588c16.601,0.921,32.279,1.791,53.264,1.791
+ c14.896,0,31.371-0.439,50.365-1.346c66.148-3.152,98.892-6.912,118.058-20.855c18.6-13.531,22.909-33.763,25.763-47.161
+ l0.119-0.569c3.372-15.818,3.445-51.611,3.445-62.361C1873.721,2081.354,1873.721,1657.188,1873.721,1612.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1876.028,2181.241l-0.281,1.875c-0.072,0.479-0.702,4.666-1.37,8.28
+ c-1.277,6.899-3.504,16.453-6.858,22.774c-3.762,7.089-7.313,13.785-25.246,24.332c-13.561,7.975-44.078,14.007-53.067,15.188
+ c-10.188,1.34-47.461,4.193-65.38,5.006c-16.789,0.76-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.006
+ c-18.312,0-31.146-0.512-41.738-0.99c-17.92-0.812-55.19-3.666-65.378-5.006c-8.989-1.181-39.507-7.211-53.066-15.188
+ c-17.933-10.547-21.485-17.24-25.249-24.33c-3.354-6.324-5.58-15.877-6.857-22.776c-0.679-3.679-1.283-7.586-1.335-7.917
+ l-0.29-1.877"/>
+ <g>
+ <path fill="#FFFFFF" d="M1667.013,1529.061c10.201,0,27.874,0.14,36.708,0.24c7.614,0.088,18.294,0.725,26.885,1.236l0.5,0.028
+ c2.512,0.15,4.87,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.723,0.531,1.806,1.179,1.945,2.262l0.032,0.237
+ c0.188,1.365-0.314,2.429-1.491,3.162c-0.988,0.615-1.324,0.715-2.398,0.715c-0.332,0-0.727-0.009-1.236-0.024l-1.703-0.035
+ c-3.761-0.057-11.223-0.741-18.543-1.436c-6.7-0.639-23.177-1.326-32.006-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.928,0-12.207,0.246-18.627,0.462l-0.783,0.026l-0.321,0.011c-2.095,0.07-4.106,0.138-5.937,0.191
+ c-5.414,0.16-11.04,0.538-16.004,0.872l-0.074,0.005l-0.324,0.023l-0.764,0.051c-1.768,0.118-3.43,0.229-4.945,0.315
+ c-1.136,0.066-2.32,0.142-3.509,0.219l-0.376,0.025c-3.294,0.213-6.699,0.435-9.017,0.435c-1.104,0-1.898-0.05-2.366-0.149
+ c-0.92-0.193-1.602-0.633-2.028-1.307c-0.585-0.926-0.538-2.033-0.419-2.537c0.205-0.858,1.297-2.674,2.896-2.985
+ c1.385-0.269,5.949-0.477,11.281-0.719l4.124-0.19c7.028-0.332,32.181-1.323,41.397-1.381
+ C1663.847,1529.064,1665.343,1529.061,1667.013,1529.061 M1667.013,1526.061c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.054,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.688,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.231-0.442l0.357-0.023c1.181-0.077,2.357-0.152,3.486-0.218
+ c1.737-0.099,3.671-0.23,5.734-0.368l0.335-0.023c4.957-0.333,10.575-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.782-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.553,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.799,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.635,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.364-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.943-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.019-1.241
+ C1694.985,1526.201,1677.333,1526.061,1667.013,1526.061L1667.013,1526.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1680.723,2247.081c-11.699,0-21.221-9.545-21.221-21.277
+ s9.521-21.277,21.221-21.277c11.701,0,21.221,9.545,21.221,21.277S1692.424,2247.081,1680.723,2247.081"/>
+ <g>
+ <rect x="1519.225" y="1597.061" fill="#FFFFFF" width="322.999" height="536.333"/>
+ <path fill="#FFFFFF" d="M1840.724,1598.561v533.333h-319.999v-533.333H1840.724 M1843.724,1595.561h-3h-319.999h-3v3v533.333v3h3
+ h319.999h3v-3v-533.333V1595.561L1843.724,1595.561z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1679.698,1546.003c20.732,0,40.964,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.386c0.173,23.872,0.312,42.728,0.355,46.401
+ c0.117,10.021,0.228,207.919,0.228,216.126c0,4.868,0.025,31.566,0.053,59.64l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.778c0.042,11.215,0.119,32.094-1.439,38.839
+ c-1.78,7.697-8.244,17.708-21.045,22.719c-9.945,3.891-26.666,7.543-48.354,10.562c-11.729,1.626-51.374,5.173-72.877,6.076
+ c-10.138,0.425-24.321,0.659-39.936,0.659c-14.254,0-27.824-0.204-36.3-0.544c-16.597-0.671-49.325-3.386-61.491-4.596
+ c-11.771-1.168-32.572-4.617-37.803-5.817l-2.014-0.453c-5.668-1.266-15.157-3.382-21.724-6.917
+ c-7.469-4.025-9.602-5.682-15.219-14.076c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.275,0.037-2.434,0.037-3.439
+ c0-8.102-0.566-120.259-0.688-136.373c-0.113-14.793-0.229-94.736-0.229-104.809c0-2.89-0.045-15.857-0.105-32.624
+ c-0.126-36.406-0.317-102.758-0.238-110.091c0.037-3.612,0.074-16.623,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.425-26.02,5.928-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.83-6.483,105.295-7.112
+ C1669.638,1546.046,1674.706,1546.003,1679.698,1546.003 M1679.698,1543.003c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.575,0.63-79.049,3.433-105.658,7.14c-29.075,4.048-49.77,9.947-56.267,25.578c-5.726,13.777-5.925,26.098-6.157,40.364
+ c-0.025,1.594-0.053,3.21-0.086,4.854c-0.225,10.625-0.353,54.494-0.445,86.526l-0.002,0.686l-0.004,1.245l-0.006,2
+ c-0.045,15.49-0.082,27.726-0.117,31.18c-0.082,7.575,0.125,77.47,0.238,110.132c0.055,15.162,0.105,29.607,0.105,32.614
+ c0,10.075,0.116,90.036,0.229,104.831c0.122,16.136,0.688,128.274,0.688,136.351c0,0.992-0.018,2.135-0.037,3.394l-0.003,0.196
+ c-0.139,9.21-0.372,24.626,4.85,32.429c5.957,8.901,8.405,10.799,16.289,15.048c6.924,3.728,16.657,5.901,22.472,7.199
+ l2.03,0.457c5.273,1.21,26.281,4.697,38.165,5.876c12.16,1.209,44.948,3.932,61.666,4.607c8.533,0.343,22.147,0.547,36.421,0.547
+ c15.65,0,29.877-0.235,40.062-0.662c21.565-0.905,61.374-4.467,73.163-6.102c21.919-3.052,38.874-6.766,49.034-10.74
+ c13.888-5.437,20.923-16.395,22.875-24.837c1.512-6.54,1.575-23.832,1.517-39.526l-0.01-3.774c0-2.753-0.012-15.482-0.026-32.017
+ l-0.013-14.212l-0.023-24.958c-0.027-28.072-0.053-54.769-0.053-59.637c0-8.713-0.111-206.159-0.228-216.161
+ c-0.046-3.796-0.194-24.109-0.355-46.388l-0.017-2.385l-0.021-2.979c-0.275-37.592-0.618-84.377-0.755-92.894
+ c-0.253-15.714-0.886-30.699-5.796-41.329c-5.154-11.158-15.382-15.758-24.564-19.194c-9.273-3.474-23.76-6.253-46.969-9.013
+ c-22.379-2.659-28.905-3.237-45.018-4.375C1720.8,1543.723,1700.5,1543.003,1679.698,1543.003L1679.698,1543.003z"/>
+ </g>
+ <rect x="1520.725" y="1598.336" fill="#231F20" width="319.998" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1553.824,2150.321c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.876,6.892,6.876l3.062-0.147l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.269-5.638-6.113
+ c-3.829-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.496L1553.824,2150.321z"/>
+ <rect x="1627.437" y="2147.608" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="1634.39" y="2154.162" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="1634.39" y="2160.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.859"/>
+ <rect x="1634.39" y="2166.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1722.591,2146.168 1708.128,2160.25 1709.797,2161.854
+ 1722.803,2149.097 1735.524,2161.714 1737.262,2160.321 1731.63,2154.884 1731.63,2148.052 1729.407,2148.052 1729.407,2152.583
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1716.053,2161.646 1713.76,2163.249 1713.76,2170.36
+ 1731.493,2170.36 1731.493,2163.249 1729.335,2161.435 1729.335,2168.339 1716.053,2168.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1806.595,2160.37l2.348,2.962v1.464c0,0,3.686,4.25,5.074,5.367
+ c1.393,1.114,1.738,0.627,2.227,0.139c0.487-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.068
+ l-1.638-2.092"/>
+ <g>
+ <path fill="#FFFFFF" d="M1801.667,2147.732c3.648,0,6.616,2.968,6.616,6.616c0,3.647-2.968,6.615-6.616,6.615
+ c-3.647,0-6.615-2.968-6.615-6.615C1795.051,2150.7,1798.019,2147.732,1801.667,2147.732 M1801.667,2144.732
+ c-5.311,0-9.615,4.306-9.615,9.616s4.305,9.615,9.615,9.615s9.616-4.305,9.616-9.615S1806.977,2144.732,1801.667,2144.732
+ L1801.667,2144.732z"/>
+ </g>
+ </g>
+ <rect x="1520.725" y="2010.927" width="319.998" height="120.968"/>
+ <rect x="1521.801" y="1671.354" fill="#E6E7E8" width="318.922" height="339.572"/>
+ <rect x="1537.296" y="2037.719" fill="none" width="303.428" height="44.124"/>
+ <text transform="matrix(1 0 0 1 1537.2964 2053.832)"><tspan x="0" y="0" fill="#FFFFFF" font-family="'Roboto-Regular'" font-size="22">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="26.4" fill="#FFFFFF" font-family="'Roboto-Regular'" font-size="22">consectetur adipiscing elit.</tspan></text>
+ <g id="Action_Bar_copy_6">
+ <rect x="1520.725" y="1622.521" fill="#FFC91F" width="319.998" height="48.833"/>
+ <polygon points="1536.465,1646.938 1542.312,1637.674 1537.336,1637.674 1531.49,1646.938 1537.336,1656.2 1542.312,1656.2 "/>
+ <text transform="matrix(1 0 0 1 1604.7993 1654.1582)" font-family="'Roboto-Regular'" font-size="18">Photos</text>
+ <g id="photo_icon_4_">
+ <path d="M1583.538,1635.623v21.678h-27.802v-21.678H1583.538 M1587.308,1631.854h-35.343v29.217h35.343V1631.854
+ L1587.308,1631.854z"/>
+ <g>
+ <defs>
+ <rect id="SVGID_1_" x="1557.266" y="1637.194" width="24.661" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_2_">
+ <use xlink:href="#SVGID_1_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_2_)">
+ <circle cx="1569.636" cy="1644.185" r="6.283"/>
+ <path d="M1580.067,1666.879c-0.426,3.36-3.405,7.016-6.036,7.529c-2.93,0.474-5.859,0.474-8.789,0
+ c-2.631-0.514-5.609-4.17-6.035-7.529c-0.336-3.174-0.336-6.348,0-9.521c0.426-3.359,3.404-7.016,6.035-7.529
+ c2.93-0.474,5.859-0.474,8.789,0c2.631,0.514,5.61,4.17,6.036,7.529C1580.402,1660.531,1580.402,1663.705,1580.067,1666.879z"
+ />
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_2_)">
+ <circle cx="1581.81" cy="1644.46" r="4.516"/>
+ <path d="M1589.306,1660.771c-0.305,2.415-2.446,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.316,0
+ c-1.891-0.369-4.033-2.996-4.338-5.411c-0.241-2.281-0.241-4.562,0-6.844c0.305-2.414,2.447-5.042,4.338-5.411
+ c2.105-0.341,4.211-0.341,6.316,0c1.892,0.369,4.033,2.997,4.338,5.411C1589.548,1656.209,1589.548,1658.49,1589.306,1660.771z
+ "/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_2_)">
+ <circle cx="1557.267" cy="1644.46" r="4.516"/>
+ <path d="M1564.763,1660.771c-0.306,2.415-2.447,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.317,0
+ c-1.892-0.369-4.032-2.996-4.339-5.411c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.042,4.339-5.411
+ c2.106-0.341,4.212-0.341,6.317,0c1.891,0.369,4.032,2.997,4.338,5.411C1565.003,1656.209,1565.003,1658.49,1564.763,1660.771z
+ "/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle cx="1796.747" cy="1646.604" r="5"/>
+ <circle cx="1814.829" cy="1636.604" r="5"/>
+ <circle cx="1814.829" cy="1656.938" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="1814.829,1636.604 1796.747,1646.604
+ 1814.829,1656.938 "/>
+ </g>
+ <g>
+ <path d="M1757.518,1636.457l3.08,6.241l0.465,0.943l1.041,0.15l6.889,1.001l-4.984,4.858l-0.754,0.734l0.178,1.036l1.178,6.859
+ l-6.161-3.238l-0.931-0.489l-0.931,0.489l-6.161,3.238l1.178-6.859l0.178-1.036l-0.754-0.734l-4.984-4.858l6.889-1.001
+ l1.041-0.15l0.465-0.943L1757.518,1636.457 M1757.518,1631.938l-4.873,9.876l-10.898,1.583l7.886,7.687l-1.862,10.854
+ l9.748-5.124l9.748,5.124l-1.862-10.854l7.886-7.687l-10.898-1.583L1757.518,1631.938L1757.518,1631.938z"/>
+ </g>
+ </g>
+ <rect x="1537.006" y="2091.254" fill="none" width="194.768" height="13.23"/>
+ <text transform="matrix(1 0 0 1 1537.0068 2101.5078)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="14">January 1, 2012</text>
+</g>
+<g id="Photo_Detail__x2014__Fullscreen_1_">
+ <g id="Small_Handset_5_">
+ <path fill="#231F20" d="M2445.721,1612.564c-0.328-24.343-2.395-48.913-15.186-63.736c-12.93-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.77,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.1,1.364-0.141,1.817c-1.322,14.792-1.566,45.215-1.602,51.166
+ c0,0-0.382,483.339-0.235,493.404c0.038,2.578,0.052,4.728,0.063,6.697l0.005,0.691c0.054,9.697,0.087,15.549,2.573,48.66
+ c2.719,36.188,9.689,50.865,19.32,61.77c8.688,9.843,20.217,15.713,37.381,19.035c1.895,0.368,3.672,0.723,5.411,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.695,0.192,7.275,0.39,10.803,0.588c16.601,0.921,32.279,1.791,53.264,1.791
+ c14.896,0,31.371-0.439,50.365-1.346c66.148-3.152,98.892-6.912,118.058-20.855c18.6-13.531,22.909-33.763,25.763-47.161
+ l0.119-0.569c3.372-15.818,3.445-51.611,3.445-62.361C2445.721,2081.354,2445.721,1657.188,2445.721,1612.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M2448.028,2181.241l-0.281,1.875c-0.072,0.479-0.702,4.666-1.37,8.28
+ c-1.277,6.899-3.504,16.453-6.858,22.774c-3.762,7.089-7.313,13.785-25.246,24.332c-13.561,7.975-44.078,14.007-53.067,15.188
+ c-10.188,1.34-47.461,4.193-65.38,5.006c-16.789,0.76-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.006
+ c-18.312,0-31.146-0.512-41.738-0.99c-17.92-0.812-55.19-3.666-65.378-5.006c-8.989-1.181-39.507-7.211-53.066-15.188
+ c-17.933-10.547-21.485-17.24-25.249-24.33c-3.354-6.324-5.58-15.877-6.857-22.776c-0.679-3.679-1.283-7.586-1.335-7.917
+ l-0.29-1.877"/>
+ <g>
+ <path fill="#FFFFFF" d="M2239.013,1529.061c10.201,0,27.874,0.14,36.708,0.24c7.614,0.088,18.294,0.725,26.885,1.236l0.5,0.028
+ c2.512,0.15,4.87,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.723,0.531,1.806,1.179,1.945,2.262l0.032,0.237
+ c0.188,1.365-0.314,2.429-1.491,3.162c-0.988,0.615-1.324,0.715-2.398,0.715c-0.332,0-0.727-0.009-1.236-0.024l-1.703-0.035
+ c-3.761-0.057-11.223-0.741-18.543-1.436c-6.7-0.639-23.178-1.326-32.006-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.928,0-12.207,0.246-18.627,0.462l-0.783,0.026l-0.321,0.011c-2.095,0.07-4.106,0.138-5.937,0.191
+ c-5.414,0.16-11.04,0.538-16.004,0.872l-0.074,0.005l-0.324,0.023l-0.764,0.051c-1.768,0.118-3.43,0.229-4.945,0.315
+ c-1.136,0.066-2.32,0.142-3.509,0.219l-0.376,0.025c-3.294,0.213-6.699,0.435-9.017,0.435c-1.104,0-1.898-0.05-2.366-0.149
+ c-0.92-0.193-1.602-0.633-2.028-1.307c-0.585-0.926-0.538-2.033-0.419-2.537c0.205-0.858,1.297-2.674,2.896-2.985
+ c1.385-0.269,5.949-0.477,11.281-0.719l4.124-0.19c7.028-0.332,32.181-1.323,41.397-1.381
+ C2235.847,1529.064,2237.343,1529.061,2239.013,1529.061 M2239.013,1526.061c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.054,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.688,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.231-0.442l0.357-0.023c1.181-0.077,2.357-0.152,3.486-0.218
+ c1.737-0.099,3.671-0.23,5.734-0.368l0.335-0.023c4.957-0.333,10.575-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.782-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.553,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.799,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.635,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.364-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.943-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.019-1.241
+ C2266.985,1526.201,2249.333,1526.061,2239.013,1526.061L2239.013,1526.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M2252.723,2247.081c-11.699,0-21.221-9.545-21.221-21.277
+ s9.521-21.277,21.221-21.277c11.701,0,21.221,9.545,21.221,21.277S2264.424,2247.081,2252.723,2247.081"/>
+ <g>
+ <rect x="2091.225" y="1597.061" fill="#FFFFFF" width="322.999" height="536.333"/>
+ <path fill="#FFFFFF" d="M2412.724,1598.561v533.333h-319.999v-533.333H2412.724 M2415.724,1595.561h-3h-319.999h-3v3v533.333v3h3
+ h319.999h3v-3v-533.333V1595.561L2415.724,1595.561z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M2251.698,1546.003c20.732,0,40.964,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.386c0.173,23.872,0.312,42.728,0.355,46.401
+ c0.117,10.021,0.228,207.919,0.228,216.126c0,4.868,0.025,31.566,0.053,59.64l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.778c0.042,11.215,0.119,32.094-1.439,38.839
+ c-1.78,7.697-8.244,17.708-21.045,22.719c-9.945,3.891-26.666,7.543-48.354,10.562c-11.729,1.626-51.374,5.173-72.877,6.076
+ c-10.138,0.425-24.321,0.659-39.936,0.659c-14.254,0-27.824-0.204-36.3-0.544c-16.597-0.671-49.325-3.386-61.491-4.596
+ c-11.771-1.168-32.572-4.617-37.803-5.817l-2.014-0.453c-5.668-1.266-15.157-3.382-21.724-6.917
+ c-7.469-4.025-9.602-5.682-15.219-14.076c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.275,0.037-2.434,0.037-3.439
+ c0-8.102-0.566-120.259-0.688-136.373c-0.113-14.793-0.229-94.736-0.229-104.809c0-2.89-0.045-15.857-0.105-32.624
+ c-0.126-36.406-0.317-102.758-0.238-110.091c0.037-3.612,0.074-16.623,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.425-26.02,5.928-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.83-6.483,105.295-7.112
+ C2241.638,1546.046,2246.706,1546.003,2251.698,1546.003 M2251.698,1543.003c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.575,0.63-79.049,3.433-105.658,7.14c-29.074,4.048-49.77,9.947-56.267,25.578c-5.726,13.777-5.925,26.098-6.157,40.364
+ c-0.025,1.594-0.052,3.21-0.086,4.854c-0.225,10.625-0.353,54.494-0.445,86.526l-0.002,0.686l-0.004,1.245l-0.006,2
+ c-0.046,15.49-0.082,27.726-0.117,31.18c-0.082,7.575,0.125,77.47,0.238,110.132c0.055,15.162,0.105,29.607,0.105,32.614
+ c0,10.075,0.116,90.036,0.229,104.831c0.122,16.136,0.688,128.274,0.688,136.351c0,0.992-0.018,2.135-0.037,3.394l-0.003,0.196
+ c-0.139,9.21-0.371,24.626,4.851,32.429c5.957,8.901,8.404,10.799,16.289,15.048c6.924,3.728,16.656,5.901,22.472,7.199
+ l2.03,0.457c5.273,1.21,26.281,4.697,38.165,5.876c12.16,1.209,44.948,3.932,61.666,4.607c8.532,0.343,22.147,0.547,36.421,0.547
+ c15.65,0,29.877-0.235,40.061-0.662c21.566-0.905,61.375-4.467,73.164-6.102c21.919-3.052,38.874-6.766,49.034-10.74
+ c13.888-5.437,20.923-16.395,22.875-24.837c1.511-6.54,1.575-23.832,1.517-39.526l-0.01-3.774c0-2.753-0.012-15.482-0.026-32.017
+ l-0.013-14.212l-0.023-24.958c-0.027-28.072-0.053-54.769-0.053-59.637c0-8.713-0.111-206.159-0.228-216.161
+ c-0.046-3.796-0.194-24.109-0.355-46.388l-0.017-2.385l-0.021-2.979c-0.275-37.592-0.618-84.377-0.756-92.894
+ c-0.252-15.714-0.885-30.699-5.795-41.329c-5.154-11.158-15.382-15.758-24.564-19.194c-9.273-3.474-23.76-6.253-46.969-9.013
+ c-22.379-2.659-28.905-3.237-45.018-4.375C2292.8,1543.723,2272.5,1543.003,2251.698,1543.003L2251.698,1543.003z"/>
+ </g>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M2125.824,2150.321c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.876,6.892,6.876l3.062-0.147l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.269-5.638-6.113
+ c-3.829-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.496L2125.824,2150.321z"/>
+ <rect x="2199.437" y="2147.608" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="2206.39" y="2154.162" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="2206.39" y="2160.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.859"/>
+ <rect x="2206.39" y="2166.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2294.591,2146.168 2280.128,2160.25 2281.797,2161.854
+ 2294.803,2149.097 2307.524,2161.714 2309.262,2160.321 2303.63,2154.884 2303.63,2148.052 2301.407,2148.052 2301.407,2152.583
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2288.053,2161.646 2285.76,2163.249 2285.76,2170.36
+ 2303.493,2170.36 2303.493,2163.249 2301.335,2161.435 2301.335,2168.339 2288.053,2168.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M2378.595,2160.37l2.348,2.962v1.464c0,0,3.686,4.25,5.074,5.367
+ c1.393,1.114,1.738,0.627,2.227,0.139c0.487-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.068
+ l-1.638-2.092"/>
+ <g>
+ <path fill="#FFFFFF" d="M2373.667,2147.732c3.648,0,6.616,2.968,6.616,6.616c0,3.647-2.968,6.615-6.616,6.615
+ c-3.647,0-6.615-2.968-6.615-6.615C2367.051,2150.7,2370.019,2147.732,2373.667,2147.732 M2373.667,2144.732
+ c-5.311,0-9.615,4.306-9.615,9.616s4.305,9.615,9.615,9.615s9.616-4.305,9.616-9.615S2378.977,2144.732,2373.667,2144.732
+ L2373.667,2144.732z"/>
+ </g>
+ </g>
+ <rect x="2093.801" y="1598.561" fill="#E6E7E8" width="318.922" height="533.333"/>
+</g>
+<g id="Photo_List">
+ <g id="Small_Handset_12_">
+ <path fill="#231F20" d="M1294.256,1612.564c-0.328-24.343-2.395-48.913-15.186-63.736c-12.93-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.77,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.214-1.602,51.166
+ c0,0-0.382,483.338-0.235,493.404c0.038,2.578,0.051,4.727,0.063,6.697l0.005,0.691c0.054,9.697,0.086,15.549,2.573,48.66
+ c2.718,36.188,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.367,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.191,7.275,0.389,10.803,0.588c16.6,0.92,32.279,1.791,53.263,1.791
+ c14.896,0,31.371-0.439,50.365-1.346c66.148-3.152,98.892-6.912,118.058-20.855c18.6-13.531,22.909-33.764,25.763-47.162
+ l0.119-0.568c3.372-15.818,3.445-51.611,3.445-62.361C1294.256,2081.354,1294.256,1657.188,1294.256,1612.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1296.562,2181.241l-0.281,1.875c-0.072,0.479-0.702,4.666-1.37,8.279
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.313,13.785-25.246,24.332c-13.561,7.975-44.078,14.006-53.067,15.188
+ c-10.188,1.34-47.461,4.193-65.38,5.006c-16.789,0.76-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.006
+ c-18.312,0-31.146-0.512-41.738-0.99c-17.919-0.812-55.19-3.666-65.378-5.006c-8.989-1.182-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.24-25.249-24.33c-3.354-6.324-5.581-15.877-6.858-22.777c-0.679-3.678-1.283-7.586-1.335-7.916
+ l-0.29-1.877"/>
+ <g>
+ <path fill="#FFFFFF" d="M1087.548,1529.061c10.202,0,27.874,0.14,36.708,0.24c7.614,0.088,18.293,0.725,26.884,1.236l0.5,0.028
+ c2.511,0.15,4.869,0.29,6.959,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.722,0.531,1.806,1.179,1.945,2.262l0.031,0.237
+ c0.188,1.365-0.313,2.429-1.491,3.162c-0.987,0.615-1.324,0.715-2.398,0.715c-0.333,0-0.727-0.009-1.236-0.024l-1.704-0.035
+ c-3.76-0.057-11.223-0.741-18.543-1.436c-6.699-0.639-23.177-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.927,0-12.206,0.246-18.626,0.462l-0.784,0.026l-0.321,0.011c-2.095,0.07-4.107,0.138-5.937,0.191
+ c-5.415,0.16-11.042,0.538-16.006,0.872l-0.072,0.005l-0.324,0.023l-0.772,0.051c-1.765,0.118-3.423,0.229-4.937,0.315
+ c-1.136,0.066-2.32,0.142-3.51,0.219l-0.379,0.025c-3.292,0.214-6.697,0.435-9.013,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.919-0.193-1.602-0.633-2.027-1.306c-0.585-0.927-0.539-2.034-0.419-2.538c0.204-0.858,1.297-2.674,2.896-2.985
+ c1.384-0.269,5.948-0.476,11.28-0.719l4.125-0.19c7.029-0.332,32.182-1.323,41.398-1.381
+ C1084.382,1529.064,1085.878,1529.061,1087.548,1529.061 M1087.548,1526.061c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.553,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.799,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.635,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.364-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.943-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.019-1.241
+ C1115.52,1526.201,1097.868,1526.061,1087.548,1526.061L1087.548,1526.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1101.258,2247.081c-11.699,0-21.22-9.545-21.22-21.277
+ s9.521-21.277,21.22-21.277c11.701,0,21.221,9.545,21.221,21.277S1112.959,2247.081,1101.258,2247.081"/>
+ <g>
+ <rect x="939.759" y="1597.062" fill="#FFFFFF" width="323" height="536.332"/>
+ <path fill="#FFFFFF" d="M1261.259,1598.562v533.332h-320v-533.332H1261.259 M1264.259,1595.562h-3h-320h-3v3v533.332v3h3h320h3
+ v-3v-533.332V1595.562L1264.259,1595.562z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1100.232,1546.003c20.732,0,40.964,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.74,5.52,40.12
+ c0.141,8.726,0.492,57.03,0.776,95.845l0.017,2.385c0.173,23.873,0.312,42.729,0.355,46.402
+ c0.117,10.021,0.228,207.918,0.228,216.125c0,4.869,0.025,31.566,0.053,59.641l0.023,24.957
+ c0.021,23.082,0.039,42.723,0.039,46.234l0.01,3.777c0.042,11.215,0.119,32.094-1.439,38.84
+ c-1.78,7.697-8.244,17.707-21.045,22.719c-9.945,3.891-26.666,7.543-48.354,10.562c-11.729,1.625-51.374,5.172-72.877,6.076
+ c-10.138,0.424-24.321,0.658-39.936,0.658c-14.254,0-27.824-0.203-36.3-0.543c-16.596-0.672-49.325-3.387-61.491-4.596
+ c-11.772-1.168-32.573-4.617-37.803-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.724-6.916
+ c-7.469-4.025-9.602-5.682-15.219-14.076c-4.7-7.023-4.478-21.855-4.344-30.715l0.003-0.195c0.02-1.275,0.038-2.434,0.038-3.439
+ c0-8.102-0.566-120.26-0.689-136.373c-0.113-14.793-0.229-94.736-0.229-104.809c0-2.891-0.045-15.857-0.105-32.625
+ c-0.126-36.406-0.318-102.758-0.238-110.09c0.037-3.613,0.074-16.623,0.123-33.203l0.004-1.244
+ c0.094-32.277,0.221-76.484,0.446-87.158c0.034-1.65,0.062-3.271,0.087-4.869c0.227-13.962,0.424-26.019,5.927-39.26
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112
+ C1090.173,1546.046,1095.24,1546.003,1100.232,1546.003 M1100.232,1543.003c-5.006,0-10.09,0.043-15.113,0.128
+ c-37.575,0.63-79.048,3.433-105.658,7.14c-29.075,4.048-49.77,9.947-56.266,25.578c-5.726,13.776-5.925,26.097-6.157,40.363
+ c-0.026,1.593-0.053,3.21-0.087,4.856c-0.225,10.651-0.352,54.644-0.445,86.767l-0.001,0.445l-0.004,1.244l-0.002,0.755
+ c-0.047,16.135-0.084,28.879-0.121,32.427c-0.083,7.609,0.125,77.484,0.238,110.13c0.058,16.106,0.105,29.676,0.105,32.615
+ c0,10.084,0.116,90.068,0.229,104.831c0.123,16.078,0.689,128.217,0.689,136.351c0,0.979-0.018,2.104-0.037,3.342l0,0.052
+ l-0.003,0.196c-0.139,9.21-0.372,24.625,4.85,32.429c5.957,8.901,8.405,10.799,16.289,15.048
+ c6.92,3.726,16.65,5.898,22.464,7.196l2.038,0.459c5.269,1.21,26.274,4.697,38.166,5.877c12.167,1.209,44.963,3.932,61.666,4.607
+ c8.518,0.342,22.133,0.546,36.421,0.546c15.642,0,29.869-0.234,40.061-0.661c21.562-0.906,61.371-4.468,73.163-6.102
+ c21.919-3.052,38.875-6.766,49.035-10.74c13.888-5.438,20.922-16.396,22.875-24.837c1.511-6.541,1.575-23.833,1.517-39.526
+ l-0.01-3.774c0-2.753-0.011-15.484-0.026-32.02l-0.013-14.21l-0.023-24.957c-0.027-28.073-0.053-54.769-0.053-59.638
+ c0-8.713-0.111-206.158-0.228-216.16c-0.045-3.797-0.194-24.11-0.355-46.389l-0.017-2.384l-0.022-2.974
+ c-0.275-37.594-0.618-84.381-0.755-92.898c-0.252-15.714-0.886-30.699-5.795-41.329c-5.154-11.158-15.382-15.758-24.564-19.194
+ c-9.273-3.474-23.76-6.253-46.97-9.013c-22.38-2.659-28.907-3.237-45.017-4.375
+ C1141.334,1543.723,1121.034,1543.003,1100.232,1543.003L1100.232,1543.003z"/>
+ </g>
+ <rect x="941.26" y="1598.337" fill="#231F20" width="319.998" height="24.184"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M974.358,2150.321c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.891,6.875,6.891,6.875l3.062-0.146l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.01c0,0-1.812-3.27-5.638-6.113
+ c-3.83-2.848-6.822-2.629-8.912-2.764c-2.086-0.133-8.349-0.047-8.349-0.047l6.471-6.496L974.358,2150.321z"/>
+ <rect x="1047.972" y="2147.608" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="1054.925" y="2154.161" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.762"/>
+ <rect x="1054.925" y="2160.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.859"/>
+ <rect x="1054.925" y="2166.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1143.126,2146.167 1128.663,2160.249 1130.332,2161.853
+ 1143.338,2149.097 1156.059,2161.714 1157.797,2160.321 1152.165,2154.884 1152.165,2148.052 1149.941,2148.052
+ 1149.941,2152.583 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1136.588,2161.646 1134.295,2163.249 1134.295,2170.36
+ 1152.027,2170.36 1152.027,2163.249 1149.87,2161.435 1149.87,2168.339 1136.588,2168.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1227.13,2160.37l2.348,2.961v1.465c0,0,3.686,4.25,5.074,5.367
+ c1.393,1.113,1.738,0.627,2.227,0.139c0.487-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.068
+ l-1.638-2.092"/>
+ <g>
+ <path fill="#FFFFFF" d="M1222.201,2147.731c3.648,0,6.616,2.969,6.616,6.617s-2.968,6.615-6.616,6.615s-6.615-2.967-6.615-6.615
+ S1218.553,2147.731,1222.201,2147.731 M1222.201,2144.731c-5.311,0-9.615,4.307-9.615,9.617s4.305,9.615,9.615,9.615
+ s9.616-4.305,9.616-9.615S1227.512,2144.731,1222.201,2144.731L1222.201,2144.731z"/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_4">
+ <rect x="941.26" y="1622.521" fill="#FFC91F" width="319.998" height="48.834"/>
+ <polygon points="1188.671,1654.854 1188.671,1666.354 1177.171,1666.354 "/>
+ <text transform="matrix(1 0 0 1 1009.333 1654.1592)" font-family="'Roboto-Regular'" font-size="18">Photos</text>
+ <g id="photo_icon_6_">
+ <path d="M988.072,1635.624v21.678H960.27v-21.678H988.072 M991.842,1631.854H956.5v29.217h35.342V1631.854L991.842,1631.854z"/>
+ <g>
+ <defs>
+ <rect id="SVGID_3_" x="961.8" y="1637.195" width="24.662" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_4_">
+ <use xlink:href="#SVGID_3_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_4_)">
+ <circle cx="974.171" cy="1644.186" r="6.283"/>
+ <path d="M984.601,1666.88c-0.426,3.36-3.405,7.016-6.036,7.529c-2.929,0.474-5.859,0.474-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.521c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.929-0.474,5.859-0.474,8.789,0c2.631,0.514,5.61,4.17,6.036,7.529C984.936,1660.532,984.936,1663.706,984.601,1666.88z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_4_)">
+ <circle cx="986.344" cy="1644.461" r="4.516"/>
+ <path d="M993.841,1660.772c-0.306,2.415-2.447,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.317,0
+ c-1.891-0.369-4.033-2.996-4.338-5.411c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.042,4.338-5.411
+ c2.105-0.341,4.211-0.341,6.317,0c1.891,0.369,4.032,2.997,4.338,5.411C994.082,1656.21,994.082,1658.491,993.841,1660.772z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_4_)">
+ <circle cx="961.801" cy="1644.461" r="4.516"/>
+ <path d="M969.298,1660.772c-0.306,2.415-2.448,5.042-4.338,5.411c-2.106,0.341-4.211,0.341-6.317,0
+ c-1.891-0.369-4.032-2.996-4.338-5.411c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.042,4.338-5.411
+ c2.106-0.341,4.211-0.341,6.317,0c1.891,0.369,4.032,2.997,4.338,5.411C969.538,1656.21,969.538,1658.491,969.298,1660.772z"/>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_8_">
+ <polygon points="1240.875,1634.167 1240.875,1644.167 1230.875,1644.167 "/>
+ <polygon points="1214.625,1659.31 1214.625,1649.31 1224.625,1649.31 "/>
+ <g>
+ <g>
+ <path d="M1227.75,1637.612c4.146,0,7.641,2.768,8.751,6.555h4.118c-1.196-6.018-6.501-10.555-12.87-10.555
+ c-6.368,0-11.674,4.537-12.87,10.555h4.118C1220.11,1640.38,1223.604,1637.612,1227.75,1637.612z M1227.75,1655.862
+ c-4.146,0-7.64-2.766-8.751-6.553h-4.118c1.196,6.018,6.502,10.553,12.87,10.553c6.369,0,11.674-4.535,12.87-10.553h-4.118
+ C1235.391,1653.097,1231.896,1655.862,1227.75,1655.862z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="Swipe_Tabs_copy">
+ </g>
+ <g id="Photos_2_">
+ <g>
+ <rect x="941.259" y="1674.354" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="1049.243" y="1674.355" fill="#E6E7E8" width="104.032" height="104.031"/>
+ </g>
+ <g>
+ <rect x="1157.226" y="1674.354" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="941.259" y="1782.388" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="1049.243" y="1782.389" fill="#E6E7E8" width="104.032" height="104.031"/>
+ </g>
+ <g>
+ <rect x="1157.226" y="1782.388" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="941.259" y="1890.42" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="1049.243" y="1890.421" fill="#E6E7E8" width="104.032" height="104.031"/>
+ </g>
+ <g>
+ <rect x="1157.226" y="1890.42" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="941.259" y="1998.452" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="1049.243" y="1998.453" fill="#E6E7E8" width="104.032" height="104.031"/>
+ </g>
+ <g>
+ <rect x="1157.226" y="1998.452" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <g>
+ <rect x="941.259" y="2106.331" fill="#E6E7E8" width="104.032" height="25.563"/>
+ </g>
+ <g>
+ <rect x="1049.243" y="2106.331" fill="#E6E7E8" width="104.032" height="25.563"/>
+ </g>
+ <g>
+ <rect x="1157.226" y="2106.331" fill="#E6E7E8" width="104.032" height="25.563"/>
+ </g>
+ <polygon fill="#FFC91F" points="1049.243,1801.888 1049.243,1782.388 1068.743,1782.388 "/>
+ <polygon fill="#FFC91F" points="1157.226,1801.889 1157.226,1782.389 1176.726,1782.389 "/>
+ </g>
+</g>
+<g id="News_List_Dropdown">
+ <g id="Small_Handset_4_">
+ <path fill="#231F20" d="M735.279,1612.564c-0.329-24.343-2.396-48.913-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.769,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.215-1.602,51.166
+ c0,0-0.382,483.339-0.235,493.404c0.038,2.578,0.051,4.728,0.063,6.697l0.005,0.691c0.054,9.697,0.086,15.549,2.573,48.66
+ c2.718,36.188,9.689,50.865,19.32,61.77c8.688,9.843,20.217,15.713,37.381,19.035c1.895,0.368,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.192,7.275,0.39,10.803,0.588c16.6,0.921,32.279,1.791,53.264,1.791
+ c14.896,0,31.371-0.439,50.365-1.346c66.147-3.152,98.891-6.912,118.057-20.855c18.6-13.531,22.909-33.763,25.762-47.161
+ l0.12-0.569c3.372-15.818,3.445-51.611,3.445-62.361C735.279,2081.354,735.279,1657.188,735.279,1612.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M737.585,2181.241l-0.281,1.875c-0.072,0.479-0.702,4.666-1.37,8.28
+ c-1.277,6.899-3.504,16.453-6.858,22.774c-3.762,7.089-7.314,13.785-25.246,24.332c-13.561,7.975-44.078,14.007-53.068,15.188
+ c-10.188,1.34-47.461,4.193-65.38,5.006c-16.789,0.76-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.006
+ c-18.312,0-31.146-0.512-41.738-0.99c-17.919-0.812-55.19-3.666-65.378-5.006c-8.989-1.181-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.24-25.249-24.33c-3.354-6.324-5.581-15.877-6.858-22.776c-0.679-3.679-1.283-7.586-1.335-7.917
+ l-0.29-1.877"/>
+ <g>
+ <path fill="#FFFFFF" d="M528.571,1529.061c10.201,0,27.874,0.14,36.709,0.24c7.614,0.088,18.293,0.725,26.884,1.236l0.5,0.028
+ c2.512,0.15,4.87,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.722,0.531,1.806,1.179,1.945,2.255l0.032,0.244
+ c0.188,1.366-0.313,2.429-1.491,3.162c-0.987,0.615-1.323,0.715-2.397,0.715c-0.333,0-0.727-0.009-1.237-0.024l-1.704-0.035
+ c-3.76-0.057-11.223-0.741-18.543-1.436c-6.699-0.639-23.176-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.927,0-12.207,0.246-18.626,0.462l-0.784,0.026l-0.321,0.011c-2.095,0.07-4.107,0.138-5.937,0.191
+ c-5.415,0.16-11.042,0.538-16.006,0.872l-0.072,0.005l-0.324,0.023l-0.772,0.051c-1.764,0.118-3.423,0.229-4.936,0.315
+ c-1.136,0.066-2.321,0.142-3.51,0.219l-0.379,0.025c-3.292,0.214-6.697,0.435-9.013,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.919-0.193-1.602-0.633-2.027-1.306c-0.585-0.927-0.539-2.034-0.419-2.538c0.204-0.858,1.297-2.674,2.896-2.985
+ c1.384-0.269,5.948-0.476,11.28-0.719l4.125-0.19c7.029-0.332,32.182-1.323,41.398-1.381
+ C525.405,1529.064,526.901,1529.061,528.571,1529.061 M528.571,1526.061c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.798,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.365-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.944-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.018-1.241
+ C556.542,1526.201,538.891,1526.061,528.571,1526.061L528.571,1526.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M542.281,2247.081c-11.699,0-21.22-9.545-21.22-21.277
+ s9.521-21.277,21.22-21.277c11.702,0,21.221,9.545,21.221,21.277S553.982,2247.081,542.281,2247.081"/>
+ <g>
+ <rect x="380.782" y="1597.061" fill="#FFFFFF" width="323" height="536.333"/>
+ <path fill="#FFFFFF" d="M702.282,1598.561v533.333h-320v-533.333H702.282 M705.282,1595.561h-3h-320h-3v3v533.333v3h3h320h3v-3
+ v-533.333V1595.561L705.282,1595.561z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M541.256,1546.003c20.732,0,40.963,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.386c0.173,23.872,0.312,42.728,0.355,46.401
+ c0.117,10.021,0.228,207.919,0.228,216.126c0,4.868,0.025,31.566,0.052,59.64l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.778c0.042,11.215,0.119,32.094-1.44,38.839
+ c-1.78,7.697-8.244,17.708-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.626-51.374,5.173-72.876,6.076
+ c-10.138,0.425-24.322,0.659-39.936,0.659c-14.254,0-27.824-0.204-36.3-0.544c-16.596-0.671-49.325-3.386-61.491-4.596
+ c-11.772-1.168-32.573-4.617-37.803-5.817l-2.013-0.453c-5.668-1.266-15.158-3.382-21.724-6.917
+ c-7.469-4.025-9.602-5.682-15.219-14.076c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.275,0.038-2.434,0.038-3.439
+ c0-8.102-0.566-120.259-0.689-136.373c-0.113-14.793-0.229-94.736-0.229-104.809c0-2.89-0.045-15.857-0.105-32.624
+ c-0.126-36.406-0.318-102.758-0.238-110.091c0.037-3.612,0.074-16.623,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.424-26.02,5.927-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112
+ C531.196,1546.046,536.264,1546.003,541.256,1546.003 M541.256,1543.003c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.576,0.63-79.049,3.433-105.659,7.14c-29.075,4.048-49.77,9.947-56.266,25.578c-5.726,13.776-5.925,26.097-6.157,40.364
+ c-0.026,1.593-0.053,3.209-0.087,4.854c-0.225,10.652-0.352,54.646-0.445,86.768l-0.001,0.444l-0.004,1.245l-0.002,0.764
+ c-0.047,16.13-0.084,28.872-0.12,32.417c-0.083,7.61,0.125,77.485,0.238,110.131c0.058,16.105,0.105,29.675,0.105,32.614
+ c0,10.084,0.116,90.068,0.229,104.831c0.123,16.079,0.689,128.218,0.689,136.351c0,0.979-0.018,2.104-0.037,3.342l0,0.052
+ l-0.003,0.196c-0.139,9.21-0.372,24.626,4.85,32.429c5.957,8.901,8.405,10.799,16.289,15.048
+ c6.923,3.728,16.657,5.901,22.472,7.199l2.03,0.457c5.274,1.21,26.283,4.697,38.166,5.876c12.16,1.209,44.947,3.932,61.666,4.607
+ c8.533,0.343,22.148,0.547,36.421,0.547c15.65,0,29.877-0.235,40.062-0.662c21.567-0.906,61.375-4.467,73.163-6.102
+ c21.919-3.052,38.875-6.766,49.035-10.74c13.888-5.437,20.922-16.395,22.875-24.837c1.511-6.537,1.575-23.83,1.517-39.525
+ l-0.01-3.775c0-2.753-0.011-15.482-0.026-32.017l-0.013-14.212l-0.023-24.958c-0.027-28.072-0.052-54.769-0.052-59.637
+ c0-8.712-0.111-206.141-0.228-216.161c-0.043-3.633-0.181-22.327-0.355-46.388l-0.017-2.385l-0.022-2.979
+ c-0.275-37.592-0.618-84.377-0.755-92.894c-0.252-15.714-0.886-30.699-5.795-41.329c-5.154-11.158-15.382-15.758-24.564-19.194
+ c-9.274-3.474-23.76-6.253-46.97-9.013c-22.377-2.659-28.904-3.237-45.017-4.375
+ C582.358,1543.723,562.057,1543.003,541.256,1543.003L541.256,1543.003z"/>
+ </g>
+ <rect x="382.283" y="1598.336" fill="#231F20" width="319.998" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M415.381,2150.321c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.891,6.876,6.891,6.876l3.062-0.147l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.01c0,0-1.812-3.269-5.638-6.113
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.496L415.381,2150.321z"/>
+ <rect x="488.995" y="2147.608" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="495.948" y="2154.162" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="495.948" y="2160.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.859"/>
+ <rect x="495.948" y="2166.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="584.149,2146.168 569.686,2160.25 571.355,2161.854
+ 584.36,2149.097 597.082,2161.714 598.82,2160.321 593.188,2154.884 593.188,2148.052 590.964,2148.052 590.964,2152.583 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="577.611,2161.646 575.318,2163.249 575.318,2170.36
+ 593.05,2170.36 593.05,2163.249 590.893,2161.435 590.893,2168.339 577.611,2168.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M668.153,2160.37l2.348,2.962v1.464c0,0,3.686,4.25,5.074,5.367
+ c1.393,1.114,1.738,0.627,2.227,0.139c0.488-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.068
+ l-1.637-2.092"/>
+ <g>
+ <path fill="#FFFFFF" d="M663.225,2147.732c3.648,0,6.616,2.968,6.616,6.616c0,3.647-2.968,6.615-6.616,6.615
+ s-6.616-2.968-6.616-6.615C656.609,2150.7,659.577,2147.732,663.225,2147.732 M663.225,2144.732
+ c-5.311,0-9.616,4.306-9.616,9.616s4.305,9.615,9.616,9.615s9.616-4.305,9.616-9.615S668.535,2144.732,663.225,2144.732
+ L663.225,2144.732z"/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_3">
+ <rect x="382.283" y="1622.521" fill="#FFC91F" width="319.998" height="48.833"/>
+ <polygon points="629.694,1654.854 629.694,1666.354 618.194,1666.354 "/>
+ <g>
+ <text transform="matrix(1 0 0 1 450.356 1654.3545)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <g id="news_icon_4_">
+ <g>
+ <g>
+ <path d="M429.723,1636.566h-0.864v19.038c0,0.25,0.069,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.521,0.484
+ c0.093,0.049,0.191,0.086,0.292,0.111c0.547,0.135,0.881,0.689,0.745,1.236c-0.115,0.465-0.532,0.775-0.99,0.775
+ c-0.081,0-0.164-0.01-0.247-0.03c-0.258-0.064-0.508-0.159-0.745-0.282c-0.539-0.281-0.992-0.702-1.312-1.219
+ c-0.33-0.533-0.504-1.147-0.504-1.777v-20.609c0-1.735-1.406-3.142-3.142-3.142h-23.012c-1.735,0-3.142,1.406-3.142,3.142
+ v22.933c0,1.734,1.406,3.142,3.142,3.142h29.059c1.735,0,3.142-1.407,3.142-3.142v-18.221
+ C432.865,1637.973,431.458,1636.566,429.723,1636.566z M407.104,1656.2H399.8v-2.051h7.304V1656.2z M407.104,1653.306H399.8
+ v-2.051h7.304V1653.306z M415.822,1656.2h-7.304v-2.051h7.304V1656.2z M415.822,1653.306h-7.304v-2.051h7.304V1653.306z
+ M415.822,1650.075H399.8v-8.953h16.022V1650.075z M424.54,1656.2h-7.304v-2.051h7.304V1656.2z M424.54,1653.306h-7.304
+ v-2.051h7.304V1653.306z M424.54,1650.411h-7.304v-2.052h7.304V1650.411z M424.54,1647.515h-7.304v-2.051h7.304V1647.515z
+ M424.54,1644.62h-7.304v-2.051h7.304V1644.62z M424.54,1639.551H399.8v-2.356h24.74V1639.551z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_5_" x="399.8" y="1641.122" width="16.022" height="8.953"/>
+ </defs>
+ <clipPath id="SVGID_6_">
+ <use xlink:href="#SVGID_5_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_6_)">
+ <ellipse cx="407.587" cy="1644.513" rx="3.076" ry="3.049"/>
+ <path d="M412.692,1655.522c-0.208,1.631-1.667,3.404-2.955,3.654c-1.435,0.229-2.868,0.229-4.303,0
+ c-1.288-0.25-2.747-2.023-2.955-3.654c-0.164-1.539-0.164-3.078,0-4.618c0.208-1.63,1.667-3.403,2.955-3.653
+ c1.435-0.229,2.868-0.229,4.303,0c1.288,0.25,2.746,2.023,2.955,3.653C412.857,1652.444,412.857,1653.983,412.692,1655.522z"
+ />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_2_">
+ <polygon points="681.898,1634.167 681.898,1644.167 671.898,1644.167 "/>
+ <polygon points="655.648,1659.309 655.648,1649.309 665.648,1649.309 "/>
+ <g>
+ <g>
+ <path d="M668.773,1637.613c4.146,0,7.641,2.767,8.751,6.554h4.118c-1.195-6.017-6.501-10.554-12.87-10.554
+ s-11.674,4.537-12.87,10.554h4.118C661.133,1640.38,664.627,1637.613,668.773,1637.613z M668.773,1655.862
+ c-4.146,0-7.641-2.768-8.751-6.554h-4.118c1.195,6.017,6.501,10.554,12.87,10.554s11.674-4.537,12.87-10.554h-4.118
+ C676.414,1653.095,672.919,1655.862,668.773,1655.862z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="Dropdown">
+ <g>
+ <rect x="386.189" y="1671.854" fill="#FFC91F" width="268.579" height="167.667"/>
+ <path d="M653.269,1673.354v164.667H387.689v-164.667H653.269 M656.269,1670.354h-3H387.689h-3v3v164.667v3h3h265.579h3v-3
+ v-164.667V1670.354L656.269,1670.354z"/>
+ </g>
+ <g id="News_1_">
+ <text transform="matrix(1 0 0 1 458.356 1711.3545)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <g id="news_icon_12_">
+ <g>
+ <g>
+ <path d="M437.723,1693.566h-0.864v19.038c0,0.25,0.069,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.521,0.484
+ c0.093,0.049,0.191,0.086,0.292,0.111c0.547,0.135,0.881,0.689,0.745,1.236c-0.115,0.465-0.532,0.775-0.99,0.775
+ c-0.081,0-0.164-0.01-0.247-0.03c-0.258-0.064-0.508-0.159-0.745-0.282c-0.539-0.281-0.992-0.702-1.312-1.219
+ c-0.33-0.533-0.504-1.147-0.504-1.777v-20.609c0-1.734-1.406-3.141-3.142-3.141h-23.012c-1.735,0-3.142,1.406-3.142,3.141
+ v22.934c0,1.734,1.406,3.142,3.142,3.142h29.059c1.735,0,3.142-1.407,3.142-3.142v-18.221
+ C440.865,1694.973,439.458,1693.566,437.723,1693.566z M415.104,1713.2H407.8v-2.051h7.304V1713.2z M415.104,1710.306H407.8
+ v-2.051h7.304V1710.306z M423.822,1713.2h-7.304v-2.051h7.304V1713.2z M423.822,1710.306h-7.304v-2.051h7.304V1710.306z
+ M423.822,1707.075H407.8v-8.953h16.022V1707.075z M432.54,1713.2h-7.304v-2.051h7.304V1713.2z M432.54,1710.306h-7.304
+ v-2.051h7.304V1710.306z M432.54,1707.411h-7.304v-2.052h7.304V1707.411z M432.54,1704.515h-7.304v-2.051h7.304V1704.515z
+ M432.54,1701.62h-7.304v-2.051h7.304V1701.62z M432.54,1696.551H407.8v-2.356h24.74V1696.551z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_7_" x="407.8" y="1698.122" width="16.022" height="8.953"/>
+ </defs>
+ <clipPath id="SVGID_8_">
+ <use xlink:href="#SVGID_7_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_8_)">
+ <ellipse cx="415.587" cy="1701.513" rx="3.076" ry="3.049"/>
+ <path d="M420.692,1712.522c-0.208,1.631-1.667,3.404-2.955,3.654c-1.435,0.229-2.868,0.229-4.303,0
+ c-1.288-0.25-2.747-2.023-2.955-3.654c-0.164-1.539-0.164-3.078,0-4.618c0.208-1.63,1.667-3.403,2.955-3.653
+ c1.435-0.229,2.868-0.229,4.303,0c1.288,0.25,2.746,2.023,2.955,3.653C420.857,1709.444,420.857,1710.983,420.692,1712.522z"
+ />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="Photos_3_">
+ <text transform="matrix(1 0 0 1 458.356 1764.0693)" font-family="'Roboto-Regular'" font-size="18">Photos</text>
+ <g id="photo_icon_5_">
+ <path d="M437.095,1745.534v21.678h-27.802v-21.678H437.095 M440.865,1741.765h-35.342v29.217h35.342V1741.765L440.865,1741.765z
+ "/>
+ <g>
+ <defs>
+ <rect id="SVGID_9_" x="410.823" y="1747.105" width="24.662" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_10_">
+ <use xlink:href="#SVGID_9_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_10_)">
+ <circle cx="423.194" cy="1754.096" r="6.283"/>
+ <path d="M433.624,1776.79c-0.426,3.36-3.405,7.016-6.036,7.529c-2.929,0.474-5.859,0.474-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.521c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.929-0.474,5.859-0.474,8.789,0c2.631,0.514,5.61,4.17,6.036,7.529C433.959,1770.442,433.959,1773.616,433.624,1776.79z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_10_)">
+ <circle cx="435.367" cy="1754.371" r="4.516"/>
+ <path d="M442.864,1770.683c-0.306,2.415-2.447,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.317,0
+ c-1.891-0.369-4.033-2.996-4.338-5.411c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.042,4.338-5.411
+ c2.105-0.341,4.211-0.341,6.317,0c1.891,0.369,4.032,2.997,4.338,5.411C443.105,1766.12,443.105,1768.401,442.864,1770.683z"
+ />
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_10_)">
+ <circle cx="410.823" cy="1754.371" r="4.516"/>
+ <path d="M418.321,1770.683c-0.306,2.415-2.448,5.042-4.338,5.411c-2.106,0.341-4.211,0.341-6.317,0
+ c-1.891-0.369-4.032-2.996-4.338-5.411c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.042,4.338-5.411
+ c2.106-0.341,4.211-0.341,6.317,0c1.891,0.369,4.032,2.997,4.338,5.411C418.561,1766.12,418.561,1768.401,418.321,1770.683z"
+ />
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="Saved_1_">
+ <text transform="matrix(1 0 0 1 458.356 1815.3545)" font-family="'Roboto-Regular'" font-size="18">Saved</text>
+ <g>
+ <polygon points="423.194,1791.599 428.067,1801.475 438.966,1803.058 431.08,1810.744 432.941,1821.599 423.194,1816.475
+ 413.446,1821.599 415.308,1810.744 407.422,1803.058 418.32,1801.475 "/>
+ </g>
+ </g>
+ </g>
+ <g id="News_Items_copy">
+ </g>
+</g>
+<g id="News_Detail">
+ <g id="Small_Handset_8_">
+ <path fill="#231F20" d="M1854.781,708.564c-0.329-24.343-2.396-48.913-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.982-9.899c-20.475-1.186-36.542-1.714-52.096-1.714c-13.769,0-26.201,0.396-41.939,0.897
+ l-7.656,0.241c-30.293,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.598,10.746-30.955,22.62
+ c-6.647,10.728-7.987,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.215-1.603,51.165
+ c0,0-0.381,483.339-0.234,493.405c0.037,2.578,0.051,4.727,0.062,6.696l0.006,0.692c0.054,9.696,0.086,15.549,2.572,48.66
+ c2.719,36.187,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.368,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.193,7.274,0.39,10.803,0.588c16.601,0.921,32.279,1.792,53.264,1.792
+ c14.896,0,31.37-0.44,50.365-1.346c66.147-3.153,98.892-6.913,118.058-20.855c18.6-13.532,22.908-33.763,25.762-47.162l0.12-0.569
+ c3.372-15.818,3.445-51.611,3.445-62.362C1854.781,1177.355,1854.781,753.188,1854.781,708.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1857.086,1277.242l-0.281,1.875c-0.071,0.478-0.701,4.665-1.369,8.28
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.313,13.785-25.246,24.332c-13.562,7.974-44.078,14.006-53.067,15.188
+ c-10.189,1.34-47.461,4.192-65.381,5.005c-16.789,0.761-25.232,0.992-36.139,0.992l-3.568-0.008l-3.641,0.007
+ c-18.311,0-31.146-0.512-41.738-0.991c-17.919-0.812-55.189-3.665-65.377-5.005c-8.99-1.181-39.507-7.211-53.066-15.188
+ c-17.933-10.547-21.486-17.241-25.249-24.331c-3.354-6.324-5.581-15.876-6.858-22.776c-0.678-3.678-1.282-7.586-1.334-7.917
+ l-0.291-1.878"/>
+ <g>
+ <path fill="#FFFFFF" d="M1648.073,625.061c10.2,0,27.873,0.14,36.709,0.241c7.613,0.088,18.293,0.724,26.884,1.236l0.5,0.028
+ c2.512,0.15,4.869,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.723,0.531,1.806,1.179,1.944,2.249l0.032,0.25
+ c0.188,1.366-0.313,2.429-1.49,3.162c-0.988,0.615-1.324,0.715-2.398,0.715c-0.333,0-0.727-0.009-1.237-0.024l-1.702-0.035
+ c-3.76-0.057-11.223-0.741-18.544-1.436c-6.699-0.639-23.177-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.928,0-12.206,0.246-18.627,0.462l-0.783,0.026l-0.321,0.011c-2.095,0.07-4.106,0.138-5.936,0.191
+ c-5.415,0.16-11.041,0.538-16.005,0.872l-0.074,0.005l-0.325,0.023l-0.763,0.051c-1.768,0.118-3.43,0.229-4.945,0.315
+ c-1.136,0.066-2.32,0.142-3.511,0.219l-0.374,0.025c-3.294,0.213-6.7,0.435-9.017,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.92-0.193-1.602-0.632-2.027-1.307c-0.586-0.927-0.539-2.034-0.42-2.536c0.162-0.679,1.149-2.647,2.898-2.986
+ c1.383-0.269,5.945-0.476,11.228-0.717l0.051-0.002l0.001,0l4.124-0.19c7.029-0.332,32.184-1.323,41.398-1.381
+ C1644.906,625.064,1646.403,625.061,1648.073,625.061 M1648.073,622.061c-1.676,0-3.178,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.525,1.384l-4.121,0.19c-5.868,0.267-10.109,0.459-11.713,0.771
+ c-3.054,0.592-4.836,3.524-5.244,5.234c-0.297,1.254-0.243,3.182,0.803,4.836c0.861,1.364,2.225,2.277,3.945,2.639
+ c0.688,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.231-0.442l0.356-0.023c1.182-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.671-0.23,5.734-0.368l0.335-0.023c4.957-0.333,10.575-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.782-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.774,0.229,25.146,0.91,31.798,1.544
+ c7.389,0.702,14.924,1.391,18.783,1.449l1.686,0.035c0.519,0.016,0.941,0.025,1.3,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.225-3.59,2.877-6.117l-0.028-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.364-1.175-19.277-1.77
+ c-2.085-0.115-4.438-0.254-6.944-0.404l-0.51-0.029c-8.629-0.514-19.367-1.152-27.019-1.241
+ C1676.043,622.201,1658.393,622.061,1648.073,622.061L1648.073,622.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1661.782,1343.082c-11.699,0-21.22-9.546-21.22-21.277
+ c0-11.733,9.521-21.277,21.22-21.277c11.702,0,21.222,9.544,21.222,21.277C1683.003,1333.536,1673.484,1343.082,1661.782,1343.082
+ "/>
+ <g>
+ <rect x="1500.284" y="693.061" fill="#FFFFFF" width="323" height="536.333"/>
+ <path fill="#FFFFFF" d="M1821.784,694.561v533.333h-320V694.561H1821.784 M1824.784,691.561h-3h-320h-3v3v533.333v3h3h320h3v-3
+ V694.561V691.561L1824.784,691.561z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1660.757,642.003c20.731,0,40.964,0.717,61.852,2.192c16.036,1.132,22.539,1.707,44.874,4.361
+ c22.963,2.73,37.234,5.458,46.271,8.844c9.02,3.375,18.215,7.517,22.893,17.642c4.664,10.098,5.271,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.775,95.845l0.018,2.385c0.173,23.873,0.311,42.728,0.355,46.401
+ c0.117,10.022,0.228,207.919,0.228,216.126c0,4.869,0.024,31.566,0.052,59.639l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.011,3.779c0.042,11.215,0.118,32.094-1.44,38.838
+ c-1.779,7.698-8.243,17.708-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.626-51.373,5.173-72.876,6.077
+ c-10.138,0.424-24.321,0.659-39.937,0.659c-14.254,0-27.824-0.205-36.299-0.544c-16.597-0.67-49.326-3.385-61.491-4.595
+ c-11.772-1.168-32.573-4.617-37.804-5.818l-2.013-0.453c-5.668-1.266-15.157-3.381-21.724-6.917
+ c-7.469-4.026-9.602-5.683-15.219-14.077c-4.701-7.022-4.479-21.854-4.344-30.715l0.002-0.195
+ c0.02-1.274,0.038-2.434,0.038-3.438c0-8.102-0.566-120.259-0.688-136.374c-0.113-14.793-0.229-94.735-0.229-104.809
+ c0-2.889-0.046-15.856-0.105-32.624c-0.126-36.406-0.317-102.758-0.238-110.091c0.036-3.612,0.074-16.622,0.122-33.202
+ l0.004-1.245c0.094-32.277,0.222-76.484,0.447-87.159c0.033-1.649,0.061-3.271,0.087-4.868
+ c0.227-13.962,0.425-26.02,5.927-39.261c5.951-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.296-7.112
+ C1650.698,642.046,1655.765,642.003,1660.757,642.003 M1660.757,639.003c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.576,0.631-79.05,3.433-105.659,7.14c-29.074,4.048-49.769,9.947-56.266,25.578c-5.725,13.777-5.925,26.098-6.156,40.363
+ c-0.026,1.593-0.054,3.211-0.087,4.857c-0.225,10.672-0.354,54.771-0.447,86.971l-0.001,0.239l-0.004,1.244
+ c-0.046,15.836-0.085,29.512-0.122,33.181c-0.082,7.574,0.125,77.47,0.238,110.131c0.057,15.928,0.105,29.683,0.105,32.613
+ c0,10.078,0.116,90.047,0.229,104.832c0.122,16.133,0.688,128.273,0.688,136.351c0,0.95-0.017,2.041-0.035,3.236l-0.003,0.156
+ l-0.002,0.212c-0.14,9.194-0.374,24.609,4.851,32.413c5.956,8.901,8.404,10.799,16.288,15.049
+ c6.923,3.727,16.654,5.9,22.469,7.198l2.032,0.458c5.272,1.21,26.279,4.697,38.167,5.876c12.166,1.209,44.959,3.932,61.666,4.607
+ c8.539,0.342,22.154,0.547,36.42,0.547c15.646,0,29.874-0.235,40.062-0.661c21.573-0.907,61.379-4.469,73.162-6.103
+ c21.92-3.052,38.876-6.766,49.035-10.74c13.89-5.437,20.923-16.395,22.874-24.837c1.513-6.544,1.576-23.833,1.518-39.525
+ l-0.011-3.776c0-3.502-0.018-23.144-0.039-46.228l-0.023-24.958c-0.027-28.071-0.052-54.768-0.052-59.636
+ c0-8.713-0.11-206.163-0.228-216.162c-0.044-3.607-0.176-21.501-0.355-46.387l-0.018-2.386l-0.009-1.201
+ c-0.279-38.325-0.628-86.022-0.767-94.671c-0.254-15.716-0.888-30.703-5.796-41.329c-5.155-11.158-15.383-15.758-24.565-19.194
+ c-9.271-3.474-23.758-6.253-46.968-9.013c-22.378-2.659-28.904-3.237-45.018-4.375
+ C1701.86,639.723,1681.559,639.003,1660.757,639.003L1660.757,639.003z"/>
+ </g>
+ <rect x="1501.785" y="694.336" fill="#231F20" width="319.997" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1534.883,1246.321c0,0-6.818,6.286-7.377,6.774
+ c-0.555,0.492-0.137,1.467,0.56,1.882c0.695,0.415,6.892,6.876,6.892,6.876l3.062-0.148l-6.335-6.39c0,0,6.82-0.09,9.604,0.11
+ c2.783,0.202,5.082,1.66,6.683,2.839c1.603,1.18,3.478,3.475,3.478,3.475l2.926-0.009c0,0-1.811-3.269-5.637-6.114
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.35-0.048-8.35-0.048l6.471-6.495L1534.883,1246.321z"/>
+ <rect x="1608.497" y="1243.609" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.006" height="2.441"/>
+ <rect x="1615.45" y="1250.162" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.053" height="2.761"/>
+ <rect x="1615.45" y="1256.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.053" height="2.86"/>
+ <rect x="1615.45" y="1262.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.053" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1703.651,1242.168 1689.188,1256.25 1690.856,1257.854
+ 1703.862,1245.097 1716.583,1257.713 1718.321,1256.321 1712.69,1250.884 1712.69,1244.052 1710.465,1244.052 1710.465,1248.583
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1697.112,1257.646 1694.819,1259.25 1694.819,1266.36
+ 1712.551,1266.36 1712.551,1259.25 1710.395,1257.435 1710.395,1264.339 1697.112,1264.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1787.655,1256.37l2.348,2.962v1.463c0,0,3.686,4.25,5.074,5.368
+ c1.393,1.114,1.738,0.626,2.227,0.138c0.487-0.488,0.762-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.248,0.067
+ l-1.638-2.091"/>
+ <g>
+ <path fill="#FFFFFF" d="M1782.726,1243.732c3.647,0,6.616,2.968,6.616,6.616s-2.969,6.616-6.616,6.616s-6.616-2.968-6.616-6.616
+ S1779.079,1243.732,1782.726,1243.732 M1782.726,1240.732c-5.311,0-9.616,4.305-9.616,9.616s4.306,9.616,9.616,9.616
+ s9.616-4.305,9.616-9.616S1788.037,1240.732,1782.726,1240.732L1782.726,1240.732z"/>
+ </g>
+ </g>
+ <rect x="1502.861" y="864.712" fill="#E6E7E8" width="318.921" height="177.309"/>
+ <rect x="1518.356" y="786.947" fill="none" width="303.428" height="44.124"/>
+ <text transform="matrix(1 0 0 1 1518.3555 803.0601)"><tspan x="0" y="0" font-family="'Roboto-Regular'" font-size="22">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="26.4" font-family="'Roboto-Regular'" font-size="22">consectetur adipiscing elit.</tspan></text>
+ <rect x="1518.356" y="1058.354" fill="none" width="284.902" height="174"/>
+ <text transform="matrix(1 0 0 1 1518.3555 1068.9946)"><tspan x="0" y="0" font-family="'DroidSerif-Bold'" font-size="14">WASHINGTON,</tspan><tspan x="107.864" y="0" font-family="'DroidSerif-Bold'" font-size="14" letter-spacing="4"> </tspan><tspan x="115.767" y="0" font-family="'DroidSerif-Bold'" font-size="14">DC</tspan><tspan x="135.858" y="0" font-family="'DroidSerif-Bold'" font-size="14" letter-spacing="4"> </tspan><tspan x="143.76" y="0" font-family="'DroidSerif'" font-size="14">—</tspan><tspan x="157.76" y="0" font-family="'DroidSerif'" font-size="14" letter-spacing="4"> </tspan><tspan x="165.664" y="0" font-family="'DroidSerif'" font-size="14">Praesent</tspan><tspan x="223.858" y="0" font-family="'DroidSerif'" font-size="14" letter-spacing="4"> </tspan><tspan x="231.76" y="0" font-family="'DroidSerif'" font-size="14">vestibu</tspan><tspan x="280.563" y="0" font-family="'DroidSerif'" font-size="14">-</tspan><tspan x="0" y="21" font-family="'DroidSerif'" font-size="14">lum</tspan><tspan x="26.456" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="31.9" y="21" font-family="'DroidSerif'" font-size="14">nisl</tspan><tspan x="56.065" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="61.509" y="21" font-family="'DroidSerif'" font-size="14">sapien,</tspan><tspan x="108.8" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="114.245" y="21" font-family="'DroidSerif'" font-size="14">eu</tspan><tspan x="130.624" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="136.069" y="21" font-family="'DroidSerif'" font-size="14">convallis</tspan><tspan x="195.534" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="200.979" y="21" font-family="'DroidSerif'" font-size="14">nisl.</tspan><tspan x="229.15" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="234.594" y="21" font-family="'DroidSerif'" font-size="14">Nam</tspan><tspan x="266.388" y="21" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="271.833" y="21" font-family="'DroidSerif'" font-size="14">id </tspan><tspan x="0" y="42" font-family="'DroidSerif'" font-size="14">sodales</tspan><tspan x="49.02" y="42" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="54.409" y="42" font-family="'DroidSerif'" font-size="14">elit.</tspan><tspan x="79.655" y="42" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="85.043" y="42" font-family="'DroidSerif'" font-size="14">Vestibulum</tspan><tspan x="161.64" y="42" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="167.03" y="42" font-family="'DroidSerif'" font-size="14">sollicitudin</tspan><tspan x="241.87" y="42" font-family="'DroidSerif'" font-size="14" letter-spacing="1"> </tspan><tspan x="247.258" y="42" font-family="'DroidSerif'" font-size="14">fauci</tspan><tspan x="280.563" y="42" font-family="'DroidSerif'" font-size="14">-</tspan><tspan x="0" y="63" font-family="'DroidSerif'" font-size="14">bus</tspan><tspan x="23.796" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="27.616" y="63" font-family="'DroidSerif'" font-size="14">orci,</tspan><tspan x="57.161" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="60.982" y="63" font-family="'DroidSerif'" font-size="14">nec</tspan><tspan x="84.395" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="88.215" y="63" font-family="'DroidSerif'" font-size="14">consequat</tspan><tspan x="156.315" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="160.135" y="63" font-family="'DroidSerif'" font-size="14">velit</tspan><tspan x="189.482" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="193.303" y="63" font-family="'DroidSerif'" font-size="14">suscipit</tspan><tspan x="244.19" y="63" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="248.01" y="63" font-family="'DroidSerif'" font-size="14">vitae. </tspan><tspan x="0" y="84" font-family="'DroidSerif'" font-size="14">Praesent</tspan><tspan x="58.194" y="84" font-family="'DroidSerif'" font-size="14" letter-spacing="5"> </tspan><tspan x="67.083" y="84" font-family="'DroidSerif'" font-size="14">et</tspan><tspan x="79.504" y="84" font-family="'DroidSerif'" font-size="14" letter-spacing="5"> </tspan><tspan x="88.393" y="84" font-family="'DroidSerif'" font-size="14">condimentum</tspan><tspan x="182.257" y="84" font-family="'DroidSerif'" font-size="14" letter-spacing="5"> </tspan><tspan x="191.147" y="84" font-family="'DroidSerif'" font-size="14">massa.</tspan><tspan x="236.776" y="84" font-family="'DroidSerif'" font-size="14" letter-spacing="5"> </tspan><tspan x="245.665" y="84" font-family="'DroidSerif'" font-size="14">Etiam </tspan><tspan x="0" y="105" font-family="'DroidSerif'" font-size="14">ipsum nulla, lacinia ut semper eu, aliquam </tspan><tspan x="0" y="126" font-family="'DroidSerif'" font-size="14">eu</tspan><tspan x="16.379" y="126" font-family="'DroidSerif'" font-size="14" letter-spacing="6"> </tspan><tspan x="26.602" y="126" font-family="'DroidSerif'" font-size="14">lacus.</tspan><tspan x="64.924" y="126" font-family="'DroidSerif'" font-size="14" letter-spacing="6"> </tspan><tspan x="75.147" y="126" font-family="'DroidSerif'" font-size="14">Aenean</tspan><tspan x="125.945" y="126" font-family="'DroidSerif'" font-size="14" letter-spacing="6"> </tspan><tspan x="136.167" y="126" font-family="'DroidSerif'" font-size="14">aliquam</tspan><tspan x="191.457" y="126" font-family="'DroidSerif'" font-size="14" letter-spacing="6"> </tspan><tspan x="201.68" y="126" font-family="'DroidSerif'" font-size="14">magna</tspan><tspan x="247.235" y="126" font-family="'DroidSerif'" font-size="14" letter-spacing="6"> </tspan><tspan x="257.458" y="126" font-family="'DroidSerif'" font-size="14">eget </tspan><tspan x="0" y="147" font-family="'DroidSerif'" font-size="14">libero</tspan><tspan x="39.581" y="147" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="43.051" y="147" font-family="'DroidSerif'" font-size="14">aliquam</tspan><tspan x="98.34" y="147" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="101.813" y="147" font-family="'DroidSerif'" font-size="14">quis</tspan><tspan x="130.086" y="147" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="133.557" y="147" font-family="'DroidSerif'" font-size="14">dapibus</tspan><tspan x="186.899" y="147" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="190.37" y="147" font-family="'DroidSerif'" font-size="14">sapien</tspan><tspan x="234.161" y="147" font-family="'DroidSerif'" font-size="14"> </tspan><tspan x="237.633" y="147" font-family="'DroidSerif'" font-size="14">auctor. </tspan></text>
+ <g id="Action_Bar_copy_2">
+ <rect x="1501.785" y="718.521" fill="#FFC91F" width="319.997" height="48.833"/>
+ <text transform="matrix(1 0 0 1 1585.8579 750.3545)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <polygon points="1517.525,742.938 1523.372,733.674 1518.395,733.674 1512.549,742.938 1518.395,752.201 1523.372,752.201 "/>
+ <g id="news_icon_11_">
+ <g>
+ <g>
+ <path d="M1565.225,732.566h-0.865v19.039c0,0.249,0.07,0.492,0.199,0.701c0.127,0.205,0.308,0.373,0.521,0.484
+ c0.092,0.048,0.191,0.086,0.291,0.111c0.548,0.136,0.881,0.69,0.746,1.237c-0.115,0.465-0.532,0.775-0.99,0.775
+ c-0.082,0-0.164-0.01-0.247-0.03c-0.258-0.064-0.509-0.159-0.745-0.282c-0.538-0.281-0.992-0.702-1.312-1.219
+ c-0.33-0.533-0.504-1.147-0.504-1.776v-20.609c0-1.735-1.406-3.142-3.142-3.142h-23.012c-1.735,0-3.142,1.406-3.142,3.142
+ v22.933c0,1.735,1.406,3.142,3.142,3.142h29.06c1.734,0,3.141-1.407,3.141-3.142v-18.221
+ C1568.366,733.973,1566.959,732.566,1565.225,732.566z M1542.606,752.201h-7.305v-2.051h7.305V752.201z M1542.606,749.306
+ h-7.305v-2.051h7.305V749.306z M1551.323,752.201h-7.304v-2.051h7.304V752.201z M1551.323,749.306h-7.304v-2.051h7.304V749.306
+ z M1551.323,746.075h-16.021v-8.954h16.021V746.075z M1560.042,752.201h-7.305v-2.051h7.305V752.201z M1560.042,749.306h-7.305
+ v-2.051h7.305V749.306z M1560.042,746.411h-7.305v-2.051h7.305V746.411z M1560.042,743.515h-7.305v-2.051h7.305V743.515z
+ M1560.042,740.62h-7.305v-2.051h7.305V740.62z M1560.042,735.551h-24.74v-2.356h24.74V735.551z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_11_" x="1535.301" y="737.122" width="16.021" height="8.954"/>
+ </defs>
+ <clipPath id="SVGID_12_">
+ <use xlink:href="#SVGID_11_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_12_)">
+ <ellipse cx="1543.088" cy="740.513" rx="3.076" ry="3.048"/>
+ <path d="M1548.194,751.523c-0.209,1.63-1.666,3.404-2.955,3.653c-1.434,0.229-2.867,0.229-4.303,0
+ c-1.287-0.25-2.746-2.023-2.955-3.653c-0.164-1.54-0.164-3.079,0-4.619c0.209-1.63,1.668-3.404,2.955-3.653
+ c1.436-0.23,2.869-0.23,4.303,0c1.289,0.249,2.746,2.022,2.955,3.653C1548.358,748.444,1548.358,749.983,1548.194,751.523z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle cx="1777.805" cy="742.604" r="5"/>
+ <circle cx="1795.888" cy="732.604" r="5"/>
+ <circle cx="1795.888" cy="752.938" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="1795.888,732.604 1777.805,742.604
+ 1795.888,752.938 "/>
+ </g>
+ <g>
+ <polygon points="1738.577,727.938 1743.451,737.813 1754.349,739.396 1746.463,747.083 1748.325,757.938 1738.577,752.813
+ 1728.83,757.938 1730.692,747.083 1722.805,739.396 1733.704,737.813 "/>
+ </g>
+ </g>
+ <rect x="1518.066" y="838.481" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 1518.0659 848.7349)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">January 1, 2012</text>
+</g>
+<g id="News_List">
+ <g id="Small_Handset_7_">
+ <path fill="#231F20" d="M1294.256,708.564c-0.329-24.343-2.396-48.913-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.769,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.215-1.602,51.165
+ c0,0-0.382,483.339-0.235,493.405c0.038,2.578,0.051,4.727,0.063,6.696l0.005,0.692c0.054,9.696,0.086,15.549,2.573,48.66
+ c2.718,36.187,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.368,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.193,7.275,0.39,10.803,0.588c16.6,0.921,32.279,1.792,53.264,1.792
+ c14.896,0,31.371-0.44,50.365-1.346c66.147-3.153,98.891-6.913,118.057-20.855c18.6-13.532,22.909-33.763,25.762-47.162
+ l0.12-0.569c3.372-15.818,3.445-51.611,3.445-62.362C1294.256,1177.355,1294.256,753.188,1294.256,708.564z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1296.562,1277.242l-0.281,1.875c-0.072,0.478-0.702,4.665-1.37,8.28
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.314,13.785-25.246,24.332c-13.561,7.974-44.078,14.006-53.068,15.188
+ c-10.188,1.34-47.461,4.192-65.38,5.005c-16.789,0.761-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.007
+ c-18.312,0-31.146-0.512-41.738-0.991c-17.919-0.812-55.19-3.665-65.378-5.005c-8.989-1.181-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.241-25.249-24.331c-3.354-6.324-5.581-15.876-6.858-22.776c-0.679-3.678-1.283-7.586-1.335-7.917
+ l-0.29-1.878"/>
+ <g>
+ <path fill="#FFFFFF" d="M1087.548,625.061c10.201,0,27.874,0.14,36.709,0.241c7.614,0.088,18.293,0.724,26.884,1.236l0.5,0.028
+ c2.512,0.15,4.869,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.722,0.531,1.806,1.179,1.945,2.255l0.032,0.244
+ c0.188,1.366-0.313,2.429-1.491,3.162c-0.987,0.615-1.323,0.715-2.397,0.715c-0.333,0-0.727-0.009-1.237-0.024l-1.704-0.035
+ c-3.76-0.057-11.223-0.741-18.543-1.436c-6.699-0.639-23.176-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.928,0-12.207,0.246-18.626,0.462l-0.784,0.026l-0.321,0.011c-2.095,0.07-4.107,0.138-5.937,0.191
+ c-5.415,0.16-11.042,0.538-16.006,0.872l-0.072,0.005l-0.324,0.023l-0.772,0.051c-1.765,0.118-3.423,0.229-4.937,0.315
+ c-1.136,0.066-2.32,0.142-3.51,0.219l-0.379,0.025c-3.292,0.214-6.697,0.435-9.013,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.919-0.194-1.602-0.633-2.027-1.307c-0.585-0.927-0.539-2.034-0.419-2.538c0.204-0.858,1.297-2.674,2.896-2.984
+ c1.384-0.269,5.948-0.476,11.28-0.719l4.125-0.19c7.029-0.332,32.182-1.323,41.398-1.381
+ C1084.382,625.064,1085.878,625.061,1087.548,625.061 M1087.548,622.061c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.798,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.365-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.944-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.018-1.241
+ C1115.52,622.201,1097.868,622.061,1087.548,622.061L1087.548,622.061z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1101.258,1343.082c-11.699,0-21.22-9.546-21.22-21.277
+ c0-11.733,9.521-21.277,21.22-21.277c11.702,0,21.221,9.544,21.221,21.277C1122.479,1333.536,1112.959,1343.082,1101.258,1343.082
+ "/>
+ <g>
+ <rect x="939.759" y="693.061" fill="#FFFFFF" width="323" height="536.333"/>
+ <path fill="#FFFFFF" d="M1261.259,694.561v533.333h-320V694.561H1261.259 M1264.259,691.561h-3h-320h-3v3v533.333v3h3h320h3v-3
+ V694.561V691.561L1264.259,691.561z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1100.233,642.003c20.732,0,40.963,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.385c0.173,23.873,0.312,42.728,0.355,46.401
+ c0.117,10.022,0.228,207.919,0.228,216.126c0,4.869,0.025,31.566,0.052,59.639l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.779c0.042,11.215,0.119,32.094-1.44,38.838
+ c-1.78,7.698-8.244,17.708-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.626-51.374,5.173-72.876,6.077
+ c-10.138,0.424-24.322,0.659-39.936,0.659c-14.254,0-27.824-0.205-36.3-0.544c-16.596-0.67-49.325-3.385-61.491-4.595
+ c-11.772-1.168-32.573-4.617-37.803-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.724-6.917
+ c-7.469-4.026-9.602-5.683-15.219-14.077c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.274,0.038-2.434,0.038-3.438
+ c0-8.102-0.566-120.259-0.689-136.374c-0.113-14.793-0.229-94.735-0.229-104.809c0-2.889-0.045-15.856-0.105-32.624
+ c-0.126-36.406-0.318-102.758-0.238-110.091c0.037-3.612,0.074-16.622,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.424-26.02,5.927-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112
+ C1090.173,642.046,1095.241,642.003,1100.233,642.003 M1100.233,639.003c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.575,0.631-79.049,3.433-105.659,7.14c-29.075,4.048-49.77,9.947-56.266,25.578c-5.726,13.776-5.925,26.097-6.157,40.363
+ c-0.026,1.593-0.053,3.21-0.087,4.855c-0.225,10.652-0.352,54.645-0.445,86.768l-0.001,0.445l-0.004,1.244l-0.002,0.76
+ c-0.047,16.132-0.084,28.875-0.121,32.421c-0.083,7.611,0.125,77.486,0.238,110.132c0.058,16.105,0.105,29.675,0.105,32.613
+ c0,10.084,0.116,90.068,0.229,104.832c0.123,16.079,0.689,128.219,0.689,136.351c0,0.979-0.018,2.108-0.037,3.347l-0.003,0.242
+ c-0.139,9.21-0.372,24.627,4.85,32.428c5.957,8.901,8.404,10.799,16.289,15.049c6.922,3.727,16.653,5.9,22.468,7.198l2.034,0.458
+ c5.271,1.21,26.278,4.697,38.166,5.876c12.167,1.209,44.961,3.932,61.666,4.607c8.541,0.342,22.156,0.547,36.421,0.547
+ c15.646,0,29.873-0.235,40.062-0.661c21.574-0.907,61.38-4.469,73.163-6.103c21.919-3.052,38.875-6.766,49.035-10.74
+ c13.888-5.436,20.922-16.394,22.875-24.837c1.51-6.537,1.575-23.83,1.517-39.525l-0.01-3.776c0-2.751-0.011-15.48-0.026-32.014
+ l-0.013-14.213l-0.023-24.959c-0.027-28.071-0.052-54.768-0.052-59.636c0-8.711-0.111-206.141-0.228-216.162
+ c-0.043-3.633-0.181-22.327-0.355-46.388l-0.017-2.384l-0.022-2.963c-0.275-37.599-0.618-84.392-0.755-92.91
+ c-0.252-15.714-0.886-30.699-5.795-41.329c-5.154-11.158-15.382-15.758-24.564-19.194c-9.274-3.474-23.76-6.253-46.97-9.013
+ c-22.377-2.659-28.904-3.237-45.017-4.375C1141.335,639.723,1121.034,639.003,1100.233,639.003L1100.233,639.003z"/>
+ </g>
+ <rect x="941.26" y="694.336" fill="#231F20" width="319.998" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M974.358,1246.321c0,0-6.818,6.286-7.376,6.774
+ c-0.555,0.492-0.138,1.467,0.559,1.882c0.695,0.415,6.891,6.876,6.891,6.876l3.062-0.148l-6.334-6.39c0,0,6.82-0.09,9.604,0.11
+ c2.783,0.202,5.082,1.66,6.682,2.839c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.009c0,0-1.812-3.269-5.638-6.114
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.495L974.358,1246.321z"/>
+ <rect x="1047.972" y="1243.609" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="1054.925" y="1250.162" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="1054.925" y="1256.229" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.86"/>
+ <rect x="1054.925" y="1262.644" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1143.126,1242.168 1128.663,1256.25 1130.332,1257.854
+ 1143.337,1245.097 1156.059,1257.713 1157.797,1256.321 1152.165,1250.884 1152.165,1244.052 1149.941,1244.052
+ 1149.941,1248.583 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1136.588,1257.646 1134.295,1259.25 1134.295,1266.36
+ 1152.027,1266.36 1152.027,1259.25 1149.87,1257.435 1149.87,1264.339 1136.588,1264.339 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1227.13,1256.37l2.348,2.962v1.463c0,0,3.686,4.25,5.074,5.368
+ c1.393,1.114,1.738,0.626,2.227,0.138c0.488-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.067
+ l-1.637-2.091"/>
+ <g>
+ <path fill="#FFFFFF" d="M1222.202,1243.732c3.648,0,6.616,2.968,6.616,6.616s-2.968,6.616-6.616,6.616s-6.616-2.968-6.616-6.616
+ S1218.554,1243.732,1222.202,1243.732 M1222.202,1240.732c-5.311,0-9.616,4.305-9.616,9.616s4.305,9.616,9.616,9.616
+ s9.616-4.305,9.616-9.616S1227.512,1240.732,1222.202,1240.732L1222.202,1240.732z"/>
+ </g>
+ </g>
+ <g id="Action_Bar">
+ <rect x="941.26" y="718.521" fill="#FFC91F" width="319.998" height="48.833"/>
+ <text transform="matrix(1 0 0 1 1009.333 750.3545)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <polygon points="1188.671,750.854 1188.671,762.354 1177.171,762.354 "/>
+ <g id="news_icon_10_">
+ <g>
+ <g>
+ <path d="M988.7,732.566h-0.864v19.039c0,0.249,0.069,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.521,0.484
+ c0.093,0.048,0.191,0.086,0.292,0.111c0.547,0.136,0.881,0.69,0.745,1.237c-0.115,0.465-0.532,0.775-0.99,0.775
+ c-0.081,0-0.164-0.01-0.247-0.03c-0.258-0.064-0.508-0.159-0.745-0.282c-0.539-0.281-0.992-0.702-1.312-1.219
+ c-0.33-0.533-0.504-1.147-0.504-1.776v-20.609c0-1.735-1.406-3.142-3.142-3.142h-23.012c-1.735,0-3.142,1.406-3.142,3.142
+ v22.933c0,1.735,1.406,3.142,3.142,3.142H988.7c1.735,0,3.142-1.407,3.142-3.142v-18.221
+ C991.842,733.973,990.436,732.566,988.7,732.566z M966.081,752.201h-7.304v-2.051h7.304V752.201z M966.081,749.306h-7.304
+ v-2.051h7.304V749.306z M974.799,752.201h-7.304v-2.051h7.304V752.201z M974.799,749.306h-7.304v-2.051h7.304V749.306z
+ M974.799,746.075h-16.022v-8.954h16.022V746.075z M983.517,752.201h-7.304v-2.051h7.304V752.201z M983.517,749.306h-7.304
+ v-2.051h7.304V749.306z M983.517,746.411h-7.304v-2.051h7.304V746.411z M983.517,743.515h-7.304v-2.051h7.304V743.515z
+ M983.517,740.62h-7.304v-2.051h7.304V740.62z M983.517,735.551h-24.74v-2.356h24.74V735.551z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_13_" x="958.777" y="737.122" width="16.022" height="8.954"/>
+ </defs>
+ <clipPath id="SVGID_14_">
+ <use xlink:href="#SVGID_13_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_14_)">
+ <ellipse cx="966.564" cy="740.513" rx="3.076" ry="3.048"/>
+ <path d="M971.669,751.523c-0.208,1.63-1.667,3.404-2.955,3.653c-1.435,0.229-2.868,0.229-4.303,0
+ c-1.288-0.25-2.747-2.023-2.955-3.653c-0.164-1.54-0.164-3.079,0-4.619c0.208-1.63,1.667-3.404,2.955-3.653
+ c1.435-0.23,2.868-0.23,4.303,0c1.288,0.249,2.746,2.022,2.955,3.653C971.834,748.444,971.834,749.983,971.669,751.523z"/>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_6_">
+ <polygon points="1240.875,730.167 1240.875,740.167 1230.875,740.167 "/>
+ <polygon points="1214.625,755.309 1214.625,745.309 1224.625,745.309 "/>
+ <g>
+ <g>
+ <path d="M1227.75,733.613c4.146,0,7.641,2.768,8.751,6.554h4.118c-1.195-6.017-6.501-10.554-12.87-10.554
+ s-11.674,4.537-12.87,10.554h4.118C1220.11,736.38,1223.604,733.613,1227.75,733.613z M1227.75,751.863
+ c-4.146,0-7.641-2.768-8.751-6.554h-4.118c1.195,6.017,6.501,10.554,12.87,10.554s11.674-4.537,12.87-10.554h-4.118
+ C1235.391,749.095,1231.896,751.863,1227.75,751.863z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="Swipe_Tabs">
+ <rect x="941.26" y="767.354" fill="#BCBEC0" width="319.998" height="44.124"/>
+ <text transform="matrix(1 0 0 1 1063.5156 792.3545)" font-family="'Roboto-Bold'" font-size="12">WORLD NEWS</text>
+ <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="1207.8975" y1="788.2529" x2="1250.7363" y2="788.2529">
+ <stop offset="0" style="stop-color:#000000"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
+ </linearGradient>
+ <path fill="url(#SVGID_15_)" d="M1212.457,790.175c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527
+ c-0.945-0.277-1.654-0.609-2.127-0.996s-0.709-0.918-0.709-1.594s0.264-1.226,0.791-1.649s1.223-0.636,2.086-0.636
+ c0.918,0,1.646,0.228,2.186,0.683s0.799,1.056,0.779,1.802l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943
+ s-0.578-0.322-1.031-0.322c-0.414,0-0.721,0.095-0.92,0.284s-0.299,0.44-0.299,0.753c0,0.285,0.112,0.517,0.337,0.694
+ s0.632,0.362,1.222,0.554c0.922,0.258,1.616,0.586,2.083,0.984s0.7,0.934,0.7,1.605c0,0.707-0.274,1.269-0.823,1.685
+ s-1.276,0.624-2.183,0.624c-0.887,0-1.646-0.22-2.276-0.659s-0.937-1.093-0.917-1.96l0.012-0.035h1.588
+ c0,0.484,0.143,0.84,0.428,1.066s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S1212.457,790.491,1212.457,790.175z
+ M1217.021,789.495v2.859h-1.641v-8.203h3.199c0.949,0,1.7,0.249,2.253,0.747s0.829,1.14,0.829,1.925
+ c0,0.789-0.276,1.432-0.829,1.928s-1.304,0.744-2.253,0.744H1217.021z M1217.021,788.224h1.559c0.473,0,0.831-0.133,1.075-0.398
+ s0.366-0.596,0.366-0.99c0-0.398-0.122-0.733-0.366-1.005s-0.603-0.407-1.075-0.407h-1.559V788.224z M1229.596,788.991
+ c0,1.008-0.324,1.84-0.973,2.496s-1.49,0.984-2.525,0.984c-1.031,0-1.867-0.328-2.508-0.984s-0.961-1.488-0.961-2.496v-1.477
+ c0-1,0.32-1.83,0.961-2.49s1.475-0.99,2.502-0.99c1.035,0,1.878,0.33,2.528,0.99s0.976,1.49,0.976,2.49V788.991z
+ M1227.955,787.503c0-0.637-0.166-1.16-0.498-1.57s-0.787-0.615-1.365-0.615c-0.574,0-1.021,0.204-1.342,0.612
+ s-0.48,0.933-0.48,1.573v1.488c0,0.648,0.161,1.178,0.483,1.588s0.771,0.615,1.345,0.615c0.582,0,1.037-0.205,1.365-0.615
+ s0.492-0.939,0.492-1.588V787.503z M1232.549,789.073v3.281h-1.641v-8.203h2.93c0.949,0,1.691,0.213,2.227,0.639
+ s0.803,1.02,0.803,1.781c0,0.426-0.112,0.791-0.337,1.096s-0.554,0.553-0.987,0.744c0.484,0.145,0.834,0.383,1.049,0.715
+ s0.322,0.742,0.322,1.23v0.609c0,0.227,0.032,0.465,0.097,0.715s0.171,0.436,0.319,0.557v0.117h-1.688
+ c-0.152-0.121-0.251-0.32-0.296-0.598s-0.067-0.545-0.067-0.803v-0.586c0-0.406-0.115-0.724-0.346-0.952s-0.555-0.343-0.973-0.343
+ H1232.549z M1232.549,787.802h1.254c0.484,0,0.843-0.097,1.075-0.29s0.349-0.481,0.349-0.864c0-0.375-0.117-0.673-0.352-0.894
+ s-0.58-0.331-1.037-0.331h-1.289V787.802z M1243.975,785.423h-2.414v6.932h-1.641v-6.932h-2.385v-1.271h6.439V785.423z
+ M1249.096,790.175c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527c-0.945-0.277-1.654-0.609-2.127-0.996
+ s-0.709-0.918-0.709-1.594s0.264-1.226,0.791-1.649s1.223-0.636,2.086-0.636c0.918,0,1.646,0.228,2.186,0.683
+ s0.799,1.056,0.779,1.802l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943s-0.578-0.322-1.031-0.322
+ c-0.414,0-0.721,0.095-0.92,0.284s-0.299,0.44-0.299,0.753c0,0.285,0.112,0.517,0.337,0.694s0.632,0.362,1.222,0.554
+ c0.922,0.258,1.616,0.586,2.083,0.984s0.7,0.934,0.7,1.605c0,0.707-0.274,1.269-0.823,1.685s-1.276,0.624-2.183,0.624
+ c-0.887,0-1.646-0.22-2.276-0.659s-0.937-1.093-0.917-1.96l0.012-0.035h1.588c0,0.484,0.143,0.84,0.428,1.066
+ s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S1249.096,790.491,1249.096,790.175z"/>
+ <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="1008.1372" y1="788.2529" x2="951.4243" y2="788.2529">
+ <stop offset="0" style="stop-color:#000000"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
+ </linearGradient>
+ <path fill="url(#SVGID_16_)" d="M957.864,785.423h-2.414v6.932h-1.641v-6.932h-2.385v-1.271h6.439V785.423z M965.2,788.991
+ c0,1.008-0.324,1.84-0.973,2.496s-1.49,0.984-2.525,0.984c-1.031,0-1.867-0.328-2.508-0.984s-0.961-1.488-0.961-2.496v-1.477
+ c0-1,0.32-1.83,0.961-2.49s1.475-0.99,2.502-0.99c1.035,0,1.878,0.33,2.528,0.99s0.976,1.49,0.976,2.49V788.991z M963.559,787.503
+ c0-0.637-0.166-1.16-0.498-1.57s-0.787-0.615-1.365-0.615c-0.574,0-1.021,0.204-1.342,0.612s-0.48,0.933-0.48,1.573v1.488
+ c0,0.648,0.161,1.178,0.483,1.588s0.771,0.615,1.345,0.615c0.582,0,1.037-0.205,1.365-0.615s0.492-0.939,0.492-1.588V787.503z
+ M968.153,789.495v2.859h-1.641v-8.203h3.199c0.949,0,1.7,0.249,2.253,0.747s0.829,1.14,0.829,1.925
+ c0,0.789-0.276,1.432-0.829,1.928s-1.304,0.744-2.253,0.744H968.153z M968.153,788.224h1.559c0.473,0,0.831-0.133,1.075-0.398
+ s0.366-0.596,0.366-0.99c0-0.398-0.122-0.733-0.366-1.005s-0.603-0.407-1.075-0.407h-1.559V788.224z M983.639,792.354h-1.641
+ l-3.416-5.59l-0.035,0.012v5.578h-1.635v-8.203h1.635l3.416,5.578l0.035-0.012v-5.566h1.641V792.354z M989.938,788.751h-3.123
+ v2.338h3.709v1.266h-5.35v-8.203h5.332v1.271h-3.691v2.057h3.123V788.751z M998.364,789.835h0.035l1.125-5.684h1.693l-1.957,8.203
+ h-1.559l-1.518-5.367h-0.035l-1.506,5.367h-1.564l-1.957-8.203h1.693l1.131,5.678h0.035l1.518-5.678h1.342L998.364,789.835z
+ M1006.497,790.175c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527c-0.945-0.277-1.654-0.609-2.127-0.996
+ s-0.709-0.918-0.709-1.594s0.264-1.226,0.791-1.649s1.223-0.636,2.086-0.636c0.918,0,1.646,0.228,2.186,0.683
+ s0.799,1.056,0.779,1.802l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943s-0.578-0.322-1.031-0.322
+ c-0.414,0-0.721,0.095-0.92,0.284s-0.299,0.44-0.299,0.753c0,0.285,0.112,0.517,0.337,0.694s0.632,0.362,1.222,0.554
+ c0.922,0.258,1.616,0.586,2.083,0.984s0.7,0.934,0.7,1.605c0,0.707-0.274,1.269-0.823,1.685s-1.276,0.624-2.183,0.624
+ c-0.887,0-1.646-0.22-2.276-0.659s-0.937-1.093-0.917-1.96l0.012-0.035h1.588c0,0.484,0.143,0.84,0.428,1.066
+ s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S1006.497,790.491,1006.497,790.175z"/>
+ <rect x="941.26" y="808.583" width="319.998" height="2.895"/>
+ <rect x="1038.185" y="803.354" width="126.148" height="6.676"/>
+ </g>
+ <g id="News_Items">
+ <g>
+ <rect x="941.26" y="811.478" fill="#FFFFFF" width="319.999" height="96.925"/>
+ <rect x="1163.783" y="811.478" fill="#E6E7E8" width="96.925" height="96.925"/>
+ <rect x="957.26" y="831.07" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 844.2539)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="878.354" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 888.6084)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="908.403" x2="1260.708" y2="908.403"/>
+ </g>
+ <g>
+ <rect x="941.26" y="908.403" fill="#FFFFFF" width="319.999" height="96.925"/>
+ <rect x="1163.783" y="908.403" fill="#E6E7E8" width="96.925" height="96.925"/>
+ <rect x="957.26" y="927.995" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 941.1787)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="975.279" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 985.5332)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="1005.328" x2="1260.708" y2="1005.328"/>
+ </g>
+ <g>
+ <rect x="941.26" y="1005.328" fill="#FFFFFF" width="319.999" height="96.925"/>
+ <rect x="1163.783" y="1005.328" fill="#E6E7E8" width="96.925" height="96.925"/>
+ <rect x="957.26" y="1024.92" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 1038.1035)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="1072.204" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 1082.458)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="1102.252" x2="1260.708" y2="1102.252"/>
+ </g>
+ <g>
+ <rect x="941.26" y="1102.252" fill="#FFFFFF" width="319.999" height="96.925"/>
+ <rect x="1163.783" y="1102.252" fill="#E6E7E8" width="96.925" height="96.925"/>
+ <rect x="957.26" y="1121.845" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 1135.0283)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="1169.129" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 1179.3828)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="1199.177" x2="1260.708" y2="1199.177"/>
+ </g>
+ <polygon fill="#FFC91F" points="941.259,927.903 941.259,908.403 960.759,908.403 "/>
+ <polygon fill="#FFC91F" points="941.259,1024.828 941.259,1005.328 960.759,1005.328 "/>
+ </g>
+</g>
+<g id="Saved_Photos">
+ <g id="Small_Handset_3_">
+ <path fill="#231F20" d="M1875.429,2533.923c-0.328-24.343-2.395-48.913-15.186-63.735c-12.93-14.986-28.902-18.381-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.77,0-26.201,0.396-41.939,0.897
+ l-7.657,0.24c-30.293,0.945-91.291,10.773-100.688,13.701c-15.497,4.826-23.597,10.746-30.954,22.619
+ c-6.648,10.729-7.988,29.174-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.816c-1.323,14.793-1.567,45.215-1.602,51.166
+ c0,0-0.382,483.338-0.235,493.404c0.038,2.578,0.051,4.727,0.063,6.697l0.005,0.691c0.054,9.697,0.086,15.549,2.573,48.66
+ c2.718,36.188,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.38,19.035c1.896,0.367,3.674,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.141,6.646c3.693,0.191,7.274,0.389,10.803,0.588c16.6,0.92,32.279,1.791,53.263,1.791
+ c14.896,0,31.371-0.439,50.365-1.346c66.148-3.152,98.892-6.912,118.058-20.855c18.6-13.531,22.909-33.764,25.763-47.162
+ l0.119-0.568c3.372-15.818,3.445-51.611,3.445-62.361C1875.429,3002.713,1875.429,2578.547,1875.429,2533.923z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1877.736,3102.6l-0.281,1.875c-0.072,0.479-0.702,4.666-1.37,8.279
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.313,13.785-25.246,24.332c-13.561,7.975-44.078,14.006-53.067,15.188
+ c-10.188,1.34-47.461,4.193-65.38,5.006c-16.789,0.76-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.006
+ c-18.312,0-31.146-0.512-41.738-0.99c-17.919-0.812-55.19-3.666-65.378-5.006c-8.989-1.182-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.24-25.249-24.33c-3.354-6.324-5.581-15.877-6.858-22.777c-0.679-3.678-1.283-7.586-1.335-7.916
+ l-0.29-1.877"/>
+ <g>
+ <path fill="#FFFFFF" d="M1668.721,2450.419c10.239,0,27.898,0.14,36.709,0.241c7.591,0.087,18.283,0.724,26.881,1.235
+ l0.504,0.028c2.511,0.15,4.869,0.29,6.959,0.404c8.471,0.462,16.264,0.935,18.556,1.641c1.723,0.532,1.806,1.18,1.946,2.262
+ l0.031,0.238c0.188,1.365-0.314,2.429-1.491,3.161c-0.988,0.614-1.324,0.715-2.398,0.715c-0.333,0-0.727-0.009-1.236-0.023
+ l-1.703-0.036c-3.749-0.057-11.217-0.74-18.543-1.436c-6.697-0.639-23.176-1.326-32.006-1.558
+ c-8.845-0.229-26.277-0.229-32.84-0.229c-4.957,0-12.22,0.246-18.624,0.463l-0.786,0.025l-0.585,0.02
+ c-2,0.066-3.92,0.131-5.673,0.182c-5.399,0.16-11.013,0.537-15.966,0.87l-0.112,0.007l-0.323,0.023l-0.781,0.052
+ c-1.762,0.118-3.417,0.229-4.928,0.314c-1.136,0.065-2.321,0.142-3.51,0.22l-0.354,0.023c-3.298,0.214-6.708,0.436-9.038,0.436
+ c-1.104,0-1.898-0.05-2.366-0.148c-0.92-0.193-1.602-0.634-2.027-1.307c-0.586-0.928-0.539-2.034-0.42-2.538
+ c0.205-0.858,1.297-2.674,2.897-2.984c1.386-0.27,5.959-0.478,11.28-0.719l4.124-0.19c7.026-0.332,32.175-1.322,41.399-1.381
+ C1665.556,2450.423,1667.051,2450.419,1668.721,2450.419 M1668.721,2447.419c-1.676,0-3.177,0.004-4.441,0.011
+ c-9.305,0.059-34.498,1.052-41.524,1.384l-4.121,0.19c-5.868,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.593-4.836,3.524-5.243,5.234c-0.297,1.254-0.243,3.183,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.64
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.42,0,5.883-0.225,9.232-0.442l0.356-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.736-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.025c6.406-0.217,13.666-0.461,18.526-0.461c6.553,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.799,1.545
+ c7.388,0.701,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.024,1.299,0.024c1.635,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.735-8.364-1.175-19.277-1.77
+ c-2.084-0.114-4.438-0.254-6.943-0.403l-0.511-0.029c-8.629-0.514-19.367-1.152-27.019-1.24
+ C1696.693,2447.56,1679.042,2447.419,1668.721,2447.419L1668.721,2447.419z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1682.431,3168.439c-11.699,0-21.22-9.545-21.22-21.277
+ s9.521-21.277,21.22-21.277c11.701,0,21.221,9.545,21.221,21.277S1694.132,3168.439,1682.431,3168.439"/>
+ <g>
+ <rect x="1520.933" y="2518.42" fill="#FFFFFF" width="323" height="536.332"/>
+ <path fill="#FFFFFF" d="M1842.432,2519.92v533.332h-320V2519.92H1842.432 M1845.432,2516.92h-3h-320h-3v3v533.332v3h3h320h3v-3
+ V2519.92V2516.92L1845.432,2516.92z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1681.406,2467.361c20.732,0,40.964,0.718,61.852,2.193c16.037,1.131,22.539,1.707,44.874,4.36
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.74,5.52,40.12
+ c0.141,8.726,0.492,57.03,0.776,95.845l0.017,2.385c0.173,23.873,0.312,42.729,0.355,46.402
+ c0.117,10.021,0.228,207.918,0.228,216.125c0,4.869,0.025,31.566,0.053,59.641l0.023,24.957
+ c0.021,23.082,0.039,42.723,0.039,46.234l0.01,3.777c0.042,11.215,0.119,32.094-1.439,38.84
+ c-1.78,7.697-8.244,17.707-21.045,22.719c-9.945,3.891-26.666,7.543-48.354,10.562c-11.729,1.625-51.374,5.172-72.877,6.076
+ c-10.138,0.424-24.321,0.658-39.936,0.658c-14.254,0-27.824-0.203-36.3-0.543c-16.596-0.672-49.325-3.387-61.49-4.596
+ c-11.772-1.168-32.573-4.617-37.804-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.725-6.916
+ c-7.469-4.025-9.602-5.682-15.219-14.076c-4.7-7.023-4.478-21.855-4.344-30.715l0.003-0.195c0.02-1.275,0.038-2.434,0.038-3.439
+ c0-8.102-0.566-120.26-0.689-136.373c-0.113-14.793-0.229-94.736-0.229-104.809c0-2.891-0.045-15.857-0.105-32.625
+ c-0.126-36.406-0.318-102.758-0.238-110.09c0.037-3.613,0.074-16.623,0.123-33.203l0.004-1.244
+ c0.094-32.277,0.221-76.484,0.446-87.158c0.034-1.65,0.062-3.271,0.087-4.869c0.227-13.962,0.424-26.02,5.927-39.26
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112
+ C1671.346,2467.404,1676.414,2467.361,1681.406,2467.361 M1681.406,2464.361c-5.016,0-10.101,0.043-15.113,0.129
+ c-37.573,0.63-79.046,3.434-105.658,7.141c-29.075,4.047-49.77,9.946-56.267,25.577c-5.725,13.775-5.925,26.097-6.156,40.362
+ c-0.026,1.594-0.053,3.21-0.087,4.855c-0.225,10.651-0.353,54.645-0.446,86.768l-0.001,0.444l-0.004,1.243l-0.002,0.756
+ c-0.047,16.135-0.084,28.879-0.121,32.427c-0.083,7.609,0.125,77.484,0.238,110.131c0.058,16.105,0.105,29.676,0.105,32.614
+ c0,10.084,0.116,90.068,0.229,104.832c0.123,16.078,0.689,128.216,0.689,136.35c0,0.979-0.018,2.104-0.037,3.341l0,0.053
+ l-0.003,0.196c-0.139,9.21-0.372,24.625,4.85,32.428c5.957,8.902,8.405,10.8,16.289,15.049
+ c6.921,3.727,16.652,5.898,22.465,7.197l2.036,0.458c5.269,1.21,26.274,4.697,38.167,5.877
+ c12.166,1.209,44.96,3.932,61.665,4.608c8.518,0.341,22.132,0.545,36.421,0.545c15.642,0,29.868-0.234,40.061-0.66
+ c21.562-0.907,61.372-4.469,73.164-6.103c21.919-3.052,38.874-6.766,49.034-10.74c13.889-5.438,20.923-16.396,22.875-24.837
+ c1.512-6.541,1.575-23.833,1.517-39.527l-0.01-3.773c0-2.754-0.012-15.484-0.026-32.02l-0.013-14.21l-0.023-24.957
+ c-0.027-28.073-0.053-54.769-0.053-59.638c0-8.713-0.11-206.158-0.228-216.16c-0.046-3.797-0.194-24.109-0.355-46.389
+ l-0.017-2.384l-0.021-2.974c-0.275-37.595-0.618-84.382-0.755-92.898c-0.253-15.715-0.886-30.7-5.796-41.33
+ c-5.154-11.158-14.961-15.601-24.563-19.193c-9.271-3.474-23.758-6.253-46.97-9.014c-22.405-2.661-28.929-3.239-45.018-4.373
+ C1722.505,2465.081,1702.205,2464.361,1681.406,2464.361L1681.406,2464.361z"/>
+ </g>
+ <rect x="1522.434" y="2519.695" fill="#231F20" width="319.998" height="24.184"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1555.532,3071.68c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.56,1.883c0.695,0.414,6.891,6.875,6.891,6.875l3.062-0.146l-6.335-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.683,2.84c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.01c0,0-1.812-3.27-5.638-6.113
+ c-3.83-2.848-6.822-2.629-8.912-2.764c-2.086-0.133-8.349-0.047-8.349-0.047l6.471-6.496L1555.532,3071.68z"/>
+ <rect x="1629.145" y="3068.967" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="1636.098" y="3075.52" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.762"/>
+ <rect x="1636.098" y="3081.588" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.859"/>
+ <rect x="1636.098" y="3088.002" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1724.299,3067.525 1709.836,3081.607 1711.505,3083.211
+ 1724.511,3070.455 1737.232,3083.072 1738.97,3081.68 1733.338,3076.242 1733.338,3069.41 1731.115,3069.41 1731.115,3073.941
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1717.761,3083.004 1715.468,3084.607 1715.468,3091.719
+ 1733.201,3091.719 1733.201,3084.607 1731.043,3082.793 1731.043,3089.697 1717.761,3089.697 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1808.303,3081.729l2.348,2.961v1.465
+ c0,0,3.686,4.25,5.074,5.367c1.393,1.113,1.738,0.627,2.227,0.139c0.487-0.488,0.763-1.951,0.138-2.65
+ c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.068l-1.638-2.092"/>
+ <g>
+ <path fill="#FFFFFF" d="M1803.375,3069.09c3.647,0,6.616,2.969,6.616,6.617s-2.969,6.615-6.616,6.615s-6.615-2.967-6.615-6.615
+ S1799.727,3069.09,1803.375,3069.09 M1803.375,3066.09c-5.311,0-9.615,4.307-9.615,9.617s4.305,9.615,9.615,9.615
+ s9.616-4.305,9.616-9.615S1808.685,3066.09,1803.375,3066.09L1803.375,3066.09z"/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_7">
+ <rect x="1522.434" y="2543.879" fill="#FFC91F" width="319.998" height="48.834"/>
+ <polygon points="1769.844,2576.213 1769.844,2587.713 1758.344,2587.713 "/>
+ <g id="refresh_3_">
+ <polygon points="1822.048,2555.525 1822.048,2565.525 1812.048,2565.525 "/>
+ <polygon points="1795.798,2580.668 1795.798,2570.668 1805.798,2570.668 "/>
+ <g>
+ <g>
+ <path d="M1808.923,2558.971c4.146,0,7.641,2.768,8.751,6.555h4.119c-1.196-6.018-6.502-10.555-12.87-10.555
+ s-11.674,4.537-12.87,10.555h4.119C1801.284,2561.738,1804.778,2558.971,1808.923,2558.971z M1808.923,2577.221
+ c-4.146,0-7.64-2.766-8.751-6.553h-4.119c1.196,6.018,6.502,10.553,12.87,10.553s11.674-4.535,12.87-10.553h-4.119
+ C1816.564,2574.455,1813.069,2577.221,1808.923,2577.221z"/>
+ </g>
+ </g>
+ </g>
+ <text transform="matrix(1 0 0 1 1590.5063 2575.7129)" font-family="'Roboto-Regular'" font-size="18">Saved</text>
+ <g>
+ <polygon points="1554.995,2552.296 1559.869,2562.172 1570.767,2563.755 1562.88,2571.441 1564.742,2582.296 1554.995,2577.172
+ 1545.247,2582.296 1547.109,2571.441 1539.223,2563.755 1550.121,2562.172 "/>
+ </g>
+ </g>
+ <g id="Swipe_Tabs_copy_3">
+ <rect x="1522.432" y="2592.712" fill="#BCBEC0" width="319.998" height="44.124"/>
+ <text transform="matrix(1 0 0 1 1579.0083 2617.7119)" font-family="'Roboto-Bold'" font-size="12">STORIES</text>
+ <text transform="matrix(1 0 0 1 1739.0845 2617.7119)" font-family="'Roboto-Bold'" font-size="12">PHOTOS</text>
+ <rect x="1522.432" y="2633.94" width="319.998" height="2.896"/>
+ <rect x="1682.056" y="2628.712" width="160" height="6.676"/>
+ </g>
+ <g id="Photos_copy">
+ <g>
+ <g>
+ <rect x="1522.432" y="2640.378" fill="#E6E7E8" width="104.031" height="104.031"/>
+ </g>
+ <polygon fill="#FFC91F" points="1522.432,2659.877 1522.432,2640.377 1541.932,2640.377 "/>
+ </g>
+ <g>
+ <g>
+ <rect x="1630.415" y="2640.377" fill="#E6E7E8" width="104.032" height="104.033"/>
+ </g>
+ <polygon fill="#FFC91F" points="1630.415,2659.877 1630.415,2640.377 1649.915,2640.377 "/>
+ </g>
+ </g>
+</g>
+<g id="Saved_News">
+ <g id="Small_Handset_1_">
+ <path fill="#231F20" d="M1294.256,2533.923c-0.329-24.343-2.396-48.912-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.107
+ c-14.518-3.084-41.219-7.305-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.769,0-26.201,0.396-41.939,0.896
+ l-7.657,0.242c-30.292,0.944-91.291,10.772-100.688,13.699c-15.497,4.828-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.791-1.567,45.215-1.602,51.164
+ c0,0-0.382,483.34-0.235,493.406c0.038,2.577,0.051,4.727,0.063,6.695l0.005,0.693c0.054,9.695,0.086,15.549,2.573,48.66
+ c2.718,36.187,9.689,50.864,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.367,3.673,0.723,5.412,1.069
+ c13.234,2.642,23.688,4.728,60.14,6.646c3.694,0.193,7.275,0.391,10.803,0.588c16.6,0.922,32.279,1.793,53.264,1.793
+ c14.896,0,31.371-0.44,50.365-1.346c66.147-3.154,98.891-6.914,118.057-20.855c18.6-13.533,22.909-33.764,25.762-47.162
+ l0.12-0.569c3.372-15.818,3.445-51.611,3.445-62.362C1294.256,3002.714,1294.256,2578.546,1294.256,2533.923z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1296.562,3102.601l-0.281,1.875c-0.072,0.477-0.702,4.664-1.37,8.279
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.314,13.785-25.246,24.332c-13.561,7.973-44.078,14.006-53.068,15.188
+ c-10.188,1.34-47.461,4.191-65.38,5.004c-16.789,0.762-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.008
+ c-18.312,0-31.146-0.512-41.738-0.992c-17.919-0.812-55.19-3.664-65.378-5.004c-8.989-1.182-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.242-25.249-24.332c-3.354-6.324-5.581-15.875-6.858-22.775c-0.679-3.678-1.283-7.586-1.335-7.916
+ l-0.29-1.879"/>
+ <g>
+ <path fill="#FFFFFF" d="M1087.548,2450.419c10.161,0,27.848,0.14,36.709,0.24c7.636,0.089,18.303,0.725,26.887,1.236l0.497,0.028
+ c2.511,0.15,4.869,0.289,6.96,0.404c8.473,0.462,16.268,0.936,18.556,1.641c1.722,0.531,1.806,1.18,1.944,2.256l0.032,0.244
+ c0.188,1.365-0.313,2.429-1.491,3.161c-0.987,0.614-1.323,0.715-2.397,0.715c-0.333,0-0.727-0.01-1.237-0.024l-1.704-0.036
+ c-3.771-0.057-11.549-0.771-18.543-1.436c-6.702-0.639-23.178-1.325-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.896,0-12.159,0.245-18.567,0.46l-0.061,0.003l-0.782,0.026c-2.21,0.074-4.335,0.145-6.257,0.201
+ c-5.429,0.16-11.068,0.54-16.079,0.877l-0.324,0.023l-0.772,0.052c-1.765,0.118-3.423,0.229-4.937,0.314
+ c-1.136,0.065-2.32,0.142-3.51,0.22l-0.354,0.023l-0.088,0.005c-3.269,0.212-6.649,0.431-8.95,0.431
+ c-1.104,0-1.898-0.05-2.368-0.149c-0.919-0.193-1.601-0.633-2.026-1.306c-0.586-0.928-0.539-2.034-0.419-2.538
+ c0.204-0.858,1.296-2.675,2.896-2.984c1.382-0.269,5.935-0.477,11.206-0.717l0.074-0.003l4.125-0.189
+ c7.032-0.333,32.189-1.324,41.397-1.382C1084.381,2450.423,1085.877,2450.419,1087.548,2450.419 M1087.548,2447.419
+ c-1.676,0-3.177,0.004-4.441,0.01c-9.305,0.059-34.499,1.053-41.524,1.385l-4.121,0.189c-5.869,0.268-10.109,0.46-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.214,2.984,0.214c2.419,0,5.883-0.226,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.334,10.576-0.713,15.957-0.871c1.926-0.057,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.798,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.636-4.035-4.735c-2.387-0.736-8.365-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.944-0.404l-0.511-0.028c-8.629-0.515-19.367-1.152-27.018-1.241
+ C1115.52,2447.56,1097.868,2447.419,1087.548,2447.419L1087.548,2447.419z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1101.258,3168.44c-11.699,0-21.22-9.547-21.22-21.277
+ c0-11.734,9.521-21.277,21.22-21.277c11.702,0,21.221,9.543,21.221,21.277C1122.479,3158.894,1112.959,3168.44,1101.258,3168.44"
+ />
+ <g>
+ <rect x="939.759" y="2518.419" fill="#FFFFFF" width="323" height="536.334"/>
+ <path fill="#FFFFFF" d="M1261.259,2519.919v533.334h-320v-533.334H1261.259 M1264.259,2516.919h-3h-320h-3v3v533.334v3h3h320h3
+ v-3v-533.334V2516.919L1264.259,2516.919z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M1100.233,2467.362c20.732,0,40.963,0.717,61.852,2.191c16.037,1.133,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.459,46.272,8.844c9.02,3.375,18.215,7.518,22.892,17.643c4.664,10.098,5.272,24.738,5.52,40.119
+ c0.141,8.725,0.492,57.029,0.776,95.846l0.017,2.385c0.173,23.873,0.312,42.729,0.355,46.4
+ c0.117,10.023,0.228,207.92,0.228,216.127c0,4.869,0.025,31.566,0.052,59.639l0.023,24.959
+ c0.021,23.082,0.039,42.723,0.039,46.232l0.01,3.779c0.042,11.215,0.119,32.094-1.44,38.838
+ c-1.78,7.699-8.244,17.709-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.627-51.374,5.174-72.876,6.078
+ c-10.138,0.424-24.322,0.658-39.936,0.658c-14.254,0-27.824-0.205-36.3-0.545c-16.596-0.67-49.325-3.385-61.491-4.594
+ c-11.772-1.168-32.573-4.617-37.803-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.724-6.916
+ c-7.469-4.027-9.602-5.684-15.219-14.078c-4.7-7.021-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.273,0.038-2.434,0.038-3.438
+ c0-8.102-0.566-120.26-0.689-136.375c-0.113-14.793-0.229-94.734-0.229-104.809c0-2.889-0.045-15.855-0.105-32.623
+ c-0.126-36.406-0.318-102.758-0.238-110.092c0.037-3.611,0.074-16.621,0.123-33.201l0.004-1.244
+ c0.094-32.277,0.221-76.484,0.446-87.16c0.034-1.648,0.062-3.27,0.087-4.867c0.227-13.963,0.424-26.02,5.927-39.262
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.482,105.295-7.111
+ C1090.173,2467.405,1095.241,2467.362,1100.233,2467.362 M1100.233,2464.362c-4.996,0-10.081,0.043-15.113,0.128
+ c-37.579,0.631-79.052,3.433-105.659,7.139c-29.075,4.049-49.77,9.947-56.266,25.578c-5.726,13.777-5.925,26.098-6.157,40.364
+ c-0.026,1.593-0.053,3.21-0.087,4.854c-0.225,10.653-0.352,54.646-0.445,86.769l-0.001,0.445l-0.004,1.244l-0.002,0.755
+ c-0.047,16.135-0.084,28.879-0.121,32.425c-0.083,7.611,0.125,77.486,0.238,110.133c0.058,16.105,0.105,29.676,0.105,32.612
+ c0,10.084,0.116,90.068,0.229,104.831c0.123,16.08,0.689,128.221,0.689,136.353c0,0.98-0.018,2.111-0.037,3.353l-0.003,0.235
+ c-0.139,9.211-0.372,24.628,4.85,32.429c5.956,8.9,8.404,10.799,16.288,15.05c6.921,3.726,16.651,5.898,22.464,7.196l2.038,0.459
+ c5.268,1.21,26.273,4.697,38.166,5.877c12.174,1.21,44.975,3.932,61.666,4.605c8.548,0.344,22.164,0.548,36.421,0.548
+ c15.641,0,29.869-0.234,40.062-0.661c21.581-0.907,61.385-4.47,73.163-6.104c21.919-3.052,38.875-6.766,49.035-10.74
+ c13.888-5.436,20.922-16.394,22.875-24.837c1.51-6.536,1.575-23.829,1.517-39.524l-0.01-3.776c0-2.751-0.011-15.479-0.026-32.013
+ l-0.013-14.215l-0.023-24.959c-0.027-28.07-0.052-54.767-0.052-59.636c0-8.712-0.111-206.14-0.228-216.162
+ c-0.043-3.632-0.181-22.326-0.355-46.387l-0.017-2.384l-0.022-2.95c-0.275-37.604-0.618-84.405-0.755-92.923
+ c-0.252-15.714-0.886-30.699-5.795-41.329c-5.154-11.159-15.382-15.759-24.564-19.194c-9.275-3.474-23.762-6.254-46.97-9.014
+ c-22.354-2.656-28.884-3.234-45.016-4.375C1141.337,2465.082,1121.037,2464.362,1100.233,2464.362L1100.233,2464.362z"/>
+ </g>
+ <rect x="941.26" y="2519.694" fill="#231F20" width="319.998" height="24.186"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M974.358,3071.679c0,0-6.818,6.287-7.376,6.774
+ c-0.555,0.491-0.138,1.468,0.559,1.882c0.695,0.416,6.891,6.877,6.891,6.877l3.062-0.148l-6.334-6.39c0,0,6.82-0.09,9.604,0.11
+ c2.783,0.201,5.082,1.66,6.682,2.839c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.009c0,0-1.812-3.27-5.638-6.114
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.135-8.349-0.049-8.349-0.049l6.471-6.494L974.358,3071.679z"/>
+ <rect x="1047.972" y="3068.968" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.44"/>
+ <rect x="1054.925" y="3075.521" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="1054.925" y="3081.587" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.86"/>
+ <rect x="1054.925" y="3088.003" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1143.126,3067.526 1128.663,3081.608 1130.332,3083.212
+ 1143.337,3070.455 1156.059,3083.071 1157.797,3081.679 1152.165,3076.242 1152.165,3069.41 1149.941,3069.41 1149.941,3073.94
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="1136.588,3083.005 1134.295,3084.608 1134.295,3091.718
+ 1152.027,3091.718 1152.027,3084.608 1149.87,3082.793 1149.87,3089.698 1136.588,3089.698 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M1227.13,3081.729l2.348,2.962v1.463
+ c0,0,3.686,4.251,5.074,5.369c1.393,1.113,1.738,0.625,2.227,0.138c0.488-0.487,0.763-1.951,0.138-2.65
+ c-0.626-0.697-4.938-5.575-4.938-5.575l-1.249,0.066l-1.637-2.091"/>
+ <g>
+ <path fill="#FFFFFF" d="M1222.202,3069.091c3.648,0,6.616,2.968,6.616,6.615c0,3.648-2.968,6.616-6.616,6.616
+ s-6.616-2.968-6.616-6.616C1215.586,3072.059,1218.554,3069.091,1222.202,3069.091 M1222.202,3066.091
+ c-5.311,0-9.616,4.305-9.616,9.615s4.305,9.616,9.616,9.616s9.616-4.306,9.616-9.616S1227.512,3066.091,1222.202,3066.091
+ L1222.202,3066.091z"/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_5">
+ <rect x="941.26" y="2543.88" fill="#FFC91F" width="319.998" height="48.833"/>
+ <text transform="matrix(1 0 0 1 1009.333 2575.7129)" font-family="'Roboto-Regular'" font-size="18">Saved</text>
+ <polygon points="1188.671,2576.213 1188.671,2587.713 1177.171,2587.713 "/>
+ <g id="refresh_5_">
+ <polygon points="1240.875,2555.525 1240.875,2565.525 1230.875,2565.525 "/>
+ <polygon points="1214.625,2580.667 1214.625,2570.667 1224.625,2570.667 "/>
+ <g>
+ <g>
+ <path d="M1227.75,2558.972c4.146,0,7.641,2.768,8.751,6.554h4.118c-1.195-6.017-6.501-10.554-12.87-10.554
+ s-11.674,4.537-12.87,10.554h4.118C1220.11,2561.739,1223.604,2558.972,1227.75,2558.972z M1227.75,2577.222
+ c-4.146,0-7.641-2.768-8.751-6.555h-4.118c1.195,6.018,6.501,10.555,12.87,10.555s11.674-4.537,12.87-10.555h-4.118
+ C1235.391,2574.454,1231.896,2577.222,1227.75,2577.222z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <polygon points="973.822,2552.296 978.695,2562.172 989.594,2563.755 981.708,2571.441 983.569,2582.296 973.822,2577.172
+ 964.074,2582.296 965.936,2571.441 958.05,2563.755 968.948,2562.172 "/>
+ </g>
+ </g>
+ <g id="Swipe_Tabs_copy_2">
+ <rect x="941.261" y="2592.713" fill="#BCBEC0" width="319.997" height="44.124"/>
+ <text transform="matrix(1 0 0 1 997.8364 2617.7129)" font-family="'Roboto-Bold'" font-size="12">STORIES</text>
+ <text transform="matrix(1 0 0 1 1157.9126 2617.7129)" font-family="'Roboto-Bold'" font-size="12">PHOTOS</text>
+ <rect x="941.26" y="2633.941" width="319.998" height="2.896"/>
+ <rect x="941.259" y="2628.713" width="160" height="6.676"/>
+ </g>
+ <g id="News_Items_copy_2">
+ <g>
+ <rect x="941.26" y="2636.837" fill="#FFFFFF" width="319.999" height="96.926"/>
+ <rect x="1163.783" y="2636.837" fill="#E6E7E8" width="96.925" height="96.926"/>
+ <rect x="957.26" y="2656.43" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 2669.6133)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="2703.714" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 2713.9678)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="2733.763" x2="1260.708" y2="2733.763"/>
+ </g>
+ <g>
+ <rect x="941.26" y="2733.763" fill="#FFFFFF" width="319.999" height="96.924"/>
+ <rect x="1163.783" y="2733.763" fill="#E6E7E8" width="96.925" height="96.924"/>
+ <rect x="957.26" y="2753.354" fill="none" width="194.767" height="41.284"/>
+ <text transform="matrix(1 0 0 1 957.2603 2766.5381)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">amet, consectetur…</tspan></text>
+ <rect x="957.26" y="2800.639" fill="none" width="194.767" height="13.231"/>
+ <text transform="matrix(1 0 0 1 957.2603 2810.8926)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="941.26" y1="2830.687" x2="1260.708" y2="2830.687"/>
+ </g>
+ <polygon fill="#FFC91F" points="941.259,2656.337 941.259,2636.837 960.759,2636.837 "/>
+ <polygon fill="#FFC91F" points="941.259,2753.263 941.259,2733.763 960.759,2733.763 "/>
+ </g>
+</g>
+<g id="Meta">
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1199.254" cy="975.279" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="1199.254" y1="975.279" x2="1467.622" y2="975.279"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="1199.254" y1="975.279" x2="1449.517" y2="975.279"/>
+ <g>
+ <path fill="#ED1C24" d="M1467.622,975.279c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C1448.532,966.728,1459.103,972.121,1467.622,975.279z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="622.725" cy="1756.374" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="622.725" y1="1756.374" x2="907.098" y2="1756.374"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="622.725" y1="1756.374" x2="888.992" y2="1756.374"/>
+ <g>
+ <path fill="#ED1C24" d="M907.098,1756.374c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C888.008,1747.822,898.578,1753.216,907.098,1756.374z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="622.725" cy="1806.599" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="622.725,1806.599 791.178,1806.599
+ 791.178,2677.072 888.992,2677.072 "/>
+ <g>
+ <path fill="#ED1C24" d="M907.098,2677.072c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C888.008,2668.521,898.578,2673.914,907.098,2677.072z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1216.725" cy="1728.374" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="1216.725" y1="1728.374" x2="1479.883" y2="1728.374"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="1216.725" y1="1728.374" x2="1461.778" y2="1728.374"/>
+ <g>
+ <path fill="#ED1C24" d="M1479.883,1728.374c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C1460.793,1719.822,1471.364,1725.216,1479.883,1728.374z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1751.851" cy="1834.405" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="1751.851" y1="1834.405" x2="2058.563" y2="1834.405"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="1751.851" y1="1834.405" x2="2040.458" y2="1834.405"/>
+ <g>
+ <path fill="#ED1C24" d="M2058.563,1834.405c-8.52,3.161-19.09,8.555-25.643,14.268l5.161-14.268l-5.161-14.265
+ C2039.473,1825.854,2050.043,1831.247,2058.563,1834.405z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="2182.354" cy="1890.421" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="2182.354" y1="1890.421" x2="1876.028" y2="1890.421"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="2182.354" y1="1890.421" x2="1894.133" y2="1890.421"/>
+ <g>
+ <path fill="#ED1C24" d="M1876.028,1890.421c8.52-3.161,19.09-8.555,25.643-14.268l-5.161,14.268l5.161,14.265
+ C1895.118,1898.973,1884.547,1893.579,1876.028,1890.421z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1240.708" cy="2614.579" r="17.083"/>
+ <g>
+ <g>
+ <path fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" d="M1240.708,2614.579
+ c0,0,65.06-38.366,128.393-38.366c42.912,0,81.788,17.613,102.397,28.972"/>
+ <g>
+ <path fill="#ED1C24" d="M1486.978,2614.579c-8.936-1.652-20.776-2.438-29.331-0.892l11.744-9.606l2.88-14.894
+ C1474.97,2597.451,1481.281,2607.5,1486.978,2614.579z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1143.23" cy="742.938" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="1143.23,742.938 1143.23,551.499
+ 251.499,551.499 251.499,1644.167 330.699,1644.167 "/>
+ <g>
+ <path fill="#ED1C24" d="M348.804,1644.167c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C329.714,1635.615,340.285,1641.009,348.804,1644.167z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1533.035" cy="2614.579" r="17.083"/>
+ <g>
+ <g>
+ <path fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" d="M1533.035,2614.579
+ c0,0-65.06,38.366-128.393,38.366c-41.615,0-76.201-15.212-95.027-25.645"/>
+ <g>
+ <path fill="#ED1C24" d="M1294.256,2617.713c8.913,1.771,20.742,2.714,29.316,1.281l-11.87,9.449l-3.077,14.854
+ C1306.036,2634.998,1299.858,2624.866,1294.256,2617.713z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1689.69" cy="2688.049" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="1689.69,2688.049 1946.294,2688.049
+ 1946.294,2091.254 1895.841,2091.254 "/>
+ <g>
+ <path fill="#ED1C24" d="M1877.736,2091.254c8.52-3.161,19.09-8.555,25.642-14.268l-5.16,14.268l5.16,14.265
+ C1896.826,2099.806,1886.255,2094.412,1877.736,2091.254z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1228.544" cy="2688.049" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="1228.543,2688.049 1388.239,2688.049
+ 1388.239,1097.833 1449.517,1097.833 "/>
+ <g>
+ <path fill="#ED1C24" d="M1467.622,1097.833c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C1448.532,1089.281,1459.103,1094.675,1467.622,1097.833z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <text transform="matrix(1 0 0 1 1052.002 1424.0757)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Story List</text>
+ <text transform="matrix(1 0 0 1 1048.6738 2330.0762)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo List</text>
+ <text transform="matrix(1 0 0 1 1616.5298 2330.0762)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo Detail</text>
+ <text transform="matrix(1 0 0 1 1029.6953 3256.3047)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Saved Stories</text>
+ <text transform="matrix(1 0 0 1 1608.0747 3256.3047)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Saved Photos</text>
+ <text transform="matrix(1 0 0 1 2189.4751 2330.0762)"><tspan x="0" y="0" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo Detail</tspan><tspan x="2.016" y="28.799" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">(Fullscreen)</tspan></text>
+ <text transform="matrix(1 0 0 1 433.6846 2330.0762)"><tspan x="0" y="0" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Top-level Navigation</tspan><tspan x="17.807" y="28.799" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">(Dropdown Tabs)</tspan></text>
+ <text transform="matrix(1 0 0 1 1606.5317 1424.0757)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Story View</text>
+</g>
+<g id="Document_Info">
+ <g id="icon" opacity="0.1">
+ <g>
+ <path d="M333.721,153.65h-4.889v107.739c0,1.408,0.389,2.78,1.123,3.967c0.721,1.162,1.74,2.11,2.949,2.739
+ c0.524,0.273,1.081,0.484,1.653,0.626c3.098,0.769,4.984,3.902,4.216,7c-0.653,2.629-3.011,4.388-5.603,4.388
+ c-0.461,0-0.929-0.056-1.396-0.172c-1.459-0.362-2.876-0.899-4.211-1.595c-3.049-1.589-5.618-3.976-7.429-6.901
+ c-1.868-3.016-2.856-6.492-2.856-10.052V144.761c0-9.819-7.959-17.779-17.778-17.779H169.277c-9.819,0-17.778,7.96-17.778,17.779
+ v129.777c0,9.819,7.959,17.778,17.778,17.778h164.444c9.819,0,17.778-7.959,17.778-17.778V171.427
+ C351.499,161.609,343.54,153.65,333.721,153.65z M285.558,250.405c-1.757,1.445-3.727,2.734-5.908,3.867
+ c-2.183,1.134-4.604,2.041-7.268,2.72s-5.582,1.021-8.754,1.021c-6.688,0-11.814-1.573-15.385-4.718
+ c-3.57-3.145-5.354-7.522-5.354-13.133c0-4.984,0.936-11.898,2.805-20.738l2.804-13.769c0.225-1.133,0.51-2.521,0.851-4.165
+ c0.34-1.643,0.68-3.357,1.019-5.142c0.34-1.786,0.639-3.57,0.892-5.355c0.255-1.784,0.384-3.385,0.384-4.802
+ c0-1.076-0.101-2.21-0.299-3.4s-0.566-2.266-1.104-3.229c-0.539-0.962-1.273-1.756-2.21-2.38
+ c-0.934-0.623-2.167-0.936-3.698-0.936c-1.982,0-3.951,0.667-5.906,1.998c-1.955,1.332-3.84,3.089-5.653,5.27
+ c-1.814,2.182-3.542,4.674-5.184,7.479c-1.644,2.806-3.131,5.682-4.462,8.628c-1.333,2.946-2.48,5.836-3.443,8.669
+ c-0.965,2.833-1.7,5.384-2.209,7.649l-8.84,40.374h-26.092l14.618-69.271c0.169-0.736,0.326-1.5,0.466-2.295
+ c0.143-0.793,0.269-1.543,0.384-2.253c0.112-0.707,0.197-1.317,0.255-1.827c0.056-0.51,0.085-0.877,0.085-1.104
+ c0-1.586-0.17-2.861-0.51-3.825c-0.34-0.962-0.88-1.7-1.615-2.209c-0.738-0.51-1.687-0.85-2.847-1.021
+ c-1.163-0.169-2.566-0.254-4.208-0.254h-3.144l1.53-9.265h38.673l-1.955,18.614h1.104c2.21-3.455,4.49-6.46,6.842-9.01
+ c2.351-2.55,4.887-4.66,7.608-6.332c2.719-1.671,5.679-2.918,8.882-3.74c3.199-0.82,6.727-1.232,10.581-1.232
+ c3.682,0,6.785,0.539,9.308,1.615c2.521,1.077,4.561,2.537,6.12,4.377c1.557,1.842,2.677,3.967,3.355,6.375
+ c0.681,2.409,1.021,4.945,1.021,7.607c0,1.473-0.098,3.046-0.297,4.717c-0.199,1.672-0.455,3.357-0.765,5.057
+ c-0.312,1.701-0.653,3.399-1.02,5.1c-0.369,1.701-0.696,3.315-0.977,4.844l-3.912,18.615c-0.679,3.174-1.247,6.134-1.7,8.882
+ c-0.453,2.75-0.679,5.341-0.679,7.777c0,2.55,0.523,4.504,1.572,5.865c1.049,1.359,2.564,2.04,4.549,2.04
+ c1.812,0,3.469-0.34,4.972-1.02c1.5-0.68,3.243-1.671,5.225-2.976l4.166,5.866C288.873,247.502,287.313,248.96,285.558,250.405z"
+ />
+ </g>
+ </g>
+ <text transform="matrix(1 0 0 1 432 205.9385)" opacity="0.2"><tspan x="0" y="0" font-family="'Roboto-Thin'" font-size="72">Example News Application</tspan><tspan x="0" y="57.6" font-family="'Roboto-Bold'" font-size="48">Phone Wireframes (Portrait)</tspan></text>
+</g>
+<g id="Icons" display="none">
+ <g id="photo_icon_3_" display="inline" opacity="0.1">
+ <path d="M2532.93,2786.371v91.904h-117.876v-91.904H2532.93 M2548.912,2770.39h-149.824v123.867h149.824V2770.39L2548.912,2770.39
+ z"/>
+ <g>
+ <defs>
+ <rect id="SVGID_17_" x="2421.558" y="2793.036" width="104.546" height="78.574"/>
+ </defs>
+ <clipPath id="SVGID_18_">
+ <use xlink:href="#SVGID_17_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_18_)">
+ <path d="M2500.63,2822.67c0,14.707-11.924,26.639-26.631,26.639s-26.646-11.932-26.646-26.639
+ c0-14.715,11.938-26.639,26.646-26.639S2500.63,2807.955,2500.63,2822.67z"/>
+ <path d="M2518.208,2918.881c-1.802,14.238-14.429,29.736-25.576,31.919c-12.422,2.007-24.844,2.007-37.266,0
+ c-11.162-2.175-23.789-17.681-25.591-31.919c-1.421-13.455-1.421-26.909,0-40.363c1.802-14.246,14.429-29.744,25.591-31.92
+ c12.422-2.006,24.844-2.006,37.266,0c11.147,2.176,23.774,17.674,25.576,31.92
+ C2519.629,2891.972,2519.629,2905.426,2518.208,2918.881z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_18_)">
+ <path d="M2544.751,2823.834c0,10.569-8.569,19.146-19.146,19.146s-19.146-8.577-19.146-19.146
+ c0-10.576,8.569-19.145,19.146-19.145S2544.751,2813.258,2544.751,2823.834z"/>
+ <path d="M2557.393,2892.982c-1.304,10.239-10.386,21.379-18.398,22.947c-8.921,1.442-17.856,1.442-26.777,0
+ c-8.013-1.568-17.095-12.708-18.398-22.947c-1.011-9.668-1.011-19.336,0-29.004c1.304-10.239,10.386-21.379,18.398-22.947
+ c8.921-1.442,17.856-1.442,26.777,0c8.013,1.568,17.095,12.708,18.398,22.947
+ C2558.404,2873.646,2558.404,2883.314,2557.393,2892.982z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_18_)">
+ <path d="M2440.704,2823.834c0,10.569-8.569,19.146-19.146,19.146s-19.146-8.577-19.146-19.146
+ c0-10.576,8.569-19.145,19.146-19.145S2440.704,2813.258,2440.704,2823.834z"/>
+ <path d="M2453.331,2892.982c-1.289,10.239-10.371,21.379-18.384,22.947c-8.936,1.442-17.856,1.442-26.777,0
+ c-8.027-1.568-17.095-12.708-18.398-22.947c-1.025-9.668-1.025-19.336,0-29.004c1.304-10.239,10.371-21.379,18.398-22.947
+ c8.921-1.442,17.842-1.442,26.777,0c8.013,1.568,17.095,12.708,18.384,22.947
+ C2454.356,2873.646,2454.356,2883.314,2453.331,2892.982z"/>
+ </g>
+ </g>
+ </g>
+ <g id="news_icon_8_" display="inline" opacity="0.1">
+ <g>
+ <g>
+ <path d="M2535.435,2618.896h-3.662v80.713c0,1.055,0.278,2.08,0.835,2.974c0.542,0.871,1.304,1.582,2.212,2.051
+ c0.381,0.205,0.806,0.366,1.23,0.469c2.314,0.578,3.735,2.922,3.164,5.244c-0.498,1.971-2.256,3.289-4.204,3.289
+ c-0.337,0-0.688-0.045-1.04-0.133c-1.099-0.271-2.153-0.674-3.164-1.193c-2.285-1.187-4.204-2.974-5.566-5.171
+ c-1.392-2.256-2.139-4.863-2.139-7.529v-87.37c0-7.361-5.947-13.323-13.315-13.323h-97.559c-7.354,0-13.315,5.962-13.315,13.323
+ v97.221c0,7.361,5.962,13.323,13.315,13.323h123.208c7.354,0,13.315-5.962,13.315-13.323v-77.248
+ C2548.75,2624.857,2542.789,2618.896,2535.435,2618.896z M2439.532,2702.135h-30.967v-2.556h30.967V2702.135z
+ M2439.532,2695.998h-30.967v-2.557h30.967V2695.998z M2439.532,2689.859h-30.967v-2.556h30.967V2689.859z M2439.532,2683.723
+ h-30.967v-2.557h30.967V2683.723z M2476.49,2702.135h-30.967v-2.556h30.967V2702.135z M2476.49,2695.998h-30.967v-2.557h30.967
+ V2695.998z M2476.49,2689.859h-30.967v-2.556h30.967V2689.859z M2476.49,2683.723h-30.967v-2.557h30.967V2683.723z
+ M2476.49,2676.164h-67.925v-37.955h67.925V2676.164z M2513.448,2702.135h-30.967v-2.556h30.967V2702.135z M2513.448,2695.998
+ h-30.967v-2.557h30.967V2695.998z M2513.448,2689.859h-30.967v-2.556h30.967V2689.859z M2513.448,2683.723h-30.967v-2.557
+ h30.967V2683.723z M2513.448,2677.584h-30.967v-2.556h30.967V2677.584z M2513.448,2671.447h-30.967v-2.557h30.967V2671.447z
+ M2513.448,2665.316h-30.967v-2.563h30.967V2665.316z M2513.448,2659.179h-30.967v-2.563h30.967V2659.179z M2513.448,2653.041
+ h-30.967v-2.563h30.967V2653.041z M2513.448,2646.903h-30.967v-2.563h30.967V2646.903z M2513.448,2640.766h-30.967v-2.557
+ h30.967V2640.766z M2513.448,2631.545h-104.883v-9.983h104.883V2631.545z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_19_" x="2408.565" y="2638.209" width="67.925" height="37.955"/>
+ </defs>
+ <clipPath id="SVGID_20_">
+ <use xlink:href="#SVGID_19_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_20_)">
+ <path d="M2454.62,2652.587c0,7.134-5.845,12.92-13.037,12.92c-7.207,0-13.052-5.786-13.052-12.92
+ c0-7.142,5.845-12.927,13.052-12.927C2448.775,2639.66,2454.62,2645.445,2454.62,2652.587z"/>
+ <path d="M2463.218,2699.264c-0.879,6.907-7.061,14.43-12.524,15.484c-6.079,0.974-12.158,0.974-18.237,0
+ c-5.464-1.055-11.646-8.577-12.524-15.484c-0.688-6.525-0.688-13.059,0-19.584c0.879-6.907,7.061-14.43,12.524-15.484
+ c6.079-0.974,12.158-0.974,18.237,0c5.464,1.055,11.646,8.577,12.524,15.484
+ C2463.921,2686.205,2463.921,2692.738,2463.218,2699.264z"/>
+ </g>
+ </g>
+ </g>
+</g>
+<g id="Phone_Template" display="none">
+ <g id="Small_Handset_6_" display="inline">
+ <path fill="#231F20" d="M767.744,779.205c-0.329-24.343-2.396-48.913-15.187-63.736c-12.929-14.986-28.902-18.38-41.738-21.108
+ c-14.518-3.083-41.219-7.304-85.983-9.899c-20.475-1.186-36.542-1.714-52.095-1.714c-13.769,0-26.201,0.396-41.939,0.897
+ l-7.657,0.241c-30.292,0.945-91.291,10.773-100.688,13.7c-15.497,4.827-23.597,10.746-30.954,22.62
+ c-6.648,10.728-7.988,29.173-8.492,36.117c-0.055,0.748-0.099,1.364-0.14,1.817c-1.323,14.792-1.567,45.215-1.602,51.165
+ c0,0-0.382,483.339-0.235,493.405c0.038,2.578,0.051,4.727,0.063,6.696l0.005,0.692c0.054,9.696,0.086,15.549,2.573,48.66
+ c2.718,36.187,9.689,50.865,19.32,61.77c8.688,9.842,20.217,15.713,37.381,19.035c1.895,0.368,3.673,0.723,5.412,1.07
+ c13.234,2.641,23.688,4.727,60.14,6.646c3.694,0.193,7.275,0.39,10.803,0.588c16.6,0.921,32.279,1.792,53.264,1.792
+ c14.896,0,31.371-0.44,50.365-1.346c66.147-3.153,98.891-6.913,118.057-20.855c18.6-13.532,22.909-33.763,25.762-47.162
+ l0.12-0.569c3.372-15.818,3.445-51.611,3.445-62.362C767.744,1247.996,767.744,823.829,767.744,779.205z"/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M770.05,1347.882l-0.281,1.875c-0.072,0.478-0.702,4.665-1.37,8.28
+ c-1.277,6.9-3.504,16.453-6.858,22.775c-3.762,7.088-7.314,13.785-25.246,24.332c-13.561,7.974-44.078,14.006-53.068,15.188
+ c-10.188,1.34-47.461,4.192-65.38,5.005c-16.789,0.761-25.233,0.992-36.14,0.992l-3.567-0.008l-3.641,0.007
+ c-18.312,0-31.146-0.512-41.738-0.991c-17.919-0.812-55.19-3.665-65.378-5.005c-8.989-1.181-39.506-7.211-53.066-15.188
+ c-17.932-10.547-21.485-17.241-25.249-24.331c-3.354-6.324-5.581-15.876-6.858-22.776c-0.679-3.678-1.283-7.586-1.335-7.917
+ l-0.29-1.878"/>
+ <g>
+ <path fill="#FFFFFF" d="M561.036,695.701c10.201,0,27.874,0.14,36.709,0.241c7.614,0.088,18.293,0.724,26.884,1.236l0.5,0.028
+ c2.512,0.15,4.87,0.29,6.96,0.405c8.472,0.461,16.266,0.935,18.556,1.641c1.722,0.531,1.806,1.179,1.945,2.255l0.032,0.244
+ c0.188,1.366-0.313,2.429-1.491,3.162c-0.987,0.615-1.323,0.715-2.397,0.715c-0.333,0-0.727-0.009-1.237-0.024l-1.704-0.035
+ c-3.76-0.057-11.223-0.741-18.543-1.436c-6.699-0.639-23.176-1.326-32.005-1.557c-8.845-0.23-26.277-0.23-32.84-0.23
+ c-4.927,0-12.207,0.246-18.626,0.462l-0.784,0.026l-0.321,0.011c-2.095,0.07-4.107,0.137-5.937,0.191
+ c-5.415,0.16-11.042,0.538-16.006,0.872l-0.072,0.005l-0.324,0.023l-0.772,0.051c-1.764,0.118-3.423,0.229-4.937,0.315
+ c-1.136,0.066-2.32,0.142-3.509,0.219l-0.379,0.025c-3.292,0.214-6.697,0.435-9.013,0.435c-1.104,0-1.898-0.05-2.367-0.149
+ c-0.919-0.194-1.602-0.633-2.027-1.307c-0.585-0.927-0.539-2.034-0.419-2.538c0.204-0.858,1.297-2.674,2.896-2.984
+ c1.384-0.269,5.948-0.476,11.28-0.719l4.125-0.19c7.029-0.332,32.182-1.323,41.398-1.381
+ C557.87,695.705,559.366,695.701,561.036,695.701 M561.036,692.701c-1.676,0-3.177,0.004-4.441,0.01
+ c-9.305,0.059-34.499,1.052-41.524,1.384l-4.121,0.19c-5.869,0.267-10.109,0.459-11.714,0.771
+ c-3.053,0.592-4.836,3.524-5.243,5.234c-0.297,1.254-0.244,3.182,0.802,4.836c0.862,1.364,2.226,2.277,3.945,2.639
+ c0.689,0.146,1.637,0.213,2.984,0.213c2.419,0,5.883-0.225,9.232-0.442l0.357-0.023c1.181-0.077,2.358-0.152,3.487-0.218
+ c1.737-0.099,3.67-0.23,5.734-0.368l0.334-0.023c4.957-0.333,10.576-0.712,15.957-0.871c1.926-0.056,4.055-0.128,6.27-0.202
+ l0.783-0.026c6.406-0.216,13.667-0.461,18.527-0.461c6.552,0,23.956,0,32.762,0.229c8.775,0.229,25.146,0.91,31.798,1.544
+ c7.388,0.702,14.923,1.391,18.782,1.449l1.687,0.035c0.518,0.016,0.941,0.025,1.299,0.025c1.634,0,2.527-0.262,3.983-1.168
+ c2.177-1.354,3.226-3.59,2.878-6.117l-0.029-0.222c-0.164-1.271-0.47-3.635-4.035-4.735c-2.387-0.736-8.365-1.175-19.277-1.77
+ c-2.084-0.115-4.438-0.254-6.944-0.404l-0.511-0.029c-8.629-0.514-19.367-1.152-27.018-1.241
+ C589.007,692.842,571.356,692.701,561.036,692.701L561.036,692.701z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M574.746,1413.722c-11.699,0-21.22-9.546-21.22-21.277
+ c0-11.733,9.521-21.277,21.22-21.277c11.702,0,21.221,9.544,21.221,21.277C595.967,1404.176,586.447,1413.722,574.746,1413.722"/>
+ <g>
+ <rect x="413.247" y="763.702" fill="#FFFFFF" width="323" height="536.333"/>
+ <path fill="#FFFFFF" d="M734.747,765.202v533.333h-320V765.202H734.747 M737.747,762.202h-3h-320h-3v3v533.333v3h3h320h3v-3
+ V765.202V762.202L737.747,762.202z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M573.721,712.644c20.732,0,40.963,0.717,61.852,2.192c16.037,1.132,22.539,1.707,44.874,4.361
+ c22.964,2.73,37.234,5.458,46.272,8.844c9.02,3.375,18.215,7.517,22.892,17.642c4.664,10.098,5.272,24.739,5.52,40.12
+ c0.141,8.725,0.492,57.03,0.776,95.845l0.017,2.385c0.173,23.873,0.312,42.728,0.355,46.401
+ c0.117,10.022,0.228,207.919,0.228,216.126c0,4.869,0.025,31.566,0.052,59.639l0.023,24.958
+ c0.021,23.082,0.039,42.723,0.039,46.233l0.01,3.779c0.042,11.215,0.119,32.094-1.44,38.838
+ c-1.78,7.698-8.244,17.708-21.044,22.719c-9.945,3.891-26.667,7.543-48.354,10.562c-11.728,1.626-51.374,5.173-72.876,6.077
+ c-10.138,0.424-24.322,0.659-39.936,0.659c-14.254,0-27.824-0.205-36.3-0.544c-16.596-0.67-49.325-3.385-61.491-4.595
+ c-11.772-1.168-32.573-4.617-37.803-5.818l-2.013-0.453c-5.668-1.266-15.158-3.381-21.724-6.917
+ c-7.469-4.026-9.602-5.683-15.219-14.077c-4.7-7.022-4.478-21.854-4.344-30.715l0.003-0.195c0.02-1.274,0.038-2.434,0.038-3.438
+ c0-8.102-0.566-120.259-0.689-136.374c-0.113-14.793-0.229-94.735-0.229-104.809c0-2.889-0.045-15.856-0.105-32.624
+ c-0.126-36.406-0.318-102.758-0.238-110.091c0.037-3.612,0.074-16.622,0.123-33.202l0.004-1.245
+ c0.094-32.277,0.221-76.484,0.446-87.159c0.034-1.649,0.062-3.271,0.087-4.868c0.227-13.962,0.424-26.02,5.927-39.261
+ c5.95-14.316,25.854-19.852,53.91-23.758c26.5-3.691,67.831-6.483,105.295-7.112
+ C563.661,712.687,568.729,712.644,573.721,712.644 M573.721,709.644c-5.001,0-10.086,0.043-15.113,0.128
+ c-37.575,0.631-79.049,3.433-105.659,7.14c-29.075,4.048-49.77,9.947-56.266,25.578c-5.726,13.776-5.925,26.097-6.157,40.363
+ c-0.026,1.593-0.053,3.21-0.087,4.855c-0.225,10.652-0.352,54.645-0.445,86.768l-0.001,0.445l-0.004,1.244l-0.002,0.76
+ c-0.047,16.132-0.084,28.875-0.121,32.421c-0.083,7.611,0.125,77.486,0.238,110.132c0.058,16.105,0.105,29.675,0.105,32.613
+ c0,10.084,0.116,90.068,0.229,104.832c0.123,16.079,0.689,128.219,0.689,136.351c0,0.979-0.018,2.108-0.037,3.347l-0.003,0.242
+ c-0.139,9.21-0.372,24.627,4.85,32.428c5.957,8.901,8.404,10.799,16.288,15.049c6.922,3.727,16.654,5.9,22.468,7.198l2.034,0.458
+ c5.271,1.21,26.278,4.697,38.166,5.876c12.167,1.209,44.961,3.932,61.666,4.607c8.541,0.342,22.156,0.547,36.421,0.547
+ c15.646,0,29.873-0.235,40.062-0.661c21.574-0.907,61.38-4.469,73.163-6.103c21.919-3.052,38.875-6.766,49.035-10.74
+ c13.888-5.436,20.922-16.394,22.875-24.837c1.511-6.537,1.575-23.83,1.517-39.525l-0.01-3.776c0-2.751-0.011-15.48-0.026-32.014
+ l-0.013-14.213l-0.023-24.959c-0.027-28.071-0.052-54.768-0.052-59.636c0-8.711-0.111-206.141-0.228-216.162
+ c-0.043-3.633-0.181-22.327-0.355-46.388l-0.017-2.384l-0.022-2.963c-0.275-37.599-0.618-84.392-0.755-92.91
+ c-0.252-15.714-0.886-30.699-5.795-41.329c-5.154-11.158-15.382-15.758-24.564-19.194c-9.274-3.474-23.76-6.253-46.97-9.013
+ c-22.377-2.659-28.904-3.237-45.017-4.375C614.823,710.364,594.522,709.644,573.721,709.644L573.721,709.644z"/>
+ </g>
+ <rect x="414.748" y="764.977" fill="#231F20" width="319.998" height="24.185"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M447.846,1316.961c0,0-6.818,6.286-7.376,6.774
+ c-0.555,0.492-0.138,1.467,0.559,1.882c0.695,0.415,6.891,6.876,6.891,6.876l3.062-0.148l-6.334-6.39c0,0,6.82-0.09,9.604,0.11
+ c2.783,0.202,5.082,1.66,6.682,2.839c1.602,1.18,3.478,3.475,3.478,3.475l2.926-0.009c0,0-1.812-3.269-5.638-6.114
+ c-3.83-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.495L447.846,1316.961z"/>
+ <rect x="521.459" y="1314.25" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="26.007" height="2.441"/>
+ <rect x="528.413" y="1320.803" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.761"/>
+ <rect x="528.413" y="1326.87" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.86"/>
+ <rect x="528.413" y="1333.285" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" width="19.054" height="2.648"/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="616.614,1312.809 602.151,1326.891 603.82,1328.494
+ 616.825,1315.737 629.546,1328.354 631.285,1326.961 625.653,1321.524 625.653,1314.692 623.429,1314.692 623.429,1319.223 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="610.076,1328.287 607.783,1329.89 607.783,1337
+ 625.515,1337 625.515,1329.89 623.358,1328.075 623.358,1334.98 610.076,1334.98 "/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M700.618,1327.011l2.348,2.962v1.463c0,0,3.686,4.25,5.074,5.368
+ c1.393,1.114,1.738,0.626,2.227,0.138c0.488-0.488,0.763-1.951,0.138-2.65c-0.626-0.697-4.938-5.576-4.938-5.576l-1.249,0.067
+ l-1.637-2.091"/>
+ <g>
+ <path fill="#FFFFFF" d="M695.689,1314.373c3.648,0,6.616,2.968,6.616,6.616s-2.968,6.616-6.616,6.616s-6.616-2.968-6.616-6.616
+ S692.042,1314.373,695.689,1314.373 M695.689,1311.373c-5.311,0-9.616,4.305-9.616,9.616s4.305,9.616,9.616,9.616
+ s9.616-4.305,9.616-9.616S701,1311.373,695.689,1311.373L695.689,1311.373z"/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy" display="inline">
+ <rect x="414.748" y="789.162" fill="#FFC91F" width="319.998" height="48.833"/>
+ <text transform="matrix(1 0 0 1 498.8208 820.9951)" font-family="'Roboto-Regular'" font-size="21">News</text>
+ <polygon points="430.488,813.578 436.334,804.315 431.359,804.315 425.512,813.578 431.359,822.841 436.334,822.841 "/>
+ <polygon points="611.821,821.495 611.821,832.995 600.321,832.995 "/>
+ <g id="news_icon_1_">
+ <g>
+ <g>
+ <path d="M478.188,803.207h-0.864v19.039c0,0.249,0.069,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.521,0.484
+ c0.093,0.048,0.191,0.086,0.292,0.111c0.547,0.136,0.881,0.69,0.745,1.237c-0.115,0.465-0.532,0.775-0.99,0.775
+ c-0.081,0-0.164-0.01-0.247-0.03c-0.258-0.064-0.508-0.159-0.745-0.282c-0.539-0.281-0.992-0.702-1.312-1.219
+ c-0.33-0.533-0.504-1.147-0.504-1.776v-20.609c0-1.735-1.406-3.142-3.142-3.142h-23.012c-1.735,0-3.142,1.406-3.142,3.142
+ v22.933c0,1.735,1.406,3.142,3.142,3.142h29.059c1.735,0,3.142-1.407,3.142-3.142v-18.221
+ C481.33,804.613,479.923,803.207,478.188,803.207z M455.569,822.841h-7.304v-2.051h7.304V822.841z M455.569,819.946h-7.304
+ v-2.051h7.304V819.946z M464.287,822.841h-7.304v-2.051h7.304V822.841z M464.287,819.946h-7.304v-2.051h7.304V819.946z
+ M464.287,816.716h-16.022v-8.954h16.022V816.716z M473.004,822.841h-7.304v-2.051h7.304V822.841z M473.004,819.946h-7.304
+ v-2.051h7.304V819.946z M473.004,817.051h-7.304V815h7.304V817.051z M473.004,814.156h-7.304v-2.051h7.304V814.156z
+ M473.004,811.261h-7.304v-2.051h7.304V811.261z M473.004,806.191h-24.74v-2.356h24.74V806.191z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_21_" x="448.265" y="807.762" width="16.022" height="8.954"/>
+ </defs>
+ <clipPath id="SVGID_22_">
+ <use xlink:href="#SVGID_21_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_22_)">
+ <ellipse cx="456.052" cy="811.153" rx="3.076" ry="3.048"/>
+ <path d="M461.157,822.164c-0.208,1.63-1.667,3.404-2.955,3.653c-1.435,0.229-2.868,0.229-4.303,0
+ c-1.288-0.25-2.747-2.023-2.955-3.653c-0.164-1.54-0.164-3.079,0-4.619c0.208-1.63,1.667-3.404,2.955-3.653
+ c1.435-0.23,2.868-0.23,4.303,0c1.288,0.249,2.746,2.022,2.955,3.653C461.322,819.084,461.322,820.624,461.157,822.164z"/>
+ </g>
+ </g>
+ </g>
+ <g id="overflow_1_">
+ <rect x="702.404" y="800.437" width="5.542" height="5.542"/>
+ <rect x="702.404" y="810.808" width="5.542" height="5.542"/>
+ <rect x="702.404" y="821.179" width="5.542" height="5.542"/>
+ </g>
+ <g id="refresh_1_">
+ <polygon points="676.576,800.808 676.576,810.808 666.576,810.808 "/>
+ <polygon points="650.326,825.949 650.326,815.949 660.326,815.949 "/>
+ <g>
+ <g>
+ <path d="M663.451,804.253c4.146,0,7.641,2.768,8.751,6.554h4.118c-1.195-6.017-6.501-10.554-12.87-10.554
+ s-11.674,4.537-12.87,10.554h4.118C655.81,807.021,659.305,804.253,663.451,804.253z M663.451,822.503
+ c-4.146,0-7.641-2.768-8.751-6.554h-4.118c1.195,6.017,6.501,10.554,12.87,10.554s11.674-4.537,12.87-10.554h-4.118
+ C671.091,819.736,667.597,822.503,663.451,822.503z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/html/training/design-navigation/example-wireframe-tablet.svg b/docs/html/training/design-navigation/example-wireframe-tablet.svg new file mode 100644 index 0000000..c9c29c5 --- /dev/null +++ b/docs/html/training/design-navigation/example-wireframe-tablet.svg @@ -0,0 +1,1787 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="5451.16px" height="4291.8px" viewBox="0 0 5451.16 4291.8" enable-background="new 0 0 5451.16 4291.8"
+ xml:space="preserve">
+<font horiz-adv-x="2048">
+<!-- Droid is a trademark of Google and may be registered in certain jurisdictions. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="DroidSerif" units-per-em="2048" underline-position="-154" underline-thickness="102"/>
+<missing-glyph horiz-adv-x="1024" d="M102,0l0,1462l820,0l0,-1462M201,98l622,0l0,1266l-622,0z"/>
+<glyph unicode=" " horiz-adv-x="532"/>
+<glyph unicode="," horiz-adv-x="512" d="M397,86C397,43 391,1 379,-40C367,-81 348,-118 321,-153C294,-188 259,-219 217,-246C174,-274 122,-297 61,-315l0,86C128,-208 178,-182 209,-151C240,-120 256,-85 256,-45C256,-32 252,-20 245,-11C238,-2 228,6 217,13C206,20 194,26 181,33C168,40 156,48 145,57C134,66 124,78 117,92C110,105 106,122 106,143C106,182 119,212 145,233C170,254 202,264 240,264C261,264 281,260 300,253C319,245 335,234 350,219C365,204 376,185 385,163C393,140 397,115 397,86z"/>
+<glyph unicode="-" horiz-adv-x="635" d="M51,481l0,154l533,0l0,-154z"/>
+<glyph unicode="." horiz-adv-x="586" d="M164,125C164,152 167,174 174,192C181,209 190,223 202,234C213,245 227,252 243,257C258,262 275,264 293,264C310,264 327,262 343,257C358,252 372,245 384,234C395,223 405,209 412,192C419,174 422,152 422,125C422,99 419,77 412,59C405,41 395,27 384,16C372,5 358,-2 343,-7C327,-12 310,-14 293,-14C275,-14 258,-12 243,-7C227,-2 213,5 202,16C190,27 181,41 174,59C167,77 164,99 164,125z"/>
+<glyph unicode="A" horiz-adv-x="1444" d="M414,489l-78,-215C330,258 325,242 322,227C319,211 317,197 317,186C317,151 328,126 351,110C373,94 407,86 453,86l47,0l0,-86l-500,0l0,86l39,0C59,86 76,88 90,93C104,97 117,105 128,117C139,129 150,145 161,166C171,187 182,213 195,246l454,1216l160,0l463,-1267C1280,174 1288,156 1297,142C1305,128 1315,117 1326,109C1337,100 1350,94 1365,91C1380,88 1397,86 1417,86l27,0l0,-86l-563,0l0,86l47,0C1010,86 1051,119 1051,184C1051,195 1050,207 1047,219C1044,231 1039,245 1034,260l-82,229M788,950C767,1011 747,1068 730,1121C712,1174 697,1225 686,1274C681,1249 676,1226 670,1203C663,1180 656,1156 649,1132C642,1108 633,1083 624,1057C615,1030 604,1001 592,969l-139,-377l462,0z"/>
+<glyph unicode="C" horiz-adv-x="1257" d="M774,1483C844,1483 905,1477 957,1466C1008,1454 1051,1438 1086,1417C1120,1396 1146,1372 1163,1344C1180,1316 1188,1286 1188,1253C1188,1231 1184,1211 1175,1194C1166,1176 1153,1161 1137,1149C1121,1136 1102,1127 1081,1120C1059,1113 1035,1110 1010,1110C1010,1142 1006,1174 998,1205C989,1236 976,1265 957,1290C938,1315 913,1335 883,1351C852,1366 815,1374 770,1374C693,1374 627,1360 573,1332C519,1303 475,1262 441,1208C407,1153 382,1086 367,1007C352,927 344,836 344,733C344,642 352,558 368,482C384,406 409,341 444,287C479,232 523,190 577,160C630,130 695,115 770,115C820,115 864,120 903,130C941,139 975,152 1004,168C1033,184 1059,203 1082,224C1104,245 1124,266 1141,289C1152,282 1162,272 1169,259C1176,246 1180,230 1180,209C1180,183 1171,157 1154,130C1136,103 1109,78 1073,56C1037,34 991,16 936,2C881,-13 815,-20 739,-20C637,-20 547,-2 470,34C393,70 328,121 276,187C223,253 184,332 157,425C130,518 117,620 117,733C117,844 131,945 159,1037C187,1129 229,1208 284,1274C339,1340 407,1391 489,1428C571,1465 666,1483 774,1483z"/>
+<glyph unicode="E" horiz-adv-x="1276" d="M479,102l395,0C907,102 935,107 958,116C981,125 1000,137 1015,152C1030,167 1042,185 1051,206C1060,226 1066,247 1069,270l14,88l107,0l-14,-358l-1098,0l0,86l26,0C127,86 148,88 169,91C189,94 207,100 222,109C237,118 250,132 259,151C268,169 272,193 272,223l0,1006C272,1261 268,1287 259,1306C250,1325 238,1340 223,1351C208,1361 190,1368 170,1371C149,1374 127,1376 104,1376l-26,0l0,86l1032,0l10,-358l-106,0l-10,88C1001,1215 996,1236 989,1257C981,1277 970,1295 956,1310C941,1325 923,1338 902,1347C880,1356 854,1360 823,1360l-344,0l0,-545l494,0l0,-100l-494,0z"/>
+<glyph unicode="I" horiz-adv-x="752" d="M78,0l0,86l26,0C127,86 149,88 170,91C190,94 208,101 223,112C238,122 250,137 259,156C268,175 272,201 272,233l0,996C272,1261 268,1287 259,1306C250,1325 238,1340 223,1351C208,1361 190,1368 170,1371C149,1374 127,1376 104,1376l-26,0l0,86l596,0l0,-86l-27,0C624,1376 603,1374 582,1371C561,1368 544,1361 529,1351C514,1340 502,1325 493,1306C484,1287 479,1261 479,1229l0,-996C479,201 484,175 493,156C502,137 514,122 529,112C544,101 561,94 582,91C603,88 624,86 647,86l27,0l0,-86z"/>
+<glyph unicode="N" horiz-adv-x="1563" d="M1165,0l-768,1180l0,-947C397,201 402,175 411,156C420,137 432,122 447,112C462,101 479,94 500,91C521,88 542,86 565,86l27,0l0,-86l-514,0l0,86l26,0C127,86 149,88 170,91C190,94 208,101 223,112C238,122 250,137 259,156C268,175 272,201 272,233l0,1004C272,1267 268,1291 259,1310C250,1328 237,1342 222,1352C207,1362 189,1369 169,1372C148,1375 127,1376 104,1376l-26,0l0,86l375,0l733,-1132l0,907C1186,1267 1182,1291 1173,1310C1164,1328 1151,1342 1136,1352C1121,1362 1103,1369 1083,1372C1062,1375 1041,1376 1018,1376l-27,0l0,86l514,0l0,-86l-26,0C1456,1376 1434,1374 1414,1371C1393,1368 1375,1361 1360,1351C1345,1340 1333,1325 1324,1306C1315,1287 1311,1261 1311,1229l0,-1229z"/>
+<glyph unicode="P" horiz-adv-x="1237" d="M78,0l0,86l26,0C127,86 149,88 170,91C190,94 208,101 223,112C238,122 250,137 259,156C268,175 272,201 272,233l0,1004C272,1267 268,1291 259,1310C250,1328 237,1342 222,1352C207,1362 189,1369 169,1372C148,1375 127,1376 104,1376l-26,0l0,86l575,0C739,1462 814,1452 877,1433C940,1413 993,1385 1034,1348C1075,1311 1106,1266 1127,1213C1147,1160 1157,1101 1157,1034C1157,973 1148,915 1129,859C1110,803 1078,754 1035,711C992,668 935,633 865,608C795,582 709,569 608,569l-129,0l0,-346C479,193 484,169 493,151C502,132 514,118 529,109C544,100 562,94 583,91C603,88 624,86 647,86l68,0l0,-86M479,666l109,0C650,666 703,673 747,686C791,699 827,720 855,749C883,778 904,815 917,861C930,906 936,961 936,1026C936,1083 930,1133 919,1176C908,1218 889,1253 864,1281C839,1309 806,1330 766,1344C725,1357 676,1364 618,1364l-139,0z"/>
+<glyph unicode="U" horiz-adv-x="1468" d="M741,-20C660,-20 588,-11 524,6C460,23 406,50 362,87C317,124 283,171 260,230C237,288 225,359 225,442l0,795C225,1267 221,1291 212,1310C203,1328 190,1342 175,1352C160,1362 142,1369 122,1372C101,1375 80,1376 57,1376l-26,0l0,86l596,0l0,-86l-27,0C577,1376 556,1374 535,1371C514,1368 497,1361 482,1351C467,1340 455,1325 446,1306C437,1287 432,1261 432,1229l0,-799C432,371 441,320 458,279C475,237 498,203 529,177C559,151 595,132 637,120C678,108 724,102 774,102C833,102 885,110 928,126C971,142 1006,164 1035,193C1063,221 1084,255 1098,294C1111,333 1118,375 1118,422l0,815C1118,1267 1114,1291 1105,1310C1096,1328 1083,1342 1068,1352C1053,1362 1035,1369 1015,1372C994,1375 973,1376 950,1376l-26,0l0,86l514,0l0,-86l-27,0C1388,1376 1367,1374 1346,1371C1325,1368 1308,1361 1293,1351C1278,1340 1266,1325 1257,1306C1248,1287 1243,1261 1243,1229l0,-811C1243,350 1232,289 1211,235C1189,180 1157,134 1115,97C1072,59 1020,30 957,10C894,-10 822,-20 741,-20z"/>
+<glyph unicode="V" horiz-adv-x="1382" d="M614,0l-442,1268C165,1289 157,1307 148,1321C139,1335 129,1346 118,1354C107,1362 94,1368 79,1371C64,1374 47,1376 27,1376l-27,0l0,86l563,0l0,-86l-47,0C475,1376 444,1368 424,1353C403,1337 393,1312 393,1278C393,1267 395,1255 398,1243C401,1231 405,1217 410,1202l225,-665C656,476 673,418 688,361C703,304 716,250 727,201C738,250 750,303 765,358C780,413 798,473 821,537l226,651C1052,1205 1057,1221 1060,1236C1063,1251 1065,1265 1065,1276C1065,1311 1054,1337 1032,1353C1009,1368 975,1376 930,1376l-47,0l0,86l499,0l0,-86l-39,0C1323,1376 1306,1374 1292,1370C1277,1366 1264,1358 1253,1347C1241,1335 1230,1319 1220,1298C1210,1277 1199,1250 1188,1217l-424,-1217z"/>
+<glyph unicode="a" horiz-adv-x="1153" d="M301,297C301,233 315,185 342,154C369,122 410,106 467,106C508,106 546,113 580,126C613,139 642,158 666,183C689,208 707,238 720,273C733,308 739,348 739,391l0,166l-131,-6C550,548 502,541 463,530C424,518 392,502 368,481C344,460 327,434 317,403C306,372 301,337 301,297M549,1016C510,1016 478,1011 454,1000C429,989 410,973 397,953C383,933 374,909 369,882C364,855 362,825 362,793C305,793 262,803 233,822C203,841 188,875 188,922C188,957 198,987 217,1012C236,1037 263,1057 297,1073C330,1088 369,1100 414,1107C459,1114 506,1118 557,1118C620,1118 674,1112 721,1100C768,1087 807,1067 838,1039C869,1011 893,975 909,930C924,885 932,829 932,764l0,-531C932,204 934,181 939,162C944,143 951,128 961,117C971,106 984,98 1001,93C1017,88 1036,86 1059,86l6,0l0,-86l-277,0l-32,176l-17,0C718,147 697,121 677,97C657,73 635,52 611,35C587,18 560,4 530,-5C499,-15 463,-20 420,-20C375,-20 333,-13 294,0C255,13 221,33 193,60C164,87 142,121 126,162C110,203 102,251 102,307C102,416 141,496 218,549C295,602 412,630 569,635l170,6l0,123C739,801 737,835 733,866C729,897 720,923 707,946C694,968 675,985 650,998C625,1010 591,1016 549,1016z"/>
+<glyph unicode="b" horiz-adv-x="1257" d="M1145,551C1145,452 1136,367 1118,295C1099,223 1072,164 1037,117C1002,70 958,36 906,14C854,-9 794,-20 727,-20C688,-20 652,-16 620,-7C588,2 559,14 534,30C508,46 485,65 466,87C446,109 429,133 414,160l-13,0l-36,-160l-328,0l0,86l16,0C76,86 98,88 119,91C139,94 157,101 172,112C187,122 199,137 208,156C217,175 221,201 221,233l0,1098C221,1361 217,1385 208,1404C199,1422 186,1436 171,1446C156,1456 138,1463 118,1466C97,1469 76,1470 53,1470l-16,0l0,86l377,0l0,-376C414,1157 414,1130 413,1100C412,1069 411,1040 410,1012C409,980 407,947 406,913l8,0C429,944 447,973 466,998C485,1023 508,1045 533,1063C558,1080 587,1094 619,1104C651,1113 687,1118 727,1118C794,1118 854,1107 906,1085C958,1062 1002,1028 1037,982C1072,935 1099,876 1118,805C1136,734 1145,649 1145,551M692,987C639,987 594,978 559,961C523,943 494,916 473,880C452,844 437,799 428,744C419,689 414,625 414,551C414,480 419,417 428,362C437,307 452,261 474,224C495,187 524,159 560,140C595,121 640,111 694,111C739,111 778,121 810,140C841,159 867,187 888,224C908,261 923,308 932,363C941,418 946,481 946,553C946,626 941,689 932,744C923,798 908,843 888,879C867,915 841,942 809,960C776,978 737,987 692,987z"/>
+<glyph unicode="c" horiz-adv-x="1008" d="M580,-20C512,-20 449,-9 392,12C335,33 285,66 244,111C203,156 171,215 148,286C125,357 113,442 113,543C113,652 125,744 148,818C171,891 203,950 244,995C285,1040 333,1071 389,1090C444,1109 504,1118 569,1118C612,1118 654,1114 697,1106C739,1097 777,1084 811,1067C845,1050 873,1028 894,1002C915,975 926,944 926,909C926,862 911,828 880,809C849,790 804,780 743,780C743,812 740,842 735,871C730,900 721,925 708,947C695,968 677,985 655,998C632,1010 604,1016 569,1016C530,1016 494,1009 463,994C431,979 404,954 381,918C358,882 341,834 329,773C317,712 311,636 311,545C311,400 335,291 384,220C432,149 511,113 621,113C684,113 740,126 787,153C834,180 870,214 893,256C903,248 911,237 918,224C925,211 928,195 928,176C928,153 921,129 906,106C891,83 870,62 841,43C812,24 775,9 732,-2C689,-14 638,-20 580,-20z"/>
+<glyph unicode="d" horiz-adv-x="1257" d="M1036,225C1036,195 1041,171 1050,153C1059,134 1071,120 1086,110C1101,100 1119,94 1140,91C1160,88 1181,86 1204,86l17,0l0,-86l-347,0l-22,184l-8,0C829,153 811,125 792,100C772,75 749,53 724,36C699,18 670,4 638,-5C606,-15 570,-20 530,-20C463,-20 403,-9 351,14C299,36 255,70 220,117C185,163 158,222 140,293C122,364 113,449 113,547C113,646 122,731 140,803C158,875 185,934 220,981C255,1028 299,1062 351,1085C403,1107 463,1118 530,1118C569,1118 605,1114 637,1105C669,1096 698,1084 724,1068C749,1052 772,1033 792,1011C812,989 829,965 844,938l12,0C854,971 852,1003 850,1032C849,1057 847,1083 846,1108C845,1133 844,1151 844,1163l0,168C844,1361 840,1385 831,1404C822,1422 809,1436 794,1446C779,1456 761,1463 741,1466C720,1469 699,1470 676,1470l-17,0l0,86l377,0M565,111C618,111 663,120 699,138C734,155 763,182 785,218C806,254 822,299 831,354C840,409 844,473 844,547C844,618 840,681 831,736C822,791 806,837 785,874C763,911 734,939 698,958C662,977 617,987 563,987C518,987 480,977 448,958C416,939 390,910 370,873C349,836 334,790 325,735C316,680 311,616 311,545C311,400 331,291 370,219C409,147 474,111 565,111z"/>
+<glyph unicode="e" horiz-adv-x="1096" d="M563,1008C487,1008 429,977 388,916C347,854 322,764 315,645l471,0C786,699 782,748 774,793C766,838 753,876 736,908C719,940 696,965 668,982C639,999 604,1008 563,1008M588,-20C514,-20 448,-7 389,18C330,43 280,79 239,127C198,175 167,234 146,304C124,373 113,452 113,541C113,732 152,876 231,973C310,1070 422,1118 567,1118C633,1118 692,1108 745,1087C798,1066 842,1036 879,995C916,954 944,903 964,842C983,781 993,710 993,629l0,-94l-682,0C312,460 320,396 334,343C347,289 367,245 393,210C418,175 450,150 487,134C524,117 567,109 616,109C651,109 684,113 715,121C745,129 772,140 797,153C822,166 844,182 863,199C882,216 897,233 909,252C918,248 927,240 936,227C944,214 948,199 948,182C948,161 941,139 926,116C911,92 889,70 859,50C829,30 792,13 747,0C702,-13 649,-20 588,-20z"/>
+<glyph unicode="f" horiz-adv-x="756" d="M688,86l0,-86l-633,0l0,86l27,0C105,86 127,88 148,91C168,94 186,101 201,112C216,122 228,137 237,156C246,175 250,201 250,233l0,768l-187,0l0,97l187,0l0,102C250,1261 258,1315 275,1362C292,1409 316,1448 347,1480C378,1512 416,1536 461,1553C506,1569 556,1577 612,1577C665,1577 710,1574 747,1567C784,1560 813,1550 836,1537C858,1524 874,1509 884,1492C894,1475 899,1455 899,1434C899,1415 895,1399 887,1385C878,1370 867,1358 852,1349C837,1339 819,1332 799,1327C778,1322 756,1319 731,1319C731,1340 729,1360 725,1380C720,1399 713,1417 703,1432C692,1447 678,1460 661,1469C644,1478 622,1483 596,1483C567,1483 542,1477 523,1466C503,1455 487,1438 475,1416C463,1393 455,1366 450,1333C445,1300 442,1262 442,1219l0,-121l289,0l0,-97l-289,0l0,-768C442,201 447,175 456,156C465,137 477,122 492,112C507,101 524,94 545,91C566,88 587,86 610,86z"/>
+<glyph unicode="g" horiz-adv-x="1102" d="M1077,1055C1077,1040 1075,1027 1071,1014C1066,1001 1060,989 1051,980C1042,970 1031,962 1018,957C1004,951 988,948 969,948C969,956 968,964 966,972C964,980 961,988 956,995C951,1002 944,1007 935,1012C926,1016 915,1018 901,1018C884,1018 868,1016 854,1012C840,1008 826,1002 813,993C836,964 856,931 871,892C886,853 893,804 893,745C893,694 885,648 870,605C855,562 832,524 802,493C771,462 733,437 687,420C640,402 586,393 524,393C516,393 507,393 497,394C487,394 477,394 467,395C457,395 448,396 439,397C430,398 423,398 418,399C405,392 392,385 380,377C368,369 358,360 349,350C340,340 332,329 327,316C322,303 319,289 319,274C319,257 322,244 329,234C335,224 344,216 355,211C366,205 380,201 396,200C411,198 428,197 446,197l232,0C739,197 791,189 834,174C877,159 912,138 939,111C966,84 985,51 998,14C1010,-24 1016,-65 1016,-109C1016,-168 1005,-221 984,-268C962,-315 929,-355 884,-388C839,-421 783,-447 715,-465C646,-483 566,-492 473,-492C330,-492 224,-466 153,-413C82,-360 47,-287 47,-193C47,-153 54,-118 68,-88C82,-58 101,-32 125,-11C148,10 175,28 206,41C237,54 269,64 303,70C289,76 275,84 262,94C249,104 237,116 226,130C215,144 207,160 200,178C193,196 190,216 190,238C190,279 201,314 222,344C243,373 277,402 324,430C295,442 269,459 246,480C223,501 203,525 188,552C172,579 160,608 152,640C143,672 139,705 139,739C139,798 147,851 163,898C179,945 203,984 235,1017C267,1050 307,1075 355,1092C403,1109 459,1118 524,1118C549,1118 573,1116 597,1113C621,1109 643,1104 664,1098C684,1091 702,1084 719,1076C735,1068 748,1060 758,1051C768,1062 780,1074 793,1087C806,1100 821,1112 838,1123C855,1134 873,1143 893,1150C912,1157 933,1161 956,1161C977,1161 995,1158 1010,1153C1025,1147 1037,1139 1047,1130C1057,1120 1065,1109 1070,1096C1075,1083 1077,1069 1077,1055M213,-180C213,-210 217,-238 225,-264C233,-290 247,-312 267,-331C287,-350 314,-364 348,-375C382,-386 425,-391 477,-391C550,-391 611,-385 659,-372C706,-360 744,-343 772,-321C800,-299 820,-273 831,-242C842,-212 848,-179 848,-143C848,-112 844,-86 835,-65C826,-45 812,-29 795,-17C777,-6 755,2 729,7C703,12 673,14 639,14l-201,0C409,14 382,12 355,7C328,2 304,-8 283,-22C262,-36 245,-56 232,-81C219,-106 213,-139 213,-180M332,745C332,658 347,594 376,553C405,512 452,492 518,492C551,492 580,497 603,507C626,517 644,532 659,553C674,574 684,600 691,633C697,665 700,703 700,748C700,840 686,908 658,952C630,996 583,1018 516,1018C450,1018 403,996 375,951C346,906 332,837 332,745z"/>
+<glyph unicode="i" horiz-adv-x="655" d="M74,86C97,86 118,88 139,91C159,94 177,100 192,109C207,118 220,132 229,151C238,169 242,193 242,223l0,649C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l366,0l0,-865C434,201 439,175 448,156C457,137 469,122 484,112C499,101 516,94 537,91C558,88 579,86 602,86l27,0l0,-86l-582,0l0,86M213,1430C213,1454 216,1474 222,1490C228,1506 236,1519 247,1529C258,1539 270,1546 284,1550C298,1554 313,1556 330,1556C346,1556 361,1554 375,1550C389,1546 401,1539 412,1529C422,1519 430,1506 437,1490C443,1474 446,1454 446,1430C446,1406 443,1386 437,1370C430,1354 422,1341 412,1331C401,1321 389,1314 375,1310C361,1305 346,1303 330,1303C313,1303 298,1305 284,1310C270,1314 258,1321 247,1331C236,1341 228,1354 222,1370C216,1386 213,1406 213,1430z"/>
+<glyph unicode="l" horiz-adv-x="635" d="M53,86C76,86 98,88 119,91C139,94 157,101 172,112C187,122 199,137 208,156C217,175 221,201 221,233l0,1098C221,1361 217,1385 208,1404C199,1422 186,1436 171,1446C156,1456 138,1463 118,1466C97,1469 76,1470 53,1470l-26,0l0,86l387,0l0,-1323C414,201 418,175 427,156C436,137 448,122 463,112C478,101 496,94 517,91C537,88 559,86 582,86l26,0l0,-86l-581,0l0,86z"/>
+<glyph unicode="m" horiz-adv-x="1935" d="M608,86l0,-86l-551,0l0,86l27,0C107,86 129,88 148,91C167,94 184,101 198,112C212,122 223,137 231,156C238,175 242,201 242,233l0,639C242,902 238,926 230,945C222,963 211,977 197,987C183,997 166,1004 147,1007C128,1010 107,1012 84,1012l-6,0l0,86l321,0l27,-166l10,0C457,970 478,1001 501,1026C524,1050 548,1069 574,1083C599,1096 626,1106 655,1111C683,1116 713,1118 745,1118C778,1118 810,1115 840,1108C870,1101 898,1091 924,1076C949,1061 972,1042 993,1019C1013,995 1029,966 1042,932l17,0C1080,970 1102,1001 1126,1026C1150,1050 1176,1069 1203,1083C1230,1096 1258,1106 1288,1111C1317,1116 1348,1118 1380,1118C1432,1118 1479,1110 1520,1095C1561,1079 1596,1055 1625,1023C1654,990 1676,949 1691,898C1706,847 1714,787 1714,717l0,-484C1714,201 1718,175 1726,156C1734,137 1745,122 1759,112C1773,101 1790,94 1809,91C1828,88 1849,86 1872,86l6,0l0,-86l-356,0l0,707C1522,752 1518,791 1511,826C1503,861 1491,890 1474,914C1457,938 1434,956 1407,969C1380,981 1346,987 1307,987C1264,987 1229,979 1200,963C1171,946 1147,924 1129,896C1111,868 1098,836 1091,799C1083,762 1079,723 1079,682l0,-449C1079,201 1083,175 1091,156C1099,137 1110,122 1124,112C1138,101 1155,94 1174,91C1193,88 1214,86 1237,86l6,0l0,-86l-356,0l0,707C887,752 883,791 876,826C868,861 856,890 839,914C822,938 799,956 772,969C745,981 711,987 672,987C627,987 590,978 560,960C529,942 505,918 486,887C467,856 454,821 446,781C438,741 434,699 434,655l0,-432C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86z"/>
+<glyph unicode="n" horiz-adv-x="1321" d="M608,86l0,-86l-551,0l0,86l17,0C97,86 119,88 140,91C160,94 178,101 193,112C208,122 220,137 229,156C238,175 242,201 242,233l0,639C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l331,0l27,-166l10,0C457,970 480,1001 504,1026C527,1050 552,1069 579,1083C605,1096 633,1106 663,1111C692,1116 723,1118 756,1118C810,1118 858,1110 901,1095C943,1079 979,1055 1009,1023C1038,990 1061,949 1077,898C1092,847 1100,787 1100,717l0,-484C1100,201 1104,175 1112,156C1119,137 1130,122 1144,112C1158,101 1175,94 1194,91C1213,88 1234,86 1257,86l7,0l0,-86l-357,0l0,707C907,752 903,791 895,826C887,861 874,890 857,914C839,938 816,956 787,969C758,981 723,987 682,987C635,987 596,978 565,960C533,942 507,918 488,887C469,856 455,821 447,781C438,741 434,699 434,655l0,-432C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86z"/>
+<glyph unicode="o" horiz-adv-x="1182" d="M1069,551C1069,358 1028,215 947,121C865,27 745,-20 588,-20C514,-20 448,-8 389,15C330,38 281,74 240,121C199,168 167,228 146,300C124,371 113,455 113,551C113,742 154,885 235,978C316,1071 435,1118 594,1118C668,1118 734,1107 793,1084C852,1061 902,1026 943,979C984,932 1015,873 1037,802C1058,731 1069,647 1069,551M311,551C311,475 316,408 326,350C336,292 352,244 375,205C397,166 426,136 462,116C497,96 541,86 592,86C643,86 687,96 722,116C757,136 786,166 808,205C830,244 846,292 856,350C865,408 870,475 870,551C870,627 865,694 855,751C845,808 829,856 807,895C785,933 756,962 721,981C685,1000 641,1010 590,1010C539,1010 495,1000 460,981C425,962 396,933 374,895C352,856 336,808 326,751C316,694 311,627 311,551z"/>
+<glyph unicode="p" horiz-adv-x="1257" d="M692,987C639,987 594,978 559,961C523,943 494,916 473,880C452,844 437,799 428,744C419,689 414,625 414,551C414,480 419,417 428,362C437,307 452,261 474,224C495,187 524,159 560,140C595,121 640,111 694,111C739,111 778,121 810,140C841,159 867,187 888,224C908,261 923,308 932,363C941,418 946,481 946,553C946,626 941,689 932,744C923,798 908,843 888,879C867,915 841,942 809,960C776,978 737,987 692,987M1145,551C1145,452 1136,367 1118,295C1099,223 1072,164 1037,117C1002,70 958,36 906,14C854,-9 794,-20 727,-20C688,-20 652,-16 620,-7C588,2 559,14 534,30C508,46 485,65 466,87C446,109 429,133 414,160l-8,0C407,125 409,92 410,61C411,48 411,35 412,22C412,8 412,-5 413,-17C413,-29 413,-40 414,-49C414,-59 414,-67 414,-72l0,-196C414,-298 419,-322 428,-340C437,-359 449,-373 464,-382C479,-392 497,-398 518,-401C538,-404 559,-406 582,-406l6,0l0,-86l-551,0l0,86l16,0C76,-406 98,-404 119,-401C139,-398 157,-391 172,-380C187,-370 199,-355 208,-335C217,-316 221,-290 221,-258l0,1130C221,902 217,926 208,945C199,963 186,977 171,987C156,997 138,1004 118,1007C97,1010 76,1012 53,1012l-26,0l0,86l358,0l21,-185l8,0C429,944 447,973 466,998C485,1023 508,1045 533,1063C558,1080 587,1094 619,1104C651,1113 687,1118 727,1118C794,1118 854,1107 906,1085C958,1062 1002,1028 1037,982C1072,935 1099,876 1118,805C1136,734 1145,649 1145,551z"/>
+<glyph unicode="q" horiz-adv-x="1257" d="M1221,-492l-613,0l0,86l68,0C699,-406 721,-404 742,-401C762,-398 780,-391 795,-380C810,-370 822,-355 831,-335C840,-316 844,-290 844,-258l0,176C844,-59 844,-32 845,-1C846,29 847,58 848,86C849,118 851,151 852,184l-8,0C829,153 811,125 792,100C772,75 749,53 724,36C699,18 670,4 638,-5C606,-15 570,-20 530,-20C463,-20 403,-9 351,14C299,36 255,70 220,117C185,163 158,222 140,293C122,364 113,449 113,547C113,646 122,731 140,803C158,875 185,934 220,981C255,1028 299,1062 351,1085C403,1107 463,1118 530,1118C569,1118 605,1114 637,1105C669,1096 698,1084 724,1068C749,1052 772,1033 792,1011C812,989 829,965 844,938l12,0l37,160l328,0l0,-86l-17,0C1181,1012 1160,1010 1139,1007C1118,1004 1101,997 1086,987C1071,976 1059,961 1050,942C1041,922 1036,896 1036,864l0,-1130C1036,-296 1041,-320 1050,-338C1059,-357 1071,-371 1086,-381C1101,-391 1119,-398 1140,-401C1160,-404 1181,-406 1204,-406l17,0M565,111C618,111 663,120 699,138C734,155 763,182 785,218C806,254 822,299 831,354C840,409 844,473 844,547C844,618 840,681 831,736C822,791 806,837 785,874C763,911 734,939 698,958C662,977 617,987 563,987C518,987 480,977 448,958C416,939 390,910 370,873C349,836 334,790 325,735C316,680 311,616 311,545C311,400 331,291 370,219C409,147 474,111 565,111z"/>
+<glyph unicode="r" horiz-adv-x="965" d="M659,0l-591,0l0,86l6,0C97,86 119,88 140,91C160,94 178,101 193,112C208,122 220,137 229,156C238,175 242,201 242,233l0,639C242,902 238,926 229,945C220,963 207,977 192,987C177,997 159,1004 139,1007C118,1010 97,1012 74,1012l-6,0l0,86l315,0l39,-203l10,0C445,926 459,955 473,982C487,1009 504,1032 525,1053C545,1073 570,1089 600,1101C630,1112 668,1118 713,1118C788,1118 843,1105 880,1079C916,1053 934,1016 934,969C934,948 931,928 924,910C917,892 905,877 890,864C875,851 855,841 831,834C807,827 778,823 743,823C743,880 735,921 719,946C703,971 675,983 635,983C610,983 587,976 567,962C547,947 530,928 515,905C500,881 487,854 477,823C466,792 458,761 452,729C445,696 441,664 438,632C435,600 434,571 434,545l0,-322C434,193 439,169 448,151C457,132 469,118 484,109C499,100 517,94 538,91C558,88 579,86 602,86l57,0z"/>
+<glyph unicode="s" horiz-adv-x="924" d="M430,-20C379,-20 332,-15 291,-6C249,3 213,16 184,35C155,53 132,76 116,103C100,130 92,161 92,197C92,224 97,247 106,266C115,284 126,298 139,309C152,320 166,327 181,332C196,336 209,338 221,338C221,302 225,268 232,237C239,206 252,178 269,155C286,131 309,112 338,99C366,85 401,78 442,78C479,78 511,83 539,92C567,101 591,113 610,130C629,146 643,166 653,189C663,212 668,237 668,264C668,289 664,311 657,330C649,348 636,365 617,381C598,397 572,413 539,430C506,447 465,466 416,487C363,510 318,533 279,555C240,576 207,600 182,625C157,650 138,679 125,712C112,744 106,782 106,827C106,874 115,915 134,951C152,987 178,1017 212,1042C246,1066 287,1084 334,1097C381,1110 434,1116 492,1116C541,1116 584,1111 621,1101C658,1091 690,1078 715,1061C740,1044 759,1024 772,1001C785,978 791,953 791,928C791,891 778,861 753,839C727,816 690,805 643,805C643,874 629,927 601,965C572,1003 528,1022 467,1022C432,1022 403,1018 378,1010C353,1002 333,991 318,976C302,961 290,944 283,924C276,904 272,882 272,858C272,832 277,810 286,791C295,772 310,754 331,738C351,722 377,707 410,692C442,677 481,660 526,641C580,618 626,596 665,574C704,552 736,528 761,502C786,476 804,447 816,414C828,381 834,344 834,301C834,248 824,201 805,161C786,121 758,88 723,61C688,34 645,13 596,0C546,-13 491,-20 430,-20z"/>
+<glyph unicode="t" horiz-adv-x="721" d="M543,88C568,88 590,89 611,92C632,95 653,98 674,102l0,-90C665,8 654,4 640,0C626,-4 611,-7 595,-10C578,-13 561,-16 543,-17C525,-19 508,-20 492,-20C440,-20 395,-14 358,-3C321,8 290,25 266,50C242,75 224,107 213,148C201,189 195,238 195,297l0,684l-156,0l0,82C64,1063 91,1068 121,1078C150,1088 176,1105 199,1128C222,1153 241,1184 256,1219C270,1254 282,1297 293,1350l94,0l0,-252l268,0l0,-117l-268,0l0,-690C387,221 401,170 430,137C458,104 496,88 543,88z"/>
+<glyph unicode="u" horiz-adv-x="1300" d="M1079,223C1079,193 1084,169 1093,151C1102,132 1114,118 1129,109C1144,100 1162,94 1183,91C1203,88 1224,86 1247,86l6,0l0,-86l-325,0l-27,166l-10,0C870,127 848,96 823,72C798,48 771,29 743,16C715,2 686,-7 655,-12C624,-17 592,-20 559,-20C505,-20 457,-12 415,3C373,18 338,42 309,75C280,108 259,149 244,200C229,251 221,311 221,381l0,491C221,902 217,926 208,945C199,963 186,977 171,987C156,997 138,1004 118,1007C97,1010 76,1012 53,1012l-6,0l0,86l367,0l0,-707C414,346 418,307 425,272C432,237 443,208 460,184C476,160 498,142 526,130C553,117 588,111 629,111C674,111 713,119 746,135C778,151 805,174 826,203C847,232 862,266 872,307C882,348 887,393 887,442l0,422C887,896 883,922 874,942C865,961 853,976 838,987C823,997 805,1004 785,1007C764,1010 742,1012 719,1012l-6,0l0,86l366,0z"/>
+<glyph unicode="v" horiz-adv-x="1186" d="M8,1012l0,86l512,0l0,-86l-26,0C453,1012 422,1004 402,988C381,972 371,947 371,913C371,902 372,890 375,879C378,867 382,853 387,838l139,-387C535,427 544,401 553,372C562,343 571,314 580,286C588,258 595,232 602,207C609,182 613,160 616,143l7,0C626,158 632,176 640,198C647,219 656,243 666,269C675,294 685,320 696,347C706,374 716,399 725,424l147,399C879,840 884,856 887,871C890,886 891,900 891,911C891,946 880,972 858,988C835,1004 801,1012 756,1012l-15,0l0,86l439,0l0,-86l-25,0C1135,1012 1118,1010 1104,1006C1090,1001 1077,993 1066,981C1055,969 1044,953 1034,932C1023,911 1012,885 999,852l-323,-852l-187,0l-329,903C152,924 144,942 135,956C126,970 116,981 105,990C94,998 81,1004 66,1007C51,1010 34,1012 14,1012z"/>
+<glyph unicode="—" horiz-adv-x="2048" d="M2058,489l-2068,0l0,121l2068,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Droid is a trademark of Google and may be registered in certain jurisdictions. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="DroidSerif-Bold" units-per-em="2048" underline-position="-154" underline-thickness="102"/>
+<missing-glyph horiz-adv-x="1229" d="M193,1462l841,0l0,-1462l-841,0M297,104l633,0l0,1254l-633,0z"/>
+<glyph unicode=" " horiz-adv-x="532"/>
+<glyph unicode="," horiz-adv-x="602" d="M459,86C459,43 452,1 439,-40C426,-81 404,-118 375,-153C346,-188 308,-219 262,-246C215,-274 159,-297 92,-315l0,106C122,-198 148,-188 171,-177C193,-166 212,-155 227,-142C242,-130 253,-116 261,-101C268,-86 272,-69 272,-49C272,-36 268,-26 261,-17C254,-9 245,-1 234,6C223,13 211,21 198,29C185,36 173,46 162,58C151,70 141,85 134,103C127,120 123,143 123,170C123,216 137,251 165,275C193,299 228,311 270,311C328,311 374,291 408,251C442,211 459,156 459,86z"/>
+<glyph unicode="A" horiz-adv-x="1542" d="M446,481l-59,-176C382,288 376,269 371,247C365,224 362,205 362,188C362,175 365,163 370,153C375,143 382,135 391,129C400,122 410,117 421,114C432,111 443,109 455,109l86,0l0,-109l-533,0l0,109l25,0C51,109 68,111 83,115C98,119 112,127 125,138C138,149 150,164 162,183C173,202 185,227 197,258l444,1204l281,0l428,-1206C1360,227 1371,204 1382,185C1393,166 1405,151 1418,140C1431,129 1444,121 1459,116C1474,111 1489,109 1505,109l37,0l0,-109l-676,0l0,109l80,0C956,109 966,111 977,114C988,117 997,121 1006,128C1014,134 1021,142 1026,152C1031,162 1034,174 1034,188C1034,205 1032,221 1028,236C1024,251 1020,265 1016,276l-72,205M795,942C788,965 780,990 773,1016C765,1041 757,1067 750,1094C742,1121 735,1147 728,1174C721,1200 714,1225 709,1249C703,1228 696,1206 688,1181C680,1156 672,1131 663,1105C654,1079 645,1053 636,1027C627,1001 618,976 610,952l-121,-346l414,0z"/>
+<glyph unicode="C" horiz-adv-x="1368" d="M870,143C920,143 965,149 1004,161C1043,172 1077,187 1108,206C1139,225 1166,246 1189,269C1212,292 1232,315 1249,338C1260,330 1268,318 1275,301C1281,284 1284,267 1284,250C1284,221 1276,191 1261,160C1246,128 1220,99 1184,72C1148,45 1100,23 1041,6C982,-11 908,-20 821,-20C702,-20 599,-2 510,34C421,70 348,121 289,187C230,253 186,332 157,425C128,518 113,620 113,733C113,844 128,945 158,1037C188,1129 233,1208 292,1274C351,1340 424,1391 513,1428C601,1465 703,1483 819,1483C898,1483 966,1477 1025,1465C1083,1452 1131,1435 1170,1414C1209,1393 1238,1368 1257,1339C1276,1310 1286,1278 1286,1245C1286,1220 1281,1196 1270,1175C1259,1153 1242,1134 1221,1118C1199,1102 1172,1090 1140,1081C1108,1072 1071,1067 1030,1067C1030,1101 1026,1135 1019,1169C1012,1202 999,1233 982,1260C964,1287 941,1310 912,1327C883,1344 848,1352 805,1352C740,1352 686,1338 641,1311C596,1284 561,1244 534,1191C507,1138 487,1074 475,997C463,920 457,832 457,733C457,634 464,548 479,474C494,400 517,339 550,290C583,241 625,204 678,180C730,155 794,143 870,143z"/>
+<glyph unicode="D" horiz-adv-x="1571" d="M1458,758C1458,646 1443,544 1412,451C1381,358 1336,278 1275,211C1214,144 1138,93 1048,56C957,19 852,0 733,0l-676,0l0,109l86,0C158,109 172,111 185,114C198,117 209,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,987C248,1256 245,1278 240,1295C235,1311 227,1323 218,1332C208,1341 197,1347 184,1350C171,1353 158,1354 143,1354l-86,0l0,108l676,0C846,1462 948,1447 1038,1418C1127,1388 1203,1344 1266,1285C1328,1226 1376,1152 1409,1064C1442,976 1458,874 1458,758M1112,758C1112,953 1076,1099 1005,1194C933,1289 827,1337 688,1337l-117,0l0,-1210l115,0C756,127 818,142 871,171C924,200 969,241 1005,296C1040,351 1067,417 1085,495C1103,572 1112,660 1112,758z"/>
+<glyph unicode="G" horiz-adv-x="1575" d="M866,-20C739,-20 629,-2 535,34C440,70 362,121 299,187C236,253 190,332 159,425C128,518 113,620 113,733C113,844 129,945 162,1037C195,1129 243,1208 307,1274C371,1340 451,1391 546,1428C641,1465 752,1483 877,1483C962,1483 1037,1477 1101,1465C1164,1452 1218,1435 1261,1414C1304,1393 1336,1368 1357,1339C1378,1310 1389,1278 1389,1245C1389,1221 1383,1199 1372,1178C1361,1157 1344,1138 1321,1122C1298,1106 1271,1094 1238,1085C1205,1076 1167,1071 1124,1071C1124,1112 1119,1150 1109,1185C1099,1220 1084,1249 1063,1274C1042,1299 1015,1318 983,1332C951,1345 913,1352 870,1352C795,1352 732,1338 680,1311C627,1284 585,1244 552,1191C519,1138 495,1074 480,997C465,920 457,832 457,733C457,634 465,547 481,471C496,394 522,330 557,278C592,226 637,187 693,160C748,133 816,119 897,119C922,119 948,120 973,122C998,124 1023,128 1047,133l0,301C1047,489 1035,527 1010,548C985,569 949,580 901,580l-27,0l0,108l644,0l0,-108l-27,0C1470,580 1452,578 1437,573C1422,568 1409,559 1399,547C1389,535 1382,519 1377,500C1372,480 1370,455 1370,426l0,-336C1290,53 1209,26 1128,8C1047,-11 959,-20 866,-20z"/>
+<glyph unicode="H" horiz-adv-x="1677" d="M913,0l0,109l88,0C1016,109 1029,111 1042,114C1055,117 1066,123 1076,132C1085,141 1093,155 1098,172C1103,189 1106,213 1106,242l0,458l-535,0l0,-458C571,213 574,189 580,172C585,155 593,141 602,132C611,123 622,117 635,114C648,111 661,109 676,109l88,0l0,-109l-707,0l0,109l86,0C158,109 171,111 184,114C197,117 208,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,986C248,1255 245,1277 240,1294C234,1310 226,1322 217,1331C207,1340 196,1346 183,1349C170,1352 157,1353 143,1353l-86,0l0,109l707,0l0,-109l-88,0C661,1353 648,1352 635,1349C622,1346 611,1339 602,1330C593,1321 585,1307 580,1290C574,1273 571,1249 571,1220l0,-395l535,0l0,395C1106,1249 1103,1273 1098,1290C1093,1307 1085,1321 1076,1330C1066,1339 1055,1346 1042,1349C1029,1352 1016,1353 1001,1353l-88,0l0,109l707,0l0,-109l-86,0C1520,1353 1507,1352 1494,1349C1481,1346 1470,1339 1461,1330C1451,1321 1443,1307 1438,1290C1433,1273 1430,1249 1430,1220l0,-989C1430,204 1433,183 1439,167C1444,150 1452,138 1462,130C1471,121 1482,116 1495,113C1507,110 1520,109 1534,109l86,0l0,-109z"/>
+<glyph unicode="I" horiz-adv-x="821" d="M57,0l0,109l86,0C158,109 172,111 185,114C198,117 209,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,978C248,1249 245,1273 240,1290C235,1307 227,1321 218,1330C209,1339 198,1346 185,1349C172,1352 158,1353 143,1353l-86,0l0,109l707,0l0,-109l-86,0C663,1353 650,1352 637,1349C624,1346 612,1339 603,1330C594,1321 586,1307 581,1290C576,1273 573,1249 573,1220l0,-978C573,213 576,189 581,172C586,155 594,141 603,132C612,123 624,117 637,114C650,111 663,109 678,109l86,0l0,-109z"/>
+<glyph unicode="N" horiz-adv-x="1614" d="M1200,0l-799,1128l0,-886C401,213 404,189 410,172C415,155 423,141 432,132C441,123 453,117 466,114C479,111 492,109 506,109l86,0l0,-109l-535,0l0,109l86,0C158,109 171,111 184,114C197,117 208,123 218,132C227,141 235,155 240,172C245,189 248,213 248,242l0,987C248,1256 245,1278 240,1295C234,1311 226,1323 217,1332C207,1341 196,1347 183,1350C170,1353 157,1354 143,1354l-86,0l0,108l455,0l723,-1022l0,789C1235,1256 1232,1278 1227,1295C1221,1311 1213,1323 1204,1332C1194,1341 1183,1347 1170,1350C1157,1353 1144,1354 1130,1354l-86,0l0,108l535,0l0,-108l-86,0C1479,1354 1466,1353 1453,1350C1440,1347 1429,1340 1420,1331C1410,1322 1402,1308 1397,1291C1392,1274 1389,1250 1389,1221l0,-1221z"/>
+<glyph unicode="O" horiz-adv-x="1612" d="M1499,733C1499,620 1484,518 1454,425C1423,332 1379,253 1320,187C1261,121 1188,70 1103,34C1017,-2 918,-20 807,-20C690,-20 589,-2 502,34C415,70 342,121 285,187C228,253 185,333 156,426C127,519 113,622 113,735C113,848 127,951 156,1044C185,1136 228,1215 286,1280C343,1345 416,1396 503,1432C590,1467 692,1485 809,1485C920,1485 1018,1467 1104,1432C1189,1396 1261,1345 1320,1280C1379,1214 1423,1135 1454,1043C1484,950 1499,847 1499,733M457,733C457,635 463,548 476,471C489,394 509,330 537,277C565,224 601,183 646,155C690,127 744,113 807,113C871,113 925,127 970,155C1014,183 1050,224 1077,277C1104,330 1124,394 1137,471C1149,548 1155,635 1155,733C1155,831 1149,918 1137,995C1124,1072 1104,1137 1077,1190C1050,1243 1014,1283 970,1311C926,1338 872,1352 809,1352C745,1352 691,1338 646,1311C601,1283 565,1243 537,1190C509,1137 489,1072 476,995C463,918 457,831 457,733z"/>
+<glyph unicode="S" horiz-adv-x="1200" d="M541,-20C449,-20 372,-11 311,6C250,23 201,46 164,73C127,100 100,131 85,165C69,199 61,233 61,266C61,301 68,331 81,355C94,379 111,399 133,414C154,429 179,440 207,447C234,454 263,457 293,457C293,398 300,347 314,303C328,258 347,221 372,192C397,162 426,140 461,125C495,110 532,102 573,102C613,102 649,108 680,119C711,130 738,146 760,166C782,186 799,210 810,237C821,264 827,293 827,324C827,359 820,390 806,417C792,444 771,469 743,492C714,515 679,537 636,558C593,579 542,601 485,625C414,654 354,685 305,716C256,747 216,780 186,816C156,852 135,891 122,933C109,975 102,1021 102,1071C102,1134 115,1190 140,1241C165,1292 200,1335 245,1371C290,1407 343,1435 404,1454C465,1473 532,1483 604,1483C679,1483 744,1477 799,1465C854,1452 899,1435 935,1414C970,1393 997,1368 1014,1339C1031,1310 1040,1278 1040,1245C1040,1221 1035,1199 1025,1178C1014,1157 999,1139 978,1124C957,1109 930,1097 899,1088C867,1079 830,1075 788,1075C788,1104 784,1135 777,1168C769,1201 756,1231 739,1260C722,1288 699,1311 672,1330C644,1349 610,1358 571,1358C544,1358 518,1354 493,1346C468,1338 447,1326 429,1310C410,1294 396,1274 385,1251C374,1227 369,1200 369,1169C369,1140 374,1113 383,1088C392,1063 410,1038 435,1014C460,989 494,965 538,941C581,916 638,890 707,862C777,833 837,804 886,774C935,744 976,712 1008,678C1039,643 1062,606 1077,565C1091,524 1098,478 1098,428C1098,362 1085,302 1059,247C1033,192 996,144 947,105C898,66 840,35 772,13C703,-9 626,-20 541,-20z"/>
+<glyph unicode="T" horiz-adv-x="1337" d="M831,242C831,213 834,189 839,172C844,155 852,141 862,132C871,123 882,117 895,114C908,111 921,109 936,109l86,0l0,-109l-707,0l0,109l86,0C416,109 430,111 443,114C456,117 467,123 476,132C485,141 493,155 498,172C503,189 506,213 506,242l0,1095l-164,0C311,1337 286,1334 265,1327C244,1320 228,1311 215,1299C202,1286 192,1271 186,1253C179,1235 175,1215 172,1192l-14,-127l-138,0l11,397l1276,0l10,-397l-137,0l-15,127C1162,1215 1158,1235 1152,1253C1145,1271 1136,1286 1123,1299C1110,1311 1093,1320 1072,1327C1051,1334 1026,1337 995,1337l-164,0z"/>
+<glyph unicode="W" horiz-adv-x="2185" d="M1237,1448l283,-782C1532,634 1543,602 1554,569C1564,536 1573,504 1582,474C1591,444 1598,416 1605,391C1612,366 1617,344 1620,326C1625,351 1631,378 1637,408C1643,438 1650,470 1657,503C1664,536 1671,569 1679,604C1686,639 1694,672 1702,705l108,442C1812,1155 1814,1164 1817,1175C1819,1186 1821,1196 1823,1207C1825,1217 1827,1227 1828,1236C1829,1245 1829,1252 1829,1257C1829,1292 1819,1317 1798,1332C1777,1347 1743,1354 1698,1354l-47,0l0,108l534,0l0,-108l-39,0C2126,1354 2108,1352 2093,1348C2078,1344 2064,1336 2052,1325C2040,1313 2029,1297 2020,1276C2010,1255 2000,1228 1991,1194l-318,-1194l-233,0l-344,961l-295,-961l-254,0l-375,1245C166,1266 159,1284 150,1298C141,1312 131,1323 120,1332C108,1340 95,1346 80,1349C65,1352 47,1354 27,1354l-27,0l0,108l684,0l0,-108l-47,0C596,1354 565,1346 545,1330C524,1314 514,1289 514,1255C514,1244 516,1227 521,1206C525,1184 530,1164 535,1145l137,-473C679,646 687,618 696,588C704,557 712,527 719,496C726,465 733,435 739,406C745,377 749,352 752,330C761,374 772,415 783,454C794,492 805,531 817,571l270,877z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Bold" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="500"/>
+<glyph unicode=" " horiz-adv-x="500"/>
+<glyph unicode="(" horiz-adv-x="692" d="M87,621C87,887 137,1104 238,1273C338,1442 465,1551 620,1602l6,-1l51,-141C564,1400 477,1304 416,1171C355,1038 325,856 325,623l0,-91C325,299 355,116 416,-17C477,-150 564,-247 677,-308l-51,-137l-6,-1C465,-395 338,-286 238,-118C137,50 87,267 87,534z"/>
+<glyph unicode=")" horiz-adv-x="694" d="M603,534C603,275 552,59 451,-113C350,-285 223,-396 70,-446l-6,1l-51,137C122,-247 205,-150 264,-17C323,116 352,299 352,532l0,91C352,856 323,1040 264,1173C205,1306 122,1403 13,1464l51,137l6,1C223,1552 350,1441 451,1269C552,1097 603,881 603,621z"/>
+<glyph unicode="," horiz-adv-x="580" d="M423,-8l-100,-282l-180,0l0,530l280,0z"/>
+<glyph unicode="." horiz-adv-x="578" d="M420,0l-280,0l0,246l280,0z"/>
+<glyph unicode="B" horiz-adv-x="1273" d="M130,0l0,1400l467,0C764,1400 894,1368 988,1304C1081,1239 1128,1143 1128,1016C1128,953 1111,896 1077,846C1043,795 994,757 929,731C1018,714 1085,676 1130,616C1175,556 1198,486 1198,407C1198,274 1153,173 1063,104C973,35 846,0 683,0M410,620l0,-404l273,0C760,216 818,232 858,265C898,297 918,345 918,408C918,473 899,525 862,562C824,599 767,618 692,620l-12,0M410,813l210,0C693,814 749,831 789,862C828,893 848,937 848,994C848,1059 827,1106 785,1137C743,1168 680,1183 597,1183l-187,0z"/>
+<glyph unicode="D" horiz-adv-x="1327" d="M132,0l0,1400l494,0C801,1400 946,1345 1059,1236C1172,1127 1228,986 1228,815l0,-231C1228,412 1172,272 1059,163C946,54 801,0 626,0M411,1183l0,-967l215,0C723,216 801,250 860,319C919,388 948,476 948,584l0,233C948,924 919,1011 860,1080C801,1149 723,1183 626,1183z"/>
+<glyph unicode="E" horiz-adv-x="1110" d="M943,615l-533,0l0,-399l633,0l0,-216l-913,0l0,1400l910,0l0,-217l-630,0l0,-351l533,0z"/>
+<glyph unicode="I" horiz-adv-x="583" d="M431,0l-279,0l0,1400l279,0z"/>
+<glyph unicode="L" horiz-adv-x="1110" d="M411,216l644,0l0,-216l-924,0l0,1400l280,0z"/>
+<glyph unicode="N" horiz-adv-x="1412" d="M1280,0l-280,0l-583,954l-6,-2l0,-952l-279,0l0,1400l279,0l583,-952l6,2l0,950l280,0z"/>
+<glyph unicode="O" horiz-adv-x="1377" d="M1283,574C1283,402 1228,260 1117,148C1006,36 863,-20 686,-20C510,-20 367,36 258,148C149,260 94,402 94,574l0,252C94,997 149,1138 258,1251C367,1364 510,1420 685,1420C862,1420 1006,1364 1117,1251C1228,1138 1283,997 1283,826M1003,828C1003,937 975,1026 918,1096C861,1166 784,1201 685,1201C587,1201 511,1166 456,1097C401,1027 374,937 374,828l0,-254C374,463 402,373 457,303C512,233 588,198 686,198C785,198 863,233 919,303C975,373 1003,463 1003,574z"/>
+<glyph unicode="P" horiz-adv-x="1273" d="M410,488l0,-488l-280,0l0,1400l546,0C838,1400 966,1358 1061,1273C1155,1188 1202,1078 1202,944C1202,809 1155,700 1061,615C966,530 838,488 676,488M410,705l266,0C757,705 818,728 860,773C901,818 922,875 922,942C922,1010 901,1067 860,1114C818,1160 757,1183 676,1183l-266,0z"/>
+<glyph unicode="R" horiz-adv-x="1273" d="M410,560l0,-560l-280,0l0,1400l500,0C792,1400 919,1364 1010,1291C1101,1218 1147,1117 1147,987C1147,914 1128,852 1090,800C1051,748 995,706 921,673C1004,648 1063,608 1100,551C1137,494 1155,424 1155,341l0,-104C1155,198 1161,158 1172,115C1183,72 1201,41 1226,20l0,-20l-288,0C912,21 895,55 888,102C880,149 876,195 876,239l0,100C876,408 856,463 817,502C778,541 722,560 651,560M410,777l214,0C707,777 768,794 808,827C847,860 867,909 867,974C867,1038 847,1089 807,1127C767,1164 708,1183 630,1183l-220,0z"/>
+<glyph unicode="S" horiz-adv-x="1250" d="M881,372C881,425 863,467 826,498C789,529 722,559 624,588C463,635 342,692 261,758C180,824 140,915 140,1030C140,1145 185,1239 275,1312C365,1384 484,1420 631,1420C788,1420 912,1381 1004,1304C1096,1226 1140,1123 1137,996l-2,-6l-271,0C864,1061 844,1114 804,1151C764,1188 705,1206 628,1206C557,1206 505,1190 471,1158C437,1125 420,1082 420,1029C420,980 439,941 478,911C516,880 585,849 686,816C843,772 962,716 1042,648C1121,580 1161,489 1161,374C1161,253 1114,158 1021,87C927,16 803,-20 648,-20C497,-20 367,18 260,93C152,168 100,279 103,427l2,6l271,0C376,350 400,290 449,251C498,212 564,193 648,193C725,193 783,209 822,242C861,275 881,318 881,372z"/>
+<glyph unicode="T" horiz-adv-x="1152" d="M1127,1183l-412,0l0,-1183l-280,0l0,1183l-407,0l0,217l1099,0z"/>
+<glyph unicode="U" horiz-adv-x="1350" d="M1239,1400l0,-916C1239,325 1187,202 1083,113C979,24 843,-20 674,-20C507,-20 372,24 269,113C166,202 114,325 114,484l0,916l280,0l0,-916C394,390 419,319 469,270C518,221 587,196 674,196C763,196 833,221 884,270C934,319 959,390 959,484l0,916z"/>
+<glyph unicode="W" horiz-adv-x="1762" d="M1255,430l6,0l192,970l289,0l-334,-1400l-266,0l-259,916l-6,0l-257,-916l-267,0l-334,1400l289,0l193,-969l6,0l259,969l229,0z"/>
+<glyph unicode="a" horiz-adv-x="1070" d="M722,0C713,21 705,45 699,71C692,96 688,123 685,152C657,102 619,61 572,29C524,-4 467,-20 400,-20C289,-20 204,8 144,64C84,120 54,196 54,293C54,395 94,474 174,530C253,586 369,614 522,614l159,0l0,83C681,748 668,787 641,814C614,841 574,855 521,855C474,855 438,844 413,822C388,800 375,770 375,731l-270,0l-2,6C98,825 137,901 218,965C299,1028 406,1060 539,1060C665,1060 767,1029 845,966C922,903 961,812 961,695l0,-430C961,217 965,171 972,128C979,85 991,42 1007,0M468,188C519,188 563,200 602,224C641,248 667,276 681,308l0,147l-160,0C459,455 412,440 381,411C350,382 334,346 334,303C334,268 346,241 370,220C393,199 426,188 468,188z"/>
+<glyph unicode="b" horiz-adv-x="1130" d="M1064,491C1064,336 1029,213 958,120C887,27 784,-20 651,-20C588,-20 534,-7 488,19C441,45 402,83 370,132l-24,-132l-236,0l0,1500l280,0l0,-571C421,971 458,1003 501,1026C544,1049 593,1060 649,1060C784,1060 887,1010 958,910C1029,810 1064,677 1064,511M784,511C784,612 768,693 737,752C706,811 653,841 578,841C533,841 495,832 464,813C433,794 408,768 390,734l0,-436C407,265 432,241 464,224C495,207 534,198 580,198C655,198 708,224 739,275C769,326 784,398 784,491z"/>
+<glyph unicode="c" horiz-adv-x="1042" d="M551,196C602,196 643,211 674,240C705,269 721,307 721,355l254,0l3,-6C981,244 941,157 858,86C775,15 672,-20 551,-20C396,-20 276,29 191,128C105,227 62,352 62,505l0,29C62,686 105,812 191,911C276,1010 396,1060 550,1060C679,1060 784,1023 863,950C942,877 981,781 978,662l-2,-6l-255,0C721,709 706,754 675,790C644,825 603,843 550,843C476,843 423,814 390,756C357,697 341,623 341,534l0,-29C341,414 357,339 390,282C422,225 476,196 551,196z"/>
+<glyph unicode="d" horiz-adv-x="1130" d="M66,511C66,676 102,808 175,909C247,1010 349,1060 480,1060C533,1060 582,1049 625,1026C668,1003 705,971 737,929l0,571l280,0l0,-1500l-237,0l-25,129C722,80 682,43 636,18C590,-7 537,-20 478,-20C347,-20 246,27 174,121C102,214 66,338 66,491M346,491C346,400 362,329 394,277C426,224 478,198 549,198C592,198 629,207 660,224C691,241 717,265 737,297l0,438C717,768 692,794 661,813C630,832 593,841 551,841C480,841 428,811 395,750C362,689 346,610 346,511z"/>
+<glyph unicode="e" horiz-adv-x="1043" d="M571,-20C411,-20 286,28 196,123C106,218 61,341 61,491l0,38C61,684 105,812 192,912C279,1011 398,1061 549,1060C686,1060 794,1018 871,935C948,852 986,738 986,593l0,-148l-635,0l-2,-6C352,367 374,309 415,264C456,219 518,196 599,196C658,196 709,202 750,213C791,224 835,241 883,264l69,-177C913,58 860,33 793,12C726,-9 652,-20 571,-20M549,843C490,843 445,824 413,786C380,747 360,697 353,634l3,-6l355,0l0,23C711,711 698,758 671,792C644,826 604,843 549,843z"/>
+<glyph unicode="f" horiz-adv-x="694" d="M179,0l0,843l-158,0l0,197l158,0l0,115C179,1272 213,1362 281,1425C349,1488 445,1520 568,1520C593,1520 618,1518 643,1515C668,1511 695,1506 724,1500l-24,-208C683,1295 668,1297 653,1299C638,1300 622,1301 603,1301C556,1301 520,1288 496,1263C471,1238 459,1202 459,1155l0,-115l212,0l0,-197l-212,0l0,-843z"/>
+<glyph unicode="g" horiz-adv-x="1130" d="M69,511C69,676 105,808 178,909C250,1010 352,1060 483,1060C543,1060 596,1047 641,1020C686,993 725,955 758,906l23,134l239,0l0,-1035C1020,-130 975,-235 886,-309C797,-383 672,-420 511,-420C458,-420 401,-413 341,-398C281,-383 226,-364 175,-339l47,209C265,-150 311,-165 358,-176C405,-187 455,-192 509,-192C588,-192 647,-176 685,-144C722,-112 741,-62 741,6l0,96C709,62 672,32 629,11C586,-10 536,-20 481,-20C350,-20 249,27 177,121C105,214 69,338 69,491M349,491C349,400 365,329 397,277C429,224 481,198 552,198C597,198 635,206 666,223C697,239 722,263 741,294l0,444C722,771 697,796 666,814C635,832 597,841 554,841C483,841 431,811 398,750C365,689 349,610 349,511z"/>
+<glyph unicode="i" horiz-adv-x="530" d="M405,0l-280,0l0,1040l280,0M405,1289l-280,0l0,211l280,0z"/>
+<glyph unicode="l" horiz-adv-x="530" d="M405,0l-280,0l0,1500l280,0z"/>
+<glyph unicode="m" horiz-adv-x="1774" d="M370,1040l13,-140C418,951 463,990 516,1018C569,1046 631,1060 702,1060C772,1060 832,1045 882,1015C932,985 969,939 994,878C1028,935 1073,980 1128,1012C1183,1044 1247,1060 1320,1060C1427,1060 1511,1024 1573,951C1634,878 1665,766 1665,617l0,-617l-280,0l0,618C1385,701 1371,759 1343,792C1315,825 1273,841 1218,841C1173,841 1135,831 1102,812C1069,793 1044,766 1025,733C1025,722 1025,713 1026,706C1027,698 1027,690 1027,683l0,-683l-280,0l0,618C747,699 733,757 705,791C677,824 635,841 580,841C537,841 499,833 468,818C436,802 410,780 390,752l0,-752l-280,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1130" d="M366,1040l13,-149C414,944 457,986 509,1016C561,1045 619,1060 684,1060C791,1060 875,1026 936,958C996,890 1026,783 1026,637l0,-637l-280,0l0,637C746,711 732,764 705,795C678,826 637,841 582,841C538,841 500,833 467,818C434,802 407,780 386,751l0,-751l-280,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1130" d="M64,530C64,685 108,813 196,912C284,1011 406,1060 562,1060C719,1060 841,1011 930,912C1018,813 1062,685 1062,530l0,-20C1062,353 1018,226 930,128C841,29 719,-20 564,-20C407,-20 285,29 197,128C108,226 64,353 64,510M344,510C344,415 362,339 397,282C432,225 487,196 564,196C639,196 695,225 730,282C765,339 782,415 782,510l0,20C782,622 764,697 729,756C694,814 638,843 562,843C487,843 432,814 397,756C362,697 344,622 344,530z"/>
+<glyph unicode="p" horiz-adv-x="1130" d="M1063,491C1063,338 1027,214 955,121C882,27 781,-20 651,-20C594,-20 545,-10 502,11C459,31 421,61 390,100l0,-500l-280,0l0,1440l250,0l18,-124C410,962 448,998 493,1023C538,1048 590,1060 649,1060C780,1060 881,1010 954,909C1027,808 1063,676 1063,511M783,511C783,609 766,689 732,750C698,811 646,841 575,841C531,841 494,832 463,815C432,798 408,773 390,741l0,-454C408,257 432,234 463,219C494,204 532,196 577,196C648,196 701,223 734,276C767,329 783,400 783,491z"/>
+<glyph unicode="r" horiz-adv-x="703" d="M664,799l-104,2C517,801 482,793 454,776C426,759 405,736 390,706l0,-706l-280,0l0,1040l260,0l12,-152C407,942 439,984 479,1015C519,1045 565,1060 617,1060C632,1060 645,1059 658,1057C670,1054 682,1051 694,1048z"/>
+<glyph unicode="s" horiz-adv-x="1036" d="M691,288C691,319 676,346 645,368C614,390 558,409 475,426C350,451 255,489 190,538C125,587 92,653 92,737C92,826 131,903 209,966C286,1029 389,1060 517,1060C650,1060 757,1029 837,966C917,903 955,824 951,731l-1,-6l-271,0C679,766 665,800 637,827C609,854 569,867 516,867C469,867 431,856 403,834C375,811 361,783 361,750C361,718 375,692 404,672C433,652 490,634 575,617C705,592 802,554 867,504C931,454 963,386 963,299C963,206 922,129 841,70C759,10 651,-20 518,-20C377,-20 266,15 185,86C103,156 64,236 68,325l2,6l257,0C329,276 348,235 384,210C420,185 467,172 524,172C577,172 619,183 648,204C677,225 691,253 691,288z"/>
+<glyph unicode="t" horiz-adv-x="718" d="M448,1295l0,-255l223,0l0,-197l-223,0l0,-518C448,279 457,246 474,227C491,208 516,198 551,198C570,198 587,199 601,202C615,204 632,208 653,213l30,-202C654,1 625,-7 594,-12C563,-17 529,-20 494,-20C390,-20 310,10 253,69C196,128 168,218 168,339l0,504l-147,0l0,197l147,0l0,255z"/>
+<glyph unicode="u" horiz-adv-x="1130" d="M752,139C719,88 678,48 629,21C580,-6 524,-20 461,-20C349,-20 261,17 198,92C135,166 103,281 103,437l0,603l280,0l0,-605C383,344 396,282 422,249C447,215 487,198 541,198C588,198 629,206 663,221C696,236 723,257 744,286l0,754l279,0l0,-1040l-259,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Thin" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="480"/>
+<glyph unicode=" " horiz-adv-x="480"/>
+<glyph unicode="A" horiz-adv-x="1200" d="M947,416l-695,0l-158,-416l-61,0l534,1400l66,0l534,-1400l-61,0M274,472l652,0l-298,782l-25,78l-6,0l-25,-78z"/>
+<glyph unicode="E" horiz-adv-x="1100" d="M928,702l-684,0l0,-646l784,0l0,-56l-840,0l0,1400l840,0l0,-56l-784,0l0,-586l684,0z"/>
+<glyph unicode="N" horiz-adv-x="1400" d="M1218,0l-56,0l-912,1297l-6,-2l0,-1295l-56,0l0,1400l56,0l912,-1295l6,2l0,1293l56,0z"/>
+<glyph unicode="a" horiz-adv-x="1061" d="M833,192C796,129 742,78 670,39C597,0 510,-20 408,-20C309,-20 231,7 175,60C118,113 90,184 90,274C90,362 132,435 216,494C300,553 405,582 532,582l301,0l0,150C833,817 805,884 749,932C693,980 614,1004 512,1004C417,1004 340,982 282,937C223,892 194,834 194,763l-47,1l-2,6C141,850 173,918 242,975C310,1032 400,1060 512,1060C625,1060 717,1032 786,975C855,918 889,837 889,730l0,-520C889,173 891,138 896,103C900,68 907,34 917,0l-62,0C846,47 841,81 838,103C835,125 833,149 833,176M408,36C513,36 601,59 674,104C746,149 799,212 833,295l0,231l-299,0C425,526 334,501 259,452C184,403 146,342 146,270C146,201 170,145 218,102C265,58 329,36 408,36z"/>
+<glyph unicode="c" horiz-adv-x="1060" d="M564,36C652,36 729,60 794,107C859,154 892,225 892,320l48,0l2,-6C945,213 908,132 832,71C756,10 667,-20 564,-20C427,-20 319,28 240,124C160,220 120,345 120,500l0,40C120,694 160,819 240,916C319,1012 427,1060 562,1060C671,1060 762,1028 836,965C909,901 945,812 942,698l-2,-6l-48,0C892,793 860,870 797,924C734,977 655,1004 562,1004C438,1004 343,960 276,873C209,786 176,675 176,540l0,-40C176,364 209,253 276,166C343,79 439,36 564,36z"/>
+<glyph unicode="e" horiz-adv-x="1030" d="M547,-20C406,-20 297,26 219,119C140,211 101,332 101,482l0,60C101,693 142,817 223,914C304,1011 407,1060 531,1060C654,1060 751,1022 822,946C893,869 928,765 928,633l0,-81l-771,0l0,-10l0,-60C157,350 190,243 255,160C320,77 417,36 547,36C614,36 675,47 730,69C785,91 833,122 872,161l29,-45C859,75 811,42 756,17C701,-8 632,-20 547,-20M531,1004C428,1004 343,967 277,893C211,819 174,726 165,614l3,-6l704,0l0,30C872,745 842,833 783,902C723,970 639,1004 531,1004z"/>
+<glyph unicode="i" horiz-adv-x="456" d="M256,0l-56,0l0,1040l56,0M256,1364l-56,0l0,136l56,0z"/>
+<glyph unicode="l" horiz-adv-x="456" d="M256,0l-56,0l0,1500l56,0z"/>
+<glyph unicode="m" horiz-adv-x="1848" d="M208,1040l7,-214C248,900 297,958 360,999C423,1040 500,1060 591,1060C682,1060 755,1038 812,993C869,948 908,878 929,784C960,871 1008,939 1074,988C1140,1037 1223,1061 1322,1061C1439,1061 1527,1024 1588,949C1649,874 1679,756 1679,595l0,-594l-56,0l0,596C1623,746 1596,852 1541,913C1486,974 1413,1005 1322,1005C1207,1005 1120,974 1060,911C1000,848 962,768 945,669C946,657 946,645 947,632C948,619 948,607 948,594l0,-594l-56,0l0,535l-1,0C891,545 891,553 891,560C891,567 891,573 892,580l0,16C892,745 865,851 810,912C755,973 682,1004 591,1004C478,1004 391,974 332,913C272,852 233,773 216,676l0,-676l-56,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1100" d="M216,1040l7,-208C256,905 303,961 364,1001C425,1040 500,1060 589,1060C705,1060 792,1024 850,953C907,882 936,769 936,614l0,-614l-56,0l0,616C880,759 854,859 802,917C750,975 679,1004 589,1004C480,1004 396,973 338,912C279,851 241,771 224,673l0,-673l-56,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1100" d="M85,540C85,692 128,817 214,914C300,1011 412,1060 549,1060C687,1060 799,1012 886,915C972,818 1015,693 1015,540l0,-40C1015,347 972,223 886,126C800,29 688,-20 551,-20C413,-20 301,29 215,126C128,223 85,347 85,500M141,500C141,371 178,261 252,171C326,81 426,36 551,36C674,36 773,81 848,171C922,261 959,371 959,500l0,40C959,667 922,776 847,867C772,958 673,1004 549,1004C425,1004 326,958 252,867C178,776 141,667 141,540z"/>
+<glyph unicode="p" horiz-adv-x="1100" d="M980,500C980,340 945,213 874,120C803,27 706,-20 582,-20C500,-20 429,-4 368,29C307,61 259,105 224,160l0,-560l-56,0l0,1440l44,0l11,-185C259,919 307,969 367,1006C426,1042 497,1060 580,1060C705,1060 803,1011 874,914C945,817 980,685 980,520M924,520C924,663 895,780 836,870C777,959 692,1004 580,1004C481,1004 403,980 347,932C290,883 249,823 224,751l0,-496C251,188 294,135 355,96C415,56 491,36 582,36C693,36 778,78 837,162C895,245 924,358 924,500z"/>
+<glyph unicode="s" horiz-adv-x="1000" d="M818,256C818,310 794,359 746,404C698,449 615,484 496,509C369,535 278,569 221,611C164,652 136,714 136,795C136,870 168,933 233,984C297,1035 383,1060 492,1060C609,1060 701,1033 769,979C836,924 868,854 865,768l-2,-6l-47,0C816,828 787,885 729,933C670,980 591,1004 492,1004C393,1004 318,983 268,942C217,900 192,852 192,797C192,743 214,697 257,660C300,622 385,589 512,561C630,534 720,498 782,451C843,404 874,339 874,256C874,174 840,108 772,57C703,6 613,-20 500,-20C376,-20 279,7 209,62C138,117 105,183 110,260l2,6l46,0C163,185 199,126 266,90C332,54 410,36 500,36C597,36 675,58 732,102C789,146 818,197 818,256z"/>
+<glyph unicode="t" horiz-adv-x="708" d="M318,1320l0,-280l300,0l0,-56l-300,0l0,-676C318,209 336,139 373,98C410,57 458,36 518,36C535,36 551,37 566,38C580,39 599,42 622,45l10,-51C615,-11 598,-15 580,-17C561,-19 541,-20 520,-20C436,-20 372,6 328,58C284,110 262,193 262,308l0,676l-206,0l0,56l206,0l0,280z"/>
+<glyph unicode="w" horiz-adv-x="1520" d="M360,304l54,-213l6,-1l69,214l237,736l56,0l238,-736l68,-214l6,1l55,213l215,736l64,0l-308,-1040l-55,0l-265,776l-44,162l-6,0l-46,-162l-261,-776l-55,0l-308,1040l64,0z"/>
+<glyph unicode="x" horiz-adv-x="960" d="M479,582l337,458l69,0l-371,-506l391,-534l-69,0l-357,485l-356,-485l-69,0l391,534l-371,506l69,0z"/>
+</font>
+
+ <font horiz-adv-x="2048">
+<!-- Roboto is a trademark of Betatype. -->
+<!-- Copyright: Copyright 2011 Adobe System Incorporated. All rights reserved. -->
+<font-face font-family="Roboto-Regular" units-per-em="2048" underline-position="-150" underline-thickness="100"/>
+<missing-glyph horiz-adv-x="498"/>
+<glyph unicode=" " horiz-adv-x="498"/>
+<glyph unicode="(" horiz-adv-x="652" d="M106,642C106,915 152,1132 245,1293C338,1454 457,1560 604,1611l6,0l37,-112C533,1436 446,1337 385,1204C324,1071 294,884 294,644l0,-122C294,281 324,92 385,-43C446,-179 533,-278 647,-341l-36,-104l-6,0C458,-394 338,-287 245,-126C152,35 106,251 106,524z"/>
+<glyph unicode=")" horiz-adv-x="661" d="M543,524C543,251 496,35 403,-126C310,-287 190,-394 43,-445l-6,0l-36,104C114,-278 202,-179 263,-43C324,92 355,281 355,522l0,122C355,885 324,1073 263,1210C202,1346 114,1445 1,1508l36,103l6,0C190,1560 310,1454 403,1293C496,1132 543,915 543,642z"/>
+<glyph unicode="+" horiz-adv-x="1128" d="M655,753l395,0l0,-171l-395,0l0,-442l-188,0l0,442l-395,0l0,171l395,0l0,407l188,0z"/>
+<glyph unicode="," horiz-adv-x="530" d="M350,-8l-98,-240l-94,0l4,249l0,211l188,0z"/>
+<glyph unicode="." horiz-adv-x="523" d="M343,0l-191,0l0,194l191,0z"/>
+<glyph unicode="0" horiz-adv-x="1118" d="M1005,494C1005,335 965,209 886,118C807,26 698,-20 561,-20C424,-20 315,26 236,118C156,210 116,335 116,494l0,412C116,1064 156,1189 235,1282C314,1374 422,1420 559,1420C696,1420 805,1374 885,1282C965,1189 1005,1064 1005,906M816,945C816,1046 794,1125 750,1183C706,1241 642,1270 559,1270C476,1270 413,1241 370,1183C327,1125 305,1046 305,945l0,-489C305,355 327,275 371,217C414,158 478,129 561,129C644,129 708,158 751,216C794,274 816,354 816,456z"/>
+<glyph unicode="1" horiz-adv-x="1118" d="M698,0l-189,0l0,1225l-282,-3l0,156l471,42z"/>
+<glyph unicode="2" horiz-adv-x="1118" d="M986,0l-835,0l0,149l432,506C661,756 713,833 739,884C765,935 778,987 778,1042C778,1108 760,1163 723,1206C686,1249 634,1270 566,1270C487,1270 425,1245 381,1194C336,1143 314,1081 314,1006l-181,0l-2,6C128,1126 166,1223 246,1302C326,1381 433,1420 566,1420C689,1420 786,1387 859,1321C931,1254 967,1161 967,1040C967,955 945,879 902,813C859,746 783,645 674,510l-295,-356l3,-5l604,0z"/>
+<glyph unicode="3" horiz-adv-x="1118" d="M562,787C643,787 702,808 741,851C780,893 799,951 799,1025C799,1096 778,1155 735,1201C692,1247 630,1270 547,1270C482,1270 427,1247 382,1202C337,1157 315,1101 315,1034l-181,0l-2,6C129,1153 168,1244 249,1315C330,1385 429,1420 547,1420C683,1420 791,1386 870,1317C949,1248 988,1149 988,1021C988,956 970,897 935,844C899,791 850,749 787,719C859,692 914,651 953,595C991,539 1010,471 1010,390C1010,262 967,162 881,89C795,16 684,-20 547,-20C427,-20 324,14 237,83C150,152 109,251 112,382l2,6l181,0C295,315 318,254 365,204C412,154 472,129 547,129C632,129 699,153 748,200C797,247 821,309 821,386C821,471 799,535 755,577C711,618 647,639 562,639l-178,0l0,148z"/>
+<glyph unicode="4" horiz-adv-x="1118" d="M860,451l198,0l0,-149l-198,0l0,-302l-189,0l0,302l-584,0l0,107l573,991l200,0M302,451l369,0l0,679l-6,2l-20,-53z"/>
+<glyph unicode="5" horiz-adv-x="1118" d="M172,622l81,778l695,0l0,-169l-534,0l-47,-401C398,852 433,870 470,885C507,899 550,906 599,907C724,908 823,868 895,785C966,702 1002,589 1002,446C1002,305 965,193 892,108C819,23 712,-20 571,-20C450,-20 350,12 270,77C189,141 151,236 154,362l2,6l170,0C326,292 349,233 394,192C439,150 498,129 571,129C647,129 706,157 749,214C792,270 813,347 813,444C813,533 792,606 749,661C706,716 647,743 572,743C496,743 441,732 406,710C371,687 345,653 328,606z"/>
+<glyph unicode="A" horiz-adv-x="1256" d="M902,360l-546,0l-127,-360l-193,0l515,1400l163,0l506,-1400l-193,0M413,519l433,0l-212,608l-6,0z"/>
+<glyph unicode="F" horiz-adv-x="1090" d="M949,619l-605,0l0,-619l-189,0l0,1400l894,0l0,-150l-705,0l0,-482l605,0z"/>
+<glyph unicode="J" horiz-adv-x="1090" d="M741,1400l189,0l0,-994C930,275 890,172 810,95C729,18 625,-20 496,-20C365,-20 260,14 183,83C106,151 69,250 72,380l2,6l181,0C255,299 276,234 318,192C359,150 419,129 496,129C568,129 627,154 673,204C718,254 741,321 741,406z"/>
+<glyph unicode="L" horiz-adv-x="1090" d="M349,149l698,0l0,-149l-887,0l0,1400l189,0z"/>
+<glyph unicode="P" horiz-adv-x="1256" d="M344,542l0,-542l-189,0l0,1400l543,0C849,1400 967,1360 1052,1281C1137,1201 1179,1098 1179,971C1179,843 1137,740 1053,661C968,582 850,542 698,542M344,691l354,0C795,691 868,718 917,772C966,825 990,891 990,969C990,1048 966,1114 917,1169C868,1223 795,1250 698,1250l-354,0z"/>
+<glyph unicode="S" horiz-adv-x="1256" d="M958,371C958,432 934,481 887,519C839,557 754,591 633,622C489,657 377,709 298,778C219,846 179,932 179,1037C179,1147 221,1238 306,1311C391,1384 502,1420 641,1420C791,1420 910,1378 999,1295C1088,1211 1130,1113 1127,1002l-2,-6l-180,0C945,1075 917,1141 860,1193C803,1244 730,1270 641,1270C550,1270 482,1249 437,1207C391,1164 368,1108 368,1039C368,978 393,927 444,887C495,846 579,811 698,781C845,743 957,691 1033,626C1109,560 1147,476 1147,373C1147,259 1102,165 1011,91C920,17 802,-20 658,-20C520,-20 398,18 293,94C188,169 137,270 140,397l2,6l180,0C322,315 356,247 425,200C493,153 571,129 658,129C749,129 821,152 876,197C931,242 958,300 958,371z"/>
+<glyph unicode="V" horiz-adv-x="1256" d="M593,368l32,-119l6,0l33,119l371,1032l205,0l-531,-1400l-162,0l-531,1400l205,0z"/>
+<glyph unicode="a" horiz-adv-x="1069" d="M758,0C752,29 747,55 744,79C740,103 737,127 736,151C702,102 658,62 605,29C551,-4 491,-20 425,-20C316,-20 232,8 174,64C116,119 87,195 87,292C87,391 127,469 208,526C288,582 398,610 537,610l199,0l0,103C736,775 718,823 683,858C647,893 594,910 524,910C462,910 413,895 377,865C340,835 322,798 322,754l-180,-2l-1,6C136,834 171,903 245,966C318,1029 415,1060 535,1060C654,1060 749,1030 820,970C890,910 925,824 925,711l0,-501C925,172 927,136 931,102C935,67 942,33 953,0M453,138C522,138 583,155 635,190C686,225 720,265 736,311l0,171l-205,0C452,482 390,463 345,425C299,386 276,341 276,288C276,242 291,206 321,179C350,152 394,138 453,138z"/>
+<glyph unicode="c" horiz-adv-x="1069" d="M556,129C617,129 671,148 719,187C766,226 790,273 790,329l170,0l2,-6C965,234 925,154 842,85C759,15 663,-20 556,-20C412,-20 299,30 216,130C133,230 91,353 91,500l0,40C91,685 133,808 216,909C299,1010 413,1060 556,1060C675,1060 773,1024 851,952C928,880 966,792 963,688l-2,-6l-171,0C790,745 767,798 722,843C677,888 621,910 556,910C465,910 396,873 350,800C303,726 280,639 280,540l0,-40C280,399 303,312 350,239C396,166 465,129 556,129z"/>
+<glyph unicode="d" horiz-adv-x="1128" d="M91,501C91,668 127,803 200,906C273,1009 375,1060 506,1060C569,1060 625,1049 673,1026C721,1003 762,969 797,925l0,575l189,0l0,-1500l-145,0l-30,135C776,84 734,45 683,19C632,-7 572,-20 504,-20C375,-20 274,26 201,118C128,209 91,330 91,481M280,481C280,376 302,291 347,228C391,165 459,133 552,133C611,133 660,146 700,173C739,199 772,236 797,283l0,479C772,807 739,842 699,868C659,893 611,906 554,906C461,906 392,868 347,793C302,718 280,620 280,501z"/>
+<glyph unicode="e" horiz-adv-x="1048" d="M592,-20C434,-20 311,28 222,124C133,219 89,345 89,500l0,42C89,692 134,816 225,914C315,1011 426,1060 557,1060C691,1060 793,1020 862,940C931,860 966,748 966,604l0,-105l-681,0l-2,-5C280,387 304,299 355,231C406,163 485,129 592,129C653,129 705,136 750,151C795,165 838,184 880,208l47,-134C896,51 853,29 798,10C743,-10 675,-20 592,-20M557,910C485,910 426,885 379,836C332,786 303,722 292,645l2,-6l483,0l0,20C777,737 760,798 726,843C691,888 635,910 557,910z"/>
+<glyph unicode="g" horiz-adv-x="1128" d="M101,501C101,668 137,803 210,906C283,1009 385,1060 516,1060C584,1060 643,1047 694,1020C745,993 787,953 822,902l24,138l150,0l0,-1046C996,-139 957,-242 878,-313C799,-384 685,-420 537,-420C486,-420 432,-413 373,-399C314,-385 261,-366 216,-343l29,148C283,-215 328,-231 380,-243C432,-255 484,-261 535,-261C630,-261 699,-240 742,-198C785,-156 807,-92 807,-6l0,120C772,70 731,37 682,14C633,-9 577,-20 514,-20C384,-20 283,26 210,118C137,209 101,330 101,481M289,481C289,376 311,291 356,228C400,165 468,133 561,133C620,133 669,146 709,172C749,198 782,235 807,283l0,478C782,806 749,841 709,867C668,893 620,906 563,906C470,906 401,868 356,793C311,718 289,620 289,501z"/>
+<glyph unicode="h" horiz-adv-x="1128" d="M324,900C360,951 405,990 459,1018C512,1046 572,1060 637,1060C751,1060 839,1027 902,960C965,893 996,791 996,652l0,-652l-189,0l0,654C807,739 788,803 750,844C711,885 655,906 580,906C521,906 471,895 428,872C385,849 350,817 324,776l0,-776l-189,0l0,1500l189,0z"/>
+<glyph unicode="i" horiz-adv-x="493" d="M341,0l-189,0l0,1040l189,0M341,1307l-189,0l0,193l189,0z"/>
+<glyph unicode="l" horiz-adv-x="493" d="M341,0l-189,0l0,1500l189,0z"/>
+<glyph unicode="m" horiz-adv-x="1782" d="M304,1040l13,-137C352,953 397,992 450,1019C503,1046 566,1060 637,1060C712,1060 777,1044 832,1011C886,978 926,929 953,863C986,924 1030,972 1085,1007C1140,1042 1206,1060 1281,1060C1395,1060 1485,1024 1551,951C1617,878 1650,768 1650,622l0,-622l-189,0l0,624C1461,727 1441,799 1402,842C1362,885 1303,906 1225,906C1156,906 1100,883 1059,836C1018,789 994,731 987,660l0,-660l-189,0l0,624C798,721 778,793 737,838C696,883 638,906 561,906C501,906 452,894 413,870C374,845 344,811 324,768l0,-768l-189,0l0,1040z"/>
+<glyph unicode="n" horiz-adv-x="1128" d="M308,1040l13,-155C356,940 400,983 454,1014C507,1045 568,1060 637,1060C751,1060 839,1027 902,962C965,896 996,794 996,657l0,-657l-189,0l0,653C807,744 788,809 751,848C714,887 657,906 580,906C520,906 469,894 427,870C384,845 351,812 327,769l0,-769l-189,0l0,1040z"/>
+<glyph unicode="o" horiz-adv-x="1128" d="M89,530C89,684 132,811 217,911C302,1010 418,1060 563,1060C710,1060 826,1010 911,911C996,812 1038,685 1038,530l0,-21C1038,354 996,228 911,129C826,30 711,-20 565,-20C418,-20 302,30 217,129C132,228 89,354 89,509M278,509C278,399 302,308 351,237C399,165 470,129 565,129C658,129 728,165 777,237C825,308 849,399 849,509l0,21C849,639 825,729 776,802C727,874 656,910 563,910C470,910 399,874 351,802C302,729 278,639 278,530z"/>
+<glyph unicode="p" horiz-adv-x="1128" d="M1036,481C1036,330 1000,209 927,118C854,26 753,-20 624,-20C559,-20 501,-9 451,13C401,35 359,68 324,111l0,-511l-189,0l0,1440l145,0l30,-138C345,953 388,993 440,1020C492,1047 553,1060 622,1060C752,1060 854,1009 927,906C1000,803 1036,668 1036,501M848,501C848,619 824,716 776,792C728,868 658,906 565,906C508,906 460,893 420,868C380,843 348,808 324,765l0,-497C349,224 381,190 421,166C460,141 509,129 567,129C659,129 729,162 777,227C824,292 848,377 848,481z"/>
+<glyph unicode="r" horiz-adv-x="691" d="M636,872l-98,6C485,878 441,866 406,842C371,818 343,784 324,740l0,-740l-189,0l0,1040l170,0l13,-161C347,935 385,979 431,1012C476,1044 529,1060 588,1060C603,1060 617,1059 630,1057C643,1054 653,1052 662,1049z"/>
+<glyph unicode="s" horiz-adv-x="1047" d="M766,280C766,322 750,356 717,382C684,408 623,431 532,451C407,477 311,514 244,562C177,609 143,673 143,752C143,837 180,909 253,970C326,1030 421,1060 538,1060C658,1060 755,1028 830,964C905,900 940,825 937,740l-2,-6l-180,0C755,778 735,818 694,855C653,892 601,910 538,910C469,910 418,895 384,865C349,835 332,799 332,758C332,717 347,686 377,663C406,640 467,620 559,601C689,574 788,536 855,487C922,438 955,373 955,293C955,201 917,126 841,68C765,9 666,-20 543,-20C408,-20 302,14 225,81C147,148 110,227 114,316l2,6l180,0C299,255 325,207 374,176C422,145 478,129 543,129C613,129 668,143 707,171C746,199 766,235 766,280z"/>
+<glyph unicode="t" horiz-adv-x="652" d="M373,1291l0,-251l233,0l0,-140l-233,0l0,-630C373,221 382,186 400,165C418,144 442,133 472,133C490,133 510,135 532,139C554,142 571,147 582,152l42,-127C604,12 575,1 536,-7C497,-16 459,-20 423,-20C350,-20 292,7 249,60C206,113 184,195 184,308l0,592l-161,0l0,140l161,0l0,251z"/>
+<glyph unicode="u" horiz-adv-x="1128" d="M810,156C777,99 734,56 681,26C628,-5 567,-20 498,-20C383,-20 293,16 228,89C163,162 131,274 131,427l0,613l189,0l0,-615C320,314 337,238 371,196C405,154 458,133 529,133C598,133 656,147 701,175C746,202 780,241 803,292l0,748l189,0l0,-1040l-169,0z"/>
+<glyph unicode="v" horiz-adv-x="997" d="M486,307l18,-79l6,0l20,79l247,733l193,0l-392,-1040l-143,0l-395,1040l193,0z"/>
+<glyph unicode="w" horiz-adv-x="1508" d="M405,379l25,-139l6,0l27,139l213,661l151,0l213,-661l30,-155l6,0l32,155l159,661l197,0l-308,-1040l-153,0l-212,633l-40,166l-6,0l-37,-166l-208,-633l-152,0l-308,1040l197,0z"/>
+<glyph unicode="y" horiz-adv-x="997" d="M459,385l35,-134l6,0l263,789l210,0l-447,-1200C499,-230 460,-291 411,-342C362,-394 294,-420 209,-420C193,-420 173,-418 150,-415C127,-412 109,-408 96,-405l19,149C109,-255 120,-256 148,-258C175,-260 193,-261 200,-261C242,-261 276,-244 301,-209C326,-174 349,-134 369,-87l47,108l-395,1019l210,0z"/>
+</font>
+
+ <g id="Backdrop">
+ <path fill="#EBF5E6" stroke="#00A651" stroke-width="3" stroke-miterlimit="10" d="M5199.661,1617.921
+ c0,110.457-89.543,200-200,200H2188.428c-110.457,0-200-89.543-200-200V783.499c0-110.457,89.543-200,200-200h2811.233
+ c110.457,0,200,89.543,200,200V1617.921z"/>
+</g>
+<g id="Photo_Detail">
+ <g id="Action_Bar_copy_6">
+ </g>
+</g>
+<g id="Photo_Detail__x2014__Fullscreen_1_">
+</g>
+<g id="Photo_List">
+ <g id="Action_Bar_copy_4">
+ </g>
+ <g id="Swipe_Tabs_copy">
+ </g>
+ <g id="Photos_2_">
+ </g>
+</g>
+<g id="Saved">
+ <g id="_x31_0_x22__Tablet_1_">
+ <path fill="#231F20" d="M1775.242,3979.781H495.272c-41.851,0-75.898-34.048-75.898-75.898v-799.981
+ c0-41.851,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.048,75.898,75.898v799.981
+ C1851.141,3945.733,1817.093,3979.781,1775.242,3979.781z"/>
+ <g>
+ <path fill="#FFFFFF" d="M1775.242,3047.187c31.273,0,56.715,25.442,56.715,56.715v799.981c0,31.272-25.441,56.715-56.715,56.715
+ H495.272c-31.272,0-56.715-25.442-56.715-56.715v-799.981c0-31.272,25.442-56.715,56.715-56.715H1775.242 M1775.242,3044.187
+ H495.272c-32.927,0-59.715,26.788-59.715,59.715v799.981c0,32.927,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.788,59.715-59.715v-799.981C1834.957,3070.975,1808.169,3044.187,1775.242,3044.187L1775.242,3044.187z"/>
+ </g>
+ <g>
+ <rect x="493.757" y="3102.726" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M1775.257,3104.226v800h-1280v-800H1775.257 M1778.257,3101.226h-3h-1280h-3v3v800v3h3h1280h3v-3v-800
+ V3101.226L1778.257,3101.226z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1135.257,3088.615c-8.276,0-15.011-6.751-15.011-15.048
+ c0-8.296,6.734-15.048,15.011-15.048c8.277,0,15.012,6.752,15.012,15.048C1150.269,3081.864,1143.534,3088.615,1135.257,3088.615z
+ "/>
+ <rect x="495.272" y="3848.061" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M537.845,3868.028c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.876,6.892,6.876l3.062-0.147l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.269-5.638-6.113
+ c-3.829-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.496L537.845,3868.028z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="625.106,3863.875 610.644,3877.957 612.312,3879.561
+ 625.318,3866.804 638.039,3879.421 639.777,3878.028 634.146,3872.591 634.146,3865.759 631.922,3865.759 631.922,3870.29 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="618.568,3879.353 616.275,3880.956 616.275,3888.067
+ 634.008,3888.067 634.008,3880.956 631.851,3879.142 631.851,3886.046 618.568,3886.046 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M714.409,3889.367h-22.172v-19.173h22.172V3889.367z M694.837,3886.768h16.973v-13.974h-16.973V3886.768
+ z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="698.886,3863.546 698.886,3867.451 701.485,3867.451 701.485,3866.146 718.458,3866.146
+ 718.458,3880.118 717.153,3880.118 717.153,3882.718 721.058,3882.718 721.058,3863.546 "/>
+ </g>
+ </g>
+ <g opacity="0.34">
+ <defs>
+ <rect id="SVGID_1_" x="495.257" y="3159.749" opacity="0.34" width="1278.032" height="684.99"/>
+ </defs>
+ <clipPath id="SVGID_2_">
+ <use xlink:href="#SVGID_1_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_2_)">
+ <polygon fill="#FFC91F" points="634.167,3571.396 687.836,3680.166 807.867,3697.602 721.019,3782.26 741.527,3901.805
+ 634.167,3845.371 526.808,3901.805 547.317,3782.26 460.468,3697.602 580.5,3680.166 "/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy">
+ <rect x="495.257" y="3103.582" fill="#FFC91F" width="1280.001" height="56.167"/>
+ <text transform="matrix(1 0 0 1 831.041 3137.415)" font-family="'Roboto-Regular'" font-size="18">Saved</text>
+ <g id="news_icon_3_">
+ <g>
+ <g>
+ <path d="M673.696,3119.628h-0.863v19.038c0,0.248,0.068,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.52,0.484
+ c0.094,0.047,0.191,0.086,0.293,0.109c0.547,0.137,0.881,0.691,0.744,1.238c-0.115,0.465-0.531,0.775-0.99,0.775
+ c-0.08,0-0.164-0.01-0.246-0.031c-0.258-0.064-0.508-0.158-0.744-0.281c-0.539-0.281-0.992-0.703-1.312-1.221
+ c-0.33-0.533-0.505-1.146-0.505-1.775v-20.608c0-1.736-1.406-3.143-3.142-3.143h-23.012c-1.735,0-3.142,1.406-3.142,3.143
+ v22.933c0,1.734,1.406,3.141,3.142,3.141h29.059c1.736,0,3.143-1.406,3.143-3.141v-18.222
+ C676.839,3121.034,675.433,3119.628,673.696,3119.628z M651.077,3139.262h-7.304v-2.051h7.304V3139.262z M651.077,3136.367
+ h-7.304v-2.051h7.304V3136.367z M659.796,3139.262h-7.305v-2.051h7.305V3139.262z M659.796,3136.367h-7.305v-2.051h7.305
+ V3136.367z M659.796,3133.137h-16.022v-8.954h16.022V3133.137z M668.513,3139.262h-7.303v-2.051h7.303V3139.262z
+ M668.513,3136.367h-7.303v-2.051h7.303V3136.367z M668.513,3133.471h-7.303v-2.051h7.303V3133.471z M668.513,3130.576h-7.303
+ v-2.05h7.303V3130.576z M668.513,3127.681h-7.303v-2.051h7.303V3127.681z M668.513,3122.612h-24.739v-2.355h24.739V3122.612z"
+ />
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_3_" x="643.773" y="3124.183" width="16.022" height="8.954"/>
+ </defs>
+ <clipPath id="SVGID_4_">
+ <use xlink:href="#SVGID_3_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_4_)">
+ <ellipse cx="651.56" cy="3127.573" rx="3.076" ry="3.048"/>
+ <path d="M656.666,3138.584c-0.208,1.631-1.667,3.404-2.954,3.652c-1.436,0.23-2.869,0.23-4.303,0
+ c-1.289-0.248-2.747-2.021-2.955-3.652c-0.164-1.539-0.164-3.08,0-4.619c0.208-1.631,1.666-3.404,2.955-3.652
+ c1.434-0.23,2.867-0.23,4.303,0c1.287,0.248,2.746,2.021,2.954,3.652C656.831,3135.504,656.831,3137.045,656.666,3138.584z"/>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_3_">
+ <polygon points="1689.184,3119.228 1689.184,3129.229 1679.184,3129.229 "/>
+ <polygon points="1662.934,3144.369 1662.934,3134.369 1672.934,3134.369 "/>
+ <g>
+ <g>
+ <path d="M1676.059,3122.675c4.146,0,7.641,2.767,8.751,6.554h4.119c-1.195-6.018-6.502-10.554-12.87-10.554
+ s-11.675,4.536-12.87,10.554h4.119C1668.418,3125.441,1671.913,3122.675,1676.059,3122.675z M1676.059,3140.924
+ c-4.146,0-7.641-2.768-8.751-6.555h-4.119c1.195,6.018,6.502,10.555,12.87,10.555s11.675-4.537,12.87-10.555h-4.119
+ C1683.699,3138.156,1680.204,3140.924,1676.059,3140.924z"/>
+ </g>
+ </g>
+ </g>
+ <g id="overflow_5_">
+ <rect x="1739.817" y="3118.857" width="5.542" height="5.542"/>
+ <rect x="1739.817" y="3129.229" width="5.542" height="5.542"/>
+ <rect x="1739.817" y="3139.6" width="5.542" height="5.541"/>
+ </g>
+ <g opacity="0.37">
+ <defs>
+ <rect id="SVGID_5_" x="495.257" y="3103.582" opacity="0.37" width="1280.001" height="56.167"/>
+ </defs>
+ <clipPath id="SVGID_6_">
+ <use xlink:href="#SVGID_5_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_6_)">
+ <g>
+ <path d="M599.505,3144.111l-11.359-40.39c-1.082-3.847-5.076-6.087-8.922-5.005l-1.916,0.539l11.869,42.201
+ c0.155,0.553,0.459,1.046,0.877,1.431c0.41,0.376,0.915,0.636,1.457,0.749c0.235,0.048,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.276c0.034,1.104-0.696,2.051-1.712,2.337c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.034-1.824-0.159c-1.37-0.287-2.638-0.939-3.671-1.886c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.685c-1.082-3.846-5.076-6.086-8.923-5.005l-51.01,14.346c-3.847,1.081-6.087,5.076-5.005,8.923l14.296,50.835
+ c1.081,3.845,5.075,6.087,8.923,5.005l64.414-18.116C598.346,3151.952,600.587,3147.957,599.505,3144.111z M571.016,3141.922
+ c-0.528,0.76-1.158,1.481-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.015-3.316,1.364
+ c-2.62,0.736-4.801,0.687-6.547-0.153c-1.744-0.838-2.926-2.355-3.543-4.554c-0.549-1.952-0.945-4.765-1.186-8.432l-0.42-5.703
+ c-0.035-0.469-0.076-1.044-0.125-1.726c-0.047-0.681-0.103-1.39-0.168-2.127c-0.062-0.735-0.143-1.468-0.238-2.195
+ c-0.098-0.727-0.224-1.368-0.38-1.923c-0.118-0.422-0.283-0.854-0.491-1.299c-0.209-0.443-0.473-0.826-0.789-1.145
+ c-0.317-0.317-0.691-0.547-1.127-0.688c-0.436-0.141-0.952-0.127-1.552,0.042c-0.776,0.219-1.474,0.696-2.094,1.432
+ c-0.619,0.738-1.164,1.635-1.634,2.688c-0.471,1.056-0.872,2.223-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.873
+ c-0.198,1.302-0.328,2.559-0.394,3.774c-0.065,1.217-0.072,2.295-0.024,3.239l0.986,16.789l-10.221,2.874l-1.905-28.745
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.326-0.064-0.635-0.1-0.926c-0.032-0.288-0.067-0.537-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.443c-0.175-0.62-0.381-1.102-0.619-1.441c-0.24-0.341-0.533-0.57-0.877-0.688
+ c-0.346-0.118-0.755-0.147-1.229-0.086c-0.474,0.061-1.033,0.184-1.677,0.363l-1.23,0.346l-0.421-3.797l15.148-4.26
+ l1.285,7.506l0.432-0.121c0.486-1.598,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.364,2.283-3.318
+ c0.881-0.953,1.902-1.77,3.067-2.443c1.163-0.675,2.499-1.225,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393
+ c1.107,0.145,2.066,0.49,2.88,1.041c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.823,1.238,2.867
+ c0.163,0.576,0.297,1.203,0.404,1.879c0.105,0.678,0.191,1.367,0.257,2.066c0.065,0.7,0.118,1.404,0.163,2.109
+ c0.043,0.708,0.092,1.375,0.149,2.007l0.52,7.723c0.084,1.316,0.187,2.54,0.312,3.665c0.126,1.127,0.323,2.167,0.592,3.121
+ c0.281,0.999,0.701,1.708,1.262,2.124c0.561,0.417,1.229,0.517,2.006,0.298c0.71-0.199,1.322-0.515,1.836-0.946
+ c0.514-0.433,1.086-1.014,1.719-1.742l2.279,1.839C571.994,3140.42,571.545,3141.163,571.016,3141.922z"/>
+ </g>
+ </g>
+ </g>
+ <rect x="624.589" y="3156.854" width="300" height="2.896"/>
+ <rect x="773.783" y="3151.625" width="150.806" height="6.676"/>
+ <g id="photo_icon_4_">
+ <path d="M744.034,3118.685v21.678h-27.802v-21.678H744.034 M747.805,3114.915h-35.343v29.217h35.343V3114.915L747.805,3114.915z"
+ />
+ <g>
+ <defs>
+ <rect id="SVGID_7_" x="717.763" y="3120.256" width="24.662" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_8_">
+ <use xlink:href="#SVGID_7_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_8_)">
+ <circle cx="730.134" cy="3127.246" r="6.283"/>
+ <path d="M740.563,3149.94c-0.426,3.36-3.404,7.016-6.035,7.529c-2.93,0.474-5.859,0.474-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.521c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.93-0.474,5.859-0.474,8.789,0c2.631,0.514,5.609,4.17,6.035,7.529C740.899,3143.593,740.899,3146.767,740.563,3149.94z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_8_)">
+ <circle cx="742.308" cy="3127.521" r="4.516"/>
+ <path d="M749.804,3143.833c-0.306,2.415-2.447,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.316,0
+ c-1.892-0.369-4.033-2.996-4.339-5.411c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.042,4.339-5.411
+ c2.105-0.341,4.211-0.341,6.316,0c1.891,0.369,4.032,2.997,4.338,5.411C750.045,3139.271,750.045,3141.552,749.804,3143.833z"
+ />
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_8_)">
+ <circle cx="717.763" cy="3127.521" r="4.516"/>
+ <path d="M725.261,3143.833c-0.307,2.415-2.447,5.042-4.338,5.411c-2.106,0.341-4.212,0.341-6.318,0
+ c-1.891-0.369-4.031-2.996-4.338-5.411c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.042,4.338-5.411
+ c2.106-0.341,4.212-0.341,6.318,0c1.891,0.369,4.031,2.997,4.338,5.411C725.501,3139.271,725.501,3141.552,725.261,3143.833z"
+ />
+ </g>
+ </g>
+ </g>
+ <g>
+ <polygon points="805.682,3113.659 810.555,3123.535 821.454,3125.118 813.568,3132.805 815.43,3143.659 805.682,3138.535
+ 795.934,3143.659 797.796,3132.805 789.911,3125.118 800.809,3123.535 "/>
+ </g>
+ <g>
+ <circle cx="1599.396" cy="3131.499" r="5"/>
+ <circle cx="1617.478" cy="3121.499" r="5"/>
+ <circle cx="1617.478" cy="3141.832" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="1617.478,3121.499 1599.396,3131.499
+ 1617.478,3141.832 "/>
+ </g>
+ <g>
+ <path d="M1541.36,3121.353l3.08,6.24l0.465,0.943l1.041,0.151l6.887,1l-4.982,4.857l-0.754,0.734l0.178,1.036l1.178,6.86
+ l-6.161-3.238l-0.931-0.489l-0.931,0.489l-6.161,3.238l1.178-6.86l0.178-1.036l-0.754-0.734l-4.982-4.857l6.887-1l1.041-0.151
+ l0.465-0.943L1541.36,3121.353 M1541.36,3116.832l-4.873,9.876l-10.898,1.583l7.886,7.687l-1.862,10.854l9.748-5.124l9.748,5.124
+ l-1.862-10.854l7.886-7.687l-10.898-1.583L1541.36,3116.832L1541.36,3116.832z"/>
+ </g>
+ </g>
+ <g id="News_Items_copy">
+ <g>
+ <g>
+ <rect x="557.757" y="3285.401" fill="#FFFFFF" width="394.758" height="97.925"/>
+ <path fill="#D1D3D4" d="M952.015,3285.901v96.925H558.257v-96.925H952.015 M953.015,3284.901h-1H558.257h-1v1v96.925v1h1
+ h393.758h1v-1v-96.925V3284.901L953.015,3284.901z"/>
+ </g>
+ <rect x="854.539" y="3285.901" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="574.016" y="3305.493" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 574.0161 3318.6768)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="574.016" y="3352.778" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 574.0161 3363.0322)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 days ago</text>
+ </g>
+ <g>
+ <g>
+ <rect x="557.757" y="3402.326" fill="#FFFFFF" width="394.758" height="97.925"/>
+ <path fill="#D1D3D4" d="M952.015,3402.826v96.925H558.257v-96.925H952.015 M953.015,3401.826h-1H558.257h-1v1v96.925v1h1
+ h393.758h1v-1v-96.925V3401.826L953.015,3401.826z"/>
+ </g>
+ <rect x="854.539" y="3402.826" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="574.016" y="3422.419" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 574.0161 3435.6025)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="574.016" y="3469.702" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 574.0161 3479.9561)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">15 days ago</text>
+ </g>
+ <g>
+ <g>
+ <rect x="557.757" y="3519.251" fill="#FFFFFF" width="394.758" height="97.925"/>
+ <path fill="#D1D3D4" d="M952.015,3519.751v96.925H558.257v-96.925H952.015 M953.015,3518.751h-1H558.257h-1v1v96.925v1h1
+ h393.758h1v-1v-96.925V3518.751L953.015,3518.751z"/>
+ </g>
+ <rect x="854.539" y="3519.751" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="574.016" y="3539.344" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 574.0161 3552.5273)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="574.016" y="3586.627" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 574.0161 3596.8818)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">1 month ago</text>
+ </g>
+ <g>
+ <g>
+ <rect x="557.757" y="3636.176" fill="#FFFFFF" width="394.758" height="97.925"/>
+ <path fill="#D1D3D4" d="M952.015,3636.676v96.925H558.257v-96.925H952.015 M953.015,3635.676h-1H558.257h-1v1v96.925v1h1
+ h393.758h1v-1v-96.925V3635.676L953.015,3635.676z"/>
+ </g>
+ <rect x="854.539" y="3636.676" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="574.016" y="3656.269" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 574.0161 3669.4521)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="574.016" y="3703.552" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 574.0161 3713.8057)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">4 months ago</text>
+ </g>
+ </g>
+ <g id="News_detail_copy_2">
+ <rect x="994.736" y="3285.901" fill="#E6E7E8" width="436.323" height="287.639"/>
+ <rect x="1439.327" y="3285.901" fill="#E6E7E8" width="139.687" height="139.687"/>
+ <rect x="1439.327" y="3433.854" fill="#E6E7E8" width="139.687" height="139.687"/>
+ <rect x="1588.014" y="3285.901" fill="#E6E7E8" width="139.685" height="139.687"/>
+ <rect x="1588.014" y="3433.854" fill="#E6E7E8" width="139.685" height="139.687"/>
+ <rect x="994.736" y="3581.54" fill="#E6E7E8" width="139.685" height="139.687"/>
+ <rect x="1142.688" y="3581.54" fill="#E6E7E8" width="139.687" height="139.687"/>
+ <rect x="1291.375" y="3581.54" fill="#E6E7E8" width="139.685" height="139.687"/>
+ <rect x="1439.327" y="3581.54" fill="#E6E7E8" width="139.687" height="139.687"/>
+ </g>
+ <rect x="994.736" y="3225.178" fill="none" width="494.85" height="78.748"/>
+ <text transform="matrix(1 0 0 1 994.7363 3251.5449)" font-family="'Roboto-Regular'" font-size="36">Photos</text>
+ <rect x="558.257" y="3225.178" fill="none" width="494.85" height="78.748"/>
+ <text transform="matrix(1 0 0 1 558.2573 3251.5449)" font-family="'Roboto-Regular'" font-size="36">Stories</text>
+</g>
+<g id="News">
+ <g id="_x31_0_x22__Tablet">
+ <path fill="#231F20" d="M1775.242,1668.557H495.272c-41.851,0-75.898-34.048-75.898-75.898V792.677
+ c0-41.851,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.048,75.898,75.898v799.981
+ C1851.141,1634.509,1817.093,1668.557,1775.242,1668.557z"/>
+ <g>
+ <path fill="#FFFFFF" d="M1775.242,735.962c31.273,0,56.715,25.442,56.715,56.715v799.981c0,31.272-25.441,56.715-56.715,56.715
+ H495.272c-31.272,0-56.715-25.442-56.715-56.715V792.677c0-31.272,25.442-56.715,56.715-56.715H1775.242 M1775.242,732.962
+ H495.272c-32.927,0-59.715,26.788-59.715,59.715v799.981c0,32.927,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.788,59.715-59.715V792.677C1834.957,759.75,1808.169,732.962,1775.242,732.962L1775.242,732.962z"/>
+ </g>
+ <g>
+ <rect x="493.757" y="791.501" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M1775.257,793.001v800h-1280v-800H1775.257 M1778.257,790.001h-3h-1280h-3v3v800v3h3h1280h3v-3v-800
+ V790.001L1778.257,790.001z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1135.257,777.391c-8.276,0-15.011-6.751-15.011-15.048
+ c0-8.296,6.734-15.048,15.011-15.048c8.277,0,15.012,6.752,15.012,15.048C1150.269,770.64,1143.534,777.391,1135.257,777.391z"/>
+ <rect x="495.272" y="1536.836" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M537.845,1556.804c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.876,6.892,6.876l3.062-0.147l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.269-5.638-6.113
+ c-3.829-2.847-6.822-2.628-8.912-2.763c-2.086-0.134-8.349-0.048-8.349-0.048l6.471-6.496L537.845,1556.804z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="625.106,1552.65 610.644,1566.732 612.312,1568.336
+ 625.318,1555.579 638.039,1568.196 639.777,1566.804 634.146,1561.366 634.146,1554.534 631.922,1554.534 631.922,1559.065
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="618.568,1568.128 616.275,1569.731 616.275,1576.843
+ 634.008,1576.843 634.008,1569.731 631.851,1567.917 631.851,1574.821 618.568,1574.821 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M714.409,1578.143h-22.172v-19.173h22.172V1578.143z M694.837,1575.543h16.973v-13.974h-16.973V1575.543
+ z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="698.886,1552.321 698.886,1556.227 701.485,1556.227 701.485,1554.921 718.458,1554.921
+ 718.458,1568.894 717.153,1568.894 717.153,1571.493 721.058,1571.493 721.058,1552.321 "/>
+ </g>
+ </g>
+ <g id="Action_Bar">
+ <rect x="495.257" y="792.357" fill="#FFC91F" width="1280.001" height="56.167"/>
+ <g>
+ <text transform="matrix(1 0 0 1 694.3296 826.1909)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <g id="news_icon_10_">
+ <g>
+ <g>
+ <path d="M673.696,808.403h-0.863v19.039c0,0.248,0.068,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.52,0.484
+ c0.094,0.047,0.191,0.086,0.293,0.109c0.547,0.137,0.881,0.691,0.744,1.238c-0.115,0.465-0.531,0.775-0.99,0.775
+ c-0.08,0-0.164-0.01-0.246-0.031c-0.258-0.064-0.508-0.158-0.744-0.281c-0.539-0.281-0.992-0.703-1.312-1.221
+ c-0.33-0.533-0.505-1.146-0.505-1.775v-20.609c0-1.736-1.406-3.142-3.142-3.142h-23.012c-1.735,0-3.142,1.406-3.142,3.142
+ v22.933c0,1.734,1.406,3.141,3.142,3.141h29.059c1.736,0,3.143-1.406,3.143-3.141v-18.222
+ C676.839,809.809,675.433,808.403,673.696,808.403z M651.077,828.037h-7.304v-2.051h7.304V828.037z M651.077,825.143h-7.304
+ v-2.051h7.304V825.143z M659.796,828.037h-7.305v-2.051h7.305V828.037z M659.796,825.143h-7.305v-2.051h7.305V825.143z
+ M659.796,821.912h-16.022v-8.955h16.022V821.912z M668.513,828.037h-7.303v-2.051h7.303V828.037z M668.513,825.143h-7.303
+ v-2.051h7.303V825.143z M668.513,822.246h-7.303v-2.051h7.303V822.246z M668.513,819.352h-7.303v-2.05h7.303V819.352z
+ M668.513,816.457h-7.303v-2.051h7.303V816.457z M668.513,811.387h-24.739v-2.355h24.739V811.387z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_9_" x="643.773" y="812.958" width="16.022" height="8.955"/>
+ </defs>
+ <clipPath id="SVGID_10_">
+ <use xlink:href="#SVGID_9_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_10_)">
+ <ellipse cx="651.56" cy="816.349" rx="3.076" ry="3.047"/>
+ <path d="M656.666,827.359c-0.208,1.631-1.667,3.404-2.954,3.652c-1.436,0.23-2.869,0.23-4.303,0
+ c-1.289-0.248-2.747-2.021-2.955-3.652c-0.164-1.539-0.164-3.08,0-4.619c0.208-1.631,1.666-3.404,2.955-3.652
+ c1.434-0.23,2.867-0.23,4.303,0c1.287,0.248,2.746,2.021,2.954,3.652C656.831,824.279,656.831,825.82,656.666,827.359z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_6_">
+ <polygon points="1689.184,808.003 1689.184,818.004 1679.184,818.004 "/>
+ <polygon points="1662.934,833.145 1662.934,823.145 1672.934,823.145 "/>
+ <g>
+ <g>
+ <path d="M1676.059,811.45c4.146,0,7.641,2.767,8.751,6.554h4.119c-1.195-6.018-6.502-10.554-12.87-10.554
+ s-11.675,4.537-12.87,10.554h4.119C1668.418,814.217,1671.913,811.45,1676.059,811.45z M1676.059,829.699
+ c-4.146,0-7.641-2.768-8.751-6.555h-4.119c1.195,6.018,6.502,10.555,12.87,10.555s11.675-4.537,12.87-10.555h-4.119
+ C1683.699,826.932,1680.204,829.699,1676.059,829.699z"/>
+ </g>
+ </g>
+ </g>
+ <g id="overflow_2_">
+ <rect x="1739.817" y="807.633" width="5.542" height="5.542"/>
+ <rect x="1739.817" y="818.004" width="5.542" height="5.542"/>
+ <rect x="1739.817" y="828.375" width="5.542" height="5.541"/>
+ </g>
+ <g opacity="0.37">
+ <defs>
+ <rect id="SVGID_11_" x="495.257" y="792.357" opacity="0.37" width="1280.001" height="56.167"/>
+ </defs>
+ <clipPath id="SVGID_12_">
+ <use xlink:href="#SVGID_11_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_12_)">
+ <g>
+ <path d="M599.505,832.887l-11.359-40.39c-1.082-3.846-5.076-6.086-8.922-5.004l-1.916,0.539l11.869,42.201
+ c0.155,0.553,0.459,1.046,0.877,1.431c0.41,0.376,0.915,0.636,1.457,0.749c0.235,0.048,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.276c0.034,1.104-0.696,2.051-1.712,2.337c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.034-1.824-0.159c-1.37-0.287-2.638-0.939-3.671-1.886c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.684c-1.082-3.846-5.076-6.087-8.923-5.005l-51.01,14.346c-3.847,1.082-6.087,5.076-5.005,8.923l14.296,50.835
+ c1.081,3.845,5.075,6.087,8.923,5.005l64.414-18.116C598.346,840.728,600.587,836.732,599.505,832.887z M571.016,830.697
+ c-0.528,0.76-1.158,1.481-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.015-3.316,1.364
+ c-2.62,0.736-4.801,0.687-6.547-0.153c-1.744-0.838-2.926-2.355-3.543-4.554c-0.549-1.952-0.945-4.765-1.186-8.432l-0.42-5.703
+ c-0.035-0.469-0.076-1.044-0.125-1.726c-0.047-0.681-0.103-1.389-0.168-2.127c-0.062-0.736-0.143-1.468-0.238-2.195
+ c-0.098-0.727-0.224-1.368-0.38-1.923c-0.118-0.421-0.283-0.854-0.491-1.299c-0.209-0.444-0.473-0.826-0.789-1.145
+ c-0.317-0.317-0.691-0.546-1.127-0.688c-0.436-0.141-0.952-0.127-1.552,0.042c-0.776,0.219-1.474,0.697-2.094,1.433
+ c-0.619,0.738-1.164,1.634-1.634,2.687c-0.471,1.056-0.872,2.222-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.872
+ c-0.198,1.302-0.328,2.559-0.394,3.775c-0.065,1.217-0.072,2.295-0.024,3.239l0.986,16.789l-10.221,2.874l-1.905-28.745
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.327-0.064-0.635-0.1-0.925c-0.032-0.289-0.067-0.538-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.444c-0.175-0.62-0.381-1.102-0.619-1.441c-0.24-0.341-0.533-0.57-0.877-0.688
+ c-0.346-0.118-0.755-0.147-1.229-0.086c-0.474,0.061-1.033,0.183-1.677,0.364l-1.23,0.346l-0.421-3.797l15.148-4.26
+ l1.285,7.505l0.432-0.121c0.486-1.597,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.364,2.283-3.318
+ c0.881-0.954,1.902-1.77,3.067-2.444c1.163-0.674,2.499-1.224,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393
+ c1.107,0.145,2.066,0.491,2.88,1.041c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.824,1.238,2.867
+ c0.163,0.577,0.297,1.204,0.404,1.88c0.105,0.678,0.191,1.366,0.257,2.066c0.065,0.7,0.118,1.404,0.163,2.11
+ c0.043,0.708,0.092,1.375,0.149,2.006l0.52,7.723c0.084,1.316,0.187,2.54,0.312,3.665c0.126,1.127,0.323,2.167,0.592,3.121
+ c0.281,0.999,0.701,1.708,1.262,2.124c0.561,0.417,1.229,0.517,2.006,0.298c0.71-0.199,1.322-0.515,1.836-0.946
+ c0.514-0.433,1.086-1.014,1.719-1.742l2.279,1.839C571.994,829.195,571.545,829.938,571.016,830.697z"/>
+ </g>
+ </g>
+ </g>
+ <rect x="624.589" y="845.629" width="300" height="2.896"/>
+ <rect x="624.589" y="840.4" width="160" height="6.676"/>
+ <g id="photo_icon_1_">
+ <path d="M839.582,807.46v21.678H811.78V807.46H839.582 M843.353,803.69H808.01v29.217h35.343V803.69L843.353,803.69z"/>
+ <g>
+ <defs>
+ <rect id="SVGID_13_" x="813.311" y="809.031" width="24.662" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_14_">
+ <use xlink:href="#SVGID_13_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_14_)">
+ <circle cx="825.682" cy="816.021" r="6.283"/>
+ <path d="M836.111,838.716c-0.426,3.36-3.404,7.016-6.035,7.529c-2.93,0.474-5.859,0.474-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.521c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.93-0.474,5.859-0.474,8.789,0c2.631,0.514,5.609,4.17,6.035,7.529C836.447,832.368,836.447,835.542,836.111,838.716z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_14_)">
+ <circle cx="837.855" cy="816.297" r="4.516"/>
+ <path d="M845.352,832.608c-0.306,2.415-2.447,5.042-4.338,5.411c-2.105,0.341-4.211,0.341-6.316,0
+ c-1.892-0.369-4.033-2.996-4.339-5.411c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.042,4.339-5.411
+ c2.105-0.341,4.211-0.341,6.316,0c1.891,0.369,4.032,2.997,4.338,5.411C845.593,828.046,845.593,830.327,845.352,832.608z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_14_)">
+ <circle cx="813.311" cy="816.297" r="4.516"/>
+ <path d="M820.809,832.608c-0.307,2.415-2.447,5.042-4.338,5.411c-2.106,0.341-4.212,0.341-6.318,0
+ c-1.891-0.369-4.031-2.996-4.338-5.411c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.042,4.338-5.411
+ c2.106-0.341,4.212-0.341,6.318,0c1.891,0.369,4.031,2.997,4.338,5.411C821.049,828.046,821.049,830.327,820.809,832.608z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <polygon points="889.016,802.435 893.889,812.311 904.787,813.894 896.901,821.58 898.764,832.435 889.016,827.311
+ 879.268,832.435 881.13,821.58 873.244,813.894 884.143,812.311 "/>
+ </g>
+ <g>
+ <circle cx="1599.396" cy="820.274" r="5"/>
+ <circle cx="1617.478" cy="810.274" r="5"/>
+ <circle cx="1617.478" cy="830.607" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="1617.478,810.274 1599.396,820.274
+ 1617.478,830.607 "/>
+ </g>
+ <g>
+ <path d="M1541.36,810.127l3.08,6.241l0.465,0.943l1.041,0.151l6.887,1l-4.982,4.857l-0.754,0.734l0.178,1.036l1.178,6.86
+ l-6.161-3.238l-0.931-0.489l-0.931,0.489l-6.161,3.238l1.178-6.86l0.178-1.036l-0.754-0.734l-4.982-4.857l6.887-1l1.041-0.151
+ l0.465-0.943L1541.36,810.127 M1541.36,805.607l-4.873,9.876l-10.898,1.583l7.886,7.687l-1.862,10.854l9.748-5.124l9.748,5.124
+ l-1.862-10.854l7.886-7.687l-10.898-1.583L1541.36,805.607L1541.36,805.607z"/>
+ </g>
+ </g>
+ <g id="Swipe_Tabs">
+ <rect x="495.258" y="848.578" fill="#BCBEC0" width="393.758" height="44.124"/>
+ <text transform="matrix(1 0 0 1 617.5132 873.5786)" font-family="'Roboto-Bold'" font-size="12">WORLD NEWS</text>
+ <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="875.0088" y1="869.5352" x2="888.9658" y2="869.5352">
+ <stop offset="0" style="stop-color:#000000"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
+ </linearGradient>
+ <path fill="url(#SVGID_15_)" d="M875.009,873.578v-8.203h2.736c0.977,0,1.74,0.189,2.289,0.566s0.822,0.938,0.822,1.684
+ c0,0.371-0.1,0.705-0.299,1s-0.488,0.518-0.867,0.67c0.52,0.098,0.912,0.322,1.178,0.674s0.398,0.76,0.398,1.225
+ c0,0.781-0.264,1.375-0.791,1.779s-1.27,0.605-2.227,0.605H875.009z M876.649,868.814h1.23c0.426-0.008,0.756-0.102,0.988-0.283
+ s0.348-0.441,0.348-0.777c0-0.379-0.123-0.658-0.369-0.838s-0.613-0.27-1.102-0.27h-1.096V868.814z M876.649,869.945v2.367h1.6
+ c0.449,0,0.791-0.094,1.025-0.283s0.352-0.471,0.352-0.842c0-0.383-0.109-0.682-0.33-0.898s-0.553-0.332-0.994-0.344h-0.07
+ H876.649z M888.966,865.375v5.367c0,0.93-0.305,1.654-0.914,2.174s-1.408,0.779-2.396,0.779c-0.98,0-1.771-0.26-2.375-0.779
+ s-0.906-1.244-0.906-2.174v-5.367h1.641v5.367c0,0.551,0.146,0.971,0.438,1.258s0.691,0.43,1.203,0.43
+ c0.523,0,0.934-0.143,1.229-0.43s0.441-0.707,0.441-1.258v-5.367H888.966z"/>
+ <path d="M766.454,871.398c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527c-0.945-0.277-1.654-0.609-2.127-0.996
+ s-0.709-0.918-0.709-1.594s0.264-1.225,0.791-1.648s1.223-0.637,2.086-0.637c0.918,0,1.646,0.229,2.186,0.684
+ s0.799,1.055,0.779,1.801l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943s-0.578-0.322-1.031-0.322
+ c-0.414,0-0.721,0.096-0.92,0.285s-0.299,0.439-0.299,0.752c0,0.285,0.113,0.518,0.338,0.695s0.631,0.361,1.221,0.553
+ c0.922,0.258,1.617,0.586,2.084,0.984s0.699,0.934,0.699,1.605c0,0.707-0.273,1.27-0.822,1.686s-1.277,0.623-2.184,0.623
+ c-0.887,0-1.645-0.219-2.275-0.658s-0.938-1.094-0.918-1.961l0.012-0.035h1.588c0,0.484,0.143,0.84,0.428,1.066
+ s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S766.454,871.715,766.454,871.398z M771.019,870.719v2.859h-1.641v-8.203
+ h3.199c0.949,0,1.701,0.25,2.254,0.748s0.828,1.139,0.828,1.924c0,0.789-0.275,1.432-0.828,1.928s-1.305,0.744-2.254,0.744
+ H771.019z M771.019,869.447h1.559c0.473,0,0.832-0.133,1.076-0.398s0.365-0.596,0.365-0.99c0-0.398-0.121-0.732-0.365-1.004
+ s-0.604-0.408-1.076-0.408h-1.559V869.447z M783.593,870.215c0,1.008-0.324,1.84-0.973,2.496s-1.49,0.984-2.525,0.984
+ c-1.031,0-1.867-0.328-2.508-0.984s-0.961-1.488-0.961-2.496v-1.477c0-1,0.32-1.83,0.961-2.49s1.475-0.99,2.502-0.99
+ c1.035,0,1.879,0.33,2.529,0.99s0.975,1.49,0.975,2.49V870.215z M781.952,868.727c0-0.637-0.166-1.16-0.498-1.57
+ s-0.787-0.615-1.365-0.615c-0.574,0-1.021,0.205-1.342,0.613s-0.48,0.932-0.48,1.572v1.488c0,0.648,0.162,1.178,0.484,1.588
+ s0.77,0.615,1.344,0.615c0.582,0,1.037-0.205,1.365-0.615s0.492-0.939,0.492-1.588V868.727z M786.546,870.297v3.281h-1.641v-8.203
+ h2.93c0.949,0,1.691,0.213,2.227,0.639s0.803,1.02,0.803,1.781c0,0.426-0.111,0.791-0.336,1.096s-0.555,0.553-0.988,0.744
+ c0.484,0.145,0.834,0.383,1.049,0.715s0.322,0.742,0.322,1.23v0.609c0,0.227,0.033,0.465,0.098,0.715s0.17,0.436,0.318,0.557
+ v0.117h-1.688c-0.152-0.121-0.25-0.32-0.295-0.598s-0.068-0.545-0.068-0.803v-0.586c0-0.406-0.115-0.723-0.346-0.951
+ s-0.555-0.344-0.973-0.344H786.546z M786.546,869.025h1.254c0.484,0,0.844-0.096,1.076-0.289s0.348-0.482,0.348-0.865
+ c0-0.375-0.117-0.672-0.352-0.893s-0.58-0.332-1.037-0.332h-1.289V869.025z M797.972,866.646h-2.414v6.932h-1.641v-6.932h-2.385
+ v-1.271h6.439V866.646z M803.093,871.398c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527
+ c-0.945-0.277-1.654-0.609-2.127-0.996s-0.709-0.918-0.709-1.594s0.264-1.225,0.791-1.648s1.223-0.637,2.086-0.637
+ c0.918,0,1.646,0.229,2.186,0.684s0.799,1.055,0.779,1.801l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943
+ s-0.578-0.322-1.031-0.322c-0.414,0-0.721,0.096-0.92,0.285s-0.299,0.439-0.299,0.752c0,0.285,0.113,0.518,0.338,0.695
+ s0.631,0.361,1.221,0.553c0.922,0.258,1.617,0.586,2.084,0.984s0.699,0.934,0.699,1.605c0,0.707-0.273,1.27-0.822,1.686
+ s-1.277,0.623-2.184,0.623c-0.887,0-1.645-0.219-2.275-0.658s-0.938-1.094-0.918-1.961l0.012-0.035h1.588
+ c0,0.484,0.143,0.84,0.428,1.066s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S803.093,871.715,803.093,871.398z"/>
+ <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="562.1348" y1="869.4766" x2="505.4219" y2="869.4766">
+ <stop offset="0" style="stop-color:#000000"/>
+ <stop offset="1" style="stop-color:#000000;stop-opacity:0"/>
+ </linearGradient>
+ <path fill="url(#SVGID_16_)" d="M511.861,866.646h-2.414v6.932h-1.641v-6.932h-2.385v-1.271h6.439V866.646z M519.197,870.215
+ c0,1.008-0.324,1.84-0.973,2.496s-1.49,0.984-2.525,0.984c-1.031,0-1.867-0.328-2.508-0.984s-0.961-1.488-0.961-2.496v-1.477
+ c0-1,0.32-1.83,0.961-2.49s1.475-0.99,2.502-0.99c1.035,0,1.878,0.33,2.528,0.99s0.976,1.49,0.976,2.49V870.215z M517.557,868.727
+ c0-0.637-0.166-1.16-0.498-1.57s-0.787-0.615-1.365-0.615c-0.574,0-1.021,0.205-1.342,0.613s-0.48,0.932-0.48,1.572v1.488
+ c0,0.648,0.161,1.178,0.483,1.588s0.771,0.615,1.345,0.615c0.582,0,1.037-0.205,1.365-0.615s0.492-0.939,0.492-1.588V868.727z
+ M522.15,870.719v2.859h-1.641v-8.203h3.199c0.949,0,1.7,0.25,2.253,0.748s0.829,1.139,0.829,1.924
+ c0,0.789-0.276,1.432-0.829,1.928s-1.304,0.744-2.253,0.744H522.15z M522.15,869.447h1.559c0.473,0,0.831-0.133,1.075-0.398
+ s0.366-0.596,0.366-0.99c0-0.398-0.122-0.732-0.366-1.004s-0.603-0.408-1.075-0.408h-1.559V869.447z M537.637,873.578h-1.641
+ l-3.416-5.59L532.545,868v5.578h-1.635v-8.203h1.635l3.416,5.578l0.035-0.012v-5.566h1.641V873.578z M543.936,869.975h-3.123
+ v2.338h3.709v1.266h-5.35v-8.203h5.332v1.271h-3.691v2.057h3.123V869.975z M552.361,871.059h0.035l1.125-5.684h1.693l-1.957,8.203
+ h-1.559l-1.518-5.367h-0.035l-1.506,5.367h-1.564l-1.957-8.203h1.693l1.131,5.678h0.035l1.518-5.678h1.342L552.361,871.059z
+ M560.494,871.398c0-0.312-0.107-0.559-0.322-0.738s-0.609-0.355-1.184-0.527c-0.945-0.277-1.654-0.609-2.127-0.996
+ s-0.709-0.918-0.709-1.594s0.264-1.225,0.791-1.648s1.223-0.637,2.086-0.637c0.918,0,1.646,0.229,2.186,0.684
+ s0.799,1.055,0.779,1.801l-0.012,0.035h-1.588c0-0.414-0.117-0.729-0.352-0.943s-0.578-0.322-1.031-0.322
+ c-0.414,0-0.721,0.096-0.92,0.285s-0.299,0.439-0.299,0.752c0,0.285,0.112,0.518,0.337,0.695s0.632,0.361,1.222,0.553
+ c0.922,0.258,1.616,0.586,2.083,0.984s0.7,0.934,0.7,1.605c0,0.707-0.274,1.27-0.823,1.686s-1.276,0.623-2.183,0.623
+ c-0.887,0-1.646-0.219-2.276-0.658s-0.937-1.094-0.917-1.961l0.012-0.035h1.588c0,0.484,0.143,0.84,0.428,1.066
+ s0.674,0.34,1.166,0.34c0.449,0,0.789-0.096,1.02-0.287S560.494,871.715,560.494,871.398z"/>
+ <rect x="495.258" y="889.807" width="393.758" height="2.896"/>
+ <rect x="592.183" y="884.578" width="126.148" height="6.676"/>
+ </g>
+ <g id="News_Items">
+ <rect x="495.258" y="892.702" fill="#FFFFFF" width="393.758" height="96.925"/>
+ <rect x="791.539" y="892.702" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="511.017" y="912.295" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 511.0166 925.4785)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="959.578" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 511.0166 969.832)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="989.627" x2="888.465" y2="989.627"/>
+ <rect x="495.258" y="989.627" fill="#FFFFFF" width="393.758" height="96.925"/>
+ <rect x="791.539" y="989.627" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="511.017" y="1009.219" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 511.0166 1022.4023)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="1056.504" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 511.0166 1066.7573)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="1086.552" x2="888.465" y2="1086.552"/>
+ <rect x="495.258" y="1086.552" fill="#FFFFFF" width="393.758" height="96.925"/>
+ <rect x="791.539" y="1086.552" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="511.017" y="1106.145" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 511.0166 1119.3281)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="1153.428" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 511.0166 1163.6826)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="1183.477" x2="888.465" y2="1183.477"/>
+ <rect x="495.258" y="1183.477" fill="#CCECFC" width="393.758" height="96.925"/>
+ <rect x="791.539" y="1183.477" fill="#8AC7E3" width="96.926" height="96.925"/>
+ <rect x="511.017" y="1203.068" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 511.0166 1216.252)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="1250.354" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 511.0166 1260.6064)" fill="#00AEEF" font-family="'Roboto-Regular'" font-size="14">10 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="1280.401" x2="888.465" y2="1280.401"/>
+ <rect x="495.258" y="1280.401" fill="#FFFFFF" width="393.758" height="96.925"/>
+ <rect x="791.539" y="1280.401" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="511.017" y="1299.993" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 511.0166 1313.1768)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="1347.278" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 511.0166 1357.5322)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">11 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="1377.326" x2="888.465" y2="1377.326"/>
+ <rect x="495.258" y="1377.326" fill="#FFFFFF" width="393.758" height="96.925"/>
+ <rect x="791.539" y="1377.326" fill="#E6E7E8" width="96.926" height="96.925"/>
+ <rect x="511.017" y="1396.918" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 511.0166 1410.1016)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="511.017" y="1444.203" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 511.0166 1454.4561)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">20 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="495.019" y1="1474.251" x2="888.465" y2="1474.251"/>
+ <rect x="495.258" y="1474.251" fill="#FFFFFF" width="393.758" height="62.369"/>
+ <rect x="791.539" y="1474.251" fill="#E6E7E8" width="96.926" height="62.369"/>
+ <rect x="511.017" y="1493.843" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 511.0166 1507.0264)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <polygon fill="#FFC91F" points="495.257,1009.127 495.257,989.627 514.757,989.627 "/>
+ <polygon fill="#FFC91F" points="495.257,1106.052 495.257,1086.552 514.757,1086.552 "/>
+ </g>
+ <g id="News_detail">
+ <g>
+ <rect x="928.739" y="1021.602" fill="#E6E7E8" width="493.474" height="313.352"/>
+ <rect x="1431.218" y="1021.602" fill="#E6E7E8" width="152.172" height="152.173"/>
+ <rect x="1431.218" y="1182.779" fill="#E6E7E8" width="152.172" height="152.174"/>
+ <rect x="1592.396" y="1021.602" fill="#E6E7E8" width="152.174" height="152.173"/>
+ <rect x="1592.396" y="1182.779" fill="#E6E7E8" width="152.174" height="152.174"/>
+ </g>
+ <rect x="928.739" y="883.953" fill="none" width="494.85" height="78.748"/>
+ <text transform="matrix(1 0 0 1 928.7393 910.3203)"><tspan x="0" y="0" font-family="'Roboto-Regular'" font-size="36">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="43.2" font-family="'Roboto-Regular'" font-size="36">consectetur adipiscing elit.</tspan></text>
+ <rect x="928.739" y="1371.203" fill="none" width="388.85" height="152.74"/>
+ <text transform="matrix(1 0 0 1 928.7393 1384.8828)"><tspan x="0" y="0" font-family="'DroidSerif-Bold'" font-size="18">WASHINGTON,</tspan><tspan x="138.683" y="0" font-family="'DroidSerif-Bold'" font-size="18" letter-spacing="4"> </tspan><tspan x="147.372" y="0" font-family="'DroidSerif-Bold'" font-size="18">DC</tspan><tspan x="173.203" y="0" font-family="'DroidSerif-Bold'" font-size="18" letter-spacing="4"> </tspan><tspan x="181.892" y="0" font-family="'DroidSerif'" font-size="18">—</tspan><tspan x="199.892" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="4"> </tspan><tspan x="208.581" y="0" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="283.402" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="4"> </tspan><tspan x="292.091" y="0" font-family="'DroidSerif'" font-size="18">vestibulum </tspan><tspan x="0" y="26" font-family="'DroidSerif'" font-size="18">nisl</tspan><tspan x="31.069" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="37.146" y="26" font-family="'DroidSerif'" font-size="18">sapien,</tspan><tspan x="97.948" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="104.025" y="26" font-family="'DroidSerif'" font-size="18">eu</tspan><tspan x="125.083" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="131.16" y="26" font-family="'DroidSerif'" font-size="18">convallis</tspan><tspan x="207.616" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="213.692" y="26" font-family="'DroidSerif'" font-size="18">nisl.</tspan><tspan x="249.912" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="255.988" y="26" font-family="'DroidSerif'" font-size="18">Nam</tspan><tspan x="296.866" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="302.942" y="26" font-family="'DroidSerif'" font-size="18">id</tspan><tspan x="319.747" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="325.823" y="26" font-family="'DroidSerif'" font-size="18">sodales </tspan><tspan x="0" y="52" font-family="'DroidSerif'" font-size="18">elit.</tspan><tspan x="32.458" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="36.495" y="52" font-family="'DroidSerif'" font-size="18">Vestibulum</tspan><tspan x="134.976" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="139.013" y="52" font-family="'DroidSerif'" font-size="18">sollicitudin</tspan><tspan x="235.235" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="239.272" y="52" font-family="'DroidSerif'" font-size="18">faucibus</tspan><tspan x="312.688" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="316.724" y="52" font-family="'DroidSerif'" font-size="18">orci,</tspan><tspan x="354.71" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="358.747" y="52" font-family="'DroidSerif'" font-size="18">nec </tspan><tspan x="0" y="78" font-family="'DroidSerif'" font-size="18">consequat</tspan><tspan x="87.557" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="91.468" y="78" font-family="'DroidSerif'" font-size="18">velit</tspan><tspan x="129.2" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="133.112" y="78" font-family="'DroidSerif'" font-size="18">suscipit</tspan><tspan x="198.538" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="202.449" y="78" font-family="'DroidSerif'" font-size="18">vitae.</tspan><tspan x="249.884" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="253.795" y="78" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="328.617" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="332.529" y="78" font-family="'DroidSerif'" font-size="18">et</tspan><tspan x="348.499" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="352.41" y="78" font-family="'DroidSerif'" font-size="18">con</tspan><tspan x="383.269" y="78" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="104" font-family="'DroidSerif'" font-size="18">dimentum</tspan><tspan x="89.824" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="95.802" y="104" font-family="'DroidSerif'" font-size="18">massa.</tspan><tspan x="154.469" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="160.446" y="104" font-family="'DroidSerif'" font-size="18">Etiam</tspan><tspan x="210.895" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="216.873" y="104" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="270.231" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="276.208" y="104" font-family="'DroidSerif'" font-size="18">nulla,</tspan><tspan x="325.04" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="331.018" y="104" font-family="'DroidSerif'" font-size="18">lacinia </tspan><tspan x="0" y="130" font-family="'DroidSerif'" font-size="18">ut</tspan><tspan x="17.763" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="24.595" y="130" font-family="'DroidSerif'" font-size="18">semper</tspan><tspan x="88.518" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="95.35" y="130" font-family="'DroidSerif'" font-size="18">eu,</tspan><tspan x="120.909" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="127.741" y="130" font-family="'DroidSerif'" font-size="18">aliquam</tspan><tspan x="198.827" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="205.659" y="130" font-family="'DroidSerif'" font-size="18">eu</tspan><tspan x="226.717" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="233.549" y="130" font-family="'DroidSerif'" font-size="18">lacus.</tspan><tspan x="282.821" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="289.653" y="130" font-family="'DroidSerif'" font-size="18">Aenean</tspan><tspan x="354.965" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="361.797" y="130" font-family="'DroidSerif'" font-size="18">ali</tspan><tspan x="383.269" y="130" font-family="'DroidSerif'" font-size="18">-</tspan></text>
+ <rect x="1355.589" y="1371.203" fill="none" width="388.98" height="152.74"/>
+ <text transform="matrix(1 0 0 1 1355.5889 1384.8828)"><tspan x="0" y="0" font-family="'DroidSerif'" font-size="18">quam</tspan><tspan x="49.614" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="56.883" y="0" font-family="'DroidSerif'" font-size="18">magna</tspan><tspan x="115.454" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="122.723" y="0" font-family="'DroidSerif'" font-size="18">eget</tspan><tspan x="158.011" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="165.28" y="0" font-family="'DroidSerif'" font-size="18">libero</tspan><tspan x="216.169" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="223.438" y="0" font-family="'DroidSerif'" font-size="18">aliquam</tspan><tspan x="294.523" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="301.792" y="0" font-family="'DroidSerif'" font-size="18">quis</tspan><tspan x="338.144" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="345.413" y="0" font-family="'DroidSerif'" font-size="18">dapi</tspan><tspan x="383.399" y="0" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="26" font-family="'DroidSerif'" font-size="18">bus</tspan><tspan x="30.595" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="36.199" y="26" font-family="'DroidSerif'" font-size="18">sapien</tspan><tspan x="92.502" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="98.106" y="26" font-family="'DroidSerif'" font-size="18">auctor.</tspan><tspan x="158.883" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="164.487" y="26" font-family="'DroidSerif'" font-size="18">Cras</tspan><tspan x="202.271" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="207.876" y="26" font-family="'DroidSerif'" font-size="18">a</tspan><tspan x="218.01" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="223.614" y="26" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="276.973" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="282.577" y="26" font-family="'DroidSerif'" font-size="18">in</tspan><tspan x="299.944" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="305.549" y="26" font-family="'DroidSerif'" font-size="18">eros</tspan><tspan x="342.173" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="347.777" y="26" font-family="'DroidSerif'" font-size="18">plac</tspan><tspan x="383.399" y="26" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="52" font-family="'DroidSerif'" font-size="18">erat</tspan><tspan x="34.585" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="38.451" y="52" font-family="'DroidSerif'" font-size="18">tempor.</tspan><tspan x="106.496" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="110.362" y="52" font-family="'DroidSerif'" font-size="18">Integer</tspan><tspan x="172.352" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="176.218" y="52" font-family="'DroidSerif'" font-size="18">vitae</tspan><tspan x="218.502" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="222.368" y="52" font-family="'DroidSerif'" font-size="18">mauris</tspan><tspan x="283.294" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="287.16" y="52" font-family="'DroidSerif'" font-size="18">turpis,</tspan><tspan x="342.83" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="346.696" y="52" font-family="'DroidSerif'" font-size="18">vitae </tspan><tspan x="0" y="78" font-family="'DroidSerif'" font-size="18">gravida</tspan><tspan x="65.663" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="69.74" y="78" font-family="'DroidSerif'" font-size="18">tellus.</tspan><tspan x="121.569" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="125.646" y="78" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="200.468" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="204.545" y="78" font-family="'DroidSerif'" font-size="18">tincidunt</tspan><tspan x="283.286" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="287.363" y="78" font-family="'DroidSerif'" font-size="18">orci</tspan><tspan x="320.85" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="324.927" y="78" font-family="'DroidSerif'" font-size="18">et</tspan><tspan x="340.896" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="344.974" y="78" font-family="'DroidSerif'" font-size="18">enim </tspan><tspan x="0" y="104" font-family="'DroidSerif'" font-size="18">gravida</tspan><tspan x="65.663" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="72.832" y="104" font-family="'DroidSerif'" font-size="18">non</tspan><tspan x="106.441" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="113.61" y="104" font-family="'DroidSerif'" font-size="18">commodo</tspan><tspan x="198.697" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="205.866" y="104" font-family="'DroidSerif'" font-size="18">turpis</tspan><tspan x="257.036" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="264.205" y="104" font-family="'DroidSerif'" font-size="18">malesuada.</tspan><tspan x="362.572" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="369.741" y="104" font-family="'DroidSerif'" font-size="18">Ut </tspan><tspan x="0" y="130" font-family="'DroidSerif'" font-size="18">dapibus</tspan><tspan x="68.581" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="77.202" y="130" font-family="'DroidSerif'" font-size="18">luctus</tspan><tspan x="128.952" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="137.573" y="130" font-family="'DroidSerif'" font-size="18">dictum.</tspan><tspan x="203.157" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="211.778" y="130" font-family="'DroidSerif'" font-size="18">Nam</tspan><tspan x="252.656" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="261.277" y="130" font-family="'DroidSerif'" font-size="18">in</tspan><tspan x="278.645" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="287.266" y="130" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="340.624" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="349.245" y="130" font-family="'DroidSerif'" font-size="18">erat. </tspan></text>
+ <rect x="928.449" y="970.111" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 928.4492 980.3657)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">January 1, 2012</text>
+ </g>
+</g>
+<g id="News_View__x28_alt_x29_">
+ <g id="_x31_0_x22__Tablet_10_">
+ <path fill="#231F20" d="M5043.762,1669.576h-1279.97c-41.851,0-75.898-34.049-75.898-75.898V793.696
+ c0-41.851,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.048,75.898,75.898v799.982
+ C5119.66,1635.527,5085.612,1669.576,5043.762,1669.576z"/>
+ <g>
+ <path fill="#FFFFFF" d="M5043.762,736.981c31.273,0,56.715,25.442,56.715,56.715v799.982c0,31.271-25.441,56.715-56.715,56.715
+ h-1279.97c-31.272,0-56.715-25.443-56.715-56.715V793.696c0-31.272,25.442-56.715,56.715-56.715H5043.762 M5043.762,733.981
+ h-1279.97c-32.927,0-59.715,26.788-59.715,59.715v799.982c0,32.926,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.789,59.715-59.715V793.696C5103.477,760.769,5076.688,733.981,5043.762,733.981L5043.762,733.981z"/>
+ </g>
+ <g>
+ <rect x="3762.276" y="792.52" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M5043.776,794.02v800h-1280v-800H5043.776 M5046.776,791.02h-3h-1280h-3v3v800v3h3h1280h3v-3v-800V791.02
+ L5046.776,791.02z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M4403.776,778.41c-8.276,0-15.011-6.751-15.011-15.048
+ c0-8.296,6.734-15.048,15.011-15.048c8.277,0,15.012,6.752,15.012,15.048C4418.788,771.659,4412.054,778.41,4403.776,778.41z"/>
+ <rect x="3763.792" y="1537.855" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M3806.364,1557.822c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.877,6.892,6.877l3.062-0.148l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.268-5.638-6.113
+ c-3.829-2.846-6.822-2.627-8.912-2.762c-2.086-0.135-8.349-0.049-8.349-0.049l6.471-6.496L3806.364,1557.822z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="3893.626,1553.67 3879.163,1567.752 3880.832,1569.355
+ 3893.838,1556.598 3906.559,1569.215 3908.297,1567.822 3902.665,1562.385 3902.665,1555.553 3900.441,1555.553
+ 3900.441,1560.084 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="3887.088,1569.146 3884.795,1570.75 3884.795,1577.861
+ 3902.527,1577.861 3902.527,1570.75 3900.37,1568.936 3900.37,1575.84 3887.088,1575.84 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M3982.929,1579.162h-22.172v-19.174h22.172V1579.162z M3963.356,1576.562h16.973v-13.975h-16.973
+ V1576.562z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="3967.405,1553.34 3967.405,1557.246 3970.005,1557.246 3970.005,1555.939 3986.978,1555.939
+ 3986.978,1569.912 3985.673,1569.912 3985.673,1572.512 3989.577,1572.512 3989.577,1553.34 "/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_9">
+ <rect x="3763.776" y="793.376" fill="#FFC91F" width="1280.001" height="56.167"/>
+ <text transform="matrix(1 0 0 1 3908.8496 827.21)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <g id="overflow_9_">
+ <rect x="5008.337" y="808.652" width="5.542" height="5.542"/>
+ <rect x="5008.337" y="819.023" width="5.542" height="5.541"/>
+ <rect x="5008.337" y="829.395" width="5.542" height="5.541"/>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_17_" x="3763.776" y="793.376" width="1280.001" height="56.167"/>
+ </defs>
+ <clipPath id="SVGID_18_">
+ <use xlink:href="#SVGID_17_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_18_)">
+ <g>
+ <path d="M3888.024,833.906l-11.359-40.39c-1.082-3.847-5.076-6.087-8.922-5.005l-1.916,0.539l11.869,42.202
+ c0.155,0.553,0.459,1.045,0.877,1.43c0.41,0.377,0.915,0.637,1.457,0.75c0.235,0.047,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.275c0.034,1.104-0.696,2.051-1.712,2.338c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.035-1.824-0.16c-1.37-0.287-2.638-0.939-3.671-1.885c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.685c-1.082-3.846-5.076-6.086-8.923-5.005l-51.01,14.346c-3.847,1.081-6.087,5.076-5.005,8.923l14.296,50.835
+ c1.081,3.844,5.075,6.086,8.923,5.004l64.414-18.115C3886.865,841.746,3889.106,837.752,3888.024,833.906z M3859.535,831.717
+ c-0.528,0.76-1.158,1.48-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.014-3.316,1.363
+ c-2.62,0.736-4.801,0.688-6.547-0.152c-1.744-0.838-2.926-2.355-3.543-4.555c-0.549-1.951-0.945-4.764-1.186-8.432l-0.42-5.703
+ c-0.035-0.468-0.076-1.043-0.125-1.725c-0.047-0.681-0.103-1.39-0.168-2.127c-0.062-0.735-0.143-1.468-0.238-2.195
+ c-0.098-0.727-0.224-1.368-0.38-1.923c-0.118-0.422-0.283-0.854-0.491-1.299c-0.209-0.443-0.473-0.826-0.789-1.145
+ c-0.317-0.317-0.691-0.547-1.127-0.688c-0.436-0.141-0.952-0.127-1.552,0.042c-0.776,0.219-1.474,0.696-2.094,1.432
+ c-0.619,0.738-1.164,1.635-1.634,2.688c-0.471,1.056-0.872,2.223-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.873
+ c-0.198,1.303-0.328,2.559-0.394,3.775s-0.072,2.295-0.024,3.238l0.986,16.789l-10.221,2.875l-1.905-28.746
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.326-0.064-0.635-0.1-0.926c-0.032-0.288-0.067-0.537-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.443c-0.175-0.62-0.381-1.102-0.619-1.441c-0.24-0.341-0.533-0.57-0.877-0.688
+ c-0.346-0.118-0.755-0.147-1.229-0.086c-0.474,0.061-1.033,0.184-1.677,0.363l-1.23,0.346l-0.421-3.797l15.148-4.26
+ l1.285,7.506l0.432-0.121c0.486-1.598,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.364,2.283-3.318
+ c0.881-0.953,1.902-1.77,3.067-2.443c1.163-0.675,2.499-1.225,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393
+ c1.107,0.145,2.066,0.49,2.88,1.041c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.823,1.238,2.867
+ c0.163,0.576,0.297,1.203,0.404,1.879c0.105,0.678,0.191,1.367,0.257,2.066c0.065,0.7,0.118,1.404,0.163,2.109
+ c0.043,0.708,0.092,1.375,0.149,2.007l0.52,7.723c0.084,1.316,0.187,2.539,0.312,3.664c0.126,1.127,0.323,2.168,0.592,3.121
+ c0.281,1,0.701,1.709,1.262,2.125s1.229,0.516,2.006,0.297c0.71-0.199,1.322-0.514,1.836-0.945
+ c0.514-0.434,1.086-1.014,1.719-1.742l2.279,1.838C3860.514,830.215,3860.064,830.957,3859.535,831.717z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle cx="4934.621" cy="821.293" r="5"/>
+ <circle cx="4952.703" cy="811.293" r="5"/>
+ <circle cx="4952.703" cy="831.627" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="4952.703,811.293 4934.621,821.293
+ 4952.703,831.627 "/>
+ </g>
+ <g>
+ <path d="M4876.586,811.147l3.08,6.24l0.465,0.943l1.041,0.152l6.887,1l-4.982,4.857l-0.754,0.734l0.178,1.035l1.178,6.861
+ l-6.161-3.238l-0.931-0.49l-0.931,0.49l-6.161,3.238l1.178-6.861l0.178-1.035l-0.754-0.734l-4.982-4.857l6.887-1l1.041-0.152
+ l0.465-0.943L4876.586,811.147 M4876.586,806.626l-4.873,9.876l-10.898,1.583l7.886,7.686l-1.862,10.855l9.748-5.125l9.748,5.125
+ l-1.862-10.855l7.886-7.686l-10.898-1.583L4876.586,806.626L4876.586,806.626z"/>
+ </g>
+ <polygon points="3780.913,822.24 3786.76,812.977 3781.784,812.977 3775.938,822.24 3781.784,831.504 3786.76,831.504 "/>
+ </g>
+ <g id="News_detail_copy">
+ <g>
+ <g>
+ <rect x="3996.007" y="1022.621" fill="#E6E7E8" width="493.474" height="313.352"/>
+ <rect x="4498.485" y="1022.621" fill="#E6E7E8" width="152.172" height="152.172"/>
+ <rect x="4498.485" y="1183.799" fill="#E6E7E8" width="152.172" height="152.174"/>
+ <rect x="4659.663" y="1022.621" fill="#E6E7E8" width="152.174" height="152.172"/>
+ <rect x="4659.663" y="1183.799" fill="#E6E7E8" width="152.174" height="152.174"/>
+ </g>
+ <rect x="3996.007" y="884.973" fill="none" width="494.85" height="78.748"/>
+ <text transform="matrix(1 0 0 1 3996.0068 911.3394)"><tspan x="0" y="0" font-family="'Roboto-Regular'" font-size="36">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="43.2" font-family="'Roboto-Regular'" font-size="36">consectetur adipiscing elit.</tspan></text>
+ <rect x="3996.007" y="1372.223" fill="none" width="388.85" height="152.74"/>
+ <text transform="matrix(1 0 0 1 3996.0068 1385.9014)"><tspan x="0" y="0" font-family="'DroidSerif-Bold'" font-size="18">WASHINGTON,</tspan><tspan x="138.683" y="0" font-family="'DroidSerif-Bold'" font-size="18" letter-spacing="4"> </tspan><tspan x="147.372" y="0" font-family="'DroidSerif-Bold'" font-size="18">DC</tspan><tspan x="173.202" y="0" font-family="'DroidSerif-Bold'" font-size="18" letter-spacing="4"> </tspan><tspan x="181.892" y="0" font-family="'DroidSerif'" font-size="18">—</tspan><tspan x="199.892" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="4"> </tspan><tspan x="208.581" y="0" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="283.401" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="4"> </tspan><tspan x="292.091" y="0" font-family="'DroidSerif'" font-size="18">vestibulum </tspan><tspan x="0" y="26" font-family="'DroidSerif'" font-size="18">nisl</tspan><tspan x="31.069" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="37.146" y="26" font-family="'DroidSerif'" font-size="18">sapien,</tspan><tspan x="97.948" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="104.024" y="26" font-family="'DroidSerif'" font-size="18">eu</tspan><tspan x="125.083" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="131.159" y="26" font-family="'DroidSerif'" font-size="18">convallis</tspan><tspan x="207.616" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="213.692" y="26" font-family="'DroidSerif'" font-size="18">nisl.</tspan><tspan x="249.911" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="255.987" y="26" font-family="'DroidSerif'" font-size="18">Nam</tspan><tspan x="296.866" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="302.942" y="26" font-family="'DroidSerif'" font-size="18">id</tspan><tspan x="319.747" y="26" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="325.823" y="26" font-family="'DroidSerif'" font-size="18">sodales </tspan><tspan x="0" y="52" font-family="'DroidSerif'" font-size="18">elit.</tspan><tspan x="32.458" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="36.495" y="52" font-family="'DroidSerif'" font-size="18">Vestibulum</tspan><tspan x="134.976" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="139.013" y="52" font-family="'DroidSerif'" font-size="18">sollicitudin</tspan><tspan x="235.235" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="239.272" y="52" font-family="'DroidSerif'" font-size="18">faucibus</tspan><tspan x="312.688" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="316.724" y="52" font-family="'DroidSerif'" font-size="18">orci,</tspan><tspan x="354.71" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="358.747" y="52" font-family="'DroidSerif'" font-size="18">nec </tspan><tspan x="0" y="78" font-family="'DroidSerif'" font-size="18">consequat</tspan><tspan x="87.557" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="91.468" y="78" font-family="'DroidSerif'" font-size="18">velit</tspan><tspan x="129.2" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="133.112" y="78" font-family="'DroidSerif'" font-size="18">suscipit</tspan><tspan x="198.538" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="202.449" y="78" font-family="'DroidSerif'" font-size="18">vitae.</tspan><tspan x="249.884" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="253.796" y="78" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="328.616" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="332.528" y="78" font-family="'DroidSerif'" font-size="18">et</tspan><tspan x="348.499" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="352.41" y="78" font-family="'DroidSerif'" font-size="18">con</tspan><tspan x="383.269" y="78" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="104" font-family="'DroidSerif'" font-size="18">dimentum</tspan><tspan x="89.824" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="95.802" y="104" font-family="'DroidSerif'" font-size="18">massa.</tspan><tspan x="154.469" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="160.446" y="104" font-family="'DroidSerif'" font-size="18">Etiam</tspan><tspan x="210.896" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="216.872" y="104" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="270.231" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="276.208" y="104" font-family="'DroidSerif'" font-size="18">nulla,</tspan><tspan x="325.04" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="1"> </tspan><tspan x="331.018" y="104" font-family="'DroidSerif'" font-size="18">lacinia </tspan><tspan x="0" y="130" font-family="'DroidSerif'" font-size="18">ut</tspan><tspan x="17.763" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="24.595" y="130" font-family="'DroidSerif'" font-size="18">semper</tspan><tspan x="88.518" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="95.351" y="130" font-family="'DroidSerif'" font-size="18">eu,</tspan><tspan x="120.909" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="127.741" y="130" font-family="'DroidSerif'" font-size="18">aliquam</tspan><tspan x="198.827" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="205.659" y="130" font-family="'DroidSerif'" font-size="18">eu</tspan><tspan x="226.718" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="233.55" y="130" font-family="'DroidSerif'" font-size="18">lacus.</tspan><tspan x="282.821" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="289.653" y="130" font-family="'DroidSerif'" font-size="18">Aenean</tspan><tspan x="354.965" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="361.797" y="130" font-family="'DroidSerif'" font-size="18">ali</tspan><tspan x="383.269" y="130" font-family="'DroidSerif'" font-size="18">-</tspan></text>
+ <rect x="4422.856" y="1372.223" fill="none" width="388.98" height="152.74"/>
+ <text transform="matrix(1 0 0 1 4422.8564 1385.9014)"><tspan x="0" y="0" font-family="'DroidSerif'" font-size="18">quam</tspan><tspan x="49.614" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="56.884" y="0" font-family="'DroidSerif'" font-size="18">magna</tspan><tspan x="115.454" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="122.723" y="0" font-family="'DroidSerif'" font-size="18">eget</tspan><tspan x="158.011" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="165.28" y="0" font-family="'DroidSerif'" font-size="18">libero</tspan><tspan x="216.169" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="223.438" y="0" font-family="'DroidSerif'" font-size="18">aliquam</tspan><tspan x="294.523" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="301.792" y="0" font-family="'DroidSerif'" font-size="18">quis</tspan><tspan x="338.144" y="0" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="345.413" y="0" font-family="'DroidSerif'" font-size="18">dapi</tspan><tspan x="383.399" y="0" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="26" font-family="'DroidSerif'" font-size="18">bus</tspan><tspan x="30.595" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="36.199" y="26" font-family="'DroidSerif'" font-size="18">sapien</tspan><tspan x="92.502" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="98.106" y="26" font-family="'DroidSerif'" font-size="18">auctor.</tspan><tspan x="158.883" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="164.487" y="26" font-family="'DroidSerif'" font-size="18">Cras</tspan><tspan x="202.271" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="207.876" y="26" font-family="'DroidSerif'" font-size="18">a</tspan><tspan x="218.01" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="223.614" y="26" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="276.973" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="282.577" y="26" font-family="'DroidSerif'" font-size="18">in</tspan><tspan x="299.944" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="305.549" y="26" font-family="'DroidSerif'" font-size="18">eros</tspan><tspan x="342.173" y="26" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="347.777" y="26" font-family="'DroidSerif'" font-size="18">plac</tspan><tspan x="383.399" y="26" font-family="'DroidSerif'" font-size="18">-</tspan><tspan x="0" y="52" font-family="'DroidSerif'" font-size="18">erat</tspan><tspan x="34.585" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="38.451" y="52" font-family="'DroidSerif'" font-size="18">tempor.</tspan><tspan x="106.496" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="110.362" y="52" font-family="'DroidSerif'" font-size="18">Integer</tspan><tspan x="172.352" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="176.218" y="52" font-family="'DroidSerif'" font-size="18">vitae</tspan><tspan x="218.502" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="222.368" y="52" font-family="'DroidSerif'" font-size="18">mauris</tspan><tspan x="283.294" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="287.16" y="52" font-family="'DroidSerif'" font-size="18">turpis,</tspan><tspan x="342.83" y="52" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="346.696" y="52" font-family="'DroidSerif'" font-size="18">vitae </tspan><tspan x="0" y="78" font-family="'DroidSerif'" font-size="18">gravida</tspan><tspan x="65.663" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="69.74" y="78" font-family="'DroidSerif'" font-size="18">tellus.</tspan><tspan x="121.569" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="125.646" y="78" font-family="'DroidSerif'" font-size="18">Praesent</tspan><tspan x="200.468" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="204.545" y="78" font-family="'DroidSerif'" font-size="18">tincidunt</tspan><tspan x="283.286" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="287.363" y="78" font-family="'DroidSerif'" font-size="18">orci</tspan><tspan x="320.85" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="324.927" y="78" font-family="'DroidSerif'" font-size="18">et</tspan><tspan x="340.896" y="78" font-family="'DroidSerif'" font-size="18"> </tspan><tspan x="344.974" y="78" font-family="'DroidSerif'" font-size="18">enim </tspan><tspan x="0" y="104" font-family="'DroidSerif'" font-size="18">gravida</tspan><tspan x="65.663" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="72.832" y="104" font-family="'DroidSerif'" font-size="18">non</tspan><tspan x="106.441" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="113.61" y="104" font-family="'DroidSerif'" font-size="18">commodo</tspan><tspan x="198.697" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="205.866" y="104" font-family="'DroidSerif'" font-size="18">turpis</tspan><tspan x="257.036" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="264.205" y="104" font-family="'DroidSerif'" font-size="18">malesuada.</tspan><tspan x="362.572" y="104" font-family="'DroidSerif'" font-size="18" letter-spacing="2"> </tspan><tspan x="369.741" y="104" font-family="'DroidSerif'" font-size="18">Ut </tspan><tspan x="0" y="130" font-family="'DroidSerif'" font-size="18">dapibus</tspan><tspan x="68.581" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="77.202" y="130" font-family="'DroidSerif'" font-size="18">luctus</tspan><tspan x="128.952" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="137.573" y="130" font-family="'DroidSerif'" font-size="18">dictum.</tspan><tspan x="203.157" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="211.778" y="130" font-family="'DroidSerif'" font-size="18">Nam</tspan><tspan x="252.656" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="261.277" y="130" font-family="'DroidSerif'" font-size="18">in</tspan><tspan x="278.645" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="287.266" y="130" font-family="'DroidSerif'" font-size="18">ipsum</tspan><tspan x="340.624" y="130" font-family="'DroidSerif'" font-size="18" letter-spacing="3"> </tspan><tspan x="349.245" y="130" font-family="'DroidSerif'" font-size="18">erat. </tspan></text>
+ <rect x="3995.717" y="971.131" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 3995.7168 981.3848)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">January 1, 2012</text>
+ </g>
+ </g>
+</g>
+<g id="News_List__x28_alt_x29_">
+ <g id="_x31_0_x22__Tablet_9_">
+ <path fill="#231F20" d="M3417.009,1669.576h-1279.97c-41.851,0-75.898-34.049-75.898-75.898V793.696
+ c0-41.851,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.048,75.898,75.898v799.982
+ C3492.907,1635.527,3458.859,1669.576,3417.009,1669.576z"/>
+ <g>
+ <path fill="#FFFFFF" d="M3417.009,736.981c31.273,0,56.715,25.442,56.715,56.715v799.982c0,31.271-25.441,56.715-56.715,56.715
+ h-1279.97c-31.272,0-56.715-25.443-56.715-56.715V793.696c0-31.272,25.442-56.715,56.715-56.715H3417.009 M3417.009,733.981
+ h-1279.97c-32.927,0-59.715,26.788-59.715,59.715v799.982c0,32.926,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.789,59.715-59.715V793.696C3476.724,760.769,3449.936,733.981,3417.009,733.981L3417.009,733.981z"/>
+ </g>
+ <g>
+ <rect x="2135.523" y="792.52" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M3417.023,794.02v800h-1280v-800H3417.023 M3420.023,791.02h-3h-1280h-3v3v800v3h3h1280h3v-3v-800V791.02
+ L3420.023,791.02z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M2777.023,778.41c-8.276,0-15.011-6.751-15.011-15.048
+ c0-8.296,6.734-15.048,15.011-15.048c8.277,0,15.012,6.752,15.012,15.048C2792.035,771.659,2785.301,778.41,2777.023,778.41z"/>
+ <rect x="2137.039" y="1537.855" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M2179.611,1557.822c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.877,6.892,6.877l3.062-0.148l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.268-5.638-6.113
+ c-3.829-2.846-6.822-2.627-8.912-2.762c-2.086-0.135-8.349-0.049-8.349-0.049l6.471-6.496L2179.611,1557.822z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2266.873,1553.67 2252.41,1567.752 2254.079,1569.355
+ 2267.085,1556.598 2279.806,1569.215 2281.544,1567.822 2275.912,1562.385 2275.912,1555.553 2273.688,1555.553
+ 2273.688,1560.084 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2260.335,1569.146 2258.042,1570.75 2258.042,1577.861
+ 2275.774,1577.861 2275.774,1570.75 2273.617,1568.936 2273.617,1575.84 2260.335,1575.84 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M2356.176,1579.162h-22.172v-19.174h22.172V1579.162z M2336.604,1576.562h16.973v-13.975h-16.973
+ V1576.562z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="2340.652,1553.34 2340.652,1557.246 2343.252,1557.246 2343.252,1555.939 2360.225,1555.939
+ 2360.225,1569.912 2358.92,1569.912 2358.92,1572.512 2362.824,1572.512 2362.824,1553.34 "/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_8">
+ <rect x="2137.023" y="793.376" fill="#FFC91F" width="1280.001" height="56.167"/>
+ <g>
+ <text transform="matrix(1 0 0 1 2336.0957 827.21)" font-family="'Roboto-Regular'" font-size="18">Stories</text>
+ <g id="news_icon_2_">
+ <g>
+ <g>
+ <path d="M2315.463,809.422h-0.863v19.039c0,0.248,0.068,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.52,0.484
+ c0.094,0.047,0.191,0.086,0.293,0.109c0.547,0.137,0.881,0.691,0.744,1.238c-0.115,0.465-0.531,0.775-0.99,0.775
+ c-0.08,0-0.164-0.01-0.246-0.031c-0.258-0.064-0.508-0.158-0.744-0.281c-0.539-0.281-0.992-0.703-1.312-1.221
+ c-0.33-0.533-0.505-1.146-0.505-1.775v-20.609c0-1.736-1.406-3.143-3.142-3.143h-23.012c-1.735,0-3.142,1.406-3.142,3.143
+ v22.933c0,1.734,1.406,3.141,3.142,3.141h29.059c1.736,0,3.143-1.406,3.143-3.141v-18.222
+ C2318.605,810.829,2317.199,809.422,2315.463,809.422z M2292.844,829.057h-7.304v-2.051h7.304V829.057z M2292.844,826.162
+ h-7.304v-2.051h7.304V826.162z M2301.562,829.057h-7.305v-2.051h7.305V829.057z M2301.562,826.162h-7.305v-2.051h7.305
+ V826.162z M2301.562,822.932h-16.022v-8.955h16.022V822.932z M2310.279,829.057h-7.303v-2.051h7.303V829.057z
+ M2310.279,826.162h-7.303v-2.051h7.303V826.162z M2310.279,823.266h-7.303v-2.051h7.303V823.266z M2310.279,820.371h-7.303
+ v-2.051h7.303V820.371z M2310.279,817.475h-7.303v-2.051h7.303V817.475z M2310.279,812.407h-24.739v-2.355h24.739V812.407z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_19_" x="2285.54" y="813.977" width="16.022" height="8.955"/>
+ </defs>
+ <clipPath id="SVGID_20_">
+ <use xlink:href="#SVGID_19_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_20_)">
+ <ellipse cx="2293.327" cy="817.368" rx="3.076" ry="3.048"/>
+ <path d="M2298.433,828.379c-0.208,1.631-1.667,3.404-2.954,3.652c-1.436,0.23-2.869,0.23-4.303,0
+ c-1.289-0.248-2.747-2.021-2.955-3.652c-0.164-1.539-0.164-3.08,0-4.619c0.208-1.631,1.666-3.404,2.955-3.652
+ c1.434-0.23,2.867-0.23,4.303,0c1.287,0.248,2.746,2.021,2.954,3.652C2298.598,825.299,2298.598,826.84,2298.433,828.379z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_2_">
+ <polygon points="3330.95,809.022 3330.95,819.023 3320.95,819.023 "/>
+ <polygon points="3304.7,834.164 3304.7,824.164 3314.7,824.164 "/>
+ <g>
+ <g>
+ <path d="M3317.825,812.469c4.146,0,7.641,2.767,8.751,6.554h4.119c-1.195-6.018-6.502-10.554-12.87-10.554
+ s-11.675,4.536-12.87,10.554h4.119C3310.185,815.236,3313.68,812.469,3317.825,812.469z M3317.825,830.719
+ c-4.146,0-7.641-2.768-8.751-6.555h-4.119c1.195,6.018,6.502,10.555,12.87,10.555s11.675-4.537,12.87-10.555h-4.119
+ C3325.466,827.951,3321.971,830.719,3317.825,830.719z"/>
+ </g>
+ </g>
+ </g>
+ <g id="overflow_3_">
+ <rect x="3381.584" y="808.652" width="5.542" height="5.542"/>
+ <rect x="3381.584" y="819.023" width="5.542" height="5.541"/>
+ <rect x="3381.584" y="829.395" width="5.542" height="5.541"/>
+ </g>
+ <g opacity="0.37">
+ <defs>
+ <rect id="SVGID_21_" x="2137.023" y="793.376" opacity="0.37" width="1280.001" height="56.167"/>
+ </defs>
+ <clipPath id="SVGID_22_">
+ <use xlink:href="#SVGID_21_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_22_)">
+ <g>
+ <path d="M2241.271,833.906l-11.359-40.39c-1.082-3.847-5.076-6.087-8.922-5.005l-1.916,0.539l11.869,42.202
+ c0.155,0.553,0.459,1.045,0.877,1.43c0.41,0.377,0.915,0.637,1.457,0.75c0.235,0.047,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.275c0.034,1.104-0.696,2.051-1.712,2.338c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.035-1.824-0.16c-1.37-0.287-2.638-0.939-3.671-1.885c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.685c-1.082-3.846-5.076-6.086-8.923-5.005l-51.01,14.346c-3.847,1.081-6.087,5.076-5.005,8.923l14.296,50.835
+ c1.081,3.844,5.075,6.086,8.923,5.004l64.414-18.115C2240.112,841.746,2242.354,837.752,2241.271,833.906z M2212.782,831.717
+ c-0.528,0.76-1.158,1.48-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.014-3.316,1.363
+ c-2.62,0.736-4.801,0.688-6.547-0.152c-1.744-0.838-2.926-2.355-3.543-4.555c-0.549-1.951-0.945-4.764-1.186-8.432l-0.42-5.703
+ c-0.035-0.468-0.076-1.043-0.125-1.725c-0.047-0.681-0.103-1.39-0.168-2.127c-0.062-0.735-0.143-1.468-0.238-2.195
+ c-0.098-0.727-0.224-1.368-0.38-1.923c-0.118-0.422-0.283-0.854-0.491-1.299c-0.209-0.443-0.473-0.826-0.789-1.145
+ c-0.317-0.317-0.691-0.547-1.127-0.688c-0.436-0.141-0.952-0.127-1.552,0.042c-0.776,0.219-1.474,0.696-2.094,1.432
+ c-0.619,0.738-1.164,1.635-1.634,2.688c-0.471,1.056-0.872,2.223-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.873
+ c-0.198,1.303-0.328,2.559-0.394,3.775s-0.072,2.295-0.024,3.238l0.986,16.789l-10.221,2.875l-1.905-28.746
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.326-0.064-0.635-0.1-0.926c-0.032-0.288-0.067-0.537-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.443c-0.175-0.62-0.381-1.102-0.619-1.441c-0.24-0.341-0.533-0.57-0.877-0.688
+ c-0.346-0.118-0.755-0.147-1.229-0.086c-0.474,0.061-1.033,0.184-1.677,0.363l-1.23,0.346l-0.421-3.797l15.148-4.26
+ l1.285,7.506l0.432-0.121c0.486-1.598,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.364,2.283-3.318
+ c0.881-0.953,1.902-1.77,3.067-2.443c1.163-0.675,2.499-1.225,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393
+ c1.107,0.145,2.066,0.49,2.88,1.041c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.823,1.238,2.867
+ c0.163,0.576,0.297,1.203,0.404,1.879c0.105,0.678,0.191,1.367,0.257,2.066c0.065,0.7,0.118,1.404,0.163,2.109
+ c0.043,0.708,0.092,1.375,0.149,2.007l0.52,7.723c0.084,1.316,0.187,2.539,0.312,3.664c0.126,1.127,0.323,2.168,0.592,3.121
+ c0.281,1,0.701,1.709,1.262,2.125s1.229,0.516,2.006,0.297c0.71-0.199,1.322-0.514,1.836-0.945
+ c0.514-0.434,1.086-1.014,1.719-1.742l2.279,1.838C2213.761,830.215,2213.312,830.957,2212.782,831.717z"/>
+ </g>
+ </g>
+ </g>
+ <rect x="2266.355" y="846.648" width="300" height="2.895"/>
+ <rect x="2266.355" y="841.42" width="160" height="6.676"/>
+ <g id="photo_icon_2_">
+ <path d="M2481.349,808.479v21.677h-27.802v-21.677H2481.349 M2485.119,804.709h-35.343v29.216h35.343V804.709L2485.119,804.709z"
+ />
+ <g>
+ <defs>
+ <rect id="SVGID_23_" x="2455.077" y="810.05" width="24.662" height="18.536"/>
+ </defs>
+ <clipPath id="SVGID_24_">
+ <use xlink:href="#SVGID_23_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_24_)">
+ <circle cx="2467.448" cy="817.041" r="6.283"/>
+ <path d="M2477.878,839.734c-0.426,3.361-3.404,7.016-6.035,7.529c-2.93,0.475-5.859,0.475-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.52c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.93-0.475,5.859-0.475,8.789,0c2.631,0.514,5.609,4.17,6.035,7.529C2478.214,833.387,2478.214,836.561,2477.878,839.734z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_24_)">
+ <circle cx="2479.622" cy="817.316" r="4.516"/>
+ <path d="M2487.118,833.627c-0.306,2.416-2.447,5.043-4.338,5.412c-2.105,0.34-4.211,0.34-6.316,0
+ c-1.892-0.369-4.033-2.996-4.339-5.412c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.041,4.339-5.41
+ c2.105-0.342,4.211-0.342,6.316,0c1.891,0.369,4.032,2.996,4.338,5.41C2487.359,829.064,2487.359,831.346,2487.118,833.627z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_24_)">
+ <circle cx="2455.078" cy="817.316" r="4.516"/>
+ <path d="M2462.575,833.627c-0.307,2.416-2.447,5.043-4.338,5.412c-2.106,0.34-4.212,0.34-6.318,0
+ c-1.891-0.369-4.031-2.996-4.338-5.412c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.041,4.338-5.41
+ c2.106-0.342,4.212-0.342,6.318,0c1.891,0.369,4.031,2.996,4.338,5.41C2462.815,829.064,2462.815,831.346,2462.575,833.627z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <polygon points="2530.782,803.454 2535.655,813.33 2546.554,814.913 2538.668,822.6 2540.53,833.453 2530.782,828.33
+ 2521.034,833.453 2522.896,822.6 2515.011,814.913 2525.909,813.33 "/>
+ </g>
+ </g>
+ <g id="News_Items_copy_3">
+ <rect x="2137.024" y="893.721" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2433.306" y="893.721" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2152.783" y="913.314" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2152.7832 926.4976)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2152.783" y="960.598" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2152.7832 970.8511)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="990.646" x2="2530.231" y2="990.646"/>
+ <rect x="2137.024" y="990.646" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2433.306" y="990.646" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2152.783" y="1010.238" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1023.4214)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2152.783" y="1057.523" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1067.7764)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="1087.57" x2="2530.231" y2="1087.57"/>
+ <rect x="2137.024" y="1087.57" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2433.306" y="1087.57" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2152.783" y="1107.164" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1120.3467)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2152.783" y="1154.447" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1164.7012)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="1184.496" x2="2530.231" y2="1184.496"/>
+ <rect x="2137.024" y="1184.496" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2433.306" y="1184.496" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2152.783" y="1204.088" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1217.2705)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <g>
+ <rect x="2152.783" y="1251.373" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1261.626)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 hours ago</text>
+ </g>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="1281.42" x2="2530.231" y2="1281.42"/>
+ <rect x="2137.024" y="1281.42" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2433.306" y="1281.42" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2152.783" y="1301.012" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1314.1963)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2152.783" y="1348.297" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1358.5508)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">11 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="1378.346" x2="2530.231" y2="1378.346"/>
+ <rect x="2137.024" y="1378.346" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2433.306" y="1378.346" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2152.783" y="1397.938" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1411.1201)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2152.783" y="1445.223" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1455.4756)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">20 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2136.785" y1="1475.27" x2="2530.231" y2="1475.27"/>
+ <rect x="2137.024" y="1475.27" fill="#FFFFFF" width="393.758" height="62.369"/>
+ <rect x="2433.306" y="1475.27" fill="#E6E7E8" width="96.926" height="62.369"/>
+ <rect x="2152.783" y="1494.861" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2152.7832 1508.0459)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <polygon fill="#FFC91F" points="2137.023,1010.146 2137.023,990.646 2156.523,990.646 "/>
+ <polygon fill="#FFC91F" points="2137.023,1107.07 2137.023,1087.57 2156.523,1087.57 "/>
+ <g id="Swipe_Tabs_copy_4">
+ <rect x="2137.024" y="849.598" fill="#BCBEC0" width="393.758" height="44.123"/>
+ <text transform="matrix(1 0 0 1 2296.2617 874.5977)" font-family="'Roboto-Bold'" font-size="12">WORLD NEWS</text>
+ <rect x="2137.024" y="890.826" width="393.758" height="2.895"/>
+ </g>
+ </g>
+ <g id="News_Items_copy_4">
+ <rect x="2551.021" y="893.721" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2847.303" y="893.721" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2566.78" y="913.314" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2566.7803 926.4976)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2566.78" y="960.598" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2566.7803 970.8511)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="990.646" x2="2944.229" y2="990.646"/>
+ <rect x="2551.021" y="990.646" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2847.303" y="990.646" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2566.78" y="1010.238" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1023.4214)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2566.78" y="1057.523" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1067.7764)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="1087.57" x2="2944.229" y2="1087.57"/>
+ <rect x="2551.021" y="1087.57" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2847.303" y="1087.57" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2566.78" y="1107.164" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1120.3467)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2566.78" y="1154.447" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1164.7012)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="1184.496" x2="2944.229" y2="1184.496"/>
+ <rect x="2551.021" y="1184.496" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2847.303" y="1184.496" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2566.78" y="1204.088" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1217.2705)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <g>
+ <rect x="2566.78" y="1251.373" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1261.626)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 hours ago</text>
+ </g>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="1281.42" x2="2944.229" y2="1281.42"/>
+ <rect x="2551.021" y="1281.42" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="2847.303" y="1281.42" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2566.78" y="1301.012" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1314.1963)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2566.78" y="1348.297" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1358.5508)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">11 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="1378.346" x2="2944.229" y2="1378.346"/>
+ <rect x="2551.021" y="1378.346" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="2847.303" y="1378.346" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2566.78" y="1397.938" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1411.1201)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2566.78" y="1445.223" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1455.4756)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">20 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2550.782" y1="1475.27" x2="2944.229" y2="1475.27"/>
+ <rect x="2551.021" y="1475.27" fill="#FFFFFF" width="393.758" height="62.369"/>
+ <rect x="2847.303" y="1475.27" fill="#E6E7E8" width="96.926" height="62.369"/>
+ <rect x="2566.78" y="1494.861" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2566.7803 1508.0459)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <polygon fill="#FFC91F" points="2551.021,1203.77 2551.021,1184.27 2570.521,1184.27 "/>
+ <g id="Swipe_Tabs_copy_5">
+ <rect x="2551.021" y="849.598" fill="#BCBEC0" width="393.758" height="44.123"/>
+ <text transform="matrix(1 0 0 1 2725.8086 874.5977)" font-family="'Roboto-Bold'" font-size="12">SPORTS</text>
+ <rect x="2551.021" y="890.826" width="393.758" height="2.895"/>
+ </g>
+ </g>
+ <g id="News_Items_copy_5">
+ <rect x="2965.019" y="893.721" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="3261.3" y="893.721" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2980.777" y="913.314" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2980.7773 926.4976)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2980.777" y="960.598" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2980.7773 970.8511)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">5 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="990.646" x2="3358.226" y2="990.646"/>
+ <rect x="2965.019" y="990.646" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="3261.3" y="990.646" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2980.777" y="1010.238" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1023.4214)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2980.777" y="1057.523" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1067.7764)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 minutes ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="1087.57" x2="3358.226" y2="1087.57"/>
+ <rect x="2965.019" y="1087.57" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="3261.3" y="1087.57" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2980.777" y="1107.164" fill="none" width="262.767" height="41.283"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1120.3467)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2980.777" y="1154.447" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1164.7012)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">3 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="1184.496" x2="3358.226" y2="1184.496"/>
+ <rect x="2965.019" y="1184.496" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="3261.3" y="1184.496" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2980.777" y="1204.088" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1217.2705)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <g>
+ <rect x="2980.777" y="1251.373" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1261.626)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">10 hours ago</text>
+ </g>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="1281.42" x2="3358.226" y2="1281.42"/>
+ <rect x="2965.019" y="1281.42" fill="#FFFFFF" width="393.758" height="96.926"/>
+ <rect x="3261.3" y="1281.42" fill="#E6E7E8" width="96.926" height="96.926"/>
+ <rect x="2980.777" y="1301.012" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1314.1963)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2980.777" y="1348.297" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1358.5508)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">11 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="1378.346" x2="3358.226" y2="1378.346"/>
+ <rect x="2965.019" y="1378.346" fill="#FFFFFF" width="393.758" height="96.924"/>
+ <rect x="3261.3" y="1378.346" fill="#E6E7E8" width="96.926" height="96.924"/>
+ <rect x="2980.777" y="1397.938" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1411.1201)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.601" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <rect x="2980.777" y="1445.223" fill="none" width="194.767" height="13.23"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1455.4756)" fill="#BCBEC0" font-family="'Roboto-Regular'" font-size="14">20 hours ago</text>
+
+ <line opacity="0.2" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" x1="2964.779" y1="1475.27" x2="3358.226" y2="1475.27"/>
+ <rect x="2965.019" y="1475.27" fill="#FFFFFF" width="393.758" height="62.369"/>
+ <rect x="3261.3" y="1475.27" fill="#E6E7E8" width="96.926" height="62.369"/>
+ <rect x="2980.777" y="1494.861" fill="none" width="262.767" height="41.285"/>
+ <text transform="matrix(1 0 0 1 2980.7773 1508.0459)"><tspan x="0" y="0" font-family="'Roboto-Bold'" font-size="18">Lorem ipsum dolor sit amet, </tspan><tspan x="0" y="21.6" font-family="'Roboto-Bold'" font-size="18">consectetur adipiscing elit.</tspan></text>
+ <polygon fill="#FFC91F" points="2965.018,913.221 2965.018,893.721 2984.518,893.721 "/>
+ <polygon fill="#FFC91F" points="2965.018,1397.846 2965.018,1378.346 2984.518,1378.346 "/>
+ <g id="Swipe_Tabs_copy_6">
+ <rect x="2965.019" y="849.598" fill="#BCBEC0" width="393.758" height="44.123"/>
+ <text transform="matrix(1 0 0 1 3134.2305 874.5977)" font-family="'Roboto-Bold'" font-size="12">BUSINESS</text>
+ <rect x="2965.019" y="890.826" width="393.758" height="2.895"/>
+ </g>
+ </g>
+</g>
+<g id="Photo_View">
+ <g id="_x31_0_x22__Tablet_8_">
+ <path fill="#231F20" d="M3417.009,2827.68h-1279.97c-41.851,0-75.898-34.049-75.898-75.898v-799.982
+ c0-41.85,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.049,75.898,75.898v799.982
+ C3492.907,2793.631,3458.859,2827.68,3417.009,2827.68z"/>
+ <g>
+ <path fill="#FFFFFF" d="M3417.009,1895.084c31.273,0,56.715,25.443,56.715,56.715v799.982c0,31.271-25.441,56.715-56.715,56.715
+ h-1279.97c-31.272,0-56.715-25.443-56.715-56.715v-799.982c0-31.271,25.442-56.715,56.715-56.715H3417.009 M3417.009,1892.084
+ h-1279.97c-32.927,0-59.715,26.788-59.715,59.715v799.982c0,32.927,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.788,59.715-59.715v-799.982C3476.724,1918.872,3449.936,1892.084,3417.009,1892.084L3417.009,1892.084z"/>
+ </g>
+ <g>
+ <rect x="2135.523" y="1950.623" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M3417.023,1952.123v800h-1280v-800H3417.023 M3420.023,1949.123h-3h-1280h-3v3v800v3h3h1280h3v-3v-800
+ V1949.123L3420.023,1949.123z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M2777.023,1936.514c-8.276,0-15.011-6.752-15.011-15.049
+ c0-8.295,6.734-15.047,15.011-15.047c8.277,0,15.012,6.752,15.012,15.047C2792.035,1929.762,2785.301,1936.514,2777.023,1936.514z
+ "/>
+ <rect x="2137.039" y="2695.959" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M2179.611,2715.926c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.877,6.892,6.877l3.062-0.148l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.268-5.638-6.113
+ c-3.829-2.846-6.822-2.627-8.912-2.762c-2.086-0.135-8.349-0.049-8.349-0.049l6.471-6.496L2179.611,2715.926z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2266.873,2711.773 2252.41,2725.855 2254.079,2727.459
+ 2267.085,2714.701 2279.806,2727.318 2281.544,2725.926 2275.912,2720.488 2275.912,2713.656 2273.688,2713.656
+ 2273.688,2718.188 "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="2260.335,2727.25 2258.042,2728.854 2258.042,2735.965
+ 2275.774,2735.965 2275.774,2728.854 2273.617,2727.039 2273.617,2733.943 2260.335,2733.943 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M2356.176,2737.266h-22.172v-19.174h22.172V2737.266z M2336.604,2734.666h16.973v-13.975h-16.973
+ V2734.666z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="2340.652,2711.443 2340.652,2715.35 2343.252,2715.35 2343.252,2714.043 2360.225,2714.043
+ 2360.225,2728.016 2358.92,2728.016 2358.92,2730.615 2362.824,2730.615 2362.824,2711.443 "/>
+ </g>
+ </g>
+ <g id="Action_Bar_copy_11">
+ <rect x="2137.023" y="1951.48" fill="#FFC91F" width="1280.001" height="56.166"/>
+ <text transform="matrix(1 0 0 1 2282.0957 1985.3135)" font-family="'Roboto-Regular'" font-size="18">Photos</text>
+ <g id="overflow_4_">
+ <rect x="3381.584" y="1966.756" width="5.542" height="5.541"/>
+ <rect x="3381.584" y="1977.127" width="5.542" height="5.541"/>
+ <rect x="3381.584" y="1987.498" width="5.542" height="5.541"/>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_25_" x="2137.023" y="1951.48" width="1280.001" height="56.166"/>
+ </defs>
+ <clipPath id="SVGID_26_">
+ <use xlink:href="#SVGID_25_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_26_)">
+ <g>
+ <path d="M2261.271,1992.01l-11.359-40.391c-1.082-3.846-5.076-6.086-8.922-5.004l-1.916,0.539l11.869,42.201
+ c0.155,0.553,0.459,1.045,0.877,1.43c0.41,0.377,0.915,0.637,1.457,0.75c0.235,0.047,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.275c0.034,1.104-0.696,2.051-1.712,2.338c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.035-1.824-0.16c-1.37-0.287-2.638-0.939-3.671-1.885c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.686c-1.082-3.846-5.076-6.086-8.923-5.004l-51.01,14.346c-3.847,1.08-6.087,5.076-5.005,8.922l14.296,50.836
+ c1.081,3.844,5.075,6.086,8.923,5.004l64.414-18.115C2260.112,1999.85,2262.354,1995.855,2261.271,1992.01z M2232.782,1989.82
+ c-0.528,0.76-1.158,1.48-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.014-3.316,1.363
+ c-2.62,0.736-4.801,0.688-6.547-0.152c-1.744-0.838-2.926-2.355-3.543-4.555c-0.549-1.951-0.945-4.764-1.186-8.432l-0.42-5.703
+ c-0.035-0.469-0.076-1.043-0.125-1.725c-0.047-0.682-0.103-1.391-0.168-2.127c-0.062-0.736-0.143-1.469-0.238-2.195
+ c-0.098-0.727-0.224-1.369-0.38-1.924c-0.118-0.422-0.283-0.854-0.491-1.299c-0.209-0.443-0.473-0.826-0.789-1.145
+ c-0.317-0.316-0.691-0.547-1.127-0.688s-0.952-0.127-1.552,0.041c-0.776,0.219-1.474,0.697-2.094,1.432
+ c-0.619,0.738-1.164,1.635-1.634,2.688c-0.471,1.057-0.872,2.223-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.873
+ c-0.198,1.303-0.328,2.559-0.394,3.775s-0.072,2.295-0.024,3.238l0.986,16.789l-10.221,2.875l-1.905-28.746
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.326-0.064-0.635-0.1-0.926c-0.032-0.287-0.067-0.537-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.443c-0.175-0.619-0.381-1.102-0.619-1.441c-0.24-0.34-0.533-0.57-0.877-0.688
+ c-0.346-0.117-0.755-0.146-1.229-0.086s-1.033,0.184-1.677,0.363l-1.23,0.346l-0.421-3.797l15.148-4.26l1.285,7.506
+ l0.432-0.121c0.486-1.598,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.363,2.283-3.318c0.881-0.953,1.902-1.77,3.067-2.443
+ c1.163-0.674,2.499-1.225,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393c1.107,0.145,2.066,0.49,2.88,1.041
+ c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.824,1.238,2.867c0.163,0.576,0.297,1.203,0.404,1.879
+ c0.105,0.678,0.191,1.367,0.257,2.066c0.065,0.701,0.118,1.404,0.163,2.109c0.043,0.709,0.092,1.375,0.149,2.008l0.52,7.723
+ c0.084,1.316,0.187,2.539,0.312,3.664c0.126,1.127,0.323,2.168,0.592,3.121c0.281,1,0.701,1.709,1.262,2.125
+ s1.229,0.516,2.006,0.297c0.71-0.199,1.322-0.514,1.836-0.945c0.514-0.434,1.086-1.014,1.719-1.742l2.279,1.838
+ C2233.761,1988.318,2233.312,1989.061,2232.782,1989.82z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle cx="3307.868" cy="1979.396" r="5"/>
+ <circle cx="3325.95" cy="1969.396" r="5"/>
+ <circle cx="3325.95" cy="1989.73" r="5"/>
+ <polyline fill="none" stroke="#000000" stroke-width="3" stroke-miterlimit="10" points="3325.95,1969.396 3307.868,1979.396
+ 3325.95,1989.73 "/>
+ </g>
+ <g>
+ <path d="M3249.833,1969.25l3.079,6.24l0.466,0.943l1.04,0.151l6.889,1.001l-4.984,4.856l-0.752,0.734l0.178,1.036l1.177,6.861
+ l-6.161-3.239l-0.931-0.489l-0.931,0.489l-6.161,3.239l1.177-6.861l0.178-1.036l-0.752-0.734l-4.984-4.856l6.889-1.001
+ l1.04-0.151l0.466-0.943L3249.833,1969.25 M3249.833,1964.73l-4.873,9.875l-10.898,1.584l7.886,7.686l-1.862,10.855l9.748-5.125
+ l9.748,5.125l-1.862-10.855l7.886-7.686l-10.898-1.584L3249.833,1964.73L3249.833,1964.73z"/>
+ </g>
+ <polygon points="2154.16,1980.344 2160.007,1971.08 2155.031,1971.08 2149.185,1980.344 2155.031,1989.607 2160.007,1989.607
+ "/>
+ </g>
+ <g>
+ <rect x="2137.039" y="2007.646" fill="#6D6E71" width="1279.97" height="688.312"/>
+ </g>
+ <g>
+ <rect x="2294.268" y="2007.646" fill="#E6E7E8" width="965.512" height="688.312"/>
+ </g>
+ <rect x="2137.039" y="2497.499" opacity="0.83" width="1279.97" height="198.46"/>
+ <rect x="2349.739" y="2537.033" fill="none" width="669.724" height="78.748"/>
+ <text transform="matrix(1 0 0 1 2349.7393 2563.4004)"><tspan x="0" y="0" fill="#FFFFFF" font-family="'Roboto-Regular'" font-size="36">Lorem ipsum dolor sit amet, consectetur </tspan><tspan x="0" y="43.2" fill="#FFFFFF" font-family="'Roboto-Regular'" font-size="36">adipiscing elit.</tspan></text>
+ <rect x="2349.449" y="2633.191" fill="none" width="194.767" height="13.232"/>
+ <text transform="matrix(1 0 0 1 2349.4492 2643.4463)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="14">January 1, 2012</text>
+</g>
+<g id="Photo_View__x2014__Fullscreen">
+ <g id="_x31_0_x22__Tablet_6_">
+ <path fill="#231F20" d="M5043.763,2827.68h-1279.97c-41.851,0-75.898-34.049-75.898-75.898v-799.982
+ c0-41.85,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.049,75.898,75.898v799.982
+ C5119.661,2793.631,5085.613,2827.68,5043.763,2827.68z"/>
+ <g>
+ <path fill="#FFFFFF" d="M5043.763,1895.084c31.273,0,56.715,25.443,56.715,56.715v799.982c0,31.271-25.441,56.715-56.715,56.715
+ h-1279.97c-31.272,0-56.715-25.443-56.715-56.715v-799.982c0-31.271,25.442-56.715,56.715-56.715H5043.763 M5043.763,1892.084
+ h-1279.97c-32.927,0-59.715,26.788-59.715,59.715v799.982c0,32.927,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.788,59.715-59.715v-799.982C5103.478,1918.872,5076.689,1892.084,5043.763,1892.084L5043.763,1892.084z"/>
+ </g>
+ <g>
+ <rect x="3762.277" y="1950.623" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M5043.777,1952.123v800h-1280v-800H5043.777 M5046.777,1949.123h-3h-1280h-3v3v800v3h3h1280h3v-3v-800
+ V1949.123L5046.777,1949.123z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M4403.777,1936.514c-8.276,0-15.011-6.752-15.011-15.049
+ c0-8.295,6.734-15.047,15.011-15.047c8.277,0,15.012,6.752,15.012,15.047C4418.789,1929.762,4412.055,1936.514,4403.777,1936.514z
+ "/>
+ <rect x="3763.793" y="2695.959" fill="#231F20" width="1279.97" height="55.822"/>
+ <circle fill="#6D6E71" cx="3811.307" cy="2723.687" r="8.146"/>
+ <circle fill="#6D6E71" cx="3893.046" cy="2723.687" r="8.146"/>
+ <circle fill="#6D6E71" cx="3974.784" cy="2723.687" r="8.146"/>
+ </g>
+ <g>
+ <rect x="3763.777" y="1952.123" fill="#E6E7E8" width="1279.985" height="743.836"/>
+ </g>
+</g>
+<g id="Photo_List_1_">
+ <g id="_x31_0_x22__Tablet_2_">
+ <path fill="#231F20" d="M1775.242,2827.68H495.272c-41.851,0-75.898-34.049-75.898-75.898v-799.982
+ c0-41.85,34.048-75.898,75.898-75.898h1279.97c41.851,0,75.898,34.049,75.898,75.898v799.982
+ C1851.141,2793.631,1817.093,2827.68,1775.242,2827.68z"/>
+ <g>
+ <path fill="#FFFFFF" d="M1775.242,1895.084c31.273,0,56.715,25.443,56.715,56.715v799.982c0,31.271-25.441,56.715-56.715,56.715
+ H495.272c-31.272,0-56.715-25.443-56.715-56.715v-799.982c0-31.271,25.442-56.715,56.715-56.715H1775.242 M1775.242,1892.084
+ H495.272c-32.927,0-59.715,26.789-59.715,59.715v799.982c0,32.926,26.788,59.715,59.715,59.715h1279.97
+ c32.927,0,59.715-26.789,59.715-59.715v-799.982C1834.957,1918.873,1808.169,1892.084,1775.242,1892.084L1775.242,1892.084z"/>
+ </g>
+ <g>
+ <rect x="493.757" y="1950.623" fill="#FFFFFF" width="1283" height="803"/>
+ <path fill="#FFFFFF" d="M1775.257,1952.123v800h-1280v-800H1775.257 M1778.257,1949.123h-3h-1280h-3v3v800v3h3h1280h3v-3v-800
+ V1949.123L1778.257,1949.123z"/>
+ </g>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" d="M1135.257,1936.514c-8.276,0-15.011-6.752-15.011-15.049
+ c0-8.295,6.734-15.047,15.011-15.047c8.277,0,15.012,6.752,15.012,15.047C1150.269,1929.762,1143.534,1936.514,1135.257,1936.514z
+ "/>
+ <rect x="495.272" y="2695.959" fill="#231F20" width="1279.97" height="55.822"/>
+ <path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M537.845,2715.926c0,0-6.818,6.285-7.376,6.773
+ c-0.555,0.492-0.138,1.467,0.559,1.883c0.695,0.414,6.892,6.877,6.892,6.877l3.062-0.148l-6.334-6.391c0,0,6.82-0.09,9.604,0.109
+ c2.783,0.203,5.082,1.66,6.682,2.84c1.603,1.18,3.479,3.475,3.479,3.475l2.926-0.01c0,0-1.812-3.268-5.638-6.113
+ c-3.829-2.846-6.822-2.627-8.912-2.762c-2.086-0.135-8.349-0.049-8.349-0.049l6.471-6.496L537.845,2715.926z"/>
+ <g>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="625.106,2711.773 610.644,2725.855 612.312,2727.459
+ 625.318,2714.701 638.039,2727.318 639.777,2725.926 634.146,2720.488 634.146,2713.656 631.922,2713.656 631.922,2718.188
+ "/>
+ <polygon fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" points="618.568,2727.25 616.275,2728.854 616.275,2735.965
+ 634.008,2735.965 634.008,2728.854 631.851,2727.039 631.851,2733.943 618.568,2733.943 "/>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M714.409,2737.266h-22.172v-19.174h22.172V2737.266z M694.837,2734.666h16.973v-13.975h-16.973V2734.666
+ z"/>
+ </g>
+ <polygon fill="#FFFFFF" points="698.886,2711.443 698.886,2715.35 701.485,2715.35 701.485,2714.043 718.458,2714.043
+ 718.458,2728.016 717.153,2728.016 717.153,2730.615 721.058,2730.615 721.058,2711.443 "/>
+ </g>
+ </g>
+ <g id="Photo_List_2_">
+ <g>
+ <rect x="495.257" y="2007.646" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="668.863" y="2007.648" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="842.468" y="2007.646" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="495.257" y="2181.333" fill="#E6E7E8" width="167.254" height="167.255"/>
+ </g>
+ <g>
+ <rect x="668.863" y="2181.334" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="842.468" y="2181.333" fill="#E6E7E8" width="167.256" height="167.255"/>
+ </g>
+ <g>
+ <rect x="495.257" y="2355.018" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="668.863" y="2355.02" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="842.468" y="2355.018" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="495.257" y="2528.703" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="668.863" y="2528.704" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="842.468" y="2528.703" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1016.59" y="2007.646" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1190.196" y="2007.648" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="1363.801" y="2007.646" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1016.59" y="2181.333" fill="#E6E7E8" width="167.254" height="167.255"/>
+ </g>
+ <g>
+ <rect x="1190.196" y="2181.334" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="1363.801" y="2181.333" fill="#E6E7E8" width="167.256" height="167.255"/>
+ </g>
+ <g>
+ <rect x="1016.59" y="2355.018" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1190.196" y="2355.02" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="1363.801" y="2355.018" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1016.59" y="2528.703" fill="#E6E7E8" width="167.254" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1190.196" y="2528.704" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="1363.801" y="2528.703" fill="#E6E7E8" width="167.256" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1538.196" y="2007.648" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="1711.801" y="2007.646" fill="#E6E7E8" width="63.441" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1538.196" y="2181.334" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="1711.801" y="2181.333" fill="#E6E7E8" width="63.441" height="167.255"/>
+ </g>
+ <g>
+ <rect x="1538.196" y="2355.02" fill="#E6E7E8" width="167.254" height="167.252"/>
+ </g>
+ <g>
+ <rect x="1711.801" y="2355.018" fill="#E6E7E8" width="63.441" height="167.256"/>
+ </g>
+ <g>
+ <rect x="1538.196" y="2528.704" fill="#E6E7E8" width="167.254" height="167.253"/>
+ </g>
+ <g>
+ <rect x="1711.801" y="2528.703" fill="#E6E7E8" width="63.441" height="167.256"/>
+ </g>
+ <polygon fill="#FFC91F" points="668.863,2200.834 668.863,2181.334 688.363,2181.334 "/>
+ <polygon fill="#FFC91F" points="842.468,2200.834 842.468,2181.334 861.968,2181.334 "/>
+ <polygon fill="#FFC91F" points="1016.59,2374.52 1016.59,2355.02 1036.09,2355.02 "/>
+ <polygon fill="#FFC91F" points="1016.59,2200.834 1016.59,2181.334 1036.09,2181.334 "/>
+ <polygon fill="#FFC91F" points="668.863,2548.204 668.863,2528.704 688.363,2528.704 "/>
+ </g>
+ <g id="Action_Bar_copy_10">
+ <rect x="495.257" y="1951.48" fill="#FFC91F" width="1280.001" height="56.166"/>
+ <text transform="matrix(1 0 0 1 766.9087 1985.3135)" font-family="'Roboto-Regular'" font-size="18">Photos</text>
+ <g id="news_icon_1_">
+ <g>
+ <g>
+ <path d="M673.696,1967.525h-0.863v19.039c0,0.248,0.068,0.492,0.199,0.701c0.127,0.205,0.307,0.373,0.52,0.484
+ c0.094,0.047,0.191,0.086,0.293,0.109c0.547,0.137,0.881,0.691,0.744,1.238c-0.115,0.465-0.531,0.775-0.99,0.775
+ c-0.08,0-0.164-0.01-0.246-0.031c-0.258-0.064-0.508-0.158-0.744-0.281c-0.539-0.281-0.992-0.703-1.312-1.221
+ c-0.33-0.533-0.505-1.146-0.505-1.775v-20.609c0-1.736-1.406-3.143-3.142-3.143h-23.012c-1.735,0-3.142,1.406-3.142,3.143
+ v22.934c0,1.734,1.406,3.141,3.142,3.141h29.059c1.736,0,3.143-1.406,3.143-3.141v-18.223
+ C676.839,1968.932,675.433,1967.525,673.696,1967.525z M651.077,1987.16h-7.304v-2.051h7.304V1987.16z M651.077,1984.266
+ h-7.304v-2.051h7.304V1984.266z M659.796,1987.16h-7.305v-2.051h7.305V1987.16z M659.796,1984.266h-7.305v-2.051h7.305
+ V1984.266z M659.796,1981.035h-16.022v-8.955h16.022V1981.035z M668.513,1987.16h-7.303v-2.051h7.303V1987.16z
+ M668.513,1984.266h-7.303v-2.051h7.303V1984.266z M668.513,1981.369h-7.303v-2.051h7.303V1981.369z M668.513,1978.475h-7.303
+ v-2.051h7.303V1978.475z M668.513,1975.578h-7.303v-2.051h7.303V1975.578z M668.513,1970.51h-24.739v-2.355h24.739V1970.51z"/>
+ </g>
+ </g>
+ <g>
+ <defs>
+ <rect id="SVGID_27_" x="643.773" y="1972.08" width="16.022" height="8.955"/>
+ </defs>
+ <clipPath id="SVGID_28_">
+ <use xlink:href="#SVGID_27_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_28_)">
+ <ellipse cx="651.56" cy="1975.471" rx="3.076" ry="3.049"/>
+ <path d="M656.666,1986.482c-0.208,1.631-1.667,3.404-2.954,3.652c-1.436,0.23-2.869,0.23-4.303,0
+ c-1.289-0.248-2.747-2.021-2.955-3.652c-0.164-1.539-0.164-3.08,0-4.619c0.208-1.631,1.666-3.404,2.955-3.652
+ c1.434-0.23,2.867-0.23,4.303,0c1.287,0.248,2.746,2.021,2.954,3.652C656.831,1983.402,656.831,1984.943,656.666,1986.482z"/>
+ </g>
+ </g>
+ </g>
+ <g id="refresh_1_">
+ <polygon points="1689.184,1967.125 1689.184,1977.127 1679.184,1977.127 "/>
+ <polygon points="1662.934,1992.268 1662.934,1982.268 1672.934,1982.268 "/>
+ <g>
+ <g>
+ <path d="M1676.059,1970.572c4.146,0,7.641,2.768,8.751,6.555h4.119c-1.195-6.018-6.502-10.555-12.87-10.555
+ s-11.675,4.537-12.87,10.555h4.119C1668.418,1973.34,1671.913,1970.572,1676.059,1970.572z M1676.059,1988.822
+ c-4.146,0-7.641-2.768-8.751-6.555h-4.119c1.195,6.018,6.502,10.555,12.87,10.555s11.675-4.537,12.87-10.555h-4.119
+ C1683.699,1986.055,1680.204,1988.822,1676.059,1988.822z"/>
+ </g>
+ </g>
+ </g>
+ <g id="overflow_1_">
+ <rect x="1739.817" y="1966.756" width="5.542" height="5.541"/>
+ <rect x="1739.817" y="1977.127" width="5.542" height="5.541"/>
+ <rect x="1739.817" y="1987.498" width="5.542" height="5.541"/>
+ </g>
+ <g opacity="0.37">
+ <defs>
+ <rect id="SVGID_29_" x="495.257" y="1951.48" opacity="0.37" width="1280.001" height="56.166"/>
+ </defs>
+ <clipPath id="SVGID_30_">
+ <use xlink:href="#SVGID_29_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_30_)">
+ <g>
+ <path d="M599.505,1992.01l-11.359-40.391c-1.082-3.846-5.076-6.086-8.922-5.004l-1.916,0.539l11.869,42.201
+ c0.155,0.553,0.459,1.045,0.877,1.43c0.41,0.377,0.915,0.637,1.457,0.75c0.235,0.047,0.477,0.07,0.718,0.062
+ c1.298-0.041,2.381,0.979,2.422,2.275c0.034,1.104-0.696,2.051-1.712,2.338c-0.181,0.051-0.37,0.08-0.566,0.086
+ c-0.611,0.02-1.225-0.035-1.824-0.16c-1.37-0.287-2.638-0.939-3.671-1.885c-1.063-0.977-1.834-2.229-2.227-3.623
+ l-12.847-45.686c-1.082-3.846-5.076-6.086-8.923-5.004l-51.01,14.346c-3.847,1.08-6.087,5.076-5.005,8.922l14.296,50.836
+ c1.081,3.844,5.075,6.086,8.923,5.004l64.414-18.115C598.346,1999.85,600.587,1995.855,599.505,1992.01z M571.016,1989.82
+ c-0.528,0.76-1.158,1.48-1.888,2.166c-0.73,0.686-1.579,1.307-2.547,1.865c-0.969,0.561-2.073,1.014-3.316,1.363
+ c-2.62,0.736-4.801,0.688-6.547-0.152c-1.744-0.838-2.926-2.355-3.543-4.555c-0.549-1.951-0.945-4.764-1.186-8.432l-0.42-5.703
+ c-0.035-0.469-0.076-1.043-0.125-1.725c-0.047-0.682-0.103-1.391-0.168-2.127c-0.062-0.736-0.143-1.469-0.238-2.195
+ c-0.098-0.727-0.224-1.369-0.38-1.924c-0.118-0.422-0.283-0.854-0.491-1.299c-0.209-0.443-0.473-0.826-0.789-1.145
+ c-0.317-0.316-0.691-0.547-1.127-0.688s-0.952-0.127-1.552,0.041c-0.776,0.219-1.474,0.697-2.094,1.432
+ c-0.619,0.738-1.164,1.635-1.634,2.688c-0.471,1.057-0.872,2.223-1.205,3.5c-0.338,1.281-0.603,2.572-0.799,3.873
+ c-0.198,1.303-0.328,2.559-0.394,3.775s-0.072,2.295-0.024,3.238l0.986,16.789l-10.221,2.875l-1.905-28.746
+ c-0.015-0.307-0.038-0.623-0.069-0.949c-0.033-0.326-0.064-0.635-0.1-0.926c-0.032-0.287-0.067-0.537-0.1-0.742
+ c-0.035-0.207-0.064-0.354-0.09-0.443c-0.175-0.619-0.381-1.102-0.619-1.441c-0.24-0.34-0.533-0.57-0.877-0.688
+ c-0.346-0.117-0.755-0.146-1.229-0.086s-1.033,0.184-1.677,0.363l-1.23,0.346l-0.421-3.797l15.148-4.26l1.285,7.506
+ l0.432-0.121c0.486-1.598,1.048-3.025,1.688-4.283c0.641-1.258,1.401-2.363,2.283-3.318c0.881-0.953,1.902-1.77,3.067-2.443
+ c1.163-0.674,2.499-1.225,4.008-1.648c1.443-0.406,2.718-0.537,3.824-0.393c1.107,0.145,2.066,0.49,2.88,1.041
+ c0.812,0.549,1.486,1.258,2.016,2.127c0.533,0.869,0.945,1.824,1.238,2.867c0.163,0.576,0.297,1.203,0.404,1.879
+ c0.105,0.678,0.191,1.367,0.257,2.066c0.065,0.701,0.118,1.404,0.163,2.109c0.043,0.709,0.092,1.375,0.149,2.008l0.52,7.723
+ c0.084,1.316,0.187,2.539,0.312,3.664c0.126,1.127,0.323,2.168,0.592,3.121c0.281,1,0.701,1.709,1.262,2.125
+ s1.229,0.516,2.006,0.297c0.71-0.199,1.322-0.514,1.836-0.945c0.514-0.434,1.086-1.014,1.719-1.742l2.279,1.838
+ C571.994,1988.318,571.545,1989.061,571.016,1989.82z"/>
+ </g>
+ </g>
+ </g>
+ <rect x="624.589" y="2004.752" width="300" height="2.895"/>
+ <rect x="696.589" y="1999.523" width="160" height="6.676"/>
+ <g id="photo_icon_5_">
+ <path d="M746.161,1966.582v21.678h-27.802v-21.678H746.161 M749.932,1962.812h-35.343v29.217h35.343V1962.812L749.932,1962.812z"
+ />
+ <g>
+ <defs>
+ <rect id="SVGID_31_" x="719.89" y="1968.154" width="24.662" height="18.535"/>
+ </defs>
+ <clipPath id="SVGID_32_">
+ <use xlink:href="#SVGID_31_" overflow="visible"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_32_)">
+ <circle cx="732.261" cy="1975.145" r="6.283"/>
+ <path d="M742.69,1997.838c-0.426,3.361-3.404,7.016-6.035,7.529c-2.93,0.475-5.859,0.475-8.789,0
+ c-2.631-0.514-5.61-4.17-6.036-7.529c-0.335-3.174-0.335-6.348,0-9.52c0.426-3.359,3.405-7.016,6.036-7.529
+ c2.93-0.475,5.859-0.475,8.789,0c2.631,0.514,5.609,4.17,6.035,7.529C743.026,1991.49,743.026,1994.664,742.69,1997.838z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_32_)">
+ <circle cx="744.435" cy="1975.42" r="4.516"/>
+ <path d="M751.931,1991.73c-0.306,2.416-2.447,5.043-4.338,5.412c-2.105,0.34-4.211,0.34-6.316,0
+ c-1.892-0.369-4.033-2.996-4.339-5.412c-0.241-2.281-0.241-4.562,0-6.844c0.306-2.414,2.447-5.041,4.339-5.41
+ c2.105-0.342,4.211-0.342,6.316,0c1.891,0.369,4.032,2.996,4.338,5.41C752.172,1987.168,752.172,1989.449,751.931,1991.73z"/>
+ </g>
+ <g opacity="0.3" clip-path="url(#SVGID_32_)">
+ <circle cx="719.89" cy="1975.42" r="4.516"/>
+ <path d="M727.388,1991.73c-0.307,2.416-2.447,5.043-4.338,5.412c-2.106,0.34-4.212,0.34-6.318,0
+ c-1.891-0.369-4.031-2.996-4.338-5.412c-0.24-2.281-0.24-4.562,0-6.844c0.307-2.414,2.447-5.041,4.338-5.41
+ c2.106-0.342,4.212-0.342,6.318,0c1.891,0.369,4.031,2.996,4.338,5.41C727.628,1987.168,727.628,1989.449,727.388,1991.73z"/>
+ </g>
+ </g>
+ </g>
+ <g>
+ <polygon points="889.016,1961.557 893.889,1971.434 904.787,1973.016 896.901,1980.703 898.764,1991.557 889.016,1986.434
+ 879.268,1991.557 881.13,1980.703 873.244,1973.016 884.143,1971.434 "/>
+ </g>
+ </g>
+</g>
+<g id="Document_Info">
+ <g id="icon" opacity="0.1">
+ <g>
+ <path d="M338.724,151.845h-4.889v107.739c0,1.408,0.389,2.78,1.123,3.967c0.721,1.162,1.74,2.11,2.948,2.739
+ c0.524,0.273,1.081,0.484,1.653,0.626c3.098,0.769,4.984,3.902,4.215,7c-0.652,2.629-3.011,4.388-5.603,4.388
+ c-0.462,0-0.929-0.056-1.396-0.172c-1.46-0.362-2.876-0.899-4.211-1.595c-3.049-1.589-5.618-3.976-7.429-6.901
+ c-1.868-3.016-2.856-6.492-2.856-10.052V142.956c0-9.819-7.959-17.779-17.778-17.779H174.28c-9.819,0-17.778,7.96-17.778,17.779
+ v129.777c0,9.819,7.959,17.778,17.778,17.778h164.444c9.818,0,17.777-7.959,17.777-17.778V169.622
+ C356.501,159.803,348.542,151.845,338.724,151.845z M290.561,248.6c-1.757,1.445-3.728,2.734-5.907,3.867
+ c-2.184,1.134-4.605,2.041-7.268,2.72c-2.664,0.68-5.582,1.021-8.754,1.021c-6.688,0-11.814-1.573-15.385-4.718
+ s-5.354-7.522-5.354-13.133c0-4.984,0.936-11.898,2.806-20.738l2.804-13.769c0.226-1.133,0.511-2.521,0.851-4.165
+ c0.34-1.643,0.68-3.357,1.02-5.142c0.34-1.786,0.639-3.57,0.892-5.355c0.255-1.784,0.384-3.385,0.384-4.802
+ c0-1.076-0.102-2.21-0.299-3.4s-0.566-2.266-1.104-3.229c-0.539-0.962-1.273-1.756-2.21-2.38
+ c-0.934-0.623-2.166-0.936-3.697-0.936c-1.982,0-3.951,0.667-5.906,1.998c-1.955,1.332-3.84,3.089-5.653,5.27
+ c-1.814,2.182-3.542,4.674-5.185,7.479c-1.643,2.806-3.131,5.682-4.461,8.628c-1.334,2.946-2.48,5.836-3.443,8.669
+ c-0.965,2.833-1.699,5.384-2.209,7.649l-8.841,40.374h-26.092l14.618-69.271c0.17-0.736,0.326-1.5,0.467-2.295
+ c0.143-0.793,0.269-1.543,0.384-2.253c0.112-0.707,0.197-1.317,0.255-1.827c0.056-0.51,0.085-0.877,0.085-1.104
+ c0-1.586-0.17-2.861-0.511-3.825c-0.34-0.962-0.88-1.7-1.614-2.209c-0.737-0.51-1.687-0.85-2.847-1.021
+ c-1.164-0.169-2.566-0.254-4.209-0.254h-3.144l1.53-9.265h38.672l-1.954,18.614h1.104c2.209-3.455,4.489-6.46,6.842-9.01
+ c2.351-2.55,4.887-4.66,7.607-6.332c2.719-1.671,5.679-2.918,8.883-3.74c3.199-0.82,6.727-1.232,10.58-1.232
+ c3.683,0,6.785,0.539,9.309,1.615c2.521,1.077,4.561,2.537,6.119,4.377c1.557,1.842,2.678,3.967,3.355,6.375
+ c0.682,2.409,1.021,4.945,1.021,7.607c0,1.473-0.099,3.046-0.297,4.717c-0.199,1.672-0.455,3.357-0.766,5.057
+ c-0.312,1.701-0.652,3.399-1.02,5.1c-0.369,1.701-0.695,3.315-0.977,4.844l-3.912,18.615c-0.679,3.174-1.246,6.134-1.699,8.882
+ c-0.453,2.75-0.68,5.341-0.68,7.777c0,2.55,0.523,4.504,1.572,5.865c1.049,1.359,2.563,2.04,4.549,2.04
+ c1.812,0,3.469-0.34,4.972-1.02c1.5-0.68,3.243-1.671,5.226-2.976l4.165,5.866C293.876,245.696,292.316,247.155,290.561,248.6z"
+ />
+ </g>
+ </g>
+ <text transform="matrix(1 0 0 1 437.0029 204.1328)" opacity="0.2"><tspan x="0" y="0" font-family="'Roboto-Thin'" font-size="72">Example News Application</tspan><tspan x="0" y="57.6" font-family="'Roboto-Bold'" font-size="48">Tablet Wireframes (Landscape)</tspan></text>
+</g>
+<g id="Meta">
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="829.506" cy="781.139" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="829.505,781.139 829.505,631.499
+ 341.252,631.499 341.252,2007.646 401.269,2007.646 "/>
+ <g>
+ <path fill="#ED1C24" d="M419.374,2007.646c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C400.284,1999.095,410.854,2004.488,419.374,2007.646z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="889.752" cy="781.139" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="889.752,781.139 889.752,551.499
+ 251.499,551.499 251.499,3159.749 401.269,3159.749 "/>
+ <g>
+ <path fill="#ED1C24" d="M419.374,3159.749c-8.52,3.161-19.09,8.555-25.642,14.268l5.161-14.268l-5.161-14.265
+ C400.284,3151.197,410.854,3156.591,419.374,3159.749z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="3333.089" cy="945.099" r="17.083"/>
+ <g>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="3333.089" y1="945.099" x2="3669.788" y2="945.099"/>
+ <g>
+ <path fill="#ED1C24" d="M3687.894,945.099c-8.52,3.161-19.09,8.555-25.642,14.268l5.16-14.268l-5.16-14.265
+ C3668.804,936.547,3679.374,941.94,3687.894,945.099z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <text transform="matrix(1 0 0 1 1047.7603 1716.9014)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Story List + View</text>
+ <text transform="matrix(1 0 0 1 2727.1953 1717.9209)"><tspan x="0" y="0" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Story List</tspan><tspan x="-13.688" y="28.8" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">(Alternative)</tspan></text>
+ <text transform="matrix(1 0 0 1 4347.9551 1717.9209)"><tspan x="0" y="0" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Story View</tspan><tspan x="-7.693" y="28.8" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">(Alternative)</tspan></text>
+ <text transform="matrix(1 0 0 1 4956.5293 659.499)" fill="#00A651" font-family="'Roboto-Regular'" font-size="24">Alternatives</text>
+ <text transform="matrix(1 0 0 1 1082.1001 2876.0371)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo List</text>
+ <text transform="matrix(1 0 0 1 1103.0415 4035.4854)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Saved</text>
+ <text transform="matrix(1 0 0 1 2717.873 2876.0371)" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo View</text>
+ <text transform="matrix(1 0 0 1 4344.627 2876.0371)"><tspan x="0" y="0" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">Photo View</tspan><tspan x="-2.654" y="28.8" fill="#A7A9AC" font-family="'Roboto-Regular'" font-size="24">(Fullscreen)</tspan></text>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="3158.054" cy="2198.418" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="3158.054" y1="2198.418" x2="3687.895" y2="2198.418"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="3158.054" y1="2198.418" x2="3669.789" y2="2198.418"/>
+ <g>
+ <path fill="#ED1C24" d="M3687.895,2198.418c-8.52,3.161-19.09,8.555-25.643,14.268l5.161-14.268l-5.161-14.265
+ C3668.805,2189.866,3679.375,2195.26,3687.895,2198.418z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1611.061" cy="2254.435" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="1611.061" y1="2254.435" x2="2061.141" y2="2254.435"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="1611.061" y1="2254.435" x2="2043.035" y2="2254.435"/>
+ <g>
+ <path fill="#ED1C24" d="M2061.141,2254.435c-8.52,3.161-19.09,8.555-25.643,14.268l5.161-14.268l-5.161-14.265
+ C2042.051,2245.883,2052.621,2251.276,2061.141,2254.435z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="1650.227" cy="3364.009" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="1650.227,3364.009 2356.176,3364.009
+ 2356.176,2845.785 "/>
+ <g>
+ <path fill="#ED1C24" d="M2356.176,2827.68c3.161,8.52,8.555,19.09,14.268,25.642l-14.268-5.16l-14.265,5.16
+ C2347.624,2846.77,2353.018,2836.199,2356.176,2827.68z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="909.607" cy="3333.19" r="17.083"/>
+ <g>
+ <g>
+ <polyline fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" points="909.607,3333.19 909.607,2951.499
+ 3594.045,2951.499 3594.045,1537.854 3669.788,1537.854 "/>
+ <g>
+ <path fill="#ED1C24" d="M3687.894,1537.854c-8.52,3.161-19.09,8.555-25.642,14.268l5.16-14.268l-5.16-14.265
+ C3668.804,1529.303,3679.374,1534.696,3687.894,1537.854z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+ <g>
+ <circle fill="#ED1C24" stroke="#ED1C24" stroke-miterlimit="10" cx="4032.057" cy="2254.434" r="17.083"/>
+ <g>
+ <line fill="#ED1C24" x1="4032.058" y1="2254.435" x2="3492.908" y2="2254.435"/>
+ <g>
+
+ <line fill="none" stroke="#ED1C24" stroke-width="3" stroke-miterlimit="10" x1="4032.058" y1="2254.435" x2="3511.014" y2="2254.435"/>
+ <g>
+ <path fill="#ED1C24" d="M3492.908,2254.435c8.52-3.161,19.09-8.555,25.643-14.268l-5.161,14.268l5.161,14.265
+ C3511.998,2262.986,3501.428,2257.593,3492.908,2254.435z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/docs/html/training/design-navigation/index.jd b/docs/html/training/design-navigation/index.jd new file mode 100644 index 0000000..e02d52e --- /dev/null +++ b/docs/html/training/design-navigation/index.jd @@ -0,0 +1,48 @@ +page.title=Designing Effective Navigation + +trainingnavtop=true +startpage=true +next.title=Planning Screens and Their Relationships +next.link=screen-planning.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>Dependencies and prerequisites</h2> + +<p>This class is not specific to any particular version of the Android platform. It is also primarily design-focused and does not require knowledge of the Android SDK. That said, you should have experience using an Android device for a better understanding of the context in which Android applications run.</p> + +<p>You should also have basic familiarity with the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>, used across most applications in devices running Android 3.0 and later.</p> + + +</div> +</div> + + +<p>One of the very first steps to designing and developing an Android application is to determine what users are able to see and do with the app. Once you know what kinds of data users are interacting with in the app, the next step is to design the interactions that allow users to navigate across, into, and back out from the different pieces of content within the app.</p> + +<p>This class shows you how to plan out the high-level screen hierarchy for your application and then choose appropriate forms of navigation to allow users to effectively and intuitively traverse your content. Each lesson covers various stages in the interaction design process for navigation in Android applications, in roughly chronological order. After going through the lessons in this class, you should be able to apply the methodology and navigation paradigms outlined here to your own applications, providing a coherent navigation experience for your users.</p> + + +<h2 id="lessons">Lessons</h2> + + +<dl> + <dt><strong><a href="screen-planning.html">Planning Screens and Their +Relationships</a></strong></dt> + <dd>Learn how to choose which screens your application should contain. Also learn how to choose which screens should be directly reachable from others. This lesson introduces a hypothetical news application to serve as an example for later lessons.</dd> + + <dt><strong><a href="multiple-sizes.html">Planning for Multiple Touchscreen Sizes</a></strong></dt> + <dd>Learn how to group related screens together on larger-screen devices to optimize use of available screen space.</dd> + + <dt><strong><a href="descendant-lateral.html">Providing Descendant and Lateral Navigation</a></strong></dt> + <dd>Learn about techniques for allowing users to navigate deep into, as well as across, your content hierarchy. Also learn about pros and cons of, and best practices for, specific navigational UI elements for various situations.</dd> + + <dt><strong><a href="ancestral-temporal.html">Providing Ancestral and Temporal Navigation</a></strong></dt> + <dd>Learn how to allow users to navigate upwards in the content hierarchy. Also learn about best practices for the BACK button and temporal navigation, or navigation to previous screens that may not be hierarchically related.</dd> + + <dt><strong><a href="wireframing.html">Putting it All Together: Wireframing the Example App</a></strong></dt> + <dd>Learn how to create screen wireframes (low-fidelity graphic mockups) representing the screens in a news application based on the desired information model. These wireframes utilize navigational elements discussed in previous lessons to demonstrate intuitive and efficient navigation.</dd> +</dl> diff --git a/docs/html/training/design-navigation/multiple-sizes.jd b/docs/html/training/design-navigation/multiple-sizes.jd new file mode 100644 index 0000000..7a8139f --- /dev/null +++ b/docs/html/training/design-navigation/multiple-sizes.jd @@ -0,0 +1,105 @@ +page.title=Planning for Multiple Touchscreen Sizes +parent.title=Designing Effective Navigation +parent.link=index.html + +trainingnavtop=true +previous.title=Planning Screens and Their Relationships +previous.link=screen-planning.html +next.title=Providing Descendant and Lateral Navigation +next.link=descendant-lateral.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#multi-pane-layouts">Group Screens with Multi-pane Layouts</a></li> + <li><a href="#orientations">Design for Multiple Tablet Orientations</a></li> + <li><a href="#group-screens">Group Screens in the Screen Map</a></li> +</ol> + +<h2>You should also read</h2> +<ul> + <li><a href="{@docRoot}training/multiscreen/index.html">Designing for Multiple Screens</a></li> +</ul> + +</div> +</div> + + +<p>The exhaustive screen map from the previous lesson isn't tied to a particular device form factor, although it can generally look and work okay on a handset or similar-size device. But Android applications need to adapt to a number of different types of devices, from 3" handsets to 10" tablets to 42" TVs. In this lesson we explore reasons and tactics for grouping together multiple screens from the exhaustive map.</p> + +<p class="note"><strong>Note: </strong> Designing applications for television sets also requires attention to other factors, including interaction methods (i.e., the lack of a touch screen), legibility of text at large reading distances, and more. Although this discussion is outside the scope of this class, you can find more information on designing for TVs in the <a href="https://developers.google.com/tv">Google TV</a> documentation for <a href="https://developers.google.com/tv/android/docs/gtv_android_patterns">design patterns</a>.</p> + +<h2 id="multi-pane-layouts">Group Screens with Multi-pane Layouts</h2> + +<p>3 to 4-inch screens are generally only suitable for showing a single vertical pane of content at a time, be it a list of items, or detail information about an item, etc. Thus on such devices, screens generally map one-to-one with levels in the information hierarchy (<em>categories</em> → <em>object list</em> → <em>object detail</em>).</p> + +<p>Larger screens such as those found on tablets and TVs, on the other hand, generally have much more available screen space and are able to present multiple panes of content. In landscape, panes are usually ordered from left to right in increasing detail order. Users are especially accustomed to multiple panes on larger screens from years and years of desktop application and desktop web site use. Many desktop applications and websites offer a left-hand navigation pane or use a master/detail two-pane layout.</p> + +<p>In addition to addressing these user expectations, it's usually necessary to provide multiple panes of information on tablets to avoid leaving too much whitespace or unwittingly introducing awkward interactions, for example 10 x 0.5-inch buttons.</p> + +<p>The following figures demonstrate some of the problems that can arise when moving a UI (user interface) design into a larger layout and how to address these issues with multi-pane layouts:</p> + + +<img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-bad.png" + alt="Single pane layouts on large screens in landscape lead to awkward whitespace and exceedingly long line lengths" id="figure-multipane-bad"> + +<p class="img-caption"><strong>Figure 1.</strong> Single pane layouts on large screens in landscape lead to awkward whitespace and exceedingly long line lengths.</p> + + +<img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-good.png" + alt="Multi-pane layouts in landscape offer better a visual balance while offering more utility and legibility" id="figure-multipane-good"> + +<p class="img-caption"><strong>Figure 2.</strong> Multi-pane layouts in landscape result in a better visual balance while offering more utility and legibility.</p> + + +<p class="note"><strong>Implementation Note:</strong> After deciding on the screen size at which to draw the line between single-pane and multi-pane layouts, you can provide different layouts containing one or multiple panes for devices in varying screen size buckets (such as <code>large</code>/<code>xlarge</code>) or varying minimum screen widths (such as <code>sw600dp</code>).</p> + +<p class="note"><strong>Implementation Note:</strong> While a single screen is implemented as an {@link android.app.Activity} subclass, individual content panes can be implemented as {@link android.app.Fragment} subclasses. This maximizes code re-use across different form factors and across screens that share content.</p> + + +<h2 id="orientations">Design for Multiple Tablet Orientations</h2> + +<p>Although we haven't begun arranging user interface elements on our screens yet, this is a good time to consider how your multi-pane screens will adapt to different device orientations. Multi-pane layouts in landscape work quite well because of the large amount of available horizontal space. However, in the portrait orientation, your horizontal space is more limited, so you may need to design a separate layout for this orientation.</p> + +<p>Below are a few common strategies for creating portrait tablet layouts.</p> + +<ul> + <li><strong>Stretch</strong> + <img src="{@docRoot}images/training/app-navigation-multiple-sizes-strategy-stretch.png" + alt="Stretch strategy"> + <p>The most straightforward strategy is to simply stretch each pane's width to best present the content in each pane in the portrait orientation. Panes could have fixed widths or take a certain percentage of the available screen width.</p></li> + + <li><strong>Expand/collapse</strong> + <img src="{@docRoot}images/training/app-navigation-multiple-sizes-strategy-collapse.png" + alt="Expand/collapse strategy"> + <p>A variation on the stretch strategy is to collapse the contents of the left pane when in portrait. This works quite well with master/detail panes where the left (master) pane contains easily collapsible list items. An example would be for a realtime chat application. In landscape, the left list could contain chat contact photos, names, and online statuses. In portrait, horizontal space could be collapsed by hiding contact names and only showing photos and online status indicator icons.</p></li> + + <li><strong>Show/Hide</strong> + <img src="{@docRoot}images/training/app-navigation-multiple-sizes-strategy-show-hide.png" + alt="Show/Hide strategy"> + <p>In this scenario, the left pane is completely hidden in portrait mode. However, <em>to ensure the functional parity</em> of your screen in portrait and landscape, the left pane should be made available via an onscreen affordance (such as a button). It's usually appropriate to use the <em>Up</em> button in the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> to show the left pane, as is discussed in a <a href="ancestral-temporal.html">later lesson</a>.</p></li> + + <li><strong>Stack</strong> + <img src="{@docRoot}images/training/app-navigation-multiple-sizes-strategy-stack.png" + alt="Stack strategy"> + <p>The last strategy is to vertically stack your normally horizontally-arranged panes in portrait. This strategy works well when your panes aren't simple text-based lists, or when there are multiple blocks of content running along the primary content pane. Be careful to avoid the awkward whitespace problem discussed above when using this strategy.</p></li> + +</ul> + + +<h2 id="group-screens">Group Screens in the Screen Map</h2> + +<p>Now that we are able to group individual screens together by providing multi-pane layouts on larger-screen devices, let's apply this technique to our exhaustive screen map from the <a href="screen-planning.html">previous lesson</a> to get a better sense of our application's hierarchy on such devices:</p> + + +<img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-screen-map.png" + alt="Updated example news application screen map for tablets" id="figure-multipane-screen-map"> + +<p class="img-caption"><strong>Figure 3.</strong> Updated example news application screen map for tablets.</p> + + +<p>In the next lesson we discuss <em>descendant</em> and <em>lateral</em> navigation, and explore more ways of grouping screens to maximize the intuitiveness and speed of content access in the application's user interface.</p> diff --git a/docs/html/training/design-navigation/screen-planning.jd b/docs/html/training/design-navigation/screen-planning.jd new file mode 100644 index 0000000..66bb752 --- /dev/null +++ b/docs/html/training/design-navigation/screen-planning.jd @@ -0,0 +1,78 @@ +page.title=Planning Screens and Their Relationships +parent.title=Designing Effective Navigation +parent.link=index.html + +trainingnavtop=true +next.title=Planning for Multiple Touchscreen Sizes +next.link=multiple-sizes.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to</h2> +<ol> + <li><a href="#screen-list">Create a Screen List</a></li> + <li><a href="#diagram-relationships">Diagram Screen Relationships</a></li> + <li><a href="#beyond-simplistic-design">Go Beyond a Simplistic Design</a></li> +</ol> + +</div> +</div> + + +<p>Most apps have an inherent information model that can be expressed as a tree or graph of object types. In more obvious terms, you can draw a diagram of different kinds of information that represents the types of things users interact with in your app. Software engineers and data architects often use entity-relationship diagrams (ERDs) to describe an application's information model.</p> + +<p>Let's consider an example application that allows users to browse through a set of categorized news stories and photos. One possible model for such an app is shown below in the form of an ERD.</p> + + +<img src="{@docRoot}images/training/app-navigation-screen-planning-erd.png" + alt="Entity-relationship diagram for the example news application" id="figure-erd"> + +<p class="img-caption"><strong>Figure 1.</strong> Entity-relationship diagram for the example news application.</p> + + +<h2 id="screen-list">Create a Screen List</h2> + +<p>Once you define the information model, you can begin to define the contexts necessary to enable users to effectively discover, view, and act upon the data in your application. In practice, one way to do this is to <em>determine the exhaustive set of screens</em> needed to allow users to navigate to and interact with the data. The set of screens we actually expose should generally vary depending on the target device; it's important to consider this early in the design process to ensure that the application can adapt to its environment.</p> + +<p>In our example application, we want to enable users to <strong>view</strong>, <strong>save</strong>, and <strong>share</strong> <em>categorized</em> <strong>stories</strong> and <strong>photos</strong>. Below is an exhaustive list of screens that covers these use cases.</p> + +<ul> + <li>Home or "launchpad" screen for accessing stories and photos</li> + <li>List of categories</li> + <li>List of news stories for a given category</li> + <li>Story detail view (from which we can save and share)</li> + <li>List of photos, uncategorized</li> + <li>Photo detail view (from which we can save and share)</li> + <li>List of all saved items</li> + <li>List of saved photos</li> + <li>List of saved stories</li> +</ul> + + +<h2 id="diagram-relationships">Diagram Screen Relationships</h2> + +<p>Now we can define the directed relationships between screens; an arrow from one screen <em>A</em> to another screen <em>B</em> implies that screen <em>B</em> should be directly reachable via some user interaction in screen <em>A</em>. Once we define both the set of screens and the relationships between them, we can express these in concert as a screen map, which shows all of your screens and their relationships:</p> + + +<img src="{@docRoot}images/training/app-navigation-screen-planning-exhaustive-map.png" + alt="Exhaustive screen map for the example news application" id="figure-exhaustive-map"> + +<p class="img-caption"><strong>Figure 2.</strong> Exhaustive screen map for the example news application.</p> + +<p>If we later wanted to allow users to submit news stories or upload photos, we could add additional screens to this diagram.</p> + + +<h2 id="beyond-simplistic-design">Go Beyond a Simplistic Design</h2> + +<p>At this point, it's possible to design a completely functional application from this exhaustive screen map. A simplistic user interface could consist of lists and buttons leading to child screens:</p> + +<ul> + <li>Buttons leading to different sections (e.g., stories, photos, saved items)</li> + <li>Vertical lists representing collections (e.g., story lists, photo lists, etc.)</li> + <li>Detail information (e.g., story view, full-screen photo view, etc.)</li> +</ul> + +<p>However, you can use screen grouping techniques and more sophisticated navigation elements to present content in a more intuitive and device-sensitive way. In the next lesson, we explore screen grouping techniques, such as providing multi-pane layouts for tablet devices. Later, we'll dive into the various navigation patterns common on Android.</p> diff --git a/docs/html/training/design-navigation/wireframing.jd b/docs/html/training/design-navigation/wireframing.jd new file mode 100644 index 0000000..5d0c1cb --- /dev/null +++ b/docs/html/training/design-navigation/wireframing.jd @@ -0,0 +1,125 @@ +page.title=Putting it All Together: Wireframing the Example App +parent.title=Designing Effective Navigation +parent.link=index.html + +trainingnavtop=true +previous.title=Providing Ancestral and Temporal Navigation +previous.link=ancestral-temporal.html + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + +<h2>This lesson teaches you to:</h2> +<ol> + <li><a href="#choose-patterns">Choose Patterns</a></li> + <li><a href="#wireframe">Sketch and Wireframe</a></li> + <li><a href="#wireframe-digital">Create Digital Wireframes</a></li> +</ol> + +</div> +</div> + + +<p>Now that we have a solid understanding of navigation patterns and screen grouping techniques, it's time to apply them to our screens. Let's take another look at our exhaustive screen map for the example news application from the <a href="screen-planning.html">first lesson</a>, below.</p> + + +<img src="{@docRoot}images/training/app-navigation-screen-planning-exhaustive-map.png" + alt="Exhaustive screen map for the example news application" id="figure-exhaustive-map"> + +<p class="img-caption"><strong>Figure 1.</strong> Exhaustive screen map for the example news application.</p> + + +<p>Our next step is to choose and apply navigation patterns discussed in the previous lessons to this screen map, maximizing navigation speed and minimizing the number of touches to access data, while keeping the interface intuitive and consistent with Android best practices. We also need to make different choices for our different target device form factors. For simplicity, let's focus on tablets and handsets.</p> + + +<h2 id="choose-patterns">Choose Patterns</h2> + +<p>First, our second-level screens (<em>Story Category List</em>, <em>Photo List</em>, and <em>Saved Item List</em>) can be grouped together using tabs. Note that we don't necessarily have to use horizontally arranged tabs; in some cases a drop-down list UI element can serve as a suitable replacement, especially on devices with narrow screens such as handsets. We can also group the <em>Saved Photo List</em> and <em>Saved Story List</em> screens together using tabs on handsets, or use multiple vertical content panes on tablets.</p> + +<p>Finally, let's look at how we present news stories. The first option to simplify navigation across different story categories is to use horizontal paging, with a set of labels above the horizontal swiping surface, indicating the currently visible and adjacently accessible categories. On tablets in the landscape orientation, we can go a step further and present the horizontally-pageable <em>Story List</em> screen as a left pane, and the <em>Story View</em> screen as the primary content pane on the right.</p> + +<p>Below are diagrams representing the new screen maps for handsets and tablets after applying these navigation patterns.</p> + + +<img src="{@docRoot}images/training/app-navigation-wireframing-map-example-phone.png" + alt="Final screen map for the example news application on handsets" id="figure-map-example-phone"> + +<p class="img-caption"><strong>Figure 2.</strong> Final screen map for the example news application on handsets.</p> + + +<img src="{@docRoot}images/training/app-navigation-wireframing-map-example-tablet.png" + alt="Final screen map for the example news application on tablets, in landscape" id="figure-map-example-tablet"> + +<p class="img-caption"><strong>Figure 3.</strong> Final screen map for the example news application on tablets, in landscape.</p> + + +<p>At this point, it's a good idea to think of screen map variations, in case your chosen patterns don't apply well in practice (when you sketch the application's screen layouts). Below is an example screen map variation for tablets that presents story lists for different categories side-by-side, with story view screens remaining independent.</p> + + +<img src="{@docRoot}images/training/app-navigation-wireframing-map-example-tablet-alt.png" + alt="Example alternate screen map for tablets, in landscape." id="figure-map-example-tablet-alt"> + +<p class="img-caption"><strong>Figure 4.</strong> Example alternate screen map for tablets, in landscape.</p> + + +<h2 id="wireframe">Sketch and Wireframe</h2> + +<p><em><a href="http://en.wikipedia.org/wiki/Website_wireframe">Wireframing</a></em> is the step in the design process where you begin to lay out your screens. Get creative and begin imagining how to arrange UI elements to allow users to navigate your app. Keep in mind that at this point, pixel-perfect precision (creating high-fidelity mockups) is not important.</p> + +<p>The easiest and fastest way to get started is to sketch out your screens by hand using paper and pencils. Once you begin sketching, you may uncover practicality issues in your original screen map or decisions on which patterns to use. In some cases, patterns may apply well to a given design problem in theory, but in practice they may break down and cause visual clutter or interactional issues (for example, if there are two rows of tabs on the screen). If that happens, explore other navigation patterns, or variations on chosen patterns, to arrive at a more optimal set of sketches.</p> + +<p>After you're satisfied with initial sketches, it's a good idea to move on to digital wireframing using software such as Adobe® Illustrator, Adobe® Fireworks, OmniGraffle, or any other vector illustration tools. When choosing which tool to use, consider the following features:</p> + +<ul> + <li>Are interactive wireframes possible? Tools such as Adobe® Fireworks offer this functionality.</li> + <li>Is there screen 'master' functionality, allowing re-use of visual elements across different screens? For example, Action Bars should be visible on almost every screen in your application.</li> + <li>What's the learning curve? Professional vector illustration tools may have a steep learning curve, while tools designed for wireframing may offer a smaller set of features that are more relevant to the task.</li> +</ul> + +<p>Lastly, the XML Layout Editor that comes with the <a href="{@docRoot}guide/developing/tools/adt.html">Android Development Tools (ADT)</a> plugin for Eclipse can often be used for prototyping. However, you should be careful to focus more on the high-level layout and less on visual design details at this point.</p> + + +<h2 id="wireframe-digital">Create Digital Wireframes</h2> + +<p>After sketching out layouts on paper and choosing a digital wireframing tool that works for you, you can create the digital wireframes that will serve as the starting point for your application's visual design. Below are example wireframes for our news application, corresponding one-to-one with our screen maps from earlier in this lesson.</p> + + +<a href="{@docRoot}images/training/app-navigation-wireframing-wires-phone.png"> + <img src="{@docRoot}images/training/app-navigation-wireframing-wires-phone.png" + alt="Example news application wireframes, for handsets in portrait." + width="800" + id="figure-wires-phone"> +</a> + +<p class="img-caption"><strong>Figure 5.</strong> Example news application wireframes, for handsets in portrait. +<strong>(<a href="example-wireframe-tablet.svg">Download SVG</a>)</strong></p> + + +<a href="{@docRoot}images/training/app-navigation-wireframing-wires-tablet.png"> + <img src="{@docRoot}images/training/app-navigation-wireframing-wires-tablet.png" + alt="Example news application wireframes, for tablets in landscape." + width="800" + id="figure-wires-tablet"> +</a> + +<p class="img-caption"><strong>Figure 6.</strong> Example news application wireframes, for tablets in landscape. Also includes an alternate layout for presenting story lists. +<strong>(<a href="example-wireframe-tablet.svg">Download SVG</a>)</strong></p> + + +<p><strong>(<a href="example-wireframe-device-template.svg">Download SVG for device wireframe art</a>)</strong></p> + + +<h2 id="next-steps">Next Steps</h2> + +<p>Now that you've designed effective and intuitive intra-app navigation for your application, you can begin to spend time refining the user interface for each individual screen. For example, you can choose to use richer widgets in place of simple text labels, images, and buttons when displaying interactive content. You can also begin defining the visual styling of your application, incorporating elements from your brand's visual language in the process.</p> + +<p>Lastly, it may be time to begin implementing your designs and writing the code for the application using the Android SDK. To get started, take a look at the following resources:</p> + +<ul> + <li><a href="{@docRoot}guide/topics/ui/index.html">Developer's Guide: User Interface</a>: learn how to implement your user interface designs using the Android SDK.</li> + <li><a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>: implement tabs, up navigation, on-screen actions, etc. + <li><a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a>: implement re-usable, multi-pane layouts + <li><a href="{@docRoot}sdk/compatibility-library.html">Support Library</a>: implement horizontal paging using <code>ViewPager</code></li> +</ul> 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 0000000..5190a22 --- /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 for 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 offers 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 0000000..0db9009 --- /dev/null +++ b/docs/html/training/enterprise/index.jd @@ -0,0 +1,49 @@ +page.title=Developing for 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.2 (API Level 8) or higher</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 0000000..4eba87b --- /dev/null +++ b/docs/html/training/id-auth/authenticate.jd @@ -0,0 +1,252 @@ +page.title=Authenticating to OAuth2 Services +parent.title=Remembering and Authenticating Users +parent.link=index.html + +trainingnavtop=true +previous.title=Remembering 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. This is a multi-step process.</p> + +<img src="{@docRoot}images/training/oauth_dance.png" alt="Procedure for obtaining +a valid auth token from the Android Account Manager"/> + +<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> + +<pre> +<manifest ... > + <uses-permission android:name="android.permission.ACCOUNT_MANAGER" /> + <uses-permission android:name="android.permission.INTERNET" /> + ... +</manifest> +</pre> + + +<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 0000000..e2bd778 --- /dev/null +++ b/docs/html/training/id-auth/custom_auth.jd @@ -0,0 +1,186 @@ +page.title=Creating a Custom Account Type +parent.title=Remembering 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>So far we've talked about accessing Google APIs, which use accounts and users +defined by Google. If you have your own online service, though, it won't have +Google accounts or users, so what do you do? 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 0000000..d4a6f7a --- /dev/null +++ b/docs/html/training/id-auth/identify.jd @@ -0,0 +1,137 @@ +page.title=Remembering Your User +parent.title=Remembering 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 Personalize Your App</a></li> + <li><a href="#IdIsEnough">Decide Whether an Account Name 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 fetch the account names +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 try to remember the user using one of three techniques:</p> +<ol type="a"> +<li>Ask the user to type in a username </li> +<li>Retrieve a unique device ID to remember the device</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 remember 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 Personalize Your App</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 an Account Name is Enough</h2> + +<p>An account name is a good way to remember the user, but the {@link android.accounts.Account} +object by +itself doesn't protect your data or give you access to anything besides the user's account name. If your app +needs to allow the user to go online 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 0000000..361e6cf --- /dev/null +++ b/docs/html/training/id-auth/index.jd @@ -0,0 +1,65 @@ +page.title=Remembering Users + +trainingnavtop=true +startpage=true +next.title=Remembering 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>Personalize your app by remembering users by their account name(s) +<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">Remembering 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 0000000..a0ac13e --- /dev/null +++ b/docs/html/training/improving-layouts/index.jd @@ -0,0 +1,58 @@ +page.title=Improving Layout Performance + +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 0000000..0fa2855 --- /dev/null +++ b/docs/html/training/improving-layouts/loading-ondemand.jd @@ -0,0 +1,86 @@ +page.title=Loading Views On Demand +parent.title=Improving Layout Performance +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 0000000..65c8af7 --- /dev/null +++ b/docs/html/training/improving-layouts/optimizing-layout.jd @@ -0,0 +1,156 @@ +page.title=Optimizing Layout Hierarchies +parent.title=Improving Layout Performance +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 0000000..095b0dd --- /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 Layout Performance +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 0000000..0afa929 --- /dev/null +++ b/docs/html/training/improving-layouts/smooth-scrolling.jd @@ -0,0 +1,124 @@ +page.title=Making ListView Scrolling Smooth +parent.title=Improving Layout Performance +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/index.jd b/docs/html/training/index.jd new file mode 100644 index 0000000..5e85924 --- /dev/null +++ b/docs/html/training/index.jd @@ -0,0 +1,17 @@ +page.title=Orientation to Android Training + +@jd:body + +<div class="figure" style="width:450px;margin-top:-30px"> + <img src="{@docRoot}images/training/training-prof.png" alt="" /> +</div> + +<p>Welcome to Android Training. Here you'll find a collection of classes that aim to help you +build great apps for Android, using best practices in a variety of framework topics.</p> + +<p>Each class explains the steps required to solve a problem or implement a feature using code +snippets and sample code for you to use in your apps.</p> + +<p>What you see now is just the beginning. We plan to add many more classes, expand and refine +existing classes, and build Training Courses that help you enhance your apps using +objective-oriented collections of classes.</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 0000000..66649e8 --- /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 +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 0000000..416e519 --- /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 +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 0000000..3aa2d88 --- /dev/null +++ b/docs/html/training/managing-audio/index.jd @@ -0,0 +1,62 @@ +page.title=Managing Audio Playback + +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 0000000..76abbb6 --- /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 +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 0000000..d3ab676 --- /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 0000000..f90bfc7 --- /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 0000000..6e25df8 --- /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=Optimizing 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 0000000..98ba63c --- /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=Optimizing 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 0000000..392ce30 --- /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=Optimizing 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 0000000..61f7176 --- /dev/null +++ b/docs/html/training/monitoring-device-state/index.jd @@ -0,0 +1,63 @@ +page.title=Optimizing 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 0000000..556a733 --- /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=Optimizing 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 0000000..d8588d4 --- /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=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 0000000..f9b2b43 --- /dev/null +++ b/docs/html/training/multiple-apks/index.jd @@ -0,0 +1,72 @@ +page.title=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 0000000..9795cb1 --- /dev/null +++ b/docs/html/training/multiple-apks/multiple.jd @@ -0,0 +1,475 @@ +page.title=Creating Multiple APKs with 2+ Dimensions +parent.title=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 0000000..0ed972a --- /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=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 0000000..2bbe511 --- /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=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 0000000..34e9d7d --- /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 0000000..a986cef --- /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 0000000..7d6ff44 --- /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 0000000..2db0b67 --- /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 0000000..9ee5e29 --- /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 covers some common ways you can send and receive content between +applications using {@link android.content.Intent} APIs and the {@link +android.view.ActionProvider} object.</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 0000000..cc55967 --- /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. +Similar to how 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. 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 0000000..afb0e34 --- /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 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 0000000..873f614 --- /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} object, 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 cb3d833..b106042 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 47d530b..3fa2bf8 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 20abd51..046d5e9 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 6f3051a..4310bed 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 f293cba..f2205f6 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 5e58a9e..d264971 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 158f785..34245b0 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,31 @@ 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; + + mLinearFiltering = false; 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 +371,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 +389,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 +414,33 @@ void FontRenderer::flushAllAndInvalidate() { } } -bool FontRenderer::cacheBitmap(const SkGlyph& glyph, uint32_t* retOriginX, uint32_t* retOriginY) { +void FontRenderer::allocateTextureMemory(CacheTexture *cacheTexture) { + int width = cacheTexture->mWidth; + int height = cacheTexture->mHeight; + cacheTexture->mTexture = new uint8_t[width * height]; + memset(cacheTexture->mTexture, 0, width * height * sizeof(uint8_t)); + glBindTexture(GL_TEXTURE_2D, cacheTexture->mTextureId); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + // Initialize texture dimensions + glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, + GL_ALPHA, GL_UNSIGNED_BYTE, 0); + + const GLenum filtering = cacheTexture->mLinearFiltering ? GL_LINEAR : GL_NEAREST; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +} + +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 +448,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 +465,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 + allocateTextureMemory(cacheTexture); + } + uint8_t* cacheBuffer = cacheTexture->mTexture; uint8_t* bitmapBuffer = (uint8_t*) glyph.fImage; unsigned int stride = glyph.rowBytes(); @@ -458,69 +502,73 @@ 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)); +CacheTexture* FontRenderer::createCacheTexture(int width, int height, bool allocate) { + GLuint textureId; + glGenTextures(1, &textureId); + uint8_t* textureMemory = NULL; - mUploadTexture = false; - - if (mTextureId != 0) { - glDeleteTextures(1, &mTextureId); + CacheTexture* cacheTexture = new CacheTexture(textureMemory, textureId, width, height); + if (allocate) { + allocateTextureMemory(cacheTexture); } - glGenTextures(1, &mTextureId); - glBindTexture(GL_TEXTURE_2D, mTextureId); - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - // Initialize texture dimensions - glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, mCacheWidth, mCacheHeight, 0, - GL_ALPHA, GL_UNSIGNED_BYTE, 0); + return cacheTexture; +} - mLinearFiltering = false; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); +void FontRenderer::initTextTexture() { + mCacheLines.clear(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + // 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; - // Split up our cache texture into lines of certain widths + 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 +586,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 +617,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 +646,78 @@ void FontRenderer::checkTextureUpdate() { } } + glBindTexture(GL_TEXTURE_2D, mCurrentCacheTexture->mTextureId); + if (mLinearFiltering != mCurrentCacheTexture->mLinearFiltering) { + const GLenum filtering = mLinearFiltering ? GL_LINEAR : GL_NEAREST; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filtering); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filtering); + mCurrentCacheTexture->mLinearFiltering = mLinearFiltering; + } + 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 +797,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(SkPaint* paint, const ch return image; } + mDrawn = false; mClip = NULL; mBounds = NULL; @@ -750,6 +825,7 @@ FontRenderer::DropShadow FontRenderer::renderDropShadow(SkPaint* paint, const ch image.image = dataBuffer; image.penX = penX; image.penY = penY; + return image; } @@ -762,11 +838,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 +985,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 1922812..9f32747 100644 --- a/libs/hwui/FontRenderer.h +++ b/libs/hwui/FontRenderer.h @@ -55,6 +55,79 @@ 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), + mLinearFiltering(false) {} + ~CacheTexture() { + if (mTexture != NULL) { + delete[] mTexture; + } + if (mTextureId != 0) { + glDeleteTextures(1, &mTextureId); + } + } + + uint8_t* mTexture; + GLuint mTextureId; + uint16_t mWidth; + uint16_t mHeight; + bool mLinearFiltering; +}; + +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 +174,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 +224,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); @@ -210,23 +251,33 @@ public: GLuint getTexture(bool linearFiltering = false) { checkInit(); - if (linearFiltering != mLinearFiltering) { + if (linearFiltering != mCurrentCacheTexture->mLinearFiltering) { + mCurrentCacheTexture->mLinearFiltering = linearFiltering; 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; + return mCurrentCacheTexture->mTextureId; } - uint32_t getCacheWidth() const { - return mCacheWidth; - } - - 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 +285,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); + void allocateTextureMemory(CacheTexture* cacheTexture); + 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 +300,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 +314,13 @@ 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 +331,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 54c208e..99f08f0 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 aacf22a..a88a59a 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 5298125..d304b37 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 e2d9ea3..38630b8 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 1d7b99d..75c6d0a 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 cd9ff93..019e9b2 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 47a2c99..27f530c 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 972dd87..701314d 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 764cb05..eed909d 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 c2383f4..a7f1277 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 5c7197b..e3ed79e 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 8c01e3a..2eae0f1 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 edc90e1..fff9f6c 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 32e7533..66993a4 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 a3ee63b..bbefec6 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 a4aed07..1adf2c7 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 939bd4a..7c1485d 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 4f9eb2b..c5d17eb 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 673f9f4..85be267 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 7e55fbd..6868d99 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 d0d9ca6..3539e3f 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 e72adc4..6d28298 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 66eab72..59d06ad 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/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp index 51a7541..2f807d0 100644 --- a/media/libstagefright/SurfaceMediaSource.cpp +++ b/media/libstagefright/SurfaceMediaSource.cpp @@ -338,7 +338,9 @@ status_t SurfaceMediaSource::dequeueBuffer(int *outBuf, uint32_t w, uint32_t h, (uint32_t(buffer->height) != h) || (uint32_t(buffer->format) != format) || ((uint32_t(buffer->usage) & usage) != usage)) { - usage |= GraphicBuffer::USAGE_HW_VIDEO_ENCODER; + // XXX: This will be changed to USAGE_HW_VIDEO_ENCODER once driver + // issues with that flag get fixed. + usage |= GraphicBuffer::USAGE_HW_TEXTURE; status_t error; sp<GraphicBuffer> graphicBuffer( mGraphicBufferAlloc->createGraphicBuffer( diff --git a/media/libstagefright/foundation/ABitReader.cpp b/media/libstagefright/foundation/ABitReader.cpp index f07dd4f..5499c32 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 547b202..9d72b1f 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 0fbbb9e..d8107bc 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 dd049c2..21ef298 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 7094cfa..b5f85f9 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 e1025aa..389dfbe 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 5ed2c3c..97d1085 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 a6a3303..5a927c6 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 6208581..02da243 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 fe4d318..d645a3c 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 2536d92..9c117ae 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 44e3577..4f51201 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 b375396..35d85e1 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 54e3d1e..bc1628f 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 4564f90..e997355 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 bf1496b..4bba71b 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 67a6855..e3c0601 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 af86ae9..f1fe43b 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 92260d6..1a252fa 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 aa00fbd..b9903dd 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 b48f23d..a13fddb 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", @@ -158,7 +160,7 @@ static const char *audio_interfaces[] = { AudioFlinger::AudioFlinger() : BnAudioFlinger(), - mPrimaryHardwareDev(0), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1), + mPrimaryHardwareDev(NULL), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1), mBtNrecIsOff(false) { } @@ -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 { @@ -1062,9 +1066,9 @@ void AudioFlinger::ThreadBase::sendConfigEvent(int event, int param) // sendConfigEvent_l() must be called with ThreadBase::mLock held void AudioFlinger::ThreadBase::sendConfigEvent_l(int event, int param) { - ConfigEvent *configEvent = new ConfigEvent(); - configEvent->mEvent = event; - configEvent->mParam = param; + ConfigEvent configEvent; + configEvent.mEvent = event; + configEvent.mParam = param; mConfigEvents.add(configEvent); ALOGV("sendConfigEvent() num events %d event %d, param %d", mConfigEvents.size(), event, param); mWaitWorkCV.signal(); @@ -1075,15 +1079,14 @@ void AudioFlinger::ThreadBase::processConfigEvents() mLock.lock(); while(!mConfigEvents.isEmpty()) { ALOGV("processConfigEvents() remaining events %d", mConfigEvents.size()); - ConfigEvent *configEvent = mConfigEvents[0]; + ConfigEvent configEvent = mConfigEvents[0]; mConfigEvents.removeAt(0); // release mLock before locking AudioFlinger mLock: lock order is always // AudioFlinger then ThreadBase to avoid cross deadlock mLock.unlock(); mAudioFlinger->mLock.lock(); - audioConfigChanged_l(configEvent->mEvent, configEvent->mParam); + audioConfigChanged_l(configEvent.mEvent, configEvent.mParam); mAudioFlinger->mLock.unlock(); - delete configEvent; mLock.lock(); } mLock.unlock(); @@ -1130,7 +1133,7 @@ status_t AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args snprintf(buffer, SIZE, " Index event param\n"); result.append(buffer); for (size_t i = 0; i < mConfigEvents.size(); i++) { - snprintf(buffer, SIZE, " %02d %02d %d\n", i, mConfigEvents[i]->mEvent, mConfigEvents[i]->mParam); + snprintf(buffer, SIZE, " %02d %02d %d\n", i, mConfigEvents[i].mEvent, mConfigEvents[i].mParam); result.append(buffer); } result.append("\n"); @@ -1367,7 +1370,7 @@ AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinge int id, uint32_t device) : ThreadBase(audioFlinger, id, device), - mMixBuffer(0), mSuspended(0), mBytesWritten(0), mOutput(output), + mMixBuffer(NULL), mSuspended(0), mBytesWritten(0), mOutput(output), mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false) { snprintf(mName, kNameLength, "AudioOut_%d", id); @@ -1526,8 +1529,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; } @@ -1832,7 +1837,7 @@ uint32_t AudioFlinger::PlaybackThread::activeSleepTimeUs() AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device) : PlaybackThread(audioFlinger, output, id, device), - mAudioMixer(0) + mAudioMixer(NULL) { mType = ThreadBase::MIXER; mAudioMixer = new AudioMixer(mFrameCount, mSampleRate); @@ -1967,7 +1972,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 +2017,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 +2034,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; @@ -2197,7 +2202,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track // XXX: these things DON'T need to be done each time mAudioMixer->setBufferProvider(track); - mAudioMixer->enable(AudioMixer::MIXING); + mAudioMixer->enable(); mAudioMixer->setParameter(param, AudioMixer::VOLUME0, (void *)left); mAudioMixer->setParameter(param, AudioMixer::VOLUME1, (void *)right); @@ -2243,7 +2248,7 @@ uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track mixerStatus = MIXER_TRACKS_ENABLED; } } - mAudioMixer->disable(AudioMixer::MIXING); + mAudioMixer->disable(); } } @@ -2344,7 +2349,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 +2420,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; } @@ -2766,7 +2771,7 @@ bool AudioFlinger::DirectOutputThread::threadLoop() while (frameCount) { buffer.frameCount = frameCount; activeTrack->getNextBuffer(&buffer); - if (UNLIKELY(buffer.raw == 0)) { + if (UNLIKELY(buffer.raw == NULL)) { memset(curBuf, 0, frameCount * mFrameSize); break; } @@ -2891,7 +2896,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; } @@ -3264,7 +3269,7 @@ AudioFlinger::ThreadBase::TrackBase::~TrackBase() void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer) { - buffer->raw = 0; + buffer->raw = NULL; mFrameCount = buffer->frameCount; step(); buffer->frameCount = 0; @@ -3457,14 +3462,14 @@ status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(AudioBufferProvider: } buffer->raw = getBuffer(s, framesReq); - if (buffer->raw == 0) goto getNextBuffer_exit; + if (buffer->raw == NULL) goto getNextBuffer_exit; buffer->frameCount = framesReq; return NO_ERROR; } getNextBuffer_exit: - buffer->raw = 0; + buffer->raw = NULL; buffer->frameCount = 0; ALOGV("getNextBuffer() no more data for track %d on thread %p", mName, mThread.unsafe_get()); return NOT_ENOUGH_DATA; @@ -3705,14 +3710,14 @@ status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvi } buffer->raw = getBuffer(s, framesReq); - if (buffer->raw == 0) goto getNextBuffer_exit; + if (buffer->raw == NULL) goto getNextBuffer_exit; buffer->frameCount = framesReq; return NO_ERROR; } getNextBuffer_exit: - buffer->raw = 0; + buffer->raw = NULL; buffer->frameCount = 0; return NOT_ENOUGH_DATA; } @@ -4217,7 +4222,7 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, int id, uint32_t device) : ThreadBase(audioFlinger, id, device), - mInput(input), mTrack(NULL), mResampler(0), mRsmpOutBuffer(0), mRsmpInBuffer(0) + mInput(input), mTrack(NULL), mResampler(NULL), mRsmpOutBuffer(NULL), mRsmpInBuffer(NULL) { mType = ThreadBase::RECORD; @@ -4232,7 +4237,7 @@ AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, AudioFlinger::RecordThread::~RecordThread() { delete[] mRsmpInBuffer; - if (mResampler != 0) { + if (mResampler != NULL) { delete mResampler; delete[] mRsmpOutBuffer; } @@ -4326,7 +4331,7 @@ bool AudioFlinger::RecordThread::threadLoop() buffer.frameCount = mFrameCount; if (LIKELY(mActiveTrack->getNextBuffer(&buffer) == NO_ERROR)) { size_t framesOut = buffer.frameCount; - if (mResampler == 0) { + if (mResampler == NULL) { // no resampling while (framesOut) { size_t framesIn = mFrameCount - mRsmpInIndex; @@ -4411,7 +4416,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; } @@ -4584,7 +4589,7 @@ status_t AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args) result.append(buffer); snprintf(buffer, SIZE, "In size: %d\n", mInputBytes); result.append(buffer); - snprintf(buffer, SIZE, "Resampling: %d\n", (mResampler != 0)); + snprintf(buffer, SIZE, "Resampling: %d\n", (mResampler != NULL)); result.append(buffer); snprintf(buffer, SIZE, "Out channel count: %d\n", mReqChannelCount); result.append(buffer); @@ -4619,7 +4624,7 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer* mInput->stream->common.standby(&mInput->stream->common); usleep(kRecordThreadSleepUs); } - buffer->raw = 0; + buffer->raw = NULL; buffer->frameCount = 0; return NOT_ENOUGH_DATA; } @@ -4734,7 +4739,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; } @@ -4782,7 +4787,7 @@ void AudioFlinger::RecordThread::readInputParameters() if (mRsmpInBuffer) delete mRsmpInBuffer; if (mRsmpOutBuffer) delete mRsmpOutBuffer; if (mResampler) delete mResampler; - mResampler = 0; + mResampler = NULL; mSampleRate = mInput->stream->common.get_sample_rate(&mInput->stream->common); mChannelMask = mInput->stream->common.get_channels(&mInput->stream->common); diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 6cafa7e..9707cf4 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -547,7 +547,7 @@ private: Condition mParamCond; Vector<String8> mNewParameters; status_t mParamStatus; - Vector<ConfigEvent *> mConfigEvents; + Vector<ConfigEvent> mConfigEvents; bool mStandby; int mId; bool mExiting; @@ -703,7 +703,7 @@ private: virtual status_t readyToRun(); virtual void onFirstRef(); - virtual status_t initCheck() const { return (mOutput == 0) ? NO_INIT : NO_ERROR; } + virtual status_t initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; } virtual uint32_t latency() const; @@ -980,7 +980,7 @@ private: virtual status_t readyToRun(); virtual void onFirstRef(); - virtual status_t initCheck() const { return (mInput == 0) ? NO_INIT : NO_ERROR; } + virtual status_t initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; } sp<AudioFlinger::RecordThread::RecordTrack> createRecordTrack_l( const sp<AudioFlinger::Client>& client, uint32_t sampleRate, diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 7c7fa56..1ebcd26 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -18,6 +18,7 @@ #define LOG_TAG "AudioMixer" //#define LOG_NDEBUG 0 +#include <assert.h> #include <stdint.h> #include <string.h> #include <stdlib.h> @@ -50,47 +51,53 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) mState.enabledTracks= 0; mState.needsChanged = 0; mState.frameCount = frameCount; - mState.outputTemp = 0; - mState.resampleTemp = 0; + mState.outputTemp = NULL; + mState.resampleTemp = NULL; mState.hook = process__nop; track_t* t = mState.tracks; for (int i=0 ; i<32 ; i++) { 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; t->channelMask = AUDIO_CHANNEL_OUT_STEREO; t->buffer.raw = 0; - t->bufferProvider = 0; - t->hook = 0; - t->resampler = 0; + t->bufferProvider = NULL; + t->hook = NULL; + t->resampler = NULL; t->sampleRate = mSampleRate; - t->in = 0; + t->in = NULL; t->mainBuffer = NULL; t->auxBuffer = NULL; t++; } } - 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 +111,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); @@ -127,7 +134,7 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) if (track.resampler) { // delete the resampler delete track.resampler; - track.resampler = 0; + track.resampler = NULL; track.sampleRate = mSampleRate; invalidateState(1<<name); } @@ -135,47 +142,32 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) track.volumeInc[1] = 0; mTrackNames &= ~(1<<name); } - } +} -status_t AudioMixer::enable(int name) +void AudioMixer::enable() { - switch (name) { - case MIXING: { - if (mState.tracks[ mActiveTrack ].enabled != 1) { - mState.tracks[ mActiveTrack ].enabled = 1; - ALOGV("enable(%d)", mActiveTrack); - invalidateState(1<<mActiveTrack); - } - } break; - default: - return NAME_NOT_FOUND; + if (mState.tracks[ mActiveTrack ].enabled != 1) { + mState.tracks[ mActiveTrack ].enabled = 1; + ALOGV("enable(%d)", mActiveTrack); + invalidateState(1<<mActiveTrack); } - return NO_ERROR; } -status_t AudioMixer::disable(int name) +void AudioMixer::disable() { - switch (name) { - case MIXING: { - if (mState.tracks[ mActiveTrack ].enabled != 0) { - mState.tracks[ mActiveTrack ].enabled = 0; - ALOGV("disable(%d)", mActiveTrack); - invalidateState(1<<mActiveTrack); - } - } break; - default: - return NAME_NOT_FOUND; + if (mState.tracks[ mActiveTrack ].enabled != 0) { + mState.tracks[ mActiveTrack ].enabled = 0; + ALOGV("disable(%d)", mActiveTrack); + invalidateState(1<<mActiveTrack); } - return NO_ERROR; } -status_t AudioMixer::setActiveTrack(int track) +void AudioMixer::setActiveTrack(int track) { - if (uint32_t(track-TRACK0) >= MAX_NUM_TRACKS) { - return BAD_VALUE; - } - mActiveTrack = track - TRACK0; - return NO_ERROR; + // this also catches track < TRACK0 + track -= TRACK0; + assert(uint32_t(track) < MAX_NUM_TRACKS); + mActiveTrack = track; } status_t AudioMixer::setParameter(int target, int name, void *value) @@ -290,7 +282,7 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) if (value!=devSampleRate || resampler) { if (sampleRate != value) { sampleRate = value; - if (resampler == 0) { + if (resampler == NULL) { resampler = AudioResampler::create( format, channelCount, devSampleRate); } @@ -302,12 +294,12 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate) bool AudioMixer::track_t::doesResample() const { - return resampler != 0; + return resampler != NULL; } void AudioMixer::track_t::resetResampler() { - if (resampler != 0) { + if (resampler != NULL) { resampler->reset(); } } @@ -332,10 +324,9 @@ void AudioMixer::track_t::adjustVolumeRamp(bool aux) } -status_t AudioMixer::setBufferProvider(AudioBufferProvider* buffer) +void AudioMixer::setBufferProvider(AudioBufferProvider* buffer) { mState.tracks[ mActiveTrack ].bufferProvider = buffer; - return NO_ERROR; } @@ -430,11 +421,11 @@ void AudioMixer::process__validate(state_t* state) } else { if (state->outputTemp) { delete [] state->outputTemp; - state->outputTemp = 0; + state->outputTemp = NULL; } if (state->resampleTemp) { delete [] state->resampleTemp; - state->resampleTemp = 0; + state->resampleTemp = NULL; } state->hook = process__genericNoResampling; if (all16BitsStereoNoResample && !volumeRamp) { @@ -450,33 +441,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 +984,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 +1164,7 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) } in1 = buff; b1.frameCount = numFrames; - } else { + } else { in1 = b1.i16; } frameCount1 = b1.frameCount; @@ -1215,4 +1206,3 @@ void AudioMixer::process__TwoTracks16BitsStereoNoResampling(state_t* state) // ---------------------------------------------------------------------------- }; // namespace android - diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index 75c9170..f380b35 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -50,8 +50,7 @@ public: // track units (32 units) TRACK0 = 0x1000, - // enable/disable - MIXING = 0x2000, + // 0x2000 is unused // setParameter targets TRACK = 0x3000, @@ -65,10 +64,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, @@ -78,13 +77,13 @@ public: int getTrackName(); void deleteTrackName(int name); - status_t enable(int name); - status_t disable(int name); + void enable(); + void disable(); - status_t setActiveTrack(int track); + void setActiveTrack(int track); status_t setParameter(int target, int name, void *value); - status_t setBufferProvider(AudioBufferProvider* bufferProvider); + void setBufferProvider(AudioBufferProvider* bufferProvider); void process(); uint32_t trackNames() const { return mTrackNames; } diff --git a/services/audioflinger/AudioPolicyService.cpp b/services/audioflinger/AudioPolicyService.cpp index 840d70d..bc4c90c 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 d898a53..88cb1e9 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 382f4d9..5f31f05 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 3081ebe..ab61a3c 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 f7bf8b5..c1d8a13 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,8 +45,9 @@ 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.RemoteCallbackList; +import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.provider.Settings; @@ -137,8 +135,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub private Thread mThread; private final CountDownLatch mConnectedSignal = new CountDownLatch(1); - // TODO: replace with RemoteCallbackList - private ArrayList<INetworkManagementEventObserver> mObservers; + private final RemoteCallbackList<INetworkManagementEventObserver> mObservers = + new RemoteCallbackList<INetworkManagementEventObserver>(); private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory(); @@ -159,7 +157,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ private NetworkManagementService(Context context) { mContext = context; - mObservers = new ArrayList<INetworkManagementEventObserver>(); if ("simulator".equals(SystemProperties.get("ro.product.device"))) { return; @@ -206,28 +203,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override - public void registerObserver(INetworkManagementEventObserver obs) { - Slog.d(TAG, "Registering observer"); - mObservers.add(obs); + public void registerObserver(INetworkManagementEventObserver observer) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + mObservers.register(observer); } @Override - public void unregisterObserver(INetworkManagementEventObserver obs) { - Slog.d(TAG, "Unregistering observer"); - mObservers.remove(mObservers.indexOf(obs)); + public void unregisterObserver(INetworkManagementEventObserver observer) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + mObservers.unregister(observer); } /** * Notify our observers of an interface status change */ private void notifyInterfaceStatusChanged(String iface, boolean up) { - for (INetworkManagementEventObserver obs : mObservers) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { try { - obs.interfaceStatusChanged(iface, up); - } catch (Exception ex) { - Slog.w(TAG, "Observer notifier failed", ex); + mObservers.getBroadcastItem(i).interfaceStatusChanged(iface, up); + } catch (RemoteException e) { } } + mObservers.finishBroadcast(); } /** @@ -235,26 +233,28 @@ public class NetworkManagementService extends INetworkManagementService.Stub * (typically, an Ethernet cable has been plugged-in or unplugged). */ private void notifyInterfaceLinkStateChanged(String iface, boolean up) { - for (INetworkManagementEventObserver obs : mObservers) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { try { - obs.interfaceLinkStateChanged(iface, up); - } catch (Exception ex) { - Slog.w(TAG, "Observer notifier failed", ex); + mObservers.getBroadcastItem(i).interfaceLinkStateChanged(iface, up); + } catch (RemoteException e) { } } + mObservers.finishBroadcast(); } /** * Notify our observers of an interface addition. */ private void notifyInterfaceAdded(String iface) { - for (INetworkManagementEventObserver obs : mObservers) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { try { - obs.interfaceAdded(iface); - } catch (Exception ex) { - Slog.w(TAG, "Observer notifier failed", ex); + mObservers.getBroadcastItem(i).interfaceAdded(iface); + } catch (RemoteException e) { } } + mObservers.finishBroadcast(); } /** @@ -266,26 +266,28 @@ public class NetworkManagementService extends INetworkManagementService.Stub mActiveAlertIfaces.remove(iface); mActiveQuotaIfaces.remove(iface); - for (INetworkManagementEventObserver obs : mObservers) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { try { - obs.interfaceRemoved(iface); - } catch (Exception ex) { - Slog.w(TAG, "Observer notifier failed", ex); + mObservers.getBroadcastItem(i).interfaceRemoved(iface); + } catch (RemoteException e) { } } + mObservers.finishBroadcast(); } /** * Notify our observers of a limit reached. */ private void notifyLimitReached(String limitName, String iface) { - for (INetworkManagementEventObserver obs : mObservers) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { try { - obs.limitReached(limitName, iface); - } catch (Exception ex) { - Slog.w(TAG, "Observer notifier failed", ex); + mObservers.getBroadcastItem(i).limitReached(limitName, iface); + } catch (RemoteException e) { } } + mObservers.finishBroadcast(); } /** @@ -366,7 +368,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 +379,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 +423,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 +445,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 +453,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 +461,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 +474,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 +484,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 +494,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 +504,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 +581,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 +664,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 +680,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 +690,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 +708,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 +718,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 +734,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 +744,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 +754,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 +766,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 +782,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 +819,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 +829,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 +839,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 +851,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 +865,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 +876,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 +906,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 +916,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 +928,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 +943,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 +978,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 +1004,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 +1032,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 +1056,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 +1071,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 +1100,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 +1164,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 +1173,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 +1195,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 +1217,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 +1236,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 +1246,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 16643ff..5208785 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 df58e83..4067f6e 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 b1551a6..bc8ce7d 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 55e0678..72cf512 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 bb9e60f..2d6a148 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 8c0f1e0..51adebe 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 871ed68..6a82679 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 aa7bf2d..75bda41 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 7c61e9a..36a2567 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 fbc171b..90b5a2e 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 60677df..5f5d668 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/TileBenchmark/res/layout/main.xml b/tests/TileBenchmark/res/layout/main.xml index 577c466..1b39d5d 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 e7a21ad..d38d006 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 10802b4..83f1668 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 568a485..d345411 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 d5b404e..7bb927b 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 40ac2a0..1a0e0da 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 ae8f466..71d7c01 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 b27c60f..0ca3852 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); |