Merge branch 'eclair' into eclair-release

This commit is contained in:
The Android Automerger
2009-10-28 23:57:05 -07:00
26 changed files with 455 additions and 275 deletions

View File

@@ -13804,6 +13804,8 @@
</parameter>
<parameter name="options" type="android.os.Bundle">
</parameter>
<exception name="NetworkErrorException" type="android.accounts.NetworkErrorException">
</exception>
</method>
<method name="editProperties"
return="android.os.Bundle"
@@ -13853,7 +13855,7 @@
</parameter>
<parameter name="authTokenType" type="java.lang.String">
</parameter>
<parameter name="loginOptions" type="android.os.Bundle">
<parameter name="options" type="android.os.Bundle">
</parameter>
<exception name="NetworkErrorException" type="android.accounts.NetworkErrorException">
</exception>
@@ -13917,8 +13919,10 @@
</parameter>
<parameter name="authTokenType" type="java.lang.String">
</parameter>
<parameter name="loginOptions" type="android.os.Bundle">
<parameter name="options" type="android.os.Bundle">
</parameter>
<exception name="NetworkErrorException" type="android.accounts.NetworkErrorException">
</exception>
</method>
</class>
<class name="Account"
@@ -14183,7 +14187,7 @@
</parameter>
<parameter name="password" type="java.lang.String">
</parameter>
<parameter name="extras" type="android.os.Bundle">
<parameter name="userdata" type="android.os.Bundle">
</parameter>
</method>
<method name="addOnAccountsUpdatedListener"
@@ -14349,7 +14353,7 @@
</parameter>
<parameter name="authTokenType" type="java.lang.String">
</parameter>
<parameter name="loginOptions" type="android.os.Bundle">
<parameter name="options" type="android.os.Bundle">
</parameter>
<parameter name="activity" type="android.app.Activity">
</parameter>
@@ -14399,7 +14403,7 @@
</parameter>
<parameter name="addAccountOptions" type="android.os.Bundle">
</parameter>
<parameter name="loginOptions" type="android.os.Bundle">
<parameter name="getAuthTokenOptions" type="android.os.Bundle">
</parameter>
<parameter name="callback" type="android.accounts.AccountManagerCallback&lt;android.os.Bundle&gt;">
</parameter>
@@ -14568,7 +14572,7 @@
</parameter>
<parameter name="authTokenType" type="java.lang.String">
</parameter>
<parameter name="loginOptions" type="android.os.Bundle">
<parameter name="options" type="android.os.Bundle">
</parameter>
<parameter name="activity" type="android.app.Activity">
</parameter>

View File

@@ -87,6 +87,9 @@ import android.Manifest;
* the {@link AccountAuthenticatorResponse} as {@link AccountManager#KEY_ACCOUNT_MANAGER_RESPONSE}.
* The activity must then call {@link AccountAuthenticatorResponse#onResult} or
* {@link AccountAuthenticatorResponse#onError} when it is complete.
* <li> If the authenticator cannot synchronously process the request and return a result then it
* may choose to return null and then use the {@link AccountManagerResponse} to send the result
* when it has completed the request.
* </ul>
* <p>
* The following descriptions of each of the abstract authenticator methods will not describe the
@@ -111,44 +114,35 @@ public abstract class AbstractAccountAuthenticator {
String authTokenType, String[] requiredFeatures, Bundle options)
throws RemoteException {
checkBinderPermission();
final Bundle result;
try {
result = AbstractAccountAuthenticator.this.addAccount(
final Bundle result = AbstractAccountAuthenticator.this.addAccount(
new AccountAuthenticatorResponse(response),
accountType, authTokenType, requiredFeatures, options);
if (result != null) {
response.onResult(result);
}
} catch (NetworkErrorException e) {
response.onError(AccountManager.ERROR_CODE_NETWORK_ERROR, e.getMessage());
return;
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
"addAccount not supported");
return;
}
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
}
public void confirmCredentials(IAccountAuthenticatorResponse response,
Account account, Bundle options) throws RemoteException {
checkBinderPermission();
final Bundle result;
try {
result = AbstractAccountAuthenticator.this.confirmCredentials(
final Bundle result = AbstractAccountAuthenticator.this.confirmCredentials(
new AccountAuthenticatorResponse(response), account, options);
if (result != null) {
response.onResult(result);
}
} catch (NetworkErrorException e) {
response.onError(AccountManager.ERROR_CODE_NETWORK_ERROR, e.getMessage());
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
"confirmCredentials not supported");
return;
}
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
}
@@ -180,9 +174,6 @@ public abstract class AbstractAccountAuthenticator {
authTokenType, loginOptions);
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
@@ -195,64 +186,50 @@ public abstract class AbstractAccountAuthenticator {
public void updateCredentials(IAccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle loginOptions) throws RemoteException {
checkBinderPermission();
final Bundle result;
try {
result = AbstractAccountAuthenticator.this.updateCredentials(
final Bundle result = AbstractAccountAuthenticator.this.updateCredentials(
new AccountAuthenticatorResponse(response), account,
authTokenType, loginOptions);
if (result != null) {
response.onResult(result);
}
} catch (NetworkErrorException e) {
response.onError(AccountManager.ERROR_CODE_NETWORK_ERROR, e.getMessage());
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
"updateCredentials not supported");
return;
}
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
}
public void editProperties(IAccountAuthenticatorResponse response,
String accountType) throws RemoteException {
checkBinderPermission();
final Bundle result;
try {
result = AbstractAccountAuthenticator.this.editProperties(
final Bundle result = AbstractAccountAuthenticator.this.editProperties(
new AccountAuthenticatorResponse(response), accountType);
if (result != null) {
response.onResult(result);
}
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
"editProperties not supported");
return;
}
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
}
public void hasFeatures(IAccountAuthenticatorResponse response,
Account account, String[] features) throws RemoteException {
checkBinderPermission();
final Bundle result;
try {
result = AbstractAccountAuthenticator.this.hasFeatures(
final Bundle result = AbstractAccountAuthenticator.this.hasFeatures(
new AccountAuthenticatorResponse(response), account, features);
if (result != null) {
response.onResult(result);
}
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
"hasFeatures not supported");
return;
} catch (NetworkErrorException e) {
response.onError(AccountManager.ERROR_CODE_NETWORK_ERROR, e.getMessage());
return;
}
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
}
@@ -264,9 +241,6 @@ public abstract class AbstractAccountAuthenticator {
new AccountAuthenticatorResponse(response), account);
if (result != null) {
response.onResult(result);
} else {
response.onError(AccountManager.ERROR_CODE_INVALID_RESPONSE,
"no response from the authenticator");
}
} catch (UnsupportedOperationException e) {
response.onError(AccountManager.ERROR_CODE_UNSUPPORTED_OPERATION,
@@ -347,16 +321,18 @@ public abstract class AbstractAccountAuthenticator {
* <li> {@link AccountManager#KEY_ERROR_CODE} and {@link AccountManager#KEY_ERROR_MESSAGE} to
* indicate an error
* </ul>
* @throws NetworkErrorException if the authenticator could not honor the request due to a
* network error
*/
public abstract Bundle confirmCredentials(AccountAuthenticatorResponse response,
Account account, Bundle options);
Account account, Bundle options)
throws NetworkErrorException;
/**
* Gets the authtoken for an account.
* @param response to send the result back to the AccountManager, will never be null
* @param account the account whose credentials are to be retrieved, will never be null
* @param authTokenType the type of auth token to retrieve, will never be null
* @param loginOptions a Bundle of authenticator-specific options, may be null
* @param options a Bundle of authenticator-specific options, may be null
* @return a Bundle result or null if the result is to be returned via the response. The result
* will contain either:
* <ul>
@@ -370,7 +346,7 @@ public abstract class AbstractAccountAuthenticator {
* network error
*/
public abstract Bundle getAuthToken(AccountAuthenticatorResponse response,
Account account, String authTokenType, Bundle loginOptions)
Account account, String authTokenType, Bundle options)
throws NetworkErrorException;
/**
@@ -386,7 +362,7 @@ public abstract class AbstractAccountAuthenticator {
* @param account the account whose credentials are to be updated, will never be null
* @param authTokenType the type of auth token to retrieve after updating the credentials,
* may be null
* @param loginOptions a Bundle of authenticator-specific options, may be null
* @param options a Bundle of authenticator-specific options, may be null
* @return a Bundle result or null if the result is to be returned via the response. The result
* will contain either:
* <ul>
@@ -397,9 +373,11 @@ public abstract class AbstractAccountAuthenticator {
* <li> {@link AccountManager#KEY_ERROR_CODE} and {@link AccountManager#KEY_ERROR_MESSAGE} to
* indicate an error
* </ul>
* @throws NetworkErrorException if the authenticator could not honor the request due to a
* network error
*/
public abstract Bundle updateCredentials(AccountAuthenticatorResponse response,
Account account, String authTokenType, Bundle loginOptions);
Account account, String authTokenType, Bundle options) throws NetworkErrorException;
/**
* Checks if the account supports all the specified authenticator specific features.

View File

@@ -56,30 +56,14 @@ public class AccountAuthenticatorActivity extends Activity {
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
if (icicle == null) {
Intent intent = getIntent();
mAccountAuthenticatorResponse =
intent.getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
} else {
mAccountAuthenticatorResponse =
icicle.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
}
mAccountAuthenticatorResponse =
getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
if (mAccountAuthenticatorResponse != null) {
mAccountAuthenticatorResponse.onRequestContinued();
}
}
/**
* Saves the AccountAuthenticatorResponse in the instance state.
* @param outState where to store any instance data
*/
protected void onSaveInstanceState(Bundle outState) {
outState.putParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE,
mAccountAuthenticatorResponse);
super.onSaveInstanceState(outState);
}
/**
* Sends the result or a Constants.ERROR_CODE_CANCELED error if a result isn't present.
*/
@@ -89,7 +73,8 @@ public class AccountAuthenticatorActivity extends Activity {
if (mResultBundle != null) {
mAccountAuthenticatorResponse.onResult(mResultBundle);
} else {
mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED, "canceled");
mAccountAuthenticatorResponse.onError(AccountManager.ERROR_CODE_CANCELED,
"canceled");
}
mAccountAuthenticatorResponse = null;
}

View File

@@ -237,13 +237,13 @@ public class AccountManager {
* with the same UID as the Authenticator for the account.
* @param account The account to add
* @param password The password to associate with the account. May be null.
* @param extras A bundle of key/value pairs to set as the account's userdata. May be null.
* @param userdata A bundle of key/value pairs to set as the account's userdata. May be null.
* @return true if the account was sucessfully added, false otherwise, for example,
* if the account already exists or if the account is null
*/
public boolean addAccountExplicitly(Account account, String password, Bundle extras) {
public boolean addAccountExplicitly(Account account, String password, Bundle userdata) {
try {
return mService.addAccount(account, password, extras);
return mService.addAccount(account, password, userdata);
} catch (RemoteException e) {
// won't ever happen
throw new RuntimeException(e);
@@ -320,6 +320,12 @@ public class AccountManager {
* AccountManager, null otherwise.
*/
public String peekAuthToken(final Account account, final String authTokenType) {
if (account == null) {
throw new IllegalArgumentException("the account must not be null");
}
if (authTokenType == null) {
return null;
}
try {
return mService.peekAuthToken(account, authTokenType);
} catch (RemoteException e) {
@@ -339,6 +345,9 @@ public class AccountManager {
* @param password the password to set for the account. May be null.
*/
public void setPassword(final Account account, final String password) {
if (account == null) {
throw new IllegalArgumentException("the account must not be null");
}
try {
mService.setPassword(account, password);
} catch (RemoteException e) {
@@ -355,6 +364,9 @@ public class AccountManager {
* @param account the account whose password is to be cleared. Must not be null.
*/
public void clearPassword(final Account account) {
if (account == null) {
throw new IllegalArgumentException("the account must not be null");
}
try {
mService.clearPassword(account);
} catch (RemoteException e) {
@@ -375,6 +387,12 @@ public class AccountManager {
* @param value the value to set. May be null.
*/
public void setUserData(final Account account, final String key, final String value) {
if (account == null) {
throw new IllegalArgumentException("the account must not be null");
}
if (key == null) {
throw new IllegalArgumentException("the key must not be null");
}
try {
mService.setUserData(account, key, value);
} catch (RemoteException e) {
@@ -458,7 +476,7 @@ public class AccountManager {
* @param account The account whose credentials are to be updated.
* @param authTokenType the auth token to retrieve as part of updating the credentials.
* May be null.
* @param loginOptions authenticator specific options for the request
* @param options authenticator specific options for the request
* @param activity If the authenticator returns a {@link #KEY_INTENT} in the result then
* the intent will be started with this activity. If activity is null then the result will
* be returned as-is.
@@ -474,7 +492,7 @@ public class AccountManager {
* If the user presses "back" then the request will be canceled.
*/
public AccountManagerFuture<Bundle> getAuthToken(
final Account account, final String authTokenType, final Bundle loginOptions,
final Account account, final String authTokenType, final Bundle options,
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (activity == null) throw new IllegalArgumentException("activity is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
@@ -482,7 +500,7 @@ public class AccountManager {
public void doWork() throws RemoteException {
mService.getAuthToken(mResponse, account, authTokenType,
false /* notifyOnAuthFailure */, true /* expectActivityLaunch */,
loginOptions);
options);
}
}.start();
}
@@ -584,6 +602,9 @@ public class AccountManager {
final String authTokenType, final String[] requiredFeatures,
final Bundle addAccountOptions,
final Activity activity, AccountManagerCallback<Bundle> callback, Handler handler) {
if (accountType == null) {
throw new IllegalArgumentException();
}
return new AmsTask(activity, handler, callback) {
public void doWork() throws RemoteException {
mService.addAcount(mResponse, accountType, authTokenType,
@@ -683,7 +704,7 @@ public class AccountManager {
* @param account The account whose credentials are to be updated.
* @param authTokenType the auth token to retrieve as part of updating the credentials.
* May be null.
* @param loginOptions authenticator specific options for the request
* @param options authenticator specific options for the request
* @param activity If the authenticator returns a {@link #KEY_INTENT} in the result then
* the intent will be started with this activity. If activity is null then the result will
* be returned as-is.
@@ -702,13 +723,13 @@ public class AccountManager {
*/
public AccountManagerFuture<Bundle> updateCredentials(final Account account,
final String authTokenType,
final Bundle loginOptions, final Activity activity,
final Bundle options, final Activity activity,
final AccountManagerCallback<Bundle> callback,
final Handler handler) {
return new AmsTask(activity, handler, callback) {
public void doWork() throws RemoteException {
mService.updateCredentials(mResponse, account, authTokenType, activity != null,
loginOptions);
options);
}
}.start();
}
@@ -1214,7 +1235,7 @@ public class AccountManager {
* @param activityForPrompting The activity used to start any account management
* activities that are required to fulfill this request. This may be null.
* @param addAccountOptions authenticator-specific options used if an account needs to be added
* @param loginOptions authenticator-specific options passed to getAuthToken
* @param getAuthTokenOptions authenticator-specific options passed to getAuthToken
* @param callback A callback to invoke when the request completes. If null then
* no callback is invoked.
* @param handler The {@link Handler} to use to invoke the callback. If null then the
@@ -1232,13 +1253,13 @@ public class AccountManager {
public AccountManagerFuture<Bundle> getAuthTokenByFeatures(
final String accountType, final String authTokenType, final String[] features,
final Activity activityForPrompting, final Bundle addAccountOptions,
final Bundle loginOptions,
final Bundle getAuthTokenOptions,
final AccountManagerCallback<Bundle> callback, final Handler handler) {
if (accountType == null) throw new IllegalArgumentException("account type is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
final GetAuthTokenByTypeAndFeaturesTask task =
new GetAuthTokenByTypeAndFeaturesTask(accountType, authTokenType, features,
activityForPrompting, addAccountOptions, loginOptions, callback, handler);
activityForPrompting, addAccountOptions, getAuthTokenOptions, callback, handler);
task.start();
return task;
}

View File

@@ -154,6 +154,7 @@ public class AccountManagerService
private static final boolean isDebuggableMonkeyBuild =
SystemProperties.getBoolean("ro.monkey", false)
&& SystemProperties.getBoolean("ro.debuggable", false);
private static final Account[] EMPTY_ACCOUNT_ARRAY = new Account[]{};
static {
ACCOUNTS_CHANGED_INTENT = new Intent(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION);
@@ -268,6 +269,10 @@ public class AccountManagerService
}
private String readPasswordFromDatabase(Account account) {
if (account == null) {
return null;
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_ACCOUNTS, new String[]{ACCOUNTS_PASSWORD},
ACCOUNTS_NAME + "=? AND " + ACCOUNTS_TYPE+ "=?",
@@ -293,6 +298,10 @@ public class AccountManagerService
}
private String readUserDataFromDatabase(Account account, String key) {
if (account == null) {
return null;
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_EXTRAS, new String[]{EXTRAS_VALUE},
EXTRAS_ACCOUNTS_ID
@@ -364,6 +373,9 @@ public class AccountManagerService
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
try {
if (account == null) {
return false;
}
boolean noBroadcast = false;
if (account.type.equals(GOOGLE_ACCOUNT_TYPE)) {
// Look for the 'nobroadcast' flag and remove it since we don't want it to persist
@@ -417,6 +429,14 @@ public class AccountManagerService
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
try {
if (account == null) {
try {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS, "null account");
} catch (RemoteException e) {
// it doesn't matter if we are unable to deliver this error
}
return;
}
new RemoveAccountSession(response, account).bind();
} finally {
restoreCallingIdentity(identityToken);
@@ -513,6 +533,9 @@ public class AccountManagerService
}
private boolean saveAuthTokenToDatabase(Account account, String type, String authToken) {
if (account == null || type == null) {
return false;
}
cancelNotification(getSigninRequiredNotificationId(account));
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
@@ -539,6 +562,9 @@ public class AccountManagerService
}
public String readAuthTokenFromDatabase(Account account, String authTokenType) {
if (account == null || authTokenType == null) {
return null;
}
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor cursor = db.query(TABLE_AUTHTOKENS, new String[]{AUTHTOKENS_AUTHTOKEN},
AUTHTOKENS_ACCOUNTS_ID + "=(select _id FROM accounts WHERE name=? AND type=?) AND "
@@ -586,6 +612,9 @@ public class AccountManagerService
}
private void setPasswordInDB(Account account, String password) {
if (account == null) {
return;
}
ContentValues values = new ContentValues();
values.put(ACCOUNTS_PASSWORD, password);
mOpenHelper.getWritableDatabase().update(TABLE_ACCOUNTS, values,
@@ -608,23 +637,12 @@ public class AccountManagerService
}
}
private void sendResult(IAccountManagerResponse response, Bundle bundle) {
if (response != null) {
try {
response.onResult(bundle);
} catch (RemoteException e) {
// if the caller is dead then there is no one to care about remote
// exceptions
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "failure while notifying response", e);
}
}
}
}
public void setUserData(Account account, String key, String value) {
checkAuthenticateAccountsPermission(account);
long identityToken = clearCallingIdentity();
if (account == null) {
return;
}
if (account.type.equals(GOOGLE_ACCOUNT_TYPE) && key.equals("broadcast")) {
sendAccountsChangedBroadcast();
return;
@@ -637,6 +655,9 @@ public class AccountManagerService
}
private void writeUserdataIntoDatabase(Account account, String key, String value) {
if (account == null || key == null) {
return;
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
try {
@@ -685,6 +706,22 @@ public class AccountManagerService
long identityToken = clearCallingIdentity();
try {
try {
if (account == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"account is null");
return;
}
if (authTokenType == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"authTokenType is null");
return;
}
} catch (RemoteException e) {
// it doesn't matter if we can't deliver this error
return;
}
// if the caller has permission, do the peek. otherwise go the more expensive
// route of starting a Session
if (permissionGranted) {
@@ -850,6 +887,16 @@ public class AccountManagerService
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
try {
try {
if (authTokenType == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"authTokenType is null");
return;
}
} catch (RemoteException e) {
// it doesn't matter if we can't deliver this error
return;
}
new Session(response, accountType, expectActivityLaunch) {
public void run() throws RemoteException {
mAuthenticator.addAccount(this, mAccountType, authTokenType, requiredFeatures,
@@ -875,6 +922,16 @@ public class AccountManagerService
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
try {
try {
if (account == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"account is null");
return;
}
} catch (RemoteException e) {
// it doesn't matter if we can't deliver this error
return;
}
new Session(response, account.type, expectActivityLaunch) {
public void run() throws RemoteException {
mAuthenticator.confirmCredentials(this, account, options);
@@ -895,6 +952,16 @@ public class AccountManagerService
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
try {
try {
if (account == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"account is null");
return;
}
} catch (RemoteException e) {
// it doesn't matter if we can't deliver this error
return;
}
new Session(response, account.type, expectActivityLaunch) {
public void run() throws RemoteException {
mAuthenticator.updateCredentials(this, account, authTokenType, loginOptions);
@@ -917,6 +984,16 @@ public class AccountManagerService
checkManageAccountsPermission();
long identityToken = clearCallingIdentity();
try {
try {
if (accountType == null) {
response.onError(AccountManager.ERROR_CODE_BAD_ARGUMENTS,
"accountType is null");
return;
}
} catch (RemoteException e) {
// it doesn't matter if we can't deliver this error
return;
}
new Session(response, accountType, expectActivityLaunch) {
public void run() throws RemoteException {
mAuthenticator.editProperties(this, mAccountType);
@@ -1565,8 +1642,10 @@ public class AccountManagerService
}
private boolean permissionIsGranted(Account account, String authTokenType, int callerUid) {
final boolean fromAuthenticator = hasAuthenticatorUid(account.type, callerUid);
final boolean hasExplicitGrants = hasExplicitlyGrantedPermission(account, authTokenType);
final boolean fromAuthenticator = account != null
&& hasAuthenticatorUid(account.type, callerUid);
final boolean hasExplicitGrants = account != null
&& hasExplicitlyGrantedPermission(account, authTokenType);
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "checkGrantsOrCallingUidAgainstAuthenticator: caller uid "
+ callerUid + ", account " + account
@@ -1610,7 +1689,7 @@ public class AccountManagerService
private void checkCallingUidAgainstAuthenticator(Account account) {
final int uid = Binder.getCallingUid();
if (!hasAuthenticatorUid(account.type, uid)) {
if (account == null || !hasAuthenticatorUid(account.type, uid)) {
String msg = "caller uid " + uid + " is different than the authenticator's uid";
Log.w(TAG, msg);
throw new SecurityException(msg);
@@ -1641,6 +1720,9 @@ public class AccountManagerService
* @hide
*/
public void grantAppPermission(Account account, String authTokenType, int uid) {
if (account == null || authTokenType == null) {
return;
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
try {
@@ -1668,6 +1750,9 @@ public class AccountManagerService
* @hide
*/
public void revokeAppPermission(Account account, String authTokenType, int uid) {
if (account == null || authTokenType == null) {
return;
}
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.beginTransaction();
try {

View File

@@ -2294,8 +2294,8 @@ class SyncManager implements OnAccountsUpdateListener {
}
if (!mSyncStorageEngine.deleteFromPending(operationToRemove.pendingOperation)) {
throw new IllegalStateException("unable to find pending row for "
+ operationToRemove);
final String errorMessage = "unable to find pending row for " + operationToRemove;
Log.e(TAG, errorMessage, new IllegalStateException(errorMessage));
}
if (DEBUG_CHECK_DATA_CONSISTENCY) debugCheckDataStructures(true /* check the DB */);
@@ -2314,7 +2314,8 @@ class SyncManager implements OnAccountsUpdateListener {
}
if (!mSyncStorageEngine.deleteFromPending(operation.pendingOperation)) {
throw new IllegalStateException("unable to find pending row for " + operation);
final String errorMessage = "unable to find pending row for " + operation;
Log.e(TAG, errorMessage, new IllegalStateException(errorMessage));
}
if (DEBUG_CHECK_DATA_CONSISTENCY) debugCheckDataStructures(true /* check the DB */);
@@ -2336,8 +2337,8 @@ class SyncManager implements OnAccountsUpdateListener {
}
if (!mSyncStorageEngine.deleteFromPending(syncOperation.pendingOperation)) {
throw new IllegalStateException("unable to find pending row for "
+ syncOperation);
final String errorMessage = "unable to find pending row for " + syncOperation;
Log.e(TAG, errorMessage, new IllegalStateException(errorMessage));
}
if (DEBUG_CHECK_DATA_CONSISTENCY) debugCheckDataStructures(true /* check the DB */);

View File

@@ -111,7 +111,7 @@
<string name="httpErrorFile" msgid="8250549644091165175">"Kunne ikke åpne filen."</string>
<string name="httpErrorFileNotFound" msgid="5588380756326017105">"Fant ikke den forespurte filen."</string>
<string name="httpErrorTooManyRequests" msgid="1235396927087188253">"For mange forespørsler blir behandlet. Prøv igjen senere."</string>
<string name="notification_title" msgid="1259940370369187045">"loggingsfeil for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="notification_title" msgid="1259940370369187045">"Innloggingsfeil for <xliff:g id="ACCOUNT">%1$s</xliff:g>"</string>
<string name="contentServiceSync" msgid="8353523060269335667">"Synkronisering"</string>
<string name="contentServiceSyncNotificationTitle" msgid="397743349191901458">"Synkronisering"</string>
<string name="contentServiceTooManyDeletesNotificationDesc" msgid="8100981435080696431">"For mange slettinger av <xliff:g id="CONTENT_TYPE">%s</xliff:g>."</string>
@@ -147,8 +147,8 @@
<string name="permgroupdesc_location" msgid="2430258821648348660">"Overvåking av telefonens fysiske plassering"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Nettverkstilgang"</string>
<string name="permgroupdesc_network" msgid="5035763698958415998">"Gir applikasjoner tilgang til diverse nettverksfunksjoner."</string>
<string name="permgrouplab_accounts" msgid="3359646291125325519">"Dine kontoer"</string>
<string name="permgroupdesc_accounts" msgid="4948732641827091312">"Gi tilgang til de tilgjengelige kontoene."</string>
<string name="permgrouplab_accounts" msgid="3359646291125325519">"Google-kontoer"</string>
<string name="permgroupdesc_accounts" msgid="4948732641827091312">"Tilgang til tilgjengelige Google-kontoer."</string>
<string name="permgrouplab_hardwareControls" msgid="7998214968791599326">"Maskinvarekontroll"</string>
<string name="permgroupdesc_hardwareControls" msgid="4357057861225462702">"Direkte tilgang til maskinvaren på telefonen."</string>
<string name="permgrouplab_phoneCalls" msgid="9067173988325865923">"Telefonsamtaler"</string>
@@ -195,7 +195,7 @@
<string name="permdesc_shutdown" msgid="7046500838746291775">"Lar applikasjonen sette aktivitetshåndtereren i avslutningstilstand. Slår ikke systemet helt av."</string>
<string name="permlab_stopAppSwitches" msgid="4138608610717425573">"forhindre applikasjonsbytte"</string>
<string name="permdesc_stopAppSwitches" msgid="3857886086919033794">"Lar applikasjonen forhindre brukeren fra å bytte til en annen applikasjon."</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"Blokker popup-vinduer"</string>
<string name="permlab_runSetActivityWatcher" msgid="7811586187574696296">"overvåke og kontrollere all applikasjonsoppstart"</string>
<string name="permdesc_runSetActivityWatcher" msgid="3228701938345388092">"Lar applikasjonen overvåke og kontrollere hvordan systemet starter applikasjoner. Ondsinnede applikasjoner kan ta over systemet helt. Denne rettigheten behøves bare for utvikling, aldri for vanlig bruk av telefonen."</string>
<string name="permlab_broadcastPackageRemoved" msgid="2576333434893532475">"kringkaste melding om fjernet pakke"</string>
<string name="permdesc_broadcastPackageRemoved" msgid="3453286591439891260">"Lar applikasjonen kringkaste en melding om at en applikasjonspakke er blitt fjernet. Ondsinnede applikasjoner kan bruke dette til å drepe vilkårlige andre kjørende applikasjoner."</string>
@@ -210,9 +210,9 @@
<string name="permlab_batteryStats" msgid="7863923071360031652">"endre batteristatistikk"</string>
<string name="permdesc_batteryStats" msgid="5847319823772230560">"Lar applikasjonen endre på innsamlet batteristatistikk. Ikke ment for vanlige applikasjoner."</string>
<string name="permlab_backup" msgid="470013022865453920">"kontrollere backup og gjenoppretting"</string>
<string name="permdesc_backup" msgid="4837493065154256525">"Gir programmet tillatelse til å kontrollere systemets mekanismer for sikkerhetskopiering og·gjenoppretting. Ikke beregnet på vanlige programmer."</string>
<string name="permlab_backup_data" msgid="4057625941707926463">"sikkerhetskopier og gjenopprett programmets data"</string>
<string name="permdesc_backup_data" msgid="8274426305151227766">"Gir programmet tillatelse til å ta del i systemets mekanismer for sikkerhetskopiering og gjenoppretting."</string>
<string name="permdesc_backup" msgid="4837493065154256525">"Lar applikasjonen kontrollere systemets backup- og gjenopprettingsmekanisme. Ikke ment for vanlige applikasjoner."</string>
<string name="permlab_backup_data" msgid="4057625941707926463">"foreta backup og gjenoppretting av applikasjonens data"</string>
<string name="permdesc_backup_data" msgid="8274426305151227766">"Lar applikasjonen delta i systemets backup- og gjenopprettingsmekanisme."</string>
<string name="permlab_internalSystemWindow" msgid="2148563628140193231">"vis uautoriserte vinduer"</string>
<string name="permdesc_internalSystemWindow" msgid="5895082268284998469">"Tillater at det opprettes vinduer ment for bruk av systemets interne brukergrensesnitt. Ikke ment for vanlige applikasjoner."</string>
<string name="permlab_systemAlertWindow" msgid="3372321942941168324">"vise advarsler på systemnivå"</string>
@@ -258,7 +258,7 @@
<string name="permlab_writeSettings" msgid="1365523497395143704">"endre globale systeminnstillinger"</string>
<string name="permdesc_writeSettings" msgid="838789419871034696">"Lar applikasjonen endre systemets innstillingsdata. Ondsinnede applikasjoner kan skade systemets innstillinger."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"endre sikre systeminnstillinger"</string>
<string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Gir programmet tillatelse til å endre systemets data for sikkerhetsinnstilling. Ikke beregnet på vanlige programmer."</string>
<string name="permdesc_writeSecureSettings" msgid="5497873143539034724">"Gir programmet tillatelse til å endre systemets data for sikkerhetsinnstilling. Ikke ment for vanlige programmer."</string>
<string name="permlab_writeGservices" msgid="2149426664226152185">"redigere Google-tjenestekartet"</string>
<string name="permdesc_writeGservices" msgid="6602362746516676175">"Lar applikasjonen redigere Google-tjenestekartet. Ikke ment for bruk av vanlige applikasjoner."</string>
<string name="permlab_receiveBootCompleted" msgid="7776779842866993377">"starte automatisk sammen med systemet"</string>
@@ -315,8 +315,8 @@
<string name="permdesc_callPhone" msgid="3369867353692722456">"Lar applikasjonen ringe telefonnummer uten inngripen fra brukeren. Ondsinnede applikasjoner kan forårsake uventede oppringinger på telefonregningen. Merk at dette ikke gir applikasjonen lov til å ringe nødnummer."</string>
<string name="permlab_callPrivileged" msgid="4198349211108497879">"ringe vilkårlige telefonnummer direkte"</string>
<string name="permdesc_callPrivileged" msgid="244405067160028452">"Lar applikasjonen ringe hvilket som helst telefonnummer, inkludert nødnummer, uten inngripen fra brukeren. Ondsinnede applikasjoner kan forårsake unødvendige og ulovlige samtaler til nødtjenester."</string>
<string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"start CDMA-telefonoppsett direkte"</string>
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Gir programmet tillatelse til å starte klargjøring av CDMA. Skadelige programmer kan starte klargjøring av CDMA uten grunn"</string>
<string name="permlab_performCdmaProvisioning" msgid="5604848095315421425">"begynne CDMA-telefonoppsett direkte"</string>
<string name="permdesc_performCdmaProvisioning" msgid="6457447676108355905">"Lar applikasjonen begynne CDMA-oppsett. Ondsinnede applikasjoner kan bruke dette til å starte CDMA-oppsett uten grunn."</string>
<string name="permlab_locationUpdates" msgid="7785408253364335740">"kontrollere varsling for plasseringsendring"</string>
<string name="permdesc_locationUpdates" msgid="2300018303720930256">"Lar applikasjonen slå av/på varsling om plasseringsendringer fra radioen. Ikke ment for vanlige applikasjoner."</string>
<string name="permlab_checkinProperties" msgid="7855259461268734914">"få tilgang til egenskaper for innsjekking"</string>
@@ -432,56 +432,56 @@
<item msgid="2506857312718630823">"ICQ"</item>
<item msgid="1648797903785279353">"Jabber"</item>
</string-array>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Tilpasset"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"Privat"</string>
<string name="phoneTypeCustom" msgid="1644738059053355820">"Egendefinert"</string>
<string name="phoneTypeHome" msgid="2570923463033985887">"Hjemme"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Arbeid"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Send faks (arbeid)"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"Send faks (privat)"</string>
<string name="phoneTypeFaxWork" msgid="3517792160008890912">"Faks arbeid"</string>
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faks hjemme"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Personsøker"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Annen"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Tilbakeringing"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Tilbakering"</string>
<string name="phoneTypeCar" msgid="8738360689616716982">"Bil"</string>
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Firma (sentralbord)"</string>
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Firma hoved"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Hoved"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Annen faks"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Faks annen"</string>
<string name="phoneTypeRadio" msgid="4093738079908667513">"Radio"</string>
<string name="phoneTypeTelex" msgid="3367879952476250512">"Teleks"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"TTY/TDD"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Mobil (arbeid)"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøker (arbeid)"</string>
<string name="phoneTypeTtyTdd" msgid="8606514378585000044">"Teksttelefon"</string>
<string name="phoneTypeWorkMobile" msgid="1311426989184065709">"Mobil arbeid"</string>
<string name="phoneTypeWorkPager" msgid="649938731231157056">"Personsøker arbeid"</string>
<string name="phoneTypeAssistant" msgid="5596772636128562884">"Assistent"</string>
<string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Fødselsdag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Merkedag"</string>
<string name="eventTypeOther" msgid="5834288791948564594">"Aktivitet"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Tilpasset"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Privat"</string>
<string name="eventTypeBirthday" msgid="2813379844211390740">"Bursdag"</string>
<string name="eventTypeAnniversary" msgid="3876779744518284000">"Jubileum"</string>
<string name="eventTypeOther" msgid="5834288791948564594">"Akivitet"</string>
<string name="emailTypeCustom" msgid="8525960257804213846">"Egendefinert"</string>
<string name="emailTypeHome" msgid="449227236140433919">"Hjemme"</string>
<string name="emailTypeWork" msgid="3548058059601149973">"Arbeid"</string>
<string name="emailTypeOther" msgid="2923008695272639549">"Annen"</string>
<string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Tilpasset"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Privat"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Egendefinert"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Hjemme"</string>
<string name="postalTypeWork" msgid="5268172772387694495">"Arbeid"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Annen"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Tilpasset"</string>
<string name="imTypeHome" msgid="6241181032954263892">"Privat"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Egendefinert"</string>
<string name="imTypeHome" msgid="6241181032954263892">"Hjemme"</string>
<string name="imTypeWork" msgid="1371489290242433090">"Arbeid"</string>
<string name="imTypeOther" msgid="5377007495735915478">"Annen"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Tilpasset"</string>
<string name="imProtocolCustom" msgid="6919453836618749992">"Egendefinert"</string>
<string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string>
<string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string>
<string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string>
<string name="imProtocolSkype" msgid="9019296744622832951">"Skype"</string>
<string name="imProtocolQq" msgid="8887484379494111884">"QQ"</string>
<string name="imProtocolQq" msgid="8887484379494111884">"OQ"</string>
<string name="imProtocolGoogleTalk" msgid="3808393979157698766">"Google Talk"</string>
<string name="imProtocolIcq" msgid="1574870433606517315">"ICQ"</string>
<string name="imProtocolJabber" msgid="2279917630875771722">"Jabber"</string>
<string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string>
<string name="orgTypeWork" msgid="29268870505363872">"Arbeid"</string>
<string name="orgTypeOther" msgid="3951781131570124082">"Annen"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Tilpasset"</string>
<string name="orgTypeCustom" msgid="225523415372088322">"Egendefinert"</string>
<string name="contact_status_update_attribution" msgid="5112589886094402795">"via <xliff:g id="SOURCE">%1$s</xliff:g>"</string>
<string name="contact_status_update_attribution_with_date" msgid="5945386376369979909">"<xliff:g id="DATE">%1$s</xliff:g> via <xliff:g id="SOURCE">%2$s</xliff:g>"</string>
<string name="keyguard_password_enter_pin_code" msgid="3731488827218876115">"Skriv inn PIN-kode:"</string>
@@ -530,17 +530,17 @@
<string name="battery_status_charging" msgid="756617993998772213">"Lader…"</string>
<string name="battery_low_title" msgid="7923774589611311406">"Koble til en lader"</string>
<string name="battery_low_subtitle" msgid="7388781709819722764">"Batteriet er nesten tomt:"</string>
<string name="battery_low_percent_format" msgid="696154104579022959">"<xliff:g id="NUMBER">%d%%</xliff:g> eller mindre gjenstår."</string>
<string name="battery_low_percent_format" msgid="696154104579022959">"mindre enn <xliff:g id="NUMBER">%d%%</xliff:g> igjen."</string>
<string name="battery_low_why" msgid="7279169609518386372">"Batteribruk"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"Factory test failed"</string>
<string name="factorytest_failed" msgid="5410270329114212041">"Fabrikktesten feilet"</string>
<string name="factorytest_not_system" msgid="4435201656767276723">"The FACTORY_TEST action is only supported for packages installed in /system/app."</string>
<string name="factorytest_no_action" msgid="872991874799998561">"No package was found that provides the FACTORY_TEST action."</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Reboot"</string>
<string name="factorytest_reboot" msgid="6320168203050791643">"Omstart"</string>
<string name="js_dialog_title" msgid="8143918455087008109">"Siden \'<xliff:g id="TITLE">%s</xliff:g> sier:"</string>
<string name="js_dialog_title_default" msgid="6961903213729667573">"JavaScript"</string>
<string name="js_dialog_before_unload" msgid="1901675448179653089">"Naviger bort fra denne siden?"\n\n"<xliff:g id="MESSAGE">%s</xliff:g>"\n\n"Velg OK for å fortsette, eller Avbryt for å forbli på denne siden."</string>
<string name="save_password_label" msgid="6860261758665825069">"Bekreft"</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Tips: trykk to ganger for å zoome inn og ut."</string>
<string name="double_tap_toast" msgid="1068216937244567247">"Dobbelttrykk for å zoome inn og ut."</string>
<string name="permlab_readHistoryBookmarks" msgid="1284843728203412135">"lese nettleserens logg og bokmerker"</string>
<string name="permdesc_readHistoryBookmarks" msgid="4981489815467617191">"Lar applikasjonen lese alle adresser nettleseren har besøkt, og alle nettleserens bokmerker."</string>
<string name="permlab_writeHistoryBookmarks" msgid="9009434109836280374">"skrive til nettleserens logg og bokmerker"</string>
@@ -623,7 +623,7 @@
<item quantity="one" msgid="2178576254385739855">"i morgen"</item>
<item quantity="other" msgid="2973062968038355991">"om <xliff:g id="COUNT">%d</xliff:g> d"</item>
</plurals>
<string name="preposition_for_date" msgid="9093949757757445117">"den <xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_date" msgid="9093949757757445117">"<xliff:g id="DATE">%s</xliff:g>"</string>
<string name="preposition_for_time" msgid="5506831244263083793">"kl. <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="preposition_for_year" msgid="5040395640711867177">"i <xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"dag"</string>
@@ -675,24 +675,24 @@
<string name="dialog_alert_title" msgid="2049658708609043103">"Merk"</string>
<string name="capital_on" msgid="1544682755514494298">"På"</string>
<string name="capital_off" msgid="6815870386972805832">"Av"</string>
<string name="whichApplication" msgid="4533185947064773386">"Complete action using"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Use by default for this action."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Clear default in Home Settings &gt; Applications &gt; Manage applications."</string>
<string name="chooseActivity" msgid="1009246475582238425">"Select an action"</string>
<string name="noApplications" msgid="1691104391758345586">"No applications can perform this action."</string>
<string name="aerr_title" msgid="653922989522758100">"Sorry!"</string>
<string name="aerr_application" msgid="4683614104336409186">"The application <xliff:g id="APPLICATION">%1$s</xliff:g> (process <xliff:g id="PROCESS">%2$s</xliff:g>) has stopped unexpectedly. Please try again."</string>
<string name="aerr_process" msgid="1551785535966089511">"The process <xliff:g id="PROCESS">%1$s</xliff:g> has stopped unexpectedly. Please try again."</string>
<string name="anr_title" msgid="3100070910664756057">"Sorry!"</string>
<string name="anr_activity_application" msgid="3538242413112507636">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> (in application <xliff:g id="APPLICATION">%2$s</xliff:g>) is not responding."</string>
<string name="anr_activity_process" msgid="5420826626009561014">"Activity <xliff:g id="ACTIVITY">%1$s</xliff:g> (in process <xliff:g id="PROCESS">%2$s</xliff:g>) is not responding."</string>
<string name="anr_application_process" msgid="4185842666452210193">"Application <xliff:g id="APPLICATION">%1$s</xliff:g> (in process <xliff:g id="PROCESS">%2$s</xliff:g>) is not responding."</string>
<string name="anr_process" msgid="1246866008169975783">"Process <xliff:g id="PROCESS">%1$s</xliff:g> is not responding."</string>
<string name="force_close" msgid="3653416315450806396">"Force close"</string>
<string name="whichApplication" msgid="4533185947064773386">"Fullfør med"</string>
<string name="alwaysUse" msgid="4583018368000610438">"Bruk som standardvalg."</string>
<string name="clearDefaultHintMsg" msgid="4815455344600932173">"Fjern standardvalg i Innstillinger &gt; Applikasjoner &gt; Installerte applikasjoner."</string>
<string name="chooseActivity" msgid="1009246475582238425">"Velg en aktivitet"</string>
<string name="noApplications" msgid="1691104391758345586">"Ingen applikasjoner kan gjøre dette."</string>
<string name="aerr_title" msgid="653922989522758100">"Beklager!"</string>
<string name="aerr_application" msgid="4683614104336409186">"Applikasjonen <xliff:g id="APPLICATION">%1$s</xliff:g> (prosess <xliff:g id="PROCESS">%2$s</xliff:g>) stoppet uventet. Prøv igjen."</string>
<string name="aerr_process" msgid="1551785535966089511">"Prosessen <xliff:g id="PROCESS">%1$s</xliff:g> stoppet uventet. Prøv igjen."</string>
<string name="anr_title" msgid="3100070910664756057">"Beklager!"</string>
<string name="anr_activity_application" msgid="3538242413112507636">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> (i applikasjonen <xliff:g id="APPLICATION">%2$s</xliff:g>) svarer ikke."</string>
<string name="anr_activity_process" msgid="5420826626009561014">"Aktiviteten <xliff:g id="ACTIVITY">%1$s</xliff:g> (i prosessen <xliff:g id="PROCESS">%2$s</xliff:g>) svarer ikke."</string>
<string name="anr_application_process" msgid="4185842666452210193">"Applikasjonen <xliff:g id="APPLICATION">%1$s</xliff:g> (i prosessen <xliff:g id="PROCESS">%2$s</xliff:g>) svarer ikke."</string>
<string name="anr_process" msgid="1246866008169975783">"Prosessen <xliff:g id="PROCESS">%1$s</xliff:g> svarer ikke."</string>
<string name="force_close" msgid="3653416315450806396">"Tving avslutning"</string>
<string name="report" msgid="4060218260984795706">"Rapportér"</string>
<string name="wait" msgid="7147118217226317732">"Wait"</string>
<string name="wait" msgid="7147118217226317732">"Vent"</string>
<string name="debug" msgid="9103374629678531849">"Debug"</string>
<string name="sendText" msgid="5132506121645618310">"Select an action for text"</string>
<string name="sendText" msgid="5132506121645618310">"Velg mål for tekst"</string>
<string name="volume_ringtone" msgid="6885421406845734650">"Ringetonevolum"</string>
<string name="volume_music" msgid="5421651157138628171">"Medievolum"</string>
<string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Spiller over Bluetooth"</string>
@@ -740,12 +740,12 @@
<string name="usb_storage_stop_message" msgid="2390958966725232848">"Før du slår av USB-lagring, sjekk at du har avmontert enheten i USB-verten. Velg «slå av» for å slå av USB-lagring."</string>
<string name="usb_storage_stop_button_mount" msgid="1181858854166273345">"Slå av"</string>
<string name="usb_storage_stop_button_unmount" msgid="3774611918660582898">"Avbryt"</string>
<string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Det har oppstått et problem ved deaktiveringen av USB-lagring. Kontroller at du har frakoblet USB-verten, og prøv igjen."</string>
<string name="usb_storage_stop_error_message" msgid="3746037090369246731">"Det har oppstått et problem ved deaktiveringen av USB-lagring. Kontroller at du har demontert USB-verten, og prøv igjen."</string>
<string name="extmedia_format_title" msgid="8663247929551095854">"Formatere minnekort"</string>
<string name="extmedia_format_message" msgid="3621369962433523619">"Er du sikker på at du ønsker å formatere minnekortet? Alle data på kortet vil gå tapt."</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatér"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-debugging tilkoblet"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Velg for å deaktivere USB-feilsøking"</string>
<string name="adb_active_notification_message" msgid="8470296818270110396">"Velg for å deaktivere USB-debugging."</string>
<string name="select_input_method" msgid="6865512749462072765">"Velg inndatametode"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
@@ -777,19 +777,19 @@
<string name="create_contact_using" msgid="4947405226788104538">"Lag kontakt"\n"med nummeret <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="accessibility_compound_button_selected" msgid="5612776946036285686">"valgt"</string>
<string name="accessibility_compound_button_unselected" msgid="8864512895673924091">"ikke valgt"</string>
<string name="grant_credentials_permission_message_desc" msgid="6883276587034335667">"De·oppførte·programmene ber om tilgangstillatelse til påloggingsopplysningene for konto <xliff:g id="ACCOUNT">%1$s</xliff:g> fra <xliff:g id="APPLICATION">%2$s</xliff:g>. Vil du gi denne tillatelsen? I··fall·lagres·svaret,·og·du·blir·ikke·spurt·flere·ganger."</string>
<string name="grant_credentials_permission_message_with_authtokenlabel_desc" msgid="3159007601893584687">"De·oppførte·programmene ber om tilgangstillatelse til <xliff:g id="TYPE">%1$s</xliff:g>-påloggingsopplysningene for konto <xliff:g id="ACCOUNT">%2$s</xliff:g> fra <xliff:g id="APPLICATION">%3$s</xliff:g>. Vil du gi denne tillatelsen? I··fall·lagres·svaret,·og·du·blir·ikke·spurt·flere·ganger."</string>
<string name="grant_credentials_permission_message_desc" msgid="6883276587034335667">"Det nevnte programmet ber om tilgangstillatelse til påloggingsopplysningene for konto <xliff:g id="ACCOUNT">%1$s</xliff:g> fra <xliff:g id="APPLICATION">%2$s</xliff:g>. Vil du gi denne tillatelsen? I fall vil svaret ditt bli lagret, og du vil ikke bli spurt flere ganger."</string>
<string name="grant_credentials_permission_message_with_authtokenlabel_desc" msgid="3159007601893584687">"Det nevnte programmet ber om tilgangstillatelse til <xliff:g id="TYPE">%1$s</xliff:g>-påloggingsopplysningene for konto <xliff:g id="ACCOUNT">%2$s</xliff:g> fra <xliff:g id="APPLICATION">%3$s</xliff:g>. Vil du gi denne tillatelsen? I fall vil svaret ditt bli lagret, og du vil ikke bli spurt flere ganger."</string>
<string name="allow" msgid="7225948811296386551">"Tillat"</string>
<string name="deny" msgid="2081879885755434506">"Avslå"</string>
<string name="permission_request_notification_title" msgid="5390555465778213840">"Tillatelse forespurt"</string>
<string name="permission_request_notification_with_subtitle" msgid="4325409589686688000">"Tillatelse forespurt"\n"for konto <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
<string name="permission_request_notification_with_subtitle" msgid="4325409589686688000">"Trenger tillatelse"\n"for konto <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"Inndatametode"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"Synkronisering"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"Tilgjengelighet"</string>
<string name="wallpaper_binding_label" msgid="1240087844304687662">"Bakgrunnsbilde"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Endre bakgrunnsbilde"</string>
<string name="pptp_vpn_description" msgid="2688045385181439401">"PPTP·(point-to-point·tunneling·protocol)"</string>
<string name="l2tp_vpn_description" msgid="3750692169378923304">"Tunnelprotokoll for lag 2"</string>
<string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Forhåndsdelt nøkkelbasert L2TP/IPSec VPN"</string>
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikatbasert L2TP/IPSec VPN"</string>
<string name="chooser_wallpaper" msgid="7873476199295190279">"Velg bakgrunnsbilde"</string>
<string name="pptp_vpn_description" msgid="2688045385181439401">"Punkt-til-punkt-tunneleringsprotokoll"</string>
<string name="l2tp_vpn_description" msgid="3750692169378923304">"Lag 2-tunneleringsprotokoll"</string>
<string name="l2tp_ipsec_psk_vpn_description" msgid="3945043564008303239">"Passordbasert L2TP/IPSec-VPN"</string>
<string name="l2tp_ipsec_crt_vpn_description" msgid="5382714073103653577">"Sertifikatbasert L2TP/IPSec-VPN"</string>
</resources>

View File

@@ -444,7 +444,7 @@
<string name="phoneTypeOther" msgid="1544425847868765990">"Overig"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Terugbelnummer"</string>
<string name="phoneTypeCar" msgid="8738360689616716982">"Auto"</string>
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Hoofdkantoor"</string>
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Bedrijf, algemeen"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
<string name="phoneTypeMain" msgid="6766137010628326916">"Algemeen"</string>
<string name="phoneTypeOtherFax" msgid="8587657145072446565">"Andere fax"</string>

View File

@@ -324,22 +324,24 @@ control to show documentation only for parts of the API that are actually
accessible to your application, based on the API Level that it specifies in
the <code>android:minSdkVersion</code> attribute of its manifest file. </p>
<p>To use filtering, set the control to the same API Level as that specified
by your application. Notice that APIs introduced in a later API Level are
then grayed out and their content is masked, since they would not be
accessible to your application. </p>
<p>To use filtering, select the checkbox to enable filtering, just below the
page search box. Then set the "Filter by API Level" control to the same API
Level as specified by your application. Notice that APIs introduced in a later
API Level are then grayed out and their content is masked, since they would not
be accessible to your application. </p>
<p>Filtering by API Level in the documentation does not provide a view
of what is new or introduced in each API Level &mdash; it simply provides a way
to view the entire API associated with a given API Level, while excluding API
elements introduced in later API Levels.</p>
<p>By default, API Level filtering is enabled and set to show the latest API
Level. If you do not want to use filtering reference documentation,
simply select the highest available API Level. </p>
<p>If you decide that you don't want to filter the API documentation, just
disable the feature using the checkbox. By default, API Level filtering is
disabled, so that you can view the full framework API, regardless of API Level.
</p>
<p>Also note that the reference documentation for individual API elements
specifies the API Level at which the elements were introduced. The API Level
specifies the API Level at which each element was introduced. The API Level
for packages and classes is specified as "Since &lt;api level&gt;" at the
top-right corner of the content area on each documentation page. The API Level
for class members is specified in their detailed description headers,

View File

@@ -1069,28 +1069,29 @@ not. Once you've tested your application and found that it displays properly on
various screen sizes, you should make sure to add the corresponding size
attribute(s) to your application's manifest. -->
<div id="f9.5" style="float:right;margin:0;padding:0;">
<img src="{@docRoot}images/screens_support/avds-config.png" style="padding:0;margin:0;">
<p class="caption" style="margin:0 0 1.5em 1em;padding:0 0 0 1em;"><strong>Figure 3.</strong>
A typical set of AVDs for testing screens support.</p>
</div>
<p>As a test environment for your applications, set up a series of AVDs that
emulate the screen sizes and densities you want to support. The Android SDK
includes four emulator skins to get you started. You can use the Android AVD
includes six emulator skins to get you started. You can use the Android AVD
Manager or the <code>android</code> tool to create AVDs that use the various
emulator skins and you can also set up custom AVDs to test densities other than
the defaults. For general information about working with AVDs, see
<a href="{@docRoot}guide/developing/tools/avd.html">Android Virtual
Devices</a>.</p>
<p>The Android 1.6 and higher platforms in the SDK include these emulator skins,
which represent the primary screen configurations that your should test:</p>
<p>The Android SDK provides a set of default emulator skins that you can use for
testing. The skins are included as part of each Android platform that you can
install in your SDK. The Android 1.6 platform offers these default skins:</p>
<ul>
<li>
QVGA (240x320, low density, small screen)
</li>
<li>
WQVGA400 (240x400, low density, normal screen)
</li>
<li>
WQVGA432 (240x432, low density, normal screen)
</li>
<li>
HVGA (320x480, medium density, normal screen)
</li>
@@ -1102,6 +1103,18 @@ which represent the primary screen configurations that your should test:</p>
</li>
</ul>
<p>The Android 2.0 platform offers all of the Android 1.6 default skins,
above, plus:</p>
<ul>
<li>
WQVGA400 (240x400, low density, normal screen)
</li>
<li>
WQVGA432 (240x432, low density, normal screen)
</li>
</ul>
<p>If you are using the <code>android</code> tool command line to create your
AVDs, here's an example of how to specify the skin you want to use:</p>
@@ -1130,6 +1143,12 @@ monitor. Using the default densities, the emulator skins included in the Android
<li>
QVGA, low density: 3.3"
</li>
<li>
WQVGA, low density: 3.9"
</li>
<li>
WQVGA432, low density: 4.1"
</li>
<li>
HVGA, medium density: 3.6"
</li>
@@ -1141,6 +1160,12 @@ monitor. Using the default densities, the emulator skins included in the Android
</li>
</ul>
<div style="float: right;background-color:#fff;margin: 0;padding: 20px 0 20px 20px;width:520px;">
<img src="{@docRoot}images/screens_support/avd-density.png" style="padding:0;margin:0;">
<p class="caption" style="margin:0 0 1.5em 1em;padding:0 0 0 1em; width:280px;"><strong>Figure 4.</strong>
Resolution and density options that you can use, when creating an AVD using the AVD Manager.</p>
</div>
<p>You should also make sure to test your application on different physical
screen sizes within a single size-density configuration. For example, according
to <a href="#range">Table 1</a>, the minimum supported diagonal of QVGA is 2.8".
@@ -1150,21 +1175,35 @@ To display this is on a 30" monitor you will need to adjust the value passed to
<pre>emulator -avd &lt;name&gt; -scale 0.6</pre>
<p>If you would like to test your application on a screen not supported by the
built-in skins, you can either adjust an existing skin, or create a custom
resolution.</p>
<p>If you would like to test your application on a screen that uses a resolution
or density not supported by the built-in skins, you can either adjust an
existing skin, or create an AVD
that uses a custom resolution or density.</p>
<p>For example, to test on a large WVGA800 screen with medium density:</p>
<p>In the AVD Manager, you can specify a custom skin resolution or density in
the Create New AVD dialog, as shown in Figure 4, at right.</p>
<p>In the <code>android</code> tool, follow these steps to create an AVD with a
custom resolution or density:</p>
<ol>
<li>Create an AVD based on the WVGA800 skin (using the <code>android</code>
tool's command line.)<br></li>
<li>Answer "yes" when asked about using custom hardware</li>
<li>enter "160" when asked about the value for <em>hw.lcd.density</em>
(120-low, 160-medium, 240-high).</li>
<li>Use the <code>create avd</code> command to create a new AVD, specifying
the <code>--skin</code> option with a value that references either a default
skin name (such as "WVGA800") or a custom skin resolution (such as 240x432).
Here's an example:
<pre>android create avd -n &lt;name&gt; -t &lt;targetID&gt; --skin WVGA800</pre>
</li>
<li>To specify a custom density for the skin, answer "yes" when asked whether
you want to create a custom hardware profile for the new AVD.</li>
<li>Continue through the various profile settings until the tool asks you to
specify "Abstracted LCD density" (<em>hw.lcd.density</em>). Consult <a
href="#range">Table 1</a>, earlier in this document, and enter the appropriate
value. For example, enter "160" to use medium density for the WVGA800 screen.</li>
<li>Set any other hardware options and complete the AVD creation.</li>
</ol>
<p>When running this AVD, the emulator will emulate a 5.8" WVGA screen.</p>
<p>In the example above (WVGA medium density), the new AVD will emulate a 5.8"
WVGA screen.</p>
<p>As an alternative to adjusting the emulator skin configuration, you can use
the emulator skin's default density and add the <code>-dpi-device</code> option
@@ -1172,25 +1211,6 @@ to the emulator command line when starting the AVD. For example, </p>
<pre>emulator -avd WVGA800 -scale 96dpi -dpi-device 160</pre>
<p>If you would like to test your application with a resolution not supported by
the provided skins, you can use the desired resolution in place of the skin
name. For instance, for FWQVGA you would use:</p>
<pre>android create avd ... --skin 240x432</pre>
<p>Next, you would need to set the proper density for the screen. When asked by
the tool whether you want to create a custom hardware profile for the new AVD,
enter "yes". Continue through the various profile settings until the tools asks
you to specify "Abstracted LCD density". Consult <a href="#range">Table 1</a>,
earlier in this document, and enter the appropriate value. For the FWQVGA
screen, the density should be "160", or medium.</p>
<div id="f9.5" style="text-align:left;margin:0;padding:0;">
<img src="{@docRoot}images/screens_support/avds-config.png" style="padding:0;margin:0;">
<p class="caption" style="margin:0 0 1.5em 1em;padding:0 0 0 1em;"><strong>Figure 3.</strong>
A typical set of AVDs for testing screens support.</p>
</div>
<h2 id="compatibility-examples">Screen-Compatibility Examples</h2>

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -16,7 +16,6 @@ sdk.platform.deployableDate=May 2009
<li><a href="#apps">Built-in Applications</a></li>
<li><a href="#locs">Locales</a></li>
<li><a href="#skins">Emulator Skins</a></li>
<li><a href="#notes">Other Notes</a></li>
<li><a href="#api">Framework API</a>
<ol>
<li><a href="#api-level">API level</a></li>

View File

@@ -16,7 +16,6 @@ sdk.platform.deployableDate=October 2009
<li><a href="#apps">Built-in Applications</a></li>
<li><a href="#locs">Locales</a></li>
<li><a href="#skins">Emulator Skins</a></li>
<li><a href="#notes">Other Notes</a></li>
<li><a href="#api">Framework API</a>
<ol>
<li><a href="#api-level">API level</a></li>

View File

@@ -26,12 +26,12 @@ body{overflow:auto;}
body{background-image:url();padding:12px;}
</style>
</head>
<FRAMESET COLS="242,**" frameborder="1" border="7" bordercolor="#e9e9e9">
<frameset rows="164,**" frameborder="1" border="7" resizable="yes">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe">
<FRAMESET COLS="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe" frameborder="1">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe" frameborder="1">
</FRAMESET>
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe">
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe" frameborder="1">
</FRAMESET>
<NOFRAMES>
<H2>

View File

@@ -3,6 +3,7 @@
div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}
table.diffspectable {border:1px;padding:0px;margin:0px;}
table.jdiffIndex {margin-bottom:.5em;}
.diffspechead {background-color:#eee;}
.diffspectable tr {border:0px;padding:0px;}
.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}
@@ -29,7 +30,7 @@ tt {font-size:11pt;font-family:monospace;}
}
.hiddenlink {
font-size:96%;
line-height:.8em;
/* line-height:.8em; */
text-decoration:none;}
a {
text-decoration:none;}

View File

@@ -25,12 +25,12 @@ body{overflow:auto;}
<style type="text/css">
</style>
</HEAD>
<FRAMESET COLS="242,**" frameborder="1" border="7" xframespacing="20" bordercolor="#e9e9e9">
<frameset rows="164,**" frameborder="1" border="7" xframespacing="20" resizable="yes">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe" xframeborder="1" xborder="6" xframespacing="0">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe" xframeborder="1" xborder="1" xframespacing="0">
<FRAMESET COLS="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe" frameborder="1">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe" frameborder="1">
</FRAMESET>
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe" xframeborder="1" xborder="1" xframespacing="0">
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe" frameborder="1">
</FRAMESET>
<NOFRAMES>
<H2>

View File

@@ -3,6 +3,7 @@
div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}
table.diffspectable {border:1px;padding:0px;margin:0px;}
table.jdiffIndex {margin-bottom:.5em;}
.diffspechead {background-color:#eee;}
.diffspectable tr {border:0px;padding:0px;}
.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}
@@ -29,7 +30,7 @@ tt {font-size:11pt;font-family:monospace;}
}
.hiddenlink {
font-size:96%;
line-height:.8em;
/* line-height:.8em; */
text-decoration:none;}
a {
text-decoration:none;}

View File

@@ -25,12 +25,12 @@ body{overflow:auto;}
<style type="text/css">
</style>
</HEAD>
<FRAMESET COLS="242,**" frameborder="1" border="7" xframespacing="20" bordercolor="#e9e9e9">
<frameset rows="164,**" frameborder="1" border="7" xframespacing="20" resizable="yes">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe" xframeborder="1" xborder="6" xframespacing="0">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe" xframeborder="1" xborder="1" xframespacing="0">
<FRAMESET COLS="242,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<frameset rows="174,**" framespacing="1" frameborder="yes" border="1" bordercolor="#e9e9e9">
<FRAME SRC="changes/jdiff_topleftframe.html" SCROLLING="no" NAME="topleftframe" frameborder="1">
<FRAME SRC="changes/alldiffs_index_all.html" SCROLLING="auto" NAME="bottomleftframe" frameborder="1">
</FRAMESET>
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe" xframeborder="1" xborder="1" xframespacing="0">
<FRAME SRC="changes/changes-summary.html" SCROLLING="auto" NAME="rightframe" frameborder="1">
</FRAMESET>
<NOFRAMES>
<H2>

View File

@@ -3,6 +3,7 @@
div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}
table.diffspectable {border:1px;padding:0px;margin:0px;}
table.jdiffIndex {margin-bottom:.5em;}
.diffspechead {background-color:#eee;}
.diffspectable tr {border:0px;padding:0px;}
.diffspectable td {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}
@@ -29,7 +30,7 @@ tt {font-size:11pt;font-family:monospace;}
}
.hiddenlink {
font-size:96%;
line-height:.8em;
/* line-height:.8em; */
text-decoration:none;}
a {
text-decoration:none;}

View File

@@ -37,12 +37,10 @@ var playlistsWithTitleInDescription = "734A052F802C96B9";
* Each playlist ID is paired with a custom video description.
*/
var featured = {
// Android 1.6 Release
'MBRFkLKRwFw' : "The Android 1.6 release includes new features and improvements to the Android platform. Here's an introduction to what's new in Android 1.6.",
// Android 2.0 Release
'opZ69P-0Jbc' : "The Android 2.0 platform adds exciting new user features and developer APIs. Here's an introduction to what's new.",
// How to Make your Android UI Fast..
'N6YdwzAvwOA' : "Make your user interface fast, with more efficient AdapterViews, better bitmap scaling, faster redrawing, ViewStub layouts, fewer Views, and more.",
// Coding for Life: Battery Life
// 'OUemfrKe65c' : "Learn what kinds of operations consume the most battery and how you can reduce your usage, with tips for parsing and zipping data, using wakelocks, and running a Service.",
// How Do I Code Thee?
'GARMe7Km_gk' : "If you'd like to augment your Android applications with pieces written in JavaScript or native code, watch this video."
};

View File

@@ -405,7 +405,7 @@ RsAllocation rsi_AllocationCreateFromBitmapBoxed(Context *rsc, uint32_t w, uint3
const uint8_t * src = static_cast<const uint8_t *>(data);
for (uint32_t y = 0; y < h; y++) {
uint8_t * ydst = &tmp[(y + ((h2 - h) >> 1)) * w2 * bpp];
memcpy(&ydst[(w2 - w) >> 1], src, w * bpp);
memcpy(&ydst[((w2 - w) >> 1) * bpp], src, w * bpp);
src += w * bpp;
}

View File

@@ -154,6 +154,8 @@ static bool copybit(GLint x, GLint y,
int transform,
ogles_context_t* c)
{
status_t err = NO_ERROR;
// We assume checkContext has already been called and has already
// returned true.
@@ -200,6 +202,7 @@ static bool copybit(GLint x, GLint y,
const uint32_t enables = c->rasterizer.state.enables;
int planeAlpha = 255;
bool alphaPlaneWorkaround = false;
static const int tmu = 0;
texture_t& tev(c->rasterizer.state.texture[tmu]);
int32_t opFormat = textureObject->surface.format;
@@ -259,9 +262,10 @@ static bool copybit(GLint x, GLint y,
if (c->currentColorClamped.r == c->currentColorClamped.a &&
c->currentColorClamped.g == c->currentColorClamped.a &&
c->currentColorClamped.b == c->currentColorClamped.a) {
// TODO: Need to emulate: RGBA source, color={a,a,a,a} / premult
// and RGBA source, color={1,1,1,a} / regular-blending
// (both are equivalent)
// TODO: RGBA source, color={1,1,1,a} / regular-blending
// is equivalent
alphaPlaneWorkaround = true;
break;
}
}
LOGD_IF(DEBUG_COPYBIT, "GGL_MODULATE");
@@ -331,13 +335,13 @@ static bool copybit(GLint x, GLint y,
tmp_w, tmp_h, src.format,
GraphicBuffer::USAGE_HW_2D);
status_t err = tempBitmap->initCheck();
err = tempBitmap->initCheck();
if (err == NO_ERROR) {
copybit_image_t tmp_dst;
copybit_rect_t tmp_rect;
tmp_dst.w = tmp_w;
tmp_dst.h = tmp_h;
tmp_dst.format = src.format;
tmp_dst.format = tempBitmap->format;
tmp_dst.handle = (native_handle_t*)tempBitmap->getNativeBuffer()->handle;
tmp_rect.l = 0;
tmp_rect.t = 0;
@@ -359,13 +363,66 @@ static bool copybit(GLint x, GLint y,
textureToCopyBitImage(&cbSurface, cbSurface.format, target_hnd, &dst);
copybit_rect_t drect = {x, y, x+w, y+h};
copybit->set_parameter(copybit, COPYBIT_TRANSFORM, transform);
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, planeAlpha);
copybit->set_parameter(copybit, COPYBIT_DITHER,
(enables & GGL_ENABLE_DITHER) ? COPYBIT_ENABLE : COPYBIT_DISABLE);
clipRectRegion it(c);
status_t err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it);
/* and now the alpha-plane hack. This handles the "Fade" case of a
* texture with an alpha channel.
*/
if (alphaPlaneWorkaround) {
sp<GraphicBuffer> tempCb = new GraphicBuffer(
w, h, COPYBIT_FORMAT_RGB_565,
GraphicBuffer::USAGE_HW_2D);
err = tempCb->initCheck();
copybit_image_t tmpCbImg;
copybit_rect_t tmpCbRect;
tmpCbImg.w = w;
tmpCbImg.h = h;
tmpCbImg.format = tempCb->format;
tmpCbImg.handle = (native_handle_t*)tempCb->getNativeBuffer()->handle;
tmpCbRect.l = 0;
tmpCbRect.t = 0;
tmpCbRect.r = w;
tmpCbRect.b = h;
if (!err) {
// first make a copy of the destination buffer
region_iterator tmp_it(Region(Rect(w, h)));
copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF);
copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_DISABLE);
err = copybit->stretch(copybit,
&tmpCbImg, &dst, &tmpCbRect, &drect, &tmp_it);
}
if (!err) {
// then proceed as usual, but without the alpha plane
copybit->set_parameter(copybit, COPYBIT_TRANSFORM, transform);
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, 0xFF);
copybit->set_parameter(copybit, COPYBIT_DITHER,
(enables & GGL_ENABLE_DITHER) ?
COPYBIT_ENABLE : COPYBIT_DISABLE);
clipRectRegion it(c);
err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it);
}
if (!err) {
// finally copy back the destination on top with 1-alphaplane
int invPlaneAlpha = 0xFF - fixedToByte(c->currentColorClamped.a);
clipRectRegion it(c);
copybit->set_parameter(copybit, COPYBIT_TRANSFORM, 0);
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, invPlaneAlpha);
copybit->set_parameter(copybit, COPYBIT_DITHER, COPYBIT_ENABLE);
err = copybit->stretch(copybit,
&dst, &tmpCbImg, &drect, &tmpCbRect, &it);
}
} else {
copybit->set_parameter(copybit, COPYBIT_TRANSFORM, transform);
copybit->set_parameter(copybit, COPYBIT_PLANE_ALPHA, planeAlpha);
copybit->set_parameter(copybit, COPYBIT_DITHER,
(enables & GGL_ENABLE_DITHER) ?
COPYBIT_ENABLE : COPYBIT_DISABLE);
clipRectRegion it(c);
err = copybit->stretch(copybit, &dst, &src, &drect, &srect, &it);
}
if (err != NO_ERROR) {
c->textures.tmu[0].texture->try_copybit = false;
}

View File

@@ -15,6 +15,6 @@
-->
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="5400580392303600842">"Synkroniser·innmatinger"</string>
<string name="app_label" msgid="5400580392303600842">"Strømsynkronisering"</string>
<string name="provider_label" msgid="3669714991966737047">"Push-abonnementer"</string>
</resources>

View File

@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_label" msgid="4589592829302498102">"VPN-tjenester"</string>
<string name="vpn_notification_title_connected" msgid="8598654486956133580">"<xliff:g id="PROFILENAME">%s</xliff:g> er VPN-tilkoblet"</string>
<string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"<xliff:g id="PROFILENAME">%s</xliff:g> er VPN-frakoblet"</string>
<string name="vpn_notification_title_connected" msgid="8598654486956133580">"Koblet til VPNet <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
<string name="vpn_notification_title_disconnected" msgid="6216572264382192027">"Koblet fra VPNet <xliff:g id="PROFILENAME">%s</xliff:g>"</string>
<string name="vpn_notification_hint_disconnected" msgid="1952209867082269429">"Trykk for å koble til et VPN på nytt"</string>
</resources>

View File

@@ -9303,6 +9303,15 @@ public class WindowManagerService extends IWindowManager.Stub
& WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER) != 0) {
wallpaperMayChange = true;
}
if (changed && !forceHiding
&& (mCurrentFocus == null)
&& (mFocusedApp != null)) {
// It's possible that the last focus recalculation left no
// current focused window even though the app has come to the
// foreground already. In this case, we make sure to recalculate
// focus when we show a window.
focusMayChange = true;
}
}
mPolicy.animatingWindowLw(w, attrs);
@@ -9644,7 +9653,8 @@ public class WindowManagerService extends IWindowManager.Stub
WindowState w = (WindowState)mWindows.get(i);
if (w.mSurface != null) {
final WindowManager.LayoutParams attrs = w.mAttrs;
if (mPolicy.doesForceHide(w, attrs)) {
if (mPolicy.doesForceHide(w, attrs) && w.isVisibleLw()) {
if (DEBUG_FOCUS) Log.i(TAG, "win=" + w + " force hides other windows");
forceHiding = true;
} else if (mPolicy.canBeForceHidden(w, attrs)) {
if (!w.mAnimating) {

View File

@@ -2705,13 +2705,31 @@ public final class ActivityManagerService extends ActivityManagerNative implemen
// Have the window manager re-evaluate the orientation of
// the screen based on the new activity order.
Configuration config = mWindowManager.updateOrientationFromAppTokens(
mConfiguration,
next.mayFreezeScreenLocked(next.app) ? next : null);
if (config != null) {
next.frozenBeforeDestroy = true;
boolean updated;
synchronized (this) {
Configuration config = mWindowManager.updateOrientationFromAppTokens(
mConfiguration,
next.mayFreezeScreenLocked(next.app) ? next : null);
if (config != null) {
/*
* Explicitly restore the locale to the one from the
* old configuration, since the one that comes back from
* the window manager has the default (boot) locale.
*
* It looks like previously the locale picker only worked
* by coincidence: usually it would do its setting of
* the locale after the activity transition, so it didn't
* matter that this lost it. With the synchronized
* block now keeping them from happening at the same time,
* this one always would happen second and undo what the
* locale picker had just done.
*/
config.locale = mConfiguration.locale;
next.frozenBeforeDestroy = true;
}
updated = updateConfigurationLocked(config, next);
}
if (!updateConfigurationLocked(config, next)) {
if (!updated) {
// The configuration update wasn't able to keep the existing
// instance of the activity, and instead started a new one.
// We should be all done, but let's just make sure our activity