summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds/am/src/com/android/commands/am/Am.java1
-rw-r--r--cmds/pm/src/com/android/commands/pm/Pm.java9
-rw-r--r--core/java/android/accounts/AccountManager.java49
-rw-r--r--core/java/android/accounts/AccountManagerService.java44
-rw-r--r--core/java/android/accounts/ChooseTypeAndAccountActivity.java234
-rw-r--r--core/java/android/accounts/GrantCredentialsPermissionActivity.java70
-rw-r--r--core/java/android/accounts/IAccountManager.aidl3
-rw-r--r--core/java/android/app/ActivityManager.java7
-rw-r--r--core/java/android/app/ActivityThread.java2
-rw-r--r--core/java/android/app/FragmentManager.java19
-rw-r--r--core/java/android/app/IProcessObserver.aidl1
-rw-r--r--core/java/android/app/Notification.java31
-rw-r--r--core/java/android/content/pm/PackageParser.java20
-rw-r--r--core/java/android/hardware/Camera.java7
-rw-r--r--core/java/android/provider/ContactsContract.java15
-rw-r--r--core/java/android/provider/Settings.java10
-rw-r--r--core/java/android/server/BluetoothA2dpService.java59
-rw-r--r--core/java/android/view/DisplayList.java7
-rw-r--r--core/java/android/view/HardwareRenderer.java42
-rwxr-xr-xcore/java/android/view/InputDevice.java12
-rw-r--r--core/java/android/view/ViewRootImpl.java5
-rw-r--r--core/java/android/view/VolumePanel.java20
-rw-r--r--core/java/android/webkit/WebViewClassic.java5
-rw-r--r--core/java/android/widget/AbsListView.java104
-rw-r--r--core/java/android/widget/Editor.java13
-rw-r--r--core/java/android/widget/TextView.java8
-rw-r--r--core/java/com/android/internal/app/ActionBarImpl.java45
-rw-r--r--core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java8
-rw-r--r--core/jni/android_database_SQLiteConnection.cpp18
-rw-r--r--core/jni/android_view_DisplayEventReceiver.cpp42
-rw-r--r--core/jni/android_view_InputEventReceiver.cpp35
-rw-r--r--core/res/AndroidManifest.xml2
-rw-r--r--core/res/res/anim/dock_bottom_enter.xml4
-rw-r--r--core/res/res/anim/dock_bottom_exit.xml4
-rw-r--r--core/res/res/anim/dock_left_enter.xml4
-rw-r--r--core/res/res/anim/dock_left_exit.xml4
-rw-r--r--core/res/res/anim/dock_right_enter.xml4
-rw-r--r--core/res/res/anim/dock_right_exit.xml4
-rw-r--r--core/res/res/anim/dock_top_enter.xml4
-rw-r--r--core/res/res/anim/dock_top_exit.xml4
-rw-r--r--core/res/res/layout/choose_selected_account_row.xml46
-rw-r--r--core/res/res/layout/choose_type_and_account.xml53
-rw-r--r--core/res/res/layout/notification_action_list.xml1
-rw-r--r--core/res/res/layout/notification_template_base.xml26
-rw-r--r--core/res/res/layout/notification_template_big_base.xml35
-rw-r--r--core/res/res/layout/notification_template_big_picture.xml1
-rw-r--r--core/res/res/layout/notification_template_big_text.xml44
-rw-r--r--core/res/res/layout/notification_template_inbox.xml56
-rw-r--r--core/res/res/values-af/strings.xml19
-rw-r--r--core/res/res/values-am/strings.xml1
-rw-r--r--core/res/res/values-ar/strings.xml19
-rw-r--r--core/res/res/values-be/strings.xml1
-rw-r--r--core/res/res/values-bg/strings.xml1
-rw-r--r--core/res/res/values-ca/strings.xml1
-rw-r--r--core/res/res/values-cs/strings.xml4
-rw-r--r--core/res/res/values-da/strings.xml19
-rw-r--r--core/res/res/values-de/strings.xml1
-rw-r--r--core/res/res/values-el/strings.xml1
-rw-r--r--core/res/res/values-en-rGB/strings.xml1
-rw-r--r--core/res/res/values-es-rUS/strings.xml19
-rw-r--r--core/res/res/values-es/strings.xml1
-rw-r--r--core/res/res/values-et/strings.xml19
-rw-r--r--core/res/res/values-fa/strings.xml19
-rw-r--r--core/res/res/values-fi/strings.xml1
-rw-r--r--core/res/res/values-fr/strings.xml1
-rw-r--r--core/res/res/values-hi/strings.xml1
-rw-r--r--core/res/res/values-hr/strings.xml1
-rw-r--r--core/res/res/values-hu/strings.xml1
-rw-r--r--core/res/res/values-in/strings.xml19
-rw-r--r--core/res/res/values-it/strings.xml19
-rw-r--r--core/res/res/values-iw/strings.xml1
-rw-r--r--core/res/res/values-ja/strings.xml1
-rw-r--r--core/res/res/values-ko/strings.xml19
-rw-r--r--core/res/res/values-lt/strings.xml19
-rw-r--r--core/res/res/values-lv/strings.xml19
-rw-r--r--core/res/res/values-ms/strings.xml19
-rw-r--r--core/res/res/values-nb/strings.xml3
-rw-r--r--core/res/res/values-nl/strings.xml1
-rw-r--r--core/res/res/values-pl/strings.xml19
-rw-r--r--core/res/res/values-pt-rPT/strings.xml1
-rw-r--r--core/res/res/values-pt/strings.xml19
-rw-r--r--core/res/res/values-rm/strings.xml2
-rw-r--r--core/res/res/values-ro/strings.xml1
-rw-r--r--core/res/res/values-ru/strings.xml19
-rw-r--r--core/res/res/values-sk/strings.xml1
-rw-r--r--core/res/res/values-sl/strings.xml1
-rw-r--r--core/res/res/values-sr/strings.xml1
-rw-r--r--core/res/res/values-sv/strings.xml19
-rw-r--r--core/res/res/values-sw/strings.xml1
-rw-r--r--core/res/res/values-th/strings.xml1
-rw-r--r--core/res/res/values-tl/strings.xml19
-rw-r--r--core/res/res/values-tr/strings.xml1
-rw-r--r--core/res/res/values-uk/strings.xml19
-rw-r--r--core/res/res/values-vi/strings.xml19
-rw-r--r--core/res/res/values-zh-rCN/strings.xml19
-rw-r--r--core/res/res/values-zh-rTW/strings.xml1
-rw-r--r--core/res/res/values-zu/strings.xml19
-rw-r--r--core/res/res/values/public.xml7
-rwxr-xr-xcore/res/res/values/strings.xml5
-rw-r--r--core/res/res/values/styles.xml9
-rw-r--r--include/private/hwui/DrawGlInfo.h9
-rw-r--r--libs/hwui/DisplayListRenderer.cpp115
-rw-r--r--libs/hwui/DisplayListRenderer.h40
-rw-r--r--libs/hwui/OpenGLRenderer.cpp152
-rw-r--r--libs/hwui/OpenGLRenderer.h42
-rw-r--r--media/java/android/media/AudioManager.java37
-rw-r--r--media/java/android/media/AudioService.java186
-rw-r--r--media/java/android/media/IAudioService.aidl4
-rw-r--r--media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java104
-rw-r--r--packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.pngbin232 -> 155 bytes
-rw-r--r--packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.pngbin211 -> 152 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.pngbin2641 -> 983 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.pngbin1496 -> 651 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.pngbin4014 -> 1516 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw720dp-hdpi/notification_panel_bg.9.pngbin2641 -> 2498 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw720dp-mdpi/notification_panel_bg.9.pngbin1496 -> 1551 bytes
-rw-r--r--packages/SystemUI/res/drawable-sw720dp-xhdpi/notification_panel_bg.9.pngbin4014 -> 3910 bytes
-rw-r--r--packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.pngbin249 -> 157 bytes
-rw-r--r--packages/SystemUI/res/values-zh-rCN/strings.xml4
-rw-r--r--packages/SystemUI/res/values/config.xml8
-rw-r--r--packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/SearchPanelView.java36
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java9
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java17
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java83
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java60
-rw-r--r--policy/src/com/android/internal/policy/impl/FaceUnlock.java3
-rwxr-xr-xpolicy/src/com/android/internal/policy/impl/PhoneWindowManager.java7
-rw-r--r--services/java/com/android/server/PowerManagerService.java9
-rw-r--r--services/java/com/android/server/UiModeManagerService.java24
-rw-r--r--services/java/com/android/server/WiredAccessoryObserver.java110
-rw-r--r--services/java/com/android/server/accessibility/AccessibilityManagerService.java220
-rw-r--r--services/java/com/android/server/accessibility/TouchExplorer.java2
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java171
-rw-r--r--services/java/com/android/server/am/ContentProviderConnection.java7
-rw-r--r--services/java/com/android/server/am/ProcessRecord.java1
-rw-r--r--services/java/com/android/server/am/TaskRecord.java12
-rw-r--r--services/java/com/android/server/input/InputManagerService.java8
-rw-r--r--services/java/com/android/server/net/NetworkPolicyManagerService.java4
-rwxr-xr-xservices/java/com/android/server/wm/WindowManagerService.java11
-rw-r--r--services/sensorservice/SensorService.cpp2
-rw-r--r--wifi/java/android/net/wifi/WifiWatchdogStateMachine.java17
144 files changed, 1880 insertions, 1346 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java
index cb53422f4adb..54b5836c9931 100644
--- a/cmds/am/src/com/android/commands/am/Am.java
+++ b/cmds/am/src/com/android/commands/am/Am.java
@@ -1301,7 +1301,6 @@ public class Am {
" am display-size [reset|MxN]\n" +
" am to-uri [INTENT]\n" +
" am to-intent-uri [INTENT]\n" +
- " am switch-user <USER_ID>\n" +
"\n" +
"am start: start an Activity. Options are:\n" +
" -D: enable debugging\n" +
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index f9ff861e88f5..88a025e3c96d 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -1360,22 +1360,19 @@ public final class Pm {
System.err.println(" pm list instrumentation [-f] [TARGET-PACKAGE]");
System.err.println(" pm list features");
System.err.println(" pm list libraries");
- System.err.println(" pm list users");
System.err.println(" pm path PACKAGE");
System.err.println(" pm install [-l] [-r] [-t] [-i INSTALLER_PACKAGE_NAME] [-s] [-f]");
System.err.println(" [--algo <algorithm name> --key <key-in-hex> --iv <IV-in-hex>] PATH");
System.err.println(" pm uninstall [-k] PACKAGE");
System.err.println(" pm clear PACKAGE");
- System.err.println(" pm enable [--user USER_ID] PACKAGE_OR_COMPONENT");
- System.err.println(" pm disable [--user USER_ID] PACKAGE_OR_COMPONENT");
- System.err.println(" pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT");
+ System.err.println(" pm enable PACKAGE_OR_COMPONENT");
+ System.err.println(" pm disable PACKAGE_OR_COMPONENT");
+ System.err.println(" pm disable-user PACKAGE_OR_COMPONENT");
System.err.println(" pm grant PACKAGE PERMISSION");
System.err.println(" pm revoke PACKAGE PERMISSION");
System.err.println(" pm set-install-location [0/auto] [1/internal] [2/external]");
System.err.println(" pm get-install-location");
System.err.println(" pm set-permission-enforced PERMISSION [true|false]");
- System.err.println(" pm create-user USER_NAME");
- System.err.println(" pm remove-user USER_ID");
System.err.println("");
System.err.println("pm list packages: prints all packages, optionally only");
System.err.println(" those whose package name contains the text in FILTER. Options:");
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 150880cd9a63..39e83e015ff1 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -405,6 +405,55 @@ public class AccountManager {
}
/**
+ * Change whether or not an app (identified by its uid) is allowed to retrieve an authToken
+ * for an account.
+ * <p>
+ * This is only meant to be used by system activities and is not in the SDK.
+ * @param account The account whose permissions are being modified
+ * @param authTokenType The type of token whose permissions are being modified
+ * @param uid The uid that identifies the app which is being granted or revoked permission.
+ * @param value true is permission is being granted, false for revoked
+ * @hide
+ */
+ public void updateAppPermission(Account account, String authTokenType, int uid, boolean value) {
+ try {
+ mService.updateAppPermission(account, authTokenType, uid, value);
+ } catch (RemoteException e) {
+ // won't ever happen
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Get the user-friendly label associated with an authenticator's auth token.
+ * @param accountType the type of the authenticator. must not be null.
+ * @param authTokenType the token type. must not be null.
+ * @param callback callback to invoke when the result is available. may be null.
+ * @param handler the handler on which to invoke the callback, or null for the main thread
+ * @return a future containing the label string
+ * @hide
+ */
+ public AccountManagerFuture<String> getAuthTokenLabel(
+ final String accountType, final String authTokenType,
+ AccountManagerCallback<String> callback, Handler handler) {
+ if (accountType == null) throw new IllegalArgumentException("accountType is null");
+ if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
+ return new Future2Task<String>(handler, callback) {
+ public void doWork() throws RemoteException {
+ mService.getAuthTokenLabel(mResponse, accountType, authTokenType);
+ }
+
+ @Override
+ public String bundleToResult(Bundle bundle) throws AuthenticatorException {
+ if (!bundle.containsKey(KEY_AUTH_TOKEN_LABEL)) {
+ throw new AuthenticatorException("no result in response");
+ }
+ return bundle.getString(KEY_AUTH_TOKEN_LABEL);
+ }
+ }.start();
+ }
+
+ /**
* Finds out whether a particular account has all the specified features.
* Account features are authenticator-specific string tokens identifying
* boolean account properties. For example, features are used to tell
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java
index 2b643c29e569..079b9bd28476 100644
--- a/core/java/android/accounts/AccountManagerService.java
+++ b/core/java/android/accounts/AccountManagerService.java
@@ -163,7 +163,8 @@ public class AccountManagerService
new HashMap<Account, Integer>();
private final Object cacheLock = new Object();
/** protected by the {@link #cacheLock} */
- private final HashMap<String, Account[]> accountCache = new HashMap<String, Account[]>();
+ private final HashMap<String, Account[]> accountCache =
+ new LinkedHashMap<String, Account[]>();
/** protected by the {@link #cacheLock} */
private HashMap<Account, HashMap<String, String>> userDataCache =
new HashMap<Account, HashMap<String, String>>();
@@ -296,7 +297,7 @@ public class AccountManagerService
try {
accounts.accountCache.clear();
final HashMap<String, ArrayList<String>> accountNamesByType =
- new HashMap<String, ArrayList<String>>();
+ new LinkedHashMap<String, ArrayList<String>>();
while (cursor.moveToNext()) {
final long accountId = cursor.getLong(0);
final String accountType = cursor.getString(1);
@@ -985,21 +986,25 @@ public class AccountManagerService
}
}
- void getAuthTokenLabel(final IAccountManagerResponse response,
- final Account account,
- final String authTokenType, int uid) {
- if (account == null) throw new IllegalArgumentException("account is null");
+ public void getAuthTokenLabel(IAccountManagerResponse response, final String accountType,
+ final String authTokenType)
+ throws RemoteException {
+ if (accountType == null) throw new IllegalArgumentException("accountType is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
- checkBinderPermission(Manifest.permission.USE_CREDENTIALS);
- UserAccounts accounts = getUserAccounts(UserId.getUserId(uid));
+ final int callingUid = getCallingUid();
+ clearCallingIdentity();
+ if (callingUid != android.os.Process.SYSTEM_UID) {
+ throw new SecurityException("can only call from system");
+ }
+ UserAccounts accounts = getUserAccounts(UserId.getUserId(callingUid));
long identityToken = clearCallingIdentity();
try {
- new Session(accounts, response, account.type, false,
+ new Session(accounts, response, accountType, false,
false /* stripAuthTokenFromResult */) {
protected String toDebugString(long now) {
return super.toDebugString(now) + ", getAuthTokenLabel"
- + ", " + account
+ + ", " + accountType
+ ", authTokenType " + authTokenType;
}
@@ -2230,6 +2235,21 @@ public class AccountManagerService
Manifest.permission.USE_CREDENTIALS);
}
+ public void updateAppPermission(Account account, String authTokenType, int uid, boolean value)
+ throws RemoteException {
+ final int callingUid = getCallingUid();
+
+ if (callingUid != android.os.Process.SYSTEM_UID) {
+ throw new SecurityException();
+ }
+
+ if (value) {
+ grantAppPermission(account, authTokenType, uid);
+ } else {
+ revokeAppPermission(account, authTokenType, uid);
+ }
+ }
+
/**
* Allow callers with the given uid permission to get credentials for account/authTokenType.
* <p>
@@ -2237,7 +2257,7 @@ public class AccountManagerService
* which is in the system. This means we don't need to protect it with permissions.
* @hide
*/
- public void grantAppPermission(Account account, String authTokenType, int uid) {
+ private void grantAppPermission(Account account, String authTokenType, int uid) {
if (account == null || authTokenType == null) {
Log.e(TAG, "grantAppPermission: called with invalid arguments", new Exception());
return;
@@ -2271,7 +2291,7 @@ public class AccountManagerService
* which is in the system. This means we don't need to protect it with permissions.
* @hide
*/
- public void revokeAppPermission(Account account, String authTokenType, int uid) {
+ private void revokeAppPermission(Account account, String authTokenType, int uid) {
if (account == null || authTokenType == null) {
Log.e(TAG, "revokeAppPermission: called with invalid arguments", new Exception());
return;
diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
index 291e75ee4de0..6b3b7fd59f52 100644
--- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java
+++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java
@@ -16,24 +16,18 @@
package android.accounts;
import android.app.Activity;
-import android.content.Context;
import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Parcelable;
import android.text.TextUtils;
import android.util.Log;
-import android.view.LayoutInflater;
import android.view.View;
-import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
-import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+
import com.android.internal.R;
import java.io.IOException;
@@ -106,10 +100,16 @@ public class ChooseTypeAndAccountActivity extends Activity
private static final String KEY_INSTANCE_STATE_PENDING_REQUEST = "pendingRequest";
private static final String KEY_INSTANCE_STATE_EXISTING_ACCOUNTS = "existingAccounts";
+ private static final String KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME = "selectedAccountName";
+ private static final String KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT = "selectedAddAccount";
+
+ private static final int SELECTED_ITEM_NONE = -1;
- private ArrayList<AccountInfo> mAccountInfos;
+ private ArrayList<Account> mAccounts;
private int mPendingRequest = REQUEST_NULL;
private Parcelable[] mExistingAccounts = null;
+ private int mSelectedItemIndex;
+ private Button mOkButton;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -119,31 +119,39 @@ public class ChooseTypeAndAccountActivity extends Activity
+ savedInstanceState + ")");
}
+ // save some items we use frequently
+ final AccountManager accountManager = AccountManager.get(this);
+ final Intent intent = getIntent();
+
+ String selectedAccountName = null;
+ boolean selectedAddNewAccount = false;
+
if (savedInstanceState != null) {
mPendingRequest = savedInstanceState.getInt(KEY_INSTANCE_STATE_PENDING_REQUEST);
mExistingAccounts =
savedInstanceState.getParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS);
+
+ // Makes sure that any user selection is preserved across orientation changes.
+ selectedAccountName = savedInstanceState.getString(
+ KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME);
+
+ selectedAddNewAccount = savedInstanceState.getBoolean(
+ KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
} else {
mPendingRequest = REQUEST_NULL;
mExistingAccounts = null;
+ // If the selected account as specified in the intent matches one in the list we will
+ // show is as pre-selected.
+ Account selectedAccount = (Account) intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT);
+ if (selectedAccount != null) {
+ selectedAccountName = selectedAccount.name;
+ }
}
- // save some items we use frequently
- final AccountManager accountManager = AccountManager.get(this);
- final Intent intent = getIntent();
-
- // override the description text if supplied
- final String descriptionOverride =
- intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE);
- if (!TextUtils.isEmpty(descriptionOverride)) {
- ((TextView)findViewById(R.id.description)).setText(descriptionOverride);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "selected account name is " + selectedAccountName);
}
- // If the selected account matches one in the list we will place a
- // checkmark next to it.
- final Account selectedAccount =
- (Account)intent.getParcelableExtra(EXTRA_SELECTED_ACCOUNT);
-
// build an efficiently queryable map of account types to authenticator descriptions
final HashMap<String, AuthenticatorDescription> typeToAuthDescription =
new HashMap<String, AuthenticatorDescription>();
@@ -192,7 +200,8 @@ public class ChooseTypeAndAccountActivity extends Activity
// accounts that don't match the allowable types, if provided, or that don't match the
// allowable accounts, if provided.
final Account[] accounts = accountManager.getAccounts();
- mAccountInfos = new ArrayList<AccountInfo>(accounts.length);
+ mAccounts = new ArrayList<Account>(accounts.length);
+ mSelectedItemIndex = SELECTED_ITEM_NONE;
for (Account account : accounts) {
if (setOfAllowableAccounts != null
&& !setOfAllowableAccounts.contains(account)) {
@@ -202,15 +211,16 @@ public class ChooseTypeAndAccountActivity extends Activity
&& !setOfRelevantAccountTypes.contains(account.type)) {
continue;
}
- mAccountInfos.add(new AccountInfo(account,
- getDrawableForType(typeToAuthDescription, account.type),
- account.equals(selectedAccount)));
+ if (account.name.equals(selectedAccountName)) {
+ mSelectedItemIndex = mAccounts.size();
+ }
+ mAccounts.add(account);
}
if (mPendingRequest == REQUEST_NULL) {
- // If there are no relevant accounts and only one relevant account typoe go directly to
+ // If there are no relevant accounts and only one relevant account type go directly to
// add account. Otherwise let the user choose.
- if (mAccountInfos.isEmpty()) {
+ if (mAccounts.isEmpty()) {
if (setOfRelevantAccountTypes.size() == 1) {
runAddAccountForAuthenticator(setOfRelevantAccountTypes.iterator().next());
} else {
@@ -221,36 +231,64 @@ public class ChooseTypeAndAccountActivity extends Activity
// if there is only one allowable account return it
if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false)
- && mAccountInfos.size() == 1) {
- Account account = mAccountInfos.get(0).account;
+ && mAccounts.size() == 1) {
+ Account account = mAccounts.get(0);
setResultAndFinish(account.name, account.type);
return;
}
}
+ // Cannot set content view until we know that mPendingRequest is not null, otherwise
+ // would cause screen flicker.
setContentView(R.layout.choose_type_and_account);
- // there is more than one allowable account. initialize the list adapter to allow
- // the user to select an account.
+ // Override the description text if supplied
+ final String descriptionOverride =
+ intent.getStringExtra(EXTRA_DESCRIPTION_TEXT_OVERRIDE);
+ TextView descriptionView = (TextView) findViewById(R.id.description);
+ if (!TextUtils.isEmpty(descriptionOverride)) {
+ descriptionView.setText(descriptionOverride);
+ } else {
+ descriptionView.setVisibility(View.GONE);
+ }
+
+ // List of options includes all accounts found together with "Add new account" as the
+ // last item in the list.
+ String[] listItems = new String[mAccounts.size() + 1];
+ for (int i = 0; i < mAccounts.size(); i++) {
+ listItems[i] = mAccounts.get(i).name;
+ }
+ listItems[mAccounts.size()] = getResources().getString(
+ R.string.add_account_button_label);
+
ListView list = (ListView) findViewById(android.R.id.list);
- list.setAdapter(new AccountArrayAdapter(this,
- android.R.layout.simple_list_item_1, mAccountInfos));
+ list.setAdapter(new ArrayAdapter<String>(this,
+ android.R.layout.simple_list_item_single_choice, listItems));
list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+ list.setItemsCanFocus(false);
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
- onListItemClick((ListView)parent, v, position, id);
+ mSelectedItemIndex = position;
+ mOkButton.setEnabled(true);
}
});
- // set the listener for the addAccount button
- Button addAccountButton = (Button) findViewById(R.id.addAccount);
- addAccountButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(final View v) {
- startChooseAccountTypeActivity();
+ // If "Add account" option was previously selected by user, preserve it across
+ // orientation changes.
+ if (selectedAddNewAccount) {
+ mSelectedItemIndex = mAccounts.size();
+ }
+ if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
+ list.setItemChecked(mSelectedItemIndex, true);
+ if (Log.isLoggable(TAG, Log.VERBOSE)) {
+ Log.v(TAG, "List item " + mSelectedItemIndex + " should be selected");
}
- });
+ }
+
+ // Only enable "OK" button if something has been selected.
+ mOkButton = (Button) findViewById(android.R.id.button2);
+ mOkButton.setEnabled(mSelectedItemIndex != SELECTED_ITEM_NONE);
}
@Override
@@ -268,6 +306,28 @@ public class ChooseTypeAndAccountActivity extends Activity
if (mPendingRequest == REQUEST_ADD_ACCOUNT) {
outState.putParcelableArray(KEY_INSTANCE_STATE_EXISTING_ACCOUNTS, mExistingAccounts);
}
+ if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
+ if (mSelectedItemIndex == mAccounts.size()) {
+ outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, true);
+ } else {
+ outState.putBoolean(KEY_INSTANCE_STATE_SELECTED_ADD_ACCOUNT, false);
+ outState.putString(KEY_INSTANCE_STATE_SELECTED_ACCOUNT_NAME,
+ mAccounts.get(mSelectedItemIndex).name);
+ }
+ }
+ }
+
+ public void onCancelButtonClicked(View view) {
+ onBackPressed();
+ }
+
+ public void onOkButtonClicked(View view) {
+ if (mSelectedItemIndex == mAccounts.size()) {
+ // Selected "Add New Account" option
+ startChooseAccountTypeActivity();
+ } else if (mSelectedItemIndex != SELECTED_ITEM_NONE) {
+ onAccountSelected(mAccounts.get(mSelectedItemIndex));
+ }
}
// Called when the choose account type activity (for adding an account) returns.
@@ -287,9 +347,9 @@ public class ChooseTypeAndAccountActivity extends Activity
mPendingRequest = REQUEST_NULL;
if (resultCode == RESULT_CANCELED) {
- // if cancelling out of addAccount and the original state caused us to skip this,
+ // if canceling out of addAccount and the original state caused us to skip this,
// finish this activity
- if (mAccountInfos.isEmpty()) {
+ if (mAccounts.isEmpty()) {
setResult(Activity.RESULT_CANCELED);
finish();
}
@@ -360,6 +420,7 @@ public class ChooseTypeAndAccountActivity extends Activity
options, null /* activity */, this /* callback */, null /* Handler */);
}
+ @Override
public void run(final AccountManagerFuture<Bundle> accountManagerFuture) {
try {
final Bundle accountManagerResult = accountManagerFuture.getResult();
@@ -385,34 +446,9 @@ public class ChooseTypeAndAccountActivity extends Activity
finish();
}
- private Drawable getDrawableForType(
- final HashMap<String, AuthenticatorDescription> typeToAuthDescription,
- String accountType) {
- Drawable icon = null;
- if (typeToAuthDescription.containsKey(accountType)) {
- try {
- AuthenticatorDescription desc = typeToAuthDescription.get(accountType);
- Context authContext = createPackageContext(desc.packageName, 0);
- icon = authContext.getResources().getDrawable(desc.iconId);
- } catch (PackageManager.NameNotFoundException e) {
- // Nothing we can do much here, just log
- if (Log.isLoggable(TAG, Log.WARN)) {
- Log.w(TAG, "No icon name for account type " + accountType);
- }
- } catch (Resources.NotFoundException e) {
- // Nothing we can do much here, just log
- if (Log.isLoggable(TAG, Log.WARN)) {
- Log.w(TAG, "No icon resource for account type " + accountType);
- }
- }
- }
- return icon;
- }
-
- protected void onListItemClick(ListView l, View v, int position, long id) {
- AccountInfo accountInfo = mAccountInfos.get(position);
- Log.d(TAG, "selected account " + accountInfo.account);
- setResultAndFinish(accountInfo.account.name, accountInfo.account.type);
+ private void onAccountSelected(Account account) {
+ Log.d(TAG, "selected account " + account);
+ setResultAndFinish(account.name, account.type);
}
private void setResultAndFinish(final String accountName, final String accountType) {
@@ -444,58 +480,4 @@ public class ChooseTypeAndAccountActivity extends Activity
startActivityForResult(intent, REQUEST_CHOOSE_TYPE);
mPendingRequest = REQUEST_CHOOSE_TYPE;
}
-
- private static class AccountInfo {
- final Account account;
- final Drawable drawable;
- private final boolean checked;
-
- AccountInfo(Account account, Drawable drawable, boolean checked) {
- this.account = account;
- this.drawable = drawable;
- this.checked = checked;
- }
- }
-
- private static class ViewHolder {
- ImageView icon;
- TextView text;
- ImageView checkmark;
- }
-
- private static class AccountArrayAdapter extends ArrayAdapter<AccountInfo> {
- private LayoutInflater mLayoutInflater;
- private ArrayList<AccountInfo> mInfos;
-
- public AccountArrayAdapter(Context context, int textViewResourceId,
- ArrayList<AccountInfo> infos) {
- super(context, textViewResourceId, infos);
- mInfos = infos;
- mLayoutInflater = (LayoutInflater) context.getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
-
- if (convertView == null) {
- convertView = mLayoutInflater.inflate(R.layout.choose_selected_account_row, null);
- holder = new ViewHolder();
- holder.text = (TextView) convertView.findViewById(R.id.account_row_text);
- holder.icon = (ImageView) convertView.findViewById(R.id.account_row_icon);
- holder.checkmark = (ImageView) convertView.findViewById(R.id.account_row_checkmark);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
-
- holder.text.setText(mInfos.get(position).account.name);
- holder.icon.setImageDrawable(mInfos.get(position).drawable);
- final int displayCheckmark =
- mInfos.get(position).checked ? View.VISIBLE : View.INVISIBLE;
- holder.checkmark.setVisibility(displayCheckmark);
- return convertView;
- }
- }
}
diff --git a/core/java/android/accounts/GrantCredentialsPermissionActivity.java b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
index 4419c8c21fb0..8b01c6a48624 100644
--- a/core/java/android/accounts/GrantCredentialsPermissionActivity.java
+++ b/core/java/android/accounts/GrantCredentialsPermissionActivity.java
@@ -16,22 +16,22 @@
package android.accounts;
import android.app.Activity;
+import android.content.pm.RegisteredServicesCache;
+import android.content.res.Resources;
import android.os.Bundle;
-import android.os.RemoteException;
import android.widget.TextView;
import android.widget.LinearLayout;
-import android.widget.ImageView;
import android.view.View;
import android.view.LayoutInflater;
-import android.view.Window;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.content.pm.RegisteredServicesCache;
import android.text.TextUtils;
-import android.graphics.drawable.Drawable;
import com.android.internal.R;
+import java.io.IOException;
+import java.net.Authenticator;
+
/**
* @hide
*/
@@ -48,7 +48,6 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
private int mUid;
private Bundle mResultBundle = null;
protected LayoutInflater mInflater;
- private final AccountManagerService accountManagerService = AccountManagerService.getSingleton();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -81,7 +80,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
String accountTypeLabel;
try {
- accountTypeLabel = accountManagerService.getAccountLabel(mAccount.type);
+ accountTypeLabel = getAccountLabel(mAccount);
} catch (IllegalArgumentException e) {
// label or resource was missing. abort the activity.
setResult(Activity.RESULT_CANCELED);
@@ -92,28 +91,27 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
final TextView authTokenTypeView = (TextView) findViewById(R.id.authtoken_type);
authTokenTypeView.setVisibility(View.GONE);
- /** Handles the responses from the AccountManager */
- IAccountManagerResponse response = new IAccountManagerResponse.Stub() {
- public void onResult(Bundle bundle) {
- final String authTokenLabel =
- bundle.getString(AccountManager.KEY_AUTH_TOKEN_LABEL);
- if (!TextUtils.isEmpty(authTokenLabel)) {
- runOnUiThread(new Runnable() {
- public void run() {
- if (!isFinishing()) {
- authTokenTypeView.setText(authTokenLabel);
- authTokenTypeView.setVisibility(View.VISIBLE);
+ final AccountManagerCallback<String> callback = new AccountManagerCallback<String>() {
+ public void run(AccountManagerFuture<String> future) {
+ try {
+ final String authTokenLabel = future.getResult();
+ if (!TextUtils.isEmpty(authTokenLabel)) {
+ runOnUiThread(new Runnable() {
+ public void run() {
+ if (!isFinishing()) {
+ authTokenTypeView.setText(authTokenLabel);
+ authTokenTypeView.setVisibility(View.VISIBLE);
+ }
}
- }
- });
+ });
+ }
+ } catch (OperationCanceledException e) {
+ } catch (IOException e) {
+ } catch (AuthenticatorException e) {
}
}
-
- public void onError(int code, String message) {
- }
};
-
- accountManagerService.getAuthTokenLabel(response, mAccount, mAuthTokenType, mUid);
+ AccountManager.get(this).getAuthTokenLabel(mAccount.type, mAuthTokenType, callback, null);
findViewById(R.id.allow_button).setOnClickListener(this);
findViewById(R.id.deny_button).setOnClickListener(this);
@@ -134,6 +132,24 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
((TextView) findViewById(R.id.account_type)).setText(accountTypeLabel);
}
+ private String getAccountLabel(Account account) {
+ final AuthenticatorDescription[] authenticatorTypes =
+ AccountManager.get(this).getAuthenticatorTypes();
+ for (int i = 0, N = authenticatorTypes.length; i < N; i++) {
+ final AuthenticatorDescription desc = authenticatorTypes[i];
+ if (desc.type.equals(account.type)) {
+ try {
+ return createPackageContext(desc.packageName, 0).getString(desc.labelId);
+ } catch (PackageManager.NameNotFoundException e) {
+ return account.type;
+ } catch (Resources.NotFoundException e) {
+ return account.type;
+ }
+ }
+ }
+ return account.type;
+ }
+
private View newPackageView(String packageLabel) {
View view = mInflater.inflate(R.layout.permissions_package_list_item, null);
((TextView) view.findViewById(R.id.package_label)).setText(packageLabel);
@@ -143,7 +159,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
public void onClick(View v) {
switch (v.getId()) {
case R.id.allow_button:
- accountManagerService.grantAppPermission(mAccount, mAuthTokenType, mUid);
+ AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, true);
Intent result = new Intent();
result.putExtra("retry", true);
setResult(RESULT_OK, result);
@@ -151,7 +167,7 @@ public class GrantCredentialsPermissionActivity extends Activity implements View
break;
case R.id.deny_button:
- accountManagerService.revokeAppPermission(mAccount, mAuthTokenType, mUid);
+ AccountManager.get(this).updateAppPermission(mAccount, mAuthTokenType, mUid, false);
setResult(RESULT_CANCELED);
break;
}
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index 36a5653bb998..60073217c3f4 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -41,6 +41,7 @@ interface IAccountManager {
void setPassword(in Account account, String password);
void clearPassword(in Account account);
void setUserData(in Account account, String key, String value);
+ void updateAppPermission(in Account account, String authTokenType, int uid, boolean value);
void getAuthToken(in IAccountManagerResponse response, in Account account,
String authTokenType, boolean notifyOnAuthFailure, boolean expectActivityLaunch,
@@ -54,4 +55,6 @@ interface IAccountManager {
boolean expectActivityLaunch);
void confirmCredentials(in IAccountManagerResponse response, in Account account,
in Bundle options, boolean expectActivityLaunch);
+ void getAuthTokenLabel(in IAccountManagerResponse response, String accountType,
+ String authTokenType);
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 17b19626c2e2..92b6f7216c00 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1360,6 +1360,13 @@ public class ActivityManager {
public int lastTrimLevel;
/**
+ * Constant for {@link #importance}: this is a persistent process.
+ * Only used when reporting to process observers.
+ * @hide
+ */
+ public static final int IMPORTANCE_PERSISTENT = 50;
+
+ /**
* Constant for {@link #importance}: this process is running the
* foreground UI.
*/
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index a457e3c97a50..7242029a7c03 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -4516,7 +4516,7 @@ public final class ActivityThread {
boolean noisy, boolean noReleaseNeeded, boolean stable) {
ContentProvider localProvider = null;
IContentProvider provider;
- if (holder == null) {
+ if (holder == null || holder.provider == null) {
if (DEBUG_PROVIDER || noisy) {
Slog.d(TAG, "Loading provider " + info.authority + ": "
+ info.name);
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 6058bdc7ba41..03ee41996a4a 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -1568,8 +1568,17 @@ final class FragmentManagerImpl extends FragmentManager {
for (int i=0; i<N; i++) {
Fragment f = mActive.get(i);
if (f != null) {
+ if (f.mIndex < 0) {
+ String msg = "Failure saving state: active " + f
+ + " has cleared index: " + f.mIndex;
+ Slog.e(TAG, msg);
+ dump(" ", null, new PrintWriter(new LogWriter(
+ Log.ERROR, TAG, Log.LOG_ID_SYSTEM)), new String[] { });
+ throw new IllegalStateException(msg);
+ }
+
haveFragments = true;
-
+
FragmentState fs = new FragmentState(f);
active[i] = fs;
@@ -1621,6 +1630,14 @@ final class FragmentManagerImpl extends FragmentManager {
added = new int[N];
for (int i=0; i<N; i++) {
added[i] = mAdded.get(i).mIndex;
+ if (added[i] < 0) {
+ String msg = "Failure saving state: active " + mAdded.get(i)
+ + " has cleared index: " + added[i];
+ Slog.e(TAG, msg);
+ dump(" ", null, new PrintWriter(new LogWriter(
+ Log.ERROR, TAG, Log.LOG_ID_SYSTEM)), new String[] { });
+ throw new IllegalStateException(msg);
+ }
if (DEBUG) Log.v(TAG, "saveAllState: adding fragment #" + i
+ ": " + mAdded.get(i));
}
diff --git a/core/java/android/app/IProcessObserver.aidl b/core/java/android/app/IProcessObserver.aidl
index 209429439120..e587912feaa5 100644
--- a/core/java/android/app/IProcessObserver.aidl
+++ b/core/java/android/app/IProcessObserver.aidl
@@ -20,6 +20,7 @@ package android.app;
oneway interface IProcessObserver {
void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities);
+ void onImportanceChanged(int pid, int uid, int importance);
void onProcessDied(int pid, int uid);
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 3ced82bdfd02..036008bea53d 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1379,7 +1379,7 @@ public class Notification implements Parcelable
}
}
- private RemoteViews applyStandardTemplate(int resId) {
+ private RemoteViews applyStandardTemplate(int resId, boolean fitIn1U) {
RemoteViews contentView = new RemoteViews(mContext.getPackageName(), resId);
boolean showLine3 = false;
boolean showLine2 = false;
@@ -1432,7 +1432,6 @@ public class Notification implements Parcelable
contentView.setTextViewText(R.id.text, mSubText);
if (mContentText != null) {
contentView.setTextViewText(R.id.text2, mContentText);
- // need to shrink all the type to make sure everything fits
contentView.setViewVisibility(R.id.text2, View.VISIBLE);
showLine2 = true;
} else {
@@ -1450,10 +1449,13 @@ public class Notification implements Parcelable
}
}
if (showLine2) {
- final Resources res = mContext.getResources();
- final float subTextSize = res.getDimensionPixelSize(
- R.dimen.notification_subtext_size);
- contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX, subTextSize);
+ if (fitIn1U) {
+ // need to shrink all the type to make sure everything fits
+ final Resources res = mContext.getResources();
+ final float subTextSize = res.getDimensionPixelSize(
+ R.dimen.notification_subtext_size);
+ contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX, subTextSize);
+ }
// vertical centering
contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);
}
@@ -1470,16 +1472,18 @@ public class Notification implements Parcelable
}
}
contentView.setViewVisibility(R.id.line3, showLine3 ? View.VISIBLE : View.GONE);
+ contentView.setViewVisibility(R.id.overflow_divider, showLine3 ? View.VISIBLE : View.GONE);
return contentView;
}
private RemoteViews applyStandardTemplateWithActions(int layoutId) {
- RemoteViews big = applyStandardTemplate(layoutId);
+ RemoteViews big = applyStandardTemplate(layoutId, false);
int N = mActions.size();
if (N > 0) {
// Log.d("Notification", "has actions: " + mContentText);
big.setViewVisibility(R.id.actions, View.VISIBLE);
+ big.setViewVisibility(R.id.action_divider, View.VISIBLE);
if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS;
big.removeAllViews(R.id.actions);
for (int i=0; i<N; i++) {
@@ -1495,7 +1499,7 @@ public class Notification implements Parcelable
if (mContentView != null) {
return mContentView;
} else {
- return applyStandardTemplate(R.layout.notification_template_base); // no more special large_icon flavor
+ return applyStandardTemplate(R.layout.notification_template_base, true); // no more special large_icon flavor
}
}
@@ -1506,7 +1510,7 @@ public class Notification implements Parcelable
if (mContentView == null) {
return applyStandardTemplate(mLargeIcon == null
? R.layout.status_bar_latest_event_ticker
- : R.layout.status_bar_latest_event_ticker_large_icon);
+ : R.layout.status_bar_latest_event_ticker_large_icon, true);
} else {
return null;
}
@@ -1655,12 +1659,9 @@ public class Notification implements Parcelable
contentView.setViewVisibility(R.id.line1, View.VISIBLE);
}
+ // The last line defaults to the content text or subtext, but can be replaced by mSummaryText
if (mSummaryText != null && !mSummaryText.equals("")) {
- contentView.setViewVisibility(R.id.overflow_title, View.VISIBLE);
- contentView.setTextViewText(R.id.overflow_title, mSummaryText);
- contentView.setViewVisibility(R.id.line3, View.GONE);
- } else {
- contentView.setViewVisibility(R.id.overflow_title, View.GONE);
+ contentView.setTextViewText(R.id.text, mSummaryText);
contentView.setViewVisibility(R.id.line3, View.VISIBLE);
}
@@ -1801,6 +1802,8 @@ public class Notification implements Parcelable
}
private RemoteViews makeBigContentView() {
+ // Remove the content text so line3 disappears entirely
+ mBuilder.mContentText = null;
RemoteViews contentView = getStandardView(R.layout.notification_template_big_text);
contentView.setTextViewText(R.id.big_text, mBigText);
contentView.setViewVisibility(R.id.big_text, View.VISIBLE);
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index ad52e13873b0..e180df435de0 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -935,7 +935,17 @@ public class PackageParser {
com.android.internal.R.styleable.AndroidManifest_installLocation,
PARSE_DEFAULT_INSTALL_LOCATION);
pkg.applicationInfo.installLocation = pkg.installLocation;
-
+
+ /* Set the global "forward lock" flag */
+ if ((flags & PARSE_FORWARD_LOCK) != 0) {
+ pkg.applicationInfo.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
+ }
+
+ /* Set the global "on SD card" flag */
+ if ((flags & PARSE_ON_SDCARD) != 0) {
+ pkg.applicationInfo.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
+ }
+
// Resource boolean are -1, so 1 means we don't know the value.
int supportsSmallScreens = 1;
int supportsNormalScreens = 1;
@@ -1726,14 +1736,6 @@ public class PackageParser {
}
}
- if ((flags & PARSE_FORWARD_LOCK) != 0) {
- ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK;
- }
-
- if ((flags & PARSE_ON_SDCARD) != 0) {
- ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE;
- }
-
if (sa.getBoolean(
com.android.internal.R.styleable.AndroidManifestApplication_debuggable,
false)) {
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index 89068e79f16e..4d9077fbe01f 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -736,8 +736,8 @@ public class Camera {
return;
case CAMERA_MSG_PREVIEW_FRAME:
- if (mPreviewCallback != null) {
- PreviewCallback cb = mPreviewCallback;
+ PreviewCallback pCb = mPreviewCallback;
+ if (pCb != null) {
if (mOneShot) {
// Clear the callback variable before the callback
// in case the app calls setPreviewCallback from
@@ -749,7 +749,7 @@ public class Camera {
// Set to oneshot mode again.
setHasPreviewCallback(true, false);
}
- cb.onPreviewFrame((byte[])msg.obj, mCamera);
+ pCb.onPreviewFrame((byte[])msg.obj, mCamera);
}
return;
@@ -1059,6 +1059,7 @@ public class Camera {
}
native_takePicture(msgType);
+ mFaceDetectionRunning = false;
}
/**
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 2782dcaab11c..e8f87bb4bc33 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -24,6 +24,7 @@ import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
+import android.content.ContextWrapper;
import android.content.CursorEntityIterator;
import android.content.Entity;
import android.content.EntityIterator;
@@ -7711,9 +7712,19 @@ public final class ContactsContract {
*/
public static void showQuickContact(Context context, Rect target, Uri lookupUri, int mode,
String[] excludeMimes) {
+ // When launching from an Activiy, we don't want to start a new task, but otherwise
+ // we *must* start a new task. (Otherwise startActivity() would crash.)
+ Context actualContext = context;
+ while ((actualContext instanceof ContextWrapper)
+ && !(actualContext instanceof Activity)) {
+ actualContext = ((ContextWrapper) actualContext).getBaseContext();
+ }
+ final int intentFlags = (actualContext instanceof Activity)
+ ? Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
+ : Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK;
+
// Launch pivot dialog through intent for now
- final Intent intent = new Intent(ACTION_QUICK_CONTACT)
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
+ final Intent intent = new Intent(ACTION_QUICK_CONTACT).addFlags(intentFlags);
intent.setData(lookupUri);
intent.setSourceBounds(target);
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 8b7ee0e324ff..8630204a7983 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2886,6 +2886,15 @@ public final class Settings {
"enabled_accessibility_services";
/**
+ * List of the accessibility services to which the user has graned
+ * permission to put the device into touch exploration mode.
+ *
+ * @hide
+ */
+ public static final String TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES =
+ "touch_exploration_granted_accessibility_services";
+
+ /**
* Whether to speak passwords while in accessibility mode.
*/
public static final String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
@@ -4292,6 +4301,7 @@ public final class Settings {
ACCESSIBILITY_SCRIPT_INJECTION,
BACKUP_AUTO_RESTORE,
ENABLED_ACCESSIBILITY_SERVICES,
+ TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
TOUCH_EXPLORATION_ENABLED,
ACCESSIBILITY_ENABLED,
ACCESSIBILITY_SPEAK_PASSWORD,
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java
index 300bc686eddb..08a99d2fb9e6 100644
--- a/core/java/android/server/BluetoothA2dpService.java
+++ b/core/java/android/server/BluetoothA2dpService.java
@@ -33,7 +33,11 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
+import android.os.Handler;
+import android.os.Message;
import android.os.ParcelUuid;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
import android.provider.Settings;
import android.util.Log;
@@ -65,6 +69,10 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
private final BluetoothAdapter mAdapter;
private int mTargetA2dpState;
private BluetoothDevice mPlayingA2dpDevice;
+ private IntentBroadcastHandler mIntentBroadcastHandler;
+ private final WakeLock mWakeLock;
+
+ private static final int MSG_CONNECTION_STATE_CHANGED = 0;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
@@ -131,6 +139,11 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
public BluetoothA2dpService(Context context, BluetoothService bluetoothService) {
mContext = context;
+ PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BluetoothA2dpService");
+
+ mIntentBroadcastHandler = new IntentBroadcastHandler();
+
mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
mBluetoothService = bluetoothService;
@@ -514,17 +527,15 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
adjustOtherSinkPriorities(device);
}
- Intent intent = new Intent(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
- intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState);
- intent.putExtra(BluetoothProfile.EXTRA_STATE, state);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+ int delay = mAudioManager.setBluetoothA2dpDeviceConnectionState(device, state);
- if (DBG) log("A2DP state : device: " + device + " State:" + prevState + "->" + state);
-
- mBluetoothService.sendConnectionStateChange(device, BluetoothProfile.A2DP, state,
- prevState);
+ mWakeLock.acquire();
+ mIntentBroadcastHandler.sendMessageDelayed(mIntentBroadcastHandler.obtainMessage(
+ MSG_CONNECTION_STATE_CHANGED,
+ prevState,
+ state,
+ device),
+ delay);
}
}
@@ -586,6 +597,34 @@ public class BluetoothA2dpService extends IBluetoothA2dp.Stub {
}
}
+ /** Handles A2DP connection state change intent broadcasts. */
+ private class IntentBroadcastHandler extends Handler {
+
+ private void onConnectionStateChanged(BluetoothDevice device, int prevState, int state) {
+ Intent intent = new Intent(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
+ intent.putExtra(BluetoothDevice.EXTRA_DEVICE, device);
+ intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState);
+ intent.putExtra(BluetoothProfile.EXTRA_STATE, state);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
+ mContext.sendBroadcast(intent, BLUETOOTH_PERM);
+
+ if (DBG) log("A2DP state : device: " + device + " State:" + prevState + "->" + state);
+
+ mBluetoothService.sendConnectionStateChange(device, BluetoothProfile.A2DP, state,
+ prevState);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_CONNECTION_STATE_CHANGED:
+ onConnectionStateChanged((BluetoothDevice) msg.obj, msg.arg1, msg.arg2);
+ mWakeLock.release();
+ break;
+ }
+ }
+ }
+
@Override
protected synchronized void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, TAG);
diff --git a/core/java/android/view/DisplayList.java b/core/java/android/view/DisplayList.java
index da666b5ecadb..a42e15677c39 100644
--- a/core/java/android/view/DisplayList.java
+++ b/core/java/android/view/DisplayList.java
@@ -62,6 +62,13 @@ public abstract class DisplayList {
public static final int STATUS_INVOKE = 0x2;
/**
+ * Indicates that the display list performed GL drawing operations.
+ *
+ * @see HardwareCanvas#drawDisplayList(DisplayList, android.graphics.Rect, int)
+ */
+ public static final int STATUS_DREW = 0x4;
+
+ /**
* Starts recording the display list. All operations performed on the
* returned canvas are recorded and stored in this display list.
*
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index f986d15144f2..7e86ea3a542e 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -457,9 +457,11 @@ public abstract class HardwareRenderer {
* @param functor The native functor to insert in the execution queue.
*
* @see HardwareCanvas#callDrawGLFunction(int)
- * @see #detachFunctor(int)
+ * @see #detachFunctor(int)
+ *
+ * @return true if the functor was attached successfully
*/
- abstract void attachFunctor(View.AttachInfo attachInfo, int functor);
+ abstract boolean attachFunctor(View.AttachInfo attachInfo, int functor);
/**
* Initializes the hardware renderer for the specified surface and setup the
@@ -1102,6 +1104,7 @@ public abstract class HardwareRenderer {
onPreDraw(dirty);
+ int status = DisplayList.STATUS_DONE;
int saveCount = canvas.save();
callbacks.onHardwarePreDraw(canvas);
@@ -1135,7 +1138,7 @@ public abstract class HardwareRenderer {
drawDisplayListStartTime = System.nanoTime();
}
- int status = canvas.drawDisplayList(displayList, mRedrawClip,
+ status = canvas.drawDisplayList(displayList, mRedrawClip,
DisplayList.FLAG_CLIP_CHILDREN);
if (mProfileEnabled) {
@@ -1171,22 +1174,25 @@ public abstract class HardwareRenderer {
onPostDraw();
attachInfo.mIgnoreDirtyState = false;
+
+ if ((status & DisplayList.STATUS_DREW) == DisplayList.STATUS_DREW) {
- long eglSwapBuffersStartTime = 0;
- if (mProfileEnabled) {
- eglSwapBuffersStartTime = System.nanoTime();
- }
-
- sEgl.eglSwapBuffers(sEglDisplay, mEglSurface);
-
- if (mProfileEnabled) {
- long now = System.nanoTime();
- float total = (now - eglSwapBuffersStartTime) * 0.000001f;
- mProfileData[mProfileCurrentFrame + 2] = total;
+ long eglSwapBuffersStartTime = 0;
+ if (mProfileEnabled) {
+ eglSwapBuffersStartTime = System.nanoTime();
+ }
+
+ sEgl.eglSwapBuffers(sEglDisplay, mEglSurface);
+
+ if (mProfileEnabled) {
+ long now = System.nanoTime();
+ float total = (now - eglSwapBuffersStartTime) * 0.000001f;
+ mProfileData[mProfileCurrentFrame + 2] = total;
+ }
+
+ checkEglErrors();
}
- checkEglErrors();
-
return dirty == null;
}
}
@@ -1227,11 +1233,13 @@ public abstract class HardwareRenderer {
}
@Override
- void attachFunctor(View.AttachInfo attachInfo, int functor) {
+ boolean attachFunctor(View.AttachInfo attachInfo, int functor) {
if (mCanvas != null) {
mCanvas.attachFunctor(functor);
scheduleFunctors(attachInfo);
+ return true;
}
+ return false;
}
/**
diff --git a/core/java/android/view/InputDevice.java b/core/java/android/view/InputDevice.java
index 2ea03604315d..3bb9c01d3c3e 100755
--- a/core/java/android/view/InputDevice.java
+++ b/core/java/android/view/InputDevice.java
@@ -459,6 +459,18 @@ public final class InputDevice implements Parcelable {
}
/**
+ * Returns true if the device is a full keyboard.
+ *
+ * @return True if the device is a full keyboard.
+ *
+ * @hide
+ */
+ public boolean isFullKeyboard() {
+ return (mSources & SOURCE_KEYBOARD) == SOURCE_KEYBOARD
+ && mKeyboardType == KEYBOARD_TYPE_ALPHABETIC;
+ }
+
+ /**
* Gets the name of this input device.
* @return The input device name.
*/
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 551b6cc648c4..3138692deb5c 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -670,10 +670,11 @@ public final class ViewRootImpl implements ViewParent,
}
}
- public void attachFunctor(int functor) {
+ public boolean attachFunctor(int functor) {
if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) {
- mAttachInfo.mHardwareRenderer.attachFunctor(mAttachInfo, functor);
+ return mAttachInfo.mHardwareRenderer.attachFunctor(mAttachInfo, functor);
}
+ return false;
}
public void detachFunctor(int functor) {
diff --git a/core/java/android/view/VolumePanel.java b/core/java/android/view/VolumePanel.java
index 78984e08ff58..5ffc2c36d9d4 100644
--- a/core/java/android/view/VolumePanel.java
+++ b/core/java/android/view/VolumePanel.java
@@ -437,8 +437,10 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
public void postVolumeChanged(int streamType, int flags) {
if (hasMessages(MSG_VOLUME_CHANGED)) return;
- if (mStreamControls == null) {
- createSliders();
+ synchronized (this) {
+ if (mStreamControls == null) {
+ createSliders();
+ }
}
removeMessages(MSG_FREE_RESOURCES);
obtainMessage(MSG_VOLUME_CHANGED, streamType, flags).sendToTarget();
@@ -450,8 +452,10 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
public void postMuteChanged(int streamType, int flags) {
if (hasMessages(MSG_VOLUME_CHANGED)) return;
- if (mStreamControls == null) {
- createSliders();
+ synchronized (this) {
+ if (mStreamControls == null) {
+ createSliders();
+ }
}
removeMessages(MSG_FREE_RESOURCES);
obtainMessage(MSG_MUTE_CHANGED, streamType, flags).sendToTarget();
@@ -471,10 +475,12 @@ public class VolumePanel extends Handler implements OnSeekBarChangeListener, Vie
if (LOGD) Log.d(TAG, "onVolumeChanged(streamType: " + streamType + ", flags: " + flags + ")");
if ((flags & AudioManager.FLAG_SHOW_UI) != 0) {
- if (mActiveStreamType != streamType) {
- reorderSliders(streamType);
+ synchronized (this) {
+ if (mActiveStreamType != streamType) {
+ reorderSliders(streamType);
+ }
+ onShowVolumeChanged(streamType, flags);
}
- onShowVolumeChanged(streamType, flags);
}
if ((flags & AudioManager.FLAG_PLAY_SOUND) != 0 && ! mRingIsSilent) {
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 65fd59a9f369..d1da53be517e 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -7827,15 +7827,18 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
mSendScrollEvent = true;
int functor = 0;
+ boolean forceInval = isPictureAfterFirstLayout;
ViewRootImpl viewRoot = mWebView.getViewRootImpl();
if (mWebView.isHardwareAccelerated() && viewRoot != null) {
functor = nativeGetDrawGLFunction(mNativeClass);
if (functor != 0) {
- viewRoot.attachFunctor(functor);
+ // force an invalidate if functor attach not successful
+ forceInval |= !viewRoot.attachFunctor(functor);
}
}
if (functor == 0
+ || forceInval
|| mWebView.getLayerType() != View.LAYER_TYPE_NONE) {
// invalidate the screen so that the next repaint will show new content
// TODO: partial invalidate
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 9abe72b25558..edffb5e9c7aa 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -57,7 +57,6 @@ import android.view.ViewConfiguration;
import android.view.ViewDebug;
import android.view.ViewGroup;
import android.view.ViewParent;
-import android.view.ViewRootImpl;
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -1331,43 +1330,42 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
@Override
public void addFocusables(ArrayList<View> views, int direction, int focusableMode) {
- if ((focusableMode & FOCUSABLES_ACCESSIBILITY) == FOCUSABLES_ACCESSIBILITY
- && (direction == ACCESSIBILITY_FOCUS_FORWARD
- || direction == ACCESSIBILITY_FOCUS_BACKWARD)) {
- if (canTakeAccessibilityFocusFromHover()) {
- views.add(this);
+ if ((focusableMode & FOCUSABLES_ACCESSIBILITY) == FOCUSABLES_ACCESSIBILITY) {
+ switch(direction) {
+ case ACCESSIBILITY_FOCUS_BACKWARD: {
+ View focusable = (getChildCount() > 0) ? getChildAt(getChildCount() - 1) : this;
+ if (focusable.canTakeAccessibilityFocusFromHover()) {
+ views.add(focusable);
+ }
+ } return;
+ case ACCESSIBILITY_FOCUS_FORWARD: {
+ if (canTakeAccessibilityFocusFromHover()) {
+ views.add(this);
+ }
+ } return;
}
- } else {
super.addFocusables(views, direction, focusableMode);
}
}
@Override
public View focusSearch(int direction) {
- return focusSearch(null, direction);
+ return focusSearch(this, direction);
}
@Override
public View focusSearch(View focused, int direction) {
switch (direction) {
case ACCESSIBILITY_FOCUS_FORWARD: {
- ViewRootImpl viewRootImpl = getViewRootImpl();
- if (viewRootImpl == null) {
- return null;
- }
- View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
- if (currentFocus == null) {
- return super.focusSearch(this, direction);
- }
- // If we have the focus try giving it to the first child.
- if (currentFocus == this) {
+ // If we are the focused view try giving it to the first child.
+ if (focused == this) {
if (getChildCount() > 0) {
return getChildAt(0);
}
return super.focusSearch(this, direction);
}
- // Find the item that has accessibility focus.
- final int currentPosition = getPositionForView(currentFocus);
+ // Find the item that has the focused view.
+ final int currentPosition = getPositionForView(focused);
if (currentPosition < 0 || currentPosition >= getCount()) {
return super.focusSearch(this, direction);
}
@@ -1376,9 +1374,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
if (currentItem instanceof ViewGroup) {
ViewGroup currentItemGroup = (ViewGroup) currentItem;
View nextFocus = FocusFinder.getInstance().findNextFocus(currentItemGroup,
- currentFocus, direction);
+ focused, direction);
if (nextFocus != null && nextFocus != currentItemGroup
- && nextFocus != currentFocus) {
+ && nextFocus != focused) {
return nextFocus;
}
}
@@ -1386,50 +1384,54 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
final int nextPosition = currentPosition - getFirstVisiblePosition() + 1;
if (nextPosition < getChildCount()) {
return getChildAt(nextPosition);
- } else {
- return super.focusSearch(this, direction);
}
+ // No next item start searching from the list.
+ return super.focusSearch(this, direction);
}
case ACCESSIBILITY_FOCUS_BACKWARD: {
- ViewRootImpl viewRootImpl = getViewRootImpl();
- if (viewRootImpl == null) {
- return null;
- }
- View currentFocus = viewRootImpl.getAccessibilityFocusedHost();
- if (currentFocus == null) {
- return super.focusSearch(this, direction);
- }
- // If we have the focus do a generic search.
- if (currentFocus == this) {
- final int lastChildIndex = getChildCount() - 1;
- if (lastChildIndex >= 0) {
- return getChildAt(lastChildIndex);
+ // If we are the focused search from the view that is
+ // as closer to the bottom as possible.
+ if (focused == this) {
+ final int childCount = getChildCount();
+ if (childCount > 0) {
+ return super.focusSearch(getChildAt(childCount - 1), direction);
}
return super.focusSearch(this, direction);
}
- // Find the item that has accessibility focus.
- final int currentPosition = getPositionForView(currentFocus);
+ // Find the item that has the focused view.
+ final int currentPosition = getPositionForView(focused);
if (currentPosition < 0 || currentPosition >= getCount()) {
return super.focusSearch(this, direction);
}
- // Try to advance focus in the current item.
+
View currentItem = getChildAt(currentPosition - getFirstVisiblePosition());
+
+ // If a list item is the focused view we try to find a view
+ // in the previous item since in reverse the item contents
+ // get accessibility focus before the item itself.
+ if (currentItem == focused) {
+ // This list gets accessibility focus after the last first item.
+ final int previoustPosition = currentPosition - getFirstVisiblePosition() - 1;
+ if (previoustPosition < 0) {
+ return this;
+ }
+ currentItem = getChildAt(previoustPosition);
+ focused = null;
+ }
+
+ // Search for into the item.
if (currentItem instanceof ViewGroup) {
ViewGroup currentItemGroup = (ViewGroup) currentItem;
View nextFocus = FocusFinder.getInstance().findNextFocus(currentItemGroup,
- currentFocus, direction);
+ focused, direction);
if (nextFocus != null && nextFocus != currentItemGroup
- && nextFocus != currentFocus) {
+ && nextFocus != focused) {
return nextFocus;
}
}
- // Try to move focus to the previous item.
- final int nextPosition = currentPosition - getFirstVisiblePosition() - 1;
- if (nextPosition >= 0) {
- return getChildAt(nextPosition);
- } else {
- return super.focusSearch(this, direction);
- }
+
+ // If not item content wants focus we give it to the item.
+ return currentItem;
}
}
return super.focusSearch(focused, direction);
@@ -2283,14 +2285,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
final ListAdapter adapter = getAdapter();
if ((position == INVALID_POSITION) || (adapter == null)) {
- // Cannot perform actions on invalid items.
- info.setEnabled(false);
return;
}
if (!isEnabled() || !adapter.isEnabled(position)) {
- // Cannot perform actions on invalid items.
- info.setEnabled(false);
return;
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 16490e8a0c01..c29dd585ba1b 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1416,6 +1416,7 @@ public class Editor {
}
Layout layout = mTextView.getLayout();
+ Layout hintLayout = mTextView.getHintLayout();
final int offset = mTextView.getSelectionStart();
final int line = layout.getLineForOffset(offset);
final int top = layout.getLineTop(line);
@@ -1429,13 +1430,23 @@ public class Editor {
middle = (top + bottom) >> 1;
}
- updateCursorPosition(0, top, middle, layout.getPrimaryHorizontal(offset));
+ updateCursorPosition(0, top, middle, getPrimaryHorizontal(layout, hintLayout, offset));
if (mCursorCount == 2) {
updateCursorPosition(1, middle, bottom, layout.getSecondaryHorizontal(offset));
}
}
+ private float getPrimaryHorizontal(Layout layout, Layout hintLayout, int offset) {
+ if (TextUtils.isEmpty(layout.getText()) &&
+ hintLayout != null &&
+ !TextUtils.isEmpty(hintLayout.getText())) {
+ return hintLayout.getPrimaryHorizontal(offset);
+ } else {
+ return layout.getPrimaryHorizontal(offset);
+ }
+ }
+
/**
* @return true if the selection mode was actually started.
*/
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 3e2d43a3f654..131b0754e4cb 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -1312,6 +1312,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener
}
/**
+ * @return the Layout that is currently being used to display the hint text.
+ * This can be null.
+ */
+ final Layout getHintLayout() {
+ return mHintLayout;
+ }
+
+ /**
* @return the current key listener for this TextView.
* This will frequently be null for non-EditText TextViews.
*
diff --git a/core/java/com/android/internal/app/ActionBarImpl.java b/core/java/com/android/internal/app/ActionBarImpl.java
index 234cb71cedbb..46478ca707d3 100644
--- a/core/java/com/android/internal/app/ActionBarImpl.java
+++ b/core/java/com/android/internal/app/ActionBarImpl.java
@@ -673,26 +673,29 @@ public class ActionBarImpl extends ActionBar {
if (mCurWindowVisibility == View.VISIBLE && (mShowHideAnimationEnabled
|| fromSystem)) {
- mTopVisibilityView.setAlpha(0);
- mTopVisibilityView.setTranslationY(-mTopVisibilityView.getHeight());
+ mTopVisibilityView.setTranslationY(0); // because we're about to ask its window loc
+ float startingY = -mTopVisibilityView.getHeight();
+ if (fromSystem) {
+ int topLeft[] = {0, 0};
+ mTopVisibilityView.getLocationInWindow(topLeft);
+ startingY -= topLeft[1];
+ }
+ mTopVisibilityView.setTranslationY(startingY);
AnimatorSet anim = new AnimatorSet();
- AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mTopVisibilityView, "alpha", 1));
- b.with(ObjectAnimator.ofFloat(mTopVisibilityView, "translationY", 0));
+ AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mTopVisibilityView,
+ "translationY", 0));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
- -mTopVisibilityView.getHeight(), 0));
+ startingY, 0));
}
if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) {
- mSplitView.setAlpha(0);
mSplitView.setTranslationY(mSplitView.getHeight());
mSplitView.setVisibility(View.VISIBLE);
- b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1));
b.with(ObjectAnimator.ofFloat(mSplitView, "translationY", 0));
}
anim.setInterpolator(AnimationUtils.loadInterpolator(mContext,
- com.android.internal.R.interpolator.decelerate_quad));
- anim.setDuration(mContext.getResources().getInteger(
- com.android.internal.R.integer.config_mediumAnimTime));
+ com.android.internal.R.interpolator.decelerate_cubic));
+ anim.setDuration(250);
// If this is being shown from the system, add a small delay.
// This is because we will also be animating in the status bar,
// and these two elements can't be done in lock-step. So we give
@@ -700,9 +703,6 @@ public class ActionBarImpl extends ActionBar {
// the action bar animates. (This corresponds to the corresponding
// case when hiding, where the status bar has a small delay before
// starting.)
- if (fromSystem) {
- anim.setStartDelay(100);
- }
anim.addListener(mShowListener);
mCurrentShowAnim = anim;
anim.start();
@@ -734,23 +734,26 @@ public class ActionBarImpl extends ActionBar {
mTopVisibilityView.setAlpha(1);
mContainerView.setTransitioning(true);
AnimatorSet anim = new AnimatorSet();
- AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mTopVisibilityView, "alpha", 0));
- b.with(ObjectAnimator.ofFloat(mTopVisibilityView, "translationY",
- -mTopVisibilityView.getHeight()));
+ float endingY = -mTopVisibilityView.getHeight();
+ if (fromSystem) {
+ int topLeft[] = {0, 0};
+ mTopVisibilityView.getLocationInWindow(topLeft);
+ endingY -= topLeft[1];
+ }
+ AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mTopVisibilityView,
+ "translationY", endingY));
if (mContentView != null) {
b.with(ObjectAnimator.ofFloat(mContentView, "translationY",
- 0, -mTopVisibilityView.getHeight()));
+ 0, endingY));
}
if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) {
mSplitView.setAlpha(1);
- b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0));
b.with(ObjectAnimator.ofFloat(mSplitView, "translationY",
mSplitView.getHeight()));
}
anim.setInterpolator(AnimationUtils.loadInterpolator(mContext,
- com.android.internal.R.interpolator.accelerate_quad));
- anim.setDuration(mContext.getResources().getInteger(
- com.android.internal.R.integer.config_mediumAnimTime));
+ com.android.internal.R.interpolator.accelerate_cubic));
+ anim.setDuration(250);
anim.addListener(mHideListener);
mCurrentShowAnim = anim;
anim.start();
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index f9ef3c53644f..b2c3091b28cd 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -419,6 +419,7 @@ public class MultiWaveView extends View {
"y", 0,
"onUpdate", mUpdateListener,
"onComplete", finishListener));
+ mHandleAnimations.start();
}
/**
@@ -519,12 +520,15 @@ public class MultiWaveView extends View {
// Inform listener of any active targets. Typically only one will be active.
deactivateHandle(RETURN_TO_HOME_DURATION, RETURN_TO_HOME_DELAY, 0.0f, mResetListener);
dispatchTriggerEvent(activeTarget);
+ if (!mAlwaysTrackFinger) {
+ // Force ring and targets to finish animation to final expanded state
+ mTargetAnimations.stop();
+ }
} else {
// Animate handle back to the center based on current state.
deactivateHandle(HIDE_ANIMATION_DURATION, HIDE_ANIMATION_DELAY, 1.0f,
mResetListenerWithPing);
hideTargets(true, false);
- mHandleAnimations.start();
}
setGrabbedState(OnTriggerListener.NO_HANDLE);
@@ -542,7 +546,6 @@ public class MultiWaveView extends View {
mTargetDrawables.get(i).setAlpha(0.0f);
}
}
- mOuterRing.setAlpha(0.0f);
}
private void hideTargets(boolean animate, boolean expanded) {
@@ -809,7 +812,6 @@ public class MultiWaveView extends View {
switchToState(STATE_START, eventX, eventY);
if (!trySwitchToFirstTouchState(eventX, eventY)) {
mDragging = false;
- mTargetAnimations.cancel();
ping();
}
}
diff --git a/core/jni/android_database_SQLiteConnection.cpp b/core/jni/android_database_SQLiteConnection.cpp
index 0777ea2b1859..3bbb8bf819b5 100644
--- a/core/jni/android_database_SQLiteConnection.cpp
+++ b/core/jni/android_database_SQLiteConnection.cpp
@@ -41,6 +41,20 @@
namespace android {
+/* Busy timeout in milliseconds.
+ * If another connection (possibly in another process) has the database locked for
+ * longer than this amount of time then SQLite will generate a SQLITE_BUSY error.
+ * The SQLITE_BUSY error is then raised as a SQLiteDatabaseLockedException.
+ *
+ * In ordinary usage, busy timeouts are quite rare. Most databases only ever
+ * have a single open connection at a time unless they are using WAL. When using
+ * WAL, a timeout could occur if one connection is busy performing an auto-checkpoint
+ * operation. The busy timeout needs to be long enough to tolerate slow I/O write
+ * operations but not so long as to cause the application to hang indefinitely if
+ * there is a problem acquiring a database lock.
+ */
+static const int BUSY_TIMEOUT_MS = 2500;
+
static struct {
jfieldID name;
jfieldID numArgs;
@@ -127,8 +141,8 @@ static jint nativeOpen(JNIEnv* env, jclass clazz, jstring pathStr, jint openFlag
return 0;
}
- // Set the default busy handler to retry for 1000ms and then return SQLITE_BUSY
- err = sqlite3_busy_timeout(db, 1000 /* ms */);
+ // Set the default busy handler to retry automatically before returning SQLITE_BUSY.
+ err = sqlite3_busy_timeout(db, BUSY_TIMEOUT_MS);
if (err != SQLITE_OK) {
throw_sqlite3_exception(env, db, "Could not set busy timeout");
sqlite3_close(db);
diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp
index d80bfb339040..89058a741e5c 100644
--- a/core/jni/android_view_DisplayEventReceiver.cpp
+++ b/core/jni/android_view_DisplayEventReceiver.cpp
@@ -42,12 +42,13 @@ static struct {
} gDisplayEventReceiverClassInfo;
-class NativeDisplayEventReceiver : public RefBase {
+class NativeDisplayEventReceiver : public LooperCallback {
public:
NativeDisplayEventReceiver(JNIEnv* env,
jobject receiverObj, const sp<MessageQueue>& messageQueue);
status_t initialize();
+ void dispose();
status_t scheduleVsync();
protected:
@@ -59,7 +60,7 @@ private:
DisplayEventReceiver mReceiver;
bool mWaitingForVsync;
- static int handleReceiveCallback(int receiveFd, int events, void* data);
+ virtual int handleEvent(int receiveFd, int events, void* data);
bool readLastVsyncMessage(nsecs_t* outTimestamp, uint32_t* outCount);
};
@@ -72,12 +73,6 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env,
}
NativeDisplayEventReceiver::~NativeDisplayEventReceiver() {
- ALOGV("receiver %p ~ Disposing display event receiver.", this);
-
- if (!mReceiver.initCheck()) {
- mMessageQueue->getLooper()->removeFd(mReceiver.getFd());
- }
-
JNIEnv* env = AndroidRuntime::getJNIEnv();
env->DeleteGlobalRef(mReceiverObjGlobal);
}
@@ -90,13 +85,21 @@ status_t NativeDisplayEventReceiver::initialize() {
}
int rc = mMessageQueue->getLooper()->addFd(mReceiver.getFd(), 0, ALOOPER_EVENT_INPUT,
- handleReceiveCallback, this);
+ this, NULL);
if (rc < 0) {
return UNKNOWN_ERROR;
}
return OK;
}
+void NativeDisplayEventReceiver::dispose() {
+ ALOGV("receiver %p ~ Disposing display event receiver.", this);
+
+ if (!mReceiver.initCheck()) {
+ mMessageQueue->getLooper()->removeFd(mReceiver.getFd());
+ }
+}
+
status_t NativeDisplayEventReceiver::scheduleVsync() {
if (!mWaitingForVsync) {
ALOGV("receiver %p ~ Scheduling vsync.", this);
@@ -117,9 +120,7 @@ status_t NativeDisplayEventReceiver::scheduleVsync() {
return OK;
}
-int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events, void* data) {
- sp<NativeDisplayEventReceiver> r = static_cast<NativeDisplayEventReceiver*>(data);
-
+int NativeDisplayEventReceiver::handleEvent(int receiveFd, int events, void* data) {
if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
ALOGE("Display event receiver pipe was closed or an error occurred. "
"events=0x%x", events);
@@ -135,23 +136,23 @@ int NativeDisplayEventReceiver::handleReceiveCallback(int receiveFd, int events,
// Drain all pending events, keep the last vsync.
nsecs_t vsyncTimestamp;
uint32_t vsyncCount;
- if (!r->readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) {
- ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", data);
+ if (!readLastVsyncMessage(&vsyncTimestamp, &vsyncCount)) {
+ ALOGV("receiver %p ~ Woke up but there was no vsync pulse!", this);
return 1; // keep the callback, did not obtain a vsync pulse
}
ALOGV("receiver %p ~ Vsync pulse: timestamp=%lld, count=%d",
- data, vsyncTimestamp, vsyncCount);
- r->mWaitingForVsync = false;
+ this, vsyncTimestamp, vsyncCount);
+ mWaitingForVsync = false;
JNIEnv* env = AndroidRuntime::getJNIEnv();
- ALOGV("receiver %p ~ Invoking vsync handler.", data);
- env->CallVoidMethod(r->mReceiverObjGlobal,
+ ALOGV("receiver %p ~ Invoking vsync handler.", this);
+ env->CallVoidMethod(mReceiverObjGlobal,
gDisplayEventReceiverClassInfo.dispatchVsync, vsyncTimestamp, vsyncCount);
- ALOGV("receiver %p ~ Returned from vsync handler.", data);
+ ALOGV("receiver %p ~ Returned from vsync handler.", this);
- r->mMessageQueue->raiseAndClearException(env, "dispatchVsync");
+ mMessageQueue->raiseAndClearException(env, "dispatchVsync");
return 1; // keep the callback
}
@@ -201,6 +202,7 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
static void nativeDispose(JNIEnv* env, jclass clazz, jint receiverPtr) {
sp<NativeDisplayEventReceiver> receiver =
reinterpret_cast<NativeDisplayEventReceiver*>(receiverPtr);
+ receiver->dispose();
receiver->decStrong(gDisplayEventReceiverClassInfo.clazz); // drop reference held by the object
}
diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp
index 08e08b94bcf8..9501cf225293 100644
--- a/core/jni/android_view_InputEventReceiver.cpp
+++ b/core/jni/android_view_InputEventReceiver.cpp
@@ -44,13 +44,14 @@ static struct {
} gInputEventReceiverClassInfo;
-class NativeInputEventReceiver : public RefBase {
+class NativeInputEventReceiver : public LooperCallback {
public:
NativeInputEventReceiver(JNIEnv* env,
jobject receiverObj, const sp<InputChannel>& inputChannel,
const sp<MessageQueue>& messageQueue);
status_t initialize();
+ void dispose();
status_t finishInputEvent(uint32_t seq, bool handled);
status_t consumeEvents(JNIEnv* env, bool consumeBatches, nsecs_t frameTime);
@@ -68,7 +69,7 @@ private:
return mInputConsumer.getChannel()->getName().string();
}
- static int handleReceiveCallback(int receiveFd, int events, void* data);
+ virtual int handleEvent(int receiveFd, int events, void* data);
};
@@ -84,23 +85,24 @@ NativeInputEventReceiver::NativeInputEventReceiver(JNIEnv* env,
}
NativeInputEventReceiver::~NativeInputEventReceiver() {
-#if DEBUG_DISPATCH_CYCLE
- ALOGD("channel '%s' ~ Disposing input event receiver.", getInputChannelName());
-#endif
-
- mMessageQueue->getLooper()->removeFd(mInputConsumer.getChannel()->getFd());
-
JNIEnv* env = AndroidRuntime::getJNIEnv();
env->DeleteGlobalRef(mReceiverObjGlobal);
}
status_t NativeInputEventReceiver::initialize() {
int receiveFd = mInputConsumer.getChannel()->getFd();
- mMessageQueue->getLooper()->addFd(
- receiveFd, 0, ALOOPER_EVENT_INPUT, handleReceiveCallback, this);
+ mMessageQueue->getLooper()->addFd(receiveFd, 0, ALOOPER_EVENT_INPUT, this, NULL);
return OK;
}
+void NativeInputEventReceiver::dispose() {
+#if DEBUG_DISPATCH_CYCLE
+ ALOGD("channel '%s' ~ Disposing input event receiver.", getInputChannelName());
+#endif
+
+ mMessageQueue->getLooper()->removeFd(mInputConsumer.getChannel()->getFd());
+}
+
status_t NativeInputEventReceiver::finishInputEvent(uint32_t seq, bool handled) {
#if DEBUG_DISPATCH_CYCLE
ALOGD("channel '%s' ~ Finished input event.", getInputChannelName());
@@ -114,24 +116,22 @@ status_t NativeInputEventReceiver::finishInputEvent(uint32_t seq, bool handled)
return status;
}
-int NativeInputEventReceiver::handleReceiveCallback(int receiveFd, int events, void* data) {
- sp<NativeInputEventReceiver> r = static_cast<NativeInputEventReceiver*>(data);
-
+int NativeInputEventReceiver::handleEvent(int receiveFd, int events, void* data) {
if (events & (ALOOPER_EVENT_ERROR | ALOOPER_EVENT_HANGUP)) {
ALOGE("channel '%s' ~ Publisher closed input channel or an error occurred. "
- "events=0x%x", r->getInputChannelName(), events);
+ "events=0x%x", getInputChannelName(), events);
return 0; // remove the callback
}
if (!(events & ALOOPER_EVENT_INPUT)) {
ALOGW("channel '%s' ~ Received spurious callback for unhandled poll event. "
- "events=0x%x", r->getInputChannelName(), events);
+ "events=0x%x", getInputChannelName(), events);
return 1;
}
JNIEnv* env = AndroidRuntime::getJNIEnv();
- status_t status = r->consumeEvents(env, false /*consumeBatches*/, -1);
- r->mMessageQueue->raiseAndClearException(env, "handleReceiveCallback");
+ status_t status = consumeEvents(env, false /*consumeBatches*/, -1);
+ mMessageQueue->raiseAndClearException(env, "handleReceiveCallback");
return status == OK || status == NO_MEMORY ? 1 : 0;
}
@@ -256,6 +256,7 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverObj,
static void nativeDispose(JNIEnv* env, jclass clazz, jint receiverPtr) {
sp<NativeInputEventReceiver> receiver =
reinterpret_cast<NativeInputEventReceiver*>(receiverPtr);
+ receiver->dispose();
receiver->decStrong(gInputEventReceiverClassInfo.clazz); // drop reference held by the object
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index e3082ea77a3a..155e59c01209 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1983,7 +1983,7 @@
<activity android:name="android.accounts.ChooseTypeAndAccountActivity"
android:excludeFromRecents="true"
android:exported="true"
- android:theme="@android:style/Theme.Holo.DialogWhenLarge.NoActionBar"
+ android:theme="@android:style/Theme.Holo.Dialog"
android:label="@string/choose_account_label"
android:process=":ui">
</activity>
diff --git a/core/res/res/anim/dock_bottom_enter.xml b/core/res/res/anim/dock_bottom_enter.xml
index 74a021b90f24..4f2f753169d0 100644
--- a/core/res/res/anim/dock_bottom_enter.xml
+++ b/core/res/res/anim/dock_bottom_enter.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the bottom of the screen is entering. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad">
+ android:interpolator="@android:interpolator/decelerate_cubic">
<translate android:fromYDelta="100%" android:toYDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
+ android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_bottom_exit.xml b/core/res/res/anim/dock_bottom_exit.xml
index 213b3d91a5f9..afbe24b82aa0 100644
--- a/core/res/res/anim/dock_bottom_exit.xml
+++ b/core/res/res/anim/dock_bottom_exit.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the bottom of the screen is exiting. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad">
+ android:interpolator="@android:interpolator/accelerate_cubic">
<translate android:fromYDelta="0" android:toYDelta="100%"
- android:startOffset="100" android:duration="@android:integer/config_mediumAnimTime"/>
+ android:startOffset="100" android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_left_enter.xml b/core/res/res/anim/dock_left_enter.xml
index 4fce35ab3678..7f5dfd50afc7 100644
--- a/core/res/res/anim/dock_left_enter.xml
+++ b/core/res/res/anim/dock_left_enter.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the left of the screen is entering. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad">
+ android:interpolator="@android:interpolator/decelerate_cubic">
<translate android:fromXDelta="-100%" android:toXDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
+ android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_left_exit.xml b/core/res/res/anim/dock_left_exit.xml
index bce203dc3c45..11cbc0b36405 100644
--- a/core/res/res/anim/dock_left_exit.xml
+++ b/core/res/res/anim/dock_left_exit.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the right of the screen is exiting. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad">
+ android:interpolator="@android:interpolator/accelerate_cubic">
<translate android:fromXDelta="0" android:toXDelta="-100%"
- android:startOffset="100" android:duration="@android:integer/config_mediumAnimTime"/>
+ android:startOffset="100" android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_right_enter.xml b/core/res/res/anim/dock_right_enter.xml
index 26b8ad6ee6b0..a92c7d234e58 100644
--- a/core/res/res/anim/dock_right_enter.xml
+++ b/core/res/res/anim/dock_right_enter.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the right of the screen is entering. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad">
+ android:interpolator="@android:interpolator/decelerate_cubic">
<translate android:fromXDelta="100%" android:toXDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
+ android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_right_exit.xml b/core/res/res/anim/dock_right_exit.xml
index 6beda5927b3f..80e4dc318192 100644
--- a/core/res/res/anim/dock_right_exit.xml
+++ b/core/res/res/anim/dock_right_exit.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the right of the screen is exiting. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad">
+ android:interpolator="@android:interpolator/accelerate_cubic">
<translate android:fromXDelta="0" android:toXDelta="100%"
- android:startOffset="100" android:duration="@android:integer/config_mediumAnimTime"/>
+ android:startOffset="100" android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_top_enter.xml b/core/res/res/anim/dock_top_enter.xml
index 594b47950f07..1f74e4827aaa 100644
--- a/core/res/res/anim/dock_top_enter.xml
+++ b/core/res/res/anim/dock_top_enter.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the top of the screen is entering. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/decelerate_quad">
+ android:interpolator="@android:interpolator/decelerate_cubic">
<translate android:fromYDelta="-100%" android:toYDelta="0"
- android:duration="@android:integer/config_mediumAnimTime"/>
+ android:duration="250"/>
</set>
diff --git a/core/res/res/anim/dock_top_exit.xml b/core/res/res/anim/dock_top_exit.xml
index b9691f6446a7..4d2fea94f322 100644
--- a/core/res/res/anim/dock_top_exit.xml
+++ b/core/res/res/anim/dock_top_exit.xml
@@ -18,7 +18,7 @@
<!-- Animation for when a dock window at the top of the screen is exiting. -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:interpolator/accelerate_quad">
+ android:interpolator="@android:interpolator/accelerate_cubic">
<translate android:fromYDelta="0" android:toYDelta="-100%"
- android:startOffset="100" android:duration="@android:integer/config_mediumAnimTime"/>
+ android:startOffset="100" android:duration="250"/>
</set>
diff --git a/core/res/res/layout/choose_selected_account_row.xml b/core/res/res/layout/choose_selected_account_row.xml
deleted file mode 100644
index d88750dcc28b..000000000000
--- a/core/res/res/layout/choose_selected_account_row.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingLeft="0dip"
- android:paddingRight="0dip"
- android:orientation="horizontal" >
-
- <ImageView android:id="@+id/account_row_icon"
- android:layout_width="wrap_content"
- android:layout_height="fill_parent"
- android:paddingRight="8dip" />
-
- <TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/account_row_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:gravity="center_vertical"
- android:minHeight="?android:attr/listPreferredItemHeight" />
-
- <ImageView android:id="@+id/account_row_checkmark"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:gravity="right"
- android:layout_weight="2"
- android:paddingRight="8dip"
- android:src="@drawable/ic_checkmark_holo_light" />
-
-</LinearLayout> \ No newline at end of file
diff --git a/core/res/res/layout/choose_type_and_account.xml b/core/res/res/layout/choose_type_and_account.xml
index d7068b7bf44f..9d1d28405e93 100644
--- a/core/res/res/layout/choose_type_and_account.xml
+++ b/core/res/res/layout/choose_type_and_account.xml
@@ -20,53 +20,52 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingLeft="16dip"
- android:paddingRight="16dip">
-
- <TextView android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:layout_gravity="left"
- android:text="@string/choose_account_label"
- android:paddingTop="16dip"
- android:paddingBottom="16dip"
- android:textColor="@android:color/holo_blue_light"
- />
-
- <View android:layout_height="3dip"
- android:layout_width="match_parent"
- android:background="#323232"/>
+ android:orientation="vertical">
+ <!-- Customizable description text -->
<TextView android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_gravity="left|center_vertical"
- android:text="@string/choose_account_text"
android:paddingTop="16dip"
android:paddingBottom="16dip"
+ android:paddingLeft="16dip"
+ android:paddingRight="16dip"
/>
+ <!-- List of accounts, with "Add new account" as the last item -->
<ListView android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:layout_weight="1"
- android:scrollbarAlwaysDrawVerticalTrack="true" />
+ android:scrollbarAlwaysDrawVerticalTrack="true"
+ android:choiceMode="singleChoice" />
+ <!-- Horizontal divider line -->
<View android:layout_height="1dip"
android:layout_width="match_parent"
android:background="?android:attr/dividerHorizontal" />
- <Button android:id="@+id/addAccount"
- style="?android:attr/buttonBarButtonStyle"
+ <!-- Alert dialog style buttons along the bottom. -->
+ <LinearLayout android:id="@+id/button_bar"
+ style="?android:attr/buttonBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginLeft="2dip"
- android:layout_marginRight="2dip"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:text="@string/add_account_button_label"
- />
+ android:measureWithLargestChild="true">
+ <Button android:id="@android:id/button1"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content" android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@android:string/no"
+ android:onClick="onCancelButtonClicked" />
+ <Button android:id="@android:id/button2"
+ style="?android:attr/buttonBarButtonStyle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:text="@android:string/yes"
+ android:onClick="onOkButtonClicked" />
+ </LinearLayout>
</LinearLayout>
diff --git a/core/res/res/layout/notification_action_list.xml b/core/res/res/layout/notification_action_list.xml
index fa0a8c87077a..591c9eac6558 100644
--- a/core/res/res/layout/notification_action_list.xml
+++ b/core/res/res/layout/notification_action_list.xml
@@ -23,6 +23,7 @@
android:visibility="gone"
android:showDividers="middle"
android:divider="?android:attr/listDivider"
+ android:dividerPadding="12dp"
>
<!-- actions will be added here -->
</LinearLayout>
diff --git a/core/res/res/layout/notification_template_base.xml b/core/res/res/layout/notification_template_base.xml
index ed680a912ca6..47bbbdec0d3e 100644
--- a/core/res/res/layout/notification_template_base.xml
+++ b/core/res/res/layout/notification_template_base.xml
@@ -36,8 +36,7 @@
android:layout_marginLeft="@dimen/notification_large_icon_width"
android:minHeight="@dimen/notification_large_icon_height"
android:orientation="vertical"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
+ android:paddingRight="8dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:gravity="top"
@@ -47,6 +46,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="6dp"
+ android:layout_marginLeft="8dp"
android:orientation="horizontal"
>
<TextView android:id="@+id/title"
@@ -81,6 +81,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="-2dp"
android:layout_marginBottom="-2dp"
+ android:layout_marginLeft="8dp"
android:singleLine="true"
android:fadingEdge="horizontal"
android:ellipsize="marquee"
@@ -90,24 +91,17 @@
android:id="@android:id/progress"
android:layout_width="match_parent"
android:layout_height="12dp"
+ android:layout_marginLeft="8dp"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
- <TextView android:id="@+id/overflow_title"
- android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:visibility="gone"
- android:layout_weight="1"
- />
<LinearLayout
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:layout_marginLeft="8dp"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -130,14 +124,14 @@
android:paddingLeft="8dp"
/>
<ImageView android:id="@+id/right_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
android:layout_gravity="center"
android:layout_weight="0"
+ android:layout_marginLeft="8dp"
android:scaleType="centerInside"
- android:paddingLeft="8dp"
android:visibility="gone"
- android:drawableAlpha="180"
+ android:drawableAlpha="153"
/>
</LinearLayout>
</LinearLayout>
diff --git a/core/res/res/layout/notification_template_big_base.xml b/core/res/res/layout/notification_template_big_base.xml
index f2c204fa068d..69f0a242a156 100644
--- a/core/res/res/layout/notification_template_big_base.xml
+++ b/core/res/res/layout/notification_template_big_base.xml
@@ -33,19 +33,16 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="fill_vertical"
- android:layout_marginLeft="@dimen/notification_large_icon_width"
android:minHeight="@dimen/notification_large_icon_height"
android:orientation="vertical"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
- android:paddingTop="2dp"
- android:paddingBottom="2dp"
android:gravity="top"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
android:minHeight="@dimen/notification_large_icon_height"
+ android:paddingTop="2dp"
android:orientation="vertical"
>
<LinearLayout
@@ -53,6 +50,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="6dp"
+ android:layout_marginRight="8dp"
+ android:layout_marginLeft="8dp"
android:orientation="horizontal"
>
<TextView android:id="@+id/title"
@@ -87,6 +86,8 @@
android:layout_height="wrap_content"
android:layout_marginTop="-2dp"
android:layout_marginBottom="-2dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:fadingEdge="horizontal"
android:ellipsize="marquee"
@@ -96,6 +97,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="false"
android:visibility="gone"
/>
@@ -103,7 +106,10 @@
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:orientation="horizontal"
+ android:gravity="center_vertical"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -126,29 +132,38 @@
android:paddingLeft="8dp"
/>
<ImageView android:id="@+id/right_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
android:layout_gravity="center"
android:layout_weight="0"
+ android:layout_marginLeft="8dp"
android:scaleType="centerInside"
- android:paddingLeft="8dp"
android:visibility="gone"
- android:drawableAlpha="180"
+ android:drawableAlpha="153"
/>
</LinearLayout>
<ProgressBar
android:id="@android:id/progress"
android:layout_width="match_parent"
android:layout_height="12dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:id="@+id/action_divider"
+ android:visibility="gone"
+ android:background="?android:attr/dividerHorizontal" />
<include
layout="@layout/notification_action_list"
- android:id="@+id/actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="@dimen/notification_large_icon_width"
/>
</LinearLayout>
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_big_picture.xml b/core/res/res/layout/notification_template_big_picture.xml
index 077616e6c410..ecb36168ce81 100644
--- a/core/res/res/layout/notification_template_big_picture.xml
+++ b/core/res/res/layout/notification_template_big_picture.xml
@@ -53,7 +53,6 @@
<include
layout="@layout/notification_action_list"
android:id="@+id/actions"
- android:layout_marginLeft="8dp"
android:layout_gravity="bottom"
android:layout_width="match_parent"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml
index 304f2b59ff97..b86177e4e64f 100644
--- a/core/res/res/layout/notification_template_big_text.xml
+++ b/core/res/res/layout/notification_template_big_text.xml
@@ -34,8 +34,6 @@
android:layout_gravity="fill_vertical"
android:layout_marginLeft="@dimen/notification_large_icon_width"
android:orientation="vertical"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:gravity="top"
@@ -44,6 +42,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:layout_weight="1"
>
<LinearLayout
@@ -87,6 +87,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="-2dp"
android:layout_marginBottom="-2dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:fadingEdge="horizontal"
android:ellipsize="marquee"
@@ -97,6 +98,8 @@
android:id="@android:id/progress"
android:layout_width="match_parent"
android:layout_height="12dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="8dp"
android:visibility="gone"
android:layout_weight="0"
style="?android:attr/progressBarStyleHorizontal"
@@ -105,7 +108,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
- android:layout_marginBottom="2dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="false"
android:visibility="gone"
android:maxLines="8"
@@ -113,6 +117,13 @@
android:layout_weight="1"
/>
</LinearLayout>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1dip"
+ android:layout_marginTop="-1px"
+ android:id="@+id/action_divider"
+ android:visibility="gone"
+ android:background="?android:attr/dividerHorizontal" />
<include
layout="@layout/notification_action_list"
android:layout_width="match_parent"
@@ -120,22 +131,23 @@
android:visibility="gone"
android:layout_weight="1"
/>
- <TextView android:id="@+id/overflow_title"
- android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
+ <ImageView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
- android:visibility="gone"
- android:layout_weight="0"
- />
+ android:layout_height="1px"
+ android:id="@+id/overflow_divider"
+ android:layout_marginBottom="8dp"
+ android:visibility="visible"
+ android:background="?android:attr/dividerHorizontal" />
<LinearLayout
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="8dp"
android:orientation="horizontal"
android:layout_weight="0"
+ android:gravity="center_vertical"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -158,14 +170,14 @@
android:paddingLeft="8dp"
/>
<ImageView android:id="@+id/right_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
android:layout_gravity="center"
android:layout_weight="0"
+ android:layout_marginLeft="8dp"
android:scaleType="centerInside"
- android:paddingLeft="8dp"
android:visibility="gone"
- android:drawableAlpha="180"
+ android:drawableAlpha="153"
/>
</LinearLayout>
</LinearLayout>
diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml
index 121a81c8c7d6..e9a3686dbe89 100644
--- a/core/res/res/layout/notification_template_inbox.xml
+++ b/core/res/res/layout/notification_template_inbox.xml
@@ -36,8 +36,6 @@
android:layout_marginLeft="@dimen/notification_large_icon_width"
android:minHeight="@dimen/notification_large_icon_height"
android:orientation="vertical"
- android:paddingLeft="12dp"
- android:paddingRight="12dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:gravity="top"
@@ -46,6 +44,8 @@
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:paddingTop="6dp"
android:orientation="horizontal"
android:layout_weight="0"
@@ -82,6 +82,8 @@
android:layout_height="wrap_content"
android:layout_marginTop="-2dp"
android:layout_marginBottom="-2dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:fadingEdge="horizontal"
android:ellipsize="marquee"
@@ -92,6 +94,8 @@
android:id="@android:id/progress"
android:layout_width="match_parent"
android:layout_height="12dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:visibility="gone"
android:layout_weight="0"
style="?android:attr/progressBarStyleHorizontal"
@@ -100,6 +104,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -109,6 +115,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -118,6 +126,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -127,6 +137,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -136,6 +148,7 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -145,6 +158,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -154,6 +169,8 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
@@ -163,35 +180,44 @@
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
android:layout_height="0dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
android:singleLine="true"
android:ellipsize="end"
android:visibility="gone"
android:layout_weight="1"
android:text="@android:string/ellipsis"
/>
+ <ImageView
+ android:layout_width="match_parent"
+ android:layout_height="1px"
+ android:id="@+id/overflow_divider"
+ android:layout_marginTop="8dp"
+ android:visibility="visible"
+ android:background="?android:attr/dividerHorizontal" />
<include
layout="@layout/notification_action_list"
- android:id="@+id/actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
/>
- <TextView android:id="@+id/overflow_title"
- android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
+ <ImageView
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:fadingEdge="horizontal"
+ android:layout_height="1px"
+ android:id="@+id/action_divider"
android:visibility="gone"
- android:layout_weight="0"
- />
+ android:background="?android:attr/dividerHorizontal" /><!-- note: divider below actions -->
<LinearLayout
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginTop="8dp"
+ android:layout_marginLeft="8dp"
+ android:layout_marginBottom="8dp"
+ android:layout_marginRight="8dp"
android:orientation="horizontal"
android:layout_weight="0"
+ android:gravity="center_vertical"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -214,14 +240,14 @@
android:paddingLeft="8dp"
/>
<ImageView android:id="@+id/right_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_width="16dp"
+ android:layout_height="16dp"
android:layout_gravity="center"
android:layout_weight="0"
+ android:layout_marginLeft="8dp"
android:scaleType="centerInside"
- android:paddingLeft="8dp"
android:visibility="gone"
- android:drawableAlpha="180"
+ android:drawableAlpha="153"
/>
</LinearLayout>
</LinearLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index fd3268554ba3..7c9351c05766 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Maak navraag skoon"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Dien navraag in"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Stemsoektog"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Wil jy Ontek-met-raak aktiveer?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wil Ontdek-met-raak aktiveer. Wanneer Ontek-met-raak aangeskakel is, kan jy beskrywings van wat onder jou vinger is hoor of sien, of jy kan gebare uitvoer om interaksie met die tablet te hê."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> wil Ontdek-met-raak aktiveer. Wanneer Ontek-met-raak aangeskakel is, kan jy beskrywings van wat onder jou vinger is hoor of sien, of jy kan gebare uitvoer om interaksie met die foon te hê ."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 maand gelede"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Voor 1 maand gelede"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Stel invoermetodes op"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fisiese sleutelbord"</string>
<string name="hardware" msgid="7517821086888990278">"Hardeware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Kies sleutelborduitleg"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Raak om \'n sleutelborduitleg te kies."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidate"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Doen vir eers niks nie"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Kies \'n rekening"</string>
<string name="add_account_label" msgid="2935267344849993553">"Voeg \'n rekening by"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Watter rekening wil jy gebruik?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Voeg rekening by"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Vermeerder"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Verminder"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altyd"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Net een keer"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index fb11af3c21e7..18cbf43dbcf5 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"ለአሁን ምንም አታድርግ"</string>
<string name="choose_account_label" msgid="5655203089746423927">"መለያ ምረጥ"</string>
<string name="add_account_label" msgid="2935267344849993553">"መለያ አክል"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"የትኛውን መለያ መጠቀም ትፈልጋለህ?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"መለያ አክል"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"ጨምር"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"ቀንስ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 7798b0a9b523..171b5d992f66 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"محو طلب البحث"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"إرسال طلب البحث"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"البحث الصوتي"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"هل تريد تمكين ميزة Explore by Touch؟"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"يريد <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by Touch، سيكون بإمكانك سماع أو مشاهدة أوصاف لما تحت إصبعك أو إجراء إيماءات للتفاعل مع الجهاز اللوحي."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"يريد <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> تمكين ميزة Explore by Touch. عند تشغيل ميزة Explore by Touch، سيكون بإمكانك سماع أو مشاهدة أوصاف لما تحت إصبعك أو إجراء إيماءات للتفاعل مع الهاتف."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"قبل شهر واحد"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"قبل شهر واحد"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"إعداد أسلوب الإدخال"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"لوحة مفاتيح فعلية"</string>
<string name="hardware" msgid="7517821086888990278">"أجهزة"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"تحديد تخطيط لوحة مفاتيح"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"المس لتحديد تخطيط لوحة مفاتيح."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"العناصر المرشحة"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"عدم تنفيذ أي شيء الآن"</string>
<string name="choose_account_label" msgid="5655203089746423927">"اختيار حساب"</string>
<string name="add_account_label" msgid="2935267344849993553">"إضافة حساب"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"ما الحساب الذي تريد استخدامه؟"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"إضافة حساب"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"زيادة"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"تقليل"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"دومًا"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"مرة واحدة فقط"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 40686100bb50..ca5d5f6b285d 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Нічога зараз не рабіць"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Выберыце ўліковы запіс"</string>
<string name="add_account_label" msgid="2935267344849993553">"Дадаць уліковы запіс"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Які ўліковы запіс вы жадаеце выкарыстоўваць?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Дадаць уліковы запіс"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Павялічыць"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Паменшыць"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 086d33a712f3..709cc1b1e8d1 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Да не се прави нищо засега"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Избор на профил"</string>
<string name="add_account_label" msgid="2935267344849993553">"Добавяне на профил"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Кой профил искате да използвате?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Добавяне на профил"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Увеличаване"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Намаляване"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 4190bdba2b0a..d02008b71962 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"No facis res per ara"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Tria un compte"</string>
<string name="add_account_label" msgid="2935267344849993553">"Addició d\'un compte"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Quin compte vols utilitzar?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Afegeix un compte"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Incrementa"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Redueix"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index ad25a3e67f0e..98c7ac53af98 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Zatím nic neprovádět."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Vybrat účet"</string>
<string name="add_account_label" msgid="2935267344849993553">"Přidat účet"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Který účet chcete použít?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Přidat účet"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Zvýšit"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Snížit"</string>
@@ -1324,6 +1323,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Jen jednou"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 9dc89a0eb306..1704fe1cde03 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Ryd forespørgslen"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Indsend forespørgslen"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Stemmesøgning"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Vil du aktivere Udforsk ved berøring?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ønsker at aktivere Udforsk ved berøring. Når Udforsk ved berøring er tændt, kan du høre eller se beskrivelser af, hvad der er under din finger eller udføre bevægelser for at interagere med tabletten."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ønsker at aktivere Udforsk ved berøring. Når Udforsk ved berøring er aktiveret, kan du høre eller se beskrivelser af, hvad der er under din finger, eller udføre bevægelser for at interagere med telefonen."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"For 1 måned siden"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Før for 1 måned siden"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Konfigurer inputmetoder"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysisk tastatur"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Vælg tastaturlayout"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tryk for at vælge et tastaturlayout."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Gør ikke noget lige nu."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Vælg en konto"</string>
<string name="add_account_label" msgid="2935267344849993553">"Tilføj en konto"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Hvilken konto vil du bruge?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Tilføj konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Højere"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Lavere"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altid"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kun én gang"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index ec8ca3e6fb5b..a326e2dca13e 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Im Moment nichts unternehmen"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Konto auswählen"</string>
<string name="add_account_label" msgid="2935267344849993553">"Konto hinzufügen"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Welches Konto möchten Sie verwenden?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Konto hinzufügen"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Verlängern"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Verringern"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 8cde21f2ac05..53a64fc4b86e 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Να μην γίνει καμία ενέργεια τώρα."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Επιλέξτε λογαριασμό"</string>
<string name="add_account_label" msgid="2935267344849993553">"Προσθήκη λογαριασμού"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Ποιον λογαριασμό θέλετε να χρησιμοποιήσετε;"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Προσθήκη λογαριασμού"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Αύξηση"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Μείωση"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 4ad7daf9cb38..18a682708892 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Do nothing for now"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Choose an account"</string>
<string name="add_account_label" msgid="2935267344849993553">"Add an account"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Which account do you want to use?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Add account"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Increase"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Decrease"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 64429e944100..1015e65490e7 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Eliminar la consulta"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Enviar consulta"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Búsqueda por voz"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"¿Habilitar exploración táctil?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con la tableta."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quiere habilitar la exploración táctil. Cuando esta función esté activada, podrás escuchar o ver descripciones del contenido seleccionado o usar gestos para interactuar con el teléfono."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"hace 1 mes"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Anterior a 1 mes atrás"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de introducción"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona un diseño de teclado"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toca para seleccionar un diseño de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"No hacer nada por ahora"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Seleccionar una cuenta"</string>
<string name="add_account_label" msgid="2935267344849993553">"Agregar una cuenta"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"¿Qué cuenta quieres usar?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Agregar una cuenta"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Reducir"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una vez"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index f5d879522a48..e53e3bcbe594 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"No hacer nada por ahora"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Seleccionar una cuenta"</string>
<string name="add_account_label" msgid="2935267344849993553">"Añadir una cuenta"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"¿Qué cuenta quieres usar?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Añadir cuenta"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Reducir"</string>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index eaa7c94f297a..89fc8f4f5905 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Tühjenda päring"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Päringu esitamine"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Häälotsing"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Kas lubada puudutusega uurimine?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> soovib lubada puudutusega uurimise. Kui puudutusega uurimine on sisse lülitatud, kuulete või näete kirjeldusi asjade kohta, mis on teie sõrme all, või saate suhelda tahvelarvutiga liigutuste abil."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> soovib lubada puudutusega uurimise. Kui puudutusega uurimine on sisse lülitatud, kuulete või näete kirjeldusi asjade kohta, mis on teie sõrme all, või saate suhelda telefoniga liigutuste abil."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 kuu tagasi"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Varem kui 1 kuu tagasi"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Seadista sisestusmeetodid"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Füüsiline klaviatuur"</string>
<string name="hardware" msgid="7517821086888990278">"Riistvara"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatuuri paigutuse valimine"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Puudutage klaviatuuri paigutuse valimiseks."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidaadid"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Ära tee praegu midagi"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Konto valimine"</string>
<string name="add_account_label" msgid="2935267344849993553">"Konto lisamine"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Millist kontot soovite kasutada?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Lisa konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Suurendamine"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Vähendamine"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Ainult üks kord"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 393ba0ca4745..eaf784971864 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"پاک کردن عبارت جستجو"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"ارسال عبارت جستجو"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"جستجوی صوتی"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"فعال کردن «کاوش با لمس»؟"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> می‌خواهد «کاوش با لمس» را فعال کند. وقتی «کاوش با لمس» فعال است، می‌توانید توضیحاتی را برای آنچه که زیر انگشت شما است مشاهده کرده یا بشنوید یا برای استفاده از رایانه لوحی از حرکات اشاره استفاده کنید."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> می‌خواهد «کاوش با لمس» را فعال کند. وقتی «کاوش با لمس» فعال است، می‌توانید توضیحاتی را برای آنچه که زیر انگشت شما است مشاهده کرده یا بشنوید یا برای استفاده از تلفن خود از حرکات اشاره استفاده کنید."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 ماه قبل"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"قبل از 1 ماه گذشته"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"تنظیم روش‌های ورودی"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"صفحه کلید فیزیکی"</string>
<string name="hardware" msgid="7517821086888990278">"سخت‌افزار"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"انتخاب طرح‌بندی صفحه کلید"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"برای انتخاب یک طرح‌بندی صفحه کلید لمس کنید…"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"داوطلبین"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"اکنون کاری انجام نشود"</string>
<string name="choose_account_label" msgid="5655203089746423927">"انتخاب حساب"</string>
<string name="add_account_label" msgid="2935267344849993553">"افزودن یک حساب"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"کدام حساب را می‎خواهید استفاده کنید؟"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"افزودن حساب"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"افزایش"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"کاهش"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راه‌اندازی شود؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"تماس را می‌پذیرید؟"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"همیشه"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"فقط یک بار"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 9e0e8e6da4bc..1ec3a3edfe35 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Älä tee mitään"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Valitse tili"</string>
<string name="add_account_label" msgid="2935267344849993553">"Lisää tili"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Mitä tiliä haluat käyttää?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Lisää tili"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Lisää"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Vähennä"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f757e274a479..d7cb12c72132 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Ne rien faire pour l\'instant"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Sélectionnez un compte"</string>
<string name="add_account_label" msgid="2935267344849993553">"Ajouter un compte"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Quel compte souhaitez-vous utiliser ?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Ajouter un compte"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Augmenter"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Diminuer"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 47656b6718e2..2a83a16e1e08 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"फिलहाल कुछ न करें"</string>
<string name="choose_account_label" msgid="5655203089746423927">"कोई खाता चुनें"</string>
<string name="add_account_label" msgid="2935267344849993553">"कोई खाता जोड़ें"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"आप कौन-सा खाता उपयोग करना चाहते हैं?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"खाता जोड़ें"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"बढ़ाएं"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"कम करें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 98f736ba3305..d8bd15ff79c1 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Za sada nemoj ništa učiniti"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Odaberite račun"</string>
<string name="add_account_label" msgid="2935267344849993553">"Dodajte račun"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Koji račun želite upotrijebiti?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Povećavanje"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Smanjivanje"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 239bfe4d178d..188f6d75249f 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Egyelőre ne legyen semmilyen művelet"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Válasszon fiókot"</string>
<string name="add_account_label" msgid="2935267344849993553">"Fiók hozzáadása"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Melyik fiókot szeretné használni?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Fiók hozzáadása"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Növelés"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Csökkentés"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index f0187ecdc05a..fda15f241572 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Hapus kueri"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Mengirimkan kueri"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Penelusuran suara"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Aktifkan Menjelajah dengan Sentuhan?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mengaktifkan Menjelajah dengan Sentuhan. Saat Menjelajah dengan Sentuhan diaktifkan, Anda dapat melihat atau mendengar deskripsi dari apa yang ada di bawah jari Anda atau melakukan gerakan untuk berinteraksi dengan tablet."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mengaktifkan Menjelajah dengan Sentuhan. Saat Menjelajah dengan Sentuhan diaktifkan, Anda dapat mendengar atau melihat deskripsi dari apa yang ada di bawah jari Anda atau melakukan gerakan untuk berinteraksi dengan ponsel."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 bulan yang lalu"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Sebelum 1 bulan yang lalu"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Menyiapkan metode masukan"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Keyboard fisik"</string>
<string name="hardware" msgid="7517821086888990278">"Perangkat Keras"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih tata letak keyboard"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Sentuh untuk memilih tata letak keyboard."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Jangan lakukan apa pun untuk saat ini"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Pilih akun"</string>
<string name="add_account_label" msgid="2935267344849993553">"Tambahkan akun"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Akun mana yang ingin Anda gunakan?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Tambah"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Kurangi"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index ffcf6bb2392a..92f4cef60773 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Cancella query"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Invia query"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Ricerca vocale"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Attivare Esplora al tocco?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il tablet tramite gesti."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vuole attivare la funzione Esplora al tocco. Quando la funzione Esplora al tocco è attiva, puoi ascoltare o visualizzare le descrizioni di ciò che stai toccando oppure interagire con il telefono tramite gesti."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 mese fa"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Oltre 1 mese fa"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Configura metodi di immissione"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Tastiera fisica"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Seleziona layout tastiera"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tocca per selezionare un layout di tastiera."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidati"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Non fare nulla per ora"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Scegli un account"</string>
<string name="add_account_label" msgid="2935267344849993553">"Aggiungi un account"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Quale account vuoi usare?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Aggiungi account"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Aumenta"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Riduci"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Avviare l\'applicazione Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Accettare la chiamata?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Solo una volta"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 265da954371c..54b762003a8e 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"אל תעשה דבר כרגע"</string>
<string name="choose_account_label" msgid="5655203089746423927">"בחר חשבון"</string>
<string name="add_account_label" msgid="2935267344849993553">"הוסף חשבון"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"באיזה חשבון ברצונך להשתמש?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"הוסף חשבון"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"הוסף"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"הפחת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 176a6b5ccc0a..604e1636f623 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"今は何もしない"</string>
<string name="choose_account_label" msgid="5655203089746423927">"アカウントの選択"</string>
<string name="add_account_label" msgid="2935267344849993553">"アカウントを追加"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"どのアカウントを使用しますか?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"アカウントを追加"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"進めます"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"戻します"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 03de3467b505..64ef6a34c394 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"검색어 삭제"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"검색어 보내기"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"음성 검색"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\'터치하여 탐색\'을 사용하시겠습니까?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>을(를) 사용하려면 \'터치하여 탐색\' 기능을 사용하도록 설정해야 합니다. \'터치하여 탐색\'을 사용하도록 설정하면, 화면을 터치하여 손가락 아래에 표시된 항목에 대한 설명을 듣고 보거나 태블릿으로 상호작용하기 위한 동작을 수행할 수 있습니다."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>을(를) 사용하려면 \'터치하여 탐색\' 기능을 사용하도록 설정해야 합니다. \'터치하여 탐색\'을 사용하도록 설정하면, 화면을 터치하여 손가락 아래에 표시된 항목에 대한 설명을 듣고 보거나 휴대전화로 상호작용하기 위한 동작을 수행할 수 있습니다."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"한 달 전"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"한 달 전"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"입력 방법 설정"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"물리적 키보드"</string>
<string name="hardware" msgid="7517821086888990278">"하드웨어"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"키보드 레이아웃 선택"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"터치하여 키보드 레이아웃을 선택합니다."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"가능한 원인"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"나중에 작업"</string>
<string name="choose_account_label" msgid="5655203089746423927">"계정 선택"</string>
<string name="add_account_label" msgid="2935267344849993553">"계정 추가"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"사용할 계정을 선택하세요."</string>
<string name="add_account_button_label" msgid="3611982894853435874">"계정 추가"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"늘리기"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"줄이기"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"한 번만"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 0474391fa80b..fe4683da5b48 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Išvalyti užklausą"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Patvirtinti užklausą"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Paieška balsu"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Įgalinti naršymą liečiant?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"„<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>“ nori įgalinti naršymą liečiant. Kai naršymas liečiant bus įjungtas, galėsite išgirsti ar peržiūrėti pirštu liečiamų elementų aprašus arba atlikdami gestus naudoti planšetinį kompiuterį."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"„<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>“ nori įgalinti naršymą liečiant. Kai naršymas liečiant bus įjungtas, galėsite išgirsti ar peržiūrėti pirštu liečiamų elementų aprašus arba atlikdami gestus naudoti telefoną."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"Prieš 1 mėn."</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Prieš maždaug 1 mėnesį"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Nustatyti įvesties metodus"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fizinė klaviatūra"</string>
<string name="hardware" msgid="7517821086888990278">"Apar. įr."</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pasirinkite klaviatūros išdėstymą"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Palieskite, kad pasirinktumėte klaviatūros išdėstymą."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidatai"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Kol kas nieko nedaryti"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Pasirinkti paskyrą"</string>
<string name="add_account_label" msgid="2935267344849993553">"Pridėti paskyrą"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Kurią paskyrą norite naudoti?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Pridėti paskyrą"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Padidinti"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Sumažinti"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tik kartą"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index aaed6e2a08c9..263323c7ba1e 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Notīrīt vaicājumu"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Iesniedziet vaicājumu."</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Meklēšana ar balsi"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Vai iesp. “Pārlūkot pieskaroties”?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vēlas iespējot funkciju “Atklāt pieskaroties”. Kad ir ieslēgta funkcija “Atklāt pieskaroties”, var dzirdēt vai redzēt tā vienuma aprakstu, virs kura atrodas pirksts, vai veikt žestus, lai mijiedarbotos ar planšetdatoru."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vēlas iespējot funkciju “Atklāt pieskaroties”. Kad ir ieslēgta funkcija “Atklāt pieskaroties”, var dzirdēt vai redzēt tā vienuma aprakstu, virs kura atrodas pirksts, vai veikt žestus, lai mijiedarbotos ar tālruni."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"Pirms 1 mēneša"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Vairāk nekā pirms 1 mēneša"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Iestatīt ievades metodes"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziskā tastatūra"</string>
<string name="hardware" msgid="7517821086888990278">"Aparatūra"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Atlasiet tastatūras izkārtojumu"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Pieskarieties, lai atlasītu tastatūras izkārtojumu."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidāti"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Pagaidām neveiciet nekādas darbības."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Izvēlēties kontu"</string>
<string name="add_account_label" msgid="2935267344849993553">"Pievienot kontu"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Kuru kontu vēlaties izmantot?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Pievienot kontu"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Palielināt"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Samazināt"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tikai vienreiz"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index fec15b2e5d3d..295fae2d9a63 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Pertanyaan jelas"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Serah pertanyaan"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Carian suara"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Dayakan Jelajah melalui Sentuhan?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan tablet."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ingin mendayakan Jelajah melalui Sentuhan. Apabila Jelajah melalui Sentuhan didayakan, anda boleh mendengar atau melihat penerangan tentang apa di bawah jari anda atau melakukan gerak isyarat untuk berinteraksi dengan telefon."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 bulan yang lalu"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Sebelum 1 bulan yang lalu"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Sediakan kaedah input"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Papan kekunci fizikal"</string>
<string name="hardware" msgid="7517821086888990278">"Perkakasan"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih susun atur papan kekunci"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Sentuh untuk memilih susun atur papan kekunci."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"calon"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Jangan lakukan apa-apa sekarang"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Pilih akaun"</string>
<string name="add_account_label" msgid="2935267344849993553">"Tambah akaun"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Akaun mana yang mahu anda gunakan?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Tambah akaun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Tingkatkan"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Kurangkan"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Hanya sekali"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 47935fde8ca6..6ed825fb56c9 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -748,7 +748,7 @@
<string name="lockscreen_transport_pause_description" msgid="7659088786780128001">"Pause-knappen"</string>
<string name="lockscreen_transport_play_description" msgid="5888422938351019426">"Avspillingsknappen"</string>
<string name="lockscreen_transport_stop_description" msgid="4562318378766987601">"Stopp-knappen"</string>
- <string name="emergency_calls_only" msgid="6733978304386365407">"Kun nødanrop"</string>
+ <string name="emergency_calls_only" msgid="6733978304386365407">"Bare nødanrop"</string>
<string name="lockscreen_network_locked_message" msgid="143389224986028501">"Nettverk ikke tillatt"</string>
<string name="lockscreen_sim_puk_locked_message" msgid="7441797339976230">"SIM-kortet er PUK-låst."</string>
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Les i brukerhåndboken eller kontakt brukerstøtten."</string>
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Ikke gjør noe nå"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Velg en konto"</string>
<string name="add_account_label" msgid="2935267344849993553">"Legg til en konto"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Hvilken konto vil du bruke?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Legg til konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Øk"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Reduser"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 4ad7180e6d5e..b92c38cd848a 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Nu niets doen."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Een account selecteren"</string>
<string name="add_account_label" msgid="2935267344849993553">"Een account toevoegen"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Welk account wilt u gebruiken?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Account toevoegen"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Verhogen"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Verlagen"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index a634006e2fb8..ce284d0f71b7 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Wyczyść zapytanie"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Wyślij zapytanie"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Wyszukiwanie głosowe"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Włączyć Czytanie dotykiem?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> chce włączyć Czytanie dotykiem. Gdy ta funkcja jest włączona, słyszysz i widzisz opisy elementów, które są pod Twoim palcem, oraz możesz obsługiwać tablet gestami."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> chce włączyć Czytanie dotykiem. Gdy ta funkcja jest włączona, słyszysz i widzisz opisy elementów, które są pod Twoim palcem, oraz możesz obsługiwać telefon gestami."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 miesiąc temu"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Ponad 1 miesiąc temu"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Konfiguruj metody wprowadzania"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Klawiatura fizyczna"</string>
<string name="hardware" msgid="7517821086888990278">"Sprzęt"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Wybierz układ klawiatury"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Kliknij, by wybrać układ klawiatury."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandydaci"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Nie wykonuj teraz żadnych czynności."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Wybierz konto."</string>
<string name="add_account_label" msgid="2935267344849993553">"Dodaj konto"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Którego konta chcesz użyć?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Dodaj konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Zwiększ"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Zmniejsz"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Tylko raz"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 38ce3acbe246..956cadce0aac 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Não fazer nada por agora"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Selecionar uma conta"</string>
<string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Que conta pretende utilizar?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Diminuir"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 2a4855ce0614..e9cf75bf7ead 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Limpar consulta"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Enviar consulta"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Pesquisa por voz"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Ativar exploração pelo toque?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a exploração pelo toque. Com ela, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o tablet através de gestos."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> quer ativar a exploração pelo toque. Com ela, você pode ouvir ou ver descrições do que está sob seu dedo e interagir com o telefone através de gestos."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 mês atrás"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Antes de 1 mês atrás"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de entrada"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecione o layout de teclado"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toque para selecionar um layout de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"candidatos"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Não fazer nada por enquanto"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Escolha uma conta"</string>
<string name="add_account_label" msgid="2935267344849993553">"Adicionar uma conta"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Qual conta você deseja usar?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Aumentar"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Diminuir"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Só uma vez"</string>
</resources>
diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml
index 397b0953aee5..fdf8159e5340 100644
--- a/core/res/res/values-rm/strings.xml
+++ b/core/res/res/values-rm/strings.xml
@@ -1915,8 +1915,6 @@
<skip />
<!-- no translation found for add_account_label (2935267344849993553) -->
<skip />
- <!-- no translation found for choose_account_text (6303348737197849675) -->
- <skip />
<!-- no translation found for add_account_button_label (3611982894853435874) -->
<skip />
<!-- no translation found for number_picker_increment_button (2412072272832284313) -->
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 52fd28ec8b64..32b6f30369aa 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Nu trebuie să luaţi nicio măsură deocamdată"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Alegeţi un cont"</string>
<string name="add_account_label" msgid="2935267344849993553">"Adăugaţi un cont"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Ce cont doriţi să utilizaţi?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Adăugaţi un cont"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Creşteţi"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Reduceţi"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 75face45285d..f846198f5883 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Удалить запрос"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Отправить запрос"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Голосовой поиск"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Включить \"Изучение касанием\"?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хочет включить функцию \"Изучение касанием\". Она позволяет прослушивать или просматривать описание элементов, которых вы касаетесь, и управлять планшетным ПК с помощью жестов."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хочет включить функцию \"Изучение касанием\". Она позволяет прослушивать или просматривать описание элементов, которых вы касаетесь, и управлять телефоном с помощью жестов."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 месяц назад"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Более месяца назад"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Настройка способов ввода"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Физическая клавиатура"</string>
<string name="hardware" msgid="7517821086888990278">"Аппаратура"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Выберите раскладку клавиатуры"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Нажмите, чтобы выбрать раскладку клавиатуры."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"варианты"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Ничего не делать"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Выберите аккаунт"</string>
<string name="add_account_label" msgid="2935267344849993553">"Добавить аккаунт"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Выберите аккаунт"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Добавить аккаунт"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Увеличить"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Уменьшить"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Всегда"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Только один раз"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 6f1c5e7ce8e3..6c5ea3266ab9 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Teraz nič nerobte"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Zvoliť účet"</string>
<string name="add_account_label" msgid="2935267344849993553">"Pridať účet"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Ktorý účet chcete použiť?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Pridať účet"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Zvýšiť"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Znížiť"</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 2e019d4e2442..049c1d8b86b5 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Za zdaj ne naredi ničesar"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Izberite račun"</string>
<string name="add_account_label" msgid="2935267344849993553">"Dodajanje računa"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Kateri račun želite uporabiti?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Več"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Manj"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 6f067a132b03..fa7da0100224 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Не ради ништа за сада"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Избор налога"</string>
<string name="add_account_label" msgid="2935267344849993553">"Додај налог"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Који налог желите да користите?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Додај налог"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Повећавање"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Смањивање"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index c9b7e2bd084d..bf7c6b241e91 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Ta bort frågan"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Skicka fråga"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Röstsökning"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Aktivera Explore by Touch?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by Touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med pekdatorn."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> vill aktivera Explore by Touch. När funktionen är aktiv kan du höra eller se beskrivningar av vad du har under fingret eller utföra gester för att göra saker med telefonen."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"för 1 månad sedan"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"För mer än en månad sedan"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Konfigurera inmatningsmetoder"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysiskt tangentbord"</string>
<string name="hardware" msgid="7517821086888990278">"Maskinvara"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Välj en tangentbordslayout"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Välj en tangentbordslayout genom att trycka."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"kandidater"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Gör ingenting just nu"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Välj ett konto"</string>
<string name="add_account_label" msgid="2935267344849993553">"Lägg till ett konto"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Vilket konto vill du använda?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Lägg till konto"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Öka"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Minska"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vill du öppna webbläsaren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vill du ta emot samtal?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Bara en gång"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 35079c580e5d..405c74f4faf9 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Usifanye chochote kwa sasa"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Chagua akaunti"</string>
<string name="add_account_label" msgid="2935267344849993553">"Ongeza akaunti"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Je, ni akaunti gani unataka kutumia?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Ongeza akaunti"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Ongeza"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Punguza"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 34e443362cc3..a70740de5cee 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1234,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"ไม่ต้องทำอะไรในขณะนี้"</string>
<string name="choose_account_label" msgid="5655203089746423927">"เลือกบัญชี"</string>
<string name="add_account_label" msgid="2935267344849993553">"เพิ่มบัญชี"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"คุณต้องการใช้บัญชีใด"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"เพิ่มบัญชี"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"เพิ่ม"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"ลด"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index a659e9e028e4..c64a4a159320 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"I-clear ang query"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Isumite ang query"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Paghahanap gamit ang boses"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Paganahin ang Galugad sa pagpindot?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"Nais paganahin ng <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ang Galugarin sa pamamagitan ng pagpindot. Kapag naka-on ang Galugarin sa pamamagitan ng pagpindot, maaari mong marinig o makita ang mga paglalarawan ng nasa ilalim ng iyong daliri o maaari kang magsagawa ng mga galaw upang makipag-ugnayan sa tablet."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"Nais paganahin ng <xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ang Galugarin sa pamamagitan ng pagpindot. Kapag naka-on ang Galugarin sa pamamagitan ng pagpindot, maaari mong marinig o makita ang mga paglalarawan ng nasa ilalim ng iyong daliri o maaari kang magsagawa ng mga galaw upang makipag-ugnayan sa telepono."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 buwan ang nakalipas"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Bago ang nakalipas na 1 buwan"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"I-set up paraan ng pag-input"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Aktwal na keyboard"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pumili ng layout ng keyboard"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Pindutin upang pumili ng layout ng keyboard."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"mga kandidato"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Walang gawin sa ngayon"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Pumili ng isang account"</string>
<string name="add_account_label" msgid="2935267344849993553">"Magdagdag ng account"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Aling account ang nais mong gamitin?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Magdagdag ng account"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Dagdagan"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Bawasan"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Isang beses lang"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index c9ee1155176a..f2430c23704b 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Şimdilik bir şey yapma"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Bir hesap seçin"</string>
<string name="add_account_label" msgid="2935267344849993553">"Hesap ekleyin"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Hangi hesabı kullanmak istiyorsunuz?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Hesap ekle"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Artır"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Azalt"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 5d069347064c..207ea061e0b2 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Очистити запит"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Наіслати запит"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Голосовий пошук"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Увімкнути дослідження дотиком?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хоче ввімкнути функцію дослідження дотиком. Увімкнувши функцію дослідження дотиком, можна чути або бачити опис елемента, розташованого під вашим пальцем, або виконувати жести для взаємодії з планшетним ПК."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> хоче ввімкнути функцію дослідження дотиком. Увімкнувши функцію дослідження дотиком, можна чути або бачити опис елемента, розташованого під вашим пальцем, або виконувати жести для взаємодії з телефоном."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 міс. тому"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Раніше 1 місяця тому"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Налаштувати методи введення"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Фізична клавіатура"</string>
<string name="hardware" msgid="7517821086888990278">"Обладнання"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Виберіть розкладку клавіатури"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Торкніться, щоб вибрати розкладку клавіатури."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"кандидати"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Наразі нічого не робити"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Вибрати обліковий запис"</string>
<string name="add_account_label" msgid="2935267344849993553">"Додати обліковий запис"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Який обліковий запис використовувати?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Додати облік. запис"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Збільшити"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Зменшити"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Лише цього разу"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index cce563a6f7fe..c6f2971a2094 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"Xóa truy vấn"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Gửi truy vấn"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Tìm kiếm bằng giọng nói"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Bật Khám phá bằng cách chạm?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> muốn bật Khám phá bằng cách chạm. Khi Khám phá bằng cách chạm được bật, bạn có thể nghe hoặc xem mô tả dưới ngón tay bạn hoặc thực hiện cử chỉ để tương tác với máy tính bảng."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> muốn bật Khám phá bằng cách chạm. Khi Khám phá bằng cách chạm được bật, bạn có thể nghe hoặc xem mô tả dưới ngón tay bạn hoặc thực hiện cử chỉ để tương tác với điện thoại."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 tháng trước"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Trước 1 tháng trước"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Thiết lập phương thức nhập"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Bàn phím thực"</string>
<string name="hardware" msgid="7517821086888990278">"Phần cứng"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Chọn bố cục bàn phím"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Chạm để chọn bố cục bàn phím."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"ứng viên"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Không thực hiện tác vụ nào bây giờ"</string>
<string name="choose_account_label" msgid="5655203089746423927">"Chọn tài khoản"</string>
<string name="add_account_label" msgid="2935267344849993553">"Thêm tài khoản"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Bạn muốn sử dụng tài khoản nào?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Thêm tài khoản"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Tăng"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Giảm"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Khởi chạy trình duyệt?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn chọn"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Chỉ một lần"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 865761b463a0..01871597e8c2 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"清除查询"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"提交查询"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"语音搜索"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"是否启用“触摸浏览”?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>想要启用“触摸浏览”。“触摸浏览”启用后,您可以听到或看到触摸内容的说明,或通过手指操作与平板电脑互动。"</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g>想要启用“触摸浏览”。“触摸浏览”启用后,您可以听到或看到触摸内容的说明,或通过手指操作与手机互动。"</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 个月前"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 个月前"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"设置输入法"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"物理键盘"</string>
<string name="hardware" msgid="7517821086888990278">"硬件"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"选择键盘布局"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"触摸以选择键盘布局。"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"候选"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"目前不进行任何操作"</string>
<string name="choose_account_label" msgid="5655203089746423927">"选择帐户"</string>
<string name="add_account_label" msgid="2935267344849993553">"添加帐户"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"您要使用哪个帐户?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"添加帐户"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"增大"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"减小"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"仅一次"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 95b3fa3870cd..2c6a4ed28ad5 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1239,7 +1239,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"暫不執行"</string>
<string name="choose_account_label" msgid="5655203089746423927">"選擇帳戶"</string>
<string name="add_account_label" msgid="2935267344849993553">"新增帳戶"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"您要使用哪個帳戶?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"新增帳戶"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"增加"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"減少"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 0c7d269be49e..c979aec8e70f 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -855,12 +855,9 @@
<string name="searchview_description_clear" msgid="1330281990951833033">"xazulula umbuzo"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Thumela umbuzo"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"Ukusesha ngezwi"</string>
- <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
- <skip />
- <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
- <skip />
+ <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"Nika amandla i-Explore by Touch?"</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"I-<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ifuna ukunika amandla i-Explore by Touch. Uma i-Explore by Touch ikhanya, ungezwa noma ubone izincazelo ezingaphansi komunwe wakho noma wenze izenzo zomzimba ukuze uxhumane nethebhulethi."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"I-<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> ifuna ukunika amandla i-Explore by Touch. Uma i-Explore by Touch ikhanya, ungezwa noma ubone izincazelo ezingaphansi komunwe wakho noma wenze izenzo zomzimba ukuze uxhumane nefoni."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"inyanga engu-1 edlule"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Ngaphambi kwenyanga engu-1 edlule"</string>
<plurals name="num_seconds_ago">
@@ -1127,10 +1124,8 @@
<string name="configure_input_methods" msgid="9091652157722495116">"Izilungiselelo zezindlela zokufakwayo"</string>
<string name="use_physical_keyboard" msgid="6203112478095117625">"Ukwakheka kwekhibhodi"</string>
<string name="hardware" msgid="7517821086888990278">"I-Hardware"</string>
- <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
- <skip />
- <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
- <skip />
+ <string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Khetha isendlalelo sekhibhodi"</string>
+ <string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Thinta ukuze ukhethe isendlalelo sekhibhodi."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
<string name="candidates_style" msgid="4333913089637062257"><u>"abahlanganyeli"</u></string>
@@ -1239,7 +1234,6 @@
<string name="sync_do_nothing" msgid="3743764740430821845">"Ungenzi lutho okwamanje."</string>
<string name="choose_account_label" msgid="5655203089746423927">"Khetha i-akhawunti"</string>
<string name="add_account_label" msgid="2935267344849993553">"Yengeza i-akhawunti"</string>
- <string name="choose_account_text" msgid="6303348737197849675">"Ingabe iyiphi i-akhawunti ofuna ukuyisebenzisa?"</string>
<string name="add_account_button_label" msgid="3611982894853435874">"Engeza i-akhawunti"</string>
<string name="number_picker_increment_button" msgid="2412072272832284313">"Khulisa"</string>
<string name="number_picker_decrement_button" msgid="476050778386779067">"Yehlisa"</string>
@@ -1324,6 +1318,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Njalo"</string>
- <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="2404644797149173758">"Kanje nje"</string>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 4cfbff504da6..bf9fe42177f9 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -28,7 +28,6 @@
this.
-->
<java-symbol type="id" name="account_name" />
- <java-symbol type="id" name="account_row_checkmark" />
<java-symbol type="id" name="account_row_icon" />
<java-symbol type="id" name="account_row_text" />
<java-symbol type="id" name="account_type" />
@@ -41,7 +40,6 @@
<java-symbol type="id" name="action_menu_presenter" />
<java-symbol type="id" name="action_mode_close_button" />
<java-symbol type="id" name="activity_chooser_view_content" />
- <java-symbol type="id" name="addAccount" />
<java-symbol type="id" name="albumart" />
<java-symbol type="id" name="alertTitle" />
<java-symbol type="id" name="allow_button" />
@@ -122,7 +120,6 @@
<java-symbol type="id" name="old_app_action" />
<java-symbol type="id" name="old_app_description" />
<java-symbol type="id" name="old_app_icon" />
- <java-symbol type="id" name="overflow_title" />
<java-symbol type="id" name="package_label" />
<java-symbol type="id" name="packages_list" />
<java-symbol type="id" name="pause" />
@@ -212,6 +209,8 @@
<java-symbol type="id" name="inbox_text6" />
<java-symbol type="id" name="inbox_more" />
<java-symbol type="id" name="status_bar_latest_event_content" />
+ <java-symbol type="id" name="action_divider" />
+ <java-symbol type="id" name="overflow_divider" />
<java-symbol type="attr" name="actionModeShareDrawable" />
<java-symbol type="attr" name="alertDialogCenterButtons" />
@@ -301,6 +300,7 @@
<java-symbol type="dimen" name="notification_title_text_size" />
<java-symbol type="dimen" name="notification_subtext_size" />
+ <java-symbol type="string" name="add_account_button_label" />
<java-symbol type="string" name="addToDictionary" />
<java-symbol type="string" name="action_bar_home_description" />
<java-symbol type="string" name="action_bar_up_description" />
@@ -1027,7 +1027,6 @@
<java-symbol type="layout" name="choose_account" />
<java-symbol type="layout" name="choose_account_row" />
<java-symbol type="layout" name="choose_account_type" />
- <java-symbol type="layout" name="choose_selected_account_row" />
<java-symbol type="layout" name="choose_type_and_account" />
<java-symbol type="layout" name="grant_credentials_permission" />
<java-symbol type="layout" name="number_picker" />
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 592943929122..2b966f68c82c 100755
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2505,7 +2505,7 @@
<!-- Title for a warning message about the interaction model changes after allowing an accessibility
service to put the device into explore by touch mode, displayed as a dialog message when
- the user selects to enables the service. (default). [CHAR LIMIT=35] -->
+ the user selects to enables the service. (default). [CHAR LIMIT=45] -->
<string name="enable_explore_by_touch_warning_title">Enable Explore by Touch?</string>
<!-- Summary for a warning message about the interaction model changes after allowing an accessibility
service to put the device into explore by touch mode, displayed as a dialog message when
@@ -3382,9 +3382,8 @@
<string name="choose_account_label">Choose an account</string>
<string name="add_account_label">"Add an account"</string>
- <string name="choose_account_text">"Which account do you want to use?"</string>
- <!-- Button label to add an account [CHAR LIMIT=20] -->
+ <!-- List item to add an account [CHAR LIMIT=20] -->
<string name="add_account_button_label">Add account</string>
<!-- NumberPicker - accessibility support -->
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index a54cdf1f7e8e..223d17a4aa2e 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -239,7 +239,7 @@ please see styles_device_defaults.xml.
</style>
<!-- Notification content styles -->
<style name="TextAppearance.StatusBar.EventContent">
- <item name="android:textColor">#808080</item>
+ <item name="android:textColor">#999999</item>
<item name="android:textSize">@dimen/notification_text_size</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Title">
@@ -253,11 +253,14 @@ please see styles_device_defaults.xml.
</style>
<style name="TextAppearance.StatusBar.EventContent.Info">
<item name="android:textSize">@dimen/notification_subtext_size</item>
- <item name="android:textColor">#666666</item>
+ <item name="android:textColor">#999999</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Time">
<item name="android:textSize">@dimen/notification_subtext_size</item>
- <item name="android:textColor">#666666</item>
+ <item name="android:textColor">#999999</item>
+ </style>
+ <style name="TextAppearance.StatusBar.EventContent.Emphasis">
+ <item name="android:textColor">#CCCCCC</item>
</style>
<style name="TextAppearance.Small.CalendarViewWeekDayView">
diff --git a/include/private/hwui/DrawGlInfo.h b/include/private/hwui/DrawGlInfo.h
index e33823e96b9e..fc810be8dc62 100644
--- a/include/private/hwui/DrawGlInfo.h
+++ b/include/private/hwui/DrawGlInfo.h
@@ -72,7 +72,14 @@ struct DrawGlInfo {
// The functor needs to be invoked again but will
// not redraw. Only the functor is invoked again
// (unless another functor requests a redraw.)
- kStatusInvoke = 0x2
+ kStatusInvoke = 0x2,
+ // DisplayList actually issued GL drawing commands.
+ // This is used to signal the HardwareRenderer that the
+ // buffers should be flipped - otherwise, there were no
+ // changes to the buffer, so no need to flip. Some hardware
+ // has issues with stale buffer contents when no GL
+ // commands are issued.
+ kStatusDrew = 0x4
};
}; // struct DrawGlInfo
diff --git a/libs/hwui/DisplayListRenderer.cpp b/libs/hwui/DisplayListRenderer.cpp
index 546925e6b963..88d2209154c1 100644
--- a/libs/hwui/DisplayListRenderer.cpp
+++ b/libs/hwui/DisplayListRenderer.cpp
@@ -833,7 +833,7 @@ void DisplayList::setViewProperties(OpenGLRenderer& renderer, uint32_t level) {
* purposes of logging display list info for a given view.
*/
status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flags, uint32_t level) {
- status_t drawGlStatus = 0;
+ status_t drawGlStatus = DrawGlInfo::kStatusDone;
TextContainer text;
mReader.rewind();
@@ -859,7 +859,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
DISPLAY_LIST_LOGD("%s%s %d", (char*) indent, "RestoreToCount", restoreTo);
renderer.restoreToCount(restoreTo);
renderer.endMark();
- return false;
+ return drawGlStatus;
}
DisplayListLogBuffer& logBuffer = DisplayListLogBuffer::getInstance();
@@ -1002,7 +1002,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
}
DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
layer, x, y, paint);
- renderer.drawLayer(layer, x, y, paint);
+ drawGlStatus |= renderer.drawLayer(layer, x, y, paint);
}
break;
case DrawBitmap: {
@@ -1015,7 +1015,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
}
DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
bitmap, x, y, paint);
- renderer.drawBitmap(bitmap, x, y, paint);
+ drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
}
break;
case DrawBitmapMatrix: {
@@ -1024,7 +1024,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %p, %p, %p", (char*) indent, OP_NAMES[op],
bitmap, matrix, paint);
- renderer.drawBitmap(bitmap, matrix, paint);
+ drawGlStatus |= renderer.drawBitmap(bitmap, matrix, paint);
}
break;
case DrawBitmapRect: {
@@ -1041,7 +1041,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
(char*) indent, OP_NAMES[op], bitmap,
f1, f2, f3, f4, f5, f6, f7, f8,paint);
- renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
+ drawGlStatus |= renderer.drawBitmap(bitmap, f1, f2, f3, f4, f5, f6, f7, f8, paint);
}
break;
case DrawBitmapData: {
@@ -1051,7 +1051,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %p, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
bitmap, x, y, paint);
- renderer.drawBitmap(bitmap, x, y, paint);
+ drawGlStatus |= renderer.drawBitmap(bitmap, x, y, paint);
}
break;
case DrawBitmapMesh: {
@@ -1067,7 +1067,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
- renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices, colors, paint);
+ drawGlStatus |= renderer.drawBitmapMesh(bitmap, meshWidth, meshHeight, vertices,
+ colors, paint);
}
break;
case DrawPatch: {
@@ -1091,15 +1092,15 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
- renderer.drawPatch(bitmap, xDivs, yDivs, colors, xDivsCount, yDivsCount,
- numColors, left, top, right, bottom, paint);
+ drawGlStatus |= renderer.drawPatch(bitmap, xDivs, yDivs, colors,
+ xDivsCount, yDivsCount, numColors, left, top, right, bottom, paint);
}
break;
case DrawColor: {
int32_t color = getInt();
int32_t xferMode = getInt();
DISPLAY_LIST_LOGD("%s%s 0x%x %d", (char*) indent, OP_NAMES[op], color, xferMode);
- renderer.drawColor(color, (SkXfermode::Mode) xferMode);
+ drawGlStatus |= renderer.drawColor(color, (SkXfermode::Mode) xferMode);
}
break;
case DrawRect: {
@@ -1110,7 +1111,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p", (char*) indent, OP_NAMES[op],
f1, f2, f3, f4, paint);
- renderer.drawRect(f1, f2, f3, f4, paint);
+ drawGlStatus |= renderer.drawRect(f1, f2, f3, f4, paint);
}
break;
case DrawRoundRect: {
@@ -1123,7 +1124,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p",
(char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, paint);
- renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
+ drawGlStatus |= renderer.drawRoundRect(f1, f2, f3, f4, f5, f6, paint);
}
break;
case DrawCircle: {
@@ -1133,7 +1134,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %p",
(char*) indent, OP_NAMES[op], f1, f2, f3, paint);
- renderer.drawCircle(f1, f2, f3, paint);
+ drawGlStatus |= renderer.drawCircle(f1, f2, f3, paint);
}
break;
case DrawOval: {
@@ -1144,7 +1145,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %p",
(char*) indent, OP_NAMES[op], f1, f2, f3, f4, paint);
- renderer.drawOval(f1, f2, f3, f4, paint);
+ drawGlStatus |= renderer.drawOval(f1, f2, f3, f4, paint);
}
break;
case DrawArc: {
@@ -1158,14 +1159,14 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p",
(char*) indent, OP_NAMES[op], f1, f2, f3, f4, f5, f6, i1, paint);
- renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
+ drawGlStatus |= renderer.drawArc(f1, f2, f3, f4, f5, f6, i1 == 1, paint);
}
break;
case DrawPath: {
SkPath* path = getPath();
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %p, %p", (char*) indent, OP_NAMES[op], path, paint);
- renderer.drawPath(path, paint);
+ drawGlStatus |= renderer.drawPath(path, paint);
}
break;
case DrawLines: {
@@ -1173,7 +1174,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
float* points = getFloats(count);
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
- renderer.drawLines(points, count, paint);
+ drawGlStatus |= renderer.drawLines(points, count, paint);
}
break;
case DrawPoints: {
@@ -1181,7 +1182,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
float* points = getFloats(count);
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s", (char*) indent, OP_NAMES[op]);
- renderer.drawPoints(points, count, paint);
+ drawGlStatus |= renderer.drawPoints(points, count, paint);
}
break;
case DrawText: {
@@ -1193,7 +1194,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
float length = getFloat();
DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %.2f, %.2f, %p, %.2f", (char*) indent,
OP_NAMES[op], text.text(), text.length(), count, x, y, paint, length);
- renderer.drawText(text.text(), text.length(), count, x, y, paint, length);
+ drawGlStatus |= renderer.drawText(text.text(), text.length(), count, x, y,
+ paint, length);
}
break;
case DrawTextOnPath: {
@@ -1205,7 +1207,7 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent, OP_NAMES[op],
text.text(), text.length(), count, paint);
- renderer.drawTextOnPath(text.text(), text.length(), count, path,
+ drawGlStatus |= renderer.drawTextOnPath(text.text(), text.length(), count, path,
hOffset, vOffset, paint);
}
break;
@@ -1217,7 +1219,8 @@ status_t DisplayList::replay(OpenGLRenderer& renderer, Rect& dirty, int32_t flag
SkPaint* paint = getPaint(renderer);
DISPLAY_LIST_LOGD("%s%s %s, %d, %d, %p", (char*) indent,
OP_NAMES[op], text.text(), text.length(), count, paint);
- renderer.drawPosText(text.text(), text.length(), count, positions, paint);
+ drawGlStatus |= renderer.drawPosText(text.text(), text.length(), count,
+ positions, paint);
}
break;
case ResetShader: {
@@ -1490,23 +1493,25 @@ status_t DisplayListRenderer::drawDisplayList(DisplayList* displayList,
return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
+status_t DisplayListRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
addOp(DisplayList::DrawLayer);
addInt((int) layer);
addPoint(x, y);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
+status_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
const bool reject = quickReject(left, top, left + bitmap->width(), top + bitmap->height());
uint32_t* location = addOp(DisplayList::DrawBitmap, reject);
addBitmap(bitmap);
addPoint(left, top);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
+status_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
const mat4 transform(*matrix);
transform.mapRect(r);
@@ -1517,9 +1522,10 @@ void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint
addMatrix(matrix);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
+status_t DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, SkPaint* paint) {
const bool reject = quickReject(dstLeft, dstTop, dstRight, dstBottom);
@@ -1529,18 +1535,21 @@ void DisplayListRenderer::drawBitmap(SkBitmap* bitmap, float srcLeft, float srcT
addBounds(dstLeft, dstTop, dstRight, dstBottom);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
+status_t DisplayListRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top,
+ SkPaint* paint) {
const bool reject = quickReject(left, top, left + bitmap->width(), bitmap->height());
uint32_t* location = addOp(DisplayList::DrawBitmapData, reject);
addBitmapData(bitmap);
addPoint(left, top);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
+status_t DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
float* vertices, int* colors, SkPaint* paint) {
addOp(DisplayList::DrawBitmapMesh);
addBitmap(bitmap);
@@ -1554,11 +1563,12 @@ void DisplayListRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int me
addInt(0);
}
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
- const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
- float left, float top, float right, float bottom, SkPaint* paint) {
+status_t DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs,
+ const int32_t* yDivs, const uint32_t* colors, uint32_t width, uint32_t height,
+ int8_t numColors, float left, float top, float right, float bottom, SkPaint* paint) {
const bool reject = quickReject(left, top, right, bottom);
uint32_t* location = addOp(DisplayList::DrawPatch, reject);
addBitmap(bitmap);
@@ -1568,15 +1578,17 @@ void DisplayListRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, cons
addBounds(left, top, right, bottom);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
+status_t DisplayListRenderer::drawColor(int color, SkXfermode::Mode mode) {
addOp(DisplayList::DrawColor);
addInt(color);
addInt(mode);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
+status_t DisplayListRenderer::drawRect(float left, float top, float right, float bottom,
SkPaint* paint) {
const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
quickReject(left, top, right, bottom);
@@ -1584,9 +1596,10 @@ void DisplayListRenderer::drawRect(float left, float top, float right, float bot
addBounds(left, top, right, bottom);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
+status_t DisplayListRenderer::drawRoundRect(float left, float top, float right, float bottom,
float rx, float ry, SkPaint* paint) {
const bool reject = paint->getStyle() == SkPaint::kFill_Style &&
quickReject(left, top, right, bottom);
@@ -1595,32 +1608,36 @@ void DisplayListRenderer::drawRoundRect(float left, float top, float right, floa
addPoint(rx, ry);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
+status_t DisplayListRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
addOp(DisplayList::DrawCircle);
addPoint(x, y);
addFloat(radius);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
+status_t DisplayListRenderer::drawOval(float left, float top, float right, float bottom,
SkPaint* paint) {
addOp(DisplayList::DrawOval);
addBounds(left, top, right, bottom);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
+status_t DisplayListRenderer::drawArc(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
addOp(DisplayList::DrawArc);
addBounds(left, top, right, bottom);
addPoint(startAngle, sweepAngle);
addInt(useCenter ? 1 : 0);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
+status_t DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
float left, top, offset;
uint32_t width, height;
computePathBounds(path, paint, left, top, offset, width, height);
@@ -1630,23 +1647,26 @@ void DisplayListRenderer::drawPath(SkPath* path, SkPaint* paint) {
addPath(path);
addPaint(paint);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
+status_t DisplayListRenderer::drawLines(float* points, int count, SkPaint* paint) {
addOp(DisplayList::DrawLines);
addFloats(points, count);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
+status_t DisplayListRenderer::drawPoints(float* points, int count, SkPaint* paint) {
addOp(DisplayList::DrawPoints);
addFloats(points, count);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
+status_t DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
float x, float y, SkPaint* paint, float length) {
- if (!text || count <= 0) return;
+ if (!text || count <= 0) return DrawGlInfo::kStatusDone;
// TODO: We should probably make a copy of the paint instead of modifying
// it; modifying the paint will change its generationID the first
@@ -1672,11 +1692,12 @@ void DisplayListRenderer::drawText(const char* text, int bytesCount, int count,
addPaint(paint);
addFloat(length);
addSkip(location);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
+status_t DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
SkPath* path, float hOffset, float vOffset, SkPaint* paint) {
- if (!text || count <= 0) return;
+ if (!text || count <= 0) return DrawGlInfo::kStatusDone;
addOp(DisplayList::DrawTextOnPath);
addText(text, bytesCount);
addInt(count);
@@ -1685,17 +1706,19 @@ void DisplayListRenderer::drawTextOnPath(const char* text, int bytesCount, int c
addFloat(vOffset);
paint->setAntiAlias(true);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
-void DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
+status_t DisplayListRenderer::drawPosText(const char* text, int bytesCount, int count,
const float* positions, SkPaint* paint) {
- if (!text || count <= 0) return;
+ if (!text || count <= 0) return DrawGlInfo::kStatusDone;
addOp(DisplayList::DrawPosText);
addText(text, bytesCount);
addInt(count);
addFloats(positions, count * 2);
paint->setAntiAlias(true);
addPaint(paint);
+ return DrawGlInfo::kStatusDone;
}
void DisplayListRenderer::resetShader() {
diff --git a/libs/hwui/DisplayListRenderer.h b/libs/hwui/DisplayListRenderer.h
index 0ba4078e61e8..4fa1baa74199 100644
--- a/libs/hwui/DisplayListRenderer.h
+++ b/libs/hwui/DisplayListRenderer.h
@@ -576,35 +576,35 @@ public:
virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags,
uint32_t level = 0);
- virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
+ virtual status_t drawLayer(Layer* layer, float x, float y, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, SkPaint* paint);
- virtual void drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
- virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
+ virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
+ virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
float* vertices, int* colors, SkPaint* paint);
- virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
+ virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawColor(int color, SkXfermode::Mode mode);
- virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawRoundRect(float left, float top, float right, float bottom,
+ virtual status_t drawColor(int color, SkXfermode::Mode mode);
+ virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
+ virtual status_t drawRoundRect(float left, float top, float right, float bottom,
float rx, float ry, SkPaint* paint);
- virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
- virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawArc(float left, float top, float right, float bottom,
+ virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
+ virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
+ virtual status_t drawArc(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
- virtual void drawPath(SkPath* path, SkPaint* paint);
- virtual void drawLines(float* points, int count, SkPaint* paint);
- virtual void drawPoints(float* points, int count, SkPaint* paint);
- virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
+ virtual status_t drawPath(SkPath* path, SkPaint* paint);
+ virtual status_t drawLines(float* points, int count, SkPaint* paint);
+ virtual status_t drawPoints(float* points, int count, SkPaint* paint);
+ virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
SkPaint* paint, float length = -1.0f);
- virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
+ virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
float hOffset, float vOffset, SkPaint* paint);
- virtual void drawPosText(const char* text, int bytesCount, int count, const float* positions,
- SkPaint* paint);
+ virtual status_t drawPosText(const char* text, int bytesCount, int count,
+ const float* positions, SkPaint* paint);
virtual void resetShader();
virtual void setupShader(SkiaShader* shader);
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 2a8b32c4721a..2dc9726ab9ca 100644
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -336,7 +336,7 @@ status_t OpenGLRenderer::callDrawGLFunction(Functor* functor, Rect& dirty) {
info.height = getSnapshot()->height;
getSnapshot()->transform->copyTo(&info.transform[0]);
- status_t result = (*functor)(DrawGlInfo::kModeDraw, &info);
+ status_t result = (*functor)(DrawGlInfo::kModeDraw, &info) | DrawGlInfo::kStatusDrew;
if (result != DrawGlInfo::kStatusDone) {
Rect localDirty(info.dirtyLeft, info.dirtyTop, info.dirtyRight, info.dirtyBottom);
@@ -1472,17 +1472,17 @@ void OpenGLRenderer::drawAlphaBitmap(Texture* texture, float left, float top, Sk
finishDrawTexture();
}
-void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
+status_t OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
const float right = left + bitmap->width();
const float bottom = top + bitmap->height();
if (quickReject(left, top, right, bottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
Texture* texture = mCaches.textureCache.get(bitmap);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
if (CC_UNLIKELY(bitmap->getConfig() == SkBitmap::kA8_Config)) {
@@ -1490,20 +1490,22 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint
} else {
drawTextureRect(left, top, right, bottom, texture, paint);
}
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
+status_t OpenGLRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint) {
Rect r(0.0f, 0.0f, bitmap->width(), bitmap->height());
const mat4 transform(*matrix);
transform.mapRect(r);
if (quickReject(r.left, r.top, r.right, r.bottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
Texture* texture = mCaches.textureCache.get(bitmap);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
// This could be done in a cheaper way, all we need is pass the matrix
@@ -1512,14 +1514,16 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* pai
concatMatrix(matrix);
drawTextureRect(0.0f, 0.0f, bitmap->width(), bitmap->height(), texture, paint);
restore();
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
+status_t OpenGLRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint) {
const float right = left + bitmap->width();
const float bottom = top + bitmap->height();
if (quickReject(left, top, right, bottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
@@ -1527,18 +1531,20 @@ void OpenGLRenderer::drawBitmapData(SkBitmap* bitmap, float left, float top, SkP
const AutoTexture autoCleanup(texture);
drawTextureRect(left, top, right, bottom, texture, paint);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
+status_t OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
float* vertices, int* colors, SkPaint* paint) {
// TODO: Do a quickReject
if (!vertices || mSnapshot->isIgnored()) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
Texture* texture = mCaches.textureCache.get(bitmap);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
texture->setWrap(GL_CLAMP_TO_EDGE, true);
@@ -1611,19 +1617,21 @@ void OpenGLRenderer::drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHei
drawTextureMesh(0.0f, 0.0f, 1.0f, 1.0f, texture->id, alpha / 255.0f,
mode, texture->blend, &mesh[0].position[0], &mesh[0].texture[0],
GL_TRIANGLES, count, false, false, 0, false, false);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawBitmap(SkBitmap* bitmap,
+status_t OpenGLRenderer::drawBitmap(SkBitmap* bitmap,
float srcLeft, float srcTop, float srcRight, float srcBottom,
float dstLeft, float dstTop, float dstRight, float dstBottom,
SkPaint* paint) {
if (quickReject(dstLeft, dstTop, dstRight, dstBottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
Texture* texture = mCaches.textureCache.get(bitmap);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
const float width = texture->width;
@@ -1666,18 +1674,20 @@ void OpenGLRenderer::drawBitmap(SkBitmap* bitmap,
}
resetDrawTextureTexCoords(0.0f, 0.0f, 1.0f, 1.0f);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
+status_t OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
float left, float top, float right, float bottom, SkPaint* paint) {
if (quickReject(left, top, right, bottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
mCaches.activeTexture(0);
Texture* texture = mCaches.textureCache.get(bitmap);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
texture->setWrap(GL_CLAMP_TO_EDGE, true);
texture->setFilter(GL_LINEAR, true);
@@ -1726,6 +1736,8 @@ void OpenGLRenderer::drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int
true, !mesh->hasEmptyQuads);
}
}
+
+ return DrawGlInfo::kStatusDrew;
}
/**
@@ -1826,8 +1838,8 @@ void OpenGLRenderer::drawAARect(float left, float top, float right, float bottom
* 'inside' the line area being filled opaquely and the other pixels being filled according to
* how far into the boundary region they are, which is determined by shader interpolation.
*/
-void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+status_t OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) {
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
const bool isAA = paint->isAntiAlias();
// We use half the stroke width here because we're going to position the quad
@@ -2083,10 +2095,12 @@ void OpenGLRenderer::drawLines(float* points, int count, SkPaint* paint) {
if (isAA) {
finishDrawAALine(widthSlot, lengthSlot);
}
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+status_t OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) {
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
// TODO: The paint's cap style defines whether the points are square or circular
// TODO: Handle AA for round points
@@ -2138,86 +2152,92 @@ void OpenGLRenderer::drawPoints(float* points, int count, SkPaint* paint) {
}
glDrawArrays(GL_POINTS, 0, generatedVerticesCount);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
+status_t OpenGLRenderer::drawColor(int color, SkXfermode::Mode mode) {
// No need to check against the clip, we fill the clip region
- if (mSnapshot->isIgnored()) return;
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
Rect& clip(*mSnapshot->clipRect);
clip.snapToPixelBoundaries();
drawColorRect(clip.left, clip.top, clip.right, clip.bottom, color, mode, true);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawShape(float left, float top, const PathTexture* texture, SkPaint* paint) {
- if (!texture) return;
+status_t OpenGLRenderer::drawShape(float left, float top, const PathTexture* texture,
+ SkPaint* paint) {
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
const float x = left + texture->left - texture->offset;
const float y = top + texture->top - texture->offset;
drawPathTexture(texture, x, y, paint);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawRoundRect(float left, float top, float right, float bottom,
+status_t OpenGLRenderer::drawRoundRect(float left, float top, float right, float bottom,
float rx, float ry, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
mCaches.activeTexture(0);
const PathTexture* texture = mCaches.roundRectShapeCache.getRoundRect(
right - left, bottom - top, rx, ry, paint);
- drawShape(left, top, texture, paint);
+ return drawShape(left, top, texture, paint);
}
-void OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+status_t OpenGLRenderer::drawCircle(float x, float y, float radius, SkPaint* paint) {
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
mCaches.activeTexture(0);
const PathTexture* texture = mCaches.circleShapeCache.getCircle(radius, paint);
- drawShape(x - radius, y - radius, texture, paint);
+ return drawShape(x - radius, y - radius, texture, paint);
}
-void OpenGLRenderer::drawOval(float left, float top, float right, float bottom, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+status_t OpenGLRenderer::drawOval(float left, float top, float right, float bottom,
+ SkPaint* paint) {
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
mCaches.activeTexture(0);
const PathTexture* texture = mCaches.ovalShapeCache.getOval(right - left, bottom - top, paint);
- drawShape(left, top, texture, paint);
+ return drawShape(left, top, texture, paint);
}
-void OpenGLRenderer::drawArc(float left, float top, float right, float bottom,
+status_t OpenGLRenderer::drawArc(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, bool useCenter, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
if (fabs(sweepAngle) >= 360.0f) {
- drawOval(left, top, right, bottom, paint);
- return;
+ return drawOval(left, top, right, bottom, paint);
}
mCaches.activeTexture(0);
const PathTexture* texture = mCaches.arcShapeCache.getArc(right - left, bottom - top,
startAngle, sweepAngle, useCenter, paint);
- drawShape(left, top, texture, paint);
+ return drawShape(left, top, texture, paint);
}
-void OpenGLRenderer::drawRectAsShape(float left, float top, float right, float bottom,
+status_t OpenGLRenderer::drawRectAsShape(float left, float top, float right, float bottom,
SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
mCaches.activeTexture(0);
const PathTexture* texture = mCaches.rectShapeCache.getRect(right - left, bottom - top, paint);
- drawShape(left, top, texture, paint);
+ return drawShape(left, top, texture, paint);
}
-void OpenGLRenderer::drawRect(float left, float top, float right, float bottom, SkPaint* p) {
+status_t OpenGLRenderer::drawRect(float left, float top, float right, float bottom, SkPaint* p) {
if (p->getStyle() != SkPaint::kFill_Style) {
- drawRectAsShape(left, top, right, bottom, p);
- return;
+ return drawRectAsShape(left, top, right, bottom, p);
}
if (quickReject(left, top, right, bottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
SkXfermode::Mode mode;
@@ -2237,18 +2257,20 @@ void OpenGLRenderer::drawRect(float left, float top, float right, float bottom,
} else {
drawColorRect(left, top, right, bottom, color, mode);
}
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count,
+status_t OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count,
const float* positions, SkPaint* paint) {
if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
(paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
// NOTE: Skia does not support perspective transform on drawPosText yet
if (!mSnapshot->transform->isSimple()) {
- return;
+ return DrawGlInfo::kStatusDone;
}
float x = 0.0f;
@@ -2308,13 +2330,15 @@ void OpenGLRenderer::drawPosText(const char* text, int bytesCount, int count,
}
#endif
}
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
+status_t OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
float x, float y, SkPaint* paint, float length) {
if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
(paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
if (length < 0.0f) length = paint->measureText(text, bytesCount);
@@ -2332,7 +2356,7 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
SkPaint::FontMetrics metrics;
paint->getFontMetrics(&metrics, 0.0f);
if (quickReject(x, y + metrics.fTop, x + length, y + metrics.fBottom)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
const float oldX = x;
@@ -2432,13 +2456,15 @@ void OpenGLRenderer::drawText(const char* text, int bytesCount, int count,
}
drawTextDecorations(text, bytesCount, length, oldX, oldY, paint);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
+status_t OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
float hOffset, float vOffset, SkPaint* paint) {
if (text == NULL || count == 0 || mSnapshot->isIgnored() ||
(paint->getAlpha() == 0 && paint->getXfermode() == NULL)) {
- return;
+ return DrawGlInfo::kStatusDone;
}
FontRenderer& fontRenderer = mCaches.fontRenderer.getFontRenderer(paint);
@@ -2482,27 +2508,31 @@ void OpenGLRenderer::drawTextOnPath(const char* text, int bytesCount, int count,
}
#endif
}
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {
- if (mSnapshot->isIgnored()) return;
+status_t OpenGLRenderer::drawPath(SkPath* path, SkPaint* paint) {
+ if (mSnapshot->isIgnored()) return DrawGlInfo::kStatusDone;
mCaches.activeTexture(0);
// TODO: Perform early clip test before we rasterize the path
const PathTexture* texture = mCaches.pathCache.get(path, paint);
- if (!texture) return;
+ if (!texture) return DrawGlInfo::kStatusDone;
const AutoTexture autoCleanup(texture);
const float x = texture->left - texture->offset;
const float y = texture->top - texture->offset;
drawPathTexture(texture, x, y, paint);
+
+ return DrawGlInfo::kStatusDrew;
}
-void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
+status_t OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
if (!layer || quickReject(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight())) {
- return;
+ return DrawGlInfo::kStatusDone;
}
if (layer->deferredUpdateScheduled && layer->renderer && layer->displayList) {
@@ -2575,6 +2605,8 @@ void OpenGLRenderer::drawLayer(Layer* layer, float x, float y, SkPaint* paint) {
const Rect r(x, y, x + layer->layer.getWidth(), y + layer->layer.getHeight());
composeLayerRect(layer, r);
#endif
+
+ return DrawGlInfo::kStatusDrew;
}
///////////////////////////////////////////////////////////////////////////////
diff --git a/libs/hwui/OpenGLRenderer.h b/libs/hwui/OpenGLRenderer.h
index ad83b312bf3f..7703e805d04c 100644
--- a/libs/hwui/OpenGLRenderer.h
+++ b/libs/hwui/OpenGLRenderer.h
@@ -111,34 +111,34 @@ public:
virtual status_t drawDisplayList(DisplayList* displayList, Rect& dirty, int32_t flags,
uint32_t level = 0);
virtual void outputDisplayList(DisplayList* displayList, uint32_t level = 0);
- virtual void drawLayer(Layer* layer, float x, float y, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
- virtual void drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
+ virtual status_t drawLayer(Layer* layer, float x, float y, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, float left, float top, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, SkMatrix* matrix, SkPaint* paint);
+ virtual status_t drawBitmap(SkBitmap* bitmap, float srcLeft, float srcTop,
float srcRight, float srcBottom, float dstLeft, float dstTop,
float dstRight, float dstBottom, SkPaint* paint);
- virtual void drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
- virtual void drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
+ virtual status_t drawBitmapData(SkBitmap* bitmap, float left, float top, SkPaint* paint);
+ virtual status_t drawBitmapMesh(SkBitmap* bitmap, int meshWidth, int meshHeight,
float* vertices, int* colors, SkPaint* paint);
- virtual void drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
+ virtual status_t drawPatch(SkBitmap* bitmap, const int32_t* xDivs, const int32_t* yDivs,
const uint32_t* colors, uint32_t width, uint32_t height, int8_t numColors,
float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawColor(int color, SkXfermode::Mode mode);
- virtual void drawRect(float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawRoundRect(float left, float top, float right, float bottom,
+ virtual status_t drawColor(int color, SkXfermode::Mode mode);
+ virtual status_t drawRect(float left, float top, float right, float bottom, SkPaint* paint);
+ virtual status_t drawRoundRect(float left, float top, float right, float bottom,
float rx, float ry, SkPaint* paint);
- virtual void drawCircle(float x, float y, float radius, SkPaint* paint);
- virtual void drawOval(float left, float top, float right, float bottom, SkPaint* paint);
- virtual void drawArc(float left, float top, float right, float bottom,
+ virtual status_t drawCircle(float x, float y, float radius, SkPaint* paint);
+ virtual status_t drawOval(float left, float top, float right, float bottom, SkPaint* paint);
+ virtual status_t drawArc(float left, float top, float right, float bottom,
float startAngle, float sweepAngle, bool useCenter, SkPaint* paint);
- virtual void drawPath(SkPath* path, SkPaint* paint);
- virtual void drawLines(float* points, int count, SkPaint* paint);
- virtual void drawPoints(float* points, int count, SkPaint* paint);
- virtual void drawText(const char* text, int bytesCount, int count, float x, float y,
+ virtual status_t drawPath(SkPath* path, SkPaint* paint);
+ virtual status_t drawLines(float* points, int count, SkPaint* paint);
+ virtual status_t drawPoints(float* points, int count, SkPaint* paint);
+ virtual status_t drawText(const char* text, int bytesCount, int count, float x, float y,
SkPaint* paint, float length = -1.0f);
- virtual void drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
+ virtual status_t drawTextOnPath(const char* text, int bytesCount, int count, SkPath* path,
float hOffset, float vOffset, SkPaint* paint);
- virtual void drawPosText(const char* text, int bytesCount, int count,
+ virtual status_t drawPosText(const char* text, int bytesCount, int count,
const float* positions, SkPaint* paint);
virtual void resetShader();
@@ -336,7 +336,7 @@ private:
* @param texture The texture reprsenting the shape
* @param paint The paint to draw the shape with
*/
- void drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
+ status_t drawShape(float left, float top, const PathTexture* texture, SkPaint* paint);
/**
* Renders the rect defined by the specified bounds as a shape.
@@ -349,7 +349,7 @@ private:
* @param bottom The bottom coordinate of the rect to draw
* @param p The paint to draw the rect with
*/
- void drawRectAsShape(float left, float top, float right, float bottom, SkPaint* p);
+ status_t drawRectAsShape(float left, float top, float right, float bottom, SkPaint* p);
/**
* Draws the specified texture as an alpha bitmap. Alpha bitmaps obey
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 6c7c160b14d2..6b9522b39e86 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -19,6 +19,7 @@ package android.media;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -2376,6 +2377,42 @@ public class AudioManager {
}
}
+ /**
+ * Indicate wired accessory connection state change.
+ * @param device type of device connected/disconnected (AudioManager.DEVICE_OUT_xxx)
+ * @param state new connection state: 1 connected, 0 disconnected
+ * @param name device name
+ * {@hide}
+ */
+ public void setWiredDeviceConnectionState(int device, int state, String name) {
+ IAudioService service = getService();
+ try {
+ service.setWiredDeviceConnectionState(device, state, name);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in setWiredDeviceConnectionState "+e);
+ }
+ }
+
+ /**
+ * Indicate A2DP sink connection state change.
+ * @param device Bluetooth device connected/disconnected
+ * @param state new connection state (BluetoothProfile.STATE_xxx)
+ * @return a delay in ms that the caller should wait before broadcasting
+ * BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED intent.
+ * {@hide}
+ */
+ public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state) {
+ IAudioService service = getService();
+ int delay = 0;
+ try {
+ delay = service.setBluetoothA2dpDeviceConnectionState(device, state);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Dead object in setBluetoothA2dpDeviceConnectionState "+e);
+ } finally {
+ return delay;
+ }
+ }
+
/** {@hide} */
public IRingtonePlayer getRingtonePlayer() {
try {
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 5e338abf46c0..a2c20fd03270 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -135,6 +135,8 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
private static final int MSG_RCDISPLAY_UPDATE = 13;
private static final int MSG_SET_ALL_VOLUMES = 14;
private static final int MSG_PERSIST_MASTER_VOLUME_MUTE = 15;
+ private static final int MSG_SET_WIRED_DEVICE_CONNECTION_STATE = 16;//handled under wakelock
+ private static final int MSG_SET_A2DP_CONNECTION_STATE = 17; //handled under wakelock
// flags for MSG_PERSIST_VOLUME indicating if current and/or last audible volume should be
@@ -408,7 +410,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
com.android.internal.R.bool.config_voice_capable);
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
- mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "mediaKeyEvent");
+ mMediaEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleMediaEvent");
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
mHasVibrator = vibrator == null ? false : vibrator.hasVibrator();
@@ -442,15 +444,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// Register for device connection intent broadcasts.
IntentFilter intentFilter =
- new IntentFilter(Intent.ACTION_HEADSET_PLUG);
-
- intentFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
- intentFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
+ new IntentFilter(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
intentFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
intentFilter.addAction(Intent.ACTION_DOCK_EVENT);
- intentFilter.addAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG);
- intentFilter.addAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG);
- intentFilter.addAction(Intent.ACTION_HDMI_AUDIO_PLUG);
intentFilter.addAction(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG);
intentFilter.addAction(Intent.ACTION_USB_AUDIO_DEVICE_PLUG);
intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
@@ -1961,7 +1957,19 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
deviceList = a2dp.getConnectedDevices();
if (deviceList.size() > 0) {
btDevice = deviceList.get(0);
- handleA2dpConnectionStateChange(btDevice, a2dp.getConnectionState(btDevice));
+ synchronized (mConnectedDevices) {
+ int state = a2dp.getConnectionState(btDevice);
+ int delay = checkSendBecomingNoisyIntent(
+ AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
+ (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0);
+ sendMsg(mAudioHandler,
+ MSG_SET_A2DP_CONNECTION_STATE,
+ SENDMSG_QUEUE,
+ state,
+ 0,
+ btDevice,
+ delay);
+ }
}
break;
@@ -2220,6 +2228,15 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
// Message helper methods
+ /**
+ * Queue a message on the given handler's message queue, after acquiring the service wake lock.
+ * Note that the wake lock needs to be released after the message has been handled.
+ */
+ private void queueMsgUnderWakeLock(Handler handler, int msg,
+ int arg1, int arg2, Object obj, int delay) {
+ mMediaEventWakeLock.acquire();
+ sendMsg(handler, msg, SENDMSG_QUEUE, arg1, arg2, obj, delay);
+ }
private static void sendMsg(Handler handler, int msg,
int existingMsgPolicy, int arg1, int arg2, Object obj, int delay) {
@@ -2262,6 +2279,34 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
return device;
}
+ public void setWiredDeviceConnectionState(int device, int state, String name) {
+ synchronized (mConnectedDevices) {
+ int delay = checkSendBecomingNoisyIntent(device, state);
+ queueMsgUnderWakeLock(mAudioHandler,
+ MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
+ device,
+ state,
+ name,
+ delay);
+ }
+ }
+
+ public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state)
+ {
+ int delay;
+ synchronized (mConnectedDevices) {
+ delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
+ (state == BluetoothA2dp.STATE_CONNECTED) ? 1 : 0);
+ queueMsgUnderWakeLock(mAudioHandler,
+ MSG_SET_A2DP_CONNECTION_STATE,
+ state,
+ 0,
+ device,
+ delay);
+ }
+ return delay;
+ }
+
///////////////////////////////////////////////////////////////////////////
// Inner classes
///////////////////////////////////////////////////////////////////////////
@@ -2959,6 +3004,16 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
case MSG_BT_HEADSET_CNCT_FAILED:
resetBluetoothSco();
break;
+
+ case MSG_SET_WIRED_DEVICE_CONNECTION_STATE:
+ onSetWiredDeviceConnectionState(msg.arg1, msg.arg2, (String)msg.obj);
+ mMediaEventWakeLock.release();
+ break;
+
+ case MSG_SET_A2DP_CONNECTION_STATE:
+ onSetA2dpConnectionState((BluetoothDevice)msg.obj, msg.arg1);
+ mMediaEventWakeLock.release();
+ break;
}
}
}
@@ -3020,7 +3075,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
// must be called synchronized on mConnectedDevices
private void makeA2dpDeviceUnavailableNow(String address) {
- sendBecomingNoisyIntent();
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
address);
@@ -3050,7 +3104,7 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
return mAudioHandler.hasMessages(MSG_BTA2DP_DOCK_TIMEOUT);
}
- private void handleA2dpConnectionStateChange(BluetoothDevice btDevice, int state)
+ private void onSetA2dpConnectionState(BluetoothDevice btDevice, int state)
{
if (btDevice == null) {
return;
@@ -3116,6 +3170,76 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
return false;
}
+ // Devices which removal triggers intent ACTION_AUDIO_BECOMING_NOISY. The intent is only
+ // sent if none of these devices is connected.
+ int mBecomingNoisyIntentDevices =
+ AudioSystem.DEVICE_OUT_WIRED_HEADSET | AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
+ AudioSystem.DEVICE_OUT_ALL_A2DP;
+
+ // must be called before removing the device from mConnectedDevices
+ private int checkSendBecomingNoisyIntent(int device, int state) {
+ int delay = 0;
+ if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) {
+ int devices = 0;
+ for (int dev : mConnectedDevices.keySet()) {
+ if ((dev & mBecomingNoisyIntentDevices) != 0) {
+ devices |= dev;
+ }
+ }
+ if (devices == device) {
+ delay = 1000;
+ sendBecomingNoisyIntent();
+ }
+ }
+
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_CONNECTION_STATE) ||
+ mAudioHandler.hasMessages(MSG_SET_WIRED_DEVICE_CONNECTION_STATE)) {
+ delay = 1000;
+ }
+ return delay;
+ }
+
+ private void sendDeviceConnectionIntent(int device, int state, String name)
+ {
+ Intent intent = new Intent();
+
+ intent.putExtra("state", state);
+ intent.putExtra("name", name);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+
+ if (device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) {
+ intent.setAction(Intent.ACTION_HEADSET_PLUG);
+ intent.putExtra("microphone", 1);
+ } else if (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) {
+ intent.setAction(Intent.ACTION_HEADSET_PLUG);
+ intent.putExtra("microphone", 0);
+ } else if (device == AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET) {
+ intent.setAction(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG);
+ } else if (device == AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET) {
+ intent.setAction(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG);
+ } else if (device == AudioSystem.DEVICE_OUT_AUX_DIGITAL) {
+ intent.setAction(Intent.ACTION_HDMI_AUDIO_PLUG);
+ }
+
+ ActivityManagerNative.broadcastStickyIntent(intent, null);
+ }
+
+ private void onSetWiredDeviceConnectionState(int device, int state, String name)
+ {
+ synchronized (mConnectedDevices) {
+ if ((state == 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
+ (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE))) {
+ setBluetoothA2dpOnInt(true);
+ }
+ handleDeviceConnection((state == 1), device, "");
+ if ((state != 0) && ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
+ (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE))) {
+ setBluetoothA2dpOnInt(false);
+ }
+ sendDeviceConnectionIntent(device, state, name);
+ }
+ }
+
/* cache of the address of the last dock the device was connected to */
private String mDockAddress;
@@ -3151,12 +3275,6 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
config = AudioSystem.FORCE_NONE;
}
AudioSystem.setForceUse(AudioSystem.FOR_DOCK, config);
- } else if (action.equals(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED)) {
- state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
- BluetoothProfile.STATE_DISCONNECTED);
- BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
-
- handleA2dpConnectionStateChange(btDevice, state);
} else if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,
BluetoothProfile.STATE_DISCONNECTED);
@@ -3197,43 +3315,9 @@ public class AudioService extends IAudioService.Stub implements OnFinished {
}
}
}
- } else if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
- state = intent.getIntExtra("state", 0);
- int microphone = intent.getIntExtra("microphone", 0);
-
- if (microphone != 0) {
- device = AudioSystem.DEVICE_OUT_WIRED_HEADSET;
- } else {
- device = AudioSystem.DEVICE_OUT_WIRED_HEADPHONE;
- }
- // enable A2DP before notifying headset disconnection to avoid glitches
- if (state == 0) {
- setBluetoothA2dpOnInt(true);
- }
- handleDeviceConnection((state == 1), device, "");
- // disable A2DP after notifying headset connection to avoid glitches
- if (state != 0) {
- setBluetoothA2dpOnInt(false);
- }
- } else if (action.equals(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG)) {
- state = intent.getIntExtra("state", 0);
- Log.v(TAG, "Broadcast Receiver: Got ACTION_ANALOG_AUDIO_DOCK_PLUG, state = "+state);
- handleDeviceConnection((state == 1), AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET, "");
- } else if (action.equals(Intent.ACTION_HDMI_AUDIO_PLUG)) {
- state = intent.getIntExtra("state", 0);
- Log.v(TAG, "Broadcast Receiver: Got ACTION_HDMI_AUDIO_PLUG, state = "+state);
- handleDeviceConnection((state == 1), AudioSystem.DEVICE_OUT_AUX_DIGITAL, "");
- } else if (action.equals(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG)) {
- state = intent.getIntExtra("state", 0);
- Log.v(TAG,
- "Broadcast Receiver Got ACTION_DIGITAL_AUDIO_DOCK_PLUG, state = " + state);
- handleDeviceConnection((state == 1), AudioSystem.DEVICE_OUT_DGTL_DOCK_HEADSET, "");
} else if (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ||
action.equals(Intent.ACTION_USB_AUDIO_DEVICE_PLUG)) {
state = intent.getIntExtra("state", 0);
- if (state == 0) {
- sendBecomingNoisyIntent();
- }
int alsaCard = intent.getIntExtra("card", -1);
int alsaDevice = intent.getIntExtra("device", -1);
String params = (alsaCard == -1 && alsaDevice == -1 ? ""
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 7fbe28c5e6a0..133f30be5254 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -17,6 +17,7 @@
package android.media;
import android.app.PendingIntent;
+import android.bluetooth.BluetoothDevice;
import android.content.ComponentName;
import android.media.IAudioFocusDispatcher;
import android.media.IRemoteControlClient;
@@ -133,4 +134,7 @@ interface IAudioService {
void setRingtonePlayer(IRingtonePlayer player);
IRingtonePlayer getRingtonePlayer();
int getMasterStreamType();
+
+ void setWiredDeviceConnectionState(int device, int state, String name);
+ int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state);
}
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
index 62462bdd18d9..6995c60abfe3 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/stress/MediaRecorderStressTest.java
@@ -415,59 +415,61 @@ public class MediaRecorderStressTest extends ActivityInstrumentationTestCase2<Me
output.write("Total number of loops: " + NUMBER_OF_TIME_LAPSE_LOOPS + "\n");
try {
- output.write("No of loop: ");
- for (int i = 0; i < NUMBER_OF_TIME_LAPSE_LOOPS; i++) {
- filename = OUTPUT_FILE + i + OUTPUT_FILE_EXT;
- Log.v(TAG, filename);
- runOnLooper(new Runnable() {
- @Override
- public void run() {
- mRecorder = new MediaRecorder();
+ for (int j = 0, n = Camera.getNumberOfCameras(); j < n; j++) {
+ output.write("No of loop: camera " + j);
+ for (int i = 0; i < NUMBER_OF_TIME_LAPSE_LOOPS; i++) {
+ filename = OUTPUT_FILE + j + "_" + i + OUTPUT_FILE_EXT;
+ Log.v(TAG, filename);
+ runOnLooper(new Runnable() {
+ @Override
+ public void run() {
+ mRecorder = new MediaRecorder();
+ }
+ });
+
+ // Set callback
+ mRecorder.setOnErrorListener(mRecorderErrorCallback);
+
+ // Set video source
+ mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
+
+ // Set camcorder profile for time lapse
+ CamcorderProfile profile =
+ CamcorderProfile.get(j, CamcorderProfile.QUALITY_TIME_LAPSE_HIGH);
+ mRecorder.setProfile(profile);
+
+ // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc.
+ // http://developer.android.com/guide/topics/media/camera.html#time-lapse-video
+ mRecorder.setCaptureRate(captureRate);
+
+ // Set output file
+ mRecorder.setOutputFile(filename);
+
+ // Set the preview display
+ Log.v(TAG, "mediaRecorder setPreviewDisplay");
+ mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
+
+ mRecorder.prepare();
+ mRecorder.start();
+ Thread.sleep(record_duration);
+ Log.v(TAG, "Before stop");
+ mRecorder.stop();
+ mRecorder.release();
+
+ // Start the playback
+ MediaPlayer mp = new MediaPlayer();
+ mp.setDataSource(filename);
+ mp.setDisplay(mSurfaceHolder);
+ mp.prepare();
+ mp.start();
+ Thread.sleep(TIME_LAPSE_PLAYBACK_WAIT_TIME);
+ mp.release();
+ validateRecordedVideo(filename);
+ if (remove_video) {
+ removeRecordedVideo(filename);
}
- });
-
- // Set callback
- mRecorder.setOnErrorListener(mRecorderErrorCallback);
-
- // Set video source
- mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
-
- // Set camcorder profile for time lapse
- CamcorderProfile profile =
- CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH);
- mRecorder.setProfile(profile);
-
- // Set the timelapse setting; 0.1 = 10 sec timelapse, 0.5 = 2 sec timelapse, etc.
- // http://developer.android.com/guide/topics/media/camera.html#time-lapse-video
- mRecorder.setCaptureRate(captureRate);
-
- // Set output file
- mRecorder.setOutputFile(filename);
-
- // Set the preview display
- Log.v(TAG, "mediaRecorder setPreviewDisplay");
- mRecorder.setPreviewDisplay(mSurfaceHolder.getSurface());
-
- mRecorder.prepare();
- mRecorder.start();
- Thread.sleep(record_duration);
- Log.v(TAG, "Before stop");
- mRecorder.stop();
- mRecorder.release();
-
- // Start the playback
- MediaPlayer mp = new MediaPlayer();
- mp.setDataSource(filename);
- mp.setDisplay(mSurfaceHolder);
- mp.prepare();
- mp.start();
- Thread.sleep(TIME_LAPSE_PLAYBACK_WAIT_TIME);
- mp.release();
- validateRecordedVideo(filename);
- if(remove_video) {
- removeRecordedVideo(filename);
+ output.write(", " + i);
}
- output.write(", " + i);
}
}
catch (IllegalStateException e) {
diff --git a/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png
index 8a0a30f699e8..ff0bd4c0f203 100644
--- a/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-hdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png
index 25f15e6ab331..2bbb2c6c20a5 100644
--- a/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-mdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png
index 2ff93d34fecf..e7caedac103b 100644
--- a/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw600dp-hdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png
index 430f9133c65a..ae07083549c1 100644
--- a/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw600dp-mdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png
index 807241ad35cd..8423ef91d3b7 100644
--- a/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw600dp-xhdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-hdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-hdpi/notification_panel_bg.9.png
index 2ff93d34fecf..0c20ba2d0a88 100644
--- a/packages/SystemUI/res/drawable-sw720dp-hdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw720dp-hdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-mdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-mdpi/notification_panel_bg.9.png
index 430f9133c65a..56cd23808090 100644
--- a/packages/SystemUI/res/drawable-sw720dp-mdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw720dp-mdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-sw720dp-xhdpi/notification_panel_bg.9.png
index 807241ad35cd..3f0576789200 100644
--- a/packages/SystemUI/res/drawable-sw720dp-xhdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-sw720dp-xhdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png b/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png
index 60e741850ba0..932e0eff2a32 100644
--- a/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png
+++ b/packages/SystemUI/res/drawable-xhdpi/notification_panel_bg.9.png
Binary files differ
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 6433cd350497..ca297387eca0 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -145,6 +145,6 @@
<string name="notifications_off_title" msgid="8936620513608443224">"通知功能已停用"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"点按此处可重新启用通知功能。"</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"屏幕会自动旋转。"</string>
- <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"屏幕锁定为横向浏览模式。"</string>
- <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕已锁定为纵向浏览模式。"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"屏幕锁定为横向模式。"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕锁定为纵向模式。"</string>
</resources>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 2786013f8d96..26dba675cf56 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -57,7 +57,13 @@
<!-- Show rotation lock button in phone-style notification panel. -->
<bool name="config_showRotationLock">true</bool>
+ <!-- Amount of time to hold off before showing the search panel when the user presses home -->
+ <integer name="config_show_search_delay">200</integer>
+
+ <!-- Vibration duration for MultiWaveView used in SearchPanelView -->
+ <integer translatable="false" name="config_vibration_duration">0</integer>
+
<!-- Vibration duration for MultiWaveView used in SearchPanelView -->
- <integer translatable="false" name="config_vibration_duration">20</integer>
+ <integer translatable="false" name="config_search_panel_view_vibration_duration">20</integer>
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java b/packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java
index 1db2a7feca00..73249b44b28e 100644
--- a/packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java
+++ b/packages/SystemUI/src/com/android/systemui/DreamsDockLauncher.java
@@ -58,8 +58,8 @@ public class DreamsDockLauncher extends Activity {
@Override
public void onReceive(Context context, Intent intent) {
final boolean activateOnDock = 0 != Settings.Secure.getInt(
- context.getContentResolver(),
- Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 1);
+ context.getContentResolver(),
+ Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK, 0);
if (!activateOnDock) return;
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index 060d08e090ad..af88a0661237 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -16,9 +16,7 @@
package com.android.systemui;
-import android.animation.Animator;
import android.animation.LayoutTransition;
-import android.app.ActivityManagerNative;
import android.app.ActivityOptions;
import android.app.SearchManager;
import android.content.ActivityNotFoundException;
@@ -26,6 +24,9 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Vibrator;
+import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.MotionEvent;
@@ -34,12 +35,12 @@ import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.FrameLayout;
-
import com.android.internal.widget.multiwaveview.MultiWaveView;
import com.android.internal.widget.multiwaveview.MultiWaveView.OnTriggerListener;
import com.android.systemui.R;
import com.android.systemui.recent.StatusBarTouchProxy;
import com.android.systemui.statusbar.BaseStatusBar;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
import com.android.systemui.statusbar.tablet.TabletStatusBar;
@@ -49,7 +50,7 @@ public class SearchPanelView extends FrameLayout implements
private static final int SEARCH_PANEL_HOLD_DURATION = 500;
static final String TAG = "SearchPanelView";
static final boolean DEBUG = TabletStatusBar.DEBUG || PhoneStatusBar.DEBUG || false;
- private Context mContext;
+ private final Context mContext;
private BaseStatusBar mBar;
private StatusBarTouchProxy mStatusBarTouchProxy;
@@ -77,7 +78,7 @@ public class SearchPanelView extends FrameLayout implements
Intent intent = getAssistIntent();
return intent == null ? false
: mContext.getPackageManager().queryIntentActivities(intent,
- PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
+ PackageManager.MATCH_DEFAULT_ONLY).size() > 0;
}
private Intent getAssistIntent() {
@@ -106,9 +107,10 @@ public class SearchPanelView extends FrameLayout implements
private void startAssistActivity() {
// Close Recent Apps if needed
- mBar.animateCollapse();
+ mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL);
// Launch Assist
Intent intent = getAssistIntent();
+ if (intent == null) return;
try {
ActivityOptions opts = ActivityOptions.makeCustomAnimation(mContext,
R.anim.search_launch_enter, R.anim.search_launch_exit);
@@ -142,13 +144,14 @@ public class SearchPanelView extends FrameLayout implements
case com.android.internal.R.drawable.ic_lockscreen_search:
mWaitingForLaunch = true;
startAssistActivity();
+ vibrate();
postDelayed(new Runnable() {
public void run() {
mWaitingForLaunch = false;
mBar.hideSearchPanel();
}
}, SEARCH_PANEL_HOLD_DURATION);
- break;
+ break;
}
}
@@ -160,7 +163,7 @@ public class SearchPanelView extends FrameLayout implements
protected void onFinishInflate() {
super.onFinishInflate();
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- mSearchTargetsContainer = (ViewGroup) findViewById(R.id.search_panel_container);
+ mSearchTargetsContainer = findViewById(R.id.search_panel_container);
mStatusBarTouchProxy = (StatusBarTouchProxy) findViewById(R.id.status_bar_touch_proxy);
// TODO: fetch views
mMultiWaveView = (MultiWaveView) findViewById(R.id.multi_wave_view);
@@ -186,7 +189,7 @@ public class SearchPanelView extends FrameLayout implements
}
}
- private OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
+ private final OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
getViewTreeObserver().removeOnPreDrawListener(this);
mMultiWaveView.resumeAnimations();
@@ -194,10 +197,20 @@ public class SearchPanelView extends FrameLayout implements
}
};
+ private void vibrate() {
+ Context context = getContext();
+ if (Settings.System.getInt(context.getContentResolver(),
+ Settings.System.HAPTIC_FEEDBACK_ENABLED, 1) != 0) {
+ Resources res = context.getResources();
+ Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
+ vibrator.vibrate(res.getInteger(R.integer.config_search_panel_view_vibration_duration));
+ }
+ }
+
public void show(final boolean show, boolean animate) {
if (!show) {
final LayoutTransition transitioner = animate ? createLayoutTransitioner() : null;
- ((ViewGroup)mSearchTargetsContainer).setLayoutTransition(transitioner);
+ ((ViewGroup) mSearchTargetsContainer).setLayoutTransition(transitioner);
}
mShowing = show;
if (show) {
@@ -207,6 +220,7 @@ public class SearchPanelView extends FrameLayout implements
// right before we are drawn
mMultiWaveView.suspendAnimations();
getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
+ vibrate();
}
setFocusable(true);
setFocusableInTouchMode(true);
@@ -219,7 +233,7 @@ public class SearchPanelView extends FrameLayout implements
public void hide(boolean animate) {
if (mBar != null) {
// This will indirectly cause show(false, ...) to get called
- mBar.animateCollapse();
+ mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
} else {
setVisibility(View.INVISIBLE);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index 39d686fa3ef1..587bfe802d94 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -58,6 +58,7 @@ import android.widget.TextView;
import com.android.systemui.R;
import com.android.systemui.statusbar.BaseStatusBar;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
import com.android.systemui.statusbar.tablet.TabletStatusBar;
@@ -308,7 +309,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
// if there are no apps, either bring up a "No recent apps" message, or just
// quit early
- boolean noApps = (mRecentTaskDescriptions.size() == 0);
+ boolean noApps = !mFirstScreenful && (mRecentTaskDescriptions.size() == 0);
if (mRecentsNoApps != null) {
mRecentsNoApps.setVisibility(noApps ? View.VISIBLE : View.INVISIBLE);
} else {
@@ -368,7 +369,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
}
if (mBar != null) {
// This will indirectly cause show(false, ...) to get called
- mBar.animateCollapse();
+ mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
}
}
@@ -822,7 +823,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener
if (viewHolder != null) {
final TaskDescription ad = viewHolder.taskDescription;
startApplicationDetailsActivity(ad.packageName);
- mBar.animateCollapse();
+ mBar.animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
} else {
throw new IllegalStateException("Oops, no tag on view " + selectedView);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
index 3c71784237b2..f68220309e06 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsVerticalScrollView.java
@@ -101,6 +101,9 @@ public class RecentsVerticalScrollView extends ScrollView
}
final View view = mAdapter.getView(i, old, mLinearLayout);
+ if (view.getParent() != null) {
+ throw new RuntimeException("Recycled child has parent");
+ }
if (mPerformanceHelper != null) {
mPerformanceHelper.addViewCallback(view);
@@ -139,6 +142,9 @@ public class RecentsVerticalScrollView extends ScrollView
thumbnailView.setClickable(true);
thumbnailView.setOnClickListener(launchAppListener);
thumbnailView.setOnLongClickListener(longClickListener);
+ if (view.getParent() != null) {
+ throw new RuntimeException("Recycled child has parent");
+ }
// We don't want to dismiss recents if a user clicks on the app title
// (we also don't want to launch the app either, though, because the
@@ -148,6 +154,9 @@ public class RecentsVerticalScrollView extends ScrollView
appTitle.setOnTouchListener(noOpListener);
final View calloutLine = view.findViewById(R.id.recents_callout_line);
calloutLine.setOnTouchListener(noOpListener);
+ if (view.getParent() != null) {
+ throw new RuntimeException("Recycled child has parent");
+ }
mLinearLayout.addView(view);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index a352748a9ca1..f088e0e1a53a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -253,7 +253,7 @@ public abstract class BaseStatusBar extends SystemUI implements
mContext.startActivity(intent);
}
- protected View.OnLongClickListener getNotificationLongClicker() {
+ protected View.OnLongClickListener getNotificationLongClicker() {
return new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
@@ -268,7 +268,7 @@ public abstract class BaseStatusBar extends SystemUI implements
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.notification_inspect_item) {
startApplicationDetailsActivity(packageNameF);
- animateCollapse();
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
} else {
return false;
}
@@ -618,7 +618,7 @@ public abstract class BaseStatusBar extends SystemUI implements
}
// close the shade if it was open
- animateCollapse();
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
visibilityChanged(false);
// If this click was on the intruder alert, hide that instead
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 42093549112b..a00d95a97a5e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -66,6 +66,13 @@ public class CommandQueue extends IStatusBar.Stub {
private static final int MSG_SET_NAVIGATION_ICON_HINTS = 14 << MSG_SHIFT;
+ public static final int FLAG_EXCLUDE_NONE = 0;
+ public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
+ public static final int FLAG_EXCLUDE_RECENTS_PANEL = 1 << 1;
+ public static final int FLAG_EXCLUDE_NOTIFICATION_PANEL = 1 << 2;
+ public static final int FLAG_EXCLUDE_INPUT_METHODS_PANEL = 1 << 3;
+ public static final int FLAG_EXCLUDE_COMPAT_MODE_PANEL = 1 << 4;
+
private StatusBarIconList mList;
private Callbacks mCallbacks;
private Handler mHandler = new H();
@@ -88,7 +95,7 @@ public class CommandQueue extends IStatusBar.Stub {
public void removeNotification(IBinder key);
public void disable(int state);
public void animateExpand();
- public void animateCollapse();
+ public void animateCollapse(int flags);
public void setSystemUiVisibility(int vis, int mask);
public void topAppWindowChanged(boolean visible);
public void setImeWindowStatus(IBinder token, int vis, int backDisposition);
@@ -161,9 +168,13 @@ public class CommandQueue extends IStatusBar.Stub {
}
public void animateCollapse() {
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
+ }
+
+ public void animateCollapse(int flags) {
synchronized (mList) {
mHandler.removeMessages(MSG_SET_VISIBILITY);
- mHandler.obtainMessage(MSG_SET_VISIBILITY, OP_COLLAPSE, 0, null).sendToTarget();
+ mHandler.obtainMessage(MSG_SET_VISIBILITY, OP_COLLAPSE, flags, null).sendToTarget();
}
}
@@ -277,7 +288,7 @@ public class CommandQueue extends IStatusBar.Stub {
if (msg.arg1 == OP_EXPAND) {
mCallbacks.animateExpand();
} else {
- mCallbacks.animateCollapse();
+ mCallbacks.animateCollapse(msg.arg2);
}
break;
case MSG_SET_SYSTEMUI_VISIBILITY:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 344411bf6088..ecdaa39780cf 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -76,6 +76,7 @@ import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationData.Entry;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.RotationToggle;
import com.android.systemui.statusbar.SignalClusterView;
import com.android.systemui.statusbar.StatusBarIconView;
@@ -483,14 +484,7 @@ public class PhoneStatusBar extends BaseStatusBar {
@Override
public void showSearchPanel() {
- // XXX This is a bit of a hack. Since navbar is no longer slippery, we use the
- // gesture to dismiss the expanded statusbar.
- if (mExpanded) {
- animateCollapse();
- return;
- } else {
- super.showSearchPanel();
- }
+ super.showSearchPanel();
WindowManager.LayoutParams lp =
(android.view.WindowManager.LayoutParams) mNavigationBarView.getLayoutParams();
lp.flags &= ~WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
@@ -529,16 +523,29 @@ public class PhoneStatusBar extends BaseStatusBar {
}
};
+ private int mShowSearchHoldoff = 0;
+ private Runnable mShowSearchPanel = new Runnable() {
+ public void run() {
+ showSearchPanel();
+ }
+ };
+
View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- if (!shouldDisableNavbarGestures()) {
- showSearchPanel();
- }
- break;
- }
- return false;
+ case MotionEvent.ACTION_DOWN:
+ if (!shouldDisableNavbarGestures()) {
+ mHandler.removeCallbacks(mShowSearchPanel);
+ mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff);
+ }
+ break;
+
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mHandler.removeCallbacks(mShowSearchPanel);
+ break;
+ }
+ return false;
}
};
@@ -733,6 +740,8 @@ public class PhoneStatusBar extends BaseStatusBar {
@Override
protected void onConfigurationChanged(Configuration newConfig) {
updateRecentsPanel();
+ mShowSearchHoldoff = mContext.getResources().getInteger(
+ R.integer.config_show_search_delay);
}
private void loadNotificationShade() {
@@ -1028,6 +1037,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mExpandedVisible = true;
mNotificationPanel.setVisibility(View.VISIBLE);
+ makeSlippery(mNavigationBarView, true);
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
@@ -1043,6 +1053,16 @@ public class PhoneStatusBar extends BaseStatusBar {
visibilityChanged(true);
}
+ private static void makeSlippery(View view, boolean slippery) {
+ WindowManager.LayoutParams lp = (WindowManager.LayoutParams) view.getLayoutParams();
+ if (slippery) {
+ lp.flags |= WindowManager.LayoutParams.FLAG_SLIPPERY;
+ } else {
+ lp.flags &= ~WindowManager.LayoutParams.FLAG_SLIPPERY;
+ }
+ WindowManagerImpl.getDefault().updateViewLayout(view, lp);
+ }
+
public void animateExpand() {
if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded);
if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) {
@@ -1057,29 +1077,33 @@ public class PhoneStatusBar extends BaseStatusBar {
}
public void animateCollapse() {
- animateCollapse(false);
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
}
- public void animateCollapse(boolean excludeRecents) {
- animateCollapse(excludeRecents, 1.0f);
+ public void animateCollapse(int flags) {
+ animateCollapse(flags, 1.0f);
}
- public void animateCollapse(boolean excludeRecents, float velocityMultiplier) {
+ public void animateCollapse(int flags, float velocityMultiplier) {
if (SPEW) {
Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded
+ " mExpandedVisible=" + mExpandedVisible
+ " mExpanded=" + mExpanded
+ " mAnimating=" + mAnimating
+ " mAnimY=" + mAnimY
- + " mAnimVel=" + mAnimVel);
+ + " mAnimVel=" + mAnimVel
+ + " flags=" + flags);
}
- if (!excludeRecents) {
+ if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
}
- mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
+
+ if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) {
+ mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
+ }
if (!mExpandedVisible) {
return;
@@ -1124,6 +1148,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mExpandedVisible = false;
visibilityChanged(false);
mNotificationPanel.setVisibility(View.INVISIBLE);
+ makeSlippery(mNavigationBarView, false);
// Shrink the window to the size of the status bar only
WindowManager.LayoutParams lp = (WindowManager.LayoutParams) mStatusBarWindow.getLayoutParams();
@@ -1941,7 +1966,7 @@ public class PhoneStatusBar extends BaseStatusBar {
}
}
if (snapshot.isEmpty()) {
- animateCollapse(false);
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
return;
}
new Thread(new Runnable() {
@@ -1989,7 +2014,7 @@ public class PhoneStatusBar extends BaseStatusBar {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
- animateCollapse(false);
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
}
}, totalDelay + 225);
}
@@ -2016,14 +2041,14 @@ public class PhoneStatusBar extends BaseStatusBar {
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
|| Intent.ACTION_SCREEN_OFF.equals(action)) {
- boolean excludeRecents = false;
+ int flags = CommandQueue.FLAG_EXCLUDE_NONE;
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
String reason = intent.getStringExtra("reason");
- if (reason != null) {
- excludeRecents = reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS);
+ if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
+ flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
}
- animateCollapse(excludeRecents);
+ animateCollapse(flags);
}
else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
updateResources();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index c0ac50e1ade1..8df9b859dd52 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -67,6 +67,7 @@ import com.android.systemui.R;
import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.recent.RecentsPanelView;
import com.android.systemui.statusbar.BaseStatusBar;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.DoNotDisturb;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.SignalClusterView;
@@ -186,16 +187,30 @@ public class TabletStatusBar extends BaseStatusBar implements
private int mNavigationIconHints = 0;
+ private int mShowSearchHoldoff = 0;
+
public Context getContext() { return mContext; }
+ private Runnable mShowSearchPanel = new Runnable() {
+ public void run() {
+ showSearchPanel();
+ }
+ };
+
private View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (!shouldDisableNavbarGestures()) {
- showSearchPanel();
+ mHandler.removeCallbacks(mShowSearchPanel);
+ mHandler.postDelayed(mShowSearchPanel, mShowSearchHoldoff);
}
break;
+
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ mHandler.removeCallbacks(mShowSearchPanel);
+ break;
}
return false;
}
@@ -387,6 +402,8 @@ public class TabletStatusBar extends BaseStatusBar implements
WindowManagerImpl.getDefault().updateViewLayout(mNotificationPanel,
mNotificationPanelParams);
mRecentsPanel.updateValuesFromResources();
+ mShowSearchHoldoff = mContext.getResources().getInteger(
+ R.integer.config_show_search_delay);
}
protected void loadDimens() {
@@ -1001,22 +1018,31 @@ public class TabletStatusBar extends BaseStatusBar implements
}
public void animateCollapse() {
- animateCollapse(false);
+ animateCollapse(CommandQueue.FLAG_EXCLUDE_NONE);
}
- private void animateCollapse(boolean excludeRecents) {
- mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL);
- if (!excludeRecents) {
+ public void animateCollapse(int flags) {
+ if ((flags & CommandQueue.FLAG_EXCLUDE_NOTIFICATION_PANEL) == 0) {
+ mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PANEL);
+ }
+ if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
mHandler.removeMessages(MSG_CLOSE_RECENTS_PANEL);
mHandler.sendEmptyMessage(MSG_CLOSE_RECENTS_PANEL);
}
- mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL);
- mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL);
- mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
- mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
+ if ((flags & CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL) == 0) {
+ mHandler.removeMessages(MSG_CLOSE_SEARCH_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_SEARCH_PANEL);
+ }
+ if ((flags & CommandQueue.FLAG_EXCLUDE_INPUT_METHODS_PANEL) == 0) {
+ mHandler.removeMessages(MSG_CLOSE_INPUT_METHODS_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL);
+ }
+ if ((flags & CommandQueue.FLAG_EXCLUDE_COMPAT_MODE_PANEL) == 0) {
+ mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL);
+ mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL);
+ }
+
}
@Override // CommandQueue
@@ -1594,11 +1620,11 @@ public class TabletStatusBar extends BaseStatusBar implements
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)
|| Intent.ACTION_SCREEN_OFF.equals(action)) {
- boolean excludeRecents = false;
+ int flags = CommandQueue.FLAG_EXCLUDE_NONE;
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
String reason = intent.getStringExtra("reason");
- if (reason != null) {
- excludeRecents = reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS);
+ if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
+ flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
}
if (Intent.ACTION_SCREEN_OFF.equals(action)) {
@@ -1607,9 +1633,9 @@ public class TabletStatusBar extends BaseStatusBar implements
// TODO: hide other things, like the notification tray,
// with no animation as well
mRecentsPanel.show(false, false);
- excludeRecents = true;
+ flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
- animateCollapse(excludeRecents);
+ animateCollapse(flags);
}
}
};
diff --git a/policy/src/com/android/internal/policy/impl/FaceUnlock.java b/policy/src/com/android/internal/policy/impl/FaceUnlock.java
index 737ea47c4b4f..22b854ec838c 100644
--- a/policy/src/com/android/internal/policy/impl/FaceUnlock.java
+++ b/policy/src/com/android/internal/policy/impl/FaceUnlock.java
@@ -468,7 +468,8 @@ public class FaceUnlock implements BiometricSensorUnlock, Handler.Callback {
if (!mServiceRunning) {
Log.d(TAG, "Starting Face Unlock");
try {
- mService.startUi(windowToken, x, y, w, h, false);
+ mService.startUi(windowToken, x, y, w, h,
+ mLockPatternUtils.isBiometricWeakLivelinessEnabled());
} catch (RemoteException e) {
Log.e(TAG, "Caught exception starting Face Unlock: " + e.toString());
return;
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index cce55d5ec7b3..10332965da46 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -2278,7 +2278,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// It's a system nav bar or a portrait screen; nav bar goes on bottom.
int top = displayHeight - mNavigationBarHeightForRotation[displayRotation];
if (mHdmiPlugged) {
- if (top > mExternalDisplayHeight) {
+ // Move the nav bar up if the external display is the same aspect ratio
+ // but shorter. This avoids clipping on the external display.
+ boolean sameAspect = mExternalDisplayHeight > 0 && displayHeight > 0
+ && ((float) mExternalDisplayWidth / mExternalDisplayHeight > 1)
+ == ((float) displayWidth / displayHeight > 1);
+ if (sameAspect && top > mExternalDisplayHeight) {
top = mExternalDisplayHeight;
}
}
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 38e08ae059aa..469b4f1dca4e 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -2242,7 +2242,9 @@ public class PowerManagerService extends IPowerManager.Stub
} else {
newValue = endValue;
mHighestLightSensorValue = endSensorValue;
- mInitialAnimation = false;
+ if (endValue > 0) {
+ mInitialAnimation = false;
+ }
}
if (mDebugLightAnimation) {
@@ -2290,7 +2292,7 @@ public class PowerManagerService extends IPowerManager.Stub
currentMask = mask;
duration = (int) (mWindowScaleAnimation * animationDuration);
startTimeMillis = SystemClock.elapsedRealtime();
- mInitialAnimation = currentValue == 0 && target > 0;
+ mInitialAnimation = mInitialAnimation && target > 0;
if (mDebugLightAnimation) {
Slog.v(TAG, "animateTo(target=" + target
@@ -2608,7 +2610,8 @@ public class PowerManagerService extends IPowerManager.Stub
}
};
- private boolean mInitialAnimation; // used to prevent lightsensor changes while turning on
+ /** used to prevent lightsensor changes while turning on. */
+ private boolean mInitialAnimation = true;
private void dockStateChanged(int state) {
synchronized (mLocks) {
diff --git a/services/java/com/android/server/UiModeManagerService.java b/services/java/com/android/server/UiModeManagerService.java
index c936ef994a19..d1f92a7dc72a 100644
--- a/services/java/com/android/server/UiModeManagerService.java
+++ b/services/java/com/android/server/UiModeManagerService.java
@@ -65,7 +65,7 @@ class UiModeManagerService extends IUiModeManager.Stub {
// Enable launching of applications when entering the dock.
private static final boolean ENABLE_LAUNCH_CAR_DOCK_APP = true;
- private static final boolean ENABLE_LAUNCH_DESK_DOCK_APP = false;
+ private static final boolean ENABLE_LAUNCH_DESK_DOCK_APP = true;
private static final int MSG_UPDATE_TWILIGHT = 0;
private static final int MSG_ENABLE_LOCATION_UPDATES = 1;
@@ -120,7 +120,7 @@ class UiModeManagerService extends IUiModeManager.Stub {
| Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
return intent;
}
-
+
// The broadcast receiver which receives the result of the ordered broadcast sent when
// the dock state changes. The original ordered broadcast is sent with an initial result
// code of RESULT_OK. If any of the registered broadcast receivers changes this value, e.g.,
@@ -130,7 +130,7 @@ class UiModeManagerService extends IUiModeManager.Stub {
public void onReceive(Context context, Intent intent) {
if (getResultCode() != Activity.RESULT_OK) {
if (LOG) {
- Slog.v(TAG, "Handling broadcast result for action " + intent.getAction()
+ Slog.v(TAG, "Handling broadcast result for action " + intent.getAction()
+ ": canceled: " + getResultCode());
}
return;
@@ -138,7 +138,7 @@ class UiModeManagerService extends IUiModeManager.Stub {
final int enableFlags = intent.getIntExtra("enableFlags", 0);
final int disableFlags = intent.getIntExtra("disableFlags", 0);
-
+
synchronized (mLock) {
// Launch a dock activity
String category = null;
@@ -166,15 +166,15 @@ class UiModeManagerService extends IUiModeManager.Stub {
if (LOG) {
Slog.v(TAG, String.format(
- "Handling broadcast result for action %s: enable=0x%08x disable=0x%08x category=%s",
+ "Handling broadcast result for action %s: enable=0x%08x disable=0x%08x category=%s",
intent.getAction(), enableFlags, disableFlags, category));
}
-
+
if (category != null) {
// This is the new activity that will serve as home while
// we are in care mode.
Intent homeIntent = buildHomeIntent(category);
-
+
// Now we are going to be careful about switching the
// configuration and starting the activity -- we need to
// do this in a specific order under control of the
@@ -479,8 +479,8 @@ class UiModeManagerService extends IUiModeManager.Stub {
}
if (LOG) {
- Slog.d(TAG,
- "updateConfigurationLocked: mDockState=" + mDockState
+ Slog.d(TAG,
+ "updateConfigurationLocked: mDockState=" + mDockState
+ "; mCarMode=" + mCarModeEnabled
+ "; mNightMode=" + mNightMode
+ "; uiMode=" + uiMode);
@@ -657,7 +657,7 @@ class UiModeManagerService extends IUiModeManager.Stub {
boolean mNetworkListenerEnabled;
boolean mDidFirstInit;
long mLastNetworkRegisterTime = -MIN_LOCATION_UPDATE_MS;
-
+
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -682,12 +682,12 @@ class UiModeManagerService extends IUiModeManager.Stub {
// since we last requested an update.
return;
}
-
+
// Unregister the current location monitor, so we can
// register a new one for it to get an immediate update.
mNetworkListenerEnabled = false;
mLocationManager.removeUpdates(mEmptyLocationListener);
-
+
// Fall through to re-register listener.
case MSG_ENABLE_LOCATION_UPDATES:
// enable network provider to receive at least location updates for a given
diff --git a/services/java/com/android/server/WiredAccessoryObserver.java b/services/java/com/android/server/WiredAccessoryObserver.java
index 53d1f0e6ad33..96ac493f680d 100644
--- a/services/java/com/android/server/WiredAccessoryObserver.java
+++ b/services/java/com/android/server/WiredAccessoryObserver.java
@@ -139,11 +139,14 @@ class WiredAccessoryObserver extends UEventObserver {
private final Context mContext;
private final WakeLock mWakeLock; // held while there is a pending route change
+ private final AudioManager mAudioManager;
+
public WiredAccessoryObserver(Context context) {
mContext = context;
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WiredAccessoryObserver");
mWakeLock.setReferenceCounted(false);
+ mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
context.registerReceiver(new BootCompletedReceiver(),
new IntentFilter(Intent.ACTION_BOOT_COMPLETED), null, null);
@@ -250,106 +253,65 @@ class WiredAccessoryObserver extends UEventObserver {
mPrevHeadsetState = mHeadsetState;
mHeadsetState = headsetState;
- if (headsetState == 0) {
- if (mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_sendAudioBecomingNoisy)) {
- Intent intent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
- mContext.sendBroadcast(intent);
- }
-
- // It can take hundreds of ms flush the audio pipeline after
- // apps pause audio playback, but audio route changes are
- // immediate, so delay the route change by 1000ms.
- // This could be improved once the audio sub-system provides an
- // interface to clear the audio pipeline.
- delay = 1000;
- } else {
- // Insert the same delay for headset connection so that the connection event is not
- // broadcast before the disconnection event in case of fast removal/insertion
- if (mHandler.hasMessages(0)) {
- delay = 1000;
- }
- }
mWakeLock.acquire();
- mHandler.sendMessageDelayed(mHandler.obtainMessage(0,
- mHeadsetState,
- mPrevHeadsetState,
- mHeadsetName),
- delay);
+ mHandler.sendMessage(mHandler.obtainMessage(0,
+ mHeadsetState,
+ mPrevHeadsetState,
+ mHeadsetName));
}
- private synchronized final void sendIntents(int headsetState, int prevHeadsetState, String headsetName) {
+ private synchronized final void setDevicesState(int headsetState,
+ int prevHeadsetState,
+ String headsetName) {
int allHeadsets = SUPPORTED_HEADSETS;
for (int curHeadset = 1; allHeadsets != 0; curHeadset <<= 1) {
if ((curHeadset & allHeadsets) != 0) {
- sendIntent(curHeadset, headsetState, prevHeadsetState, headsetName);
+ setDeviceState(curHeadset, headsetState, prevHeadsetState, headsetName);
allHeadsets &= ~curHeadset;
}
}
}
- private final void sendIntent(int headset, int headsetState, int prevHeadsetState, String headsetName) {
+ private final void setDeviceState(int headset,
+ int headsetState,
+ int prevHeadsetState,
+ String headsetName) {
if ((headsetState & headset) != (prevHeadsetState & headset)) {
+ int device;
+ int state;
- int state = 0;
if ((headsetState & headset) != 0) {
state = 1;
+ } else {
+ state = 0;
}
- if((headset == BIT_USB_HEADSET_ANLG) || (headset == BIT_USB_HEADSET_DGTL) ||
- (headset == BIT_HDMI_AUDIO)) {
- Intent intent;
-
- // Pack up the values and broadcast them to everyone
- if (headset == BIT_USB_HEADSET_ANLG) {
- intent = new Intent(Intent.ACTION_ANALOG_AUDIO_DOCK_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra("state", state);
- intent.putExtra("name", headsetName);
- ActivityManagerNative.broadcastStickyIntent(intent, null);
- } else if (headset == BIT_USB_HEADSET_DGTL) {
- intent = new Intent(Intent.ACTION_DIGITAL_AUDIO_DOCK_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra("state", state);
- intent.putExtra("name", headsetName);
- ActivityManagerNative.broadcastStickyIntent(intent, null);
- } else if (headset == BIT_HDMI_AUDIO) {
- intent = new Intent(Intent.ACTION_HDMI_AUDIO_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra("state", state);
- intent.putExtra("name", headsetName);
- ActivityManagerNative.broadcastStickyIntent(intent, null);
- }
- if (LOG) Slog.v(TAG, "Intent.ACTION_USB_HEADSET_PLUG: state: "+state+" name: "+headsetName);
- // TODO: Should we require a permission?
+ if (headset == BIT_HEADSET) {
+ device = AudioManager.DEVICE_OUT_WIRED_HEADSET;
+ } else if (headset == BIT_HEADSET_NO_MIC){
+ device = AudioManager.DEVICE_OUT_WIRED_HEADPHONE;
+ } else if (headset == BIT_USB_HEADSET_ANLG) {
+ device = AudioManager.DEVICE_OUT_ANLG_DOCK_HEADSET;
+ } else if (headset == BIT_USB_HEADSET_DGTL) {
+ device = AudioManager.DEVICE_OUT_DGTL_DOCK_HEADSET;
+ } else if (headset == BIT_HDMI_AUDIO) {
+ device = AudioManager.DEVICE_OUT_AUX_DIGITAL;
+ } else {
+ Slog.e(TAG, "setDeviceState() invalid headset type: "+headset);
+ return;
}
- if((headset == BIT_HEADSET) || (headset == BIT_HEADSET_NO_MIC)) {
- // Pack up the values and broadcast them to everyone
- Intent intent = new Intent(Intent.ACTION_HEADSET_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- //int state = 0;
- int microphone = 0;
+ if (LOG)
+ Slog.v(TAG, "device "+headsetName+((state == 1) ? " connected" : " disconnected"));
- if ((headset & HEADSETS_WITH_MIC) != 0) {
- microphone = 1;
- }
-
- intent.putExtra("state", state);
- intent.putExtra("name", headsetName);
- intent.putExtra("microphone", microphone);
-
- if (LOG) Slog.v(TAG, "Intent.ACTION_HEADSET_PLUG: state: "+state+" name: "+headsetName+" mic: "+microphone);
- // TODO: Should we require a permission?
- ActivityManagerNative.broadcastStickyIntent(intent, null);
- }
+ mAudioManager.setWiredDeviceConnectionState(device, state, headsetName);
}
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- sendIntents(msg.arg1, msg.arg2, (String)msg.obj);
+ setDevicesState(msg.arg1, msg.arg2, (String)msg.obj);
mWakeLock.release();
}
};
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index 039efbd4f435..3e8f51279430 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -104,10 +104,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private static final String FUNCTION_REGISTER_UI_TEST_AUTOMATION_SERVICE =
"registerUiTestAutomationService";
+ private static final char COMPONENT_NAME_SEPARATOR = ':';
+
private static final int OWN_PROCESS_ID = android.os.Process.myPid();
private static final int MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG = 1;
+ private static final int MSG_TOGGLE_TOUCH_EXPLORATION = 2;
+
private static int sIdCounter = 0;
private static int sNextWindowId;
@@ -127,12 +131,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private final Set<ComponentName> mEnabledServices = new HashSet<ComponentName>();
+ private final Set<ComponentName> mTouchExplorationGrantedServices = new HashSet<ComponentName>();
+
private final SparseArray<AccessibilityConnectionWrapper> mWindowIdToInteractionConnectionWrapperMap =
new SparseArray<AccessibilityConnectionWrapper>();
private final SparseArray<IBinder> mWindowIdToWindowTokenMap = new SparseArray<IBinder>();
- private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(':');
+ private final SimpleStringSplitter mStringColonSplitter = new SimpleStringSplitter(COMPONENT_NAME_SEPARATOR);
private final Rect mTempRect = new Rect();
@@ -164,6 +170,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
private boolean mTouchExplorationGestureStarted;
+ private AlertDialog mEnableTouchExplorationDialog;
+
/**
* Creates a new instance.
*
@@ -208,7 +216,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
String compPkg = comp.getPackageName();
if (compPkg.equals(packageName)) {
it.remove();
- updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
+ // Update the enabled services setting.
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ mEnabledServices);
+ // Update the touch exploration granted services setting.
+ mTouchExplorationGrantedServices.remove(comp);
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.
+ TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+ mEnabledServices);
return;
}
}
@@ -219,7 +236,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
public boolean onHandleForceStop(Intent intent, String[] packages,
int uid, boolean doit) {
synchronized (mLock) {
- boolean changed = false;
Iterator<ComponentName> it = mEnabledServices.iterator();
while (it.hasNext()) {
ComponentName comp = it.next();
@@ -230,13 +246,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return true;
}
it.remove();
- changed = true;
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ mEnabledServices);
}
}
}
- if (changed) {
- updateEnabledAccessibilitySerivcesSettingLocked(mEnabledServices);
- }
return false;
}
}
@@ -248,33 +263,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
// We will update when the automation service dies.
if (mUiAutomationService == null) {
populateAccessibilityServiceListLocked();
+ populateEnabledAccessibilityServicesLocked();
+ populateTouchExplorationGrantedAccessibilityServicesLocked();
handleAccessibilityEnabledSettingChangedLocked();
handleTouchExplorationEnabledSettingChangedLocked();
updateInputFilterLocked();
sendStateToClientsLocked();
}
}
-
return;
}
super.onReceive(context, intent);
}
-
- private void updateEnabledAccessibilitySerivcesSettingLocked(
- Set<ComponentName> enabledServices) {
- Iterator<ComponentName> it = enabledServices.iterator();
- StringBuilder str = new StringBuilder();
- while (it.hasNext()) {
- if (str.length() > 0) {
- str.append(':');
- }
- str.append(it.next().flattenToShortString());
- }
- Settings.Secure.putString(mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
- str.toString());
- }
};
// package changes
@@ -338,6 +339,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
synchronized (mLock) {
// We will update when the automation service dies.
if (mUiAutomationService == null) {
+ populateEnabledAccessibilityServicesLocked();
+ manageServicesLocked();
+ }
+ }
+ }
+ });
+
+ Uri touchExplorationGrantedServicesUri = Settings.Secure.getUriFor(
+ Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES);
+ contentResolver.registerContentObserver(touchExplorationGrantedServicesUri, false,
+ new ContentObserver(new Handler()) {
+ @Override
+ public void onChange(boolean selfChange) {
+ super.onChange(selfChange);
+ synchronized (mLock) {
+ // We will update when the automation service dies.
+ if (mUiAutomationService == null) {
+ populateTouchExplorationGrantedAccessibilityServicesLocked();
+ unbindAllServicesLocked();
manageServicesLocked();
}
}
@@ -647,6 +667,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
}
+ private void populateEnabledAccessibilityServicesLocked() {
+ populateComponentNamesFromSettingLocked(
+ Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
+ mEnabledServices);
+ }
+
+ private void populateTouchExplorationGrantedAccessibilityServicesLocked() {
+ populateComponentNamesFromSettingLocked(
+ Settings.Secure.TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+ mTouchExplorationGrantedServices);
+ }
+
/**
* Performs {@link AccessibilityService}s delayed notification. The delay is configurable
* and denotes the period after the last event before notifying the service.
@@ -689,7 +721,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mServices.add(service);
mComponentNameToServiceMap.put(service.mComponentName, service);
updateInputFilterLocked();
- tryEnableTouchExploration(service);
+ tryEnableTouchExplorationLocked(service);
} catch (RemoteException e) {
/* do nothing */
}
@@ -710,7 +742,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
service.unlinkToOwnDeath();
service.dispose();
updateInputFilterLocked();
- tryDisableTouchExploration(service);
+ tryDisableTouchExplorationLocked(service);
return removed;
}
@@ -762,7 +794,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
* Manages services by starting enabled ones and stopping disabled ones.
*/
private void manageServicesLocked() {
- populateEnabledServicesLocked(mEnabledServices);
final int enabledInstalledServicesCount = updateServicesStateLocked(mInstalledServices,
mEnabledServices);
// No enabled installed services => disable accessibility to avoid
@@ -789,20 +820,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
/**
- * Populates a list with the {@link ComponentName}s of all enabled
- * {@link AccessibilityService}s.
+ * Populates a set with the {@link ComponentName}s stored in a colon
+ * separated value setting.
*
- * @param enabledServices The list.
+ * @param settingName The setting to parse.
+ * @param outComponentNames The output component names.
*/
- private void populateEnabledServicesLocked(Set<ComponentName> enabledServices) {
- enabledServices.clear();
+ private void populateComponentNamesFromSettingLocked(String settingName,
+ Set<ComponentName> outComponentNames) {
+ outComponentNames.clear();
- String servicesValue = Settings.Secure.getString(mContext.getContentResolver(),
- Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
+ String settingValue = Settings.Secure.getString(mContext.getContentResolver(), settingName);
- if (servicesValue != null) {
+ if (settingValue != null) {
TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
- splitter.setString(servicesValue);
+ splitter.setString(settingValue);
while (splitter.hasNext()) {
String str = splitter.next();
if (str == null || str.length() <= 0) {
@@ -810,13 +842,32 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
}
ComponentName enabledService = ComponentName.unflattenFromString(str);
if (enabledService != null) {
- enabledServices.add(enabledService);
+ outComponentNames.add(enabledService);
}
}
}
}
/**
+ * Persists the component names in the specified setting in a
+ * colon separated fashion.
+ *
+ * @param settingName The setting name.
+ * @param componentNames The component names.
+ */
+ private void persistComponentNamesToSettingLocked(String settingName,
+ Set<ComponentName> componentNames) {
+ StringBuilder builder = new StringBuilder();
+ for (ComponentName componentName : componentNames) {
+ if (builder.length() > 0) {
+ builder.append(COMPONENT_NAME_SEPARATOR);
+ }
+ builder.append(componentName.flattenToShortString());
+ }
+ Settings.Secure.putString(mContext.getContentResolver(), settingName, builder.toString());
+ }
+
+ /**
* Updates the state of each service by starting (or keeping running) enabled ones and
* stopping the rest.
*
@@ -935,20 +986,21 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0) == 1;
}
- private void tryEnableTouchExploration(final Service service) {
+ private void tryEnableTouchExplorationLocked(final Service service) {
if (!mIsTouchExplorationEnabled && service.mRequestTouchExplorationMode) {
- if (!service.mIsAutomation) {
+ final boolean canToggleTouchExploration = mTouchExplorationGrantedServices.contains(
+ service.mComponentName);
+ if (!service.mIsAutomation && !canToggleTouchExploration) {
mMainHandler.obtainMessage(MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG,
service).sendToTarget();
} else {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
+ mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 1, 0).sendToTarget();
}
}
}
- private void tryDisableTouchExploration(Service service) {
- if (mIsTouchExplorationEnabled && service.mReqeustTouchExplorationMode) {
+ private void tryDisableTouchExplorationLocked(Service service) {
+ if (mIsTouchExplorationEnabled) {
synchronized (mLock) {
final int serviceCount = mServices.size();
for (int i = 0; i < serviceCount; i++) {
@@ -957,8 +1009,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
return;
}
}
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 0);
+ mMainHandler.obtainMessage(MSG_TOGGLE_TOUCH_EXPLORATION, 0, 0).sendToTarget();
}
}
}
@@ -995,32 +1046,54 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
public void handleMessage(Message msg) {
final int type = msg.what;
switch (type) {
+ case MSG_TOGGLE_TOUCH_EXPLORATION: {
+ final int value = msg.arg1;
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, value);
+ } break;
case MSG_SHOW_ENABLE_TOUCH_EXPLORATION_DIALOG: {
- Service service = (Service) msg.obj;
+ final Service service = (Service) msg.obj;
String label = service.mResolveInfo.loadLabel(
mContext.getPackageManager()).toString();
- final AlertDialog dialog = new AlertDialog.Builder(mContext)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setPositiveButton(android.R.string.ok, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- Settings.Secure.putInt(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
- }
- })
- .setNegativeButton(android.R.string.cancel, new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- dialog.dismiss();
- }
- })
- .setTitle(R.string.enable_explore_by_touch_warning_title)
- .setMessage(mContext.getString(
- R.string.enable_explore_by_touch_warning_message, label))
- .create();
- dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
- dialog.setCanceledOnTouchOutside(true);
- dialog.show();
+ synchronized (mLock) {
+ if (mIsTouchExplorationEnabled) {
+ return;
+ }
+ if (mEnableTouchExplorationDialog != null
+ && mEnableTouchExplorationDialog.isShowing()) {
+ return;
+ }
+ mEnableTouchExplorationDialog = new AlertDialog.Builder(mContext)
+ .setIcon(android.R.drawable.ic_dialog_alert)
+ .setPositiveButton(android.R.string.ok, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // The user allowed the service to toggle touch exploration.
+ mTouchExplorationGrantedServices.add(service.mComponentName);
+ persistComponentNamesToSettingLocked(
+ Settings.Secure.
+ TOUCH_EXPLORATION_GRANTED_ACCESSIBILITY_SERVICES,
+ mTouchExplorationGrantedServices);
+ // Enable touch exploration.
+ Settings.Secure.putInt(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1);
+ }
+ })
+ .setNegativeButton(android.R.string.cancel, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ })
+ .setTitle(R.string.enable_explore_by_touch_warning_title)
+ .setMessage(mContext.getString(
+ R.string.enable_explore_by_touch_warning_message, label))
+ .create();
+ mEnableTouchExplorationDialog.getWindow().setType(
+ WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG);
+ mEnableTouchExplorationDialog.setCanceledOnTouchOutside(true);
+ mEnableTouchExplorationDialog.show();
+ }
}
}
}
@@ -1143,8 +1216,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
mRequestTouchExplorationMode = (info.flags
& AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE) != 0;
+ // If this service is up and running we may have to enable touch
+ // exploration, otherwise this will happen when the service connects.
synchronized (mLock) {
- tryAddServiceLocked(this);
+ if (isConfigured()) {
+ if (mRequestTouchExplorationMode) {
+ tryEnableTouchExplorationLocked(this);
+ } else {
+ tryDisableTouchExplorationLocked(this);
+ }
+ }
}
}
@@ -1496,6 +1577,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub {
if (mIsAutomation) {
mUiAutomationService = null;
+ populateEnabledAccessibilityServicesLocked();
+ populateTouchExplorationGrantedAccessibilityServicesLocked();
+
handleAccessibilityEnabledSettingChangedLocked();
sendStateToClientsLocked();
diff --git a/services/java/com/android/server/accessibility/TouchExplorer.java b/services/java/com/android/server/accessibility/TouchExplorer.java
index b0b2b8d42663..4c38ab967691 100644
--- a/services/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/java/com/android/server/accessibility/TouchExplorer.java
@@ -1532,7 +1532,7 @@ public class TouchExplorer {
*/
public ReceivedPointerTracker(Context context) {
mThresholdActivePointer =
- ViewConfiguration.get(context).getScaledTouchSlop() * COEFFICIENT_ACTIVE_POINTER;
+ ViewConfiguration.get(context).getScaledTouchSlop() * COEFFICIENT_ACTIVE_POINTER;//Heie govna
}
/**
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 9d9b5b8375a2..febbd3234d5e 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -176,6 +176,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final boolean DEBUG_SERVICE_EXECUTING = localLOGV || false;
static final boolean DEBUG_VISBILITY = localLOGV || false;
static final boolean DEBUG_PROCESSES = localLOGV || false;
+ static final boolean DEBUG_PROCESS_OBSERVERS = localLOGV || false;
static final boolean DEBUG_PROVIDER = localLOGV || false;
static final boolean DEBUG_URI_PERMISSION = localLOGV || false;
static final boolean DEBUG_USER_LEAVING = localLOGV || false;
@@ -764,8 +765,24 @@ public final class ActivityManagerService extends ActivityManagerNative
boolean mAutoStopProfiler = false;
String mOpenGlTraceApp = null;
+ static class ProcessChangeItem {
+ static final int CHANGE_ACTIVITIES = 1<<0;
+ static final int CHANGE_IMPORTANCE= 1<<1;
+ int changes;
+ int uid;
+ int pid;
+ int importance;
+ boolean foregroundActivities;
+ }
+
final RemoteCallbackList<IProcessObserver> mProcessObservers
= new RemoteCallbackList<IProcessObserver>();
+ ProcessChangeItem[] mActiveProcessChanges = new ProcessChangeItem[5];
+
+ final ArrayList<ProcessChangeItem> mPendingProcessChanges
+ = new ArrayList<ProcessChangeItem>();
+ final ArrayList<ProcessChangeItem> mAvailProcessChanges
+ = new ArrayList<ProcessChangeItem>();
/**
* Callback of last caller to {@link #requestPss}.
@@ -855,7 +872,7 @@ public final class ActivityManagerService extends ActivityManagerNative
static final int CLEAR_DNS_CACHE = 28;
static final int UPDATE_HTTP_PROXY = 29;
static final int SHOW_COMPAT_MODE_DIALOG_MSG = 30;
- static final int DISPATCH_FOREGROUND_ACTIVITIES_CHANGED = 31;
+ static final int DISPATCH_PROCESSES_CHANGED = 31;
static final int DISPATCH_PROCESS_DIED = 32;
static final int REPORT_MEM_USAGE = 33;
@@ -1195,11 +1212,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
break;
}
- case DISPATCH_FOREGROUND_ACTIVITIES_CHANGED: {
- final int pid = msg.arg1;
- final int uid = msg.arg2;
- final boolean foregroundActivities = (Boolean) msg.obj;
- dispatchForegroundActivitiesChanged(pid, uid, foregroundActivities);
+ case DISPATCH_PROCESSES_CHANGED: {
+ dispatchProcessesChanged();
break;
}
case DISPATCH_PROCESS_DIED: {
@@ -2260,19 +2274,43 @@ public final class ActivityManagerService extends ActivityManagerNative
void reportResumedActivityLocked(ActivityRecord r) {
//Slog.i(TAG, "**** REPORT RESUME: " + r);
-
- final int identHash = System.identityHashCode(r);
updateUsageStats(r, true);
}
- private void dispatchForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
+ private void dispatchProcessesChanged() {
+ int N;
+ synchronized (this) {
+ N = mPendingProcessChanges.size();
+ if (mActiveProcessChanges.length < N) {
+ mActiveProcessChanges = new ProcessChangeItem[N];
+ }
+ mPendingProcessChanges.toArray(mActiveProcessChanges);
+ mAvailProcessChanges.addAll(mPendingProcessChanges);
+ mPendingProcessChanges.clear();
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "*** Delivering " + N + " process changes");
+ }
int i = mProcessObservers.beginBroadcast();
while (i > 0) {
i--;
final IProcessObserver observer = mProcessObservers.getBroadcastItem(i);
if (observer != null) {
try {
- observer.onForegroundActivitiesChanged(pid, uid, foregroundActivities);
+ for (int j=0; j<N; j++) {
+ ProcessChangeItem item = mActiveProcessChanges[j];
+ if ((item.changes&ProcessChangeItem.CHANGE_ACTIVITIES) != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "ACTIVITIES CHANGED pid="
+ + item.pid + " uid=" + item.uid + ": "
+ + item.foregroundActivities);
+ observer.onForegroundActivitiesChanged(item.pid, item.uid,
+ item.foregroundActivities);
+ }
+ if ((item.changes&ProcessChangeItem.CHANGE_IMPORTANCE) != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "IMPORTANCE CHANGED pid="
+ + item.pid + " uid=" + item.uid + ": " + item.importance);
+ observer.onImportanceChanged(item.pid, item.uid,
+ item.importance);
+ }
+ }
} catch (RemoteException e) {
}
}
@@ -3529,7 +3567,8 @@ public final class ActivityManagerService extends ActivityManagerNative
for (int i=mMainStack.mHistory.size()-1; i>=0; i--) {
ActivityRecord r = (ActivityRecord)mMainStack.mHistory.get(i);
- if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0) {
+ if ((r.info.flags&ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS) != 0
+ && (r.intent.getFlags()&Intent.FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS) == 0) {
r.stack.finishActivityLocked(r, i,
Activity.RESULT_CANCELED, null, "close-sys");
}
@@ -10801,6 +10840,13 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
+ for (int i = mPendingProcessChanges.size()-1; i>=0; i--) {
+ ProcessChangeItem item = mPendingProcessChanges.get(i);
+ if (item.pid == app.pid) {
+ mPendingProcessChanges.remove(i);
+ mAvailProcessChanges.add(item);
+ }
+ }
mHandler.obtainMessage(DISPATCH_PROCESS_DIED, app.pid, app.info.uid, null).sendToTarget();
// If the caller is restarting this app, then leave it in its
@@ -13733,9 +13779,6 @@ public final class ActivityManagerService extends ActivityManagerNative
return (app.curAdj=app.maxAdj);
}
- final boolean hadForegroundActivities = app.foregroundActivities;
-
- app.foregroundActivities = false;
app.keeping = false;
app.systemNoUi = false;
@@ -13743,18 +13786,22 @@ public final class ActivityManagerService extends ActivityManagerNative
// important to least, and assign an appropriate OOM adjustment.
int adj;
int schedGroup;
+ boolean foregroundActivities = false;
+ boolean interesting = false;
BroadcastQueue queue;
if (app == TOP_APP) {
// The last app on the list is the foreground app.
adj = ProcessList.FOREGROUND_APP_ADJ;
schedGroup = Process.THREAD_GROUP_DEFAULT;
app.adjType = "top-activity";
- app.foregroundActivities = true;
+ foregroundActivities = true;
+ interesting = true;
} else if (app.instrumentationClass != null) {
// Don't want to kill running instrumentation.
adj = ProcessList.FOREGROUND_APP_ADJ;
schedGroup = Process.THREAD_GROUP_DEFAULT;
app.adjType = "instrumentation";
+ interesting = true;
} else if ((queue = isReceivingBroadcast(app)) != null) {
// An app that is currently receiving a broadcast also
// counts as being in the foreground for OOM killer purposes.
@@ -13790,7 +13837,7 @@ public final class ActivityManagerService extends ActivityManagerNative
boolean hasStoppingActivities = false;
// Examine all activities if not already foreground.
- if (!app.foregroundActivities && activitiesSize > 0) {
+ if (!foregroundActivities && activitiesSize > 0) {
for (int j = 0; j < activitiesSize; j++) {
final ActivityRecord r = app.activities.get(j);
if (r.visible) {
@@ -13801,7 +13848,7 @@ public final class ActivityManagerService extends ActivityManagerNative
}
schedGroup = Process.THREAD_GROUP_DEFAULT;
app.hidden = false;
- app.foregroundActivities = true;
+ foregroundActivities = true;
break;
} else if (r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED) {
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
@@ -13809,13 +13856,13 @@ public final class ActivityManagerService extends ActivityManagerNative
app.adjType = "pausing";
}
app.hidden = false;
- app.foregroundActivities = true;
+ foregroundActivities = true;
} else if (r.state == ActivityState.STOPPING) {
// We will apply the actual adjustment later, because
// we want to allow this process to immediately go through
// any memory trimming that is in effect.
app.hidden = false;
- app.foregroundActivities = true;
+ foregroundActivities = true;
hasStoppingActivities = true;
}
}
@@ -13838,6 +13885,10 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
+ if (app.foregroundServices) {
+ interesting = true;
+ }
+
if (adj > ProcessList.HEAVY_WEIGHT_APP_ADJ && app == mHeavyWeightProcess) {
// We don't want to kill the current heavy-weight process.
adj = ProcessList.HEAVY_WEIGHT_APP_ADJ;
@@ -14187,12 +14238,84 @@ public final class ActivityManagerService extends ActivityManagerNative
}
}
- app.curAdj = adj;
- app.curSchedGroup = schedGroup;
+ int importance = app.memImportance;
+ if (importance == 0 || adj != app.curAdj || schedGroup != app.curSchedGroup) {
+ app.curAdj = adj;
+ app.curSchedGroup = schedGroup;
+ if (!interesting) {
+ // For this reporting, if there is not something explicitly
+ // interesting in this process then we will push it to the
+ // background importance.
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
+ } else if (adj >= ProcessList.HIDDEN_APP_MIN_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
+ } else if (adj >= ProcessList.SERVICE_B_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
+ } else if (adj >= ProcessList.HOME_APP_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND;
+ } else if (adj >= ProcessList.SERVICE_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE;
+ } else if (adj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_CANT_SAVE_STATE;
+ } else if (adj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERCEPTIBLE;
+ } else if (adj >= ProcessList.VISIBLE_APP_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
+ } else if (adj >= ProcessList.FOREGROUND_APP_ADJ) {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND;
+ } else {
+ importance = ActivityManager.RunningAppProcessInfo.IMPORTANCE_PERSISTENT;
+ }
+ }
- if (hadForegroundActivities != app.foregroundActivities) {
- mHandler.obtainMessage(DISPATCH_FOREGROUND_ACTIVITIES_CHANGED, app.pid, app.info.uid,
- app.foregroundActivities).sendToTarget();
+ int changes = importance != app.memImportance ? ProcessChangeItem.CHANGE_IMPORTANCE : 0;
+ if (foregroundActivities != app.foregroundActivities) {
+ changes |= ProcessChangeItem.CHANGE_ACTIVITIES;
+ }
+ if (changes != 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Changes in " + app + ": " + changes);
+ app.memImportance = importance;
+ app.foregroundActivities = foregroundActivities;
+ int i = mPendingProcessChanges.size()-1;
+ ProcessChangeItem item = null;
+ while (i >= 0) {
+ item = mPendingProcessChanges.get(i);
+ if (item.pid == app.pid) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Re-using existing item: " + item);
+ break;
+ }
+ i--;
+ }
+ if (i < 0) {
+ // No existing item in pending changes; need a new one.
+ final int NA = mAvailProcessChanges.size();
+ if (NA > 0) {
+ item = mAvailProcessChanges.remove(NA-1);
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Retreiving available item: " + item);
+ } else {
+ item = new ProcessChangeItem();
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Allocating new item: " + item);
+ }
+ item.changes = 0;
+ item.pid = app.pid;
+ item.uid = app.info.uid;
+ if (mPendingProcessChanges.size() == 0) {
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG,
+ "*** Enqueueing dispatch processes changed!");
+ mHandler.obtainMessage(DISPATCH_PROCESSES_CHANGED).sendToTarget();
+ }
+ mPendingProcessChanges.add(item);
+ }
+ item.changes |= changes;
+ item.importance = importance;
+ item.foregroundActivities = foregroundActivities;
+ if (DEBUG_PROCESS_OBSERVERS) Slog.i(TAG, "Item "
+ + Integer.toHexString(System.identityHashCode(item))
+ + " " + app.toShortString() + ": changes=" + item.changes
+ + " importance=" + item.importance
+ + " foreground=" + item.foregroundActivities
+ + " type=" + app.adjType + " source=" + app.adjSource
+ + " target=" + app.adjTarget);
}
return app.curRawAdj;
diff --git a/services/java/com/android/server/am/ContentProviderConnection.java b/services/java/com/android/server/am/ContentProviderConnection.java
index 84f8f0250194..7f69b2467868 100644
--- a/services/java/com/android/server/am/ContentProviderConnection.java
+++ b/services/java/com/android/server/am/ContentProviderConnection.java
@@ -17,6 +17,8 @@
package com.android.server.am;
import android.os.Binder;
+import android.os.SystemClock;
+import android.util.TimeUtils;
/**
* Represents a link between a content provider and client.
@@ -24,6 +26,7 @@ import android.os.Binder;
public class ContentProviderConnection extends Binder {
public final ContentProviderRecord provider;
public final ProcessRecord client;
+ public final long createTime;
public int stableCount;
public int unstableCount;
// The client of this connection is currently waiting for the provider to appear.
@@ -39,6 +42,7 @@ public class ContentProviderConnection extends Binder {
public ContentProviderConnection(ContentProviderRecord _provider, ProcessRecord _client) {
provider = _provider;
client = _client;
+ createTime = SystemClock.elapsedRealtime();
}
public String toString() {
@@ -83,5 +87,8 @@ public class ContentProviderConnection extends Binder {
if (dead) {
sb.append(" DEAD");
}
+ long nowReal = SystemClock.elapsedRealtime();
+ sb.append(" ");
+ TimeUtils.formatDuration(nowReal-createTime, sb);
}
}
diff --git a/services/java/com/android/server/am/ProcessRecord.java b/services/java/com/android/server/am/ProcessRecord.java
index 8a3ba7f81418..cba94801c49c 100644
--- a/services/java/com/android/server/am/ProcessRecord.java
+++ b/services/java/com/android/server/am/ProcessRecord.java
@@ -69,6 +69,7 @@ class ProcessRecord {
int curSchedGroup; // Currently desired scheduling class
int setSchedGroup; // Last set to background scheduling class
int trimMemoryLevel; // Last selected memory trimming level
+ int memImportance; // Importance constant computed from curAdj
boolean serviceb; // Process currently is on the service B list
boolean keeping; // Actively running code so don't kill due to that?
boolean setIsForeground; // Running foreground UI when last set?
diff --git a/services/java/com/android/server/am/TaskRecord.java b/services/java/com/android/server/am/TaskRecord.java
index 4b4a89d55eef..3a767c27581d 100644
--- a/services/java/com/android/server/am/TaskRecord.java
+++ b/services/java/com/android/server/am/TaskRecord.java
@@ -19,9 +19,8 @@ package com.android.server.am;
import android.content.ComponentName;
import android.content.Intent;
import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.graphics.Bitmap;
import android.os.UserId;
+import android.util.Slog;
import java.io.PrintWriter;
@@ -69,6 +68,8 @@ class TaskRecord extends ThumbnailHolder {
_intent.setSourceBounds(null);
}
}
+ if (ActivityManagerService.DEBUG_TASKS) Slog.v(ActivityManagerService.TAG,
+ "Setting Intent of " + this + " to " + _intent);
intent = _intent;
realActivity = _intent != null ? _intent.getComponent() : null;
origActivity = null;
@@ -80,6 +81,8 @@ class TaskRecord extends ThumbnailHolder {
targetIntent.setComponent(targetComponent);
targetIntent.setSelector(null);
targetIntent.setSourceBounds(null);
+ if (ActivityManagerService.DEBUG_TASKS) Slog.v(ActivityManagerService.TAG,
+ "Setting Intent of " + this + " to target " + targetIntent);
intent = targetIntent;
realActivity = targetComponent;
origActivity = _intent.getComponent();
@@ -103,9 +106,10 @@ class TaskRecord extends ThumbnailHolder {
}
void dump(PrintWriter pw, String prefix) {
- if (numActivities != 0 || rootWasReset) {
+ if (numActivities != 0 || rootWasReset || userId != 0) {
pw.print(prefix); pw.print("numActivities="); pw.print(numActivities);
- pw.print(" rootWasReset="); pw.println(rootWasReset);
+ pw.print(" rootWasReset="); pw.print(rootWasReset);
+ pw.print(" userId="); pw.println(userId);
}
if (affinity != null) {
pw.print(prefix); pw.print("affinity="); pw.println(affinity);
diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java
index d85facc61970..bdd0aa463e00 100644
--- a/services/java/com/android/server/input/InputManagerService.java
+++ b/services/java/com/android/server/input/InputManagerService.java
@@ -592,7 +592,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog.
deviceIdAndGeneration[i * 2] = inputDevice.getId();
deviceIdAndGeneration[i * 2 + 1] = inputDevice.getGeneration();
- if (isFullKeyboard(inputDevice)) {
+ if (!inputDevice.isVirtual() && inputDevice.isFullKeyboard()) {
if (!containsInputDeviceWithDescriptor(oldInputDevices,
inputDevice.getDescriptor())) {
mTempFullKeyboards.add(numFullKeyboardsAdded++, inputDevice);
@@ -695,12 +695,6 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog.
reloadKeyboardLayouts();
}
- private static boolean isFullKeyboard(InputDevice inputDevice) {
- return !inputDevice.isVirtual()
- && (inputDevice.getSources() & InputDevice.SOURCE_KEYBOARD) != 0
- && inputDevice.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC;
- }
-
private static boolean containsInputDeviceWithDescriptor(InputDevice[] inputDevices,
String descriptor) {
final int numDevices = inputDevices.length;
diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java
index c82f37cbe3ef..c4abac971b64 100644
--- a/services/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -396,6 +396,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
@Override
+ public void onImportanceChanged(int pid, int uid, int importance) {
+ }
+
+ @Override
public void onProcessDied(int pid, int uid) {
mHandler.obtainMessage(MSG_PROCESS_DIED, pid, uid).sendToTarget();
}
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 4ce8c97541d7..efbf0d4852a3 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -5437,8 +5437,8 @@ public class WindowManagerService extends IWindowManager.Stub
// window.
including = !ws.mIsImWindow && !ws.isFullscreen(dw, dh);
- if (maxLayer < ws.mWinAnimator.mAnimLayer) {
- maxLayer = ws.mWinAnimator.mAnimLayer;
+ if (maxLayer < ws.mWinAnimator.mSurfaceLayer) {
+ maxLayer = ws.mWinAnimator.mSurfaceLayer;
}
// Don't include wallpaper in bounds calculation
@@ -6466,17 +6466,18 @@ public class WindowManagerService extends IWindowManager.Stub
WindowManagerPolicy.PRESENCE_INTERNAL;
if (mIsTouchDevice) {
- if ((sources & InputDevice.SOURCE_TOUCHSCREEN) != 0) {
+ if ((sources & InputDevice.SOURCE_TOUCHSCREEN) ==
+ InputDevice.SOURCE_TOUCHSCREEN) {
config.touchscreen = Configuration.TOUCHSCREEN_FINGER;
}
} else {
config.touchscreen = Configuration.TOUCHSCREEN_NOTOUCH;
}
- if ((sources & InputDevice.SOURCE_TRACKBALL) != 0) {
+ if ((sources & InputDevice.SOURCE_TRACKBALL) == InputDevice.SOURCE_TRACKBALL) {
config.navigation = Configuration.NAVIGATION_TRACKBALL;
navigationPresence |= presenceFlag;
- } else if ((sources & InputDevice.SOURCE_DPAD) != 0
+ } else if ((sources & InputDevice.SOURCE_DPAD) == InputDevice.SOURCE_DPAD
&& config.navigation == Configuration.NAVIGATION_NONAV) {
config.navigation = Configuration.NAVIGATION_DPAD;
navigationPresence |= presenceFlag;
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index 04ec82046e29..9e5e84b382ab 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -226,7 +226,7 @@ bool SensorService::threadLoop()
ALOGD("nuSensorService thread starting...");
const size_t numEventMax = 16;
- const size_t minBufferSize = numEventMax * mVirtualSensorList.size();
+ const size_t minBufferSize = numEventMax + numEventMax * mVirtualSensorList.size();
sensors_event_t buffer[minBufferSize];
sensors_event_t scratch[minBufferSize];
SensorDevice& device(SensorDevice::getInstance());
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index 5220d04bb339..1a42f9371087 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -263,12 +263,19 @@ public class WifiWatchdogStateMachine extends StateMachine {
Context.CONNECTIVITY_SERVICE);
sWifiOnly = (cm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE) == false);
- // Disable for wifi only devices.
- if (Settings.Secure.getString(contentResolver, Settings.Secure.WIFI_WATCHDOG_ON) == null
- && sWifiOnly) {
- log("Disabling watchog for wi-fi only device");
- putSettingsBoolean(contentResolver, Settings.Secure.WIFI_WATCHDOG_ON, false);
+ // Watchdog is always enabled. Poor network detection & walled garden detection
+ // can individually be turned on/off
+ // TODO: Remove this setting & clean up state machine since we always have
+ // watchdog in an enabled state
+ putSettingsBoolean(contentResolver, Settings.Secure.WIFI_WATCHDOG_ON, true);
+
+ // Disable poor network avoidance, but keep watchdog active for walled garden detection
+ if (sWifiOnly) {
+ log("Disabling poor network avoidance for wi-fi only device");
+ putSettingsBoolean(contentResolver,
+ Settings.Secure.WIFI_WATCHDOG_POOR_NETWORK_TEST_ENABLED, false);
}
+
WifiWatchdogStateMachine wwsm = new WifiWatchdogStateMachine(context);
wwsm.start();
return wwsm;