From dde8b50b87fdb6849428fff7808e060489b31142 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Queru
Date: Fri, 9 Oct 2009 07:33:40 -0700
Subject: [PATCH 1/2] donut snapshot
---
core/java/android/app/SearchDialog.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 5844079e616cb..3e93ec71e3b75 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -1206,7 +1206,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
cv.put(SearchManager.SUGGEST_COLUMN_INTENT_ACTION, intent.getAction());
cv.put(SearchManager.SUGGEST_COLUMN_INTENT_DATA, intent.getDataString());
cv.put(SearchManager.SUGGEST_COLUMN_INTENT_COMPONENT_NAME,
- intent.getStringExtra(SearchManager.COMPONENT_NAME_KEY));
+ intent.getComponent().flattenToShortString());
// ensure the icons will work for global search
cv.put(SearchManager.SUGGEST_COLUMN_ICON_1,
From 5f4906cafc8baf874df31dd61f8119efbfc40a26 Mon Sep 17 00:00:00 2001
From: Jean-Baptiste Queru
Date: Fri, 9 Oct 2009 10:27:14 -0700
Subject: [PATCH 2/2] donut snapshot
---
Android.mk | 8 +-
api/4.xml | 110 ++
api/current.xml | 110 ++
core/java/android/app/SearchManager.java | 167 +-
.../android/server/search/Searchables.java | 38 +-
core/java/android/text/Layout.java | 2 +-
core/res/res/values/attrs.xml | 10 +-
core/res/res/values/public.xml | 4 -
docs/html/community/index.jd | 22 +-
docs/html/guide/appendix/api-levels.jd | 356 +++-
docs/html/guide/developing/eclipse-adt.jd | 16 +-
docs/html/guide/developing/other-ide.jd | 121 +-
docs/html/guide/developing/tools/avd.jd | 94 +-
docs/html/guide/developing/tools/emulator.jd | 78 +-
docs/html/guide/developing/tools/index.jd | 5 +
docs/html/guide/developing/tools/zipalign.jd | 65 +
docs/html/guide/guide_toc.cs | 6 +-
docs/html/guide/publishing/app-signing.jd | 246 +--
docs/html/guide/publishing/preparing.jd | 14 +-
docs/html/guide/publishing/versioning.jd | 37 +-
.../samples/images/SearchableDictionary1.png | Bin 0 -> 15800 bytes
.../samples/images/SearchableDictionary2.png | Bin 0 -> 18114 bytes
docs/html/guide/samples/index.jd | 4 +
.../guide/topics/intents/intents-filters.jd | 418 ++++-
.../topics/manifest/uses-feature-element.jd | 98 +-
.../guide/topics/manifest/uses-sdk-element.jd | 17 +-
docs/html/images/emulator-wvga800l.png | Bin 0 -> 513676 bytes
docs/html/index.jd | 19 +-
docs/html/intl/ja/community/index.jd | 18 +-
docs/html/sdk/1.6_r1/index.jd | 140 ++
docs/html/sdk/1.6_r1/installing.jd | 441 +++++
docs/html/sdk/1.6_r1/requirements.jd | 51 +
docs/html/sdk/1.6_r1/upgrading.jd | 386 +++++
docs/html/sdk/RELEASENOTES.jd | 192 +++
docs/html/sdk/adt_download.jd | 19 +-
docs/html/sdk/android-1.6.jd | 235 +++
docs/html/sdk/api_diff/4/changes.html | 4 +-
.../4/changes/alldiffs_index_additions.html | 994 +-----------
.../4/changes/alldiffs_index_all.html | 1011 +-----------
.../4/changes/alldiffs_index_changes.html | 14 -
.../changes/android.Manifest.permission.html | 4 +-
.../android.Manifest.permission_group.html | 4 +-
.../api_diff/4/changes/android.R.anim.html | 151 +-
.../api_diff/4/changes/android.R.array.html | 199 ---
.../api_diff/4/changes/android.R.attr.html | 130 +-
.../api_diff/4/changes/android.R.color.html | 332 ----
.../api_diff/4/changes/android.R.dimen.html | 213 ---
.../4/changes/android.R.drawable.html | 284 +---
.../sdk/api_diff/4/changes/android.R.id.html | 269 ---
.../api_diff/4/changes/android.R.integer.html | 213 ---
.../api_diff/4/changes/android.R.layout.html | 206 ---
.../api_diff/4/changes/android.R.string.html | 304 ----
.../api_diff/4/changes/android.R.style.html | 137 +-
.../4/changes/android.app.Activity.html | 4 +-
.../4/changes/android.app.Dialog.html | 4 +-
...android.app.LauncherActivity.ListItem.html | 4 +-
.../changes/android.app.LauncherActivity.html | 4 +-
.../4/changes/android.app.PendingIntent.html | 4 +-
.../4/changes/android.app.SearchManager.html | 4 +-
.../android.content.ComponentName.html | 4 +-
.../android.content.ContentProvider.html | 4 +-
.../4/changes/android.content.Context.html | 4 +-
.../android.content.ContextWrapper.html | 4 +-
.../4/changes/android.content.Intent.html | 4 +-
.../android.content.pm.ActivityInfo.html | 4 +-
.../android.content.pm.ApplicationInfo.html | 4 +-
.../android.content.pm.ConfigurationInfo.html | 4 +-
.../android.content.pm.PackageManager.html | 4 +-
.../android.content.pm.ProviderInfo.html | 4 +-
.../android.content.res.Configuration.html | 4 +-
.../4/changes/android.graphics.Bitmap.html | 4 +-
...ndroid.graphics.BitmapFactory.Options.html | 4 +-
.../android.graphics.BitmapFactory.html | 4 +-
.../4/changes/android.graphics.Canvas.html | 4 +-
.../4/changes/android.graphics.NinePatch.html | 4 +-
.../4/changes/android.graphics.Typeface.html | 4 +-
...d.graphics.drawable.AnimationDrawable.html | 4 +-
...roid.graphics.drawable.BitmapDrawable.html | 4 +-
.../android.graphics.drawable.Drawable.html | 4 +-
...d.graphics.drawable.NinePatchDrawable.html | 4 +-
.../android.hardware.SensorManager.html | 4 +-
...droid.inputmethodservice.KeyboardView.html | 4 +-
.../4/changes/android.location.Address.html | 4 +-
.../4/changes/android.media.AudioManager.html | 4 +-
...droid.media.MediaRecorder.AudioSource.html | 4 +-
.../changes/android.media.MediaRecorder.html | 4 +-
.../changes/android.media.ToneGenerator.html | 4 +-
.../changes/android.net.wifi.WifiManager.html | 4 +-
.../4/changes/android.os.Build.VERSION.html | 4 +-
.../api_diff/4/changes/android.os.Build.html | 4 +-
.../android.os.RemoteCallbackList.html | 4 +-
...vider.MediaStore.Audio.Genres.Members.html | 4 +-
...droid.provider.MediaStore.Audio.Media.html | 4 +-
.../android.provider.Settings.Secure.html | 4 +-
.../android.provider.Settings.System.html | 4 +-
.../android.telephony.gsm.SmsManager.html | 4 +-
...telephony.gsm.SmsMessage.MessageClass.html | 4 +-
...id.telephony.gsm.SmsMessage.SubmitPdu.html | 4 +-
.../android.telephony.gsm.SmsMessage.html | 4 +-
.../changes/android.test.AndroidTestCase.html | 4 +-
.../android.test.mock.MockContext.html | 4 +-
.../android.test.mock.MockPackageManager.html | 4 +-
.../changes/android.text.style.ImageSpan.html | 4 +-
.../4/changes/android.util.Config.html | 4 +-
.../changes/android.util.DisplayMetrics.html | 4 +-
.../4/changes/android.util.TypedValue.html | 4 +-
.../4/changes/android.view.Surface.html | 4 +-
.../changes/android.view.VelocityTracker.html | 4 +-
.../api_diff/4/changes/android.view.View.html | 4 +-
.../android.view.ViewConfiguration.html | 4 +-
.../changes/android.view.Window.Callback.html | 4 +-
.../android.widget.AutoCompleteTextView.html | 4 +-
.../android.widget.CheckedTextView.html | 4 +-
.../4/changes/android.widget.ListView.html | 4 +-
.../4/changes/android.widget.PopupWindow.html | 4 +-
.../android.widget.TabHost.TabSpec.html | 4 +-
.../4/changes/android.widget.TabWidget.html | 4 +-
.../api_diff/4/changes/changes-summary.html | 4 +-
.../4/changes/classes_index_additions.html | 24 +
.../api_diff/4/changes/classes_index_all.html | 47 +-
.../4/changes/classes_index_changes.html | 7 -
.../4/changes/fields_index_additions.html | 715 --------
.../api_diff/4/changes/fields_index_all.html | 715 --------
.../api_diff/4/changes/java.lang.String.html | 4 +-
.../api_diff/4/changes/java.net.Socket.html | 4 +-
.../api_diff/4/changes/java.util.Date.html | 4 +-
.../sdk/api_diff/4/changes/jdiff_help.html | 2 +-
.../api_diff/4/changes/jdiff_statistics.html | 105 +-
.../api_diff/4/changes/pkg_android.app.html | 4 +-
.../4/changes/pkg_android.content.html | 4 +-
.../4/changes/pkg_android.content.pm.html | 4 +-
.../4/changes/pkg_android.content.res.html | 4 +-
.../pkg_android.graphics.drawable.html | 4 +-
.../4/changes/pkg_android.graphics.html | 4 +-
.../4/changes/pkg_android.hardware.html | 4 +-
.../sdk/api_diff/4/changes/pkg_android.html | 53 +-
.../pkg_android.inputmethodservice.html | 4 +-
.../4/changes/pkg_android.location.html | 4 +-
.../api_diff/4/changes/pkg_android.media.html | 4 +-
.../4/changes/pkg_android.net.wifi.html | 4 +-
.../4/changes/pkg_android.opengl.html | 4 +-
.../api_diff/4/changes/pkg_android.os.html | 4 +-
.../4/changes/pkg_android.provider.html | 4 +-
.../4/changes/pkg_android.telephony.gsm.html | 4 +-
.../4/changes/pkg_android.telephony.html | 4 +-
.../api_diff/4/changes/pkg_android.test.html | 4 +-
.../4/changes/pkg_android.test.mock.html | 4 +-
.../4/changes/pkg_android.text.style.html | 4 +-
.../api_diff/4/changes/pkg_android.util.html | 4 +-
.../4/changes/pkg_android.view.animation.html | 4 +-
.../api_diff/4/changes/pkg_android.view.html | 4 +-
.../4/changes/pkg_android.widget.html | 26 +-
.../sdk/api_diff/4/changes/pkg_java.lang.html | 4 +-
.../sdk/api_diff/4/changes/pkg_java.net.html | 4 +-
.../sdk/api_diff/4/changes/pkg_java.util.html | 4 +-
docs/html/sdk/api_diff/4/missingSinces.txt | 233 +--
...Donut.xml => user_comments_for_3_to_4.xml} | 1442 +----------------
docs/html/sdk/preview/features.jd | 4 +
docs/html/sdk/preview/index.jd | 192 +--
docs/html/sdk/preview/installing.jd | 343 +---
docs/html/sdk/preview/requirements.jd | 44 +-
docs/html/sdk/preview/upgrading.jd | 257 +--
docs/html/sdk/sdk_toc.cs | 2 +
.../unit_tests/activity/LifecycleTest.java | 3 +-
164 files changed, 3569 insertions(+), 9033 deletions(-)
create mode 100644 docs/html/guide/developing/tools/zipalign.jd
create mode 100644 docs/html/guide/samples/images/SearchableDictionary1.png
create mode 100644 docs/html/guide/samples/images/SearchableDictionary2.png
create mode 100644 docs/html/images/emulator-wvga800l.png
create mode 100644 docs/html/sdk/1.6_r1/index.jd
create mode 100644 docs/html/sdk/1.6_r1/installing.jd
create mode 100644 docs/html/sdk/1.6_r1/requirements.jd
create mode 100644 docs/html/sdk/1.6_r1/upgrading.jd
create mode 100644 docs/html/sdk/android-1.6.jd
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.array.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.color.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.dimen.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.id.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.integer.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.layout.html
delete mode 100644 docs/html/sdk/api_diff/4/changes/android.R.string.html
rename docs/html/sdk/api_diff/4/{user_comments_for_3_to_Donut.xml => user_comments_for_3_to_4.xml} (72%)
create mode 100644 docs/html/sdk/preview/features.jd
diff --git a/Android.mk b/Android.mk
index fd03c6d897dcf..16d77e456f86b 100644
--- a/Android.mk
+++ b/Android.mk
@@ -352,6 +352,8 @@ web_docs_sample_code_flags := \
guide/samples/LunarLander "Lunar Lander" \
-samplecode $(sample_dir)/NotePad \
guide/samples/NotePad "Note Pad" \
+ -samplecode $(sample_dir)/SearchableDictionary \
+ guide/samples/SearchableDictionary "Searchable Dictionary" \
-samplecode $(sample_dir)/Snake \
guide/samples/Snake "Snake" \
-samplecode $(sample_dir)/SoftKeyboard \
@@ -359,13 +361,13 @@ web_docs_sample_code_flags := \
## SDK version identifiers used in the published docs
# major[.minor] version for current SDK. (full releases only)
-framework_docs_SDK_VERSION:=1.5
+framework_docs_SDK_VERSION:=1.6
# release version (ie "Release x") (full releases only)
-framework_docs_SDK_REL_ID:=3
+framework_docs_SDK_REL_ID:=1
# name of current SDK directory (full releases only)
framework_docs_SDK_CURRENT_DIR:=$(framework_docs_SDK_VERSION)_r$(framework_docs_SDK_REL_ID)
# flag to build offline docs for a preview release
-framework_docs_SDK_PREVIEW:=true
+framework_docs_SDK_PREVIEW:=0
framework_docs_LOCAL_DROIDDOC_OPTIONS += \
-hdf sdk.version $(framework_docs_SDK_VERSION) \
diff --git a/api/4.xml b/api/4.xml
index 55d910508cca3..fc54859f73692 100644
--- a/api/4.xml
+++ b/api/4.xml
@@ -4123,6 +4123,17 @@
visibility="public"
>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
How Search Is Invoked
* Implementing Search for Your App
* Search Suggestions
+ * Exposing Search Suggestions to
+ * Quick Search Box
* Action Keys
* Searchability Metadata
* Passing Search Context
@@ -246,6 +248,12 @@ import java.util.List;
* Summaries of possible results
*
*
+ * Once an application is configured to provide search suggestions, those same suggestions can
+ * easily be made available to the system-wide Quick Search Box, providing faster access to its
+ * content from one central prominent place. See
+ * Exposing Search Suggestions to Quick Search
+ * Box for more details.
+ *
*
The primary form of suggestions is known as queried suggestions and is based on query
* text that the user has already typed. This would generally be based on partial matches in
* the available data. In certain situations - for example, when no query text has been typed yet -
@@ -480,6 +488,26 @@ import java.util.List;
* {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}, optional otherwise.
*
*
+ *
| {@link #SUGGEST_COLUMN_SHORTCUT_ID} |
+ * This column is used to indicate whether a search suggestion should be stored as a
+ * shortcut, and whether it should be validated. Shortcuts are usually formed when the
+ * user clicks a suggestion from Quick Search Box. If missing, the result will be
+ * stored as a shortcut and never refreshed. If set to
+ * {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut.
+ * Otherwise, the shortcut id will be used to check back for for an up to date
+ * suggestion using {@link #SUGGEST_URI_PATH_SHORTCUT}. Read more about shortcut
+ * refreshing in the section about
+ * exposing search suggestions to
+ * Quick Search Box. |
+ * No. Only applicable to sources included in Quick Search Box. |
+ *
+ *
+ * | {@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} |
+ * This column is used to specify that a spinner should be shown in lieu of an icon2
+ * while the shortcut of this suggestion is being refreshed in Quick Search Box. |
+ * No. Only applicable to sources included in Quick Search Box. |
+ *
+ *
* | Other Columns |
* Finally, if you have defined any Action Keys and you wish
* for them to have suggestion-specific definitions, you'll need to define one
@@ -553,6 +581,68 @@ import java.util.List;
* query text is provided and the SUGGEST_COLUMN_INTENT_DATA values are not suitable for user
* inspection and editing.
*
+ *
+ * Exposing Search Suggestions to Quick Search Box
+ *
+ * Once your application is set up to provide search suggestions, making them available to the
+ * globally accessable Quick Search Box is as easy as setting android:includeInGlobalSearch to
+ * "true" in your searchable metadata file. Beyond that, here are some more details of how
+ * suggestions interact with Quick Search Box, and optional ways that you may customize suggestions
+ * for your application.
+ *
+ * Important Note: By default, your application will not be enabled as a suggestion
+ * provider (or "searchable item") in Quick Search Box. Once your app is installed, the user must
+ * enable it as a "searchable item" in the Search settings in order to receive your app's
+ * suggestions in Quick Search Box. You should consider how to message this to users of your app -
+ * perhaps with a note to the user the first time they launch the app about how to enable search
+ * suggestions. This gives your app a chance to be queried for suggestions as the user types into
+ * Quick Search Box, though exactly how or if your suggestions will be surfaced is decided by Quick
+ * Search Box.
+ *
+ * Source Ranking: Once your application's search results are made available to Quick
+ * Search Box, how they surface to the user for a particular query will be determined as appropriate
+ * by Quick Search Box ranking. This may depend on how many other apps have results for that query,
+ * and how often the user has clicked on your results compared to the other apps - but there is no
+ * guarantee about how ranking will occur, or whether your app's suggestions will show at all for
+ * a given query. In general, you can expect that providing quality results will increase the
+ * likelihood that your app's suggestions are provided in a prominent position, and apps that
+ * provide lower quality suggestions will be more likely to be ranked lower and/or not displayed.
+ *
+ * Search Settings: Each app that is available to Quick Search Box has an entry in the
+ * system settings where the user can enable or disable the inclusion of its results. Below the
+ * name of the application, each application may provide a brief description of what kind of
+ * information will be made available via a search settings description string pointed to by the
+ * android:searchSettingsDescription attribute in the searchable metadata. Note that the
+ * user will need to visit this settings menu to enable search suggestions for your app before your
+ * app will have a chance to provide search suggestions to Quick Search Box - see the section
+ * called "Important Note" above.
+ *
+ * Shortcuts: Suggestions that are clicked on by the user may be automatically made into
+ * shortcuts, which are suggestions that have been copied from your provider in order to be quickly
+ * displayed without the need to re-query the original sources. Shortcutted suggestions may be
+ * displayed for the query that yielded the suggestion and for any prefixes of that query. You can
+ * request how to have your app's suggestions made into shortcuts, and whether they should be
+ * refreshed, using the {@link #SUGGEST_COLUMN_SHORTCUT_ID} column:
+ * - Suggestions that do not include a shortcut id column will be made into shortcuts and
+ * never refreshed. This makes sense for suggestions that refer to data that will never be changed
+ * or removed.
+ * - Suggestions that include a shortcut id will be re-queried for a fresh version of the
+ * suggestion each time the shortcut is displayed. The shortcut will be quickly displayed with
+ * whatever data was most recently available until the refresh query returns, after which the
+ * suggestion will be dynamically refreshed with the up to date information. The shortcut refresh
+ * query will be sent to your suggestion provider with a uri of {@link #SUGGEST_URI_PATH_SHORTCUT}.
+ * The result should contain one suggestion using the same columns as the suggestion query, or be
+ * empty, indicating that the shortcut is no longer valid. Shortcut ids make sense when referring
+ * to data that may change over time, such as a contact's presence status. If a suggestion refers
+ * to data that could take longer to refresh, such as a network based refresh of a stock quote, you
+ * may include {@link #SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING} to show a progress spinner for the
+ * right hand icon until the refresh is complete.
+ * - Finally, to prevent a suggestion from being copied into a shortcut, you may provide a
+ * shortcut id with a value of {@link #SUGGEST_NEVER_MAKE_SHORTCUT}.
+ *
+ * Note that Quick Search Box will ultimately decide whether to shortcut your app's suggestions,
+ * considering these values as a strong request from your application.
+ *
*
* Action Keys
*
@@ -725,7 +815,12 @@ import java.util.List;
* and editing. |
*
*
- *
+ *
+ * Note that the icon of your app will likely be shown alongside any badge you specify,
+ * to differentiate search in your app from Quick Search Box. The display of this icon
+ * is not under the app's control.
+ *
+ *
* No |
*
*
@@ -869,6 +964,47 @@ import java.util.List;
*
*
*
+ * Elements of search metadata that configure search suggestions being available to Quick Search
+ * Box:
+ *
+ *
+ *
+ * | Attribute | Description | Required? |
+ *
+ *
+ * | android:includeInGlobalSearch |
+ * If true, indicates the search suggestions provided by your application should be
+ * included in the globally accessible Quick Search Box. The attributes below are only
+ * applicable if this is set to true. |
+ * Yes |
+ *
+ *
+ * | android:searchSettingsDescription |
+ * If provided, provides a brief description of the search suggestions that are provided
+ * by your application to Quick Search Box, and will be displayed in the search settings
+ * entry for your application. |
+ * No |
+ *
+ *
+ * | android:queryAfterZeroResults |
+ * Indicates whether a source should be invoked for supersets of queries it has
+ * returned zero results for in the past. For example, if a source returned zero
+ * results for "bo", it would be ignored for "bob". If set to false, this source
+ * will only be ignored for a single session; the next time the search dialog is
+ * invoked, all sources will be queried. The default value is false. |
+ * No |
+ *
+ *
+ * | android:searchSuggestThreshold |
+ * Indicates the minimum number of characters needed to trigger a source from Quick
+ * Search Box. Only guarantees that a source will not be queried for anything shorter
+ * than the threshold. The default value is 0. |
+ * No |
+ *
+ *
+ *
+ *
+ *
* Additional metadata for search action keys. For each action key that you would like to
* define, you'll need to add an additional element defining that key, and using the attributes
* discussed in Action Keys. A simple example is shown here:
@@ -1246,16 +1382,12 @@ public class SearchManager
* result indicates the shortcut refers to a no longer valid sugggestion.
*
* @see #SUGGEST_COLUMN_SHORTCUT_ID
- *
- * @hide pending enabling of global search for third parties
*/
public final static String SUGGEST_URI_PATH_SHORTCUT = "search_suggest_shortcut";
/**
* MIME type for shortcut validation. You'll use this in your suggestions content provider
* in the getType() function.
- *
- * @hide pending enabling of global search for third parties
*/
public final static String SHORTCUT_MIME_TYPE =
"vnd.android.cursor.item/vnd.android.search.suggest";
@@ -1268,7 +1400,7 @@ public class SearchManager
* In addition to the columns below, the suggestion columns are used to pass along the full
* suggestion so it can be shortcutted.
*
- * @hide an implementation detail not part of the public api
+ * @hide
*/
public final static String SEARCH_CLICK_REPORT_AUTHORITY =
"com.android.globalsearch.stats";
@@ -1276,21 +1408,21 @@ public class SearchManager
/**
* The path the write goes to.
*
- * @hide an implementation detail not part of the public api
+ * @hide
*/
public final static String SEARCH_CLICK_REPORT_URI_PATH = "click";
/**
* The column storing the query for the click.
*
- * @hide an implementation detail not part of the public api
+ * @hide
*/
public final static String SEARCH_CLICK_REPORT_COLUMN_QUERY = "query";
/**
* The column storing the component name of the application that was pivoted into.
*
- * @hide an implementation detail not part of the public api
+ * @hide
*/
public final static String SEARCH_CLICK_REPORT_COLUMN_COMPONENT = "component";
@@ -1375,7 +1507,7 @@ public class SearchManager
* {@link #COMPONENT_NAME_KEY}. For use by the global search system only - if other providers
* attempt to use this column, the value will be overwritten by global search.
*
- * @hide an implementation detail not part of the public api
+ * @hide
*/
public final static String SUGGEST_COLUMN_INTENT_COMPONENT_NAME = "suggest_intent_component";
/**
@@ -1400,8 +1532,6 @@ public class SearchManager
* {@link #SUGGEST_NEVER_MAKE_SHORTCUT}, the result will not be stored as a shortcut.
* Otherwise, the shortcut id will be used to check back for an up to date suggestion using
* {@link #SUGGEST_URI_PATH_SHORTCUT}.
- *
- * @hide pending reenabling of global search for third parties
*/
public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
@@ -1410,7 +1540,7 @@ public class SearchManager
* cursor item's background color if it needs a non-default background color. A non-zero value
* indicates a valid background color to override the default.
*
- * @hide an implementation detail not part of the public api
+ * @hide For internal use, not part of the public API.
*/
public final static String SUGGEST_COLUMN_BACKGROUND_COLOR = "suggest_background_color";
@@ -1418,8 +1548,6 @@ public class SearchManager
* Column name for suggestions cursor. Optional. This column is used to specify
* that a spinner should be shown in lieu of an icon2 while the shortcut of this suggestion
* is being refreshed.
- *
- * @hide pending reenabling of global search for third parties
*/
public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING =
"suggest_spinner_while_refreshing";
@@ -1427,8 +1555,6 @@ public class SearchManager
/**
* Column value for suggestion column {@link #SUGGEST_COLUMN_SHORTCUT_ID} when a suggestion
* should not be stored as a shortcut in global search.
- *
- * @hide pending reenabling of global search for third parties
*/
public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
@@ -1475,8 +1601,6 @@ public class SearchManager
* Intent action for starting a web search provider's settings activity.
* Web search providers should handle this intent if they have provider-specific
* settings to implement.
- *
- * @hide implementation detail only relevent to web search providers
*/
public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS
= "android.search.action.WEB_SEARCH_SETTINGS";
@@ -1491,7 +1615,8 @@ public class SearchManager
/**
* Intent action broadcasted to inform that the search settings have changed in some way.
- * Either searchables have been enabled or disabled.
+ * Either searchables have been enabled or disabled, or a different web search provider
+ * has been chosen.
*/
public final static String INTENT_ACTION_SEARCH_SETTINGS_CHANGED
= "android.search.action.SETTINGS_CHANGED";
@@ -1500,7 +1625,7 @@ public class SearchManager
* If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
* the search dialog will take no action.
*
- * @hide an implentation detail not part of the public api
+ * @hide
*/
public final static String INTENT_ACTION_NONE = "android.search.action.ZILCH";
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index a2add73dc3b08..c615957367231 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -26,7 +26,6 @@ import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
-import android.content.pm.ApplicationInfo;
import android.os.Bundle;
import android.util.Log;
@@ -231,16 +230,14 @@ public class Searchables {
: webSearchInfoList.get(ii - search_count);
ActivityInfo ai = info.activityInfo;
// Check first to avoid duplicate entries.
- if (newSearchablesMap.containsKey(new ComponentName(ai.packageName, ai.name))) {
- continue;
- }
- SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai);
- if (searchable != null) {
- newSearchablesList.add(searchable);
- newSearchablesMap.put(searchable.getSearchActivity(), searchable);
- if (searchable.shouldIncludeInGlobalSearch()
- && isWhitelistedForGlobalSearch(pm, searchable.getSearchActivity())) {
- newSearchablesInGlobalSearchList.add(searchable);
+ if (newSearchablesMap.get(new ComponentName(ai.packageName, ai.name)) == null) {
+ SearchableInfo searchable = SearchableInfo.getActivityMetaData(mContext, ai);
+ if (searchable != null) {
+ newSearchablesList.add(searchable);
+ newSearchablesMap.put(searchable.getSearchActivity(), searchable);
+ if (searchable.shouldIncludeInGlobalSearch()) {
+ newSearchablesInGlobalSearchList.add(searchable);
+ }
}
}
}
@@ -291,25 +288,6 @@ public class Searchables {
}
}
- /**
- * Determines whether an activity may be included in quick search box. For now this is
- * restricted to system installed apps.
- *
- * TODO: remove when we are ready to enable global search for third party applications.
- *
- * @param pm The package manager.
- * @param searchActivity The component of the search activity.
- * @return True if the search activity may include its search suggestions in quick search box.
- */
- private boolean isWhitelistedForGlobalSearch(PackageManager pm, ComponentName searchActivity) {
- try {
- ActivityInfo ai = pm.getActivityInfo(searchActivity, 0);
- return ((ai.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
- }
-
/**
* Checks if the given activity component is present in the system and if so makes it the
* preferred activity for handling ACTION_WEB_SEARCH.
diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java
index 29dc2ea5246e2..a92800d011ee8 100644
--- a/core/java/android/text/Layout.java
+++ b/core/java/android/text/Layout.java
@@ -1527,7 +1527,7 @@ public abstract class Layout {
if (bm != null) {
workPaint.set(paint);
Styled.measureText(paint, workPaint, text,
- offset, offset + 1, null);
+ j, j + 2, null);
float wid = (float) bm.getWidth() *
-workPaint.ascent() / bm.getHeight();
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index d5f8dcb76bcb5..fd78f83698aa4 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2866,16 +2866,16 @@
when the user clicks a suggestion. Optional attribute. -->
-
-
+ The default value is false. Optional attribute.. -->
-
-
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index d7224131f6a16..c92cf51852796 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -1094,9 +1094,7 @@
-
-
@@ -1117,7 +1115,6 @@
-
@@ -1126,7 +1123,6 @@
-
diff --git a/docs/html/community/index.jd b/docs/html/community/index.jd
index eb5887a23e58f..3e69de4e57c02 100644
--- a/docs/html/community/index.jd
+++ b/docs/html/community/index.jd
@@ -3,8 +3,8 @@ page.title=Community
@jd:body
-
Community
-
Welcome to the Android developers community! We're glad you're here and invite you to participate in these discussions. Before posting, please read the Groups Charter that covers the community guidelines.
+
Community
+
Welcome to the Android developers community! We're glad you're here and invite you to participate in these discussions. Before posting, please read the Groups Charter that covers the community guidelines.
Note: If you are seeking discussion about Android source code (not application development),
then please refer to the Open Source Project Mailing lists.
@@ -53,48 +53,42 @@ phrasing your questions, read
android-beginners
-
Subscribe via email: android-beginners-subscribe@googlegroups.com
-
+
Subscribe via email: android-beginners-subscribe@googlegroups.com
Android developers - You're now an experienced Android application developer. You've grasped the basics of Android app development, you're comfortable using the SDK, now you want to move to advanced topics. Get help here with troubleshooting applications, advice on implementation, and strategies for improving your application's performance and user experience. This is the not the right place to discuss user issues (use android-discuss for that) or beginner questions with the Android SDK (use android-beginners for that).
Android discuss - The "water cooler" of Android discussion. You can discuss just about anything Android-related here, ideas for the Android platform, announcements about your applications, discussions about Android devices, community resources... As long as your discussion is related to Android, it's on-topic here. However, if you have a discussion here that could belong on another list, you are probably not reaching all of your target audience here and may want to consider shifting to a more targeted list.
Android ndk - A place for discussing the Android NDK and topics related to using native code in Android applications.
Android security discuss - A place for open discussion on secure development, emerging security concerns, and best practices for and by android developers. Please don't disclose vulnerabilities directly on this list, you'd be putting all Android users at risk.
Android security announce - A low-volume group for security-related announcements by the Android Security Team.
diff --git a/docs/html/guide/appendix/api-levels.jd b/docs/html/guide/appendix/api-levels.jd
index 8fc899bb4cc26..a4dcc5e0c76c7 100644
--- a/docs/html/guide/appendix/api-levels.jd
+++ b/docs/html/guide/appendix/api-levels.jd
@@ -1,81 +1,323 @@
page.title=Android API Levels
@jd:body
+
+
-
The Android API Level is an integer that indicates a set of APIs available in an Android SDK
-and on a version of the Android platform. Each version of the Android platform supports a specific set
-of APIs, which are always backward-compatible. For example, Android 1.5 supports all APIs available in
-Android 1.0, but the reverse is not true. If an application uses APIs
-available in Android 1.5 that are not available in 1.0, then the application should never be installed
-on an Android 1.0 device, because it will fail due to missing APIs. The API Level ensures this does not happen
-by comparing the minimum API Level required by the applicaiton to the API Level available on the device.
+
In this document
+
+ - What is API Level?
+ - Uses of API Level
+ - Development Considerations
+
+ - Application forward compatibility
+ - Application backward compatibility
+ - Selecting a platform version for compiling
+ - Declaring a minimum API Level
+ - Testing against higher API Levels
+
+
+ - Filtering the documentation
+
-
When a new version of Android adds APIs, a new API Level is added to the platform. The new APIs
-are available only to applications that declare a minimum API Level that is equal-to or greater-than
-the API Level in which the APIs were introduced. The API Level required by an application is declared with the
-<uses-sdk> element inside the Android manifest, like this:
+
See also
+
+ - <uses-sdk> manifest element
+
-
<uses-sdk android:minSdkVersion="3" />
+
+
-
The value for minSdkVersion is the minimum API Level required by the application.
-If this is not declared, then it is assumed that the application is compatible with all versions and defaults to
-API Level 1. In which case, if the application actually uses APIs introduced with an API Level greater than 1, then
-the application will fail in unpredictable ways when installed on a device that only supports API Level 1
-(such as an Android 1.0 device).
-See the <uses-sdk>
-documentation for more about declaring the API Level in your manifest.
+
As you develop your application on Android, it's useful to understand the
+platform's general approach to API change management. It's also important to
+understand the API Level identifier and the role it plays in ensuring your
+application's compatibility with devices on which it may be installed.
-
For example, the {@link android.appwidget} package was introduced with API Level 3. If your application
-has set minSdkVersion to 1 or 2, then your application cannot use this package,
-even if the device running your application uses a version of Android that supports it.
-In order to use the {@link android.appwidget} package, your application must set minSdkVersion
-to 3 or higher. When the minSdkVersion is set to 3, the application will no longer be able to install
-on a device running a platform version with an API Level less than 3.
+
The sections below provide information about API Level and how it affects
+your applications.
-
Despite the name of the manifest attribute (minSdkVersion), the API Level is not directly
-associated with a specific SDK. For example, the SDK for Android 1.0 uses
-API Level 1 and the SDK for Android 1.1 uses API Level 2. So it may seem that the API Level increases consistently.
-However, it's possible that a subsequent platform
-releases will not introduce new APIs, and thus, the API Level will remain the same. In addition, there are often
-multiple SDK releases for a single platform version (there were three SDK releases for Android 1.5), and
-there's no guarantee that the API Level will remain the same between these. It's possible (but unlikely) that
-a second or third SDK for a given version of the platform will provide new APIs and add a new API Level.
-When you install a new SDK, be sure to read the SDK Contents on the install page, which specifies the API
-Level for each platform available in the SDK. Also see the comparison of
-Platform Versions vs. API Levels, below.
+
For information about how to use the "Filter by API Level" control
+available in the API reference documentation, see
+Filtering the documentation at the
+end of this document.
-
Note: During an "Early Look" SDK release, the APIs may not be final, so the
-API Level number cannot be specified. In this case, a string value matching the
-platform codename must be used as the value for minSdkVersion. This codename value
-will only be valid while using the Early Look SDK with the emulator. An application using this API Level
-can never be installed on an Android device. When the final SDK is released, you must update your manifest to use
-the official API Level integer.
+
What is API Level?
-
Platform Versions vs. API Levels
+
API Level is an integer value that uniquely identifies the framework API
+revision offered by a version of the Android platform.
-
The following table specifies the maximum API Level supported by each version of the Android platform.
-(Every platform is backward-compatible to API Level 1.)
+
The Android platform provides a framework API that applications can use to
+interact with the underlying Android system. The framework API consists of:
+
+
+- A core set of packages and classes
+- A set of XML elements and attributes for declaring a manifest file
+- A set of XML elements and attributes for declaring and accessing resources
+- A set of Intents
+- A set of permissions that applications can request, as well as permission
+enforcements included in the system
+
+
+
Each successive version of the Android platform can include updates to the
+Android application framework API that it delivers.
+
+
Updates to the framework API are designed so that the new API remains
+compatible with earlier versions of the API. That is, most changes in the API
+are additive and introduce new or replacement functionality. As parts of the API
+are upgraded, the older replaced parts are deprecated but are not removed, so
+that existing applications can still use them. In a very small number of cases,
+parts of the API may be modified or removed, although typically such changes are
+only needed to ensure API robustness and application or system security. All
+other API parts from earlier revisions are carried forward without
+modification.
+
+
The framework API that an Android platform delivers is specified using an
+integer identifier called "API Level". Each Android platform version supports
+exactly one API Level, although support is implicit for all earlier API Levels
+(down to API Level 1). The initial release of the Android platform provided
+API Level 1 and subsequent releases have incremented the API Level.
+
+
The following table specifies the API Level supported by each version of the
+Android platform.
| Platform Version | API Level |
- | Android 1.0 | 1 |
- | Android 1.1 | 2 |
+ | Android 1.6 | 4 |
| Android 1.5 | 3 |
- | Android Donut | Donut |
+ | Android 1.1 | 2 |
+ | Android 1.0 | 1 |
-
Viewing the API Reference Based on API Level
+
Uses of API Level in Android
-
The Android API reference includes information that specififies the minimum API Level required for each
-package, class, and member. You can see this information on the right side of each header or label.
+
The API Level identifier serves a key role in ensuring the best possible
+experience for users and application developers:
-
By default, the reference documentation shows all APIs available with the latest SDK release.
-This means that the reference assumes you're using the latest API Level and will show you everything available
-with it. If you're developing applications for a version of Android that does not support the latest API Level,
-then you can filter the reference to reveal only the packages, classes, and members available for that API Level.
-When viewing the reference, use the "Filter by API Level" selection box (below the search box) to pick the API Level
-you'd like to view.
+
+- It lets the Android platform describe the maximum framework API revision
+that it supports
+- It lets applications describe the framework API revision that they
+require
+- It lets the system negotiate the installation of applications on the user's
+device, such that version-incompatible applications are not installed on a
+user's device
+
+
+
Each Android platform version stores its API Level identifier internally, in
+the Android system itself.
+
+
Applications can use a manifest element provided by the framework API —
+<uses-sdk> — to describe the minimum and maximum API
+Levels under which they are able to run, as well as the preferred API Level that
+they are designed to support. The element offers two key attributes:
+
+
+android:minSdkVersion — Specifies the minimum API Level
+on which the application is able to run. The default value is "1".
+android:maxSdkVersion — Specifies the maximum API Level
+on which the application is able to run.
+
+
+
For example, to specify the minimum system API Level that an application
+requires in order to run, the application would include in its manifest a
+<uses-sdk> element with a android:minSdkVersion
+attribute. The value of android:minSdkVersion would be the integer
+corresponding to the API Level of the earliest version of the Android platform
+under which the application can run.
+
+
When the user attempts to install an application, the Android system first
+checks the <uses-sdk> attributes in the application's
+manifest and compares them against its own internal API Level. The system
+allows the installation to begin only if these conditions are met:
+
+
+- If a
android:minSdkVersion attribute is declared, its value
+must be less than or equal to the system's API Level integer. If not declared,
+the system assumes that the application requires API Level 1.
+- If a
android:maxSdkVersion attribute is declared, its value
+must be equal to or greater than the system's API Level integer.
+in the system itself. If not declared, the system assumes that the application
+has no maximum API Level.
+
+
+
When declared in an application's manifest, a <uses-sdk>
+element might look like this:
+
+
<manifest>
+ ...
+ <uses-sdk android:minSdkVersion="4" />
+ ...
+</manifest>
+
+
The principal reason that an application would declare an API Level in
+android:minSdkVersion is to tell the Android system that it is
+using APIs that were introduced in the API Level specified. If the
+application were to be somehow installed on a platform with a lower API Level,
+then it would crash at run-time when it tries to access APIs that don't exist.
+The system prevents such an outcome by not allowing the application to be
+installed if the lowest API Level it requires is higher than that of the
+platform version on the target device.
+
+
For example, the {@link android.appwidget} package was introduced with API
+Level 3. If an application uses that API, it must declare a
+android:minSdkVersion attribute with a value of "3". The
+application will then be installable on platforms such as Android 1.5 (API Level
+3) and Android 1.6 (API Level 4), but not on the Android 1.1 (API Level 2) and
+Android 1.0 platforms (API Level 1).
+
+
For more information about how to specify an application's API Level
+requirements, see the <uses-sdk>
+ section of the manifest file documentation.
+
Development Considerations
+
The sections below provide information related to API level that you should
+consider when developing your application.
+
+
Application forward compatibility
+
+
Android applications are generally forward-compatible with new versions of
+the Android platform.
+
+
Because almost all changes to the framework API are additive, an Android
+application developed using any given version of the API (as specified by its
+API Level) is forward-compatible with later versions of the Android platform and
+higher API levels. The application should be able to run on all later versions
+of the Android platform, except in isolated cases where the application uses a
+part of the API that is later removed for some reason.
+
+
Forward compatibility is important because many Android-powered devices
+receive over-the-air (OTA) system updates. The user may install your
+application and use it successfully, then later receive an OTA update to a new
+version of the Android platform. Once the update is installed, your application
+will run in a new run-time version of the environment, but one that has the API
+and system capabilities that it depends on.
+
+
In some cases, changes below the API, such those in the underlying
+system itself, may affect your application when it is run in the new
+environment. For that reason it's important for you, as the application
+developer, to understand how the application will look and behave in each system
+environment. To help you test your application on various versions of the Android
+platform, the Android SDK includes multiple platforms that you can download.
+Each platform includes a compatible system image that you can run in an AVD, to
+test your application.
+
+
Application backward compatibility
+
+
Android applications are not necessarily backward compatible with versions of
+the Android platform older than the version against which they were compiled.
+
+
+
Each new version of the Android platform can include new framework APIs, such
+as those that give applications access to new platform capabilities or replace
+existing API parts. The new APIs are accessible to applications when running on
+the new platform and, as mentioned above, also when running on later versions of
+the platform, as specified by API Level. Conversely, because earlier versions of
+the platform do not include the new APIs, applications that use the new APIs are
+unable to run on those platforms.
+
+
Although it's unlikely that an Android-powered device would be downgraded to
+a previous version of the platform, it's important to realize that there are
+likely to be many devices in the field that run earlier versions of the
+platform. Even among devices that receive OTA updates, some might lag and not
+receive an update for a significant amount of time.
+
+
+
+
When you are developing your application, you will need to choose
+the platform version against which you will compile the application. In
+general, you should compile your application against the lowest possible
+version of the platform that your application can support.
+
+
You can determine the lowest possible platform version by compiling the
+application against successively lower build targets. After you determine the
+lowest version, you should create an AVD using the corresponding platform
+version (and API Level) and fully test your application. Make sure to declare a
+android:minSdkVersion attribute in the application's manifest and
+set its value to the API Level of the platform version.
+
+
Declaring a minimum API Level
+
+
If you build an application that uses APIs or system features introduced in
+the latest platform version, you should set the
+android:minSdkVersion attribute to the API Level of the latest
+platform version. This ensures that users will only be able to install your
+application if their devices are running a compatible version of the Android
+platform. In turn, this ensures that your application can function properly on
+their devices.
+
+
If your application uses APIs introduced in the latest platform version but
+does not declare a android:minSdkVersion attribute, then
+it will run properly on devices running the latest version of the platform, but
+not on devices running earlier versions of the platform. In the latter
+case, the application will crash at runtime when it tries to use APIs that don't
+exist on the earlier versions.
+
+
Testing against higher API Levels
+
+
After compiling your application, you should make sure to test it on the
+platform specified in the application's android:minSdkVersion
+attribute. To do so, create an AVD that uses the platform version required by
+your application. Additionally, to ensure forward-compatibility, you should run
+and test the application on all platforms that use a higher API Level than that
+used by your application.
+
+
The Android SDK includes multiple platform versions that you can use,
+including the latest version, and provides an updater tool that you can use to
+download other platform versions as necessary.
+
+
To access the updater, use the android command-line tool,
+located in the <sdk>/tools directory. You can launch the Updater by using
+the android command without specifying any options. You can
+also simply double-click the android.bat (Windows) or android (OS X/Linux) file.
+In ADT, you can also access the updater by selecting
+Window > Android SDK and AVD
+Manager.
+
+
To run your application against different platform versions in the emulator,
+create an AVD for each platform version that you want to test. For more
+information about AVDs, see Android Virtual Devices. If
+you are using a physical device for testing, ensure that you know the API Level
+of the Android platform it runs. See the table at the top of this document for
+a list of platform versions and their API Levels.
+
+
+
+
Filtering the Reference Documentation by API Level
+
+
Reference documentation pages on the Android Developers site offer a "Filter
+by API Level" control in the top-right area of each page.
+
+
The "Filter by API Level" lets you show documentation only for parts of the
+API that are actually accessible to your application, based on the API Level
+that it specifies in the minSdkVersion attribute in its manifest
+file
+
+
When you filter the reference documentation by an API level, only the APIs
+available at that API level are shown. APIs introduced in a later API level are
+grayed out and their content is masked, since they would not be accessible to
+your application.
+
+
Note that filtering by API Level in the documentation does not provide a view
+of what is new or introduced in each API Level. Filtering simply provides a way
+to view the entire API associated with a given API Level, while excluding API
+elements introduced in later API Levels.
+
+
By default, API Level filtering is enabled and set to show the latest API
+Level. If you do not want to use filtering reference documentation, select the
+highest available API Level.
+
+
Note that the reference documentation for API elements also specifies the API
+Level at which the element was introduced. The API Level for packages and
+classes is specified as "Since <api level>" at the top-right corner of the
+content area on each documentation page. The API Level for each class member is
+specified in the member's detailed description section header, at the right
+margin.
diff --git a/docs/html/guide/developing/eclipse-adt.jd b/docs/html/guide/developing/eclipse-adt.jd
index a5cf7358500cf..c3ec2e552cc53 100644
--- a/docs/html/guide/developing/eclipse-adt.jd
+++ b/docs/html/guide/developing/eclipse-adt.jd
@@ -149,15 +149,15 @@ on running your applicaiton.
Creating an AVD
-
With ADT 0.9.2 and above, the Android AVD Manager provides a simple graphical interface
+
With ADT 0.9.3 and above, the Android SDK and AVD Manager provides a simple graphical interface
for creating and managing AVDs. (If you're using ADT version 0.9.1 or older, you must
use the android tool to create your AVDs—read the AVD guide to
Creating an AVD.)
-
To create an AVD with the Android AVD Manager:
+
To create an AVD with the AVD Manager:
- - Select Window > Android AVD Manager, or click the Android AVD Manager icon (a black device)
+
- Select Window > Android SDK and AVD Manager, or click the Android SDK and AVD Manager icon (a black device)
in the Eclipse toolbar.
- In the Virtual Devices panel, you'll see a list of existing AVDs. Click New
@@ -169,7 +169,7 @@ use the
android tool to create your AVDs—read the AVD guide t
- Click Create AVD.
-
Your AVD is now ready and you can close the Android AVD Manager.
+
Your AVD is now ready and you can close the AVD Manager.
In the next section, you'll see how the AVD is used
when launching your application on an emulator.
@@ -217,7 +217,7 @@ to start, the emulator options to use, and so on. When you first run a project
as an
Android Application, ADT will automatically create a run configuration.
The default run configuration will
launch the default project Activity and use automatic target mode for device selection
-(with no preferred AVD). If the default setting don't suit your project, you can
+(with no preferred AVD). If the default settings don't suit your project, you can
customize the launch configuration or even create a new.
To create or modify a launch configuration, follow these steps as appropriate
@@ -256,6 +256,12 @@ for your Eclipse version:
when selecting an AVD to run your application.
See the following section on
Automatic and manual target
modes).
+
You can specify any emulator options to the Additional Emulator Command
+ Line Options field. For example, you could add -scale 96dpi to
+ scale the AVD's screen to an accurate size, based on the dpi of your
+ computer monitor. For a full list of emulator options, see the Android Emulator
+document.
diff --git a/docs/html/guide/developing/other-ide.jd b/docs/html/guide/developing/other-ide.jd
index 8cdf0b91d7b80..2080873eaf584 100644
--- a/docs/html/guide/developing/other-ide.jd
+++ b/docs/html/guide/developing/other-ide.jd
@@ -85,7 +85,8 @@ command to generate all the necessary files and folders.
navigate to the
tools/ directory of your SDK and run:
android create project \
---target <targetID> \
+--target <target_ID> \
+--name <your_project_name> \
--path /path/to/your/project \
--activity <your_activity_name> \
--package <your_package_namespace>
@@ -96,11 +97,14 @@ android create project \
to an Android platform library (including any add-ons, such as Google APIs) that you would like to
build your project against. To see a list of available targets and their corresponding IDs,
execute: android list targets.
+
name is the name for your project. This is optional. If provided, this name will be used
+ for your .apk filename when you build your application.
path is the location of your project directory. If the directory does not exist,
it will be created for you.
-
activity is the name for your {@link android.app.Activity} class. This class file
+ activity is the name for your default {@link android.app.Activity} class. This class file
will be created for you inside
- <path_to_your_project>/src/<your_package_namespace_path>/.
+
<path_to_your_project>/src/<your_package_namespace_path>/.
+ This will also be used for your .apk filename unless you provide a the
name.
package is the package namespace for your project, following the same rules as for
packages in the Java programming language.
@@ -109,9 +113,10 @@ android create project \
android create project \
--target 1 \
---path ./myProject \
---activity MyActivity \
---package com.example.myproject
+--name MyAndroidApp \
+--path ./MyAndroidAppProject \
+--activity MyAndroidAppActivity \
+--package com.example.myandroid
The tool generates the following files and directories:
@@ -123,7 +128,8 @@ android create project \
default.properties - Properties for the build system. Do not modify
this file.
build.properties - Customizable properties for the build system. You can edit this
- file to overried default build settings used by Ant.
+ file to override default build settings used by Ant and provide a pointer to your keystore and key alias
+ so that the build tools can sign your application when built in release mode.
src/your/package/namespace/ActivityName.java - The Activity class
you specified during project creation.
bin/ - Output directory for the build script.
@@ -141,7 +147,7 @@ that you must use the
Androi
to the emulator (discussed later). So you need access between your project solution and
the tools/ folder.
-Note: You should refrain from moving the
+
Caution: You should refrain from moving the
location of the SDK directory, because this will break the build scripts. (They
will need to be manually updated to reflect the new SDK location before they will
work again.)
@@ -153,14 +159,15 @@ work again.)
a new project from existing code, use the
android update project command to update the project to the new development
environment. You can also use this command to revise the build target of an existing project
-(with the --target option). The android tool will generate any files and
+(with the --target option) and the project name (with the --name
+option). The android tool will generate any files and
folders (listed in the previous section) that are either missing or need to be updated,
as needed for the Android project.
To update an existing Android project, open a command-line
and navigate to the tools/ directory of your SDK. Now run:
-android update project --target <targetID> --path path/to/your/project/
+android update project --name <project_name> --target <target_ID> --path path/to/your/project/
@@ -169,11 +176,13 @@ android update project --target <targetID> --path path/to/you
like to build your project against. To see a list of available targets and their corresponding IDs,
execute: android list targets.
path is the location of your project directory.
+ name is the name for the project. This is optional—if you're not
+ changing the project name, you don't need this.
Here's an example:
-android update project --target 2 --path ./myProject
+android update project --name MyApp --target 2 --path ./MyAppProject
@@ -237,8 +246,9 @@ install JDK in a non-space directory, for example: c:\java\jdk1.6.0_02Building in debug mode
For immediate application testing and debugging, you can build your application
-in debug mode and immediately install it on an emulator. In debug mode, the build tools automatically
-sign your application with a debug key. However, you can (and should) also test your
+in debug mode and immediately install it on an emulator. In debug mode, the build tools
+automatically sign your application with a debug key and optimize the package with
+{@code zipalign}. However, you can (and should) also test your
application in release mode. Debug mode simply allows you to run your application without
manually signing the application.
@@ -248,9 +258,9 @@ manually signing the application.
Open a command-line and navigate to the root of your project directory.
Use Ant to compile your project in debug mode:
ant debug
- This creates your Android application .apk file inside the project bin/
- directory, named <your_DefaultActivity_name>-debug.apk. The file
- is already signed with the debug key.
+ This creates your debug .apk file inside the project bin/
+ directory, named <your_project_name>-debug.apk. The file
+ is already signed with the debug key and has been aligned with {@code zipalign}.
@@ -267,23 +277,86 @@ about Running Your Application.
your application in release mode. Once you have built in release mode, it's a good idea to perform
additional testing and debugging with the final .apk.
-To build in release mode:
+Before you start building your application in release mode, be aware that you must sign
+the resulting application package with your private key, and should then align it using the
+{@code zipalign} tool. There are two approaches to building in release mode:
+build an unsigned package in release mode and then manually sign and align
+the package, or allow the build script
+to sign and align the package for you.
+
+Build unsigned
+
+If you build your application unsigned, then you will need to
+manually sign and align the package.
+
+To build an unsigned .apk in release mode:
- Open a command-line and navigate to the root of your project directory.
- Use Ant to compile your project in release mode:
ant release
- This creates your Android application .apk file inside the project bin/
- directory, named <your_DefaultActivity_name>.apk.
- Note: The .apk file is unsigned at this point.
- You can't install it on an emulator or device until you sign it with your private key.
-Because release mode builds your application unsigned, your next step is to sign
-it with your private key, in order to distribute it to end-users. To complete this procedure,
+
This creates your Android application .apk file inside the project bin/
+directory, named <your_project_name>-unsigned.apk.
+
+Note: The .apk file is unsigned at this point
+and can't be installed until signed with your private key.
+
+Once you have created the unsigned .apk, your next step is to sign the .apk
+with your private key and then align it with {@code zipalign}. To complete this procedure,
read Signing Your Applications.
+When your .apk has been signed and aligned, it's ready to be distributed to end-users.
+
+Build signed and aligned
+
+If you would like, you can configure the Android build script to automatically
+sign and align your application package. To do so, you must provide the path to your keystore
+and the name of your key alias in your project's {@code build.properties} file. With this
+information provided, the build script will prompt you for your keystore and alias password
+when you build in release mode and produce your final application package, which will be ready
+for distribution.
+
+Caution: Due to the way Ant handles input, the password that
+you enter during the build process will be visible. If you are
+concerned about your keystore and alias password being visible on screen, then you
+may prefer to perform the application signing manually, via Jarsigner (or a similar tool). To instead
+perform the signing procedure manually, buid unsigned and then continue
+with Signing Your Applications.
+
+To specify your keystore and alias, open the project {@code build.properties} file (found in the
+root of the project directory) and add entries for {@code key.store} and {@code key.alias}.
+For example:
+
+
+key.store=/path/to/my.keystore
+key.alias=mykeystore
+
+
+Save your changes. Now you can build a signed .apk in release mode:
+
+
+ - Open a command-line and navigate to the root of your project directory.
+ - Use Ant to compile your project in release mode:
+
ant release
+
+ - When prompted, enter you keystore and alias passwords.
+
Caution: As described above,
+ your password will be visible on the screen.
+
+
+
+This creates your Android application .apk file inside the project bin/
+directory, named <your_project_name>-release.apk.
+This .apk file has been signed with the private key specified in
+{@code build.properties} and aligned with {@code zipalign}. It's ready for
+installation and distribution.
+
+
+Once built and signed in release mode
+
Once you have signed your application with a private key, you can install it on an
emulator or device as discussed in the following section about
Running Your Application.
@@ -329,7 +402,7 @@ id:2
you'll use this in the next step.
Create a new AVD using your selected deployment target:
- android create avd --name <your_avd_name> --target <targetID>
+ android create avd --name <your_avd_name> --target <target_ID>
Next, you'll be asked whether you'd like to create a custom hardware profile.
If you respond "yes," you'll be presented with a series of prompts to define various aspects of the
device hardware (leave entries blank to use default values, which are shown in brackets). Otherwise,
diff --git a/docs/html/guide/developing/tools/avd.jd b/docs/html/guide/developing/tools/avd.jd
index b8f205ec0f7e6..06b1245c426db 100644
--- a/docs/html/guide/developing/tools/avd.jd
+++ b/docs/html/guide/developing/tools/avd.jd
@@ -11,6 +11,8 @@ page.title=Android Virtual Devices
hardware options, system image, and data storage.
You create AVD configurations to model different device environments
in the Android emulator.
+ The android tool offers a graphical Android AVD
+ Manager and a command-line interface for creating AVDs.
In this document
@@ -72,9 +74,18 @@ reference of emulator options, please see the Emulator
documentation.
-To create and manage AVDs, you use the android tool provided in the Android
-SDK. For more information about how to work with AVDs from inside
-your development environment, see To create and manage AVDs, you use the android tool provided in
+the tools/ directory of the Android SDK. The tool provides both a
+graphical AVD manager and a command-line interface that you can use to
+create AVDs. To access the graphical AVD manager, run the
+android tool without options. The sections below describe how to
+use the android command-line interface to create and manage AVDs.
+Note that some functionality, such as the capability to create an AVD with a
+custom hardware configuration, are only available through the command-line
+interface.
+
+For more information about how to work with AVDs from inside your development
+environment, see Developing in Eclipse with
ADT or Developing in
Other IDEs, as appropriate for your environment.
@@ -89,11 +100,11 @@ you need to create an AVD before you can run any application in the emulator
-To create an AVD, you use the android tool, a command-line utility
-available in the <sdk>/tools/ directory. Managing AVDs is one
-of the two main function of the android tool (the other is creating and updating
-Android projects). Open a terminal window and change to the
-<sdk>/tools/ directory, if needed
+To create an AVD, you use the android tool, a command-line
+utility available in the <sdk>/tools/ directory. Managing
+AVDs is one of the two main function of the android tool (the other
+is creating and updating Android projects). Open a terminal window and change to
+the <sdk>/tools/ directory, if needed
To create each AVD, you issue the command android create avd,
with options that specify a name for the new AVD and the system image you want
@@ -118,11 +129,12 @@ version or that of any SDK add-on. Later, when applications use the AVD, they'll
be running on the system that you specify in the -t argument.
To specify the system image to use, you refer to its target ID
-— an integer — as assigned by the android tool. The target ID is not
-derived from the system image name, version, or API Level, or other attribute,
-so you need to have the android tool list the available system images and the
-target ID of each, as described in the next section. You should do this
-before you run the android create avd command.
+— an integer — as assigned by the android tool. The
+target ID is not derived from the system image name, version, or API Level, or
+other attribute, so you need to have the android tool list the
+available system images and the target ID of each, as described in the next
+section. You should do this before you run the android create
+avd command.
Listing targets
@@ -131,7 +143,7 @@ target ID of each, as described in the next section. You should do this
android list targets
-The android tool scans the <sdk>/platforms and
+
The android tool scans the <sdk>/platforms and
<sdk>/add-ons directories looking for valid system images and
then generates the list of targets. Here's an example of the command output:
@@ -199,24 +211,22 @@ system image in the list above):
android create avd -n my_android1.5 -t 2
If the target you selected was a standard Android system image ("Type:
-platform"), the android tool next asks you whether you want to create a custom
-hardware profile.
-
+platform"), the android tool next asks you whether you want to
+create a custom hardware profile.
Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
If you want to set custom hardware emulation options for the AVD, enter
"yes" and set values as needed. If you want to use the default hardware
emulation options for the AVD, just press the return key (the default is "no").
-The android tool creates the AVD with name and system image mapping you
+The android tool creates the AVD with name and system image mapping you
requested, with the options you specified.
-
If you are creating an AVD whose target is an SDK add-on,
-the android tool does not allow you to set hardware emulation options. It
-assumes that the provider of the add-on has set emulation options appropriately
-for the device that the add-on is modeling, and so prevents you from resetting
-the options.
-
+If you are creating an AVD whose target is an SDK add-on, the
+android tool does not allow you to set hardware emulation options.
+It assumes that the provider of the add-on has set emulation options
+appropriately for the device that the add-on is modeling, and so prevents you
+from resetting the options.
For a list of options you can use in the android create avd
command, see the table in Command-line options for AVDs,
at the bottom of
@@ -225,11 +235,11 @@ this page.
Setting hardware emulation options
When are creating a new AVD that uses a standard Android system image ("Type:
-platform"), the android tool lets you set hardware emulation options for virtual
-device. The table below lists the options available and the default values, as
-well as the names of properties that store the emulated hardware options in the AVD's
-configuration file (the config.ini file in the AVD's local directory).
-
+platform"), the android tool lets you set hardware emulation
+options for virtual device. The table below lists the options available and the
+default values, as well as the names of properties that store the emulated
+hardware options in the AVD's configuration file (the config.ini file in the
+AVD's local directory).
@@ -249,7 +259,6 @@ configuration file (the config.ini file in the AVD's local directory).
| Whether there is a touch screen or not on the device. Default value is "yes". |
hw.touchScreen
-
|
| Trackball support |
Whether there is a trackball on the device. Default value is "yes". |
@@ -339,23 +348,30 @@ configuration file (the config.ini file in the AVD's local directory).
Default value is "66MB". |
disk.cachePartition.size |
+
+
+| Abstracted LCD density |
+Sets the generalized density characteristic used by the AVD's screen. Default value is "160". |
+hw.lcd.density |
+
+
Default location of the AVD files
-When you create an AVD, the android tool creates a dedicated directory for it
+
When you create an AVD, the android tool creates a dedicated directory for it
on your development computer. The directory contains the AVD configuration file,
the user data image and SD card image (if available), and any other files
associated with the device. Note that the directory does not contain a system
image — instead, the AVD configuration file contains a mapping to the
system image, which it loads when the AVD is launched.
-The android tool also creates a <AVD name>.ini file for the AVD at the
+
The android tool also creates a <AVD name>.ini file for the AVD at the
root of the .android/avd directory on your computer. The file specifies the
location of the AVD directory and always remains at the root the .android
directory.
-By default, the android tool creates the AVD directory inside
+
By default, the android tool creates the AVD directory inside
~/.android/avd/ (on Linux/Mac), C:\Documents and
Settings\<user>\.android\ on Windows XP, and
C:\Users\<user>\.android\ on Windows Vista.
@@ -396,18 +412,18 @@ Error: Invalid value in image.sysdir. Run 'android update avd -n foo'
Deleting an AVD
-You can use the android tool to delete an AVD. Here is the command usage:
+You can use the android tool to delete an AVD. Here is the command usage:
android delete avd -n <name>
-When you issue the command, the android tool looks for an AVD matching the
+
When you issue the command, the android tool looks for an AVD matching the
specified name deletes the AVD's directory and files.
Command-line options for AVDs
The table below lists the command-line options you can use with the
-android tool.
+android tool.
@@ -448,9 +464,9 @@ android tool.
-f |
Force creation of the AVD |
By default, if the name of the AVD being created matches that of an
- existing AVD, the android tool will not create the new AVD or overwrite
+ existing AVD, the android tool will not create the new AVD or overwrite
the existing AVD. If you specify the -f option, however, the
- android tool will automatically overwrite any existing AVD that has the
+ android tool will automatically overwrite any existing AVD that has the
same name as the new AVD. The files and data of the existing AVD are
deleted. |
@@ -465,7 +481,7 @@ files.
-s <name> or
-s <width>-<height> |
The skin to use for this AVD, identified by name or dimensions. |
- The android tool scans for a matching skin by name or dimension in the
+ | The android tool scans for a matching skin by name or dimension in the
skins/ directory of the target referenced in the -t
<targetID> argument. Example: -s HVGA-L |
diff --git a/docs/html/guide/developing/tools/emulator.jd b/docs/html/guide/developing/tools/emulator.jd
index 82d3c8dd6d0af..a9b6914cf476d 100644
--- a/docs/html/guide/developing/tools/emulator.jd
+++ b/docs/html/guide/developing/tools/emulator.jd
@@ -1,7 +1,7 @@
page.title=Android Emulator
@jd:body
-
+
The Android SDK includes a mobile device emulator -- a virtual mobile device
that runs on your computer. The emulator lets you prototype, develop, and test
@@ -27,9 +27,13 @@ from which you can log kernel output, simulate application interrupts (such as
arriving SMS messages or phone calls), and simulate latency effects and dropouts
on the data channel.
-
-
In this document:
-
+
@@ -260,11 +264,11 @@ the keys of your keyboard.
| Switch to previous layout orientation (for example, portrait, landscape) |
- KEYPAD_7, F11 |
+ KEYPAD_7, Ctrl-F11 |
| Switch to next layout orientation (for example, portrait, landscape) |
- KEYPAD_9, F12 |
+ KEYPAD_9, Ctrl-F12 |
| Toggle cell networking on/off |
@@ -721,19 +725,19 @@ scale in direct relationship with <delay> values.
-skin <skinID> |
- Start the emulator with the specified skin. |
- The standard Android platforms includes a choice of
- four skins:
- HVGA-L (480x320, landscape)
- HVGA-P (320x480, portrait) (default)
- QVGA-L (320x240, landscape)
- QVGA-P (240x320, portrait)
+ | This emulator option is deprecated. |
+ Please set skin options using AVDs, rather than by using this emulator
+option. Using this option may yield unexpected and in some cases misleading
+results, since the density with which to render the skin may not be defined.
+AVDs let you associate each skin with a default density and override the default
+as needed. For more information, see Android Virtual Devices.
|
-skindir <dir> |
- Search for emulator skins in <dir>. |
- |
+
This emulator option is deprecated. |
+
See comments for -skin, above. |
@@ -1636,41 +1640,9 @@ kilobits/sec):
Using Emulator Skins
-You can run the emulator with any of four default skins, as described in the table below. To specify a skin, use -skin <skinID> when starting the emulator.
+The Android SDK includes several Emulator skins that you can use to control the resolution and density of the emulated device's screen. To select a specific skin for running the emulator, create an AVD that uses that skin. Please do not use deprecated emulator options such as -skin to control the skin used by an emulator instance. For more information about AVDs, see Android Virtual Devices.
-For example:
-
-emulator -skin HVGA-L
-
-Note that you must enter the <skinID> in uppercase letters (if your development computer is case-sensitive).
-
-
-
- | skinID |
- Description |
- Skin |
-
-
- HVGA-L |
- 480x320, landscape |
-  |
-
-
- HVGA-P |
- 320x480, portrait (default) |
-  |
-
-
- QVGA-L |
- 320x240, landscape |
-  |
-
-
- QVGA-P |
- 240x320, portrait |
-  |
-
-
diff --git a/docs/html/guide/developing/tools/index.jd b/docs/html/guide/developing/tools/index.jd
index 2c9e45df3117a..91b430ff771a3 100644
--- a/docs/html/guide/developing/tools/index.jd
+++ b/docs/html/guide/developing/tools/index.jd
@@ -89,5 +89,10 @@ applications on the emulator.
A script that lets you manage AVDs and generate Ant build files that
you can use to compile your Android applications.
+
+ zipalign
+ An important .apk optimization tool. This tool ensures that all uncompressed data starts
+ with a particular alignment relative to the start of the file. This should always be used
+ to align .apk files after they have been signed.
diff --git a/docs/html/guide/developing/tools/zipalign.jd b/docs/html/guide/developing/tools/zipalign.jd
new file mode 100644
index 0000000000000..6231798408d06
--- /dev/null
+++ b/docs/html/guide/developing/tools/zipalign.jd
@@ -0,0 +1,65 @@
+page.title=zipalign
+@jd:body
+
+zipalign is an archive alignment tool that provides important
+optimization to Android application (.apk) files.
+The purpose is to ensure that all uncompressed data starts
+with a particular alignment relative to the start of the file. Specifically,
+it causes all uncompressed data within the .apk, such as images or raw files,
+to be aligned on 4-byte boundaries. This
+allows all portions to be accessed directly with {@code mmap()} even if they
+contain binary data with alignment restrictions.
+The benefit is a reduction in the amount of RAM consumed
+when running the application.
+
+This tool should always be used to align your .apk file before
+distributing it to end-users. The Android build tools can handle
+this for you. When using Eclipse with the ADT plugin, the Export Wizard
+will automatically zipalign your .apk after it signs it with your private key.
+The build scripts used
+when compiling your application with Ant will also zipalign your .apk,
+as long as you have provided the path to your keystore and the key alias in
+your project {@code build.properties} file, so that the build tools
+can sign the package first.
+
+Caution: zipalign must only be performed
+after the .apk file has been signed with your private key.
+If you perform zipalign before signing, then the signing procedure will undo
+the alignment. Also, do not make alterations to the aligned package.
+Alterations to the archive, such as renaming or deleting entries, will
+potentially disrupt the alignment of the modified entry and all later
+entries. And any files added to an "aligned" archive will not be aligned.
+
+The adjustment is made by altering the size of
+the "extra" field in the zip Local File Header sections. Existing data
+in the "extra" fields may be altered by this process.
+
+For more information about how to use zipalign when building your
+application, please read Signing
+Your Application.
+
+
+Usage
+
+To align {@code infile.apk} and save it as {@code outfile.apk}:
+
+zipalign [-f] [-v] <alignment> infile.apk outfile.apk
+
+To confirm the alignment of {@code existing.apk}:
+
+zipalign -c -v <alignment> existing.apk
+
+The {@code <alignment>} is an integer that defines the byte-alignment boundaries.
+This must always be 4 (which provides 32-bit alignment) or else it effectively
+does nothing.
+
+Flags:
+
+
+ - {@code -f} : overwrite existing outfile.zip
+ - {@code -v} : verbose output
+ - {@code -c} : confirm the alignment of the given file
+
+
+
+
diff --git a/docs/html/guide/guide_toc.cs b/docs/html/guide/guide_toc.cs
index 459ad37f79b6b..5abc872c96469 100644
--- a/docs/html/guide/guide_toc.cs
+++ b/docs/html/guide/guide_toc.cs
@@ -256,6 +256,7 @@
Monkey
sqlite3
Traceview
+ zipalign
introduced in:
API Level 4
diff --git a/docs/html/guide/topics/manifest/uses-sdk-element.jd b/docs/html/guide/topics/manifest/uses-sdk-element.jd
index adcdc286cbed5..ee8d03dc06d1b 100644
--- a/docs/html/guide/topics/manifest/uses-sdk-element.jd
+++ b/docs/html/guide/topics/manifest/uses-sdk-element.jd
@@ -3,7 +3,10 @@ page.title=<uses-sdk>
- syntax:
-<uses-sdk android:minSdkVersion="integer" />
+
+<uses-sdk android:minSdkVersion="integer"
+ android:maxSdkVersion="integer"
+ android:targetSdkVersion="integer" />
- contained in:
<manifest>
@@ -64,12 +67,16 @@ and minor versions).
- {@code android:targetSdkVersion}
- An integer designating the API Level that the application is targetting.
-
With this attribute set, the application says that is is be able to run on
+
With this attribute set, the application says that it is able to run on
older versions (down to {@code minSdkVersion}), but was explicitly tested to work
with the version specified here.
- Specifying this version allows the platform to disable compatibility
- code that is not required or enable newer features that are not
- available to older applications.
+ Specifying this target version allows the platform to disable compatibility
+ settings that are not required for the target version (which may otherwise be turned on
+ in order to maintain forward-compatibility) or enable newer features that are not
+ available to older applications. This does not mean that you can program different
+ features for different versions of the platform—it simply informs the platform that you
+ have tested against the target version and the platform should not perform any extra
+ work to maintain forward-compatibility with the target version.
Introduced in: API Level 4
diff --git a/docs/html/images/emulator-wvga800l.png b/docs/html/images/emulator-wvga800l.png
new file mode 100644
index 0000000000000000000000000000000000000000..a2140338a469189d99287bb278105e878fde5539
GIT binary patch
literal 513676
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