summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/app/ISearchManager.aidl1
-rw-r--r--core/java/android/app/SearchDialog.java23
-rw-r--r--core/java/android/app/SearchManager.java50
-rw-r--r--core/java/android/content/AbstractTableMerger.java49
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java3
-rw-r--r--core/java/android/content/pm/PackageParser.java17
-rw-r--r--core/java/android/os/BatteryStats.java22
-rw-r--r--core/java/android/provider/Settings.java8
-rw-r--r--core/java/android/server/search/SearchDialogWrapper.java102
-rw-r--r--core/java/android/server/search/SearchManagerService.java4
-rwxr-xr-xcore/java/android/speech/tts/TextToSpeech.java24
-rw-r--r--core/java/android/widget/AutoCompleteTextView.java7
12 files changed, 184 insertions, 126 deletions
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index 84a6085..bd72544 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -37,4 +37,5 @@ interface ISearchManager {
ISearchManagerCallback searchManagerCallback,
int ident);
void stopSearch();
+ boolean isVisible();
}
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 906361c..27c6376 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -354,7 +354,6 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
show();
}
-
updateUI();
return true;
@@ -490,6 +489,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
*/
private void updateUI() {
if (mSearchable != null) {
+ mDecor.setVisibility(View.VISIBLE);
updateSearchAutoComplete();
updateSearchButton();
updateSearchAppIcon();
@@ -994,7 +994,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
};
@Override
- public void dismiss() {
+ public void hide() {
if (!isShowing()) return;
// We made sure the IME was displayed, so also make sure it is closed
@@ -1005,10 +1005,10 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
imm.hideSoftInputFromWindow(
getWindow().getDecorView().getWindowToken(), 0);
}
-
- super.dismiss();
+
+ super.hide();
}
-
+
/**
* React to the user typing while in the suggestions list. First, check for action
* keys. If not handled, try refocusing regular characters into the EditText.
@@ -1234,8 +1234,8 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
}
/**
- * Launches an intent and dismisses the search dialog (unless the intent
- * is one of the special intents that modifies the state of the search dialog).
+ * Launches an intent, including any special intent handling. Doesn't dismiss the dialog
+ * since that will be handled in {@link SearchDialogWrapper#performActivityResuming}
*/
private void launchIntent(Intent intent) {
if (intent == null) {
@@ -1244,8 +1244,15 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
if (handleSpecialIntent(intent)){
return;
}
- dismiss();
+ Log.d(LOG_TAG, "launching " + intent);
getContext().startActivity(intent);
+
+ // in global search mode, SearchDialogWrapper#performActivityResuming will handle hiding
+ // the dialog when the next activity starts, but for in-app search, we still need to
+ // dismiss the dialog.
+ if (!mGlobalSearchMode) {
+ dismiss();
+ }
}
/**
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index b795a54..c98d966 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -1188,8 +1188,6 @@ public class SearchManager
/**
* Intent extra data key: This key will be used for the extra populated by the
* {@link #SUGGEST_COLUMN_INTENT_EXTRA_DATA} column.
- *
- * {@hide}
*/
public final static String EXTRA_DATA_KEY = "intent_extra_data_key";
@@ -1269,16 +1267,12 @@ public class SearchManager
* result indicates the shortcut refers to a no longer valid sugggestion.
*
* @see #SUGGEST_COLUMN_SHORTCUT_ID
- *
- * @hide pending API council approval
*/
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 API council approval
*/
public final static String SHORTCUT_MIME_TYPE =
"vnd.android.cursor.item/vnd.android.search.suggest";
@@ -1389,9 +1383,7 @@ public class SearchManager
* this element exists at the given row, this is the data that will be used when
* forming the suggestion's intent. If not provided, the Intent's extra data field will be null.
* This column allows suggestions to provide additional arbitrary data which will be included as
- * an extra under the key EXTRA_DATA_KEY.
- *
- * @hide Pending API council approval.
+ * an extra under the key {@link #EXTRA_DATA_KEY}.
*/
public final static String SUGGEST_COLUMN_INTENT_EXTRA_DATA = "suggest_intent_extra_data";
/**
@@ -1425,8 +1417,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 validation via
* {@link #SUGGEST_URI_PATH_SHORTCUT}.
- *
- * @hide Pending API council approval.
*/
public final static String SUGGEST_COLUMN_SHORTCUT_ID = "suggest_shortcut_id";
@@ -1443,8 +1433,6 @@ public class SearchManager
* Column name for suggestions cursor. <i>Optional.</i> 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 API council approval.
*/
public final static String SUGGEST_COLUMN_SPINNER_WHILE_REFRESHING =
"suggest_spinner_while_refreshing";
@@ -1452,8 +1440,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 API council approval.
*/
public final static String SUGGEST_NEVER_MAKE_SHORTCUT = "_-1";
@@ -1500,8 +1486,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 Pending API council approval.
*/
public final static String INTENT_ACTION_WEB_SEARCH_SETTINGS
= "android.search.action.WEB_SEARCH_SETTINGS";
@@ -1510,11 +1494,17 @@ public class SearchManager
* Intent action broadcasted to inform that the searchables list or default have changed.
* Components should handle this intent if they cache any searchable data and wish to stay
* up to date on changes.
- *
- * @hide Pending API council approval.
*/
public final static String INTENT_ACTION_SEARCHABLES_CHANGED
= "android.search.action.SEARCHABLES_CHANGED";
+
+ /**
+ * Intent action broadcasted to inform that the search settings have changed in some way.
+ * 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";
/**
* If a suggestion has this value in {@link #SUGGEST_COLUMN_INTENT_ACTION},
@@ -1534,7 +1524,6 @@ public class SearchManager
private int mIdent;
// package private since they are used by the inner class SearchManagerCallback
- /* package */ boolean mIsShowing = false;
/* package */ final Handler mHandler;
/* package */ OnDismissListener mDismissListener = null;
/* package */ OnCancelListener mCancelListener = null;
@@ -1600,12 +1589,9 @@ public class SearchManager
ComponentName launchActivity,
Bundle appSearchData,
boolean globalSearch) {
- if (DBG) debug("startSearch(), mIsShowing=" + mIsShowing);
- if (mIsShowing) return;
if (mIdent == 0) throw new IllegalArgumentException(
"Called from outside of an Activity context");
try {
- mIsShowing = true;
// activate the search manager and start it up!
mService.startSearch(initialQuery, selectInitialQuery, launchActivity, appSearchData,
globalSearch, mSearchManagerCallback, mIdent);
@@ -1626,15 +1612,10 @@ public class SearchManager
* @see #startSearch
*/
public void stopSearch() {
- if (DBG) debug("stopSearch(), mIsShowing=" + mIsShowing);
- if (!mIsShowing) return;
+ if (DBG) debug("stopSearch()");
try {
mService.stopSearch();
- // onDismiss will also clear this, but we do it here too since onDismiss() is
- // called asynchronously.
- mIsShowing = false;
} catch (RemoteException ex) {
- Log.e(TAG, "stopSearch() failed: " + ex);
}
}
@@ -1648,8 +1629,13 @@ public class SearchManager
* @hide
*/
public boolean isVisible() {
- if (DBG) debug("isVisible(), mIsShowing=" + mIsShowing);
- return mIsShowing;
+ if (DBG) debug("isVisible()");
+ try {
+ return mService.isVisible();
+ } catch (RemoteException e) {
+ Log.e(TAG, "isVisible() failed: " + e);
+ return false;
+ }
}
/**
@@ -1701,7 +1687,6 @@ public class SearchManager
private final Runnable mFireOnDismiss = new Runnable() {
public void run() {
if (DBG) debug("mFireOnDismiss");
- mIsShowing = false;
if (mDismissListener != null) {
mDismissListener.onDismiss();
}
@@ -1711,7 +1696,6 @@ public class SearchManager
private final Runnable mFireOnCancel = new Runnable() {
public void run() {
if (DBG) debug("mFireOnCancel");
- // doesn't need to clear mIsShowing since onDismiss() always gets called too
if (mCancelListener != null) {
mCancelListener.onCancel();
}
diff --git a/core/java/android/content/AbstractTableMerger.java b/core/java/android/content/AbstractTableMerger.java
index 9c760d9..9f609a3 100644
--- a/core/java/android/content/AbstractTableMerger.java
+++ b/core/java/android/content/AbstractTableMerger.java
@@ -369,30 +369,33 @@ public abstract class AbstractTableMerger
// An existing server item has changed
// If serverSyncVersion is null, there is no edit URL;
// server won't let this change be written.
- // Just hold onto it, I guess, in case the server permissions
- // change later.
- if (serverSyncVersion != null) {
- boolean recordChanged = (localSyncVersion == null) ||
- !serverSyncVersion.equals(localSyncVersion);
- if (recordChanged) {
- if (localSyncDirty) {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG, "remote record " + serverSyncId
- + " conflicts with local _sync_id " + localSyncID
- + ", local _id " + localRowId);
- }
- conflict = true;
- } else {
- if (Log.isLoggable(TAG, Log.VERBOSE)) {
- Log.v(TAG,
- "remote record " +
- serverSyncId +
- " updates local _sync_id " +
- localSyncID + ", local _id " +
- localRowId);
- }
- update = true;
+ boolean recordChanged = (localSyncVersion == null) ||
+ (serverSyncVersion == null) ||
+ !serverSyncVersion.equals(localSyncVersion);
+ if (recordChanged) {
+ if (localSyncDirty) {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "remote record " + serverSyncId
+ + " conflicts with local _sync_id " + localSyncID
+ + ", local _id " + localRowId);
}
+ conflict = true;
+ } else {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG,
+ "remote record " +
+ serverSyncId +
+ " updates local _sync_id " +
+ localSyncID + ", local _id " +
+ localRowId);
+ }
+ update = true;
+ }
+ } else {
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG,
+ "Skipping update: localSyncVersion: " + localSyncVersion +
+ ", serverSyncVersion: " + serverSyncVersion);
}
}
} else {
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0d00f21..28a77a5 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -399,7 +399,8 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
* @hide
*/
public void disableCompatibilityMode() {
- flags |= FLAG_SUPPORTS_LARGE_SCREENS;
+ flags |= (FLAG_SUPPORTS_LARGE_SCREENS | FLAG_SUPPORTS_NORMAL_SCREENS |
+ FLAG_SUPPORTS_SMALL_SCREENS);
supportsDensities = ANY_DENSITIES_ARRAY;
}
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index cebb696..39c27aa 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -92,6 +92,8 @@ public class PackageParser {
private static final Object mSync = new Object();
private static WeakReference<byte[]> mReadBuffer;
+ private static boolean sCompatibilityModeEnabled = true;
+
static class ParsePackageItemArgs {
final Package owner;
final String[] outError;
@@ -2629,6 +2631,11 @@ public class PackageParser {
public static ApplicationInfo generateApplicationInfo(Package p, int flags) {
if (p == null) return null;
if (!copyNeeded(flags, p, null)) {
+ // CompatibilityMode is global state. It's safe to modify the instance
+ // of the package.
+ if (!sCompatibilityModeEnabled) {
+ p.applicationInfo.disableCompatibilityMode();
+ }
return p.applicationInfo;
}
@@ -2643,6 +2650,9 @@ public class PackageParser {
if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) {
ai.supportsDensities = p.supportsDensities;
}
+ if (!sCompatibilityModeEnabled) {
+ ai.disableCompatibilityMode();
+ }
return ai;
}
@@ -2827,4 +2837,11 @@ public class PackageParser {
+ " " + service.info.name + "}";
}
}
+
+ /**
+ * @hide
+ */
+ public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) {
+ sCompatibilityModeEnabled = compatibilityModeEnabled;
+ }
}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 528def5..e203fd5 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -508,6 +508,19 @@ public abstract class BatteryStats implements Parcelable {
public abstract long getBatteryUptime(long curTime);
/**
+ * @deprecated use getRadioDataUptime
+ */
+ public long getRadioDataUptimeMs() {
+ return getRadioDataUptime() / 1000;
+ }
+
+ /**
+ * Returns the time that the radio was on for data transfers.
+ * @return the uptime in microseconds while unplugged
+ */
+ public abstract long getRadioDataUptime();
+
+ /**
* Returns the current battery realtime in microseconds.
*
* @param curTime the amount of elapsed realtime in microseconds.
@@ -1128,7 +1141,14 @@ public abstract class BatteryStats implements Parcelable {
}
if (!didOne) sb.append("No activity");
pw.println(sb.toString());
-
+
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" Radio data uptime when unplugged: ");
+ sb.append(getRadioDataUptime() / 1000);
+ sb.append(" ms");
+ pw.println(sb.toString());
+
sb.setLength(0);
sb.append(prefix);
sb.append(" Wifi on: "); formatTimeMs(sb, wifiOnTime / 1000);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index bf6003e..b5440f2 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2508,11 +2508,17 @@ public final class Settings {
public static final String CHECKIN_EVENTS = "checkin_events";
/**
- * Event tags for list of services to upload during checkin.
+ * Comma-separated list of service names to dump and upload during checkin.
*/
public static final String CHECKIN_DUMPSYS_LIST = "checkin_dumpsys_list";
/**
+ * Comma-separated list of packages to specify for each service that is
+ * dumped (currently only meaningful for user activity).
+ */
+ public static final String CHECKIN_PACKAGE_LIST = "checkin_package_list";
+
+ /**
* The interval (in seconds) between periodic checkin attempts.
*/
public static final String CHECKIN_INTERVAL = "checkin_interval";
diff --git a/core/java/android/server/search/SearchDialogWrapper.java b/core/java/android/server/search/SearchDialogWrapper.java
index 70c7d73..d3ef5de 100644
--- a/core/java/android/server/search/SearchDialogWrapper.java
+++ b/core/java/android/server/search/SearchDialogWrapper.java
@@ -45,8 +45,6 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
private static final String TAG = "SearchManagerService";
private static final boolean DBG = false;
- private static final String DISABLE_SEARCH_PROPERTY = "dev.disablesearchdialog";
-
private static final String SEARCH_UI_THREAD_NAME = "SearchDialog";
private static final int SEARCH_UI_THREAD_PRIORITY =
android.os.Process.THREAD_PRIORITY_DEFAULT;
@@ -88,12 +86,11 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
// Identity of currently resumed activity.
private int mResumedIdent = 0;
-
- // Allows disabling of search dialog for stress testing runs
- private final boolean mDisabledOnBoot;
// True if we have registered our receivers.
private boolean mReceiverRegistered;
+
+ private volatile boolean mVisible = false;
/**
* Creates a new search dialog wrapper and a search UI thread. The search dialog itself will
@@ -104,8 +101,6 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
public SearchDialogWrapper(Context context) {
mContext = context;
- mDisabledOnBoot = !TextUtils.isEmpty(SystemProperties.get(DISABLE_SEARCH_PROPERTY));
-
// Create the search UI thread
HandlerThread t = new HandlerThread(SEARCH_UI_THREAD_NAME, SEARCH_UI_THREAD_PRIORITY);
t.start();
@@ -115,6 +110,10 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
mSearchUiThread.sendEmptyMessage(MSG_INIT);
}
+ public boolean isVisible() {
+ return mVisible;
+ }
+
/**
* Initializes the search UI.
* Must be called from the search UI thread.
@@ -151,8 +150,10 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
- if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- performStopSearch();
+ if (!"search".equals(intent.getStringExtra("reason"))) {
+ if (DBG) debug(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
+ performStopSearch();
+ }
} else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
if (DBG) debug(Intent.ACTION_CONFIGURATION_CHANGED);
performOnConfigurationChanged();
@@ -205,7 +206,7 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
* Can be called from any thread.
*/
public void activityResuming(int ident) {
- if (DBG) debug("startSearch()");
+ if (DBG) debug("activityResuming(ident=" + ident + ")");
Message msg = Message.obtain();
msg.what = MSG_ACTIVITY_RESUMING;
msg.arg1 = ident;
@@ -256,20 +257,6 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
}
- void updateDialogVisibility() {
- if (mStartedIdent != 0) {
- // mResumedIdent == 0 means we have just booted and the user
- // hasn't yet gone anywhere.
- if (mResumedIdent == 0 || mStartedIdent == mResumedIdent) {
- if (DBG) Log.v(TAG, "******************* DIALOG: show");
- mSearchDialog.show();
- } else {
- if (DBG) Log.v(TAG, "******************* DIALOG: hide");
- mSearchDialog.hide();
- }
- }
- }
-
/**
* Actually launches the search UI.
* This must be called on the search UI thread.
@@ -283,19 +270,20 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
int ident) {
if (DBG) debug("performStartSearch()");
- if (mDisabledOnBoot) {
- Log.d(TAG, "ignoring start search request because " + DISABLE_SEARCH_PROPERTY
- + " system property is set.");
- return;
- }
-
registerBroadcastReceiver();
mCallback = searchManagerCallback;
+
+ // clean up any hidden dialog that we were waiting to resume
+ if (mStartedIdent != 0) {
+ mSearchDialog.dismiss();
+ }
+
mStartedIdent = ident;
if (DBG) Log.v(TAG, "******************* DIALOG: start");
+
mSearchDialog.show(initialQuery, selectInitialQuery, launchActivity, appSearchData,
globalSearch);
- updateDialogVisibility();
+ mVisible = true;
}
/**
@@ -306,6 +294,7 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
if (DBG) debug("performStopSearch()");
if (DBG) Log.v(TAG, "******************* DIALOG: cancel");
mSearchDialog.cancel();
+ mVisible = false;
mStartedIdent = 0;
}
@@ -317,7 +306,21 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
if (DBG) debug("performResumingActivity(): mStartedIdent="
+ mStartedIdent + ", resuming: " + ident);
this.mResumedIdent = ident;
- updateDialogVisibility();
+ if (mStartedIdent != 0) {
+ if (mStartedIdent == mResumedIdent) {
+ // we are resuming into the activity where we previously hid the dialog, bring it
+ // back
+ if (DBG) Log.v(TAG, "******************* DIALOG: show");
+ mSearchDialog.show();
+ mVisible = true;
+ } else {
+ // resuming into some other activity; hide ourselves in case we ever come back
+ // so we can show ourselves quickly again
+ if (DBG) Log.v(TAG, "******************* DIALOG: hide");
+ mSearchDialog.hide();
+ mVisible = false;
+ }
+ }
}
/**
@@ -333,27 +336,38 @@ implements DialogInterface.OnCancelListener, DialogInterface.OnDismissListener {
*/
public void onDismiss(DialogInterface dialog) {
if (DBG) debug("onDismiss()");
- if (mCallback != null) {
- try {
- // should be safe to do on the search UI thread, since it's a oneway interface
- mCallback.onDismiss();
- } catch (DeadObjectException ex) {
- // The process that hosted the callback has died, do nothing
- } catch (RemoteException ex) {
- Log.e(TAG, "onDismiss() failed: " + ex);
- }
- // we don't need the callback anymore, release it
- mCallback = null;
- }
+ mStartedIdent = 0;
+ mVisible = false;
+ callOnDismiss();
+
+ // we don't need the callback anymore, release it
+ mCallback = null;
unregisterBroadcastReceiver();
}
+
/**
* Called by {@link SearchDialog} when the user or activity cancels search.
* Whenever this method is called, {@link #onDismiss} is always called afterwards.
*/
public void onCancel(DialogInterface dialog) {
if (DBG) debug("onCancel()");
+ callOnCancel();
+ }
+
+ private void callOnDismiss() {
+ if (mCallback == null) return;
+ try {
+ // should be safe to do on the search UI thread, since it's a oneway interface
+ mCallback.onDismiss();
+ } catch (DeadObjectException ex) {
+ // The process that hosted the callback has died, do nothing
+ } catch (RemoteException ex) {
+ Log.e(TAG, "onDismiss() failed: " + ex);
+ }
+ }
+
+ private void callOnCancel() {
if (mCallback != null) {
try {
// should be safe to do on the search UI thread, since it's a oneway interface
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index 7629912..fdeb8f9 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -238,4 +238,8 @@ public class SearchManagerService extends ISearchManager.Stub {
getSearchDialog().stopSearch();
}
+ public boolean isVisible() {
+ return mSearchDialog != null && mSearchDialog.isVisible();
+ }
+
}
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 4794fe1..bb6b4b0 100755
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -820,14 +820,14 @@ public class TextToSpeech {
if (speechRate > 0) {
int rate = (int)(speechRate*100);
mCachedParams[Engine.TTS_PARAM_POSITION_RATE + 1] = String.valueOf(rate);
- result = mITts.setSpeechRate(mPackageName, rate);
+ // the rate is not set here, instead it is cached so it will be associated
+ // with all upcoming utterances.
+ if (speechRate > 0.0f) {
+ result = TTS_SUCCESS;
+ } else {
+ result = TTS_ERROR;
+ }
}
- } catch (RemoteException e) {
- // TTS died; restart it.
- Log.e("TextToSpeech.java - setSpeechRate", "RemoteException");
- e.printStackTrace();
- mStarted = false;
- initTts();
} catch (NullPointerException e) {
// TTS died; restart it.
Log.e("TextToSpeech.java - setSpeechRate", "NullPointerException");
@@ -907,7 +907,9 @@ public class TextToSpeech {
* @param loc
* The locale describing the language to be used.
*
- * @return Code indicating the support status for the locale. See the TTS_LANG_ codes.
+ * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+ * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+ * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
*/
public int setLanguage(Locale loc) {
synchronized (mStartLock) {
@@ -919,6 +921,7 @@ public class TextToSpeech {
mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1] = loc.getISO3Language();
mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1] = loc.getISO3Country();
mCachedParams[Engine.TTS_PARAM_POSITION_VARIANT + 1] = loc.getVariant();
+
result = mITts.setLanguage(mPackageName,
mCachedParams[Engine.TTS_PARAM_POSITION_LANGUAGE + 1],
mCachedParams[Engine.TTS_PARAM_POSITION_COUNTRY + 1],
@@ -994,8 +997,9 @@ public class TextToSpeech {
* @param loc
* The Locale describing the language to be used.
*
- * @return one of TTS_LANG_NOT_SUPPORTED, TTS_LANG_MISSING_DATA, TTS_LANG_AVAILABLE,
- * TTS_LANG_COUNTRY_AVAILABLE, TTS_LANG_COUNTRY_VAR_AVAILABLE.
+ * @return code indicating the support status for the locale. See {@link #TTS_LANG_AVAILABLE},
+ * {@link #TTS_LANG_COUNTRY_AVAILABLE}, {@link #TTS_LANG_COUNTRY_VAR_AVAILABLE},
+ * {@link #TTS_LANG_MISSING_DATA} and {@link #TTS_LANG_NOT_SUPPORTED}.
*/
public int isLanguageAvailable(Locale loc) {
synchronized (mStartLock) {
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 0df587f..4bc00de 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -1296,11 +1296,8 @@ public class AutoCompleteTextView extends EditText implements Filter.FilterListe
}
}
- // Max height available on the screen for a popup. If this AutoCompleteTextView has
- // the dropDownAlwaysVisible attribute, and the input method is not currently required,
- // we then we ask for the height ignoring any bottom decorations like the input method.
- // Otherwise we respect the input method.
- boolean ignoreBottomDecorations = mDropDownAlwaysVisible &&
+ // Max height available on the screen for a popup.
+ boolean ignoreBottomDecorations =
mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
final int maxHeight = mPopup.getMaxAvailableHeight(
getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations);