Merge "Allow default SMS app to get self phone number" into mnc-dev
diff --git a/Android.mk b/Android.mk
index a02b326..e96a932 100644
--- a/Android.mk
+++ b/Android.mk
@@ -142,7 +142,6 @@
core/java/android/content/pm/IPackageManager.aidl \
core/java/android/content/pm/IPackageMoveObserver.aidl \
core/java/android/content/pm/IPackageStatsObserver.aidl \
- core/java/android/content/pm/IPackagesProvider.aidl \
core/java/android/content/pm/IOnPermissionsChangeListener.aidl \
core/java/android/database/IContentObserver.aidl \
core/java/android/hardware/ICameraService.aidl \
diff --git a/api/current.txt b/api/current.txt
index aae84e1..6b65a0e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -143,7 +143,6 @@
public static final class Manifest.permission_group {
ctor public Manifest.permission_group();
- field public static final java.lang.String ACCOUNTS = "android.permission-group.ACCOUNTS";
field public static final java.lang.String CALENDAR = "android.permission-group.CALENDAR";
field public static final java.lang.String CAMERA = "android.permission-group.CAMERA";
field public static final java.lang.String CONTACTS = "android.permission-group.CONTACTS";
@@ -3879,6 +3878,7 @@
field public static final java.lang.String OPSTR_READ_CALL_LOG = "android:read_call_log";
field public static final java.lang.String OPSTR_READ_CELL_BROADCASTS = "android:read_cell_broadcasts";
field public static final java.lang.String OPSTR_READ_CONTACTS = "android:read_contacts";
+ field public static final java.lang.String OPSTR_READ_EXTERNAL_STORAGE = "android:read_external_storage";
field public static final java.lang.String OPSTR_READ_PHONE_STATE = "android:read_phone_state";
field public static final java.lang.String OPSTR_READ_SMS = "android:read_sms";
field public static final java.lang.String OPSTR_RECEIVE_MMS = "android:receive_mms";
@@ -3891,6 +3891,7 @@
field public static final java.lang.String OPSTR_WRITE_CALENDAR = "android:write_calendar";
field public static final java.lang.String OPSTR_WRITE_CALL_LOG = "android:write_call_log";
field public static final java.lang.String OPSTR_WRITE_CONTACTS = "android:write_contacts";
+ field public static final java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE = "android:write_external_storage";
}
public static abstract interface AppOpsManager.OnOpChangedListener {
@@ -5615,8 +5616,8 @@
method public void clearDeviceOwnerApp(java.lang.String);
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
- method public android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
- method public android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
+ method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
method public java.lang.String[] getAccountTypesWithManagementDisabled();
@@ -5803,7 +5804,7 @@
package android.app.assist {
- public deprecated class AssistContent implements android.os.Parcelable {
+ public class AssistContent implements android.os.Parcelable {
ctor public AssistContent();
method public int describeContents();
method public android.content.ClipData getClipData();
@@ -18147,6 +18148,7 @@
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
+ method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@@ -22800,6 +22802,7 @@
public class DeadObjectException extends android.os.RemoteException {
ctor public DeadObjectException();
+ ctor public DeadObjectException(java.lang.String);
}
public final class Debug {
@@ -26423,6 +26426,7 @@
field public static final java.lang.String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
+ field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.MANAGE_OVERLAY_PERMISSION";
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
@@ -30450,7 +30454,7 @@
method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
field public static final java.lang.String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
+ field public static final java.lang.String ACTION_CONFIGURE_PHONE_ACCOUNT = "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
field public static final java.lang.String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED";
field public static final java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
field public static final java.lang.String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS";
@@ -37463,6 +37467,7 @@
field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
field public static final int TYPE_NOTIFICATION_STATE_CHANGED = 64; // 0x40
diff --git a/api/system-current.txt b/api/system-current.txt
index 9ef5de5..b9d88bd 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -232,7 +232,6 @@
public static final class Manifest.permission_group {
ctor public Manifest.permission_group();
- field public static final java.lang.String ACCOUNTS = "android.permission-group.ACCOUNTS";
field public static final java.lang.String CALENDAR = "android.permission-group.CALENDAR";
field public static final java.lang.String CAMERA = "android.permission-group.CAMERA";
field public static final java.lang.String CONTACTS = "android.permission-group.CONTACTS";
@@ -3989,6 +3988,7 @@
field public static final java.lang.String OPSTR_READ_CALL_LOG = "android:read_call_log";
field public static final java.lang.String OPSTR_READ_CELL_BROADCASTS = "android:read_cell_broadcasts";
field public static final java.lang.String OPSTR_READ_CONTACTS = "android:read_contacts";
+ field public static final java.lang.String OPSTR_READ_EXTERNAL_STORAGE = "android:read_external_storage";
field public static final java.lang.String OPSTR_READ_PHONE_STATE = "android:read_phone_state";
field public static final java.lang.String OPSTR_READ_SMS = "android:read_sms";
field public static final java.lang.String OPSTR_RECEIVE_MMS = "android:receive_mms";
@@ -4001,6 +4001,7 @@
field public static final java.lang.String OPSTR_WRITE_CALENDAR = "android:write_calendar";
field public static final java.lang.String OPSTR_WRITE_CALL_LOG = "android:write_call_log";
field public static final java.lang.String OPSTR_WRITE_CONTACTS = "android:write_contacts";
+ field public static final java.lang.String OPSTR_WRITE_EXTERNAL_STORAGE = "android:write_external_storage";
}
public static abstract interface AppOpsManager.OnOpChangedListener {
@@ -5736,8 +5737,8 @@
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearProfileOwner(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
- method public android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
- method public android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
+ method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
method public java.lang.String[] getAccountTypesWithManagementDisabled();
@@ -5935,7 +5936,7 @@
package android.app.assist {
- public deprecated class AssistContent implements android.os.Parcelable {
+ public class AssistContent implements android.os.Parcelable {
ctor public AssistContent();
method public int describeContents();
method public android.content.ClipData getClipData();
@@ -13420,7 +13421,6 @@
public abstract class SensorManager {
method public boolean cancelTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor);
- method public boolean enableDataInjectionMode(boolean);
method public boolean flush(android.hardware.SensorEventListener);
method public static float getAltitude(float, float);
method public static void getAngleChange(float[], float[], float[]);
@@ -13433,6 +13433,7 @@
method public static void getRotationMatrixFromVector(float[], float[]);
method public java.util.List<android.hardware.Sensor> getSensorList(int);
method public deprecated int getSensors();
+ method public boolean initDataInjection(boolean);
method public boolean injectSensorData(android.hardware.Sensor, float[], int, long);
method public deprecated boolean registerListener(android.hardware.SensorListener, int);
method public deprecated boolean registerListener(android.hardware.SensorListener, int, int);
@@ -19662,6 +19663,7 @@
method public deprecated void setNetworkPreference(int);
method public static deprecated boolean setProcessDefaultNetwork(android.net.Network);
method public void unregisterNetworkCallback(android.net.ConnectivityManager.NetworkCallback);
+ method public void unregisterNetworkCallback(android.app.PendingIntent);
field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String ACTION_CAPTIVE_PORTAL_SIGN_IN = "android.net.conn.CAPTIVE_PORTAL";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@@ -24747,6 +24749,7 @@
public class DeadObjectException extends android.os.RemoteException {
ctor public DeadObjectException();
+ ctor public DeadObjectException(java.lang.String);
}
public final class Debug {
@@ -28484,6 +28487,7 @@
field public static final java.lang.String ACTION_LOCATION_SOURCE_SETTINGS = "android.settings.LOCATION_SOURCE_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS = "android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
field public static final java.lang.String ACTION_MANAGE_APPLICATIONS_SETTINGS = "android.settings.MANAGE_APPLICATIONS_SETTINGS";
+ field public static final java.lang.String ACTION_MANAGE_OVERLAY_PERMISSION = "android.settings.MANAGE_OVERLAY_PERMISSION";
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
@@ -32683,7 +32687,7 @@
method public void unregisterPhoneAccount(android.telecom.PhoneAccountHandle);
field public static final java.lang.String ACTION_CHANGE_DEFAULT_DIALER = "android.telecom.action.CHANGE_DEFAULT_DIALER";
field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecom.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
+ field public static final java.lang.String ACTION_CONFIGURE_PHONE_ACCOUNT = "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
field public static final java.lang.String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED";
field public static final java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
@@ -39761,6 +39765,7 @@
field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
field public static final int TYPE_NOTIFICATION_STATE_CHANGED = 64; // 0x40
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index e8ab109..9c2e208 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -6473,20 +6473,22 @@
}
private void dispatchRequestPermissionsResult(int requestCode, Intent data) {
- String[] permissions = data.getStringArrayExtra(
- PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES);
- final int[] grantResults = data.getIntArrayExtra(
- PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS);
+ // If the package installer crashed we may have not data - best effort.
+ String[] permissions = (data != null) ? data.getStringArrayExtra(
+ PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0];
+ final int[] grantResults = (data != null) ? data.getIntArrayExtra(
+ PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0];
onRequestPermissionsResult(requestCode, permissions, grantResults);
}
private void dispatchRequestPermissionsResultToFragment(int requestCode, Intent data,
- Fragment fragement) {
- String[] permissions = data.getStringArrayExtra(
- PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES);
- final int[] grantResults = data.getIntArrayExtra(
- PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS);
- fragement.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ Fragment fragment) {
+ // If the package installer crashed we may have not data - best effort.
+ String[] permissions = (data != null) ? data.getStringArrayExtra(
+ PackageManager.EXTRA_REQUEST_PERMISSIONS_NAMES) : new String[0];
+ final int[] grantResults = (data != null) ? data.getIntArrayExtra(
+ PackageManager.EXTRA_REQUEST_PERMISSIONS_RESULTS) : new int[0];
+ fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
class HostCallbacks extends FragmentHostCallback<Activity> {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 8a61ec6..9faadd3 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -229,8 +229,12 @@
public static final int OP_READ_CELL_BROADCASTS = 57;
/** @hide Inject mock location into the system. */
public static final int OP_MOCK_LOCATION = 58;
+ /** @hide Read external storage. */
+ public static final int OP_READ_EXTERNAL_STORAGE = 59;
+ /** @hide Write external storage. */
+ public static final int OP_WRITE_EXTERNAL_STORAGE = 60;
/** @hide */
- public static final int _NUM_OP = 59;
+ public static final int _NUM_OP = 61;
/** Access to coarse location information. */
public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
@@ -313,6 +317,12 @@
/** Inject mock location into the system. */
public static final String OPSTR_MOCK_LOCATION
= "android:mock_location";
+ /** Read external storage. */
+ public static final String OPSTR_READ_EXTERNAL_STORAGE
+ = "android:read_external_storage";
+ /** Write external storage. */
+ public static final String OPSTR_WRITE_EXTERNAL_STORAGE
+ = "android:write_external_storage";
/**
* This maps each operation to the operation that serves as the
@@ -381,7 +391,9 @@
OP_USE_FINGERPRINT,
OP_BODY_SENSORS,
OP_READ_CELL_BROADCASTS,
- OP_MOCK_LOCATION
+ OP_MOCK_LOCATION,
+ OP_READ_EXTERNAL_STORAGE,
+ OP_WRITE_EXTERNAL_STORAGE
};
/**
@@ -447,7 +459,9 @@
OPSTR_USE_FINGERPRINT,
OPSTR_BODY_SENSORS,
OPSTR_READ_CELL_BROADCASTS,
- OPSTR_MOCK_LOCATION
+ OPSTR_MOCK_LOCATION,
+ OPSTR_READ_EXTERNAL_STORAGE,
+ OPSTR_WRITE_EXTERNAL_STORAGE
};
/**
@@ -513,7 +527,9 @@
"USE_FINGERPRINT",
"BODY_SENSORS",
"READ_CELL_BROADCASTS",
- "MOCK_LOCATION"
+ "MOCK_LOCATION",
+ "OPSTR_READ_EXTERNAL_STORAGE",
+ "OPSTR_WRITE_EXTERNAL_STORAGE",
};
/**
@@ -579,7 +595,9 @@
Manifest.permission.USE_FINGERPRINT,
Manifest.permission.BODY_SENSORS,
Manifest.permission.READ_CELL_BROADCASTS,
- null
+ null,
+ Manifest.permission.READ_EXTERNAL_STORAGE,
+ Manifest.permission.WRITE_EXTERNAL_STORAGE,
};
/**
@@ -646,7 +664,9 @@
null, // USE_FINGERPRINT
null, // BODY_SENSORS
null, // READ_CELL_BROADCASTS
- null // MOCK_LOCATION
+ null, // MOCK_LOCATION
+ null, // READ_EXTERNAL_STORAGE
+ null // WRITE_EXTERNAL_STORAGE
};
/**
@@ -712,7 +732,9 @@
false, // USE_FINGERPRINT
false, // BODY_SENSORS
false, // READ_CELL_BROADCASTS
- false // MOCK_LOCATION
+ false, // MOCK_LOCATION
+ false, // READ_EXTERNAL_STORAGE
+ false // WRITE_EXTERNAL_STORAGE
};
/**
@@ -777,7 +799,9 @@
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
- AppOpsManager.MODE_ERRORED // OP_MOCK_LOCATION
+ AppOpsManager.MODE_ERRORED, // OP_MOCK_LOCATION
+ AppOpsManager.MODE_ALLOWED,
+ AppOpsManager.MODE_ALLOWED
};
/**
@@ -846,6 +870,8 @@
false,
false,
false,
+ false,
+ false,
false
};
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 903411e..13030ca 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -717,6 +717,7 @@
break;
case OP_REPLACE: {
Fragment f = op.fragment;
+ int containerId = f.mContainerId;
if (mManager.mAdded != null) {
for (int i = 0; i < mManager.mAdded.size(); i++) {
Fragment old = mManager.mAdded.get(i);
@@ -724,7 +725,7 @@
Log.v(TAG,
"OP_REPLACE: adding=" + f + " old=" + old);
}
- if (f == null || old.mContainerId == f.mContainerId) {
+ if (old.mContainerId == containerId) {
if (old == f) {
op.fragment = f = null;
} else {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index d53157b..d28ff51 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -3612,7 +3612,10 @@
* @see UserHandle
* @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
* user could not be created.
+ *
+ * @deprecated From {@link android.os.Build.VERSION_CODES#MNC}
*/
+ @Deprecated
public UserHandle createUser(@NonNull ComponentName admin, String name) {
try {
return mService.createUser(admin, name);
@@ -3646,7 +3649,10 @@
* @see UserHandle
* @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
* user could not be created.
+ *
+ * @deprecated From {@link android.os.Build.VERSION_CODES#MNC}
*/
+ @Deprecated
public UserHandle createAndInitializeUser(@NonNull ComponentName admin, String name,
String ownerName, @NonNull ComponentName profileOwnerComponent, Bundle adminExtras) {
try {
@@ -3962,24 +3968,27 @@
* <li>{@link Settings.Global#ADB_ENABLED}</li>
* <li>{@link Settings.Global#AUTO_TIME}</li>
* <li>{@link Settings.Global#AUTO_TIME_ZONE}</li>
- * <li>{@link Settings.Global#BLUETOOTH_ON}
- * Changing this setting has not effect as of {@link android.os.Build.VERSION_CODES#MNC}. Use
- * {@link android.bluetooth.BluetoothAdapter#enable()} and
- * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
* <li>{@link Settings.Global#DATA_ROAMING}</li>
- * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
- * <li>{@link Settings.Global#MODE_RINGER}</li>
- * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
* <li>{@link Settings.Global#USB_MASS_STORAGE_ENABLED}</li>
- * <li>{@link Settings.Global#WIFI_ON}
- * Changing this setting has not effect as of {@link android.os.Build.VERSION_CODES#MNC}. Use
- * {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
* <li>{@link Settings.Global#WIFI_SLEEP_POLICY}</li>
* <li>{@link Settings.Global#STAY_ON_WHILE_PLUGGED_IN}
- * This setting is only available from {@link android.os.Build.VERSION_CODES#MNC} onwards
- * and can only be set if {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
+ * This setting is only available from {@link android.os.Build.VERSION_CODES#MNC} onwards
+ * and can only be set if {@link #setMaximumTimeToLock} is not used to set a timeout.</li>
* <li>{@link Settings.Global#WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN}</li>
* </ul>
+ * <p>Changing the following settings has no effect as of
+ * {@link android.os.Build.VERSION_CODES#MNC}:
+ * <ul>
+ * <li>{@link Settings.Global#BLUETOOTH_ON}.
+ * Use {@link android.bluetooth.BluetoothAdapter#enable()} and
+ * {@link android.bluetooth.BluetoothAdapter#disable()} instead.</li>
+ * <li>{@link Settings.Global#DEVELOPMENT_SETTINGS_ENABLED}</li>
+ * <li>{@link Settings.Global#MODE_RINGER}.
+ * Use {@link android.media.AudioManager#setRingerMode(int)} instead.</li>
+ * <li>{@link Settings.Global#NETWORK_PREFERENCE}</li>
+ * <li>{@link Settings.Global#WIFI_ON}.
+ * Use {@link android.net.wifi.WifiManager#setWifiEnabled(boolean)} instead.</li>
+ * </ul>
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param setting The name of the setting to update.
diff --git a/core/java/android/app/assist/AssistContent.java b/core/java/android/app/assist/AssistContent.java
index 07b2d57..cddf47a 100644
--- a/core/java/android/app/assist/AssistContent.java
+++ b/core/java/android/app/assist/AssistContent.java
@@ -12,7 +12,6 @@
* assistant at the user's request. This is filled in by
* {@link android.app.Activity#onProvideAssistContent Activity.onProvideAssistContent}.
*/
-@Deprecated
public class AssistContent implements Parcelable {
private boolean mIsAppProvidedIntent = false;
private Intent mIntent;
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 369b692..24647f38 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -372,13 +372,4 @@
return new UsageEvents[size];
}
};
-
- @Override
- protected void finalize() throws Throwable {
- super.finalize();
- if (mParcel != null) {
- mParcel.recycle();
- mParcel = null;
- }
- }
}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index d37dda0..6ede29b 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1593,7 +1593,11 @@
@NonNull ContentObserver observer) {
Preconditions.checkNotNull(uri, "uri");
Preconditions.checkNotNull(observer, "observer");
- registerContentObserver(uri, notifyForDescendents, observer, UserHandle.myUserId());
+ registerContentObserver(
+ ContentProvider.getUriWithoutUserId(uri),
+ notifyForDescendents,
+ observer,
+ ContentProvider.getUserIdFromUri(uri, UserHandle.myUserId()));
}
/** @hide - designated user version */
@@ -1659,7 +1663,11 @@
public void notifyChange(@NonNull Uri uri, @Nullable ContentObserver observer,
boolean syncToNetwork) {
Preconditions.checkNotNull(uri, "uri");
- notifyChange(uri, observer, syncToNetwork, UserHandle.myUserId());
+ notifyChange(
+ ContentProvider.getUriWithoutUserId(uri),
+ observer,
+ syncToNetwork,
+ ContentProvider.getUserIdFromUri(uri, UserHandle.myUserId()));
}
/**
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index cea6e99..2b83d86 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -31,7 +31,6 @@
import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
-import android.content.pm.IPackagesProvider;
import android.content.pm.IOnPermissionsChangeListener;
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.InstrumentationInfo;
@@ -504,7 +503,7 @@
void addOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
- void grantDefaultPermissions(int userId);
- void setCarrierAppPackagesProvider(in IPackagesProvider provider);
int getMountExternalMode(int uid);
+
+ void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
}
diff --git a/core/java/android/content/pm/IPackagesProvider.aidl b/core/java/android/content/pm/IPackagesProvider.aidl
deleted file mode 100644
index 7d76c88..0000000
--- a/core/java/android/content/pm/IPackagesProvider.aidl
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2015 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.
- */
-
-package android.content.pm;
-
-/** {@hide} */
-interface IPackagesProvider {
- String[] getPackages(int userId);
-}
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 7599bd6..dbaba49 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -55,4 +55,30 @@
* @param provider The packages provider.
*/
public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider);
+
+ /**
+ * Sets the SMS packages provider.
+ * @param provider The packages provider.
+ */
+ public abstract void setSmsAppPackagesProvider(PackagesProvider provider);
+
+ /**
+ * Sets the dialer packages provider.
+ * @param provider The packages provider.
+ */
+ public abstract void setDialerAppPackagesProvider(PackagesProvider provider);
+
+ /**
+ * Requests granting of the default permissions to the current default SMS app.
+ * @param packageName The default SMS package name.
+ * @param userId The user for which to grant the permissions.
+ */
+ public abstract void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId);
+
+ /**
+ * Requests granting of the default permissions to the current default dialer app.
+ * @param packageName The default dialer package name.
+ * @param userId The user for which to grant the permissions.
+ */
+ public abstract void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId);
}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index faf71ee..64376c1 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -1505,7 +1505,8 @@
if (!parseUsesPermission(pkg, res, parser, attrs)) {
return null;
}
- } else if (tagName.equals("uses-permission-sdk-m")) {
+ } else if (tagName.equals("uses-permission-sdk-m")
+ || tagName.equals("uses-permission-sdk-23")) {
if (!parseUsesPermission(pkg, res, parser, attrs)) {
return null;
}
diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java
index d6b1142..d456b5e 100644
--- a/core/java/android/hardware/SensorManager.java
+++ b/core/java/android/hardware/SensorManager.java
@@ -1568,47 +1568,41 @@
/**
* For testing purposes only. Not for third party applications.
*
- * Enable data injection mode in sensor service. This mode is
- * expected to be used only for testing purposes. If the HAL is
- * set to data injection mode, it will ignore the input from
- * physical sensors and read sensor data that is injected from
- * the test application. This mode is used for testing vendor
- * implementations for various algorithms like Rotation Vector,
- * Significant Motion, Step Counter etc.
+ * Initialize data injection mode and create a client for data injection. SensorService should
+ * already be operating in DATA_INJECTION mode for this call succeed. To set SensorService into
+ * DATA_INJECTION mode "adb shell dumpsys sensorservice data_injection" needs to be called
+ * through adb. Typically this is done using a host side test. This mode is expected to be used
+ * only for testing purposes. If the HAL is set to data injection mode, it will ignore the input
+ * from physical sensors and read sensor data that is injected from the test application. This
+ * mode is used for testing vendor implementations for various algorithms like Rotation Vector,
+ * Significant Motion, Step Counter etc. Not all HALs support DATA_INJECTION. This method will
+ * fail in those cases. Once this method succeeds, the test can call
+ * {@link injectSensorData(Sensor, float[], int, long)} to inject sensor data into the HAL.
*
- * The tests which call this API need to have {@code
- * android.permission.LOCATION_HADWARE} permission which isn't
- * available for third party applications.
- *
- * @param enable True to set the HAL in DATA_INJECTION mode.
- * False to reset the HAL back to NORMAL mode.
+ * @param enable True to initialize a client in DATA_INJECTION mode.
+ * False to clean up the native resources.
*
* @return true if the HAL supports data injection and false
* otherwise.
* @hide
*/
@SystemApi
- public boolean enableDataInjectionMode(boolean enable) {
- return enableDataInjectionImpl(enable);
+ public boolean initDataInjection(boolean enable) {
+ return initDataInjectionImpl(enable);
}
/**
* @hide
*/
- protected abstract boolean enableDataInjectionImpl(boolean enable);
+ protected abstract boolean initDataInjectionImpl(boolean enable);
/**
* For testing purposes only. Not for third party applications.
*
- * This method is used to inject raw sensor data into the HAL.
- * Call enableDataInjection before this method to set the HAL in
- * data injection mode. This method should be called only if a
- * previous call to enableDataInjection has been successful and
- * the HAL is already in data injection mode.
- *
- * The tests which call this API need to have {@code
- * android.permission.LOCATION_HARDWARE} permission which isn't
- * available for third party applications.
+ * This method is used to inject raw sensor data into the HAL. Call {@link
+ * initDataInjection(boolean)} before this method to set the HAL in data injection mode. This
+ * method should be called only if a previous call to initDataInjection has been successful and
+ * the HAL and SensorService are already opreating in data injection mode.
*
* @param sensor The sensor to inject.
* @param values Sensor values to inject. The length of this
@@ -1650,9 +1644,6 @@
if (timestamp <= 0) {
throw new IllegalArgumentException("Negative or zero sensor timestamp");
}
- if (timestamp > SystemClock.elapsedRealtimeNanos()) {
- throw new IllegalArgumentException("Sensor timestamp into the future");
- }
return injectSensorDataImpl(sensor, values, accuracy, timestamp);
}
diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java
index d7960af..50e1a68 100644
--- a/core/java/android/hardware/SystemSensorManager.java
+++ b/core/java/android/hardware/SystemSensorManager.java
@@ -43,7 +43,7 @@
private static native void nativeClassInit();
private static native long nativeCreate(String opPackageName);
private static native int nativeGetNextSensor(long nativeInstance, Sensor sensor, int next);
- private static native int nativeEnableDataInjection(long nativeInstance, boolean enable);
+ private static native boolean nativeIsDataInjectionEnabled(long nativeInstance);
private static boolean sSensorModuleInitialized = false;
private static InjectEventQueue mInjectEventQueue = null;
@@ -64,7 +64,6 @@
private final Looper mMainLooper;
private final int mTargetSdkLevel;
private final Context mContext;
- private final boolean mHasDataInjectionPermissions;
private final long mNativeInstance;
/** {@hide} */
@@ -79,21 +78,18 @@
sSensorModuleInitialized = true;
nativeClassInit();
}
- mHasDataInjectionPermissions = context.checkSelfPermission(
- Manifest.permission.LOCATION_HARDWARE) == PackageManager.PERMISSION_GRANTED;
}
// initialize the sensor list
int i = 0;
- while(true) {
+ do {
Sensor sensor = new Sensor();
i = nativeGetNextSensor(mNativeInstance, sensor, i);
- if (i <= 0) {
- break;
+ if (i >= 0) {
+ mFullSensorsList.add(sensor);
+ mHandleToSensor.append(sensor.getHandle(), sensor);
}
- mFullSensorsList.add(sensor);
- mHandleToSensor.append(sensor.getHandle(), sensor);
- }
+ } while (i > 0);
}
@@ -230,23 +226,26 @@
}
}
- protected boolean enableDataInjectionImpl(boolean enable) {
- if (!mHasDataInjectionPermissions) {
- throw new SecurityException("Permission denial. Calling enableDataInjection without "
- + Manifest.permission.LOCATION_HARDWARE);
- }
+ protected boolean initDataInjectionImpl(boolean enable) {
synchronized (mLock) {
- int ret = nativeEnableDataInjection(mNativeInstance, enable);
- // The HAL does not support injection. Ignore.
- if (ret != 0) {
- Log.e(TAG, "HAL does not support data injection");
- return false;
- }
- mDataInjectionMode = enable;
- // If data injection is being disabled clean up the native resources.
- if (!enable && mInjectEventQueue != null) {
- mInjectEventQueue.dispose();
- mInjectEventQueue = null;
+ if (enable) {
+ boolean isDataInjectionModeEnabled = nativeIsDataInjectionEnabled(mNativeInstance);
+ // The HAL does not support injection OR SensorService hasn't been set in DI mode.
+ if (!isDataInjectionModeEnabled) {
+ Log.e(TAG, "Data Injection mode not enabled");
+ return false;
+ }
+ mDataInjectionMode = true;
+ // Initialize a client for data_injection.
+ if (mInjectEventQueue == null) {
+ mInjectEventQueue = new InjectEventQueue(mMainLooper, this);
+ }
+ } else {
+ // If data injection is being disabled clean up the native resources.
+ if (mInjectEventQueue != null) {
+ mInjectEventQueue.dispose();
+ mInjectEventQueue = null;
+ }
}
return true;
}
@@ -254,18 +253,11 @@
protected boolean injectSensorDataImpl(Sensor sensor, float[] values, int accuracy,
long timestamp) {
- if (!mHasDataInjectionPermissions) {
- throw new SecurityException("Permission denial. Calling injectSensorData without "
- + Manifest.permission.LOCATION_HARDWARE);
- }
synchronized (mLock) {
if (!mDataInjectionMode) {
Log.e(TAG, "Data injection mode not activated before calling injectSensorData");
return false;
}
- if (mInjectEventQueue == null) {
- mInjectEventQueue = new InjectEventQueue(mMainLooper, this);
- }
int ret = mInjectEventQueue.injectSensorData(sensor.getHandle(), values, accuracy,
timestamp);
// If there are any errors in data injection clean up the native resources.
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 80476ea..12cd5f1 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2565,7 +2565,7 @@
* replaced by this one, effectively releasing the previous {@link NetworkRequest}.
* <p>
* The request may be released normally by calling
- * {@link #releaseNetworkRequest(android.app.PendingIntent)}.
+ * {@link #unregisterNetworkCallback(android.app.PendingIntent)}.
* <p>This method requires the caller to hold the permission
* {@link android.Manifest.permission#ACCESS_NETWORK_STATE}.
* @param request {@link NetworkRequest} describing this request.
@@ -2619,6 +2619,19 @@
}
/**
+ * Unregisters a callback previously registered via
+ * {@link #registerNetworkCallback(NetworkRequest, android.app.PendingIntent)}.
+ *
+ * @param operation A PendingIntent equal (as defined by {@link Intent#filterEquals}) to the
+ * PendingIntent passed to
+ * {@link #registerNetworkCallback(NetworkRequest, android.app.PendingIntent)}.
+ * Cannot be null.
+ */
+ public void unregisterNetworkCallback(PendingIntent operation) {
+ releaseNetworkRequest(operation);
+ }
+
+ /**
* Informs the system whether it should switch to {@code network} regardless of whether it is
* validated or not. If {@code accept} is true, and the network was explicitly selected by the
* user (e.g., by selecting a Wi-Fi network in the Settings app), then the network will become
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 31aedad..cfd5bf1 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -517,7 +517,7 @@
* Note that Http Proxies are only a hint - the system recommends their use, but it does
* not enforce it and applications may ignore them.
*
- * @param proxy A {@link ProxyInfo} defining the Http Proxy to use on this link.
+ * @param proxy A {@link ProxyInfo} defining the HTTP Proxy to use on this link.
* @hide
*/
public void setHttpProxy(ProxyInfo proxy) {
@@ -774,6 +774,43 @@
}
/**
+ * Evaluate whether the {@link InetAddress} is considered reachable.
+ *
+ * @return {@code true} if the given {@link InetAddress} is considered reachable,
+ * {@code false} otherwise.
+ * @hide
+ */
+ public boolean isReachable(InetAddress ip) {
+ final List<RouteInfo> allRoutes = getAllRoutes();
+ // If we don't have a route to this IP address, it's not reachable.
+ final RouteInfo bestRoute = RouteInfo.selectBestRoute(allRoutes, ip);
+ if (bestRoute == null) {
+ return false;
+ }
+
+ // TODO: better source address evaluation for destination addresses.
+
+ if (ip instanceof Inet4Address) {
+ // For IPv4, it suffices for now to simply have any address.
+ return hasIPv4Address();
+ } else if (ip instanceof Inet6Address) {
+ if (ip.isLinkLocalAddress()) {
+ // For now, just make sure link-local destinations have
+ // scopedIds set, since transmits will generally fail otherwise.
+ // TODO: verify it matches the ifindex of one of the interfaces.
+ return (((Inet6Address)ip).getScopeId() != 0);
+ } else {
+ // For non-link-local destinations check that either the best route
+ // is directly connected or that some global preferred address exists.
+ // TODO: reconsider all cases (disconnected ULA networks, ...).
+ return (!bestRoute.hasGateway() || hasGlobalIPv6Address());
+ }
+ }
+
+ return false;
+ }
+
+ /**
* Compares this {@code LinkProperties} interface name against the target
*
* @param target LinkProperties to compare.
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
index 64c2bc2..23d05bd 100644
--- a/core/java/android/nfc/cardemulation/CardEmulation.java
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -40,7 +40,7 @@
* NFC card emulation services.
*
* For a general introduction into NFC card emulation,
- * please read the <a href="{@docRoot}guide/topics/nfc/ce.html">
+ * please read the <a href="{@docRoot}guide/topics/connectivity/nfc/hce.html">
* NFC card emulation developer guide</a>.</p>
*
* <p class="note">Use of this class requires the
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 7fda30a..fe323f3 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -184,6 +184,7 @@
private static final String UID_DATA = "uid";
private static final String APK_DATA = "apk";
private static final String PROCESS_DATA = "pr";
+ private static final String CPU_DATA = "cpu";
private static final String SENSOR_DATA = "sr";
private static final String VIBRATOR_DATA = "vib";
private static final String FOREGROUND_DATA = "fg";
@@ -457,8 +458,13 @@
public abstract long getSystemCpuTimeUs(int which);
/**
+ * Get the total cpu power consumed (in milli-ampere-microseconds).
+ */
+ public abstract long getCpuPowerMaUs(int which);
+
+ /**
* Returns the approximate cpu time (in milliseconds) spent at a certain CPU speed.
- * @param speedStep the index of the CPU speed. This is not the actual speed of the CPU.
+ * @param step the index of the CPU speed. This is not the actual speed of the CPU.
* @param which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT.
* @see BatteryStats#getCpuSpeedSteps()
*/
@@ -2905,6 +2911,14 @@
dumpLine(pw, uid, category, STATE_TIME_DATA, stateTimes);
}
+ final long userCpuTimeUs = u.getUserCpuTimeUs(which);
+ final long systemCpuTimeUs = u.getSystemCpuTimeUs(which);
+ final long powerCpuMaUs = u.getCpuPowerMaUs(which);
+ if (userCpuTimeUs > 0 || systemCpuTimeUs > 0 || powerCpuMaUs > 0) {
+ dumpLine(pw, uid, category, CPU_DATA, userCpuTimeUs / 1000, systemCpuTimeUs / 1000,
+ powerCpuMaUs / 1000);
+ }
+
final ArrayMap<String, ? extends BatteryStats.Uid.Proc> processStats
= u.getProcessStats();
for (int ipr=processStats.size()-1; ipr>=0; ipr--) {
@@ -2970,6 +2984,10 @@
printer.print(BatteryStatsHelper.makemAh(power));
}
+ private void printmAh(StringBuilder sb, double power) {
+ sb.append(BatteryStatsHelper.makemAh(power));
+ }
+
/**
* Temporary for settings.
*/
@@ -4028,13 +4046,17 @@
final long userCpuTimeUs = u.getUserCpuTimeUs(which);
final long systemCpuTimeUs = u.getSystemCpuTimeUs(which);
- if (userCpuTimeUs > 0 || systemCpuTimeUs > 0) {
+ final long powerCpuMaUs = u.getCpuPowerMaUs(which);
+ if (userCpuTimeUs > 0 || systemCpuTimeUs > 0 || powerCpuMaUs > 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" Total cpu time: u=");
formatTimeMs(sb, userCpuTimeUs / 1000);
sb.append("s=");
formatTimeMs(sb, systemCpuTimeUs / 1000);
+ sb.append("p=");
+ printmAh(sb, powerCpuMaUs / (1000.0 * 1000.0 * 60.0 * 60.0));
+ sb.append("mAh");
pw.println(sb.toString());
}
diff --git a/core/java/android/os/DeadObjectException.java b/core/java/android/os/DeadObjectException.java
index 94c5387..e06b0f9 100644
--- a/core/java/android/os/DeadObjectException.java
+++ b/core/java/android/os/DeadObjectException.java
@@ -25,4 +25,8 @@
public DeadObjectException() {
super();
}
+
+ public DeadObjectException(String message) {
+ super(message);
+ }
}
diff --git a/core/java/android/os/UserHandle.java b/core/java/android/os/UserHandle.java
index 6874e77..511bd5f 100644
--- a/core/java/android/os/UserHandle.java
+++ b/core/java/android/os/UserHandle.java
@@ -179,6 +179,19 @@
}
/**
+ * Returns the app id for a given shared app gid.
+ * @hide
+ */
+ public static final int getAppIdFromSharedAppGid(int gid) {
+ final int noUserGid = getAppId(gid);
+ if (noUserGid < Process.FIRST_SHARED_APPLICATION_GID ||
+ noUserGid > Process.LAST_SHARED_APPLICATION_GID) {
+ throw new IllegalArgumentException(Integer.toString(gid) + " is not a shared app gid");
+ }
+ return (noUserGid + Process.FIRST_APPLICATION_UID) - Process.FIRST_SHARED_APPLICATION_GID;
+ }
+
+ /**
* Generate a text representation of the uid, breaking out its individual
* components -- user, app, isolated, etc.
* @hide
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 6384af3..b104135 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -572,6 +572,16 @@
}
/**
+ * @hide
+ * Returns whether the caller is running as an admin user. There can be more than one admin
+ * user.
+ */
+ public boolean isAdminUser() {
+ UserInfo user = getUserInfo(UserHandle.myUserId());
+ return user != null ? user.isAdmin() : false;
+ }
+
+ /**
* Used to check if the user making this call is linked to another user. Linked users may have
* a reduced number of available apps, app restrictions and account restrictions.
* @return whether the user making this call is a linked user
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 9b5fbfa..e5afdde 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -562,6 +562,21 @@
"android.settings.MANAGE_ALL_APPLICATIONS_SETTINGS";
/**
+ * Activity Action: Show settings to toggle permission to draw on top of
+ * other apps.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you
+ * safeguard against this.
+ * <p>
+ * Input: Nothing.
+ * <p>
+ * Output: Nothing.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_MANAGE_OVERLAY_PERMISSION =
+ "android.settings.MANAGE_OVERLAY_PERMISSION";
+
+ /**
* Activity Action: Show screen of details about a particular application.
* <p>
* In some cases, a matching Activity may not exist, so ensure you
@@ -5444,6 +5459,14 @@
public static final String ASSIST_STRUCTURE_ENABLED = "assist_structure_enabled";
/**
+ * Specifies whether a screenshot of the screen contents will be sent to the assist
+ * application (active voice interaction service).
+ *
+ * @hide
+ */
+ public static final String ASSIST_SCREENSHOT_ENABLED = "assist_screenshot_enabled";
+
+ /**
* Names of the service components that the current user has explicitly allowed to
* see all of the user's notifications, separated by ':'.
*
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 8119049..549c93e 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -172,15 +172,6 @@
}
}
- /** @hide */
- public void startSession(Bundle args, int flags) {
- showSession(args, flags);
- }
- /** @hide */
- public void startSession(Bundle args) {
- startSession(args, 0);
- }
-
@Override
public void onCreate() {
super.onCreate();
diff --git a/core/java/android/service/voice/VoiceInteractionSession.java b/core/java/android/service/voice/VoiceInteractionSession.java
index f9e216a..7eb936a 100644
--- a/core/java/android/service/voice/VoiceInteractionSession.java
+++ b/core/java/android/service/voice/VoiceInteractionSession.java
@@ -71,7 +71,7 @@
*/
public class VoiceInteractionSession implements KeyEvent.Callback, ComponentCallbacks2 {
static final String TAG = "VoiceInteractionSession";
- static final boolean DEBUG = true;
+ static final boolean DEBUG = false;
/**
* Flag received in {@link #onShow}: originator requested that the session be started with
@@ -175,6 +175,7 @@
CommandRequest request = new CommandRequest(callingPackage,
Binder.getCallingUid(), callback, VoiceInteractionSession.this,
command, extras);
+ addRequest(request);
mHandlerCaller.sendMessage(mHandlerCaller.obtainMessageO(MSG_START_COMMAND,
request));
return request.mInterface;
@@ -249,16 +250,12 @@
}
};
- /** @hide */
- public static class Caller {
- }
-
/**
* Base class representing a request from a voice-driver app to perform a particular
* voice operation with the user. See related subclasses for the types of requests
* that are possible.
*/
- public static class Request extends Caller {
+ public static class Request {
final IVoiceInteractorRequest mInterface = new IVoiceInteractorRequest.Stub() {
@Override
public void cancel() throws RemoteException {
@@ -319,74 +316,8 @@
}
}
- /** @hide */
- public void sendConfirmResult(boolean confirmed, Bundle result) {
- try {
- if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
- + " confirmed=" + confirmed + " result=" + result);
- finishRequest();
- mCallback.deliverConfirmationResult(mInterface, confirmed, result);
- } catch (RemoteException e) {
- }
- }
-
- /** @hide */
- public void sendPickOptionResult(boolean finished,
- VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
- try {
- if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
- + " finished=" + finished + " selections=" + selections
- + " result=" + result);
- if (finished) {
- finishRequest();
- }
- mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
- } catch (RemoteException e) {
- }
- }
-
- /** @hide */
- public void sendCompleteVoiceResult(Bundle result) {
- try {
- if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
- + " result=" + result);
- finishRequest();
- mCallback.deliverCompleteVoiceResult(mInterface, result);
- } catch (RemoteException e) {
- }
- }
-
- /** @hide */
- public void sendAbortVoiceResult(Bundle result) {
- try {
- if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
- + " result=" + result);
- finishRequest();
- mCallback.deliverAbortVoiceResult(mInterface, result);
- } catch (RemoteException e) {
- }
- }
-
- /** @hide */
- public void sendCommandResult(boolean finished, Bundle result) {
- try {
- if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
- + " result=" + result);
- if (finished) {
- finishRequest();
- }
- mCallback.deliverCommandResult(mInterface, finished, result);
- } catch (RemoteException e) {
- }
- }
-
- /** @hide */
- public void sendCancelResult() {
- cancel();
- }
-
/**
- * ASk the app to cancelLocked this current request.
+ * Ask the app to cancel this current request.
*/
public void cancel() {
try {
@@ -440,7 +371,13 @@
* VoiceInteractor.ConfirmationRequest.onConfirmationResult}.
*/
public void sendConfirmationResult(boolean confirmed, Bundle result) {
- sendConfirmResult(confirmed, result);
+ try {
+ if (DEBUG) Log.d(TAG, "sendConfirmationResult: req=" + mInterface
+ + " confirmed=" + confirmed + " result=" + result);
+ finishRequest();
+ mCallback.deliverConfirmationResult(mInterface, confirmed, result);
+ } catch (RemoteException e) {
+ }
}
}
@@ -487,6 +424,20 @@
return mOptions;
}
+ void sendPickOptionResult(boolean finished,
+ VoiceInteractor.PickOptionRequest.Option[] selections, Bundle result) {
+ try {
+ if (DEBUG) Log.d(TAG, "sendPickOptionResult: req=" + mInterface
+ + " finished=" + finished + " selections=" + selections
+ + " result=" + result);
+ if (finished) {
+ finishRequest();
+ }
+ mCallback.deliverPickOptionResult(mInterface, finished, selections, result);
+ } catch (RemoteException e) {
+ }
+ }
+
/**
* Report an intermediate option selection from the request, without completing it (the
* request is still active and the app is waiting for the final option selection),
@@ -553,7 +504,13 @@
* VoiceInteractor.CompleteVoiceRequest.onCompleteResult}.
*/
public void sendCompleteResult(Bundle result) {
- sendCompleteVoiceResult(result);
+ try {
+ if (DEBUG) Log.d(TAG, "sendCompleteVoiceResult: req=" + mInterface
+ + " result=" + result);
+ finishRequest();
+ mCallback.deliverCompleteVoiceResult(mInterface, result);
+ } catch (RemoteException e) {
+ }
}
}
@@ -596,7 +553,13 @@
* VoiceInteractor.AbortVoiceRequest.onAbortResult}.
*/
public void sendAbortResult(Bundle result) {
- sendAbortVoiceResult(result);
+ try {
+ if (DEBUG) Log.d(TAG, "sendConfirmResult: req=" + mInterface
+ + " result=" + result);
+ finishRequest();
+ mCallback.deliverAbortVoiceResult(mInterface, result);
+ } catch (RemoteException e) {
+ }
}
}
@@ -621,6 +584,18 @@
return mCommand;
}
+ void sendCommandResult(boolean finished, Bundle result) {
+ try {
+ if (DEBUG) Log.d(TAG, "sendCommandResult: req=" + mInterface
+ + " result=" + result);
+ if (finished) {
+ finishRequest();
+ }
+ mCallback.deliverCommandResult(mInterface, finished, result);
+ } catch (RemoteException e) {
+ }
+ }
+
/**
* Report an intermediate result of the request, without completing it (the request
* is still active and the app is waiting for the final result), resulting in a call to
@@ -829,11 +804,10 @@
}
}
- void doCreate(IVoiceInteractionManagerService service, IBinder token, Bundle args,
- int startFlags) {
+ void doCreate(IVoiceInteractionManagerService service, IBinder token) {
mSystemService = service;
mToken = token;
- onCreate(args, startFlags);
+ onCreate();
}
void doShow(Bundle args, int flags, final IVoiceInteractionSessionShowCallback showCallback) {
@@ -919,11 +893,6 @@
mContentFrame = (FrameLayout)mRootView.findViewById(android.R.id.content);
}
- /** @hide */
- public void show() {
- show(null, 0);
- }
-
/**
* Show the UI for this session. This asks the system to go through the process of showing
* your UI, which will eventually culminate in {@link #onShow}. This is similar to calling
@@ -958,14 +927,6 @@
}
}
- /** @hide */
- public void showWindow() {
- }
-
- /** @hide */
- public void hideWindow() {
- }
-
/**
* You can call this to customize the theme used by your IME's window.
* This must be set before {@link #onCreate}, so you
@@ -1062,7 +1023,6 @@
if (mToken == null) {
throw new IllegalStateException("Can't call before onCreate()");
}
- hideWindow();
try {
mSystemService.finish(mToken);
} catch (RemoteException e) {
@@ -1077,16 +1037,6 @@
doOnCreate();
}
- /** @hide */
- public void onCreate(Bundle args) {
- doOnCreate();
- }
-
- /** @hide */
- public void onCreate(Bundle args, int showFlags) {
- doOnCreate();
- }
-
private void doOnCreate() {
mTheme = mTheme != 0 ? mTheme
: com.android.internal.R.style.Theme_DeviceDefault_VoiceInteractionSession;
@@ -1244,34 +1194,6 @@
hide();
}
- /** @hide */
- public boolean[] onGetSupportedCommands(Caller caller, String[] commands) {
- return new boolean[commands.length];
- }
- /** @hide */
- public void onConfirm(Caller caller, Request request, CharSequence prompt,
- Bundle extras) {
- }
- /** @hide */
- public void onPickOption(Caller caller, Request request, CharSequence prompt,
- VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
- }
- /** @hide */
- public void onCompleteVoice(Caller caller, Request request, CharSequence message,
- Bundle extras) {
- request.sendCompleteVoiceResult(null);
- }
- /** @hide */
- public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
- request.sendAbortVoiceResult(null);
- }
- /** @hide */
- public void onCommand(Caller caller, Request request, String command, Bundle extras) {
- }
- /** @hide */
- public void onCancel(Request request) {
- }
-
/**
* Request to query for what extended commands the session supports.
*
@@ -1282,7 +1204,7 @@
* an array of all false entries.
*/
public boolean[] onGetSupportedCommands(String[] commands) {
- return onGetSupportedCommands(new Caller(), commands);
+ return new boolean[commands.length];
}
/**
@@ -1293,7 +1215,6 @@
* @param request The active request.
*/
public void onRequestConfirmation(ConfirmationRequest request) {
- onConfirm(request, request, request.getPrompt(), request.getExtras());
}
/**
@@ -1303,8 +1224,6 @@
* @param request The active request.
*/
public void onRequestPickOption(PickOptionRequest request) {
- onPickOption(request, request, request.getPrompt(), request.getOptions(),
- request.getExtras());
}
/**
@@ -1317,7 +1236,6 @@
* @param request The active request.
*/
public void onRequestCompleteVoice(CompleteVoiceRequest request) {
- onCompleteVoice(request, request, request.getMessage(), request.getExtras());
}
/**
@@ -1330,7 +1248,6 @@
* @param request The active request.
*/
public void onRequestAbortVoice(AbortVoiceRequest request) {
- onAbortVoice(request, request, request.getMessage(), request.getExtras());
}
/**
@@ -1341,11 +1258,10 @@
* @param request The active request.
*/
public void onRequestCommand(CommandRequest request) {
- onCommand(request, request, request.getCommand(), request.getExtras());
}
/**
- * Called when the {@link android.app.VoiceInteractor} has asked to cancelLocked a {@link Request}
+ * Called when the {@link android.app.VoiceInteractor} has asked to cancel a {@link Request}
* that was previously delivered to {@link #onRequestConfirmation},
* {@link #onRequestPickOption}, {@link #onRequestCompleteVoice}, {@link #onRequestAbortVoice},
* or {@link #onRequestCommand}.
@@ -1353,6 +1269,5 @@
* @param request The request that is being canceled.
*/
public void onCancelRequest(Request request) {
- onCancel(request);
}
}
diff --git a/core/java/android/service/voice/VoiceInteractionSessionService.java b/core/java/android/service/voice/VoiceInteractionSessionService.java
index 8f988f3..fb9f973 100644
--- a/core/java/android/service/voice/VoiceInteractionSessionService.java
+++ b/core/java/android/service/voice/VoiceInteractionSessionService.java
@@ -109,7 +109,7 @@
mSession = onNewSession(args);
try {
mSystemService.deliverNewSession(token, mSession.mSession, mSession.mInteractor);
- mSession.doCreate(mSystemService, token, args, startFlags);
+ mSession.doCreate(mSystemService, token);
} catch (RemoteException e) {
}
}
diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java
index 8952807..bbdb0e1 100644
--- a/core/java/android/service/wallpaper/WallpaperService.java
+++ b/core/java/android/service/wallpaper/WallpaperService.java
@@ -649,7 +649,7 @@
com.android.internal.R.style.Animation_Wallpaper;
mInputChannel = new InputChannel();
if (mSession.addToDisplay(mWindow, mWindow.mSeq, mLayout, View.VISIBLE,
- Display.DEFAULT_DISPLAY, mContentInsets, mStableInsets,
+ Display.DEFAULT_DISPLAY, mContentInsets, mStableInsets, mOutsets,
mInputChannel) < 0) {
Log.w(TAG, "Failed to add window while updating wallpaper surface.");
return;
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java
index 585fc4e..f9dd7eb 100644
--- a/core/java/android/transition/Visibility.java
+++ b/core/java/android/transition/Visibility.java
@@ -452,6 +452,7 @@
DisappearListener disappearListener = new DisappearListener(viewToKeep,
finalVisibility, isForcedVisibility);
animator.addListener(disappearListener);
+ animator.addPauseListener(disappearListener);
addListener(disappearListener);
} else if (!isForcedVisibility) {
viewToKeep.setTransitionVisibility(originalVisibility);
diff --git a/core/java/android/view/ActionProvider.java b/core/java/android/view/ActionProvider.java
index c3aafde..752240f 100644
--- a/core/java/android/view/ActionProvider.java
+++ b/core/java/android/view/ActionProvider.java
@@ -237,6 +237,14 @@
}
/**
+ * @hide
+ */
+ public void reset() {
+ mVisibilityListener = null;
+ mSubUiVisibilityListener = null;
+ }
+
+ /**
* @hide Internal use only
*/
public interface SubUiVisibilityListener {
diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl
index 19253dd..73b4a6e 100644
--- a/core/java/android/view/IWindowSession.aidl
+++ b/core/java/android/view/IWindowSession.aidl
@@ -40,7 +40,7 @@
out InputChannel outInputChannel);
int addToDisplay(IWindow window, int seq, in WindowManager.LayoutParams attrs,
in int viewVisibility, in int layerStackId, out Rect outContentInsets,
- out Rect outStableInsets, out InputChannel outInputChannel);
+ out Rect outStableInsets, out Rect outOutsets, out InputChannel outInputChannel);
int addWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs,
in int viewVisibility, out Rect outContentInsets, out Rect outStableInsets);
int addToDisplayWithoutInputChannel(IWindow window, int seq, in WindowManager.LayoutParams attrs,
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index e044f1e..f6119e2 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -434,7 +434,6 @@
private static class ProcessInitializer {
static ProcessInitializer sInstance = new ProcessInitializer();
- static IGraphicsStats sGraphicsStatsService;
private static IBinder sProcToken;
private boolean mInitialized = false;
@@ -449,19 +448,19 @@
}
private static void initGraphicsStats(Context context, long renderProxy) {
- IBinder binder = ServiceManager.getService("graphicsstats");
- if (binder == null) return;
-
- sGraphicsStatsService = IGraphicsStats.Stub.asInterface(binder);
- sProcToken = new Binder();
try {
+ IBinder binder = ServiceManager.getService("graphicsstats");
+ if (binder == null) return;
+ IGraphicsStats graphicsStatsService = IGraphicsStats.Stub
+ .asInterface(binder);
+ sProcToken = new Binder();
final String pkg = context.getApplicationInfo().packageName;
- ParcelFileDescriptor pfd = sGraphicsStatsService.
+ ParcelFileDescriptor pfd = graphicsStatsService.
requestBufferForProcess(pkg, sProcToken);
nSetProcessStatsBuffer(renderProxy, pfd.getFd());
pfd.close();
- } catch (Exception e) {
- Log.w(LOG_TAG, "Could not acquire gfx stats buffer", e);
+ } catch (Throwable t) {
+ Log.w(LOG_TAG, "Could not acquire gfx stats buffer", t);
}
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 23da6d2..63dd492 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -12288,6 +12288,7 @@
mRenderNode.offsetTopAndBottom(offset);
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
+ invalidateParentIfNeededAndWasQuickRejected();
} else {
if (!matrixIsIdentity) {
invalidateViewProperty(false, true);
@@ -12335,6 +12336,7 @@
mRenderNode.offsetLeftAndRight(offset);
if (isHardwareAccelerated()) {
invalidateViewProperty(false, false);
+ invalidateParentIfNeededAndWasQuickRejected();
} else {
if (!matrixIsIdentity) {
invalidateViewProperty(false, true);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index b53d93c..6dca26b 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3236,13 +3236,15 @@
for (int i = 0; i < getChildCount(); i++) {
View c = getChildAt(i);
- Insets insets = c.getOpticalInsets();
+ if (c.getVisibility() != View.GONE) {
+ Insets insets = c.getOpticalInsets();
- drawRect(canvas, paint,
- c.getLeft() + insets.left,
- c.getTop() + insets.top,
- c.getRight() - insets.right - 1,
- c.getBottom() - insets.bottom - 1);
+ drawRect(canvas, paint,
+ c.getLeft() + insets.left,
+ c.getTop() + insets.top,
+ c.getRight() - insets.right - 1,
+ c.getBottom() - insets.bottom - 1);
+ }
}
}
@@ -3263,8 +3265,10 @@
int lineWidth = dipsToPixels(1);
for (int i = 0; i < getChildCount(); i++) {
View c = getChildAt(i);
- drawRectCorners(canvas, c.getLeft(), c.getTop(), c.getRight(), c.getBottom(),
- paint, lineLength, lineWidth);
+ if (c.getVisibility() != View.GONE) {
+ drawRectCorners(canvas, c.getLeft(), c.getTop(), c.getRight(), c.getBottom(),
+ paint, lineLength, lineWidth);
+ }
}
}
}
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 8b57d96..6d0d788 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -531,7 +531,8 @@
collectViewAttributes();
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(),
- mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mInputChannel);
+ mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
+ mAttachInfo.mOutsets, mInputChannel);
} catch (RemoteException e) {
mAdded = false;
mView = null;
@@ -1590,6 +1591,7 @@
+ " content=" + mPendingContentInsets.toShortString()
+ " visible=" + mPendingVisibleInsets.toShortString()
+ " visible=" + mPendingStableInsets.toShortString()
+ + " outsets=" + mPendingOutsets.toShortString()
+ " surface=" + mSurface);
if (mPendingConfiguration.seq != 0) {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index ca5f5ad..64210ea 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -879,13 +879,15 @@
* be correct.
*
* @param attrs The LayoutParams of the window.
+ * @param rotation Rotation of the display.
* @param outContentInsets The areas covered by system windows, expressed as positive insets.
* @param outStableInsets The areas covered by stable system windows irrespective of their
* current visibility. Expressed as positive insets.
+ * @param outOutsets The areas that are not real display, but we would like to treat as such.
*
*/
- public void getInsetHintLw(WindowManager.LayoutParams attrs, Rect outContentInsets,
- Rect outStableInsets);
+ public void getInsetHintLw(WindowManager.LayoutParams attrs, int rotation,
+ Rect outContentInsets, Rect outStableInsets, Rect outOutsets);
/**
* Called when layout of the windows is finished. After this function has
@@ -913,12 +915,13 @@
/**
* Called following layout of all window to apply policy to each window.
- *
+ *
* @param win The window being positioned.
- * @param attrs The LayoutParams of the window.
+ * @param attrs The LayoutParams of the window.
+ * @param attached For sub-windows, the window it is attached to. Otherwise null.
*/
public void applyPostLayoutPolicyLw(WindowState win,
- WindowManager.LayoutParams attrs);
+ WindowManager.LayoutParams attrs, WindowState attached);
/**
* Called following layout of all windows and after policy has been applied
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 87706ef..1464bb5 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -689,6 +689,11 @@
public static final int TYPE_VIEW_CONTEXT_CLICKED = 0x00800000;
/**
+ * Represents the event of the assistant currently reading the users screen context.
+ */
+ public static final int TYPE_ASSIST_READING_CONTEXT = 0x01000000;
+
+ /**
* Change type for {@link #TYPE_WINDOW_CONTENT_CHANGED} event:
* The type of change is not defined.
*/
@@ -1414,6 +1419,13 @@
builder.append("TYPE_VIEW_CONTEXT_CLICKED");
eventTypeCount++;
}
+ case TYPE_ASSIST_READING_CONTEXT: {
+ if (eventTypeCount > 0) {
+ builder.append(", ");
+ }
+ builder.append("TYPE_ASSIST_READING_CONTEXT");
+ eventTypeCount++;
+ }
break;
}
}
diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java
index 770077d..602e1ab 100644
--- a/core/java/android/widget/CompoundButton.java
+++ b/core/java/android/widget/CompoundButton.java
@@ -245,6 +245,17 @@
}
/**
+ * @hide
+ */
+ @Override
+ public void onResolveDrawables(@ResolvedLayoutDir int layoutDirection) {
+ super.onResolveDrawables(layoutDirection);
+ if (mButtonDrawable != null) {
+ mButtonDrawable.setLayoutDirection(layoutDirection);
+ }
+ }
+
+ /**
* @return the drawable used as the compound button image
* @see #setButtonDrawable(Drawable)
* @see #setButtonDrawable(int)
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index e0b2395..a1582f2 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -423,14 +423,14 @@
*
* <p class="note">This does Bitmap reading and decoding on the UI
* thread, which can cause a latency hiccup. If that's a concern,
- * consider using {@link #setImageDrawable(android.graphics.drawable.Drawable)} or
+ * consider using {@link #setImageDrawable(Drawable)} or
* {@link #setImageBitmap(android.graphics.Bitmap)} and
* {@link android.graphics.BitmapFactory} instead.</p>
*
- * @param uri The Uri of an image
+ * @param uri the Uri of an image, or {@code null} to clear the content
*/
@android.view.RemotableViewMethod
- public void setImageURI(Uri uri) {
+ public void setImageURI(@Nullable Uri uri) {
if (mResource != 0 ||
(mUri != uri &&
(uri == null || mUri == null || !uri.equals(mUri)))) {
@@ -453,9 +453,10 @@
/**
* Sets a drawable as the content of this ImageView.
*
- * @param drawable The drawable to set
+ * @param drawable the Drawable to set, or {@code null} to clear the
+ * content
*/
- public void setImageDrawable(Drawable drawable) {
+ public void setImageDrawable(@Nullable Drawable drawable) {
if (mDrawable != drawable) {
mResource = 0;
mUri = null;
@@ -475,16 +476,19 @@
/**
* Sets the content of this ImageView to the specified Icon.
*
- * <p class="note">Depending on the Icon type, this may do Bitmap reading and decoding
- * on the UI thread, which can cause UI jank. If that's a concern, consider using
+ * <p class="note">Depending on the Icon type, this may do Bitmap reading
+ * and decoding on the UI thread, which can cause UI jank. If that's a
+ * concern, consider using
* {@link Icon#loadDrawableAsync(Context, Icon.OnDrawableLoadedListener, Handler)}
- * and then {@link #setImageDrawable(android.graphics.drawable.Drawable)} instead.</p>
+ * and then {@link #setImageDrawable(android.graphics.drawable.Drawable)}
+ * instead.</p>
*
- * @param icon an Icon holding the desired image
+ * @param icon an Icon holding the desired image, or {@code null} to clear
+ * the content
*/
@android.view.RemotableViewMethod
- public void setImageIcon(Icon icon) {
- setImageDrawable(icon.loadDrawable(mContext));
+ public void setImageIcon(@Nullable Icon icon) {
+ setImageDrawable(icon == null ? null : icon.loadDrawable(mContext));
}
/**
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 4dcc242..b5e08ca 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -659,7 +659,8 @@
*/
private boolean allViewsAreGoneBefore(int childIndex) {
for (int i = childIndex - 1; i >= 0; i--) {
- if (getVirtualChildAt(i).getVisibility() != GONE) {
+ View child = getVirtualChildAt(i);
+ if (child != null && child.getVisibility() != GONE) {
return false;
}
}
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index fd0395a..9568492 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -1143,8 +1143,8 @@
// Sets up mListPadding
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- int widthMode = MeasureSpec.getMode(widthMeasureSpec);
- int heightMode = MeasureSpec.getMode(heightMeasureSpec);
+ final int widthMode = MeasureSpec.getMode(widthMeasureSpec);
+ final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
@@ -1153,10 +1153,12 @@
int childState = 0;
mItemCount = mAdapter == null ? 0 : mAdapter.getCount();
- if (mItemCount > 0 && (widthMode == MeasureSpec.UNSPECIFIED ||
- heightMode == MeasureSpec.UNSPECIFIED)) {
+ if (mItemCount > 0 && (widthMode == MeasureSpec.UNSPECIFIED
+ || heightMode == MeasureSpec.UNSPECIFIED)) {
final View child = obtainView(0, mIsScrap);
+ // Lay out child directly against the parent measure spec so that
+ // we can obtain exected minimum width and height.
measureScrapChild(child, 0, widthMeasureSpec, heightSize);
childWidth = child.getMeasuredWidth();
@@ -1173,7 +1175,7 @@
widthSize = mListPadding.left + mListPadding.right + childWidth +
getVerticalScrollbarWidth();
} else {
- widthSize |= (childState&MEASURED_STATE_MASK);
+ widthSize |= (childState & MEASURED_STATE_MASK);
}
if (heightMode == MeasureSpec.UNSPECIFIED) {
@@ -1186,8 +1188,9 @@
heightSize = measureHeightOfChildren(widthMeasureSpec, 0, NO_POSITION, heightSize, -1);
}
- setMeasuredDimension(widthSize , heightSize);
- mWidthMeasureSpec = widthMeasureSpec;
+ setMeasuredDimension(widthSize, heightSize);
+
+ mWidthMeasureSpec = widthMeasureSpec;
}
private void measureScrapChild(View child, int position, int widthMeasureSpec, int heightHint) {
@@ -1199,16 +1202,20 @@
p.viewType = mAdapter.getItemViewType(position);
p.forceAdd = true;
- int childWidthSpec = ViewGroup.getChildMeasureSpec(widthMeasureSpec,
+ final int childWidthSpec = ViewGroup.getChildMeasureSpec(widthMeasureSpec,
mListPadding.left + mListPadding.right, p.width);
- int lpHeight = p.height;
- int childHeightSpec;
+ final int lpHeight = p.height;
+ final int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
childHeightSpec = MeasureSpec.makeSafeMeasureSpec(heightHint, MeasureSpec.UNSPECIFIED);
}
child.measure(childWidthSpec, childHeightSpec);
+
+ // Since this view was measured directly aginst the parent measure
+ // spec, we must measure it again before reuse.
+ child.forceLayout();
}
/**
@@ -1248,8 +1255,7 @@
* @return The height of this ListView with the given children.
*/
final int measureHeightOfChildren(int widthMeasureSpec, int startPosition, int endPosition,
- final int maxHeight, int disallowPartialChildPosition) {
-
+ int maxHeight, int disallowPartialChildPosition) {
final ListAdapter adapter = mAdapter;
if (adapter == null) {
return mListPadding.top + mListPadding.bottom;
@@ -1907,8 +1913,8 @@
}
p.viewType = mAdapter.getItemViewType(position);
- if ((recycled && !p.forceAdd) || (p.recycledHeaderFooter &&
- p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)) {
+ if ((recycled && !p.forceAdd) || (p.recycledHeaderFooter
+ && p.viewType == AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER)) {
attachViewToParent(child, flowDown ? -1 : 0, p);
} else {
p.forceAdd = false;
@@ -1936,10 +1942,10 @@
}
if (needToMeasure) {
- int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
+ final int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec,
mListPadding.left + mListPadding.right, p.width);
- int lpHeight = p.height;
- int childHeightSpec;
+ final int lpHeight = p.height;
+ final int childHeightSpec;
if (lpHeight > 0) {
childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
} else {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 7b58b5b..422511f 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -8837,12 +8837,10 @@
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH
| AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE);
+ info.addAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
}
if (isFocused()) {
- if (canSelectText()) {
- info.addAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
- }
if (canCopy()) {
info.addAction(AccessibilityNodeInfo.ACTION_COPY);
}
@@ -8931,30 +8929,28 @@
}
} return false;
case AccessibilityNodeInfo.ACTION_SET_SELECTION: {
- if (isFocused() && canSelectText()) {
- ensureIterableTextForAccessibilitySelectable();
- CharSequence text = getIterableTextForAccessibility();
- if (text == null) {
- return false;
+ ensureIterableTextForAccessibilitySelectable();
+ CharSequence text = getIterableTextForAccessibility();
+ if (text == null) {
+ return false;
+ }
+ final int start = (arguments != null) ? arguments.getInt(
+ AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, -1) : -1;
+ final int end = (arguments != null) ? arguments.getInt(
+ AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, -1) : -1;
+ if ((getSelectionStart() != start || getSelectionEnd() != end)) {
+ // No arguments clears the selection.
+ if (start == end && end == -1) {
+ Selection.removeSelection((Spannable) text);
+ return true;
}
- final int start = (arguments != null) ? arguments.getInt(
- AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT, -1) : -1;
- final int end = (arguments != null) ? arguments.getInt(
- AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT, -1) : -1;
- if ((getSelectionStart() != start || getSelectionEnd() != end)) {
- // No arguments clears the selection.
- if (start == end && end == -1) {
- Selection.removeSelection((Spannable) text);
- return true;
+ if (start >= 0 && start <= end && end <= text.length()) {
+ Selection.setSelection((Spannable) text, start, end);
+ // Make sure selection mode is engaged.
+ if (mEditor != null) {
+ mEditor.startSelectionActionMode();
}
- if (start >= 0 && start <= end && end <= text.length()) {
- Selection.setSelection((Spannable) text, start, end);
- // Make sure selection mode is engaged.
- if (mEditor != null) {
- mEditor.startSelectionActionMode();
- }
- return true;
- }
+ return true;
}
}
} return false;
diff --git a/core/java/com/android/internal/inputmethod/InputMethodUtils.java b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
index ac17cbe..742173b 100644
--- a/core/java/com/android/internal/inputmethod/InputMethodUtils.java
+++ b/core/java/com/android/internal/inputmethod/InputMethodUtils.java
@@ -1302,4 +1302,131 @@
return enabledInputMethodAndSubtypes;
}
}
+
+ // For spell checker service manager.
+ // TODO: Should we have TextServicesUtils.java?
+ private static final Locale LOCALE_EN_US = new Locale("en", "US");
+ private static final Locale LOCALE_EN_GB = new Locale("en", "GB");
+
+ /**
+ * Returns a list of {@link Locale} in the order of appropriateness for the default spell
+ * checker service.
+ *
+ * <p>If the system language is English, and the region is also explicitly specified in the
+ * system locale, the following fallback order will be applied.</p>
+ * <ul>
+ * <li>(system-locale-language, system-locale-region, system-locale-variant) (if exists)</li>
+ * <li>(system-locale-language, system-locale-region)</li>
+ * <li>("en", "US")</li>
+ * <li>("en", "GB")</li>
+ * <li>("en")</li>
+ * </ul>
+ *
+ * <p>If the system language is English, but no region is specified in the system locale,
+ * the following fallback order will be applied.</p>
+ * <ul>
+ * <li>("en")</li>
+ * <li>("en", "US")</li>
+ * <li>("en", "GB")</li>
+ * </ul>
+ *
+ * <p>If the system language is not English, the following fallback order will be applied.</p>
+ * <ul>
+ * <li>(system-locale-language, system-locale-region, system-locale-variant) (if exists)</li>
+ * <li>(system-locale-language, system-locale-region) (if exists)</li>
+ * <li>(system-locale-language) (if exists)</li>
+ * <li>("en", "US")</li>
+ * <li>("en", "GB")</li>
+ * <li>("en")</li>
+ * </ul>
+ *
+ * @param systemLocale the current system locale to be taken into consideration.
+ * @return a list of {@link Locale}. The first one is considered to be most appropriate.
+ */
+ @VisibleForTesting
+ public static ArrayList<Locale> getSuitableLocalesForSpellChecker(
+ @Nullable final Locale systemLocale) {
+ final Locale systemLocaleLanguageCountryVariant;
+ final Locale systemLocaleLanguageCountry;
+ final Locale systemLocaleLanguage;
+ if (systemLocale != null) {
+ final String language = systemLocale.getLanguage();
+ final boolean hasLanguage = !TextUtils.isEmpty(language);
+ final String country = systemLocale.getCountry();
+ final boolean hasCountry = !TextUtils.isEmpty(country);
+ final String variant = systemLocale.getVariant();
+ final boolean hasVariant = !TextUtils.isEmpty(variant);
+ if (hasLanguage && hasCountry && hasVariant) {
+ systemLocaleLanguageCountryVariant = new Locale(language, country, variant);
+ } else {
+ systemLocaleLanguageCountryVariant = null;
+ }
+ if (hasLanguage && hasCountry) {
+ systemLocaleLanguageCountry = new Locale(language, country);
+ } else {
+ systemLocaleLanguageCountry = null;
+ }
+ if (hasLanguage) {
+ systemLocaleLanguage = new Locale(language);
+ } else {
+ systemLocaleLanguage = null;
+ }
+ } else {
+ systemLocaleLanguageCountryVariant = null;
+ systemLocaleLanguageCountry = null;
+ systemLocaleLanguage = null;
+ }
+
+ final ArrayList<Locale> locales = new ArrayList<>();
+ if (systemLocaleLanguageCountryVariant != null) {
+ locales.add(systemLocaleLanguageCountryVariant);
+ }
+
+ if (Locale.ENGLISH.equals(systemLocaleLanguage)) {
+ if (systemLocaleLanguageCountry != null) {
+ // If the system language is English, and the region is also explicitly specified,
+ // following fallback order will be applied.
+ // - systemLocaleLanguageCountry [if systemLocaleLanguageCountry is non-null]
+ // - en_US [if systemLocaleLanguageCountry is non-null and not en_US]
+ // - en_GB [if systemLocaleLanguageCountry is non-null and not en_GB]
+ // - en
+ if (systemLocaleLanguageCountry != null) {
+ locales.add(systemLocaleLanguageCountry);
+ }
+ if (!LOCALE_EN_US.equals(systemLocaleLanguageCountry)) {
+ locales.add(LOCALE_EN_US);
+ }
+ if (!LOCALE_EN_GB.equals(systemLocaleLanguageCountry)) {
+ locales.add(LOCALE_EN_GB);
+ }
+ locales.add(Locale.ENGLISH);
+ } else {
+ // If the system language is English, but no region is specified, following
+ // fallback order will be applied.
+ // - en
+ // - en_US
+ // - en_GB
+ locales.add(Locale.ENGLISH);
+ locales.add(LOCALE_EN_US);
+ locales.add(LOCALE_EN_GB);
+ }
+ } else {
+ // If the system language is not English, the fallback order will be
+ // - systemLocaleLanguageCountry [if non-null]
+ // - systemLocaleLanguage [if non-null]
+ // - en_US
+ // - en_GB
+ // - en
+ if (systemLocaleLanguageCountry != null) {
+ locales.add(systemLocaleLanguageCountry);
+ }
+ if (systemLocaleLanguage != null) {
+ locales.add(systemLocaleLanguage);
+ }
+ locales.add(LOCALE_EN_US);
+ locales.add(LOCALE_EN_GB);
+ locales.add(Locale.ENGLISH);
+ }
+ return locales;
+ }
}
diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java
index b78eca7..263e522 100644
--- a/core/java/com/android/internal/logging/MetricsLogger.java
+++ b/core/java/com/android/internal/logging/MetricsLogger.java
@@ -40,6 +40,10 @@
public static final int ACTION_BRIGHTNESS = 218;
public static final int ACTION_BRIGHTNESS_AUTO = 219;
public static final int BRIGHTNESS_DIALOG = 220;
+ public static final int SYSTEM_ALERT_WINDOW_APPS = 221;
+ public static final int DREAMING = 222;
+ public static final int DOZING = 223;
+
// Temporary constants go here, to await migration to MetricsConstants.
public static void visible(Context context, int category) throws IllegalArgumentException {
diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java
index 6a85afb..264b8c1 100644
--- a/core/java/com/android/internal/os/BatteryStatsHelper.java
+++ b/core/java/com/android/internal/os/BatteryStatsHelper.java
@@ -480,6 +480,7 @@
final boolean forAllUsers = (asUsers.get(UserHandle.USER_ALL) != null);
mStatsPeriod = mTypeBatteryRealtime;
+ BatterySipper osSipper = null;
final SparseArray<? extends Uid> uidStats = mStats.getUidStats();
final int NU = uidStats.size();
for (int iu = 0; iu < NU; iu++) {
@@ -526,15 +527,19 @@
}
if (uid == 0) {
- // The device has probably been awake for longer than the screen on
- // time and application wake lock time would account for. Assign
- // this remainder to the OS, if possible.
- mWakelockPowerCalculator.calculateRemaining(app, mStats, mRawRealtime,
- mRawUptime, mStatsType);
- app.sumPower();
+ osSipper = app;
}
}
}
+
+ if (osSipper != null) {
+ // The device has probably been awake for longer than the screen on
+ // time and application wake lock time would account for. Assign
+ // this remainder to the OS, if possible.
+ mWakelockPowerCalculator.calculateRemaining(osSipper, mStats, mRawRealtime,
+ mRawUptime, mStatsType);
+ osSipper.sumPower();
+ }
}
private void addPhoneUsage() {
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 1bd821d..8b4b994 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -106,7 +106,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 129 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 130 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -4386,6 +4386,7 @@
LongSamplingCounter mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase);
LongSamplingCounter mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase);
+ LongSamplingCounter mCpuPower = new LongSamplingCounter(mOnBatteryTimeBase);
LongSamplingCounter[] mSpeedBins;
/**
@@ -4978,6 +4979,11 @@
}
@Override
+ public long getCpuPowerMaUs(int which) {
+ return mCpuPower.getCountLocked(which);
+ }
+
+ @Override
public long getTimeAtCpuSpeed(int step, int which) {
if (step >= 0 && step < mSpeedBins.length) {
if (mSpeedBins[step] != null) {
@@ -5097,6 +5103,7 @@
mUserCpuTime.reset(false);
mSystemCpuTime.reset(false);
+ mCpuPower.reset(false);
for (int i = 0; i < mSpeedBins.length; i++) {
LongSamplingCounter c = mSpeedBins[i];
if (c != null) {
@@ -5248,6 +5255,7 @@
mUserCpuTime.detach();
mSystemCpuTime.detach();
+ mCpuPower.detach();
for (int i = 0; i < mSpeedBins.length; i++) {
LongSamplingCounter c = mSpeedBins[i];
if (c != null) {
@@ -5427,6 +5435,7 @@
mUserCpuTime.writeToParcel(out);
mSystemCpuTime.writeToParcel(out);
+ mCpuPower.writeToParcel(out);
out.writeInt(mSpeedBins.length);
for (int i = 0; i < mSpeedBins.length; i++) {
@@ -5618,6 +5627,7 @@
mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
+ mCpuPower = new LongSamplingCounter(mOnBatteryTimeBase, in);
int bins = in.readInt();
int steps = getCpuSpeedSteps();
@@ -7964,7 +7974,8 @@
mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
new KernelUidCpuTimeReader.Callback() {
@Override
- public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs) {
+ public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs,
+ long powerMaUs) {
final Uid u = getUidStatsLocked(mapUid(uid));
// Accumulate the total system and user time.
@@ -7978,7 +7989,7 @@
TimeUtils.formatDuration(userTimeUs / 1000, sb);
sb.append(" s=");
TimeUtils.formatDuration(systemTimeUs / 1000, sb);
- sb.append("\n");
+ sb.append(" p=").append(powerMaUs / 1000).append("mAms\n");
}
if (numWakelocksF > 0) {
@@ -7994,11 +8005,13 @@
TimeUtils.formatDuration(userTimeUs / 1000, sb);
sb.append(" s=");
TimeUtils.formatDuration(systemTimeUs / 1000, sb);
+ sb.append(" p=").append(powerMaUs / 1000).append("mAms");
Slog.d(TAG, sb.toString());
}
u.mUserCpuTime.addCountLocked(userTimeUs);
u.mSystemCpuTime.addCountLocked(systemTimeUs);
+ u.mCpuPower.addCountLocked(powerMaUs);
// Add the cpu speeds to this UID. These are used as a ratio
// for computing the power this UID used.
@@ -9229,6 +9242,7 @@
u.mUserCpuTime.readSummaryFromParcelLocked(in);
u.mSystemCpuTime.readSummaryFromParcelLocked(in);
+ u.mCpuPower.readSummaryFromParcelLocked(in);
int NSB = in.readInt();
if (NSB > 100) {
@@ -9575,6 +9589,7 @@
u.mUserCpuTime.writeSummaryFromParcelLocked(out);
u.mSystemCpuTime.writeSummaryFromParcelLocked(out);
+ u.mCpuPower.writeSummaryFromParcelLocked(out);
out.writeInt(u.mSpeedBins.length);
for (int i = 0; i < u.mSpeedBins.length; i++) {
diff --git a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
index 41efd2c..e2d366a 100644
--- a/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuTimeReader.java
@@ -30,7 +30,7 @@
/**
* Reads /proc/uid_cputime/show_uid_stat which has the line format:
*
- * uid: user_time_micro_seconds system_time_micro_seconds
+ * uid: user_time_micro_seconds system_time_micro_seconds power_in_milli-amp-micro_seconds
*
* This provides the time a UID's processes spent executing in user-space and kernel-space.
* The file contains a monotonically increasing count of time for a single boot. This class
@@ -46,11 +46,18 @@
* Callback interface for processing each line of the proc file.
*/
public interface Callback {
- void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs);
+ /**
+ * @param uid UID of the app
+ * @param userTimeUs time spent executing in user space in microseconds
+ * @param systemTimeUs time spent executing in kernel space in microseconds
+ * @param powerMaUs power consumed executing, in milli-ampere microseconds
+ */
+ void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs, long powerMaUs);
}
private SparseLongArray mLastUserTimeUs = new SparseLongArray();
private SparseLongArray mLastSystemTimeUs = new SparseLongArray();
+ private SparseLongArray mLastPowerMaUs = new SparseLongArray();
private long mLastTimeReadUs = 0;
/**
@@ -70,50 +77,60 @@
final int uid = Integer.parseInt(uidStr.substring(0, uidStr.length() - 1), 10);
final long userTimeUs = Long.parseLong(splitter.next(), 10);
final long systemTimeUs = Long.parseLong(splitter.next(), 10);
+ final long powerMaUs = Long.parseLong(splitter.next(), 10) / 1000;
if (callback != null) {
long userTimeDeltaUs = userTimeUs;
long systemTimeDeltaUs = systemTimeUs;
+ long powerDeltaMaUs = powerMaUs;
int index = mLastUserTimeUs.indexOfKey(uid);
if (index >= 0) {
userTimeDeltaUs -= mLastUserTimeUs.valueAt(index);
systemTimeDeltaUs -= mLastSystemTimeUs.valueAt(index);
+ powerDeltaMaUs -= mLastPowerMaUs.valueAt(index);
final long timeDiffUs = nowUs - mLastTimeReadUs;
- if (userTimeDeltaUs < 0 || systemTimeDeltaUs < 0 ||
+ if (userTimeDeltaUs < 0 || systemTimeDeltaUs < 0 || powerDeltaMaUs < 0 ||
userTimeDeltaUs > timeDiffUs || systemTimeDeltaUs > timeDiffUs) {
- StringBuilder sb = new StringBuilder("Malformed cpu data!\n");
+ StringBuilder sb = new StringBuilder("Malformed cpu data for UID=");
+ sb.append(uid).append("!\n");
sb.append("Time between reads: ");
TimeUtils.formatDuration(timeDiffUs / 1000, sb);
- sb.append("ms\n");
+ sb.append("\n");
sb.append("Previous times: u=");
TimeUtils.formatDuration(mLastUserTimeUs.valueAt(index) / 1000, sb);
- sb.append("ms s=");
+ sb.append(" s=");
TimeUtils.formatDuration(mLastSystemTimeUs.valueAt(index) / 1000, sb);
- sb.append("ms\n");
+ sb.append(" p=").append(mLastPowerMaUs.valueAt(index) / 1000);
+ sb.append("mAms\n");
+
sb.append("Current times: u=");
TimeUtils.formatDuration(userTimeUs / 1000, sb);
- sb.append("ms s=");
+ sb.append(" s=");
TimeUtils.formatDuration(systemTimeUs / 1000, sb);
- sb.append("ms\n");
- sb.append("Delta for UID=").append(uid).append(": u=");
+ sb.append(" p=").append(powerMaUs / 1000);
+ sb.append("mAms\n");
+ sb.append("Delta: u=");
TimeUtils.formatDuration(userTimeDeltaUs / 1000, sb);
- sb.append("ms s=");
+ sb.append(" s=");
TimeUtils.formatDuration(systemTimeDeltaUs / 1000, sb);
- sb.append("ms");
+ sb.append(" p=").append(powerDeltaMaUs / 1000).append("mAms");
Slog.wtf(TAG, sb.toString());
userTimeDeltaUs = 0;
systemTimeDeltaUs = 0;
+ powerDeltaMaUs = 0;
}
}
- if (userTimeDeltaUs != 0 || systemTimeDeltaUs != 0) {
- callback.onUidCpuTime(uid, userTimeDeltaUs, systemTimeDeltaUs);
+ if (userTimeDeltaUs != 0 || systemTimeDeltaUs != 0 || powerDeltaMaUs != 0) {
+ callback.onUidCpuTime(uid, userTimeDeltaUs, systemTimeDeltaUs,
+ powerDeltaMaUs);
}
}
mLastUserTimeUs.put(uid, userTimeUs);
mLastSystemTimeUs.put(uid, systemTimeUs);
+ mLastPowerMaUs.put(uid, powerMaUs);
}
} catch (IOException e) {
Slog.e(TAG, "Failed to read uid_cputime", e);
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index aea1585..63bfbe5 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -44,7 +44,7 @@
// You need the STATUS_BAR_SERVICE permission
void registerStatusBar(IStatusBar callbacks, out StatusBarIconList iconList,
out int[] switches, out List<IBinder> binders);
- void onPanelRevealed(boolean clearNotificationEffects);
+ void onPanelRevealed(boolean clearNotificationEffects, int numItems);
void onPanelHidden();
// Mark current notifications as "seen" and stop ringing, vibrating, blinking.
void clearNotificationEffects();
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index c869722..b2699f8 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -167,6 +167,7 @@
// Content rect is moving.
mOriginatingView.removeCallbacks(mMovingOff);
mFloatingToolbarVisibilityHelper.setMoving(true);
+ mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
mOriginatingView.postDelayed(mMovingOff, MOVING_HIDE_DELAY);
mFloatingToolbar.setContentRect(mContentRectOnWindow);
@@ -174,9 +175,9 @@
}
} else {
mFloatingToolbarVisibilityHelper.setOutOfBounds(true);
+ mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
mContentRectOnWindow.setEmpty();
}
- mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
mPreviousContentRectOnWindow.set(mContentRectOnWindow);
}
diff --git a/core/java/com/android/internal/view/menu/MenuItemImpl.java b/core/java/com/android/internal/view/menu/MenuItemImpl.java
index 3b1f20d..08d4e86 100644
--- a/core/java/com/android/internal/view/menu/MenuItemImpl.java
+++ b/core/java/com/android/internal/view/menu/MenuItemImpl.java
@@ -593,7 +593,7 @@
public MenuItem setActionProvider(ActionProvider actionProvider) {
if (mActionProvider != null) {
- mActionProvider.setVisibilityListener(null);
+ mActionProvider.reset();
}
mActionView = null;
mActionProvider = actionProvider;
diff --git a/core/java/com/android/internal/widget/DrawingSpace.java b/core/java/com/android/internal/widget/DrawingSpace.java
new file mode 100644
index 0000000..b8222db
--- /dev/null
+++ b/core/java/com/android/internal/widget/DrawingSpace.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+package com.android.internal.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * Implementation of {@link android.widget.Space} that uses normal View drawing
+ * rather than a no-op. Useful for dialogs and other places where the base View
+ * class is too greedy when measured with AT_MOST.
+ */
+public final class DrawingSpace extends View {
+ public DrawingSpace(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public DrawingSpace(Context context, AttributeSet attrs, int defStyleAttr) {
+ this(context, attrs, defStyleAttr, 0);
+ }
+
+ public DrawingSpace(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public DrawingSpace(Context context) {
+ this(context, null);
+ }
+
+ /**
+ * Compare to: {@link View#getDefaultSize(int, int)}
+ * <p>
+ * If mode is AT_MOST, return the child size instead of the parent size
+ * (unless it is too big).
+ */
+ private static int getDefaultSizeNonGreedy(int size, int measureSpec) {
+ int result = size;
+ int specMode = MeasureSpec.getMode(measureSpec);
+ int specSize = MeasureSpec.getSize(measureSpec);
+
+ switch (specMode) {
+ case MeasureSpec.UNSPECIFIED:
+ result = size;
+ break;
+ case MeasureSpec.AT_MOST:
+ result = Math.min(size, specSize);
+ break;
+ case MeasureSpec.EXACTLY:
+ result = specSize;
+ break;
+ }
+ return result;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ setMeasuredDimension(
+ getDefaultSizeNonGreedy(getSuggestedMinimumWidth(), widthMeasureSpec),
+ getDefaultSizeNonGreedy(getSuggestedMinimumHeight(), heightMeasureSpec));
+ }
+}
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 163b8ce..a6e8034 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -1135,7 +1135,7 @@
private final Runnable mCloseOverflow;
private MenuItem.OnMenuItemClickListener mOnMenuItemClickListener;
- private int mOverflowWidth = 0;
+ private int mOverflowWidth;
private int mSuggestedHeight;
/**
@@ -1146,7 +1146,6 @@
*/
public FloatingToolbarOverflowPanel(Context context, Runnable closeOverflow) {
mCloseOverflow = Preconditions.checkNotNull(closeOverflow);
- mSuggestedHeight = getScreenHeight(context);
mContentView = new LinearLayout(context);
mContentView.setOrientation(LinearLayout.VERTICAL);
@@ -1270,7 +1269,8 @@
mListView.setLayoutParams(params);
}
- private int setOverflowWidth() {
+ private void setOverflowWidth() {
+ mOverflowWidth = 0;
for (int i = 0; i < mListView.getAdapter().getCount(); i++) {
MenuItem menuItem = (MenuItem) mListView.getAdapter().getItem(i);
Preconditions.checkNotNull(menuItem);
@@ -1280,7 +1280,6 @@
mOverflowWidth = Math.max(
mListViewItemWidthCalculator.getMeasuredWidth(), mOverflowWidth);
}
- return mOverflowWidth;
}
private ListView createOverflowListView() {
@@ -1505,18 +1504,4 @@
return context.getResources()
.getDimensionPixelSize(R.dimen.floating_toolbar_menu_button_minimum_width);
}
-
- /**
- * Returns the device's screen width.
- */
- private static int getScreenWidth(Context context) {
- return context.getResources().getDisplayMetrics().widthPixels;
- }
-
- /**
- * Returns the device's screen height.
- */
- private static int getScreenHeight(Context context) {
- return context.getResources().getDisplayMetrics().heightPixels;
- }
}
diff --git a/core/java/com/android/internal/widget/ViewPager.java b/core/java/com/android/internal/widget/ViewPager.java
index e76302b..a2c4f6a 100644
--- a/core/java/com/android/internal/widget/ViewPager.java
+++ b/core/java/com/android/internal/widget/ViewPager.java
@@ -85,7 +85,7 @@
*/
public class ViewPager extends ViewGroup {
private static final String TAG = "ViewPager";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final int MAX_SCROLL_X = 2 << 23;
private static final boolean USE_CACHE = false;
diff --git a/core/jni/android_hardware_SensorManager.cpp b/core/jni/android_hardware_SensorManager.cpp
index c9d609c..1356c99 100644
--- a/core/jni/android_hardware_SensorManager.cpp
+++ b/core/jni/android_hardware_SensorManager.cpp
@@ -130,7 +130,6 @@
internedStrings.insert(std::make_pair(string, internedString));
env->DeleteLocalRef(localString);
}
-
return internedString;
}
@@ -182,10 +181,9 @@
return size_t(next) < count ? next : 0;
}
-static int nativeEnableDataInjection(JNIEnv *_env, jclass _this, jlong sensorManager,
- jboolean enable) {
+static jboolean nativeIsDataInjectionEnabled(JNIEnv *_env, jclass _this, jlong sensorManager) {
SensorManager* mgr = reinterpret_cast<SensorManager*>(sensorManager);
- return mgr->enableDataInjection(enable);
+ return mgr->isDataInjectionEnabled();
}
//----------------------------------------------------------------------------
@@ -358,9 +356,9 @@
"(JLandroid/hardware/Sensor;I)I",
(void*)nativeGetNextSensor },
- {"nativeEnableDataInjection",
- "(JZ)I",
- (void*)nativeEnableDataInjection },
+ {"nativeIsDataInjectionEnabled",
+ "(J)Z",
+ (void*)nativeIsDataInjectionEnabled},
};
static JNINativeMethod gBaseEventQueueMethods[] = {
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index e2cfa44..c139cd7 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -697,9 +697,11 @@
} else {
// Heuristic: a payload smaller than this threshold "shouldn't" be too
// big, so it's probably some other, more subtle problem. In practice
- // it nearly always means that the remote process died while the binder
+ // it seems to always mean that the remote process died while the binder
// transaction was already in flight.
- exceptionToThrow = "java/lang/RuntimeException";
+ exceptionToThrow = (canThrowRemoteException)
+ ? "android/os/DeadObjectException"
+ : "java/lang/RuntimeException";
snprintf(msg, sizeof(msg)-1,
"Transaction failed on small parcel; remote process probably died");
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index f7cfe0e..db88962 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -20,9 +20,13 @@
#include <sys/mount.h>
#include <linux/fs.h>
+#include <list>
+#include <string>
+
#include <fcntl.h>
#include <grp.h>
#include <inttypes.h>
+#include <mntent.h>
#include <paths.h>
#include <signal.h>
#include <stdlib.h>
@@ -249,6 +253,34 @@
}
}
+static int UnmountTree(const char* path) {
+ size_t path_len = strlen(path);
+
+ FILE* fp = setmntent("/proc/mounts", "r");
+ if (fp == NULL) {
+ ALOGE("Error opening /proc/mounts: %s", strerror(errno));
+ return -errno;
+ }
+
+ // Some volumes can be stacked on each other, so force unmount in
+ // reverse order to give us the best chance of success.
+ std::list<std::string> toUnmount;
+ mntent* mentry;
+ while ((mentry = getmntent(fp)) != NULL) {
+ if (strncmp(mentry->mnt_dir, path, path_len) == 0) {
+ toUnmount.push_front(std::string(mentry->mnt_dir));
+ }
+ }
+ endmntent(fp);
+
+ for (auto path : toUnmount) {
+ if (umount2(path.c_str(), MNT_DETACH)) {
+ ALOGW("Failed to unmount %s: %s", path.c_str(), strerror(errno));
+ }
+ }
+ return 0;
+}
+
// Create a private mount namespace and bind mount appropriate emulated
// storage for the given user.
static bool MountEmulatedStorage(uid_t uid, jint mount_mode,
@@ -262,7 +294,7 @@
}
// Unmount storage provided by root namespace and mount requested view
- umount2("/storage", MNT_FORCE);
+ UnmountTree("/storage");
String8 storageSource;
if (mount_mode == MOUNT_EXTERNAL_DEFAULT) {
@@ -281,7 +313,7 @@
return false;
}
- // Mount user-specific symlink helpers into place
+ // Mount user-specific symlink helper into place
userid_t user_id = multiuser_get_user_id(uid);
const String8 userSource(String8::format("/mnt/user/%d", user_id));
if (fs_prepare_dir(userSource.string(), 0751, 0, 0) == -1) {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index bada791..7f61a04 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1024,15 +1024,6 @@
<!-- ================================== -->
<eat-comment />
- <!-- Permissions for direct access to the accounts managed
- by the Account Manager. -->
- <permission-group android:name="android.permission-group.ACCOUNTS"
- android:label="@string/permgrouplab_accounts"
- android:icon="@drawable/perm_group_accounts"
- android:description="@string/permgroupdesc_accounts"
- android:permissionGroupFlags="personalInfo"
- android:priority="1000" />
-
<!-- Allows access to the list of accounts in the Accounts Service.
<p>Protection level: normal
-->
@@ -1045,7 +1036,6 @@
<!-- @SystemApi Allows applications to call into AccountAuthenticators.
<p>Not for use by third-party applications. -->
<permission android:name="android.permission.ACCOUNT_MANAGER"
- android:permissionGroup="android.permission-group.ACCOUNTS"
android:protectionLevel="signature" />
<!-- ================================== -->
@@ -1414,7 +1404,7 @@
<permission android:name="android.permission.SYSTEM_ALERT_WINDOW"
android:label="@string/permlab_systemAlertWindow"
android:description="@string/permdesc_systemAlertWindow"
- android:protectionLevel="dangerous" />
+ android:protectionLevel="signature|system|appop" />
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
diff --git a/core/res/res/drawable-hdpi/perm_group_accounts.png b/core/res/res/drawable-hdpi/perm_group_accounts.png
deleted file mode 100644
index 5ac28e7..0000000
--- a/core/res/res/drawable-hdpi/perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/perm_group_accounts.png b/core/res/res/drawable-mdpi/perm_group_accounts.png
deleted file mode 100644
index ce4e683..0000000
--- a/core/res/res/drawable-mdpi/perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/perm_group_accounts.png b/core/res/res/drawable-xhdpi/perm_group_accounts.png
deleted file mode 100644
index ca622e9..0000000
--- a/core/res/res/drawable-xhdpi/perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_perm_group_accounts.png b/core/res/res/drawable-xxhdpi/ic_perm_group_accounts.png
deleted file mode 100644
index f30fcd4c..0000000
--- a/core/res/res/drawable-xxhdpi/ic_perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_perm_group_storage.png b/core/res/res/drawable-xxhdpi/ic_perm_group_storage.png
deleted file mode 100644
index d3937db..0000000
--- a/core/res/res/drawable-xxhdpi/ic_perm_group_storage.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/perm_group_accounts.png b/core/res/res/drawable-xxhdpi/perm_group_accounts.png
deleted file mode 100644
index 2fc3baa..0000000
--- a/core/res/res/drawable-xxhdpi/perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/perm_group_accounts.png b/core/res/res/drawable-xxxhdpi/perm_group_accounts.png
deleted file mode 100644
index 1d9db83..0000000
--- a/core/res/res/drawable-xxxhdpi/perm_group_accounts.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable/perm_group_storage.xml b/core/res/res/drawable/perm_group_storage.xml
index 65da1f1..62131da 100644
--- a/core/res/res/drawable/perm_group_storage.xml
+++ b/core/res/res/drawable/perm_group_storage.xml
@@ -16,9 +16,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
- android:viewportWidth="48.0"
- android:viewportHeight="48.0">
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
<path
- android:pathData="M20,8H8c-2.2,0 -4,1.8 -4,4l0,24c0,2.2 1.8,4 4,4h32c2.2,0 4,-1.8 4,-4V16c0,-2.2 -1.8,-4 -4,-4H24L20,8z"
- android:fillColor="#FFFFFF"/>
+ android:fillColor="#FF000000"
+ android:pathData="M0,0h48v48H0z"/>
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M27,9c2.2,0 4,-1.8 4,-4s-1.8,-4 -4,-4 -4,1.8 -4,4 1.8,4 4,4zm-7.2,27.8l1.9,-8.8 4.3,4v12h4V28.9l-4.1,-4.1 1.2,-6C29.7,22 33.6,24 38,24v-4c-3.7,0 -6.9,-2 -8.7,-4.9l-1.9,-3.2c-0.7,-1.2 -2,-1.9 -3.4,-1.9 -0.5,0 -1,0.1 -1.5,0.3L12,14.6V24h4v-6.7l3.5,-1.4L16.4,32l-9.8,-1.9 -0.8,3.9s14,2.7 14,2.8z"/>
</vector>
diff --git a/core/res/res/layout-land/time_picker_material.xml b/core/res/res/layout-land/time_picker_material.xml
index 2fa2054..2473e87 100644
--- a/core/res/res/layout-land/time_picker_material.xml
+++ b/core/res/res/layout-land/time_picker_material.xml
@@ -21,7 +21,7 @@
android:layoutDirection="ltr">
<!-- Provides a background for the time layout that extends into the button bar area. -->
- <View
+ <com.android.internal.widget.DrawingSpace
android:id="@+id/time_header"
android:layout_width="0dp"
android:layout_height="wrap_content"
diff --git a/core/res/res/layout/date_picker_view_animator_material.xml b/core/res/res/layout/date_picker_view_animator_material.xml
index e863b28..04647b1 100644
--- a/core/res/res/layout/date_picker_view_animator_material.xml
+++ b/core/res/res/layout/date_picker_view_animator_material.xml
@@ -32,6 +32,7 @@
<android.widget.YearPickerView
android:id="@+id/date_picker_year_picker"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent"
+ android:scrollIndicators="bottom" />
</com.android.internal.widget.DialogViewAnimator>
diff --git a/core/res/res/layout/year_label_text_view.xml b/core/res/res/layout/year_label_text_view.xml
index 6240c4b..3ea719d 100644
--- a/core/res/res/layout/year_label_text_view.xml
+++ b/core/res/res/layout/year_label_text_view.xml
@@ -14,7 +14,7 @@
limitations under the License.
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/month_text_view"
+ android:id="@id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index d3e1275..0238fb7 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Laat die program toe om MMS-boodskappe te ontvang en te verwerk. Dit beteken dat die program boodskappe wat na jou toestel gestuur is kan monitor of uitvee, sonder dat jy dit gesien het."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lees seluitsending-boodskappe"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Laat die program toe om seluitsending-boodskappe te lees wat deur jou toestel ontvang word. Seluitsending-waarskuwings word in sommige plekke afgelewer om jou van noodsituasies te waarsku. Kwaadwillige programme mag inmeng met die prestasie of die werking van jou toestel wanneer \'n noodgeval se seluitsending ontvang word."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Jou rekeninge"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Kry toegang tot beskikbare rekeninge."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lees ingetekende nuus"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Laat die program toe om details oor die tans gesinkroniseerde strome te kry."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"stuur en bekyk SMS-boodskappe"</string>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 3ab18fa..bb03f82 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ስዕሎች ያንሱ እና ቪዲዮ ይቅረጹ"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ስልክ"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"የስልክ ጥሪዎች ያድርጉ እና ያስተዳድሩ"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"የሰውነት ዳሳሾች"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ስለአስፈላጊ ምልክቶችዎ ያሉ የዳሳሽ ውሂብ ይድረሱ"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"የመስኮት ይዘት ሰርስረው ያውጡ"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"መስተጋበር የሚፈጥሩት የመስኮት ይዘት ይመርምሩ።"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"መተግበሪያው የኤም.ኤም.ኤስ. መልዕክቶችን እንዲያነብ እና እንዲያካሂድ ይፈቅዳል። ይህ ማለት መተግበሪያው ወደ መሳሪያህ የተላኩ መልዕክቶችን ላንተ ሳያሳይህ ሊቆጣጠር ወይም ሊሰርዝ ይችላል።"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"የህዋስ ስርጭት መልዕክቶችን አንብብ"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"መሣሪያህ የህዋስ ስርጭት መልዕክቶች ሲቀበል መተግበሪያው እንዲያነበው ይፈቅድለታል። የህዋስ ስርጭት ማንቂያዎች አስቸኳይ ሁኔታዎች ሲያጋጥሙ አንዳንድ አካባቢዎች ላይ የሚላኩ ናቸው። የህዋስ ስርጭት ሲደርስ ተንኮል አዘል መተግበሪያዎች በመሣሪያህ አፈጻጸም ወይም አሰራር ላይ ጣልቃ ሊገቡ ይችላሉ።"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"መለያዎችዎ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">" ለተገኙት መለያዎች ድረስ"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"የምዝገባ መግቦች አንበብ"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ስለ አሁኑ ጊዜ አስምር ምላሾች ዝርዝሮች ለማግኘት ለመተግበሪያው ይፈቅዳሉ።"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"የኤስኤምኤስ መልዕክቶችን ይላኩና ይመልከቱ"</string>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 23f802b..34fbe69 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -274,8 +274,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"للسماح للتطبيق بتلقي ومعالجة رسائل الوسائط المتعددة. وهذا يعني أنه يمكن للتطبيق مراقبة الرسائل التي يتم إرسالها لجهازك أو حذفها بدون عرضها لك."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"قراءة رسائل بث الخلية"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"السماح للتطبيق بقراءة رسائل بث الخلية التي يتلقاها هذا الجهاز. يتم تسليم اشعارات بث الخلية في بعض المواقع لتحذيرك من حالات طارئة. يمكن أن تتداخل التطبيقات الضارة مع أداء أو تشغيل الجهاز عندما يتم تلقي بث خلية طارئ."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"حساباتك"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"الوصول إلى الحسابات المتاحة."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"قراءة الخلاصات المشتركة"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"للسماح للتطبيق بالحصول على تفاصيل حول الخلاصات المتزامنة في الوقت الحالي."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"إرسال رسائل قصيرة SMS وعرضها"</string>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index 2871b9c..0afec19 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Tətbiqə MMS mesajlarını qəbul və emal üçün imkan verir. Bu o deməkdir ki, bu tətbiq sizə göstərmədən cihazınıza göndərilən mesajları silə bilər."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"mobil yayım mesajlarını oxuyur"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tətbiqə sizin telefonunuz tərəfindən alınmış yayım mesajlarını oxuma icazəsi verir. Telefon yayımı bəzi məkanlarda olan fövqəladə hadisələrlə bağlı sizi xəbərdar etmək üçün qəbul edilir. Zərərli tətbiqlər fövqəladə mobil yayım qəbul edildiyi zaman telefonunun performansına və əməliyyatına müdaxilə edə bilər."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hesablarınız"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Əlçatımlı hesablara daxil olun."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abunə olunmuş xəbərləri oxuyur"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tətbiqə hazırda sinxron lentlər haqqında ətraflı məlumat almaq üçün imkan verir."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"göndərin və SMS mesajlarına baxın"</string>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 0f39944..7504637 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"правене на снимки и запис на видеоклипове"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"извършване и управление на телефонни обаждания"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Телесни сензори"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"достъп до сензорните данни за жизнените ви показатели"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Извличане на съдържанието от прозореца"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Инспектиране на съдържанието на прозорец, с който взаимодействате."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Разрешава на приложението да получава и обработва MMS съобщения. Това означава, че то може да наблюдава или изтрива изпратените до устройството ви, без да ви ги покаже."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"четене на съобщения с клетъчно излъчване"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Разрешава на приложението да чете съобщения с клетъчно излъчване, получени от устройството ви. Сигналите с клетъчно излъчване се получават на някои местоположения, за да ви предупредят за спешни ситуации. Злонамерените приложения могат да възпрепятстват изпълнението или работата на устройството ви при получаване на такова спешно излъчване."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Вашите профили"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Достъп до наличните профили."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"четене на емисиите с абонамент"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Разрешава на приложението да получи подробности за текущо синхронизираните емисии."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"изпращане и преглед на SMS съобщения"</string>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 3b82a6c..5e33789 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"অ্যাপ্লিকেশানটিকে MMS বার্তা প্রাপ্ত করার এবং প্রক্রিয়া করার অনুমতি দেয়৷ এর মানে হল অ্যাপ্লিকেশানটি আপনার ডিভাইস থেকে পাঠানো বার্তাগুলিকে পর্যবেক্ষণ করতে পারে এবং মুছতে পারে সেগুলিকে আপনাকে না দেখিয়ে৷"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"সেল সম্প্রচার বার্তা পড়ুন"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"আপনার ডিভাইস দ্বারা প্রাপ্ত সেল সম্প্রচার পড়তে অ্যাপ্লিকেশানটিকে অনুমতি দেয়৷ কয়েকটি স্থানে আপনাকে জরুরি অবস্থার জন্য সতর্ক করতে জরুরি সতর্কতাগুলি বিতরণ করা হয়৷ যখন একটি জরুরি সেল সম্প্রচার প্রাপ্ত হয় তখন ক্ষতিকারক অ্যাপ্লিকেশানগুলি আপনার ডিভাইসের কার্য সম্পাদনা বা কার্যকলাপে প্রতিবন্ধকতার সৃষ্টি করতে পারে৷"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"আপনার অ্যাকাউন্টগুলি"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"উপলব্ধ অ্যাকাউন্টগুলি অ্যাক্সেস করে৷"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"গ্রাহক হিসাবে নেওয়া ফিডগুলি পড়ে"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"অ্যাপ্লিকেশানকে বর্তমানে সিঙ্ক করা ফিডগুলির সম্পর্কে বিবরণ পেতে দেয়৷"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS বার্তাগুলি পাঠান এবং দেখুন"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 6fdce0b..45a064f 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permet que l\'aplicació rebi i processi missatges MMS. Això vol dir que l\'aplicació pot controlar o suprimir missatges que s\'han enviat al teu dispositiu sense mostrar-te\'ls."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"llegir missatges de difusió mòbil"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permet que l\'aplicació llegeixi missatges de difusió mòbil rebuts pel dispositiu. Les alertes de difusió mòbil s\'entreguen en algunes ubicacions per alertar de situacions d\'emergència. És possible que les aplicacions malicioses interfereixin en el rendiment o en el funcionament del dispositiu quan es rep una difusió mòbil d\'emergència."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Comptes"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accedeix als comptes disponibles."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"llegir els feeds als quals esteu subscrit"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permet que l\'aplicació obtingui detalls sobre els feeds sincronitzats actualment."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"envia i llegeix missatges SMS"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index d3ddf6a..3e3a41b 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -243,7 +243,7 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"pořizování fotografií a nahrávání videa"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"uskutečňování a správa telefonních hovorů"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"uskutečňování a spravování telefonních hovorů"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Tělesné senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"přístup k údajům snímačů vašich životních funkcí"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načíst obsah okna"</string>
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Umožňuje aplikaci přijmout a zpracovat zprávy MMS. Znamená to, že aplikace může sledovat zprávy odeslané do vašeho zařízení nebo je smazat, aniž by se vám zobrazily."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"čtení zpráv informačních služeb"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Umožňuje aplikaci číst zprávy informačních služeb přijaté ve vašem zařízení. Výstražná upozornění informačních služeb jsou v některých oblastech odesílána za účelem varování před výjimečnými událostmi. Škodlivé aplikace mohou narušit výkon či provoz vašeho zařízení během přijímání zpráv informačních služeb."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vaše účty"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Přístup k dostupným účtům."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čtení zdrojů přihlášených k odběru"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Umožňuje aplikaci získat podrobnosti o aktuálně synchronizovaných zdrojích."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"odesílání a zobrazení zpráv SMS"</string>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 4c1eac0..b8cd9ab 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -229,13 +229,13 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersoner"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"have adgang til dine kontaktpersoner"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Placering"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"adgang til enhedens placering"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"få adgang til enhedens placering"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"have adgang til din kalender"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"Sms"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"Send og se sms-beskeder"</string>
- <string name="permgrouplab_storage" msgid="1971118770546336966">"Lagring"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"Få adgang til billeder, medier og filer på din enhed"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"sende og se sms-beskeder"</string>
+ <string name="permgrouplab_storage" msgid="1971118770546336966">"Lagerplads"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"få adgang til billeder, medier og filer på din enhed"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofon"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"optage lyd"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Tillader, at appen kan modtage og behandle mms-beskeder. Det betyder, at appen kan overvåge eller slette de beskeder, der sendes til din enhed, uden at vise dem til dig."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"læse Cell Broadcast-beskeder"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tillader, at appen læser Cell Broadcast-beskeder, der modtages af din enhed. I nogle områder sendes der Cell Broadcast-beskeder for at advare om nødsituationer. Ondsindede apps kan forstyrre ydelsen eller driften af din enhed, når der modtages en Cell Broadcast-besked om en nødsituation."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Dine konti"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Få adgang til de tilgængelige konti."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"læse feeds, jeg abonnerer på"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tillader, at appen kan hente oplysninger om de feeds, der synkroniseres."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"Send og se sms-beskeder"</string>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index d38cb3f..ba8580f 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Ermöglicht der App, MMS zu empfangen und zu verarbeiten. Das bedeutet, dass die App an Ihr Gerät gesendete Nachrichten überwachen und löschen kann, ohne sie Ihnen anzuzeigen."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Cell Broadcast-Nachrichten lesen"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ermöglicht der App, von Ihrem Gerät empfangene Cell Broadcast-Nachrichten zu lesen. Cell Broadcast-Benachrichtigungen werden an einigen Standorten gesendet, um Sie über Notfallsituationen zu informieren. Schädliche Apps können die Leistung oder den Betrieb Ihres Geräts beeinträchtigen, wenn eine Cell Broadcast-Notfallbenachrichtigung eingeht."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ihre Konten"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Zugriff auf verfügbare Konten"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"Abonnierte Feeds lesen"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ermöglicht der App, Details zu den zurzeit synchronisierten Feeds abzurufen"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS senden und abrufen"</string>
@@ -600,7 +598,7 @@
<string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string>
<string name="postalTypeCustom" msgid="8903206903060479902">"Benutzerdefiniert"</string>
<string name="postalTypeHome" msgid="8165756977184483097">"Privat"</string>
- <string name="postalTypeWork" msgid="5268172772387694495">"Büro"</string>
+ <string name="postalTypeWork" msgid="5268172772387694495">"Geschäftlich"</string>
<string name="postalTypeOther" msgid="2726111966623584341">"Sonstige"</string>
<string name="imTypeCustom" msgid="2074028755527826046">"Benutzerdefiniert"</string>
<string name="imTypeHome" msgid="6241181032954263892">"Privat"</string>
@@ -1061,7 +1059,7 @@
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g> wird vorbereitet"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"Nach Fehlern wird gesucht"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"Neue <xliff:g id="NAME">%s</xliff:g> entdeckt"</string>
- <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Für die Übertragung von Fotos und Medien"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"Zum Übertragen von Fotos und Medien"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g> beschädigt"</string>
<string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g> ist beschädigt. Zum Reparieren tippen."</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"<xliff:g id="NAME">%s</xliff:g> nicht unterstützt"</string>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 2ac26fe..fe6548f 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Επιτρέπει στην εφαρμογή τη λήψη και την επεξεργασία μηνυμάτων MMS. Αυτό σημαίνει ότι η εφαρμογή θα μπορούσε να παρακολουθήσει ή να διαγράψει τα μηνύματα που αποστέλλονται στη συσκευή σας χωρίς αυτά να εμφανιστούν σε εσάς."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Επιτρέπει στην εφαρμογή την ανάγνωση μηνυμάτων που έχουν μεταδοθεί μέσω κινητού τηλεφώνου και έχουν ληφθεί από τη συσκευή σας. Ειδοποιήσεις που μεταδίδονται μέσω κινητού παραδίδονται σε ορισμένες τοποθεσίες για να σας προειδοποιήσουν για καταστάσεις έκτακτης ανάγκης. Κακόβουλες εφαρμογές ενδέχεται να παρεμποδίσουν την απόδοση ή τη λειτουργία της συσκευής σας κατά τη λήψη μετάδοσης μέσω κινητού σχετικά με μια επείγουσα κατάσταση."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Οι λογαριασμοί σας"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Πρόσβαση στους διαθέσιμους λογαριασμούς."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ανάγνωση ροών δεδομένων στις οποίες έχετε εγγραφεί"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Επιτρέπει στην εφαρμογή τη λήψη λεπτομερειών σχετικά με τις τρέχουσες συγχρονισμένες ροές δεδομένων."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"αποστολή και προβολή μηνυμάτων SMS"</string>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 3a1f74c..5cc4688 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Allows the app to receive and process MMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"read mobile broadcast messages"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Allows the app to read mobile broadcast messages received by your device. Cell broadcast alerts are delivered in some locations to warn you of emergency situations. Malicious apps may interfere with the performance or operation of your device when an emergency mobile broadcast is received."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Your accounts"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Access the available accounts."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"read subscribed feeds"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Allows the app to get details about the currently synced feeds."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"send and view SMS messages"</string>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 3a1f74c..5cc4688 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Allows the app to receive and process MMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"read mobile broadcast messages"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Allows the app to read mobile broadcast messages received by your device. Cell broadcast alerts are delivered in some locations to warn you of emergency situations. Malicious apps may interfere with the performance or operation of your device when an emergency mobile broadcast is received."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Your accounts"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Access the available accounts."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"read subscribed feeds"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Allows the app to get details about the currently synced feeds."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"send and view SMS messages"</string>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 3a1f74c..5cc4688 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Allows the app to receive and process MMS messages. This means that the app could monitor or delete messages sent to your device without showing them to you."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"read mobile broadcast messages"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Allows the app to read mobile broadcast messages received by your device. Cell broadcast alerts are delivered in some locations to warn you of emergency situations. Malicious apps may interfere with the performance or operation of your device when an emergency mobile broadcast is received."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Your accounts"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Access the available accounts."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"read subscribed feeds"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Allows the app to get details about the currently synced feeds."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"send and view SMS messages"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 80a7fc3..6c9f722 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tomar fotografías y grabar videos"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Teléfono"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"realizar y administrar llamadas telefónicas"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporales"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acceder a los datos del sensor acerca de tus signos vitales"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar el contenido de las ventanas"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecciona el contenido de la ventana con la que estés interactuando."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que la aplicación reciba y procese mensajes MMS, lo que significa que podría controlar o eliminar mensajes enviados al dispositivo sin mostrártelos."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Leer mensajes de difusión móvil"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite a la aplicación leer los mensajes de difusión móvil que recibe tu dispositivo. En algunas ubicaciones, las alertas de difusión móvil se envían para informar situaciones de emergencia. Las aplicaciones maliciosas pueden afectar el rendimiento o funcionamiento de tu dispositivo cuando se recibe un un mensaje de difusión móvil de emergencia."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Tus cuentas"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Acceder a las cuentas disponibles."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"leer canales suscritos"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite que la aplicación obtenga detalles sobre los feeds sincronizados en este momento."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"enviar y ver mensajes SMS"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 84fecfc..f62b5c5 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que la aplicación reciba y procese mensajes MMS, lo que significa que podría utilizar este permiso para controlar o eliminar mensajes enviados al dispositivo sin mostrárselos al usuario."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"leer mensajes de difusión móvil"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite que la aplicación lea mensajes de difusión móvil que haya recibido el dispositivo. Las alertas de difusión móvil se envían en algunas ubicaciones para avisar de situaciones de emergencia. Es posible que las aplicaciones malintencionadas interfieran en el rendimiento o en el funcionamiento del dispositivo si se recibe una alerta de difusión móvil de emergencia."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Tus cuentas"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Acceder a las cuentas disponibles"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"leer feeds a los que está suscrito el usuario"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite que la aplicación obtenga detalles sobre los feeds sincronizados actualmente."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"enviar y ver mensajes SMS"</string>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index a04244f..9b2b281 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Võimaldab rakendusel vastu võtta ja töödelda multimeediumsõnumeid. See tähendab, et rakendus võib jälgida või kustutada teie seadmele saadetud sõnumeid neid teile näitamata."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"mobiilsidesõnumite lugemine"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Võimaldab rakendusel lugeda seadme vastu võetud mobiilsidesõnumeid. Mobiilsidemärguandeid edastatakse mõnes asukohas eriolukorrast teavitamiseks. Pahatahtlikud rakendused võivad segada seadme toimivust või tööd eriolukorra sõnumi vastuvõtmisel."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Teie kontod"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Juurdepääs saadaolevatele kontodele."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"loe tellitud kanaleid"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Võimaldab rakendusel saada üksikasju praegu sünkroonitavate voogude kohta."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"saata ja vaadata SMS-sõnumeid"</string>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 3a35a07..99f48ad 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS mezuak jasotzeko eta prozesatzeko baimena ematen die aplikazioei. Horrela, aplikazioak gailura bidalitako mezuak kontrola eta ezaba ditzake zuri erakutsi gabe."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"sare mugikor bidezko igorpen-mezuak irakurtzea"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Gailuak jasotako sare mugikor bidezko igorpenen mezuak irakurtzeko baimena ematen die aplikazioei. Sare mugikor bidezko igorpen-alertak kokapen batzuetan ematen dira larrialdi-egoeren berri emateko. Aplikazio gaiztoek gailuaren errendimendua edo funtzionamendua oztopa dezakete larrialdi-igorpen horietako bat jasotzen denean."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Zure kontuak"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Sartu kontu erabilgarrietan."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"irakurri harpidetutako jarioak"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Unean sinkronizatutako jarioei buruzko xehetasunak lortzea baimentzen die aplikazioei."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"bidali eta ikusi SMS mezuak"</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 36ce6e5..c804f40 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"به برنامه اجازه میدهد پیامهای MMS را دریافت و پردازش کند. این یعنی برنامه میتواند پیامهای ارسالی به دستگاه شما را بدون نمایش آنها به شما حذف یا کنترل کند."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"خواندن پیامهای پخش سلولی"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"به برنامه اجازه میدهد پیامهای پخش سلولی دستگاه شما را بخواند. هشدارهای پخش سلولی در برخی از موقعیتهای مکانی تحویل داده میشوند تا موقعیتهای اضطراری را به شما اعلام کنند. وقتی پخش سلولی دریافت میشود، ممکن است برنامههای مخرب در عملکرد یا کارکرد دستگاه شما اختلال ایجاد کنند."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"حسابهای شما"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"به حسابهای موجود دسترسی داشته باشید."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"خواندن فیدهای مشترک"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"به برنامه اجازه میدهد تا جزئیات مربوط به فیدهای همگام شده کنونی را دریافت کند."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"ارسال و نمایش پیامهای پیامک"</string>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 1e19ea6..8ae5092 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Antaa sovelluksen vastaanottaa ja käsitellä multimediaviestejä. Sovellus voi valvoa tai poistaa laitteeseesi lähetettyjä viestejä näyttämättä niitä sinulle."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lue tiedotteita"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Antaa sovelluksen lukea laitteesi vastaanottamia tiedotteita. Tiedotteiden avulla ilmoitetaan hätätilanteista joissakin paikoissa. Haitalliset sovellukset voivat häiritä laitteen toimintaa laitteen vastaanottaessa hätätiedotteen."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Omat tilit"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Käytä saatavilla olevia tilejä."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lukea tilattuja syötteitä"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Antaa sovelluksen saada tietoja tällä hetkellä synkronoitavista syötteistä."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"lähettää ja tarkastella tekstiviestejä"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 3ae8ba9..6296f78 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et filmer des vidéos"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"faire et gérer des appels téléphoniques"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs sur vos signes vitaux"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permet à l\'application de recevoir et de traiter les messages multimédias. Cette autorisation lui donne la possibilité de surveiller ou de supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lire les messages de diffusion cellulaire"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permet à l\'application de lire les messages de diffusion cellulaire que votre appareil reçoit. Dans certaines zones géographiques, des alertes vous sont envoyées afin de vous prévenir en cas de situation d\'urgence. Des applications malveillantes peuvent venir perturber les performances ou le fonctionnement de votre appareil lors de la réception d\'un message de diffusion cellulaire."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vos comptes"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accéder aux comptes disponibles"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lire les flux auxquels vous êtes abonné"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permet à l\'application d\'obtenir des données sur les flux en cours de synchronisation."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"envoyer et afficher des messages texte"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index f4e19fb..8cb6dc1 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"prendre des photos et enregistrer des vidéos"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Téléphone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"effectuer et gérer des appels téléphoniques"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Capteurs corporels"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accéder aux données des capteurs relatives à vos signes vitaux"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Récupérer le contenu d\'une fenêtre"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecter le contenu d\'une fenêtre avec laquelle vous interagissez"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permet à l\'application de recevoir et de traiter les MMS. Cette autorisation lui donne la possibilité de surveiller ou supprimer les messages envoyés à votre appareil sans vous les montrer."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lire les messages reçus via un canal de diffusion cellulaire"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permet à l\'application de lire les messages que votre appareil reçoit via un canal de diffusion cellulaire. Dans certaines zones géographiques, des alertes vous sont envoyées afin de vous prévenir en cas de situation d\'urgence. Les applications malveillantes peuvent venir perturber les performances ou le fonctionnement de votre appareil lorsqu\'un message est reçu via un canal de diffusion cellulaire."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vos comptes"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accéder aux comptes disponibles"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lire les flux auxquels vous êtes abonné"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permet à l\'application d\'obtenir des informations sur les flux en cours de synchronisation."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"envoyer et consulter des SMS"</string>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index f2db033..bd6b4f4 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite á aplicación recibir e procesar mensaxes MMS. Isto significa que a aplicación pode supervisar ou eliminar mensaxes enviadas ao teu dispositivo sen mostrarchas."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ler mensaxes de difusión móbil"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite á aplicación ler mensaxes de difusión móbil recibidas polo teu dispositivo. As alertas de difusión móbil entréganse nalgunhas situacións para avisar de situacións de emerxencia. É posible que aplicacións maliciosas afecten ao rendemento ou funcionamento do teu dispositivo cando se recibe unha difusión móbil de emerxencia."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"As túas contas"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Acceder ás contas dispoñibles."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ler feeds subscritos"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite á aplicación obter detalles acerca dos feeds sincronizados actualmente."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"enviar e consultar mensaxes de SMS"</string>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index 78de77e..2c4bcd7 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"એપ્લિકેશનને MMS સંદેશા પ્રાપ્ત કરવાની અને તેના પર પ્રક્રિયા કરવાની મંજૂરી આપે છે. આનો અર્થ એ કે એપ્લિકેશન તમને દર્શાવ્યા વિના તમારા ઉપકરણ પર મોકલેલ સંદેશાઓનું નિરીક્ષણ કરી શકે છે અથવા કાઢી નાખી શકે છે."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"સેલ બ્રોડકાસ્ટ સંદેશા વાંચો"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"એપ્લિકેશનને તમારા ઉપકરણ દ્વારા પ્રાપ્ત થયેલ સેલ બ્રોડકાસ્ટ સંદેશાને વાંચવાની મંજૂરી આપે છે. સેલ બ્રોડકાસ્ટ ચેતવણીઓ તમને કટોકટીની સ્થિતિઓ અંગે ચેતવવા માટે કેટલાક સ્થાનોમાં વિતરિત થાય છે. જ્યારે કટોકટીનો સેલ બ્રોડકાસ્ટ પ્રાપ્ત થાય ત્યારે દુર્ભાવનાપૂર્ણ એપ્લિકેશન્સ તમારા ઉપકરણના પ્રદર્શન અથવા ઓપરેશનમાં હસ્તક્ષેપ કરી શકે છે."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"તમારા એકાઉન્ટ્સ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ઉપલબ્ધ એકાઉન્ટ્સ ઍક્સેસ કરો."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"સબ્સ્ક્રાઇબ કરેલ ફીડ્સ વાંચો"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"એપ્લિકેશનને હાલમાં સમન્વયિત ફીડ્સ વિશે વિગતો મેળવવાની મંજૂરી આપે છે."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS સંદેશા મોકલો અને જુઓ"</string>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 79f376b..3d4ea0a 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"ऐप्स को MMS संदेशों को प्राप्त और संसाधित करने देता है. इसका अर्थ है कि ऐप्स आपके डिवाइस पर भेजे गए संदेशों की निगरानी आपको दिखाए बिना कर सकता है और उन्हें हटा सकता है."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल प्रसारण संदेश पढ़ें"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ऐप्स को आपके डिवाइस द्वारा प्राप्त सेल प्रसारण संदेशों को पढ़ने देता है. कुछ स्थानों पर आपको आपातकालीन स्थितियों की चेतावनी देने के लिए सेल प्रसारण अलर्ट वितरित किए जाते हैं. आपातकालीन सेल प्रसारण प्राप्त होने पर दुर्भावनापूर्ण ऐप्स आपके डिवाइस के निष्पादन या संचालन में हस्तक्षेप कर सकते हैं."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"आपके खाते"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"उपलब्ध खातों में पहुंचें."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"सदस्यता-प्राप्त फ़ीड पढ़ें"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ऐप्स को वर्तमान में समन्वयित फ़ीड के बारे में विवरण प्राप्त करने देता है."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS संदेश भेजें और देखें"</string>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 3b7e048..6e77186 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -243,8 +243,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"snimati fotografije i videozapise"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"uspostavljati telefonske pozive i upravljati njima"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Biometrijski senzori"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"pristupiti podacima senzora o vašim vitalnim znakovima"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dohvaćati sadržaj prozora"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Istražite sadržaj prozora koji upotrebljavate."</string>
@@ -272,8 +271,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Aplikaciji omogućuje primanje i obradu MMS poruka. To znači da aplikacija može nadzirati ili izbrisati poruke poslane na vaš uređaj, a da vam ih ne prikaže."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"čitaj poruke koje se emitiraju unutar mobilne mreže"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Omogućuje aplikaciji čitanje poruka emitiranih unutar mobilne mreže koje prima vaš uređaj. Upozorenja koja se emitiraju na području mobilne mreže dostavljaju se na nekim lokacijama kako bi upozorila korisnike na hitne situacije. Zlonamjerne aplikacije mogu ometati izvršavanje ili rad vašeg uređaja kada stigne hitno upozorenje koje se emitira unutar mobilne mreže."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vaši računi"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Pristup dostupnim računima."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čitanje pretplaćenih feedova"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Aplikaciji omogućuje dohvaćanje detalja o trenutačno sinkroniziranim feedovima."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"slati i pregledavati SMS poruke"</string>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 9a4bd5a..ad08b75 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Lehetővé teszi az alkalmazás számára, hogy MMS-eket fogadjon és dolgozzon fel. Ez azt jelenti, hogy az alkalmazás megfigyelheti vagy törölheti a beérkező üzeneteket anélkül, hogy Ön látná azokat."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"cellán belüli üzenetek olvasása"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Lehetővé teszi az alkalmazás számára az eszközre érkező cellán belüli üzenetek olvasását. Bizonyos helyeken figyelmeztető üzeneteket kaphat a cellán belül a vészhelyzetekről. A rosszindulatú alkalmazások befolyásolhatják az eszköz teljesítményét vagy működését vészhelyzeti cellaüzenet érkezésekor."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Az Ön fiókjai"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Hozzáférés az elérhető fiókokhoz."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"feliratkozott hírcsatornák olvasása"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Lehetővé teszi az alkalmazás számára, hogy részleteket kapjon a jelenleg szinkronizált hírcsatornákról."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS-ek küldése és megtekintése"</string>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index b8e944f..8ddc6d9 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Թույլ է տալիս հավելվածին ստանալ և մշակել MMS հաղորդագրությունները: Սա նշանակում է, որ հավելվածը կարող է ստուգել կամ ջնջել ձեր սարքին ուղարկված հաղորդագրությունները` առանց դրանք ձեզ ցուցադրելու:"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"կարդալ բջջային զեկուցվող հաղորդագրությունները"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Թույլ է տալիս հավելվածին կարդալ ձեր սարքի կողմից ստացված բջջային հեռարձակվող հաղորդագրությունները: Բջջային հեռարձակվող զգուշացումները ուղարկվում են որոշ վայրերում` արտակարգ իրավիճակների մասին ձեզ զգուշացնելու համար: Վնասարար հավելվածները կարող են խանգարել ձեր սարքի արդյունավետությանը կամ շահագործմանը, երբ ստացվում է արտակարգ իրավիճակի մասին բջջային հաղորդում:"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ձեր հաշիվները"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Մուտքի հնարավորություն առկա հաշիվներ:"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"կարդալ բաժանորդագրված հոսքերը"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Թույլ է տալիս հավելվածին մանրամասներ ստանալ ընթացիկ համաժամեցված հոսքերի մասին:"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS հաղորդագրությունների ուղարկում և ընթերցում"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 44bdf3e..cc4334c 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Memungkinkan aplikasi menerima dan memproses pesan MMS. Ini artinya aplikasi dapat memantau atau menghapus pesan yang dikirim ke perangkat Anda tanpa menunjukkannya kepada Anda."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"membaca pesan siaran seluler"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Mengizinkan aplikasi membaca pesan siaran seluler yang diterima perangkat Anda. Lansiran siaran seluler dikirimkan di beberapa lokasi untuk memperingatkan Anda tentang situasi darurat. Aplikasi berbahaya dapat mengganggu kinerja atau operasi perangkat Anda saat siaran seluler darurat diterima."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Akun-akun Anda"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Akses akun yang tersedia."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"baca umpan langganan"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Mengizinkan apl mendapatkan detail tentang umpan yang saat ini sedang disinkronkan."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"mengirim dan melihat pesan SMS"</string>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 8801523..9eabd82 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"taka myndir og taka upp myndskeið"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Sími"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"hringja og stjórna símtölum"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Líkamsskynjarar"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"aðgangur að skynjaragögnum yfir lífsmörk þín"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Sækja innihald glugga"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Kanna innihald glugga sem þú ert að nota."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Leyfir forriti að taka á móti og vinna úr MMS-skilaboðum. Þetta þýðir að forritið getur fylgst með eða eytt skilaboðum sem send eru í tækið án þess að birta þér þau."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lesa skilaboð frá endurvarpa"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Leyfir forriti að lesa skilaboð frá endurvarpa sem tækið móttekur. Viðvaranir frá endurvarpa berast á tilteknum stöðum til að vara þig við neyðarástandi. Spilliforrit geta truflað afköst eða virkni tækisins þegar neyðarboð berast frá endurvarpa."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Reikningarnir þínir"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Aðgangur að tiltækum reikningum."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lesa strauma í áskrift"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Leyfir forriti að fá upplýsingar um straumana sem samstilltir eru á hverjum tíma."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"senda og skoða SMS-skilaboð"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index c17081e..c9c55fc 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Consente all\'applicazione di ricevere ed elaborare messaggi MMS. Significa che l\'applicazione potrebbe monitorare o eliminare i messaggi inviati al tuo dispositivo senza mostrarteli."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lettura di messaggi cell broadcast"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Consente all\'applicazione di leggere i messaggi cell broadcast ricevuti dal dispositivo. Gli avvisi cell broadcast vengono trasmessi in alcune località per avvertire di eventuali situazioni di emergenza. Le applicazioni dannose potrebbero interferire con il rendimento o con il funzionamento del dispositivo quando si riceve un messaggio cell broadcast di emergenza."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"I tuoi account"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accedere agli account disponibili."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lettura feed sottoscritti"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Consente all\'applicazione di ottenere dettagli sui feed attualmente sincronizzati."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"invio e lettura di SMS"</string>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 7d46434..256522f 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -212,7 +212,7 @@
<string name="global_action_power_off" msgid="4471879440839879722">"כיבוי"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"דיווח על באג"</string>
<string name="bugreport_title" msgid="2667494803742548533">"שלח דיווח על באג"</string>
- <string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד שיהיה ניתן לבצע שליחה. אנא המתן בסבלנות."</string>
+ <string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."</string>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"מצב שקט"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"הקול כבוי"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"קול מופעל"</string>
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"מאפשר לאפליקציה לקבל ולעבד הודעות MMS. משמעות הדבר היא שהאפליקציה יכולה לעקוב אחר הודעות שנשלחו למכשיר או למחוק אותן מבלי להציג לך אותן."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"קריאת הודעות שידור סלולרי"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"מאפשר לאפליקציה לקרוא הודעות שידור סלולרי שהתקבלו במכשיר שלך. התראות שידור סלולרי נשלחות במקומות מסוימים על מנת להזהיר אותך מפני מצבי חירום. אפליקציות זדוניות עשויות להפריע לביצועים או לפעולה של המכשיר שלך כאשר מתקבל שידור חירום סלולרי."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"החשבונות שלך"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"גישה לכל החשבונות הזמינים."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"קרא עדכוני מנויים"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"מאפשר לאפליקציה לקבל פרטים על ההזנות הנוכחיות שמסונכרנות."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"שליחה והצגה של הודעות SMS"</string>
@@ -476,8 +474,8 @@
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"הרשאה זו מאפשרת למשתמש לבצע איגוד לממשק הרמה העליונה של שירות מאזין להתראות. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילים."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"איגוד לשירות ספק תנאי"</string>
<string name="permdesc_bindConditionProviderService" msgid="1680513931165058425">"מאפשרת לבעלים לאגד לממשק ברמה העליונה של שירות ספק תנאי. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
- <string name="permlab_bindDreamService" msgid="4153646965978563462">"איגוד לשירות Dream"</string>
- <string name="permdesc_bindDreamService" msgid="7325825272223347863">"מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות Dream. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילות."</string>
+ <string name="permlab_bindDreamService" msgid="4153646965978563462">"איגוד לשירות ׳חלום בהקיץ׳"</string>
+ <string name="permdesc_bindDreamService" msgid="7325825272223347863">"מאפשרת לבעלים לבצע איגוד לממשק הרמה העליונה של שירות ׳חלום בהקיץ׳. הרשאה זו אף פעם אינה נחוצה לאפליקציות רגילות."</string>
<string name="permlab_invokeCarrierSetup" msgid="3699600833975117478">"הפעלה של אפליקציית תצורה שסופקה על ידי ספק"</string>
<string name="permdesc_invokeCarrierSetup" msgid="4159549152529111920">"ההרשאה הזו מאפשרת לבעלים להפעיל את אפליקציית התצורה שסופקה על ידי ספק. לעולם לא אמורה להיות נחוצה עבור אפליקציות רגילות."</string>
<string name="permlab_accessNetworkConditions" msgid="8206077447838909516">"קליטת מעקב אחר תנאי רשת"</string>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 67f9595..f3a10ba 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -229,7 +229,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"連絡先"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"連絡先へのアクセス"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置情報"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"この端末の位置情報にアクセス"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"この端末の位置情報へのアクセス"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"カレンダー"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"カレンダーへのアクセス"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMSメッセージの受信と処理をアプリに許可します。これにより、アプリが端末に届いたメッセージを表示することなく監視または削除できるようになります。"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"緊急警報SMSの読み取り"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"端末で受信した緊急警報SMSの読み取りをアプリに許可します。緊急警報は、緊急事態を警告する目的で一部の地域に配信されます。緊急警報の受信時に、悪意のあるアプリによって端末の動作や処理が妨害される恐れがあります。"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"アカウント"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"利用可能なアカウントにアクセスします。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"登録したフィードの読み取り"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"現在同期されているフィードの詳細を取得することをアプリに許可します。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMSメッセージの送信と表示"</string>
@@ -1061,7 +1059,7 @@
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"<xliff:g id="NAME">%s</xliff:g>を準備中"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"エラーを確認中"</string>
<string name="ext_media_new_notification_message" msgid="7589986898808506239">"新しい<xliff:g id="NAME">%s</xliff:g>が検出されました"</string>
- <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"写真などのメディアを転送するため"</string>
+ <string name="ext_media_ready_notification_message" msgid="4083398150380114462">"写真などのメディア転送用"</string>
<string name="ext_media_unmountable_notification_title" msgid="8295123366236989588">"<xliff:g id="NAME">%s</xliff:g>は破損しています"</string>
<string name="ext_media_unmountable_notification_message" msgid="1586311304430052169">"<xliff:g id="NAME">%s</xliff:g>は破損しています。タップして解決してください。"</string>
<string name="ext_media_unsupported_notification_title" msgid="3797642322958803257">"対応していない<xliff:g id="NAME">%s</xliff:g>です"</string>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index b06efd8..14f6426 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"აპს შეეძლება MMS შეტყობინებების მიღება და დამუშავება. ეს ნიშნავს, რომ აპს შეეძლება შეტყობინებების მონიტორინგი და მათი წაშლა თქვენთვის ჩვენების გარეშე."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"მასიური დაგზავნის შეტყობინებების წაკითხვა"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"აპს შეეძლება, წაიკითხოს თქვენს მოწყობილობაზე გამოგზავნილი ქსელის სამაუწყებლო შეტყობინებები. სამაუწყებლო გაფრთხილებები მოგეწოდებათ ზოგიერთ ადგილზე ექსტრემალური სიტუაციების შესახებ გასაფრთხილებლად. ქსელის გადაუდებელი შეტყონიბენის მიღების დროს მავნე აპებმა შეიძლება ხელი შეუშალონ თქვენი მოწყობილობის ფუნქციონირებას ან ოპერაციებს."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"თქვენი ანგარიშები"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ხელმისაწვდომ ანგარიშებზე წვდომა."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"გამოწერილი არხების წაკითხვა"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"აპს შეეძლება ინფორმაციის მოპოვება ბოლოს სინქრონიზებული არხების შესახებ."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS-ის შეტყობინებების გაგზავნა და ნახვა"</string>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 0486890..4785159 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -243,8 +243,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"қоңырау шалу және телефон қоңырауларын басқару"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене датчиктері"</string>
- <!-- no translation found for permgroupdesc_sensors (7147968539346634043) -->
- <skip />
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"ағза күйінің көрсеткіштері туралы сенсор деректеріне қатынасу"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмұнын оқып отыру."</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Ашық тұрған терезе мазмұнын тексеру."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Түртілген элементтерді дыбыстау функциясын қосу"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Қолданбаға MMS хабарларын алу және өңдеу мүмкіндігін береді. Бұл қолданба құрылғыңызға жіберілген хабарларды сізге көрсетпестен қабылдай және жоя алады дегенді білдіреді."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ұялы хабар тарату хабарларын оқу"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Қолданбаға ұялы таратылым хабарларын оқу мүмкіндігін береді. Ұялы таратылым дабылдары кейбір аймақтарда төтенше жағдай туралы ескерту үшін қолданылады. Төтенше ұялы хабарлар келгенде залалды қолданбалар құрылғының жұмысына кедергі жасауы мүмкін."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Сіздің есептік жазбаларыңыз"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Қол жетімді есептік жазбаларға кіру."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"жазылған ағындарды оқу"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Қолданбаға қазіргі уақытта синхрондалған арналар туралы мәліметтерді алуға рұқсат береді."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS хабарларын жіберу және көру"</string>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index bbc0805..ebde5d7 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"ឲ្យកម្មវិធីទទួល និងដំណើរការសារ MMS ។ វាមានន័យថា កម្មវិធីអាចតាមដាន ឬលុបសារដែលបានផ្ញើទៅឧបករណ៍របស់អ្នកដោយមិនបង្ហាញពួកវា។"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"អានសារប្រកាសចល័ត"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ឲ្យកម្មវិធីអានសារប្រកាសការហៅដែលឧបករណ៍របស់អ្នកបានទទួល។ ការជូនដំណឹងប្រកាសចល័តត្រូវបានបញ្ជូនទៅទីតាំងមួយចំនួន ដើម្បីព្រមានអ្នកអំពីស្ថានភាពអាសន្ន។ កម្មវិធីព្យាបាទអាចជ្រៀតជ្រែកការអនុវត្ត ឬប្រតិបត្តិការឧបករណ៍របស់អ្នកពេលទទួលការប្រកាសចល័តពេលអាសន្ន។"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"គណនីរបស់អ្នក"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ចូលដំណើរការគណនីដែលមាន។"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"អានអត្ថបទព័ត៌មានបានជាវ"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ឲ្យកម្មវិធីទទួលព័ត៌មានលម្អិតអំពីអត្ថបទព័ត៌មានបានធ្វើសមកាលកម្មបច្ចុប្បន្ន។"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"ផ្ញើ និងមើលសារ SMS"</string>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index 952f63c..915f610 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS ಸಂದೇಶಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅವಕಾಶ ಮಾಡಿಕೊಡುತ್ತದೆ. ಇದರರ್ಥ, ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ ಕಳುಹಿಸಲಾಗಿರುವ ಸಂದೇಶಗಳನ್ನು ನಿಮಗೆ ತೋರಿಸದೆಯೇ, ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಮಾನಿಟರ್ ಮಾಡಬಹುದು ಅಥವಾ ಅಳಿಸಬಹುದು."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ಸೆಲ್ ಪ್ರಸಾರದ ಸಂದೇಶಗಳನ್ನು ಓದಿರಿ"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ನಿಮ್ಮ ಸಾಧನದಿಂದ ಸ್ವೀಕರಿಸಿದ ಸೆಲ್ ಪ್ರಸಾರ ಸಂದೇಶಗಳನ್ನು ರೀಡ್ ಮಾಡಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಸೆಲ್ ಪ್ರಸಾರ ಎಚ್ಚರಿಕೆಗಳನ್ನು ತುರ್ತು ಸಂದರ್ಭಗಳಲ್ಲಿ ನಿಮಗೆ ಎಚ್ಚರಿಸುವ ಸಲುವಾಗಿ ಕೆಲವು ಸ್ಥಳಗಳಲ್ಲಿ ವಿತರಿಸಲಾಗುತ್ತದೆ. ದುರುದ್ದೇಶಪೂರಿತ ಅಪ್ಲಿಕೇಶನ್ಗಳು ತುರ್ತು ಸೆಲ್ ಪ್ರಸಾರವನ್ನು ಸ್ವೀಕರಿಸುವಾಗ, ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಇಲ್ಲವೇ ಕಾರ್ಯಾಚರಣೆಯಲ್ಲಿ ಹಸ್ತಕ್ಷೇಪ ಮಾಡಬಹುದು."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"ನಿಮ್ಮ ಖಾತೆಗಳು"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ಲಭ್ಯವಿರುವ ಖಾತೆಗಳನ್ನು ಪ್ರವೇಶಿಸಿ."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ಚಂದಾದಾರ ಫೀಡ್ಗಳನ್ನು ಓದಿ"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ಪ್ರಸ್ತುತವಾಗಿ ಸಿಂಕ್ ಮಾಡಲಾದ ಫೀಡ್ಗಳ ಕುರಿತು ವಿವರಗಳನ್ನು ಪಡೆಯಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS ಸಂದೇಶಗಳನ್ನು ಕಳುಹಿಸಿ ಮತ್ತು ನಿರ್ವಹಿಸಿ"</string>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 92c1e8e..7a658a9 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 찍기 및 동영상 녹화"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"신체 센서"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"앱이 MMS 메시지를 수신하고 처리할 수 있도록 허용합니다. 이는 앱이 사용자에게 표시하지 않고 기기로 전송된 메시지를 모니터링 또는 삭제할 수도 있다는 것을 의미합니다."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"셀 브로드캐스트 메시지 읽기"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"앱이 기기가 수신한 셀 브로드캐스트 메시지를 읽을 수 있도록 합니다. 비상 상황임을 알리기 위해 일부 지역에서 셀 브로드캐스트 경고가 전달됩니다. 비상 셀 브로드캐스트를 수신할 때 악성 앱이 기기의 성능이나 작동을 방해할 수 있습니다."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"계정"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"사용 가능한 계정에 액세스합니다."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"가입된 피드 읽기"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"앱이 현재 동기화된 피드에 대한 세부정보를 가져올 수 있도록 허용합니다."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS 메시지 전송 및 보기"</string>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 5965ccc..fee26ee 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -352,7 +352,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"телефон чалуу жана аларды башкаруу"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Дене сенсорлору"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"өмүр белгилериңиз тууралуу сенсордун дайындарына мүмкүнчүлүк алуу"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"организмдин абалына көз салган сенсордун дайындарына мүмкүнчүлүк алуу"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Терезе мазмунун алуу"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Сиз иштеп жаткан терезенин мазмунун изилдөө."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Сыйпалап изилдөөнү жандыруу"</string>
@@ -382,10 +382,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Колдонмого MMS билдирүүлөрүн кабыл алууга жана аларды иштетип чыгууга уруксат берет. Бул, колдонмо сизге билгизбестен түзмөгүңүзгө жөнөтүлгөн билдирүүлөрдү мониторлой же жок кыла алат дегенди билдирет."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"уюктук берүү билдирүүлөрүн окуу"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Колдонмого түзмөгүңүз кабыл алган уюк берүүнүн билдирүүлөрүн окууга жол берет. Шашылыш эскертүү билдирүүлөрү кээ бир жерлердеги өзгөчө кырдаалдар тууралу сизди эскертүү үчүн жөнөтүлөт. Зыяндуу колдономолор шашылыш эскертүүлөр берилип жатканда, сиздин түзмөктүн иштешине жолтоо болушу мүмкүн."</string>
- <!-- no translation found for permgrouplab_accounts (3359646291125325519) -->
- <skip />
- <!-- no translation found for permgroupdesc_accounts (4948732641827091312) -->
- <skip />
<!-- no translation found for permlab_subscribedFeedsRead (4756609637053353318) -->
<skip />
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Колдонмого учурда шайкештештирилген каналдардын чоо-жайларын алуу мүмкүнчүлүгүн берет."</string>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 0065d6d..6082348 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"ອະນຸຍາດໃຫ້ແອັບຯ ຮັບແລະປະມວນຜົນຂໍ້ຄວາມ MMS. ນີ້ໝາຍຄວາມວ່າແອັບຯສາມາດຕິດຕາມ ຫຼືລຶບຂໍ້ຄວາມທີ່ສົ່ງເຂົ້າອຸປະກອນຂອງທ່ານ ໂດຍທີ່ບໍ່ສະແດງພວກມັນໃຫ້ທ່ານເຫັນ."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ອ່ານຂໍ້ຄວາມກະຈາຍສັນຍານຂອງເສົາສັນຍານ"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ອະນຸຍາດໃຫ້ແອັບຯ ສາມາດອ່ານຂໍ້ຄວາມແຈ້ງເຕືອນເຫດສຸກເສີນ ທີ່ໄດ້ຮັບໂດຍອຸປະກອນຂອງທ່ານ. ການແຈ້ງເຕືອນສຸກເສີນທີ່ມີໃຫ້ບໍລິການໃນບາງພື້ນທີ່ ເພື່ອແຈ້ງເຕືອນໃຫ້ທ່ານຮູ້ເຖິງສະຖານະການສຸກເສີນ. ແອັບພລິເຄຊັນທີ່ເປັນອັນຕະລາຍອາດລົບກວນປະສິດທິພາບ ຫຼືການດຳເນີນງານຂອງອຸປະກອນຂອງທ່ານ ເມື່ອໄດ້ການຮັບແຈ້ງເຕືອນສຸກເສີນຈາກສະຖານີມືຖື."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"ບັນຊີຂອງທ່ານ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ເຂົ້າເຖິງບັນຊີທີ່ໃຊ້ໄດ້."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ອ່ານຂໍ້ມູນຟີດທີ່ສະໝັກໄວ້"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ອະນຸຍາດໃຫ້ແອັບຯ ດຶງລາຍລະອຽດກ່ຽວກັບຂໍ້ມູນທີ່ກຳລັງຊິ້ງຢູ່."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"ສົ່ງ ແລະເບິ່ງຂໍ້ຄວາມ SMS"</string>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index a892bbe..65215de 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -231,7 +231,7 @@
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktai"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pasiekti kontaktus"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Vietovė"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"galimybė pasiekti įrenginio vietovės informaciją"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"pasiekti įrenginio vietovės informaciją"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendorius"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"pasiekti kalendorių"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Leidžiama programai gauti ir apdoroti MMS pranešimus. Tai reiškia, kad programa gali stebėti ir ištrinti į jūsų įrenginį siunčiamus pranešimus jums jų neparodžiusi."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"skaityti mobiliuoju transliuojamus pranešimus"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Programai leidžiama skaityti mobiliuoju transliuojamus pranešimus, gaunamus jūsų įrenginyje. Mobiliuoju transliuojami įspėjimai pristatomi kai kuriose vietose, kad įspėtų apie kritines situacijas. Kai gaunamas mobiliuoju transliuojamas pranešimas apie kritinę situaciją, kenkėjiškos programos gali trukdyti įrenginiui veikti ar jį naudoti."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Jūsų paskyros"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Pasiekite galimas paskyras."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"skaityti prenumeruojamus tiekimus"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Leidžiama programai gauti išsamios informacijos apie šiuo metu sinchronizuojamus sklaidos kanalus."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"siųsti ir peržiūrėti SMS pranešimus"</string>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 75c015b..e370c75 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -271,8 +271,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Ļauj lietotnei saņemt un apstrādāt multiziņas. Tas nozīmē, ka lietotne var pārraudzīt vai dzēst uz jūsu ierīci nosūtītos ziņojumus, neparādot tos jums."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"šūnu apraides ziņojumu lasīšana"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ļauj lietotnei lasīt ierīcē saņemtos šūnu apraides ziņojumus. Šūnu apraides brīdinājumi tiek piegādāti dažās atrašanās vietās, lai brīdinātu jūs par ārkārtas situācijām. Ļaunprātīgas lietotnes var traucēt ierīces veiktspēju vai darbības, kad ir saņemts ārkārtas šūnas apraides ziņojums."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Jūsu konti"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Piekļūstiet pieejamajiem kontiem."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lasīt abonētās plūsmas"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ļauj lietotnei iegūt informāciju par pašlaik sinhronizētajām plūsmām."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"sūtīt un skatīt īsziņas"</string>
@@ -530,8 +528,8 @@
<item msgid="8901098336658710359">"Mājas"</item>
<item msgid="869923650527136615">"Mobilais"</item>
<item msgid="7897544654242874543">"Darbā"</item>
- <item msgid="1103601433382158155">"Faksa numurs darbā"</item>
- <item msgid="1735177144948329370">"Faksa numurs mājās"</item>
+ <item msgid="1103601433382158155">"Darba fakss"</item>
+ <item msgid="1735177144948329370">"Mājas fakss"</item>
<item msgid="603878674477207394">"Peidžers"</item>
<item msgid="1650824275177931637">"Cits"</item>
<item msgid="9192514806975898961">"Pielāgots"</item>
@@ -573,8 +571,8 @@
<string name="phoneTypeHome" msgid="2570923463033985887">"Mājas"</string>
<string name="phoneTypeMobile" msgid="6501463557754751037">"Mobilais"</string>
<string name="phoneTypeWork" msgid="8863939667059911633">"Darbā"</string>
- <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Faksa numurs darbā"</string>
- <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faksa numurs mājās"</string>
+ <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Darba fakss"</string>
+ <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Mājas fakss"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Peidžers"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Cits"</string>
<string name="phoneTypeCallback" msgid="2712175203065678206">"Atzvanīšana"</string>
@@ -1048,7 +1046,7 @@
<string name="usb_midi_notification_title" msgid="4850904915889144654">"USB savienojums MIDI režīmā"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Pievienots kā instalēšanas programma"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ir izveidots savienojums ar USB piederumu."</string>
- <string name="usb_notification_message" msgid="7347368030849048437">"Lai skatītu citas opcijas, pieskarieties šeit."</string>
+ <string name="usb_notification_message" msgid="7347368030849048437">"Citas opcijas"</string>
<string name="extmedia_format_title" product="nosdcard" msgid="9020092196061007262">"Vai formatēt USB atmiņu?"</string>
<string name="extmedia_format_title" product="default" msgid="3648415921526526069">"Vai formatēt SD karti?"</string>
<string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"Visi USB atmiņā saglabātie faili tiks dzēsti. Šo darbību nevar atsaukt."</string>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index d0cd9ff..95d34f1 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Овозможува апликацијата да прима и да обработува ММС пораки. Тоа значи дека апликацијата може да следи или да брише пораки испратени до вашиот уред без да ви ги прикаже вам."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"прочитај пораки за мобилно емитување"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Овозможува апликациите да ги читаат пораките за мобилно емитување што ги прима вашиот уред. Предупредувањата за мобилно емитување се доставуваат на некои локации, за да ве предупредат на итни ситуации. Злонамерните апликации може да пречат во ефикасноста или работењето на вашиот уред кога се прима емитување за итен случај."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ваши сметки"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Пристапи кон достапните сметки."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"читај претплатени навестувања на содржина"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Дозволува апликацијата да добива детали за навестувања што се тековно синхронизирани."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"испрати и прикажи СМС-пораки"</string>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 2eb442d..0dd62f38 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ചിത്രങ്ങളെടുത്ത് വീഡിയോ റെക്കോർഡുചെയ്യുക"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"ഫോണ്"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ഫോൺ വിളിക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുക"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"ബോഡി സെൻസറുകൾ"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"നിങ്ങളുടെ ജീവാധാര ലക്ഷണങ്ങളെ കുറിച്ചുള്ള സെൻസർ വിവരങ്ങൾ ആക്സസ് ചെയ്യുക"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"വിൻഡോ ഉള്ളടക്കം വീണ്ടെടുക്കുക"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"നിങ്ങൾ സംവദിക്കുന്ന ഒരു വിൻഡോയുടെ ഉള്ളടക്കം പരിശോധിക്കുക."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS സന്ദേശങ്ങൾ നേടാനും പ്രോസസ്സുചെയ്യാനും അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. നിങ്ങളുടെ ഉപകരണത്തിലേക്ക് അയയ്ക്കുന്ന സന്ദേശങ്ങൾ നിങ്ങൾക്ക് ദൃശ്യമാക്കാതെ തന്നെ അപ്ലിക്കേഷന് നിരീക്ഷിക്കാനോ ഇല്ലാതാക്കാനോ കഴിയുമെന്നാണ് ഇതിനർത്ഥം."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"സെൽ പ്രക്ഷേപണ സന്ദേശങ്ങൾ റീഡുചെയ്യുക"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"നിങ്ങളുടെ ഉപകരണത്തിൽ ലഭിച്ച സെൽ പ്രക്ഷേപണ സന്ദേശങ്ങൾ റീഡുചെയ്യാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു. അടിയന്തര സാഹചര്യങ്ങളെക്കുറിച്ച് നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകാനായി ചില ലൊക്കേഷനുകളിൽ നൽകപ്പെടുന്നവയാണ് സെൽ പ്രക്ഷേപണ അലേർട്ടുകൾ. ഒരു അടിയന്തര സെൽ പ്രക്ഷേപണം ലഭിക്കുമ്പോൾ, ക്ഷുദ്രകരമായ അപ്ലിക്കേഷനുകൾ നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനമോ പ്രവർത്തനമോ തടസ്സപ്പെടുത്താനിടയുണ്ട്."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"നിങ്ങളുടെ അക്കൗണ്ടുകൾ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ലഭ്യമായ അക്കൗണ്ടുകൾ ആക്സസ്സ് ചെയ്യുക."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"സബ്സ്ക്രൈബ് ചെയ്ത ഫീഡുകൾ വായിക്കുക"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"നിലവിൽ സമന്വയിപ്പിച്ച ഫീഡുകളെക്കുറിച്ചുള്ള വിശദാംശങ്ങൾ നേടുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS സന്ദേശങ്ങൾ അയയ്ക്കുകയും കാണുകയും ചെയ്യുക"</string>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 7b14b70..4f1050a 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Апп нь MMS мессежийг хүлээн авах болон гүйцэтгэх боломжтой. Ингэснээр апп нь таны төхөөрөмжрүү илгээсэн мессежийг танд үзүүлэхгүйгээр хянах болон устгаж чадна."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"үүрэн өргөн дамжууллын мессеж унших"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Апп нь таны төхөөрөмжийн хүлээн авсан үүрэн өргөн дамжуулах мессежийг унших боломжтой. Үүрэн өргөн дамжууллын мэдэгдэл нь яаралтай нөхцөл байдлыг анхааруулах зорилгоор зарим байршлуудад хүрдэг. Хортой апп нь яаралтай үүрэн өргөн дамжууллыг хүлээн авсан үед таны төхөөрөмжийн ажиллагаа болон чадамжид нөлөөлөх боломжтой."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Таны акаунт"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Боломжит акаунтад хандах."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"бүртгүүлсэн хангамжийг унших"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Апп нь одоогийн синк хийгдсэн хангамжийн талаарх мэдээллийг авах боломжтой."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS мессежийг илгээх, харах"</string>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 2fb4f93..bfe7b10 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS संदेश प्राप्त करण्यास आणि त्यावर प्रक्रिया करण्यास अॅप ला अनुमती देते. म्हणजेच अॅप आपल्या डिव्हाइसवर पाठविलेले संदेश आपल्याला न दर्शवता त्यांचे परीक्षण करू किंवा ते हटवू शकतो."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल प्रसारण संदेश वाचा"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"आपल्या डिव्हाइसद्वारे प्राप्त केलेले सेल प्रसारण संदेश वाचण्यासाठी अॅप ला अनुमती देते. काही स्थानांमध्ये आपल्याला आणीबाणीच्या परिस्थितीची चेतावणी देण्यासाठी सेल प्रसारण सूचना वितरीत केल्या जातात. आणीबाणी सेल प्रसारण प्राप्त होते तेव्हा आपल्या डिव्हाइसच्या कार्यप्रदर्शनात किंवा कार्यात दुर्भावनापूर्ण अॅप्स व्यत्यय आणू शकतात."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"आपली खाती"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"उपलब्ध खात्यांवर प्रवेश करा."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"सदस्यता घेतलेली फीड वाचा"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"सध्या संकालित केलेल्या फीडविषयी तपशील मिळविण्यासाठी अॅप ला अनुमती देते."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS संदेश पहा आणि व्यवस्थापित करा"</string>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index 5464ccc..5c58ee3 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ambil gambar dan rakam video"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"buat dan urus panggilan telefon"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Penderia Badan"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"akses data penderia tentang tanda vital anda"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Dapatkan kembali kandungan tetingkap"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Periksa kandungan tetingkap yang berinteraksi dengan anda."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Membenarkan apl menerima dan memproses mesej MMS. Ini bermakna apl boleh memantau atau memadam mesej yang dihantar ke peranti anda tanpa menunjukkannya kepada anda."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"baca mesej siaran sel"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Membolehkan apl membaca mesej siaran sel yang diterima oleh peranti anda. Isyarat siaran sel dihantar di beberapa lokasi untuk memberi amaran kepada anda tentang situasi kecemasan. Apl hasad boleh mengganggu prestasi atau operasi peranti anda apabila siaran sel kecemasan diterima."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Akaun anda"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Akses akaun yang tersedia."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"baca suapan langganan"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Membenarkan apl mendapatkan butiran mengenai suapan tersegerak semasa."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"hantar dan lihat mesej SMS"</string>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 183ba30..f801558 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"အပလီကေးရှင်းအား ရုပ်သံစာများ လက်ခံခြင်း၊ ဆောင်ရွက်ခြင်း ခွင့်ပြုပါ။ ဤခွင့်ပြုချက်တွင် အပလီကေးရှင်းအနေဖြင့် သင် လက်ခံရရှိသော စာများအား သင့်အား မပြပဲစောင့်ကြည့်ခွင့်နှင့် ဖျက်ပစ်ခွင့်များ ပါဝင်ပါသည်။"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"စာတိုများ ဖြန့်ဝေခြင်းစနစ်အား ဖတ်ခြင်း"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"အပလီကေးရှင်းကို သင်၏ စက်ပစ္စည်းမှ လက်ခံရရှိသော အများလွှင့်ထုတ်ချက်များကို ဖတ်ရန် ခွင့်ပြုသည်။ အများလွှင့်ထုတ်ချက်များသည် အရေးပေါ်အခြေအနေများကို သင့်အား သတိပေးရန် အချို့ နေရာများတွင် ပို့ပေးသည်။ အရေးပေါ်သတိပေးချက် ထုတ်လွှင့်ချက်ကို လက်ခံရရှိချိန်တွင်အန္တရာယ် ဖြစ်စေနိုင်သော အပလီကေးရှင်းများသည် သင့်စက်ပစ္စည်း၏ လုပ်ငန်းလည်ပတ်မှုနှင့် စွမ်းဆောင်မှုကို ဝင်စွက်ဖက်နိုင်သည်။"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"သင့်အကောင့်များ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ရရိှနိုင်သောအကောင့်များကို အသုံးပြုရန်"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"အမည်သွင်းထားသောဖိဖ့်များကို ဖတ်ခြင်း"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"appအား လောလောဆယ် စင့်က် လုပ်ပြီးသား ထည့်သွင်းမှုများ ဆိုင်ရာ အသေးစိတ်များကို ရယူခွင့်ပြုသည်။"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS စာများကို ပို့ကာ ကြည့်မည်"</string>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 4e9e698..c86fb56 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Lar appen motta og behandle multimediemeldinger. Dette betyr at appen kan overvåke eller slette meldinger som er sendt til enheten din uten at du har sett dem."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lese kringkastede meldinger"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Tillater at appen kan lese kringkastede meldinger enheten din mottar. Kringkastede varsler leveres noen steder for å advare deg om nødsituasjoner. Skadelige apper kan forstyrre ytelsen eller funksjonen til enheten din når en kringkastet nødmelding mottas."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Google-kontoer"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Tilgang til tilgjengelige Google-kontoer."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lese abonnement på nyhetskilder"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Lar appen hente inn detaljer om strømmer som er synkroniserte for øyeblikket."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"sende og lese SMS-meldinger"</string>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index c4886b1..238acae 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -243,7 +243,7 @@
<string name="permgrouplab_phone" msgid="5229115638567440675">"फोन"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"फोन कलहरू गर्नुहोस् र व्यवस्थापन गर्नुहोस्"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"शारीरिक सेन्सर"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईँको महत्त्वपूर्ण संकेत बारेको सेन्सर डेटा पहुँच गर्नुहोस्"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"तपाईँको महत्त्वपूर्ण संकेत बारे सेन्सर डेटा पहुँच गर्नुहोस्"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"विन्डो सामग्रीको पुनःबहाली गर्नुहोस्।"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"तपाईँको अन्तरक्रिया भइरहेको विन्डोको सामग्रीको निरीक्षण गर्नुहोस्।"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"छोएर गरिने खोजलाई सुचारु गर्नुहोस्"</string>
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"अनुप्रयोगलाई MMS सन्देशहरू प्राप्त गर्न र प्रकृया गर्न अनुमति दिन्छ। यसको मतलब अनुप्रयोगले तपाईंको उपकरणमा पठाइएको सन्देशहरू तपाईंलाई नदेखाईनै मोनिटर गर्न वा मेटाउन सक्दछ।"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"सेल प्रसारित सन्देशहरू पढ्नुहोस्"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"तपाईंको उपकरणद्वारा प्राप्त सेल प्रसारण सन्देशहरू अनुप्रयोगलाई पढ्न अनुमति दिन्छ। सेल प्रसारण चेतावनीहरू केही स्थानहरूमा तपाईंलाई आपतकालीन गतिविधिहरूको बारेमा सचेत गराउन गरिएका छन्। खराब अनुप्रयोगहरूले एउटा आपतकालीन सेल प्रसारण प्राप्त गर्दछ जब तपाईंको उपकरणको प्रदर्शन वा अपरेशनको साथ हस्तक्षेप गर्न सक्दछन्।"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"तपाईँका खाताहरू"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"उपलब्ध खाताहरू पहुँच गर्नुहोस्।"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"सदस्य बनाइका फिडहरू पढ्नुहोस्"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"अनुप्रयोगलाई अहिलेको समीकरण गरिएका सूचकहरू बारे विवरणहरू लिने अनुमति दिन्छ।"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS सन्देशहरू पठाउनुहोस् र हेर्नुहोस्"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 50cfe83..3deb674 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Hiermee kan de app MMS-berichten ontvangen en verwerken. Dit betekent dat de app berichten die naar uw apparaat zijn verzonden, kan bijhouden of verwijderen zonder deze aan u weer te geven."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"infodienstberichten lezen"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Toestaan dat de app infodienstberichten leest die worden ontvangen op uw apparaat. Infodienstberichten worden verzonden naar bepaalde locaties om u te waarschuwen voor noodsituaties. Schadelijke apps kunnen de prestaties of verwerking van uw apparaat verstoren wanneer een infodienstbericht wordt ontvangen."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Uw accounts"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Toegang tot de beschikbare accounts."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"Geabonneerde feeds lezen"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Hiermee kan de app details over de huidige gesynchroniseerde feeds achterhalen."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"sms\'jes verzenden en bekijken"</string>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index cacd529..35001d3 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"ਐਪ ਨੂੰ MMS ਸੁਨੇਹੇ ਪ੍ਰਾਪਤ ਕਰਨ ਅਤੇ ਉਹਨਾਂ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਐਪ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਤੇ ਭੇਜੇ ਗਏ ਸੁਨੇਹਿਆਂ ਨੂੰ ਤੁਹਾਨੂੰ ਦਿਖਾਏ ਬਿਨਾਂ ਨਿਰੀਖਣ ਕਰ ਸਕਦਾ ਹੈ ਜਾਂ ਮਿਟਾ ਸਕਦਾ ਹੈ।"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ਸੈਲ ਪ੍ਰਸਾਰਨ ਸੁਨੇਹੇ ਪੜ੍ਹੋ"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ਐਪ ਨੂੰ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਵੱਲੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਸੈਲ ਪ੍ਰਸਾਰਨ ਸੁਨੇਹੇ ਪੜ੍ਹਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਸੈਲ ਪ੍ਰਸਾਰਨ ਚਿਤਾਵਨੀਆਂ ਤੁਹਾਨੂੰ ਐਮਰਜੈਂਸੀ ਸਥਿਤੀਆਂ ਦੀ ਚਿਤਾਵਨੀ ਦੇਣ ਲਈ ਕੁਝ ਨਿਰਧਾਰਿਤ ਸਥਾਨਾਂ ਤੇ ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ ਜਾਂਦੀਆਂ ਹਨ। ਖ਼ਰਾਬ ਐਪਸ ਤੁਹਾਡੀ ਡਿਵਾਈਸ ਦੇ ਪ੍ਰਦਰਸ਼ਨ ਜਾਂ ਓਪਰੇਸ਼ਨ ਵਿੱਚ ਵਿਘਨ ਪਾ ਸਕਦੇ ਹਨ ਜਦੋਂ ਇੱਕ ਐਮਰਜੈਂਸੀ ਸੈਲ ਪ੍ਰਸਾਰਨ ਪ੍ਰਾਪਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"ਤੁਹਾਡੇ ਖਾਤੇ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ਉਪਲਬਧ ਖਾਤਿਆਂ ਤੱਕ ਪਹੁੰਚ।"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ਸਬਸਕ੍ਰਾਈਬ ਕੀਤੇ ਫੀਡਸ ਪੜ੍ਹੋ"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ਐਪ ਨੂੰ ਵਰਤਮਾਨ ਵਿੱਚ ਸਿੰਕ ਕੀਤੇ ਫੀਡਸ ਬਾਰੇ ਵੇਰਵੇ ਪ੍ਰਾਪਤ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS ਸੁਨੇਹੇ ਭੇਜੋ ਅਤੇ ਦਿਖਾਓ"</string>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 6de8f6f..999db25 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Pozwala aplikacji na odbieranie i przetwarzanie MMS-ów. To oznacza, że aplikacja będzie mogła bez Twojej wiedzy monitorować i usuwać wiadomości wysyłane do Twojego urządzenia."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"odczyt komunikatów z sieci komórkowej"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Zezwala aplikacji na odczyt komunikatów z sieci komórkowej odebranych na urządzeniu. Komunikaty alarmowe z sieci komórkowej są dostarczane w niektórych lokalizacjach w celu ostrzeżenia Cię o sytuacjach zagrożenia. Złośliwe aplikacje mogą wpływać na wydajność lub zakłócać działanie urządzenia po odebraniu komunikatu alarmowego z sieci komórkowej."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Twoje konta"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Dostęp do udostępnionych kont."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"czytanie subskrybowanych źródeł"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Pozwala aplikacji na pobieranie szczegółowych informacji na temat obecnie zsynchronizowanych kanałów."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"wysyłać i wyświetlać SMS-y"</string>
@@ -1228,7 +1226,7 @@
<string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Enter"</string>
<string name="activitychooserview_choose_application" msgid="2125168057199941199">"Wybierz aplikację"</string>
<string name="activitychooserview_choose_application_error" msgid="8624618365481126668">"Nie udało się uruchomić aplikacji <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
- <string name="shareactionprovider_share_with" msgid="806688056141131819">"Udostępnij przez"</string>
+ <string name="shareactionprovider_share_with" msgid="806688056141131819">"Udostępnij przez:"</string>
<string name="shareactionprovider_share_with_application" msgid="5627411384638389738">"Udostępnij przez <xliff:g id="APPLICATION_NAME">%s</xliff:g>"</string>
<string name="content_description_sliding_handle" msgid="415975056159262248">"Uchwyt przesuwny. Dotknij i przytrzymaj."</string>
<string name="description_target_unlock_tablet" msgid="3833195335629795055">"Przesuń, aby odblokować."</string>
@@ -1275,7 +1273,7 @@
<string name="sha1_fingerprint" msgid="7930330235269404581">"Odcisk cyfrowy SHA-1:"</string>
<string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobacz wszystkie"</string>
<string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Wybierz działanie"</string>
- <string name="share_action_provider_share_with" msgid="5247684435979149216">"Udostępnij przez"</string>
+ <string name="share_action_provider_share_with" msgid="5247684435979149216">"Udostępnij przez:"</string>
<string name="list_delimeter" msgid="3975117572185494152">", "</string>
<string name="sending" msgid="3245653681008218030">"Wysyłanie..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index c257e8c..ca57cfc 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que a aplicação receba e processe mensagens MMS. Isto significa que a aplicação poderá monitorizar ou eliminar mensagens enviadas para o seu dispositivo sem as apresentar."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ler mensagens de transmissão celular"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite que a aplicação leia mensagens de transmissão celular recebidas pelo seu dispositivo. Os alertas de transmissão celular são fornecidos em algumas localizações para avisá-lo sobre situações de emergência. As aplicações maliciosas podem interferir com o desempenho ou funcionamento do seu dispositivo quando for recebida uma transmissão celular de emergência."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"As suas contas"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Aceda às contas disponíveis."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ler feeds subscritos"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite à aplicação obter detalhes acerca dos feeds atualmente sincronizados."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"enviar e ver mensagens SMS"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 235f0db..897ddfb 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"tirar fotos e gravar vídeos"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefone"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"fazer e gerenciar chamadas telefônicas"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Sensores corporais"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"acessar dados do sensor sobre seus sinais vitais"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperar cont. da janela"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspecionar o conteúdo da janela com que você está interagindo."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite que o app receba e processe mensagens MMS. Isso significa que o app pode monitorar ou excluir as mensagens enviadas para o dispositivo sem mostrá-las para você."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"ler mensagens de difusão celular"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite que o app leia mensagens de difusão celular recebidas por seu dispositivo. Alertas de difusão celular são recebidos em alguns locais para avisar você de situações de emergência. Apps maliciosos podem interferir no desempenho ou funcionamento de seu dispositivo quando uma difusão celular de emergência é recebida."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Suas contas"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Acessar as contas disponíveis."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"ler feeds inscritos"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite que o app obtenha detalhes sobre os feeds sincronizados no momento."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"enviar e ver mensagens SMS"</string>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index b0552e9c..bf483da 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -243,8 +243,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotografiază și înregistrează videoclipuri"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"inițiază și gestionează apeluri telefonice"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Senzori corporali"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"accesează datele înregistrate de senzori despre semnele vitale"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Recuperează conținutul ferestrei"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Inspectează conținutul unei ferestre cu care interacționați."</string>
@@ -272,8 +271,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Permite aplicației să primească și să proceseze mesaje MMS. Acest lucru înseamnă că aplicația ar putea monitoriza sau şterge mesajele trimise pe dispozitivul dvs. fără a vi le arăta."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"citeşte mesajele cu transmisie celulară"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Permite aplicației să citească mesajele primite prin transmisie celulară de dispozitivul dvs. Alertele cu transmisie celulară sunt difuzate în unele locaţii pentru a vă avertiza cu privire la situaţiile de urgenţă. Aplicaţiile rău intenţionate pot afecta performanţa sau funcţionarea dispozitivului dvs. când este primită o transmisie celulară de urgenţă."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Conturile dvs."</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Accesează conturile disponibile."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"citire feeduri abonat"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Permite aplicației să obţină detalii despre feedurile sincronizate în prezent."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"trimite și vede mesajele SMS"</string>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index a3dcf12..eabfdb8 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -244,8 +244,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"фото- и видеосъемка"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"осуществление телефонных звонков и управление ими"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Нательные датчики"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"доступ к данным датчиков о состоянии организма"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Получать содержимое окна"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Анализировать содержимое активного окна."</string>
@@ -273,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Приложение сможет получать и обрабатывать MMS. Это значит, что оно сможет отслеживать и удалять отправленные на ваше устройство сообщения, не показывая их."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"Читать сообщения массовой рассылки"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Приложение получит доступ к сообщениям широковещательных SMS-служб, которые в некоторых странах используются для информирования населения об экстренных ситуациях. Вредоносные программы могут помешать работе устройства, на которое поступают такие сообщения."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ваши аккаунты"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Доступ к имеющимся аккаунтам."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"Просмотр фидов пользователя"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Приложение сможет получать сведения о синхронизируемых в настоящее время фидах."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"отправка и просмотр SMS-сообщений"</string>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index c406686..3594fd4 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"පින්තූර ගැනීම සහ වීඩියෝ පටිගත කිරීම"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"දුරකථනය"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"දුරකථන ඇමතුම් සිදු කිරීම සහ කළමනාකරණය කිරීම"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"ශරීර සංවේදක"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"ඔබේ ජෛව ලක්ෂණ පිළිබඳ සංවේදක දත්ත වෙත පිවිසෙන්න"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"කවුළු අන්න්තර්ගතය ලබාගන්න"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"ඔබ අන්තර්ක්රියාකාරී වන කවුළුවේ අන්තර්ගතය පරීක්ෂා කරන්න."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS පණිවිඩ සොයා ලබාගැනීමට සහ ක්රියාත්මක කිරීමට යෙදුමට අවසර දෙන්න. යෙදුම නිරීක්ෂණය කරනු ලබන අතර ඔබට ලැබුන පණිවිඩ පෙන්වීමෙන් තොරවම මකා දැමිය හැකි බව මෙමඟින් අදහස් කරයි."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"සෙල් ප්රචාරණ පණිවිඩ කියවීම"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ඔබගේ උපාංගයට ලැබුණු සෙල් විකාශන පණිවිඩ කියවීමට යෙදුමට අවසර දෙන්න. ඔබට හදිසි අවස්ථාවන් පිළිබඳ අනතුරු ඇඟවීමට සෙල් විකාශන පණිවිඩ ඇතැම් ස්ථානවල සිට යවනු ලබයි. හදිසි සෙල් විකාශන ලැබෙන අවස්ථාවකදී, අනිෂ්ට යෙදුම් මඟින් ඔබගේ උපාංගයට කාර්ය සාධනයට හෝ ක්රියකරණයට බාධා සිදුවිය හැක."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"ඔබගේ ගිණුම්"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"ලබාගත හැකි ගිණුම් වලට ප්රවේශ වීම."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"දායක වූ සංග්රහ කියවීම"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"වර්තමාන සමමුහුර්ත සංග්රහ ගැන විස්තර ලැබීමට යෙදුමට අවසර දෙන්න."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS පණිවිඩ යැවීම සහ බැලීම"</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 4305487..96df345 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -235,7 +235,7 @@
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendár"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"prístup ku kalendáru"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"posielanie a zobrazovanie správ SMS"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"posielať a zobrazovať SMS"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"Úložisko"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"prístup k fotkám, médiám a súborom na zariadení"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"Mikrofón"</string>
@@ -243,9 +243,8 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"Fotoaparát"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotenie a zaznamenávanie videí"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefón"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonovanie a správa hovorov"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"telefonovať a spravovať hovory"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Telesné senzory"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"prístup k údajom senzorov o životných funkciách"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Načítať obsah okna"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Môžete preskúmať obsah okna, s ktorým pracujete."</string>
@@ -273,11 +272,9 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Umožňuje aplikácii prijímať a spracovávať správy MMS. Znamená to, že aplikácia môže sledovať správy odoslané na vaše zariadenie alebo ich odstrániť bez toho, aby sa vám zobrazili."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"čítať správy Cell Broadcast"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Umožňuje aplikácii čítať správy Cell Broadcast prijaté vaším zariadením. Upozornenia Cell Broadcast sú doručované na určitých miestach a upozorňujú na núdzové situácie. Škodlivé aplikácie môžu pri prijatí núdzovej správy Cell Broadcast narušiť výkonnosť alebo prevádzku vášho zariadenia."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vaše účty"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Prístup k dostupným účtom."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"čítať odoberané informačné kanály"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Umožňuje aplikácii získať podrobnosti o aktuálne synchronizovaných informačných kanáloch."</string>
- <string name="permlab_sendSms" msgid="7544599214260982981">"posielať a zobrazovať správy SMS"</string>
+ <string name="permlab_sendSms" msgid="7544599214260982981">"posielať a zobrazovať SMS"</string>
<string name="permdesc_sendSms" msgid="7094729298204937667">"Umožňuje aplikácii odosielať správy SMS. Môže to mať za následok účtovanie neočakávaných poplatkov. Škodlivé aplikácie vám môžu spôsobiť výdavky odosielaním správ bez vášho potvrdenia."</string>
<string name="permlab_readSms" msgid="8745086572213270480">"čítať textové správy (SMS alebo MMS)"</string>
<string name="permdesc_readSms" product="tablet" msgid="2467981548684735522">"Umožňuje aplikácii čítať správy SMS uložené v tablete alebo na SIM karte. Toto povolenie umožňuje aplikácii čítať správy SMS bez ohľadu na ich obsah alebo dôvernosť."</string>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 3b355d7..0568568 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Aplikaciji omogoča prejemanje in obdelavo MMS-ov. S tem lahko aplikacija nadzoruje ali izbriše sporočila, poslana v napravo, ne da bi vam jih pokazala."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"branje sporočil oddaje v celici"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Omogoča aplikaciji branje sporočil oddaje v celici, ki jih prejme naprava. Opozorila oddaje v celici so dostavljena na nekaterih lokacijah, da vas opozorijo na izredne razmere. Zlonamerne aplikacije lahko vplivajo na delovanje naprave, ko dobi sporočilo oddaje v celici."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Vaši računi"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Dostop do razpoložljivih računov."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"branje naročenih virov"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Aplikaciji omogoča dobivanje podrobnosti o trenutno sinhroniziranih virih."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"pošiljanje in ogled sporočil SMS"</string>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index 2053443..257516e 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Lejon aplikacionin të marrë dhe përpunojë mesazhe MMS. Kjo do të thotë se aplikacioni mund të monitorojë ose fshijë mesazhe të dërguara në pajisjen tënde, pa t\'i treguar ato."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"lexo mesazhet e transmetimit të qelizës"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Lejon aplikacionin të lexojë mesazhet e transmetimit të qelizës, të marra nga pajisja jote. Alarmet e transmetimit të qelizës dërgohen në disa vendndodhje për të të paralajmëruar në situata urgjente. Aplikacionet keqdashëse mund të ndërhyjnë në veprimtarinë ose operacionin e pajisjes tënde kur merret një transmetim urgjent i qelizës."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Llogaritë e tua"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Qasje në llogaritë e vlefshme."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"lexo informacione të abonuara"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Lejon aplikacionin të marrë detaje rreth çdo gjëje që sinkronizohet në pajisje."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"dërgo dhe shiko mesazhet SMS"</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index ea1a22d..a361389 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -243,8 +243,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"снимање слика и видео снимака"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Телефон"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"упућивање телефонских позива и управљање њима"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Сензори за тело"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"приступ подацима сензора о виталним функцијама"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Преузима садржај прозора"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Проверава садржај прозора са којим остварујете интеракцију."</string>
@@ -272,8 +271,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Дозвољава апликацији да прима и обрађује MMS поруке. То значи да апликација може да надгледа или брише поруке које се шаљу уређају, а да вам их не прикаже."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"читање порука инфо сервиса"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Омогућава апликацији да чита поруке инфо сервиса које уређај прима. Упозорења инфо сервиса се на неким локацијама примају као упозорења на хитне случајеве. Злонамерне апликације могу да утичу на учинак или ометају функционисање уређаја када се прими порука инфо сервиса о хитном случају."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Налози"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Приступ доступним налозима."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"читање пријављених фидова"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Дозвољава апликацији да преузима детаље о тренутно синхронизованим фидовима."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"шаљи и прегледај SMS поруке"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 22584f6..82b6706 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -240,7 +240,7 @@
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"spela in ljud"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"Kamera"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"ta bilder och spela in video"</string>
- <string name="permgrouplab_phone" msgid="5229115638567440675">"Mobil"</string>
+ <string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"ringa och hantera telefonsamtal"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"Kroppssensorer"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"få åtkomst till sensordata om dina vitalparametrar"</string>
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Tillåter att appen tar emot och hanterar MMS-meddelanden. Detta innebär att appen kan övervaka eller ta bort meddelanden som skickats till enheten utan att visa dem för dig."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"läsa SMS-meddelanden"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Appen tillåts läsa SMS som skickas till din enhet. På vissa platser skickas SMS för att varna för nödsituationer. Skadliga appar kan påverka enhetens prestanda eller funktionalitet när du får ett meddelande om en nödsituation via SMS."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Dina konton"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Få åtkomst till tillgängliga konton."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"läsa flöden som du prenumererar på"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Tillåter att appen får information om aktuella synkroniserade flöden."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"skicka och visa sms"</string>
@@ -507,7 +505,7 @@
<string name="policydesc_resetPassword" msgid="1278323891710619128">"Ändra skärmlåset."</string>
<string name="policylab_forceLock" msgid="2274085384704248431">"Lås skärmen"</string>
<string name="policydesc_forceLock" msgid="1141797588403827138">"Kontrollera hur och när skärmlåset aktiveras."</string>
- <string name="policylab_wipeData" msgid="3910545446758639713">"Radera alla data"</string>
+ <string name="policylab_wipeData" msgid="3910545446758639713">"Radera all data"</string>
<string name="policydesc_wipeData" product="tablet" msgid="4306184096067756876">"Ta bort data från surfplattan utan förvarning genom att återställa standardinställningarna."</string>
<string name="policydesc_wipeData" product="tv" msgid="5816221315214527028">"Rensar uppgifterna på tv:n utan föregående varning genom att återställa standardinställningarna."</string>
<string name="policydesc_wipeData" product="default" msgid="5096895604574188391">"Ta bort data från mobilen utan förvarning genom att återställa standardinställningarna."</string>
@@ -630,7 +628,7 @@
<string name="relationTypeMother" msgid="4578571352962758304">"Mamma"</string>
<string name="relationTypeParent" msgid="4755635567562925226">"Förälder"</string>
<string name="relationTypePartner" msgid="7266490285120262781">"Partner"</string>
- <string name="relationTypeReferredBy" msgid="101573059844135524">"Rekommenderad av"</string>
+ <string name="relationTypeReferredBy" msgid="101573059844135524">"Genom"</string>
<string name="relationTypeRelative" msgid="1799819930085610271">"Släkting"</string>
<string name="relationTypeSister" msgid="1735983554479076481">"Syster"</string>
<string name="relationTypeSpouse" msgid="394136939428698117">"Make/maka"</string>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 818ee1d..fc442f1 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Inaruhusu programu kupokea na kuchakata ujumbe medianwai (MMS). Hii inamaanisha uwezo wa kuchunguza na kufuta ujumbe uliotumwa kwa kifaa chako bila ya kukuonyesha."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"soma mawasiliano ya matangazo ya simu"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Huruhusu programu kusoma mawasiliano ya matangazo ya simu yaliyoingia kwenye kifaa chako. Arifa za matangazo ya simu huwasilishwa katika maeneo mengine ili kukuonya juu ya hali za dharura. Huenda programu hasidi zikatatiza utendajikazi au shughuli ya kifaa chako wakati matangazo ya simu ya dharura yameingia."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Akaunti zako"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Fikia akaunti zinazopatikana."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"kusoma mipasho kutoka vyanzo unavyofuatilia"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Inaruhusu programu kupata maelezo kuhusu mlisho iliyolandanishwa kwa sasa."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"tuma na uangalie ujumbe wa SMS"</string>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index cc9f34b..e51677f 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS செய்திகளைப் பெற, செயற்படுத்தப் பயன்பாட்டை அனுமதிக்கிறது. இதற்கு அர்த்தம் உங்கள் சாதனத்திற்கு அனுப்பப்படும் செய்திகளை உங்களுக்குக் காட்டாமல் கண்காணிக்கவோ, நீக்கவோ பயன்பாட்டால் முடியும் என்பதாகும்."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"செல் அலைபரப்புச் செய்திகளைப் படித்தல்"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"உங்கள் சாதனத்தில் பெறப்படும் செல் அலைபரப்புச் செய்திகளைப் படிப்பதற்குப் பயன்பாட்டை அனுமதிக்கிறது. அவசரநிலை சூழ்நிலைகளை உங்களுக்கு எச்சரிக்கைச் செய்வதற்கு சில இடங்களில் செல் அலைபரப்பு விழிப்பூட்டல்கள் வழங்கப்படும். அவசரநிலை மொபைல் அலைபரப்புப் பெறப்படும்போது உங்கள் சாதனத்தின் செயல்திறன் அல்லது செயல்பாட்டுடன் தீங்கிழைக்கும் பயன்பாடுகள் அதைத் தடுக்கலாம்."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"உங்கள் கணக்குகள்"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"கிடைக்கும் கணக்குகளை அணுக முடியும்."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"குழுசேர்ந்த ஊட்டங்களைப் படித்தல்"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"தற்போது ஒத்திசைந்த ஊட்டங்களைப் பற்றிய விவரங்களைப் பெற பயன்பாட்டை அனுமதிக்கிறது."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS செய்திகளை அனுப்புதல் மற்றும் பார்த்தல்"</string>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index e96403a..a7656b4 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"MMS సందేశాలను స్వీకరించడానికి మరియు ప్రాసెస్ చేయడానికి అనువర్తనాన్ని అనుమతిస్తుంది. అనువర్తనం మీ పరికరానికి పంపబడిన సందేశాలను మీకు చూపకుండానే పర్యవేక్షించగలదని లేదా తొలగించగలదని దీని అర్థం."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"సెల్ ప్రసార సందేశాలను చదవడం"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"మీ పరికరం స్వీకరించిన సెల్ ప్రసార సందేశాలను చదవడానికి అనువర్తనాన్ని అనుమతిస్తుంది. సెల్ ప్రసార హెచ్చరికలు అత్యవసర పరిస్థితుల గురించి మిమ్మల్ని హెచ్చరించడానికి కొన్ని స్థానాల్లో అందించబడతాయి. అత్యవసర సెల్ ప్రసారం స్వీకరించినప్పుడు హానికరమైన అనువర్తనాలు మీ పరికరం యొక్క పనితీరు లేదా నిర్వహణకు అంతరాయం కలిగించవచ్చు."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"మీ ఖాతాలు"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"అందుబాటులో ఉన్న ఖాతాలను ప్రాప్యత చేయండి."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"చందా చేయబడిన ఫీడ్లను చదవడం"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ప్రస్తుతం సమకాలీకరించిన ఫీడ్ల గురించి వివరాలను పొందడానికి అనువర్తనాన్ని అనుమతిస్తుంది."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS సందేశాలను పంపడానికి మరియు వీక్షించడానికి అనుమతి"</string>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 813c61f..229a2b8 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"อนุญาตให้แอปพลิเคชันรับและประมวลผลข้อความ MMS ซึ่งหมายความว่าแอปพลิเคชันจะสามารถตรวจสอบหรือลบข้อความที่ส่งมายังอุปกรณ์ของคุณได้โดยไม่ต้องแสดงให้คุณเห็น"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"อ่านข้อความที่ได้รับจากสถานีมือถือ"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"อนุญาตให้แอปอ่านข้อความจากสถานีมือถือที่อุปกรณ์ได้รับ การแจ้งเตือนทางมือถือมีให้บริการในบางพื้นที่ โดยจะแจ้งเตือนคุณเกี่ยวกับสถานการณ์ฉุกเฉิน แอปที่เป็นอันตรายอาจเข้าแทรกแซงการทำงานของอุปกรณ์เมื่อได้รับข้อความแจ้งเตือนฉุกเฉิน"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"บัญชีของคุณ"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"เข้าถึงบัญชีที่ใช้งานได้"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"อ่านฟีดข้อมูลที่สมัครไว้"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"อนุญาตให้แอปพลิเคชันดูรายละเอียดเกี่ยวกับฟีดที่ซิงค์ไว้ในปัจจุบัน"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"ส่งและดูข้อความ SMS"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 4b0cba6..2feab88 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Pinapayagan ang app na tumanggap at magproseso ng mga mensaheng MMS. Nangangahulugan ito na maaaring sumubaybay o magtanggal ang app ng mga mensaheng ipinapadala sa iyong device nang hindi ipinapakita ang mga ito sa iyo."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"basahin ang mga mensahe ng cell broadcast"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Binibigyang-daan ang app na magbasa ng mga mensahe ng cell broadcast na natanggap ng iyong device. Inihahatid ang mga alerto ng cell broadcast sa ilang lokasyon upang balaan ka tungkol sa mga emergency na sitwasyon. Maaaring makaabala ang nakakahamak na apps sa pagganap o pagpapatakbo ng iyong device kapag nakatanggap ng emergency na cell broadcast."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Iyong mga account"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"I-access ang mga available na account."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"magbasa ng mga na-subscribe na feed"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Pinapayagan ang app na kumuha ng mga detalye tungkol sa kasalukuyang naka-sync na mga feed."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"magpadala at tumingin ng mga mensaheng SMS"</string>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index f6144c2..bc13b1f 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"fotoğraf çekme ve video kaydetme"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"Telefon"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"telefon aramaları yapma ve çağrıları yönetme"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"Vücut Sensörleri"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"hayati belirtilerinizle ilgili sensör verilerine erişme"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Pencere içeriğini alma"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Etkileşim kurduğunuz pencerenin içeriğini inceler."</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Uygulamaya MMS iletilerini alma ve işleme izni verir. Bu izin, uygulamanın cihazınıza gönderilen iletileri takip edip size göstermeden silebileceği anlamına gelir."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"hücre yayını mesajlarını oku"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Uygulamaya, cihazınız tarafından alınan hücre yayını mesajlarını okuma izni verir. Hücre yayını uyarıları bazı yerlerde acil durumlar konusunda sizi uyarmak için gönderilir. Kötü amaçlı uygulamalar acil hücre yayını alındığında cihazınızın performansına ya da çalışmasına engel olabilir."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hesaplarınız"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Kullanılabilir hesaplara erişin."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"abone olunan yayınları okuma"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Uygulamaya, o anda senkronize olan özet akışları ile ilgili bilgi alma izni verir."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS iletileri gönderme ve görüntüleme"</string>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 0d23acd..338db0f 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -272,8 +272,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Дозволяє програмі отримувати й обробляти MMS-повідомлення. Це означає, що програма може відстежувати чи видаляти повідомлення, надіслані на ваш пристрій, навіть не показуючи їх вам."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"читати широкомовні повідомлення мережі"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Дозволяє програмі читати широкомовні повідомлення мережі, отримані пристроєм. Широкомовні сповіщення мережі надсилаються в деяких країнах для попередження про надзвичайні ситуації. Шкідливі програми можуть втручатися у швидкодію чи роботу пристрою під час отримання широкомовного повідомлення мережі про надзвичайну ситуацію."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ваші облікові записи"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Доступ до доступних обл. записів."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"читати підписані канали"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Дозволяє програмі отримувати відомості про поточно синхронізовані канали."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"надсилати та переглядати SMS-повідомлення"</string>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index ce3f2de..7890c2ab 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"تصاویر لیں اور ویڈیو ریکارڈ کریں"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"فون"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"فون کالز کریں اور ان کا نظم کریں"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"جسم سینسرز"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"اپنی علامات حیات کے متعلق سنسر ڈیٹا تک رسائی حاصل کریں"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ونڈو مواد بازیافت کرنے کی"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"کسی ایسی ونڈو کے مواد کا معائنہ کریں جس کے ساتھ آپ تعامل کر رہے ہیں۔"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"ایپ کو MMS پیغامات حاصل اور ان پر کارروائی کرنے کی اجازت دیتا ہے۔ اس کا مطلب ہے کہ ایپ آپ کے آلے پر مرسلہ پیغامات آپ کو دکھائے بغیر ان پر نگاہ رکھ یا انہیں حذف کرسکتی ہے۔"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"سیل کے نشریاتی پیغامات پڑھیں"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"ایپ کو آپ کے آلے کو موصولہ سیل کے نشریاتی پیغامات پڑھنے کی اجازت دیتا ہے۔ سیل کی نشریاتی الرٹس آپ کو ہنگامی حالات سے مطلع کرنے کیلئے کچھ مقامات میں مہیا کی جاتی ہیں۔ نقصان دہ ایپس کوئی ہنگامی سیل کا نشریہ موصول ہونے پر آپ کے آلے کی کارکردگی یا عمل میں خلل ڈال سکتی ہیں۔"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"آپ کے اکاؤنٹس"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"دستیاب اکاؤنٹس تک رسائی حاصل کریں۔"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"سبسکرائب کردہ فیڈز پڑھیں"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"ایپ کو فی الحال مطابقت پذیر کیے ہوئے فیڈز کے بارے میں تفصیلات حاصل کرنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS پیغامات بھیجیں اور دیکھیں"</string>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index 10d7661..38a5ef1 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Ilovaga MMS xabarlarini qabul qilish va ularni qayta ishlash uchun ruxsat beradi. Bu sizga yuborilgan xabarlarni ilova sizga ko‘rsatmasdan kuzatishi va o‘chirishi mumkinligini bildiradi."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"uyali tarmoq operatori xabarlarini o‘qish"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ilovaga qurilmangiz tomonidan qabul qilingan uyali tarmoq operatori xabarlarini o‘qish uchun ruxsat beradi. Uyali tarmoq operatorining ogohlantiruvchi xabarlari ba’zi manzillarga favqulodda holatlar haqida ogohlantirish uchun jo‘natiladi. Zararli ilovalar uyali tarmoq orqali favqulodda xabar qabul qilinganda qurilmangizning ish faoliyati yoki amallariga xalaqit qilishi mumkin"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Hisoblaringiz"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Mavjud hisoblarga kirish."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"obunalarni o‘qish"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ilova hozirgi vaqtda sinxronlanayotgan elementlar to‘g‘risidagi ma’lumotlarni olishi mumkin."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"SMS xabarlarni yuborish va ko‘rish"</string>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 93994b6..1ffffed 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Cho phép ứng dụng nhận và xử lý tin nhắn MMS. Điều này có nghĩa là ứng dụng có thể theo dõi hoặc xóa tin nhắn được gửi đến thiết bị của bạn mà không hiển thị chúng cho bạn."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"đọc tin nhắn quảng bá"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Cho phép ứng dụng đọc tin nhắn quảng bá mà thiết bị của bạn nhận được. Tin nhắn quảng bá cảnh báo được gửi ở một số địa điểm nhằm cảnh báo cho bạn về các tình huống khẩn cấp. Các ứng dụng độc hại có thể gây ảnh hưởng đến hiệu suất hoặc hoạt động của thiết bị của bạn khi nhận được tin nhắn quảng bá khẩn cấp."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Tài khoản của bạn"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Truy cập các tài khoản khả dụng."</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"đọc nguồn cấp dữ liệu đã đăng ký"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Cho phép ứng dụng lấy thông tin chi tiết về nguồn cấp dữ liệu hiện được đồng bộ hóa."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"gửi và xem tin nhắn SMS"</string>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 2322a4e..aa45b13 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -242,10 +242,8 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍摄照片和录制视频"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"电话"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"拨打电话和管理通话"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
- <!-- no translation found for permgroupdesc_sensors (7147968539346634043) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"身体传感器"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"访问与您的生命体征相关的传感器数据"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"检索窗口内容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"检查您正与其进行互动的窗口的内容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"启用触摸浏览"</string>
@@ -272,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"允许该应用接收和处理彩信。这就意味着,该应用可能会监视发送到您设备的彩信,或删除发送到您设备的彩信而不向您显示。"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"读取小区广播消息"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允许应用读取您的设备收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您收到小区紧急广播时干扰您设备的性能或操作。"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"您的帐户"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"访问可用的帐户。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"读取订阅的供稿"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允许应用获取有关当前同步的 Feed 的详情。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"发送和查看短信"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 88667c9..11ac6d9 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -242,8 +242,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照和錄製影片"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"人體感應器"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取與您生命體徵相關的感應器資料"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您使用中的視窗內容。"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"允許應用程式接收和處理 MMS 訊息。這表示應用程式可監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"讀取區域廣播訊息"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允許應用程式讀取您裝置接收的區域廣播訊息。某些地點會發出區域廣播警報,警告您發生緊急狀況。惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的性能或運作。"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"您的帳戶"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"存取可用帳戶。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"讀取訂閱的資訊提供"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允許應用程式取得目前已同步的資訊提供的詳細資料。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"傳送和查看 SMS 短訊"</string>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index de8cdde8..4d1b944 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -242,9 +242,8 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照及錄製影片"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"撥打電話及管理通話"</string>
- <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
- <skip />
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取生命徵象的相關感應器資料"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"身體感應器"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"存取生命徵象相關感應器資料"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"擷取視窗內容"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"檢查您存取的視窗內容。"</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"啟用輕觸探索功能"</string>
@@ -271,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"允許應用程式接收和處理多媒體訊息。這項設定可讓應用程式監控傳送至您裝置的訊息,或在您閱讀訊息前擅自刪除訊息。"</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"讀取區域廣播訊息"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"允許應用程式讀取您裝置收到的區域廣播訊息。某些地點會發出區域廣播警示,警告您有緊急狀況發生。請注意,惡意應用程式可能會在裝置收到緊急區域廣播時,干擾裝置的效能或運作。"</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"您的帳戶"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"存取可用帳戶。"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"讀取訂閱資訊提供"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"允許應用程式取得目前已同步處理的資訊提供詳細資料。"</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"傳送及查看簡訊"</string>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 355e746..1129d9a 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -270,8 +270,6 @@
<string name="permdesc_receiveMms" msgid="533019437263212260">"Ivumela uhlelo lokusebenza ukuthola nokucubungula imilayezo ye-MMS. Loku kuchaza ukuthi uhlelo lokusebenza lungangamela noma lesuse imilayezo ethunyelwe kudivayisi yakho ngaphandle kokukubonisa yona."</string>
<string name="permlab_readCellBroadcasts" msgid="1598328843619646166">"funda imilayezo yokusakaza yeselula"</string>
<string name="permdesc_readCellBroadcasts" msgid="6361972776080458979">"Ivumela uhlelo lokusebenza ukufunda imilayezo yokusakaza yeselula etholwe idivayisi yakho. Izaziso zokusakaza zeselula zilethwa kwezinye izindawo ukukuxwayisa ngezimo ezisheshayo. Izinhlelo zokusebenza ezingalungile zingaphazamisana nokusebenza noma umsebenzi wedivayisi yakho uma ukusakaza kweselula kwesimo esisheshayo kutholwa."</string>
- <string name="permgrouplab_accounts" msgid="3359646291125325519">"Ama-akhawunti akho"</string>
- <string name="permgroupdesc_accounts" msgid="4948732641827091312">"Finyelela kuma-akhawunti atholakalayo"</string>
<string name="permlab_subscribedFeedsRead" msgid="4756609637053353318">"funda izifunzo ezikhokhelwayo"</string>
<string name="permdesc_subscribedFeedsRead" msgid="5557058907906144505">"Ivumela uhlelo lokusebenza ukuthi ithole imininingwane mayelana namafidi avumelnisiwe njengamanje."</string>
<string name="permlab_sendSms" msgid="7544599214260982981">"thumela uphinde ubuke imilayezo ye-SMS"</string>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fd47d49..b1925ba 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3124,6 +3124,8 @@
<flag name="typeWindowsChanged" value="0x00400000" />
<!-- Receives {@link android.view.accessibility.AccessibilityEvent#TYPE_VIEW_CONTEXT_CLICKED} events. -->
<flag name="typeContextClicked" value="0x00800000" />
+ <!-- Receives {@link android.view.accessibility.AccessibilityEvent#TYPE_ASSIST_READING_CONTEXT} events. -->
+ <flag name="typeAssistReadingContext" value="0x01000000" />
<!-- Receives {@link android.view.accessibility.AccessibilityEvent#TYPES_ALL_MASK} i.e. all events. -->
<flag name="typeAllMask" value="0xffffffff" />
</attr>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 4bc2205..451813c 100755
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2258,4 +2258,7 @@
<!-- Flag indicating device support for EAP SIM, AKA, AKA' -->
<bool name="config_eap_sim_based_auth_supported">true</bool>
+
+ <!-- How long history of previous vibrations should be kept for the dumpsys. -->
+ <integer name="config_previousVibrationsDumpLimit">20</integer>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 5288fa3..bf6b015 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -676,11 +676,6 @@
Malicious apps may interfere with the performance or operation of your
device when an emergency cell broadcast is received.</string>
- <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permgrouplab_accounts">Your accounts</string>
- <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. -->
- <string name="permgroupdesc_accounts">Access the available accounts.</string>
-
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_subscribedFeedsRead">read subscribed feeds</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index ebbbc4c..01ecba8 100755
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1708,6 +1708,7 @@
<java-symbol type="integer" name="config_notificationsBatteryLowARGB" />
<java-symbol type="integer" name="config_notificationsBatteryMediumARGB" />
<java-symbol type="integer" name="config_notificationServiceArchiveSize" />
+ <java-symbol type="integer" name="config_previousVibrationsDumpLimit" />
<java-symbol type="integer" name="config_radioScanningTimeout" />
<java-symbol type="integer" name="config_screenBrightnessSettingMinimum" />
<java-symbol type="integer" name="config_screenBrightnessSettingMaximum" />
diff --git a/core/tests/coretests/src/android/net/LinkPropertiesTest.java b/core/tests/coretests/src/android/net/LinkPropertiesTest.java
index 5c55efb..ea444a4 100644
--- a/core/tests/coretests/src/android/net/LinkPropertiesTest.java
+++ b/core/tests/coretests/src/android/net/LinkPropertiesTest.java
@@ -16,6 +16,8 @@
package android.net;
+import android.net.IpPrefix;
+import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.LinkProperties.ProvisioningChange;
import android.net.RouteInfo;
@@ -26,6 +28,7 @@
import java.net.InetAddress;
import java.util.ArrayList;
+
public class LinkPropertiesTest extends TestCase {
private static InetAddress ADDRV4 = NetworkUtils.numericToInetAddress("75.208.6.1");
private static InetAddress ADDRV6 = NetworkUtils.numericToInetAddress(
@@ -567,4 +570,80 @@
assertEquals(ProvisioningChange.STILL_PROVISIONED,
LinkProperties.compareProvisioning(v6lp, v6lp2));
}
+
+ @SmallTest
+ public void testIsReachable() {
+ final LinkProperties v4lp = new LinkProperties();
+ assertFalse(v4lp.isReachable(DNS1));
+ assertFalse(v4lp.isReachable(DNS2));
+
+ // Add an on-link route, making the on-link DNS server reachable,
+ // but there is still no IPv4 address.
+ assertTrue(v4lp.addRoute(new RouteInfo(
+ new IpPrefix(NetworkUtils.numericToInetAddress("75.208.0.0"), 16))));
+ assertFalse(v4lp.isReachable(DNS1));
+ assertFalse(v4lp.isReachable(DNS2));
+
+ // Adding an IPv4 address (right now, any IPv4 address) means we use
+ // the routes to compute likely reachability.
+ assertTrue(v4lp.addLinkAddress(new LinkAddress(ADDRV4, 16)));
+ assertTrue(v4lp.isReachable(DNS1));
+ assertFalse(v4lp.isReachable(DNS2));
+
+ // Adding a default route makes the off-link DNS server reachable.
+ assertTrue(v4lp.addRoute(new RouteInfo(GATEWAY1)));
+ assertTrue(v4lp.isReachable(DNS1));
+ assertTrue(v4lp.isReachable(DNS2));
+
+ final LinkProperties v6lp = new LinkProperties();
+ final InetAddress kLinkLocalDns = NetworkUtils.numericToInetAddress("fe80::6:1");
+ final InetAddress kLinkLocalDnsWithScope = NetworkUtils.numericToInetAddress("fe80::6:2%43");
+ final InetAddress kOnLinkDns = NetworkUtils.numericToInetAddress("2001:db8:85a3::53");
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertFalse(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertFalse(v6lp.isReachable(kOnLinkDns));
+ assertFalse(v6lp.isReachable(DNS6));
+
+ // Add a link-local route, making the link-local DNS servers reachable. Because
+ // we assume the presence of an IPv6 link-local address, link-local DNS servers
+ // are considered reachable, but only those with a non-zero scope identifier.
+ assertTrue(v6lp.addRoute(new RouteInfo(
+ new IpPrefix(NetworkUtils.numericToInetAddress("fe80::"), 64))));
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertFalse(v6lp.isReachable(kOnLinkDns));
+ assertFalse(v6lp.isReachable(DNS6));
+
+ // Add a link-local address--nothing changes.
+ assertTrue(v6lp.addLinkAddress(LINKADDRV6LINKLOCAL));
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertFalse(v6lp.isReachable(kOnLinkDns));
+ assertFalse(v6lp.isReachable(DNS6));
+
+ // Add a global route on link, but no global address yet. DNS servers reachable
+ // via a route that doesn't require a gateway: give them the benefit of the
+ // doubt and hope the link-local source address suffices for communication.
+ assertTrue(v6lp.addRoute(new RouteInfo(
+ new IpPrefix(NetworkUtils.numericToInetAddress("2001:db8:85a3::"), 64))));
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertTrue(v6lp.isReachable(kOnLinkDns));
+ assertFalse(v6lp.isReachable(DNS6));
+
+ // Add a global address; the on-link global address DNS server is (still)
+ // presumed reachable.
+ assertTrue(v6lp.addLinkAddress(new LinkAddress(ADDRV6, 64)));
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertTrue(v6lp.isReachable(kOnLinkDns));
+ assertFalse(v6lp.isReachable(DNS6));
+
+ // Adding a default route makes the off-link DNS server reachable.
+ assertTrue(v6lp.addRoute(new RouteInfo(GATEWAY62)));
+ assertFalse(v6lp.isReachable(kLinkLocalDns));
+ assertTrue(v6lp.isReachable(kLinkLocalDnsWithScope));
+ assertTrue(v6lp.isReachable(kOnLinkDns));
+ assertTrue(v6lp.isReachable(DNS6));
+ }
}
diff --git a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
index a50fb54..31a4703 100644
--- a/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
+++ b/core/tests/inputmethodtests/src/android/os/InputMethodTest.java
@@ -51,11 +51,15 @@
private static final Locale LOCALE_FR = new Locale("fr");
private static final Locale LOCALE_FR_CA = new Locale("fr", "CA");
private static final Locale LOCALE_HI = new Locale("hi");
+ private static final Locale LOCALE_JA = new Locale("ja");
private static final Locale LOCALE_JA_JP = new Locale("ja", "JP");
private static final Locale LOCALE_ZH_CN = new Locale("zh", "CN");
private static final Locale LOCALE_ZH_TW = new Locale("zh", "TW");
private static final Locale LOCALE_IN = new Locale("in");
private static final Locale LOCALE_ID = new Locale("id");
+ private static final Locale LOCALE_TH = new Locale("ht");
+ private static final Locale LOCALE_TH_TH = new Locale("ht", "TH");
+ private static final Locale LOCALE_TH_TH_TH = new Locale("ht", "TH", "TH");
private static final String SUBTYPE_MODE_KEYBOARD = "keyboard";
private static final String SUBTYPE_MODE_VOICE = "voice";
private static final String SUBTYPE_MODE_ANY = null;
@@ -849,4 +853,99 @@
return preinstalledImes;
}
+
+ @SmallTest
+ public void testGetSuitableLocalesForSpellChecker() throws Exception {
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_US);
+ assertEquals(3, locales.size());
+ assertEquals(LOCALE_EN_US, locales.get(0));
+ assertEquals(LOCALE_EN_GB, locales.get(1));
+ assertEquals(LOCALE_EN, locales.get(2));
+ }
+
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_GB);
+ assertEquals(3, locales.size());
+ assertEquals(LOCALE_EN_GB, locales.get(0));
+ assertEquals(LOCALE_EN_US, locales.get(1));
+ assertEquals(LOCALE_EN, locales.get(2));
+ }
+
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_EN);
+ assertEquals(3, locales.size());
+ assertEquals(LOCALE_EN, locales.get(0));
+ assertEquals(LOCALE_EN_US, locales.get(1));
+ assertEquals(LOCALE_EN_GB, locales.get(2));
+ }
+
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_EN_IN);
+ assertEquals(4, locales.size());
+ assertEquals(LOCALE_EN_IN, locales.get(0));
+ assertEquals(LOCALE_EN_US, locales.get(1));
+ assertEquals(LOCALE_EN_GB, locales.get(2));
+ assertEquals(LOCALE_EN, locales.get(3));
+ }
+
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_JA_JP);
+ assertEquals(5, locales.size());
+ assertEquals(LOCALE_JA_JP, locales.get(0));
+ assertEquals(LOCALE_JA, locales.get(1));
+ assertEquals(LOCALE_EN_US, locales.get(2));
+ assertEquals(LOCALE_EN_GB, locales.get(3));
+ assertEquals(Locale.ENGLISH, locales.get(4));
+ }
+
+ // Test 3-letter language code.
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_FIL_PH);
+ assertEquals(5, locales.size());
+ assertEquals(LOCALE_FIL_PH, locales.get(0));
+ assertEquals(LOCALE_FIL, locales.get(1));
+ assertEquals(LOCALE_EN_US, locales.get(2));
+ assertEquals(LOCALE_EN_GB, locales.get(3));
+ assertEquals(Locale.ENGLISH, locales.get(4));
+ }
+
+ // Test variant.
+ {
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(LOCALE_TH_TH_TH);
+ assertEquals(6, locales.size());
+ assertEquals(LOCALE_TH_TH_TH, locales.get(0));
+ assertEquals(LOCALE_TH_TH, locales.get(1));
+ assertEquals(LOCALE_TH, locales.get(2));
+ assertEquals(LOCALE_EN_US, locales.get(3));
+ assertEquals(LOCALE_EN_GB, locales.get(4));
+ assertEquals(Locale.ENGLISH, locales.get(5));
+ }
+
+ // Test Locale extension.
+ {
+ final Locale localeWithoutVariant = LOCALE_JA_JP;
+ final Locale localeWithVariant = new Locale.Builder()
+ .setLocale(LOCALE_JA_JP)
+ .setExtension('x', "android")
+ .build();
+ assertFalse(localeWithoutVariant.equals(localeWithVariant));
+
+ final ArrayList<Locale> locales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(localeWithVariant);
+ assertEquals(5, locales.size());
+ assertEquals(LOCALE_JA_JP, locales.get(0));
+ assertEquals(LOCALE_JA, locales.get(1));
+ assertEquals(LOCALE_EN_US, locales.get(2));
+ assertEquals(LOCALE_EN_GB, locales.get(3));
+ assertEquals(Locale.ENGLISH, locales.get(4));
+ }
+ }
}
diff --git a/docs/html-intl/intl/es/preview/api-overview.jd b/docs/html-intl/intl/es/preview/api-overview.jd
new file mode 100644
index 0000000..ddd34db
--- /dev/null
+++ b/docs/html-intl/intl/es/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=Información general de la API
+page.keywords=versión preliminar,sdk,compatibilidad
+page.tags=recursos de la versión preliminar, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Contenido del documento<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+
+ <span class="more">mostrar más</span>
+ <span class="less" style="display:none">mostrar menos</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">Vinculación de la aplicación</a></li>
+ <li><a href="#backup">Copia de seguridad automática para aplicaciones</a></li>
+ <li><a href="#authentication">Autenticación</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">Autenticación por huellas dactilares</a></li>
+ <li><a href="#confirm-credential">Confirmar credencial</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">Compartir de forma directa</a></li>
+ <li><a href="#voice-interactions">Interacciones de voz</a></li>
+ <li><a href="#assist">Asistencia de API</a></li>
+ <li><a href="#notifications">Notificaciones</a></li>
+ <li><a href="#bluetooth-stylus">Soporte del lápiz Bluetooth</a></li>
+ <li><a href="#ble-scanning">Exploración mejorada de Bluetooth de bajo consumo</a></li>
+ <li><a href="#hotspot">Soporte de Hotspot 2.0 versión 1</a></li>
+ <li><a href="#4K-display">Modo de pantalla 4K</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">ColorStateLists para poder aplicar temas</a></li>
+ <li><a href="#audio">Características de audio</a></li>
+ <li><a href="#video">Características de video</a></li>
+ <li><a href="#camera">Características de la cámara</a>
+ <ol>
+ <li><a href="#flashlight">API para luz de flash</a></li>
+ <li><a href="#reprocessing">Reprocesamiento de la cámara</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Características de Android for Work</a></li>
+</ol>
+
+<h2>Diferencias de las API</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">Nivel de API 22 para la versión preliminar de Android M »</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M Developer Preview le brinda una perspectiva avanzada de la próxima versión de la plataforma Android, que ofrece nuevas características para usuarios y desarrolladores de aplicaciones.
+
+ En este documento, se brinda una introducción sobre las API más distinguidas.</p>
+
+<p>M Developer Preview está destinado a <strong>usuarios desarrolladores principiantes</strong> y <strong>evaluadores</strong>.
+ Si le interesa influenciar la dirección del marco de trabajo de Android,
+<a href="{@docRoot}preview/setup-sdk.html">pruebe M Developer Preview y</a> envíenos sus comentarios.
+
+</p>
+
+<p class="caution"><strong>Advertencia:</strong> No publique las aplicaciones que utilizan M Developer Preview en la tienda de Google Play.
+</p>
+
+<p class="note"><strong>Nota:</strong> Este documento, a menudo, hace referencia a clases y métodos que aún no cuentan con materiales de referencia disponibles en <a href="{@docRoot}">developer.android.com</a>.
+ Estos elementos de API tienen el formato {@code code style} en este documento (sin hipervínculos).
+ Para obtener la documentación preliminar de la API para estos elementos, descargue la <a href="{@docRoot}preview/download.html#docs"> referencia de la versión preliminar</a>.
+</p>
+
+<h3>Importantes cambios en los comportamientos</h3>
+
+<p>Si publicó anteriormente una aplicación para Android, tenga en cuenta que su aplicación podría verse afectada por los cambios en la plataforma.
+</p>
+
+<p>Consulte la sección <a href="behavior-changes.html">Cambios en los comportamientos</a> para obtener información detallada.</p>
+
+<h2 id="app-linking">Vinculación de la aplicación</h2>
+<p>Esta versión preliminar mejora el sistema de intentos de Android al proporcionar una vinculación más sólida de la aplicación. Esta característica le permite asociar una aplicación con un dominio web propio.
+ Según esta asociación, la plataforma puede determinar la aplicación predeterminada que se debe utilizar para controlar un vínculo web en particular y omitir el paso de pedirles a los usuarios que seleccionen una aplicación. Para aprender a implementar esta característica, consulte la sección
+<a href="{@docRoot}preview/features/app-linking.html">Vinculación de la aplicación</a>.
+
+
+
+<h2 id="backup">Copia de seguridad automática para aplicaciones</h2>
+<p>Ahora, el sistema realiza restauraciones y copias de seguridad de datos completas y automáticas para las aplicaciones. Este comportamiento se habilita de forma predeterminada para las aplicaciones que tienen como destino la versión preliminar de Android M; usted no necesita agregar ningún código adicional.
+ Si los usuarios eliminan sus cuentas de Google, también se eliminarán sus datos de copias de seguridad.
+ Para obtener información sobre cómo funciona esta característica y cómo configurar qué elementos incluir en la copia de seguridad del sistema de archivo, consulte la sección
+<a href="{@docRoot}preview/backup/index.html">Copia de seguridad automática para aplicaciones</a>.
+</p>
+
+<h2 id="authentication">Autenticación</h2>
+<p>Esta versión preliminar ofrece nuevas API para permitirle autenticar usuarios al usar escaneos de huellas dactilares en los dispositivos compatibles y verificar cuán reciente es la última autenticación del usuario al utilizar un mecanismo de desbloqueo de dispositivos (como una contraseña de pantalla de bloqueo).
+
+ Use estas API junto con el <a href="{@docRoot}training/articles/keystore.html">sistema Android Keystore</a>.
+</p>
+
+<h3 id="fingerprint-authentication">Autenticación por huellas dactilares</h3>
+
+<p>Para autenticar usuarios mediante el escaneo de huellas dactilares, obtenga una instancia de la nueva clase
+{@code android.hardware.fingerprint.FingerprintManager} y llame al método
+{@code FingerprintManager.authenticate()}. Su aplicación se debe ejecutar en un dispositivo compatible con un sensor de huellas dactilares.
+ Debe implementar la interfaz de usuario para el flujo de autenticación por huellas dactilares en su aplicación y debe utilizar el ícono de huella dactilar estándar de Android en la UI. El ícono de huella dactilar de Android ({@code c_fp_40px.png}) se incluye en la
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">aplicación de muestra</a>. Si está desarrollando múltiples aplicaciones que utilizan la autenticación por huellas dactilares, tenga en cuenta que cada aplicación debe autenticar la huella dactilar del usuario de manera independiente.
+
+
+
+</p>
+
+<p>Para utilizar esta característica en su aplicación, primero agregue el permiso {@code USE_FINGERPRINT} en su manifiesto.
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>Para ver cómo una aplicación implementa la autenticación por huellas dactilares, consulte la sección
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">
+Ejemplo de diálogo de huella dactilar</a>.</p>
+
+<p>Si está evaluando esta característica, siga estos pasos:</p>
+<ol>
+<li>Instale la Revisión de herramientas del SDK de Android versión 24.3, si todavía no la instaló.</li>
+<li>Registre una huella dactilar nueva en el emulador; para hacerlo, vaya a
+<strong>Settings > Security > Fingerprint</strong>, luego siga las instrucciones de registro.</li>
+<li>Use un emulador para emular eventos táctiles de huellas dactilares con el siguiente comando.
+ Utilice el mismo comando para emular eventos táctiles de huellas dactilares en la pantalla de bloqueo o en su aplicación.
+
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>En Windows, posiblemente tenga que ejecutar {@code telnet 127.0.0.1 <emulator-id>} seguido de
+ {@code finger touch <finger_id>}.
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">Confirmar credencial</h3>
+<p>Su aplicación puede autenticar usuarios según el tiempo que haya pasado desde que desbloquearon su dispositivo por última vez. Esta característica evita que los usuarios tengan que recordar contraseñas adicionales específicas de la aplicación y elimina la necesidad de que usted tenga que implementar su propia interfaz de usuario de autenticación.
+
+ Su aplicación debe utilizar esta característica junto con una implementación de clave pública o secreta para la autenticación del usuario.
+</p>
+
+<p>Para definir la duración del tiempo de espera en el que se puede volver a usar la misma clave después de que un usuario se haya autenticado correctamente, llame al nuevo método
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+cuando configure {@link javax.crypto.KeyGenerator} o
+{@link java.security.KeyPairGenerator}.
+ Esta característica actualmente funciona para operaciones criptográficas simétricas.
+</p>
+
+<p>Evite mostrar el diálogo de nueva autenticación de forma excesiva: sus aplicaciones deben intentar utilizar el objeto criptográfico primero y, si se agota el tiempo de espera, deben usar el método
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
+para volver a autenticar el usuario dentro de su aplicación.
+
+</p>
+
+<p>Para ver cómo la aplicación implementa esta característica, consulte la sección
+<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">
+Ejemplo de cómo confirmar la credencial</a>.</p>
+
+<h2 id="direct-share">Compartir de forma directa</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>Esta versión preliminar le proporciona API para que la acción de compartir sea intuitiva y rápida para los usuarios. Ahora, puede definir <em>destinos para compartir de forma directa</em> que inician una actividad específica en su aplicación. Estos destinos para compartir de forma directa se exponen a los usuarios a través del menú <em>Share</em>.
+
+ Esta característica les permite a los usuarios compartir contenido con los destinos, como contactos, dentro de otras aplicaciones.
+ Por ejemplo, el destino para compartir de forma directa podría iniciar una actividad en otra aplicación de red social, lo que le permite al usuario compartir contenido directamente con una comunidad o un amigo específicos de esa aplicación.
+
+</p>
+
+<p>Para habilitar destinos para compartir de forma directa, debe definir una clase que extienda el
+{@code android.service.} <br>
+Clase {@code chooser.ChooserTargetService}. Declare su
+{@code ChooserTargetService} en el manifiesto. En esa declaración, especifique el permiso
+{@code BIND_CHOOSER_TARGET_SERVICE} y un filtro de intento con la acción
+{@code SERVICE_INTERFACE}.</p>
+<p>El ejemplo a continuación muestra de qué manera podría declarar {@code ChooserTargetService} en su manifiesto.
+</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>Para cada actividad que desee exponer a {@code ChooserTargetService}, agregue un elemento
+{@code <meta-data>} con el nombre
+{@code "android.service.chooser.chooser_target_service"} en el manifiesto de su aplicación.
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">Interacciones de voz</h2>
+<p>
+Esta versión preliminar proporciona una nueva API de interacción de voz que, junto con las
+<a href="https://developers.google.com/voice-actions/" class="external-link">acciones de voz</a>,
+le permite compilar experiencias de conversaciones de voz en sus aplicaciones. Llame al método
+{@code android.app.Activity.isVoiceInteraction()} para determinar si su actividad se inició en respuesta a una acción de voz.
+ De ser así, su aplicación puede utilizar la clase
+{@code android.app.VoiceInteractor} para solicitar una confirmación de voz por parte del usuario, realizar una selección de una lista de opciones y mucho más.
+ Para obtener más información sobre cómo implementar acciones de voz, consulte el
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">sitio para desarrolladores de acciones de voz</a>.
+</p>
+
+<h2 id="assist">Asistencia de API</h2>
+<p>
+Esta versión preliminar ofrece una nueva manera para que los usuarios interactúen con sus aplicaciones a través de un asistente. Si desea utilizar esta característica, el usuario debe habilitar el asistente para utilizar el contexto actual.
+ Una vez habilitado, para invocar al asistente dentro de cualquier aplicación, el usuario debe mantener presionado el botón <strong>Home</strong>.
+</p>
+<p>Su aplicación puede optar por no compartir el contexto actual con el asistente al configurar la marca
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE}. Además del conjunto de información estándar que la plataforma le pasa al asistente, su aplicación puede compartir información adicional usando la nueva clase {@code android.app.Activity.AssistContent}.
+
+</p>
+
+<p>Para proporcionarle al asistente contexto adicional desde su aplicación, siga estos pasos:</p>
+
+<ol>
+<li>Implemente la interfaz {@link android.app.Application.OnProvideAssistDataListener}.</li>
+<li>Registre esta escucha usando
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li>
+<li>Para proporcionar información contextual específica de la actividad, invalide la devolución de llamada
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
+y, opcionalmente, la nueva devolución de llamada {@code Activity.onProvideAssistContent()}.
+</ol>
+
+<h2 id="notifications">Notificaciones</h2>
+<p>Esta versión preliminar agrega los siguientes cambios de API para las notificaciones:</p>
+<ul>
+ <li>Nuevo nivel de filtro {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} que corresponde al nuevo modo ocupado <em>Solo alarmas</em>.
+</li>
+ <li>Nuevo valor de categoría {@code Notification.CATEGORY_REMINDER} que se utiliza para distinguir recordatorios programados por el usuario de otros eventos
+ ({@link android.app.Notification#CATEGORY_EVENT}) y alarmas
+ ({@link android.app.Notification#CATEGORY_ALARM}).
+</li>
+ <li>Nueva clase {@code android.graphics.drawable.Icon} que se puede adjuntar a sus notificaciones a través de los métodos {@code Notification.Builder.setSmallIcon(Icon)} y
+{@code Notification.Builder.setLargeIcon(Icon)}.
+</li>
+ <li>Nuevo método {@code NotificationManager.getActiveNotifications()} que permite que sus aplicaciones descubran qué notificaciones se encuentran actualmente activas.
+ Para ver una implementación de la aplicación que utilice esta característica, consulte la sección <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">Ejemplo de notificaciones activas</a>.
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">Compatibilidad del lápiz Bluetooth</h2>
+<p>Esta versión preliminar ofrece soporte mejorado para las entradas de usuarios que utilizan un lápiz Bluetooth. Los usuarios pueden sincronizar y conectar un lápiz Bluetooth compatible con su teléfono o tablet.
+ Mientras está conectado, la información de posición de la pantalla táctil se fusiona con la información de los botones y la presión del lápiz para proporcionar una mayor variedad de expresiones que al utilizar la pantalla táctil solamente.
+
+ Su aplicación puede obedecer cuando se presiona el botón del lápiz y cuando se realizan acciones secundarias al registrar las nuevas devoluciones de llamadas
+{@code View.onStylusButtonPressListener} y {@code GestureDetector.OnStylusButtonPressListener}
+en su actividad.
+</p>
+
+<p>Utilice las constantes y los métodos {@link android.view.MotionEvent} para detectar las interacciones del botón del lápiz:
+</p>
+<ul>
+<li>Si el usuario toca un lápiz con un botón en la pantalla de su aplicación, el método
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} devuelve
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
+<li>Para las aplicaciones que tienen como destino la versión preliminar de Android M, el método
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+devuelve {@code MotionEvent.STYLUS_BUTTON_PRIMARY} cuando el usuario presiona el botón principal del lápiz.
+ Si el lápiz tiene un segundo botón, el mismo método devuelve
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY} cuando el usuario lo presiona. Si el usuario presiona ambos botones simultáneamente, el método devuelve ambos valores juntos separados por “OR” ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).
+
+</li>
+<li>
+Para las aplicaciones que tienen como destino una versión anterior de la plataforma, el método
+{@link android.view.MotionEvent#getButtonState() getButtonState()} devuelve
+{@link android.view.MotionEvent#BUTTON_SECONDARY} (cuando se presiona el botón principal),
+{@link android.view.MotionEvent#BUTTON_TERTIARY} (cuando se presiona el botón secundario) o ambos.
+</li>
+</ul>
+
+<h2 id="ble-scanning">Exploración mejorada de Bluetooth de bajo consumo</h2>
+<p>
+Si su aplicación realiza exploraciones de Bluetooth de bajo consumo, puede utilizar el nuevo método
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} para especificar que usted desea que las devoluciones de llamadas se notifiquen solo cuando se encuentre por primera vez un paquete de anuncio que coincida con el conjunto
+{@link android.bluetooth.le.ScanFilter} y cuando no se vea durante un período determinado.
+
+ Este enfoque de exploración es más eficaz en cuanto al consumo de energía que la que se proporciona en la versión anterior de la plataforma.
+
+</p>
+
+<h2 id="hotspot">Soporte de Hotspot 2.0 versión 1</h2>
+<p>
+Esta versión preliminar agrega soporte para la especificación de Hotspot 2.0 versión 1 en los dispositivos Nexus 6 y Nexus 9. Para proveer credenciales de Hotspot 2.0 en su aplicación, use los métodos nuevos de la clase
+{@link android.net.wifi.WifiEnterpriseConfig}, como {@code setPlmn()} y
+{@code setRealm()}.
+ En el objeto {@link android.net.wifi.WifiConfiguration}, puede configurar los campos
+{@link android.net.wifi.WifiConfiguration#FQDN} y {@code providerFriendlyName}. La nueva propiedad {@code ScanResult.PasspointNetwork} indica si una red detectada representa un punto de acceso de Hotspot 2.0.
+
+
+</p>
+
+<h2 id="4K-display">Modo de pantalla 4K</h2>
+<p>Ahora, la plataforma permite que las aplicaciones soliciten que la resolución de pantalla se actualice a una representación 4K en el hardware compatible.
+ Para consultar la resolución física actual, use las nuevas API
+{@code android.view.Display.Mode}. Si la UI se establece en una resolución lógica más baja y se aumenta a una resolución física más alta, tenga en cuenta que la resolución física que devuelve el método
+{@code Display.Mode.getPhysicalWidth()} puede ser diferente de la resolución lógica informada por {@link android.view.Display#getSize(android.graphics.Point) getSize()}.
+
+</p>
+
+<p>Puede pedirle al sistema que cambie la resolución física en su aplicación mientras se ejecuta y, para ello, debe configurar la propiedad {@code WindowManager.LayoutParams.preferredDisplayModeId} de la ventana de su aplicación.
+ Esta característica resulta útil si desea cambiar a la resolución de pantalla 4K.
+ Mientras se encuentra en el modo de pantalla 4K, la UI se continúa representando en la resolución original (como 1080p) y se aumenta a 4K, pero los objetos
+{@link android.view.SurfaceView} pueden mostrar contenido en la resolución nativa.
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">ColorStateLists para poder aplicar temas</h2>
+<p>Ahora, los atributos de tema se admiten en
+{@link android.content.res.ColorStateList} para los dispositivos que ejecutan la versión preliminar de Android M. Los métodos
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} y
+{@link android.content.res.Resources#getColor(int) getColor()} se dejaron de usar. Si desea llamar a estas API, en su lugar, llame a los métodos nuevos {@code Context.getColorStateList()} o
+{@code Context.getColor()}.
+ Estos métodos también se encuentran disponibles en la biblioteca AppCompat v4 vía {@link android.support.v4.content.ContextCompat}.
+</p>
+
+<h2 id="audio">Características de audio</h2>
+
+<p>Esta versión preliminar agrega mejoras al procesamiento de audio en Android, lo que incluye lo siguiente: </p>
+<ul>
+ <li>Soporte para el protocolo <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
+, con las nuevas API {@code android.media.midi}. Utilice estas API para enviar y recibir eventos MIDI.
+</li>
+ <li>Clases nuevas {@code android.media.AudioRecord.Builder} y {@code android.media.AudioTrack.Builder}
+ para crear capturas de audio digital y objetos de reproducción respectivamente, y configurar propiedades de receptores y fuentes de audio para invalidar los valores predeterminados del sistema.
+</li>
+ <li>Enlaces de API para asociar dispositivos de entrada y de audio. Esto resulta particularmente útil si su aplicación les permite a los usuarios iniciar una búsqueda por voz desde un controlador para juegos o un control remoto conectados a un TV con Android. El sistema invoca la nueva devolución de llamada {@code android.app.Activity.onSearchRequested()} cuando el usuario inicia una búsqueda.
+
+
+ Para determinar si el dispositivo de entrada del usuario tiene un micrófono incorporado, recupere el objeto {@link android.view.InputDevice} de esa devolución de llamada y luego llame al nuevo método
+{@code InputDevice.hasMic()}.
+</li>
+ <li>Nueva clase {@code android.media.AudioDevicesManager}, que le permite recuperar una lista de todos los dispositivos de audio receptores y fuente adjuntos.
+ También puede especificar un objeto
+{@code android.media.OnAudioDeviceConnectionListener} si desea que su aplicación reciba una notificación cuando se conecta o desconecta un dispositivo de audio.
+</li>
+</ul>
+
+<h2 id="video">Características de video</h2>
+<p>Esta versión preliminar agrega nuevas capacidades a las API de procesamiento de video, entre ellas, las siguientes:</p>
+<ul>
+<li>Nueva clase {@code android.media.MediaSync} que ayuda a las aplicaciones a representar de forma sincrónica transmisiones de audio y video.
+ Los búferes de audio se envían de manera que no generan bloqueo y regresan mediante una devolución de llamada.
+ Además, admite una velocidad de reproducción dinámica.
+</li>
+<li>Nuevo evento {@code MediaDrm.EVENT_SESSION_RECLAIMED}, que indica cuando una sesión abierta por la aplicación es reclamada por el administrador de recursos.
+ Si su aplicación utiliza sesiones DRM, debe controlar este evento y asegurarse de no utilizar una sesión reclamada.
+
+</li>
+<li>Nuevo código de error {@code MediaCodec.CodecException.ERROR_RECLAIMED}, que indica que el administrador de recursos reclamó el recurso multimedia utilizado por el códec.
+ Con esta excepción, se debe liberar el códec, ya que pasó al estado terminal.
+
+</li>
+<li>Nueva interfaz {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} para obtener una indicación de la cantidad máxima de instancias concurrentes de códec admitidas.
+
+</li>
+<li>Nuevo método {@code MediaPlayer.setPlaybackParams()} para configurar la velocidad de reproducción multimedia para reproducciones rápidas o lentas.
+ Además, alarga o acelera la reproducción de audio de forma automática junto con el video.
+</li>
+</ul>
+
+<h2 id="camera">Características de la cámara</h2>
+<p>Esta versión preliminar incluye las siguientes API nuevas para acceder a la luz de flash de la cámara y para el reprocesamiento de imágenes de la cámara:
+</p>
+
+<h3 id="flashlight">API para luz de flash</h3>
+<p>Si un dispositivo de cámara cuenta con una unidad de flash, puede llamar al método {@code CameraManager.setTorchMode()}
+para activar o desactivar el modo linterna de una unidad de flash sin abrir el dispositivo de cámara. La aplicación no tiene propiedad exclusiva de la unidad de flash ni del dispositivo de cámara.
+ El modo linterna se desactiva y deja de estar disponible cuando la cámara no se encuentra disponible o cuando otros recursos de la cámara que mantienen la linterna encendida dejan de estar disponibles.
+
+ Otras aplicaciones también pueden llamar a {@code setTorchMode()}
+para desactivar el modo linterna. Cuando se cierra la última aplicación que activó el modo linterna, este modo se desactiva.
+</p>
+
+<p>Si desea registrar una devolución de llamada para recibir una notificación sobre el estado del modo linterna, llame al método
+{@code CameraManager.registerTorchCallback()}. La primera vez que se registra la devolución de llamada, se llama inmediatamente con el estado del modo linterna de todos los dispositivos de cámara que se conocen actualmente y que tengan una unidad de flash.
+
+ Si el modo linterna se activa o desactiva correctamente, se invoca al método
+{@code CameraManager.TorchCallback.onTorchModeChanged()}.</p>
+
+<h3 id="reprocessing">API de reprocesamiento</h3>
+<p>La API {@link android.hardware.camera2 Camera2} se extiende para admitir el reprocesamiento de imágenes privadas de formato opaco y YUV.
+ Su aplicación determina si las capacidades de reprocesamiento se encuentran disponibles vía {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}.
+ Si un dispositivo admite el reprocesamiento, usted puede crear una sesión de captura de cámara reprocesable llamando a
+{@code CameraDevice.createReprocessableCaptureSession()} y puede crear solicitudes para el reprocesamiento de búferes de entrada.
+
+</p>
+
+<p>Utilice la clase {@code ImageWriter} para conectar el flujo del búfer de entrada a la entrada de reprocesamiento de la cámara.
+ Para obtener un búfer vacío, siga el modelo de programación que se indica a continuación:</p>
+
+<ol>
+<li>Llame al método {@code ImageWriter.dequeueInputImage()}.</li>
+<li>Complete los datos en el búfer de entrada.</li>
+<li>Envíe el búfer a la cámara llamando al método {@code ImageWriter.queueInputImage()}.</li>
+</ol>
+
+<p>Si está utilizando un objeto {@code ImageWriter} junto con una imagen
+{@code android.graphics.ImageFormat.PRIVATE}, su aplicación no puede acceder a los datos de la imagen de forma directa.
+ En cambio, pase la imagen {@code ImageFormat.PRIVATE} directamente a
+{@code ImageWriter} llamando al método {@code ImageWriter.queueInputImage()} sin ninguna copia del búfer.
+</p>
+
+<p>La clase {@code ImageReader} ahora admite secuencias de imagen de formato {@code android.graphics.ImageFormat.PRIVATE}.
+ Este soporte le permite que su aplicación mantenga una cola de imagen circular de imágenes de salida
+{@code ImageReader}, seleccione una o más imágenes y las envíe a
+{@code ImageWriter} para el reprocesamiento de la cámara.</p>
+
+<h2 id="afw">Características de Android for Work</h2>
+<p>Esta versión preliminar incluye las siguientes API nuevas para Android for Work:</p>
+<ul>
+ <li><strong>Controles mejorados para dispositivos corporativos de uso único:</strong> El propietario de dispositivo ahora puede controlar las configuraciones que se describen a continuación para mejorar la administración de los dispositivos corporativos de uso único (Corporate-Owned, Single-Use, COSU).
+
+
+ <ul>
+ <li>Deshabilitar o volver a habilitar la protección de seguridad con el método
+{@code DevicePolicyManager.setKeyguardEnabledState()}.</li>
+ <li>Deshabilitar o volver a habilitar la barra de estado (lo que incluye configuraciones rápidas, notificaciones y el gesto de navegación al deslizar el dedo hacia arriba para iniciar Google Now) con el método
+{@code DevicePolicyManager.setStatusBarEnabledState()}.
+</li>
+ <li>Deshabilitar o volver a habilitar el inicio seguro con la constante {@link android.os.UserManager}
+{@code DISALLOW_SAFE_BOOT}.</li>
+ <li>Evitar que se apague la pantalla mientras el dispositivo se encuentra conectado con la constante
+ {@link android.provider.Settings.Global} {@code STAY_ON_WHILE_PLUGGED_IN}.</li>
+ </ul>
+ </li>
+ <li><strong>Instalación y desinstalación automáticas de aplicaciones por parte del propietario de dispositivo:</strong> Un propietario de dispositivo ahora puede instalar y desinstalar aplicaciones de manera automática con las API {@link android.content.pm.PackageInstaller}
+, independiente de Google Play for Work.
+ Ahora, puede aprovisionar los dispositivos a través de un propietario de dispositivo que obtiene e instala aplicaciones sin interacción del usuario.
+ Esta característica es útil para habilitar el aprovisionamiento con un toque de quioscos u otros dispositivos similares sin activar una cuenta de Google.
+</li>
+<li><strong>Acceso automático al certificado de empresa:</strong> Ahora cuando una aplicación llama a
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()}, antes de que se indique al usuario que seleccione un certificado, el propietario de dispositivo o perfil puede llamar al método {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} para proporcionar el alias de forma automática a la aplicación que realiza la solicitud.
+
+
+ Esta característica le permite conceder a las aplicaciones gestionadas acceso a certificados sin interacción del usuario.
+</li>
+<li><strong>Aceptación automática de actualizaciones del sistema:</strong> Al configurar una directiva de actualización del sistema con
+{@code DevicePolicyManager.setSystemUpdatePolicy()}, el propietario de dispositivo ahora puede aceptar automáticamente una actualización del sistema, por ejemplo, en el caso de un dispositivo de quiosco, o posponer la actualización y evitar que el usuario la ejecute durante un plazo de hasta 30 días.
+
+ Además, un administrador puede configurar un período de tiempo diario en el que se debe ejecutar una actualización, por ejemplo, durante las horas en que no se usa el dispositivo de quiosco.
+ Cuando hay una actualización del sistema disponible, el sistema verifica si la aplicación Work Policy Controller definió una directiva de actualización del sistema y se comporta según corresponda.
+
+
+</li>
+<li>
+<strong>Instalación delegada de certificados:</strong> Ahora, un propietario de dispositivo o perfil puede concederle a una aplicación de terceros la capacidad de llamar a estas API de administración de certificados {@link android.app.admin.DevicePolicyManager}:
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>Protección de restablecimiento de la configuración predeterminada de fábrica:</strong> Al aprovisionar a un propietario de dispositivo, ahora podrá configurar parámetros para desbloquear la protección de restablecimiento de la configuración predeterminada de fábrica (Factory Reset Protection, FRP) configurando el paquete
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS}.
+ Una aplicación de Programador NFC puede proporcionar estos parámetros después del restablecimiento de un dispositivo para desbloquear la FRP y aprovisionar al dispositivo sin requerir la cuenta de Google configurada previamente.
+
+ Si no modifica estos parámetros, la FRP se conserva y evita que el dispositivo se active sin las credenciales de Google activadas previamente.
+
+
+<p>Además, al configurar las restricciones de la aplicación en los servicios de Google Play, los propietarios de dispositivos pueden especificar cuentas de Google alternativas para desbloquear la FRP y reemplazar las que se encuentran activadas en el dispositivo.
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>Seguimiento del uso de datos:</strong> Ahora, un propietario de dispositivo o perfil puede consultar las estadísticas de uso de datos que se pueden ver en <strong>Settings > Data</strong> utilizando los nuevos métodos
+{@code android.app.usage.NetworkStatsManager}.
+ A los propietarios de perfiles se les concede automáticamente permiso para consultar los datos del perfil que administran, mientras que los propietarios de dispositivo obtienen acceso a los datos de uso del usuario principal administrado.
+
+</li>
+<li><strong>Administración de permisos de tiempo de ejecución:</strong>
+<p>Un propietario de dispositivo o perfil puede configurar una directiva de permisos para todas las solicitudes de tiempo de ejecución de todas las aplicaciones que utilizan
+{@code DevicePolicyManager.setPermissionPolicy()}, a fin de pedirle confirmación al usuario para conceder el permiso de manera normal, o bien, para conceder o negar el permiso automáticamente sin notificarlo.
+
+ Si se configura la última directiva, el usuario no puede modificar la selección realizada por el propietario de dispositivo o perfil dentro de la pantalla de permisos de la aplicación en <strong>Settings</strong>.
+
+</p></li>
+<li><strong>VPN en Settings:</strong> Las aplicaciones de la VPN (red privada virtual) ahora se pueden ver en
+<strong>Settings > More > VPN</strong>. Además, las notificaciones que acompañan el uso de la VPN ahora son específicas para la manera en que dicha VPN está configurada.
+
+ Para el propietario de perfil, las notificaciones son específicas dependiendo de si la VPN se configura para un perfil administrado, un perfil personal o ambos.
+ Para un propietario de dispositivo, las notificaciones son específicas dependiendo de si la VPN se configura para todo el dispositivo.
+</li>
+<li><strong>Notificación del estado del trabajo:</strong> Ahora aparecerá un ícono de maletín en la barra de estado siempre que una aplicación del perfil administrado tenga una actividad en primer plano.
+ Además, si el dispositivo se desbloquea directamente para la actividad de una aplicación del perfil administrado, se mostrará una notificación del sistema para informarle al usuario que se encuentra dentro del perfil de trabajo.
+
+
+</li>
+</ul>
+
+<p class="note">
+ Para obtener una vista detallada de todos los cambios de la API en M Developer Preview, consulte el <a href="{@docRoot}preview/download.html">Informe de diferencias de las API</a>.
+</p>
diff --git a/docs/html-intl/intl/es/preview/behavior-changes.jd b/docs/html-intl/intl/es/preview/behavior-changes.jd
new file mode 100644
index 0000000..75936bd
--- /dev/null
+++ b/docs/html-intl/intl/es/preview/behavior-changes.jd
@@ -0,0 +1,403 @@
+page.title=Cambios en los comportamientos
+page.keywords=versión preliminar,sdk,compatibilidad
+sdk.platform.apiLevel=MNC
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Contenido del documento</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">Permisos de tiempo de ejecución</a></li>
+ <li><a href="#behavior-power">Optimizaciones de ahorro de energía</a>
+ <ol>
+ <li><a href="#behavior-doze">Doze</a></li>
+ <li><a href="#behavior-app-standby">App Standby</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">Dispositivos de almacenamiento adoptables</a></li>
+ <li><a href="#behavior-apache-http-client">Eliminación del cliente HTTP de Apache</a></li>
+ <li><a href="#behavior-audiomanager-Changes">Cambios en AudioManager</a></li>
+ <li><a href="#behavior-test-selection">Selección de texto</a></li>
+ <li><a href="#behavior-keystore">Cambios en Android Keystore</a></li>
+ <li><a href="#behavior-network">Cambios en las funciones de red y Wi-Fi</a></li>
+ <li><a href="#behavior-camera">Cambios en el servicio de cámara</a></li>
+ <li><a href="#behavior-art-runtime">Tiempo de ejecución de ART</a></li>
+ <li><a href="#behavior-apk-validation">Validación de APK</a></li>
+ <li><a href="#behavior-afw">Cambios en Android for Work</a></li>
+</ol>
+
+<h2>Diferencias de las API</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">Nivel de API 22 para la versión preliminar de Android M »</a> </li>
+</ol>
+
+
+<h2>Consulte también</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">Información general de la API de M Developer Preview</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>Además de nuevas características y capacidades, M Developer Preview incluye diversos cambios en el sistema y cambios en los comportamientos de la API.
+ En este documento, se destacan algunos de los cambios principales que debe comprender y justificar en sus aplicaciones.
+</p>
+
+<p>Si publicó anteriormente una aplicación para Android, tenga en cuenta que su aplicación podría verse afectada por estos cambios en la plataforma.
+</p>
+
+<h2 id="behavior-runtime-permissions">Permisos de tiempo de ejecución</h1>
+<p>Esta versión preliminar introduce un nuevo modelo de permisos en el que los usuarios ahora pueden administrar directamente los permisos de la aplicación en tiempo de ejecución.
+ Este modelo les proporciona a los usuarios mayor visibilidad y control sobre los permisos y, al mismo tiempo, simplifica los procesos de instalación y actualización automática para los desarrolladores de aplicaciones. Los usuarios pueden conceder o revocar permisos de forma individual para las aplicaciones instaladas.
+
+ </p>
+
+<p>En sus aplicaciones que tienen como destino la versión preliminar de Android M, asegúrese de comprobar y solicitar los permisos en tiempo de ejecución.
+ Para determinar si se concedió un permiso a su aplicación, llame al nuevo método {@code Context.checkSelfPermission()}.
+ Para solicitar un permiso, llame al nuevo método
+{@code Activity.requestPermission()}. Incluso si su aplicación no tiene como destino la versión preliminar de Android M, debería probar su aplicación de acuerdo con el nuevo modelo de permisos.
+</p>
+
+<p>Para obtener detalles sobre la compatibilidad del nuevo modelo de permisos en su aplicación, consulte la página
+<a href="{@docRoot}preview/features/runtime-permissions.html">
+Permisos</a> de la versión preliminar para desarrolladores. Para obtener consejos sobre cómo evaluar el impacto en su aplicación, consulte la <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">Guía de prueba</a>.
+</p>
+
+<h2 id="behavior-power">Optimizaciones de ahorro de energía</h2>
+<p>Esta versión preliminar introduce nuevas optimizaciones de ahorro de energía para aplicaciones y dispositivos inactivos.</p>
+
+<h3 id="behavior-doze">Doze</h3>
+<p>Si un dispositivo está desconectado y permanece quieto con la pantalla apagada durante un período determinado, pasará al modo <em>Doze</em>, en el que el dispositivo intenta mantener el sistema en estado de suspensión.
+ En este modo, los dispositivos reanudan periódicamente el funcionamiento normal durante períodos breves, de manera que la aplicación se pueda sincronizar y el sistema pueda realizar las operaciones pendientes.
+
+</p>
+
+<p>Durante el modo Doze, se aplican las siguientes restricciones a sus aplicaciones:</p>
+<ul>
+<li>Se deshabilita el acceso a la red, salvo que su aplicación reciba una señal de prioridad alta de Google Cloud Messaging (envío de mensajes a través de la nube de Google).
+</li>
+<li>Se ignoran los <a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">Wakelocks</a>.</li>
+<li>Se deshabilitan las alarmas programadas con la clase {@link android.app.AlarmManager}, salvo las alarmas que haya configurado con el método {@link android.app.AlarmManager#setAlarmClock setAlarmClock()}
+y con {@code AlarmManager.setAndAllowWhileIdle()}.
+</li>
+<li>No se realiza la detección de Wi-Fi.</li>
+<li>No se permite la ejecución de sincronizaciones ni trabajos para sus adaptadores de sincronización y {@link android.app.job.JobScheduler}.
+</li>
+</ul>
+</p>
+<p>Al salir del modo Doze, el dispositivo ejecuta los trabajos y las sincronizaciones pendientes.</p>
+<p>Para probar esta característica, conecte un dispositivo que esté ejecutando la versión preliminar de Android M a su equipo de desarrollo y llame a los siguientes comandos:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>Nota:</strong> La próxima versión de
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+Google Cloud Messaging</a> le permite designar mensajes de prioridad alta.
+ Si su aplicación recibe mensajes de GCM de prioridad alta, se le concede un breve acceso a la red, incluso cuando el dispositivo se encuentra en modo Doze.
+
+</p>
+
+<p>Consulte la
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">Guía de prueba</a> para obtener consejos sobre cómo probar el modo Doze en su aplicación.
+ </p>
+
+<h3 id="behavior-app-standby">App Standby</h3>
+<p>Con esta versión preliminar, el sistema puede determinar que las aplicaciones se encuentran inactivas cuando no están en uso activo.
+ La aplicación se considera inactiva después de un cierto período, salvo que el sistema detecte alguna de las siguientes señales:
+</p>
+
+<ul>
+<li>El usuario inicia explícitamente la aplicación.</li>
+<li>La aplicación actualmente tiene un proceso en primer plano (ya sea como una actividad o un servicio en primer plano, o en uso por parte de otra actividad u otro servicio en primer plano).
+</li>
+<li>La aplicación genera una notificación que los usuarios ven en la pantalla de bloqueo o en la bandeja de notificaciones.
+</li>
+<li>El usuario solicita explícitamente que la aplicación esté exenta de optimizaciones mediante las <strong>Configuraciones</strong>.
+</li>
+</ul>
+
+<p>Si el dispositivo está desconectado, las aplicaciones que se consideren inactivas tendrán deshabilitado el acceso a la red y se suspenderán sus sincronizaciones y trabajos.
+ Cuando el dispositivo se conecte a un sistema de alimentación, estas aplicaciones se podrán conectar a la red y podrán ejecutar los trabajos y las sincronizaciones pendientes.
+ Si el dispositivo queda inactivo durante períodos prolongados, las aplicaciones inactivas pueden acceder a la red aproximadamente una vez al día.
+</p>
+
+<p>Para probar esta característica, conecte un dispositivo que esté ejecutando la versión preliminar de Android M a su equipo de desarrollo y llame a los siguientes comandos:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>Nota:</strong> La próxima versión de
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+Google Cloud Messaging</a> (GCM) le permite designar mensajes de prioridad alta.
+ Si su aplicación recibe mensajes de GCM de prioridad alta, se le concede un breve acceso a la red, incluso cuando la aplicación está inactiva.
+
+</p>
+
+<p>Consulte la
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">Guía de prueba</a> para obtener consejos sobre cómo probar el modo App Standby en sus aplicaciones.
+ </p>
+
+<h2 id="behavior-adoptable-storage">Dispositivos de almacenamiento adoptables</h2>
+<p>
+Con esta versión preliminar, los usuarios pueden <em>adoptar</em> dispositivos de almacenamiento externo, como tarjetas SD. Al adoptar un dispositivo de almacenamiento externo, el dispositivo se cifra y se formatea para que actúe como un elemento de almacenamiento interno.
+ Esta característica les permite a los usuarios mover tanto las aplicaciones como los datos privados de esas aplicaciones entre dispositivos de almacenamiento.
+ Al mover aplicaciones, el sistema respeta la preferencia
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
+del manifiesto.
+</p>
+
+<p>Si su aplicación accede a las API o a los campos que se indican a continuación, tenga en cuenta que las rutas de archivo que devuelven se modificarán dinámicamente cuando la aplicación se mueva entre dispositivos de almacenamiento interno y externo. Al crear rutas de archivo, lo más recomendable es que siempre llame a estas API de forma dinámica. No use rutas de archivo codificadas de forma rígida ni continúe usando rutas de archivo completas que se hayan creado anteriormente.
+
+
+</p>
+
+<ul>
+<li>Métodos {@link android.content.Context}:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>Campos {@link android.content.pm.ApplicationInfo}:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>Para depurar esta característica en la versión preliminar para desarrolladores, puede habilitar la opción de adoptar una unidad USB que esté conectada a un dispositivo Android mediante un cable USB On-The-Go (OTG) y para habilitarla puede ejecutar el siguiente comando:
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">Eliminación del cliente HTTP de Apache</h2>
+<p>Esta versión preliminar elimina el soporte del cliente HTTP de Apache. Si su aplicación utiliza este cliente y tiene como destino Android 2.3 (API de nivel 9) o una versión posterior, use, en su lugar, la clase {@link java.net.HttpURLConnection}.
+
+ Esta API es más eficaz porque reduce el uso de la red mediante compresión y almacenamiento de respuesta en caché transparentes, y minimiza el consumo de energía.
+ Para continuar utilizando las API HTTP de Apache, primero debe declarar la siguiente dependencia en tiempo de compilación en su archivo {@code build.gradle}:
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android está migrando de la biblioteca OpenSSL a
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
+. Si utiliza Android NDK en su aplicación, no vincule bibliotecas criptográficas que no forman parte de la API de NDK, como {@code libcrypto.so} y {@code libssl.so}.
+ Estas bibliotecas no son API públicas y se pueden modificar o interrumpir sin aviso en todas las versiones y todos los dispositivos. Además, puede exponerse a vulnerabilidades de seguridad.
+
+ En cambio, modifique su código nativo para llamar a las API de criptografía de Java a través de JNI o para vincular estáticamente una biblioteca criptográfica de su elección.
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">Cambios en AudioManager</h2>
+<p>Ya no se admitirán las funciones de ajustar el volumen de forma directa o silenciar secuencias específicas por medio de la clase {@link android.media.AudioManager}
+. El método {@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} es obsoleto, por lo que debe llamar al método
+{@code AudioManager.requestAudioFocus()} en su lugar. Del mismo modo, el método
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} es obsoleto; en su lugar, llame al método{@code AudioManager.adjustStreamVolume()} y pase los valores de dirección {@code ADJUST_MUTE} o {@code ADJUST_UNMUTE}.
+
+</p>
+
+<h2 id="behavior-test-selection">Selección de texto</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>Ahora, cuando los usuarios seleccionen texto en su aplicación, usted puede mostrar acciones de selección de texto, como
+<em>cortar</em>, <em>copiar</em> y <em>pegar</em> en una
+<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">barra de herramientas flotante</a>. La implementación de la interacción del usuario es similar a la de la barra de acciones contextuales, como se describe en la sección
+<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">
+Habilitación del modo de acción contextual para vistas individuales</a>.
+</p>
+
+<p>Si desea implementar una barra de herramientas flotante para selección de texto, realice los siguientes cambios en sus aplicaciones existentes:
+</p>
+<ol>
+<li>En su objeto {@link android.view.View} o {@link android.app.Activity}, cambie sus llamados
+{@link android.view.ActionMode} de
+{@code startActionMode(Callback)} a {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}.</li>
+<li>Tome su implementación existente de {@code ActionMode.Callback} y, en su lugar, haga que sea extendida
+{@code ActionMode.Callback2}.</li>
+<li>Invalide el método {@code Callback2.onGetContentRect()} para proporcionar las coordenadas del objeto {@link android.graphics.Rect} de contenido (como un rectángulo de selección de texto) en la vista.
+</li>
+<li>Si el posicionamiento del rectángulo ya no es válido y este es el único elemento por invalidar, llame al método {@code ActionMode.invalidateContentRect()}.
+</li>
+</ol>
+
+<p>Si utiliza la biblioteca <a href="{@docRoot}tools/support-library/index.html">
+Android Support Library</a> versión 22.2, tenga en cuenta que las barras de herramientas flotantes no son compatibles con versiones anteriores y AppCompat toma el control de los objetos {@link android.view.ActionMode} de forma predeterminada.
+
+ Esto impide que se muestren las barras de herramientas flotantes. Para permitir la compatibilidad de
+{@link android.view.ActionMode} en
+{@link android.support.v7.app.AppCompatActivity}, llame a
+{@code android.support.v7.app.AppCompatActivity.getDelegate()}, luego llame a
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} en el objeto
+{@link android.support.v7.app.AppCompatDelegate} devuelto y configure el parámetro de entrada como {@code false}.
+ Esta llamada devuelve el control de los objetos {@link android.view.ActionMode} al marco de trabajo.
+ En los dispositivos que ejecutan la versión preliminar de Android M, eso permite que el marco de trabajo admita los modos de barras de herramientas flotantes o
+{@link android.support.v7.app.ActionBar}, mientras que en los dispositivos anteriores a la versión preliminar de Android M solo se admiten los modos {@link android.support.v7.app.ActionBar}.
+</p>
+
+<h2 id="behavior-keystore">Cambios en Android Keystore</h2>
+<p>Con esta versión preliminar, el
+<a href="{@docRoot}training/articles/keystore.html">proveedor de Android Keystore</a> ya no admite DSA.
+ Aún se admite ECDSA.</p>
+
+<p>Las claves que no requieren cifrado de datos estáticos ya no se eliminarán cuando se restablezca o deshabilite la pantalla de bloqueo seguro (por ejemplo, cuando lo haga el usuario o el administrador del dispositivo).
+ Las claves que requieren el cifrado de datos estáticos se eliminarán durante estos eventos.
+</p>
+
+<h2 id="behavior-network">Cambios en las funciones de red y Wi-Fi</h2>
+
+<p>Esta versión preliminar introduce en las API de redes y Wi-Fi los siguientes cambios en los comportamientos.</p>
+<ul>
+<li>Ahora sus aplicaciones pueden cambiar el estado de los objetos {@link android.net.wifi.WifiConfiguration} solo si usted creó estos objetos.
+ Usted no puede modificar ni eliminar objetos
+{@link android.net.wifi.WifiConfiguration} creados por el usuario o por otras aplicaciones.
+</li>
+<li>
+Anteriormente, si una aplicación forzaba al dispositivo a conectarse a una red Wi-Fi específica utilizando
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} con la configuración
+{@code disableAllOthers=true}, el dispositivo se desconectaba de otras redes, como los datos móviles.
+ En esta versión preliminar, el dispositivo ya no se desconectará de otras redes como estas. Si {@code targetSdkVersion} de su aplicación es {@code “20”} o inferior, se anclará a la red Wi-Fi seleccionada.
+
+ Si {@code targetSdkVersion} de su aplicación es {@code “21”} o posterior, use las API de redes múltiples (como
+{@link android.net.Network#openConnection(java.net.URL) openConnection()},
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} y el nuevo método
+{@code ConnectivityManager.bindProcessToNetwork()}) para garantizar que el tráfico de su red se envíe a la red seleccionada.
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">Cambios en el servicio de cámara</h2>
+<p>En esta versión preliminar, el modelo para acceder a los recursos compartidos en el servicio de cámara se cambió del modelo de acceso anterior “por orden de llegada” a un modelo de acceso en el que se favorecen los procesos de prioridad alta.
+
+ Los cambios en el comportamiento del servicio incluyen los siguientes:</p>
+<ul>
+<li>El acceso a los recursos del subsistema de la cámara, lo que incluye abrir y configurar un dispositivo de cámara, se concede según la “prioridad” del proceso de la aplicación cliente.
+ Por lo general, los procesos de la aplicación con actividades en primer plano o visibles para el usuario, reciben una prioridad más alta, lo que hace que el uso y la adquisición de recursos de la cámara sean más dependientes.
+
+</li>
+<li>Los clientes con cámara activa para aplicaciones de menor prioridad pueden ser “expulsados” cuando una aplicación de mayor prioridad intenta utilizar la cámara.
+ En la API {@link android.hardware.Camera} obsoleta, esto hace que se llame al método
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()} para el cliente expulsado.
+
+ En la API {@link android.hardware.camera2 Camera2}, esto hace que se llame al método
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}
+para el cliente expulsado.</li>
+<li>En los dispositivos con hardware de cámara correcto, distintos procesos de la aplicación pueden abrir y utilizar de forma independiente dispositivos de cámara separados al mismo tiempo.
+ Sin embargo, ahora el servicio de cámara detecta y no permite los casos de uso de procesos múltiples, donde el acceso simultáneo genera una degradación considerable del rendimiento o de las capacidades de cualquiera de los dispositivos de cámara abiertos.
+
+ Este cambio puede generar “expulsiones” de clientes de menor prioridad, incluso cuando ninguna otra aplicación esté intentando acceder directamente al mismo dispositivo de cámara.
+
+
+</li>
+<li>
+Cambiar el usuario actual provoca que se expulsen los clientes con cámara activa en las aplicaciones que pertenecen a la cuenta de usuario anterior.
+ El acceso a la cámara se limita a perfiles de usuario que pertenecen al usuario actual del dispositivo. En la práctica, esto significa que una cuenta de “invitado”, por ejemplo, no podrá abandonar los procesos en ejecución que utilicen el subsistema de la cámara cuando el usuario haya cambiado a otra cuenta.
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">Tiempo de ejecución de ART</h2>
+<p>El tiempo de ejecución de ART ahora implementa correctamente reglas de acceso para el método
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()}. Este cambio soluciona el problema que ocurría con Dalvik, que comprobaba las reglas de acceso incorrectamente en las versiones anteriores. Si su aplicación utiliza el método
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} y usted desea invalidar comprobaciones de acceso, llame al método
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} con el parámetro de entrada configurado en {@code true}.
+
+
+
+ Si su aplicación utiliza la
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">biblioteca AppCompat versión 7</a> o la
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">biblioteca RecyclerView versión 7</a>, debe actualizar su aplicación para utilizar las versiones más recientes de estas bibliotecas.
+ De lo contrario, asegúrese de que las clases personalizadas a las que se haga referencia desde el XML estén actualizadas, de manera que se pueda acceder a sus constructores de clases.
+</p>
+
+<p>Esta versión preliminar actualiza el comportamiento del vinculador dinámico. El vinculador dinámico ahora entiende la diferencia entre {@code soname} de una biblioteca y su ruta de acceso (<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
+error público 6670</a>), y ahora se implementa la búsqueda por {@code soname}.
+
+
+ Las aplicaciones que anteriormente funcionaban y que tenían entradas {@code DT_NEEDED} incorrectas (generalmente, rutas absolutas en el sistema de archivo del equipo de compilación) pueden generar error al cargarse.
+</p>
+
+<p>Ahora se implementa correctamente la marca {@code dlopen(3) RTLD_LOCAL}. Tenga en cuenta que
+{@code RTLD_LOCAL} es lo predeterminado, por lo que se verán afectadas las llamadas a {@code dlopen(3)} que no utilizaron explícitamente
+{@code RTLD_LOCAL} (salvo que su aplicación haya usado {@code RTLD_GLOBAL} explícitamente). Con
+{@code RTLD_LOCAL}, los símbolos no estarán disponibles para las bibliotecas cargadas por llamadas posteriores a
+{@code dlopen(3)} (a diferencia de lo que sucede al hacer referencia mediante entradas {@code DT_NEEDED}).</p>
+</p>
+
+<h2 id="behavior-apk-validation">Validación de APK</h2>
+<p>Ahora la plataforma realiza validaciones más estrictas de APK. El APK se considera dañado si un archivo está declarado en el manifiesto, pero no está presente en el APK en sí.
+ Si se elimina algún contenido, se debe volver a firmar el APK.
+</p>
+
+<h2 id="behavior-afw">Cambios en Android for Work</h2>
+<p>Esta versión preliminar incluye los siguientes cambios en los comportamientos para Android for Work:</p>
+<ul>
+<li><strong>Contactos de trabajo en contextos personales:</strong> Ahora, el registro de llamadas de Google Dialer muestra los contactos de trabajo cuando el usuario ve las llamadas anteriores. Si se configura {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} en {@code true}, se ocultan los contactos de perfiles de trabajo en el registro de llamadas de Google Dialer.
+
+
+ Los contactos de trabajo se pueden mostrar junto con los contactos personales en los dispositivos a través de Bluetooth solo si usted configura {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} en {@code false}.
+
+ De forma predeterminada, se configura en {@code true}.
+
+</li>
+<li><strong>Eliminación de configuraciones de Wi-Fi:</strong> Las configuraciones de Wi-Fi agregadas por un propietario de perfil (por ejemplo, al llamar al método
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()}) ahora se borran si se elimina ese perfil de trabajo.
+</li>
+<li><strong>Bloqueo de configuraciones de Wi-Fi:</strong> El usuario ya no puede modificar ni eliminar las configuraciones de Wi-Fi creadas por un propietario activo del dispositivo.
+ El usuario aún puede crear y modificar sus propias configuraciones de Wi-Fi, siempre que no se haya definido la constante {@link android.os.UserManager}
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI} para ese usuario.
+</li>
+<li><strong>Descarga de Work Policy Controller mediante la incorporación de una cuenta de Google:</strong> Cuando una cuenta de Google que requiere gestión a través de una aplicación de Work Policy Controller (WPC) se agrega a un dispositivo fuera de un contexto administrado, el flujo de incorporación de la cuenta ahora le pide al usuario que instale el WPC apropiado. Este comportamiento también se aplica a las cuentas agregadas mediante
+<strong>Settings > Accounts</strong> en el asistente para instalación inicial del dispositivo.
+
+
+</li>
+<li><strong>Cambios en comportamientos específicos de la API DevicePolicyManager:</strong>
+Llamar al método {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()}
+afecta la cámara solo del usuario que lo llama; llamarlo desde el perfil administrado no afecta las aplicaciones de cámara que se ejecutan en el usuario principal.
+ Asimismo, el método
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()}
+ahora se encuentra disponible para propietarios de perfiles, además de propietarios de dispositivos. Un propietario de perfil puede configurar las siguientes restricciones de protección de seguridad:
+
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} y
+ {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}, que afectan las configuraciones de protección de seguridad para el usuario primario del perfil.
+</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, que solo afecta las notificaciones generadas por aplicaciones en el perfil administrado.
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/es/preview/features/runtime-permissions.jd b/docs/html-intl/intl/es/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..15bd954
--- /dev/null
+++ b/docs/html-intl/intl/es/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=Permisos
+page.tags=recursos de la versión preliminar, androidm
+page.keywords=permisos, tiempo de ejecución, vista preliminar
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Quickview</h2>
+ <ul>
+ <li>Si su aplicación tiene como destino el SDK de la versión preliminar de Android M, se solicitará a los usuarios que concedan permisos durante el tiempo de ejecución, en lugar de durante la instalación.
+</li>
+ <li>Los usuarios pueden cancelar los permisos en cualquier momento desde la pantalla Settings de la aplicación.
+</li>
+ <li>La aplicación necesita controlar los permisos cada vez que se ejecuta.
+</li>
+ </ul>
+
+ <h2>Contenido del documento</h2>
+ <ol>
+ <li><a href="#overview">Información general</a></li>
+ <li><a href="#coding">Codificación para permisos de tiempo de ejecución</a></li>
+ <li><a href="#testing">Prueba de permisos de tiempo de ejecución</a></li>
+ <li><a href="#best-practices">Mejores prácticas</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M Developer Preview introduce un nuevo modelo de permisos de la aplicación que facilita a los usuarios el proceso de instalación y actualización de aplicaciones.
+ Si una aplicación que se ejecuta en la versión preliminar de Android M es compatible con el nuevo modelo de permisos, el usuario no tiene que conceder ningún permiso al instalar o actualizar la aplicación. En su lugar, la aplicación solicitará los permisos a medida que los vaya necesitado y el sistema mostrará al usuario un diálogo en el que le solicitará los permisos necesarios.
+
+
+
+
+</p>
+
+<p>
+ Si la aplicación es compatible con el nuevo modelo de permisos, podrá instalarse y ejecutarse en los dispositivos con versiones anteriores de Android, utilizando el modelo de permisos anterior en esos dispositivos.
+
+
+</p>
+
+<h2 id="overview">
+ Información general
+</h2>
+
+<p>
+ En M Developer Preview, la plataforma introduce un nuevo modelo
+de permisos de la aplicación. A continuación, se presenta un resumen de los componentes principales de este nuevo modelo:
+</p>
+
+<ul>
+ <li>
+ <strong>Declaración de los permisos:</strong> Al igual que en las plataformas anteriores de Android, la aplicación declara todos los permisos que necesita en el manifiesto.
+
+ </li>
+
+ <li>
+ <strong>Grupos de permisos:</strong> Según su función, los permisos se dividen en
+<em>grupos de permisos</em>. Por ejemplo, el grupo de permisos
+<code>CONTACTS</code> contiene permisos para leer y escribir los contactos y la información de perfil del usuario.
+
+ </li>
+
+ <li>
+ <p><strong>Permisos limitados concedidos durante la instalación:</strong> Cuando el usuario instala o actualiza la aplicación, el sistema le concede a la aplicación todos los permisos que la aplicación solicita que corresponden a {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}.
+
+
+ Por ejemplo, los permisos para la alarma y los permisos de intento corresponden a {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}, por lo que se conceden automáticamente durante la instalación.
+
+ </p>
+
+ <p>El sistema puede concederle a la aplicación permisos de firma y de sistema, como se especifica en la sección <a href="#system-apps">Permisos de firma y de sistema de la aplicación</a>.
+
+ Al usuario <em>no</em> se le solicitará conceder ningún permiso durante la instalación.
+</p>
+ </li>
+
+ <li>
+ <strong>Solicitud de permisos al usuario durante el tiempo de ejecución:</strong> Cuando la aplicación solicita un permiso, el sistema le muestra al usuario un diálogo y luego llama a la función de devolución de llamada de la aplicación para notificarle si el permiso se otorgó.
+
+ Si el usuario concede un permiso, la aplicación recibe todos los permisos del área funcional de dicho permiso, los cuales fueron declarados en el manifiesto de la aplicación.
+
+
+ </li>
+
+</ul>
+
+<p>
+ Este modelo de permisos cambia la forma en la que la aplicación se comporta para características que requieren permisos.
+ A continuación, se presenta un resumen de las prácticas de desarrollo que debe seguir para ajustarse a este modelo:
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>Siempre compruebe los permisos:</strong> Siempre que una aplicación necesite realizar una acción que requiere algún permiso, primero debe comprobar si ya tiene otorgado ese permiso.
+
+ En caso de no tenerlo, solicitará que se le otorgue ese permiso.
+
+ </li>
+
+ <li>
+ <strong>Administre la falta de permisos correctamente:</strong> Si la aplicación no recibe un permiso adecuado, deberá administrar la falla sin errores.
+
+ Por ejemplo, si se necesita el permiso solo para una característica añadida, la aplicación puede desactivar esa característica.
+ Si el permiso es fundamental para que la aplicación funcione, la aplicación podrá desactivar toda su funcionalidad e informar al usuario que se deben conceder dichos permisos.
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>Figura 1</strong> Pantalla de permisos en Settings de la aplicación.
+ </p>
+ </div>
+
+ <li>
+ <strong>Los permisos son revocables:</strong> Los usuarios pueden revocar los permisos en cualquier momento.
+ Si un usuario desactiva los permisos de una aplicación, la aplicación <em>no</em> recibe ningún aviso.
+ Nuevamente, la aplicación deberá verificar que cuenta con los permisos necesarios antes de realizar cualquier acción restringida.
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>Nota:</strong> Si una aplicación tiene como destino M Developer Preview, <em>debe</em> utilizar el nuevo modelo de permisos.
+
+</p>
+
+<p>
+ A partir del lanzamiento de M Developer Preview, no todas las aplicaciones de Google implementarán por completo el nuevo modelo de permisos.
+ Google actualiza estas aplicaciones durante el transcurso de M Developer Preview para respetar adecuadamente las configuraciones de alternancia de los permisos.
+
+
+</p>
+
+<p class="note">
+ <strong>Nota:</strong> Si la aplicación cuenta con su propia superficie de API, no transmita permisos sin antes asegurarse de que el iniciador de la llamada cuente con los permisos requeridos para acceder a esa información.
+
+
+</p>
+
+<h3 id="system-apps">
+ Permisos de las aplicaciones de firma y de sistema
+</h3>
+
+<p>
+ Generalmente, cuando el usuario instala una aplicación, el sistema solo otorga a la aplicación
+{@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL}. Sin embargo, en ciertas circunstancias, el sistema le concede a la aplicación más permisos:
+
+</p>
+
+<ul>
+ <li>Si una aplicación es parte de la imagen del sistema, la aplicación recibe automáticamente todos los permisos enumerados en el manifiesto.
+
+ </li>
+
+ <li>Si la aplicación solicita permisos en el manifiesto que corresponden a {@link
+ android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} y la aplicación está firmada con el mismo certificado que el de la aplicación que declaró dichos permisos, el sistema le concede a la aplicación que los solicita esos permisos durante la instalación.
+
+
+
+ </li>
+</ul>
+
+<p>
+ En ambos casos, el usuario aún puede revocar los permisos en cualquier momento si accede a la pantalla <strong>Settings</strong> del sistema y selecciona <strong>Apps ></strong>
+
+ <i>app_name</i> <strong>> Permissions</strong>. La aplicación debe seguir controlando los permisos al momento de la ejecución y solicitarlos si fuese necesario.
+
+
+</p>
+
+<h3 id="compatibility">
+ Compatibilidad con modelos anteriores y posteriores
+</h3>
+
+<p>
+ Si una aplicación no tiene como destino M Developer Preview, la aplicación continúa utilizando el modelo de permisos anterior, incluso en dispositivos con la versión preliminar de Android M.
+ Cuando el usuario instala la aplicación, el sistema le solicita al usuario que otorgue todos los permisos enumerados en el manifiesto de la aplicación.
+
+
+</p>
+
+<p class="note">
+ <strong>Nota:</strong> En dispositivos que ejecutan M Developer Preview, el usuario puede desactivar los permisos para cualquier aplicación (incluso para aplicaciones heredadas) desde la pantalla Settings de la aplicación.
+
+ Si un usuario desactiva permisos para una aplicación heredada, el sistema desactiva las funciones correspondientes de forma automática.
+ Cuando la aplicación intenta realizar una operación que requiere ese permiso, la operación no generará necesariamente una excepción.
+
+ En su lugar, devolverá un conjunto de datos vacíos, indicará un error o, de lo contrario, mostrará un comportamiento inesperado.
+ Por ejemplo, si realiza una consulta sobre el calendario sin permisos, el método devuelve un conjunto de datos vacíos.
+
+</p>
+
+<p>
+ Si instala una aplicación que utiliza el nuevo modelo de permisos en un dispositivo que no ejecuta la versión preliminar de Android M, el sistema la trata como cualquier otra aplicación: el sistema le pide al usuario, durante la instalación, que conceda los permisos declarados.
+
+
+
+</p>
+
+<p class="note">
+ <strong>Nota:</strong> Para el lanzamiento de la versión preliminar, debe configurar la versión mínima del SDK en M Preview SDK para compilar con la versión del SDK preliminar.
+ Esto significa que no podrá probar dichas aplicaciones en plataformas anteriores durante la versión preliminar para desarrolladores.
+
+
+</p>
+
+<h3 id="perms-vs-intents">Permisos frente a intentos</h3>
+
+<p>
+ En muchas situaciones, puede elegir entre dos formas para que sus aplicaciones realicen una tarea.
+ Puede hacer que su aplicación solicite permiso para realizar la operación por sí misma.
+ De lo contrario, puede hacer que la aplicación utilice un intento para que otra aplicación realice la tarea.
+
+</p>
+
+<p>
+ Por ejemplo, supongamos que su aplicación necesita poder tomar fotografías con la cámara del dispositivo.
+ Su aplicación puede solicitar el permiso
+<code>android.permission.CAMERA</code>, lo que le permite a su aplicación acceder a la cámara directamente.
+ Entonces, su aplicación utilizará las API de la cámara para controlar la cámara y tomar una fotografía.
+ Este enfoque le otorga a su aplicación total control del proceso de fotografía y le permite incorporar la UI de la cámara en su aplicación.
+
+
+</p>
+
+<p>
+ Sin embargo, si no necesita dicho control, puede utilizar {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} para solicitar una imagen.
+ Cuando ejecute el intento, se le solicita al usuario que elija una aplicación de cámara (en caso de que no haya una aplicación de cámara predeterminada) y esa aplicación tomará la fotografía.
+
+ La aplicación de cámara devuelve la fotografía al método {@link
+ android.app.Activity#onActivityResult onActivityResult()} de su aplicación.
+</p>
+
+<p>
+ De manera similar, si necesita realizar una llamada telefónica, acceder a los contactos del usuario, etc., lo puede hacer creando intentos apropiados o puede solicitar los permisos e ingresar directamente a los objetos apropiados.
+
+ Cada enfoque tiene ventajas y desventajas.
+
+</p>
+
+<p>
+ Si utiliza los permisos:
+</p>
+
+<ul>
+ <li>La aplicación posee total control sobre la experiencia del usuario cuando usted realiza la operación.
+ Sin embargo, un control tan amplio complica su tarea, ya que usted deberá diseñar una UI apropiada.
+
+ </li>
+
+ <li>Se le solicita al usuario otorgar el permiso una vez, la primera vez que usted realiza la operación.
+ Luego, su aplicación puede realizar la operación sin requerir interacción adicional por parte del usuario.
+ Sin embargo, si el usuario no concede el permiso (o lo revoca luego), su aplicación queda inhabilitada para realizar la operación.
+
+
+ </li>
+</ul>
+
+<p>
+ Si utiliza un intento:
+</p>
+
+<ul>
+ <li>No debe diseñar la UI para la operación. La aplicación que controla el intento provee la UI. Sin embargo, esto significa que usted no tiene control sobre la experiencia del usuario.
+
+ El usuario podrá interactuar con una aplicación que usted no conoce.
+
+ </li>
+
+ <li>Si el usuario no tiene una aplicación predeterminada para la operación, el sistema le solicita al usuario que elija una aplicación. Si el usuario no designa un controlador predeterminado, es probable que surja un diálogo adicional cada vez que realice la operación.
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">Codificación para permisos de tiempo de ejecución</h2>
+
+<p>
+ Si su aplicación tiene como destino el nuevo M Developer Preview, deberá usar el nuevo modelo de permisos.
+ Esto significa que, además de declarar los permisos necesarios en el manifiesto, también debe comprobar si tiene los permisos de tiempo de ejecución y solicitarlos en caso de no tenerlos.
+
+
+
+</p>
+
+<h3 id="enabling">
+ Habilitar el nuevo modelo de permisos
+</h3>
+
+<p>
+ Para habilitar el nuevo modelo de permisos de M Developer Preview, configure el atributo
+<code>targetSdkVersion</code> de la aplicación en <code>"MNC"</code> y
+<code>compileSdkVersion</code> en <code>"android-MNC"</code>. Al hacerlo, se habilitan todas las características de los nuevos permisos.
+
+</p>
+
+<p>
+ Para el lanzamiento de la versión preliminar, debe establecer <code>minSdkVersion</code> en
+<code>"MNC"</code> para compilar con el SDK preliminar.
+</p>
+
+<h3 id="m-only-perm">
+ Establecer un permiso solo para la versión preliminar de Android M
+</h3>
+
+<p>
+ Puede utilizar el nuevo elemento <code><uses-permission-sdk-m></code> en el manifiesto de la aplicación para indicar que se necesita un permiso solo para M Developer Preview.
+ Si declara un permiso de esta manera, cuando la aplicación se instale en un dispositivo anterior, el sistema no le solicitará al usuario el permiso ni se lo otorgará a la aplicación. Al usar el elemento <code><uses-permission-sdk-m></code>, puede añadir nuevos permisos a las versiones actualizadas de su aplicación sin forzar a los usuarios a otorgar permisos cuando instalen la actualización.
+
+
+
+
+
+
+</p>
+
+<p>
+ Si la aplicación se ejecuta en un dispositivo con M Developer Preview,
+<code><uses-permission-sdk-m></code> se comporta al igual que
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>.
+ El sistema no le solicita al usuario que otorgue ningún permiso al instalar la aplicación y la aplicación solicita los permisos a medida que se necesiten.
+
+</p>
+
+<h3 id="prompting">
+ Solicitar permisos
+</h3>
+
+<p>
+ Si su aplicación utiliza el nuevo modelo de permisos de M Developer Preview, no se le pedirá al usuario que otorgue todos los permisos cuando la aplicación se ejecute por primera vez en un dispositivo con la versión preliminar de Android M.
+
+ En su lugar, su aplicación solicita los permisos a medida que los necesita.
+ Cuando su aplicación solicita un permiso, el sistema le muestra un diálogo al usuario.
+
+</p>
+
+<p>
+ Si su aplicación se ejecuta en un dispositivo con SDK 22 o anterior, la aplicación utiliza el modelo de permisos anterior.
+ Cuando el usuario instala la aplicación, se le solicita que otorgue todos los permisos que la aplicación requiere en su manifiesto, excepto aquellos permisos marcados con <code><uses-permission-sdk-m></code>.
+
+
+</p>
+
+<h4 id="check-platform">Controlar en qué plataforma se ejecuta la aplicación</h4>
+
+<p>
+ Este modelo de permisos es compatible solamente con dispositivos que ejecutan M Developer Preview.
+ Antes de llamar a cualquiera de estos métodos, la aplicación debe verificar en qué plataforma se está ejecutando y, para hacerlo, se controla el valor de {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME}.
+
+ Si el dispositivo ejecuta M Developer Preview,
+{@link android.os.Build.VERSION#CODENAME CODENAME} es <code>"MNC"</code>.
+</p>
+
+<h4 id="check-for-permission">Controlar si la aplicación cuenta con los permisos necesarios</h4>
+
+<p>Cuando el usuario intenta realizar algo que requiere un permiso, la aplicación controla si ya tiene el permiso para realizar esa operación.
+ Para hacerlo, la aplicación llama a <code>Context.checkSelfPermission(
+
+<i>permission_name</i>)</code>. La aplicación debe realizar este control incluso si sabe que el usuario ya ha concedido ese permiso, ya que el usuario puede revocar los permisos de una aplicación en cualquier momento.
+
+
+ Por ejemplo, si un usuario quiere usar una aplicación para tomar una fotografía, la aplicación llama a <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>.
+
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>Tabla 1.</strong> Permisos y grupo de permisos.</p>
+<table>
+ <tr>
+ <th scope="col">Grupo de permisos</th>
+ <th scope="col">Permisos</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">Solicitar permisos si se necesitan</h4>
+
+<p>Si la aplicación no posee los permisos que necesita, llama al método
+<code>Activity.requestPermissions(String[], int)</code> para solicitar el permiso o los permisos apropiados.
+ La aplicación pasa el permiso o los permisos que necesita y un “código de solicitud” entero.
+
+ Este método funciona de manera asincrónica: realiza la devolución inmediatamente y cuando el usuario responde a la ventana de diálogo, el sistema llama al método de devolución de llamada de la aplicación con los resultados, y pasa el mismo “código de solicitud” que pasó la aplicación a
+<code>requestPermissions()</code>.
+
+</p>
+
+ <p>El siguiente código verifica si la aplicación tiene permisos para leer los contactos del usuario y solicita los permisos de ser necesario:
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">Administrar la respuesta a la solicitud de permisos</h4>
+
+<p>
+ Cuando una aplicación solicita permisos, el sistema le muestra al usuario una ventana de diálogo.
+ Cuando el usuario responde, el sistema invoca
+<code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
+ de su aplicación y le transfiere la respuesta del usuario. Su aplicación necesita invalidar ese método. La devolución de llamada pasa el mismo código de solicitud que usted pasó a <code>requestPermissions()</code>.
+
+ Por ejemplo, si una aplicación solicita acceso <code>READ_CONTACTS</code>, es posible que tenga el siguiente método de devolución de llamada:
+
+
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>Si el usuario concede un permiso, el sistema le otorga a la aplicación todos los permisos enumerados en el manifiesto para esa área funcional.
+ Se deben tomar acciones apropiadas si el usuario rechaza la solicitud.
+ Por ejemplo, usted podría desactivar cualquier acción del menú que dependa de este permiso.
+
+ </li>
+</p>
+
+<p>
+ Cuando el sistema le solicita al usuario que otorgue un permiso, el usuario tiene la opción de indicarle al sistema que no solicite ese permiso de nuevo.
+ En ese caso, cuando la aplicación utiliza <code>requestPermissions()</code> para solicitar ese permiso, el sistema rechaza la solicitud inmediatamente.
+
+ En este caso, el sistema llama a su <code>onRequestPermissionsResult()</code> de la misma manera en que lo haría si el usuario hubiese rechazado explícitamente su solicitud nuevamente.
+
+ Por esta razón, su aplicación no puede asumir que se ha llevado a cabo algún tipo de interacción con el usuario.
+
+</p>
+
+<h2 id="testing">Prueba de permisos de tiempo de ejecución</h2>
+
+
+<p>
+ Si su aplicación tiene como destino M Developer Preview, debe probar que administre los permisos correctamente.
+ No debe asumir que su aplicación tiene algún permiso en particular cuando se ejecuta.
+ Cuando la aplicación se ejecuta por primera vez, es muy probable que no tenga permisos y el usuario puede revocar o reestablecer los permisos en cualquier momento.
+
+
+</p>
+
+<p>
+ Debe probar su aplicación para asegurarse de que funciona correctamente en todas las situaciones de permisos.
+ Con el SDK de la versión preliminar de Android M, hemos brindado nuevos comandos <a href="{@docRoot}tools/help/adb.html">Android Debug Bridge (adb)</a> que le permitirán probar su aplicación con cualquier configuración de permisos que necesite probar.
+
+
+
+</p>
+
+<h3>
+ Nuevas opciones y comandos adb
+</h3>
+
+<p>
+ Las herramientas de plataforma del SDK de la versión preliminar de Android M contienen varios comandos nuevos que le permiten probar la manera en que su aplicación administra los permisos.
+
+</p>
+
+<h4>
+ Instalar con permisos
+</h4>
+
+<p>
+ Puede utilizar la nueva opción <code>-g</code> del comando <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a>, que instala la aplicación y concede todos los permisos enumerados en el manifiesto de la aplicación:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ Conceder y revocar permisos
+</h4>
+
+<p>
+ Puede utilizar los comandos ADB nuevos <a href="{@docRoot}tools/help/adb.html#pm">package manager (pm)</a> para conceder y revocar permisos a una aplicación instalada. Esta funcionalidad puede resultar útil para pruebas automáticas.
+
+
+</p>
+
+<p>
+ Para conceder un permiso, utilice el comando <code>grant</code> de package manager:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ Por ejemplo, para conceder el paquete de permisos com.example.myapp para grabar audio utilice este comando:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ Para revocar un permiso, utilice el comando <code>revoke</code> de package manager:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">Mejores prácticas</h2>
+
+<p>
+ El nuevo modelo de permisos brinda a los usuarios una experiencia más fluida y les facilita la instalación de aplicaciones, además de hacerlos sentir cómodos con las actividades de sus aplicaciones.
+
+ Sugerimos las siguientes mejores prácticas para obtener el mayor beneficio del nuevo modelo.
+
+</p>
+
+
+<h3 id="bp-what-you-need">Solicite solo los permisos que necesite</h3>
+
+<p>
+ Cada vez que solicite un permiso, usted obliga al usuario a tomar una decisión.
+ La funcionalidad de su aplicación se verá reducida si el usuario rechaza la solicitud.
+ Debe minimizar la cantidad de veces que realiza estas solicitudes.
+</p>
+
+<p>
+ Por ejemplo, a menudo, su aplicación puede obtener la funcionalidad necesaria a través de un <a href="{@docRoot}guide/components/intents-filters.html">intento</a> en lugar de una solicitud de permiso.
+
+ Si su aplicación necesita tomar fotografías con la cámara del teléfono, la aplicación puede utilizar un intento {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE}.
+ Cuando su aplicación ejecuta el intento, el sistema le solicita al usuario que elija una aplicación para la cámara que ya está instalada a fin de tomar la fotografía.
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ No abrume al usuario
+</h3>
+
+<p>
+ Si expone al usuario a muchas solicitudes de permisos al mismo tiempo, lo abrumará y hará que deje de usar su aplicación. Por el contrario, debe pedir permisos en la medida que los necesite.
+
+
+</p>
+
+<p>
+ A veces, uno o más permisos pueden ser absolutamente necesarios para la aplicación. En ese caso, es recomendable pedir todos los permisos no bien se inicie la aplicación.
+
+ Por ejemplo, si crea una aplicación de fotografía, la aplicación necesitará acceso a la cámara del dispositivo.
+ Cuando el usuario inicie la aplicación por primera vez, no se sorprenderá si la aplicación le solicita permiso para usar la cámara.
+
+ Sin embargo, si la misma aplicación además tuviese una característica para compartir fotografías con los contactos del usuario, <em>no</em> solicite ese permiso la primera vez que se ejecute.
+
+ En su lugar, espere hasta que el usuario utilice la característica “compartir” para solicitar el permiso en ese momento.
+
+</p>
+
+<p>
+ Si su aplicación proporciona un tutorial, se recomienda que se pidan los permisos esenciales de la aplicación al final del tutorial.
+
+</p>
+
+<h3 id="bp-explain">
+ Explique por qué se necesitan los permisos
+</h3>
+
+<p>
+ El diálogo de permisos que muestra el sistema cuando llama a
+ <code>requestPermissions()</code> informa qué permisos necesita su aplicación pero no establece el motivo.
+ A veces, el usuario puede confundirse.
+ Es una buena idea explicarle al usuario los motivos por los que la aplicación necesita esos permisos antes de llamar a <code>requestPermissions()</code>.
+
+</p>
+
+<p>
+ Por ejemplo, una aplicación de fotografía puede solicitar servicios de ubicación para añadir una etiqueta geográfica a las fotografías.
+ Es posible que un usuario típico no sepa que una fotografía puede contener información sobre la ubicación y se confundiría si una aplicación de fotografía solicita la ubicación.
+
+ En este caso, es recomendable que la aplicación le informe al usuario acerca de esta característica <em>antes</em> de llamar a
+<code>requestPermissions()</code>.
+
+</p>
+
+<p>
+ Una forma de hacerlo es incorporar estas solicitudes en el tutorial de la aplicación. El tutorial puede mostrar todas las características de la aplicación, una por vez, y mientras lo hace explicar los permisos que son necesarios.
+
+ Por ejemplo, el tutorial de la aplicación de fotografía puede mostrar la característica “compartir fotografías con contactos” y luego explicarle al usuario que debe otorgar permisos para que la aplicación vea los contactos del usuario.
+
+
+ La aplicación puede entonces llamar a <code>requestPermissions()</code> para solicitarle al usuario ese acceso.
+ Por supuesto, no todos los usuarios siguen el tutorial, por lo que aun así debe controlar y solicitar los permisos durante el funcionamiento normal de la aplicación.
+
+
+</p>
diff --git a/docs/html-intl/intl/es/preview/overview.jd b/docs/html-intl/intl/es/preview/overview.jd
new file mode 100644
index 0000000..49cc3d3
--- /dev/null
+++ b/docs/html-intl/intl/es/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=Información general del programa
+page.metaDescription=Bienvenido a Android M Developer Preview, el programa que le brinda todo lo que necesita para probar y optimizar sus aplicaciones para la próxima versión de Android.
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ Bienvenido a <strong>Android M Developer Preview</strong>, el programa que le brinda todo lo que necesita para probar y optimizar sus aplicaciones para la próxima versión de Android.
+
+ Es gratis y puede comenzar a utilizarlo ahora mismo. Solo tiene que descargar las herramientas de M Developer Preview.
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ Imágenes del sistema emulador y de hardware
+ </h5>
+
+ <p>
+ Ejecute y pruebe sus aplicaciones en Nexus 5, 6, 9 y Player (para TV), además del emulador.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Último código de la plataforma
+ </h5>
+
+ <p>
+ Durante la versión preliminar, ofreceremos múltiples actualizaciones, por lo que usted realizará la prueba comparando los últimos cambios de la plataforma.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Actualizaciones vía OTA
+ </h5>
+
+ <p>
+ Luego de actualizar su dispositivo a la versión preliminar inicial, usted podrá obtener actualizaciones por red inalámbrica (over-the-air, OTA).
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ Nuevos comportamientos y capacidades
+ </h5>
+
+ <p>
+ Inicie el funcionamiento con anticipación para admitir los comportamientos de la nueva plataforma como el nuevo modelo de permisos de tiempos de ejecución y las opciones de ahorro de energía.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Ventana de prioridad para los problemas informados por los desarrolladores
+ </h5>
+
+ <p>
+ Durante las primeras semanas, daremos prioridad a los problemas informados por los desarrolladores; por lo tanto, realice las pruebas y envíe sus comentarios lo antes posible.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Comentarios y soporte
+ </h5>
+
+ <p>
+ Infórmenos los problemas y envíenos comentarios a través de nuestro <a href="https://code.google.com/p/android-developer-preview/">seguimiento de problemas</a>.
+ Póngase en contacto con otros desarrolladores de la comunidad <a href="http://g.co/dev/AndroidMDevPreview">M Developer Community</a>.
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ Escala de tiempo y actualizaciones
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M Developer Preview estará disponible a partir del 28 de mayo hasta la versión final del SDK de Android M, que lanzaremos al poco tiempo del lanzamiento público durante el tercer trimestre de 2015.
+
+
+</p>
+
+<p>
+ En momentos clave del desarrollo, lanzaremos actualizaciones para sus dispositivos de prueba.
+ Los momentos clave tentativos son los siguientes:
+</p>
+
+<ul>
+ <li>
+ <strong>Preview 1</strong> (lanzamiento inicial de la versión preliminar, fines de mayo)
+ </li>
+
+ <li>
+ <strong>Preview 2</strong> (fines de junio, comienzos de julio)
+ </li>
+
+ <li>
+ <strong>Preview 3</strong> (casi la versión final, a fines de julio)
+ </li>
+</ul>
+
+<p>
+ Estas actualizaciones terminan con el <strong>SDK final</strong> (más adelante durante el tercer trimestre), lo que proporcionará tanto las API oficiales para la nueva versión de Android como los comportamientos y las características finales del sistema.
+
+
+</p>
+
+<p>
+ A medida que usted prueba y desarrolla en Android M, le recomendamos que <strong>mantenga su entorno de desarrollo actualizado</strong> a medida que se lanzan las actualizaciones de la versión preliminar.
+
+ Para que el proceso sea más fácil, lanzaremos <strong>actualizaciones OTA</strong> para los dispositivos que ya hayan sido actualizados a una compilación de la versión preliminar y brindaremos imágenes del sistema que puede descargar y actualizar manualmente.
+
+
+</p>
+<p class="note">
+ <strong>Nota:</strong> El SDK final y las imágenes del sistema no se pueden proporcionar vía OTA y deberán <strong>actualizarse manualmente</strong> en sus dispositivos de prueba.</strong>
+
+
+</p>
+
+<p>
+ Le informaremos cuando las actualizaciones de la versión preliminar se encuentren disponibles a través del blog de Android para desarrolladores (<a href="http://android-developers.blogspot.com/">Android Developers Blog</a>), de este sitio y de la comunidad de desarrolladores <a href="http://g.co/dev/AndroidMDevPreview">Android M Developer Community</a>.
+
+
+</p>
+
+<h2 id="preview_tools">
+ ¿Qué ofrece la versión preliminar?
+</h2>
+
+<p>
+ M Developer Preview incluye todo lo que necesita para probar sus aplicaciones actuales en una variedad de tamaños de pantalla, de tecnologías de redes, de conjuntos de chip CPU/GPU y de arquitecturas de hardware.
+
+
+</p>
+
+<h4>
+ Herramientas del SDK
+</h4>
+
+<p>
+ Estos componentes se pueden descargar mediante SDK Manager en <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>:
+</p>
+
+<ul>
+ <li><strong>Herramientas del SDK</strong> de M Developer Preview
+ </li>
+
+ <li><strong>Imagen del sistema emulador</strong> (32-bit y 64-bit) de M Developer Preview
+
+ </li>
+
+ <li><strong>Imagen del sistema emulador para Android TV</strong> (32-bit) de M Developer Preview
+
+ </li>
+</ul>
+
+<h4>
+ Imágenes del sistema de hardware
+</h4>
+
+<p>
+ Puede descargar estas imágenes del sistema de hardware para dispositivos Nexus desde la <a href="download.html">página de Descargas</a>:
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong> (GSM/LTE) imagen del sistema del dispositivo “hammerhead”
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> imagen del sistema del dispositivo “shamu”
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong> (Wi-Fi) imagen del sistema del dispositivo “volantis”
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong> (Android TV) imagen del sistema del dispositivo “fugu”
+ </li>
+</ul>
+
+<h4>
+ Documentación y código de muestra
+</h4>
+
+<p>
+ Estos recursos de documentación lo ayudan a obtener información sobre la versión preliminar:
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">Configurar el SDK</a>: contiene instrucciones paso a paso para comenzar.
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">Guía de prueba</a> y <a href="behavior-changes.html">Cambios en los comportamientos</a>: le indican las áreas más importantes que debe probar.
+ </li>
+
+ <li>Documentación sobre las nuevas API, lo que incluye <a href="api-overview.html">Información general de la API</a>, <a href="{@docRoot}preview/download.html#docs">Referencia de la API</a> que se puede descargar y guías detalladas para desarrolladores sobre características clave como <a href="{@docRoot}preview/features/runtime-permissions.html">permisos</a>, <a href="{@docRoot}preview/backup/index.html">copias de seguridad de la aplicación</a>, entre otras.
+
+
+
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">Código de ejemplo</a>: indica cómo admitir permisos y otras características nuevas.
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/support.html#release-notes">Notas de la versión</a> para la versión actual de M Developer Preview, lo que incluye notas sobre los cambios e informes de diferencias.
+
+ </li>
+</ul>
+
+<h4>
+ Recursos de soporte
+</h4>
+
+<p>
+ Utilice los siguientes recursos de soporte durante el proceso de prueba y desarrollo en M Developer Preview:
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">El seguimiento de problemas de M Developer Preview</a> es su<strong> canal principal de comentarios.</strong>
+
+ A través de este seguimiento de problemas, usted puede informarnos errores o problemas de rendimiento, y enviarnos comentarios generales.
+ También puede buscar <a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">problemas recurrentes</a> y encontrar soluciones alternativas detalladas.
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M Developer Community</a> es una comunidad en Google+ donde usted puede <strong>contactarse con otros desarrolladores</strong> que estén trabajando con Android M. Puede compartir comentarios o ideas, o encontrar respuestas a sus dudas sobre Android M.
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ Selección del destino, API preliminares y publicación
+</h2>
+
+<p>
+ Android M Developer Preview es una versión solo para desarrollo y <strong>no tiene un nivel de API estándar</strong>.
+ Si quiere darse de baja de los comportamientos de compatibilidad para probar su aplicación (lo que es muy recomendado), puede elegir como destino M Developer Preview estableciendo <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code> de su aplicación como <code>“MNC”</code>.
+
+
+
+</p>
+
+<p>
+ Android M Developer Preview ofrece <strong>API preliminares</strong>
+ — las API no serán oficiales hasta que se lance el SDK final, lo que actualmente está planeado para el tercer trimestre de 2015.
+ Esto quiere decir que surgirán <strong>cambios menores en la API</strong> con el tiempo, particularmente durante las primeras semanas del programa.
+
+ Con cada actualización de Android M Developer Preview, proporcionaremos un resumen con los cambios realizados.
+
+</p>
+
+<p class="note">
+ Tenga en cuenta que aunque las API preliminares pueden modificarse, los comportamientos del sistema subyacente, como los permisos de tiempo de ejecución y las opciones de ahorro de energía, se mantienen estables y disponibles para cualquier prueba inmediata.
+
+
+</p>
+
+<p>
+ En cuanto a la publicación, Google Play <strong>no permite que se publiquen aplicaciones que tienen como destino M Developer Preview</strong>.
+ Una vez que el SDK final de Android M esté disponible, podrá seleccionar como destino el nivel de API oficial de Android M y publicar su aplicación en Google Play.
+
+ Mientras tanto, si desea distribuir una aplicación con Android M como destino a otros evaluadores, lo puede hacer por correo electrónico o mediante descarga directa desde su sitio.
+
+
+</p>
+
+<h2 id="get_started">
+ ¿Cómo comenzar?
+</h2>
+
+<p>
+ Para comenzar a probar su aplicación:
+</p>
+
+<ol>
+ <li>Revise el artículo <a href="{@docRoot}preview/api-overview.html">Información general de la API</a> y <a href="{@docRoot}preview/behavior-changes.html">Cambios en los comportamientos</a> para obtener una idea sobre las novedades y cómo estas pueden afectar sus aplicaciones.
+
+ En especial, infórmese sobre el nuevo modelo de <a href="{@docRoot}preview/features/runtime-permissions.html">permisos de tiempo de ejecución</a>, las opciones de ahorro de energía y las copias de seguridad automáticas.
+
+
+ </li>
+
+ <li>Configure su entorno siguiendo las instrucciones para <a href="{@docRoot}preview/setup-sdk.html">Configurar el SDK de la versión preliminar</a> y configurar los dispositivos de prueba.
+
+
+ </li>
+
+ <li>Siga las <a href="https://developers.google.com/android/nexus/images">instrucciones de actualización</a> para actualizar la última imagen del sistema del desarrollador de Android M para Nexus 5, 6, 9 y Player.
+
+ Cuando haya actualizado su dispositivo de desarrollo, recibirá las actualizaciones de la versión preliminar mediante actualizaciones OTA.</a>
+
+ </li>
+
+ <li>Descargue la <a href="{@docRoot}preview/download.html#docs">Referencia de la API de M Preview</a> y los <a href="{@docRoot}preview/samples.html">Ejemplos de M Preview</a> para obtener más información sobre las nuevas características de la API y sobre cómo utilizarlas en su aplicación.
+
+
+
+ </li>
+
+ <li>Únase a la comunidad <a href="http://g.co/dev/AndroidMDevPreview">Android M Developer Community</a> para recibir las últimas noticias y para contactarse con otros desarrolladores que estén trabajando con la nueva plataforma.
+
+
+ </li>
+</ol>
+
+<p>
+ ¡Agradecemos su participación en el programa Android M Developer Preview!
+</p>
diff --git a/docs/html-intl/intl/ja/preview/api-overview.jd b/docs/html-intl/intl/ja/preview/api-overview.jd
new file mode 100644
index 0000000..2c0816b
--- /dev/null
+++ b/docs/html-intl/intl/ja/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=API の概要
+page.keywords=プレビュー,sdk,互換性
+page.tags=previewresources, androidm sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本書の内容
+ <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">詳細を表示</span>
+ <span class="less" style="display:none">詳細を非表示</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">アプリのリンク機能</a></li>
+ <li><a href="#backup">アプリの自動バックアップ</a></li>
+ <li><a href="#authentication">認証</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">指紋認証</a></li>
+ <li><a href="#confirm-credential">資格情報の確認</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">ダイレクト シェア</a></li>
+ <li><a href="#voice-interactions">音声インタラクション</a></li>
+ <li><a href="#assist">Assist API</a></li>
+ <li><a href="#notifications">通知</a></li>
+ <li><a href="#bluetooth-stylus">Bluetooth スタイラスのサポート</a></li>
+ <li><a href="#ble-scanning">Bluetooth Low Energy のスキャンの改善</a></li>
+ <li><a href="#hotspot">アクセス ポイント2.0 リリース 1 のサポート</a></li>
+ <li><a href="#4K-display">4K ディスプレイ モード</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">テーマ化可能な ColorStateLists</a></li>
+ <li><a href="#audio">オーディオ機能</a></li>
+ <li><a href="#video">ビデオ機能</a></li>
+ <li><a href="#camera">カメラ機能</a>
+ <ol>
+ <li><a href="#flashlight">Flashlight API</a></li>
+ <li><a href="#reprocessing">カメラの再処理</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Android for Work の機能</a></li>
+</ol>
+
+<h2>API の変更点</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API レベル 22 から M Preview»</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M Developer Preview では、ユーザーやアプリ開発者に Android プラットフォームの次期リリースの新機能をいち早く試していただくことができます。
+
+このドキュメントでは、いくつかの注目すべき API の概要について説明します。</p>
+
+<p>M Developer Preview は、<strong>Developer の早期導入者</strong>と<strong>テスター</strong>を対象としています。
+是非
+<a href="{@docRoot}preview/setup-sdk.html">M Developer Preview を試して</a>フィードバックをご提供ください。あなたのご意見が、Android フレームワークの方向性を決定する上で貴重な情報になります。
+
+</p>
+
+<p class="caution"><strong>注意:</strong> M Developer Preview を使用したアプリは、Google Play ストアには公開しないでください。
+</p>
+
+<p class="note"><strong>注</strong>: このドキュメントには、まだ <a href="{@docRoot}">developer.android.com</a> のリファレンス マテリアルにないクラスやメソッドが多数登場します。
+このドキュメントでは、API エレメントは {@code code style} 形式で記載されています(ハイパーリンクなし)。
+これらのエレメントに関する API ドキュメント(準備段階)については、<a href="{@docRoot}preview/download.html#docs">プレビューのリファレンス</a>をダウンロードしてください。
+</p>
+
+<h3>重要な動作の変更点</h3>
+
+<p>過去に Android にアプリを公開したことがある場合は、アプリがプラットフォームの変更による影響を受ける場合があります。
+</p>
+
+<p>詳細については、<a href="behavior-changes.html">Behavior Changes</a> をご覧ください。</p>
+
+<h2 id="app-linking">アプリのリンク機能</h2>
+<p>このプレビューでは、アプリのリンク機能を強化することで Android のインテント システムが向上しました。この機能では、所有するウェブドメインにアプリを関連付けることができます。
+この関連付けに基づいて、プラットフォームが特定のウェブリンクの処理に使用するデフォルトのアプリを決めることができ、ユーザーにアプリを選択させる操作をスキップできます。この機能の実装方法については、
+<a href="{@docRoot}preview/features/app-linking.html">アプリのリンク機能</a>をご覧ください。
+
+
+
+<h2 id="backup">アプリの自動バックアップ</h2>
+<p>システムで、アプリの自動フルデータ バックアップと復元を実行できるようになりました。この動作は、M Preview を対象としたアプリでデフォルトで有効になっています。追加のコードは必要ありません。
+ユーザーが Google アカウントを削除すると、バックアップ データも削除されます。
+この機能の仕組みとファイル システムでバックアップ対象を設定する方法については、
+<a href="{@docRoot}preview/backup/index.html">アプリの自動バックアップ</a>をご覧ください。
+</p>
+
+<h2 id="authentication">認証</h2>
+<p>このプレビューでは、サポートされる端末での指紋スキャンを使用したユーザー認証や、端末のロック解除メカニズム(ロック画面のパスワードなど)を使って最後にユーザーが認証された時期の確認などを行える新しい API が提供されます。
+
+これらの API は、<a href="{@docRoot}training/articles/keystore.html">Android キーストローク システム</a>と共に使用します。
+</p>
+
+<h3 id="fingerprint-authentication">指紋認証</h3>
+
+<p>指紋スキャンでユーザーを認証するには、新しい
+{@code android.hardware.fingerprint.FingerprintManager} クラスのインスタンスを取得して、
+{@code FingerprintManager.authenticate()} メソッドを呼び出します。アプリは、指紋センサー付きの、互換性のある端末上で実行している必要があります。
+指紋認証フローのユーザー インターフェースをアプリに実装し、UI には標準の Android 指紋アイコンを使用する必要があります。Android 指紋アイコン({@code c_fp_40px.png})は<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">サンプルアプリ</a>に含まれています。指紋認証を使用するアプリを複数開発する場合は、それぞれのアプリで個別にユーザーの指紋を認証する必要があります。
+
+
+
+
+</p>
+
+<p>アプリでこの機能を使用するには、まずマニフェストに {@code USE_FINGERPRINT} パーミッションを追加する必要があります。
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>アプリでの指紋認証の実装については、
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">指紋ダイアログのサンプル</a>をご覧ください。
+</p>
+
+<p>この機能をテストする場合は、次の手順を使用します。</p>
+<ol>
+<li>Android SDK Tools Revision 24.3 をインストールします(まだインストールしていない場合)。</li>
+<li>
+<strong>[設定] > [セキュリティ] > [指紋]</strong> の登録手順に従い、エミュレータに新しい指紋を登録します。</li>
+<li>エミュレータを使って、次のコマンドで指紋のタッチ ベントをエミュレートします。
+同じコマンドを使って、ロック画面やアプリでの指紋のタッチイベントをエミュレートします。
+
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>Windows では、{@code telnet 127.0.0.1 <emulator-id>}、
+{@code finger touch <finger_id>} の順に実行する必要がある場合があります。
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">資格情報の確認</h3>
+<p>アプリでは、ユーザーがいつ、最後に端末のロックを解除したかに基づいて、ユーザーを認証できます。この機能によって、ユーザーがアプリ固有のパスワードを覚えたり、開発者が独自の認証ユーザー インターフェースを実装したりする必要性がなくなります。
+
+アプリでこの機能を使用する場合は、ユーザー認証用の公開鍵か秘密鍵を実装する必要があります。
+</p>
+
+<p>ユーザーが正常に認証された後、同じキーを再使用できるタイムアウト期間を設定するには、{@link javax.crypto.KeyGenerator} か
+{@link java.security.KeyPairGenerator} のセットアップ後に新しい
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()} メソッドを呼び出します。
+
+現在、この機能は対象暗号化操作で動作します。
+</p>
+
+<p>再認証ダイアログを過度に表示しないようにします。アプリでは、まず暗号オブジェクトを使用し、タイムアウトした場合は
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} メソッドを使用してユーザーをアプリ内で再認証するようにします。
+
+
+</p>
+
+<p>アプリでのこの機能の実装については、
+<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">資格情報の確認サンプル</a>をご覧ください。
+</p>
+
+<h2 id="direct-share">ダイレクト シェア</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>このプレビューでは、ユーザーが直感的にすばやく共有できるようにする API が提供されます。アプリで特定のアクティビティを起動する<em>ダイレクト シェアのターゲット</em>を定義すると、それらのダイレクト シェアのターゲットは <em>[共有]</em> メニューに表示されるようになります。
+
+この機能を使うと、他のアプリ内にある連絡先などのターゲットにコンテンツを共有できます。
+たとえば、ダイレクト シェアのターゲットによって他のソーシャル ネットワーク アプリのアクティビティが起動し、そのアプリ内の特定の友人やコミュニティに直接コンテンツを共有できるようになります。
+
+</p>
+
+<p>ダイレクト シェアのターゲットを有効にするには、まず
+{@code android.service.} を拡張するクラスを定義する必要があります。 <br>
+{@code chooser.ChooserTargetService} クラス。マニフェストで
+{@code ChooserTargetService} を宣言します。その宣言内で、
+{@code BIND_CHOOSER_TARGET_SERVICE} パーミッションと、
+{@code SERVICE_INTERFACE} アクションを使ったインテント フィルタを指定します。</p>
+<p>次の例は、マニフェストで {@code ChooserTargetService} を宣言する方法を示しています。
+</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>{@code ChooserTargetService} に公開するアクティビティごとに、 {@code "android.service.chooser.chooser_target_service"} という名前の
+{@code <meta-data>} 要素をアプリのマニフェストに追加します。
+
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">音声インタラクション</h2>
+<p>
+このプレビューでは、<a href="https://developers.google.com/voice-actions/" class="external-link">音声アクション</a>と共に使用することでアプリに対話形式の音声操作をビルドできる新しい音声インタラクション API が提供されます。
+
+
+{@code android.app.Activity.isVoiceInteraction()} メソッドを呼び出して、アクティビティが音声アクションへの応答として開始されたかどうかを確認します。
+音声アクションへの応答であった場合、アプリで
+{@code android.app.VoiceInteractor} クラスを使用してユーザーに音声の確認や、オプションのリストからの選択などを要求できます。
+音声アクションの実装の詳細については、
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">音声アクションの開発者サイト</a>をご覧ください。
+</p>
+
+<h2 id="assist">Assist API</h2>
+<p>
+このプレビューでは、アシスタントを介してユーザーがアプリを操作できる新しい方法が用意されています。この機能を使用するには、ユーザーが現在のコンテキストを使うようアシスタントを有効にする必要があります。
+有効にすると、<strong>ホーム</strong> ボタンを長押しすることで、すべてのアプリ内でアシスタントを呼び出すことができます。
+</p>
+<p>
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE} フラグを設定すると、アプリが現在のコンテキストをアシスタントと共有しないようにできます。新しい {@code android.app.Activity.AssistContent} クラスを使用すると、プラットフォームがアシスタントに渡す標準的な情報セットの他に、アプリで追加の情報を共有できます。
+
+</p>
+
+<p>アプリから追加のコンテキストをアシスタントに提供するには、次の手順を使用します。</p>
+
+<ol>
+<li>{@link android.app.Application.OnProvideAssistDataListener} インターフェースを実装します。</li>
+<li>
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()} を使用してこのリスナーを登録します。</li>
+<li>アクティビティ固有の文脈情報を提供するには、
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()} コールバックと、任意で新しい
+{@code Activity.onProvideAssistContent()} コールバックをオーバーライドします。
+</ol>
+
+<h2 id="notifications">通知</h2>
+<p>このプレビューでは、通知に関して次のような API の変更点が追加されています。</p>
+<ul>
+ <li>新しい<em>アラームのみの</em> Do not disturb モードに相当する新しい {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} フィルタレベル。
+</li>
+ <li>ユーザーが予定したリマインダを他のイベント({@link android.app.Notification#CATEGORY_EVENT})やアラーム({@link android.app.Notification#CATEGORY_ALARM})から区別する際に使用される新しい{@code Notification.CATEGORY_REMINDER} カテゴリの値。
+
+
+</li>
+ <li>{@code Notification.Builder.setSmallIcon(Icon)} メソッドや {@code Notification.Builder.setLargeIcon(Icon)} メソッド経由で通知にアタッチできる新しい {@code android.graphics.drawable.Icon} クラス。
+
+</li>
+ <li>現在どの通知がアクティブなのかをアプリが検出できるようにする新しい {@code NotificationManager.getActiveNotifications()} メソッド。
+この機能を使用するアプリの実装については、<a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">アクティブな通知のサンプル</a>をご覧ください。
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">Bluetooth スタイラスのサポート</h2>
+<p>このプレビューでは、Bluetooth スタイラスを使用したユーザー入力のサポートが強化されました。互換性のある Bluetooth スタイラスと電話やタブレットをペアリングして接続できます。
+接続されている間、タッチスクリーンからの位置情報とスタイラスからの筆圧やボタン情報を合わせることで、タッチスクリーン単独の場合よりも表現の幅が大きく広がります。
+
+新しい
+{@code View.onStylusButtonPressListener} コールバックと {@code GestureDetector.OnStylusButtonPressListener} コールバックをアクティビティに登録すると、スタイラスのボタンが押されたことをアプリがリッスンし、次のアクションを実行できるようになります。
+
+</p>
+
+<p>スタイラスのボタン操作を検出するには、{@link android.view.MotionEvent} メソッドと定数を使用します。
+</p>
+<ul>
+<li>ユーザーがスタイラスでアプリ画面のボタンをタップすると、
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} メソッドが
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS} を返します。</li>
+<li>M Preview を対象としたアプリでは、ユーザーがプライマリのスタイラス ボタンを押すと
+{@link android.view.MotionEvent#getButtonState() getButtonState()} メソッドが {@code MotionEvent.STYLUS_BUTTON_PRIMARY} を返します。
+
+スタイラスにセカンダリ ボタンがある場合は、ユーザーがそのボタンを押したときに同じメソッドで {@code MotionEvent.STYLUS_BUTTON_SECONDARY} が返されます。
+ユーザーが同時に両方のボタンを押した場合は、両方の値が OR で返されます({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY})
+
+</li>
+<li>
+以前のプラットフォーム バージョンを対象としたアプリでは、
+{@link android.view.MotionEvent#getButtonState() getButtonState()} メソッドは
+{@link android.view.MotionEvent#BUTTON_SECONDARY}(プライマリのスタイラス ボタンが押されたとき)、
+{@link android.view.MotionEvent#BUTTON_TERTIARY}(セカンダリのスタイラス ボタンが押されたとき)、または両方を返します。
+</li>
+</ul>
+
+<h2 id="ble-scanning">Bluetooth Low Energy のスキャンの改善</h2>
+<p>
+アプリで Bluetooth Low Energy スキャンを実行する場合は、新しい
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} メソッドを使って、設定された
+{@link android.bluetooth.le.ScanFilter} に一致する宣伝パケットが最初に見つかったときと、それが長期間見つからない場合に通知する目的でのみコールバックが必要であると指定できます。
+
+このスキャン アプローチは、以前のプラットフォーム バージョンで提供されていたものよりもはるかに効率的です。
+
+</p>
+
+<h2 id="hotspot">アクセス ポイント 2.0 リリース 1 のサポート</h2>
+<p>
+このプレビューでは、Nexus 6 と Nexus 9 端末のアクセス ポイント2.0 Release 1 仕様のサポートが追加されました。アクセス ポイント 2.0 の資格情報をアプリに提供するには、
+{@code setPlmn()} や {@code setRealm()} などの
+{@link android.net.wifi.WifiEnterpriseConfig} クラスの新しいメソッドを使用します。
+{@link android.net.wifi.WifiConfiguration} オブジェクトで、
+{@link android.net.wifi.WifiConfiguration#FQDN} フィールドと {@code providerFriendlyName} フィールドを設定できます。新しい {@code ScanResult.PasspointNetwork} プロパティは、検出されたネットワークがアクセス ポイント 2.0 のアクセス ポイントを表しているかどうかを示します。
+
+
+</p>
+
+<h2 id="4K-display">4K ディスプレイ モード</h2>
+<p>互換性のあるハードウェアで、ディスプレイの解像度を 4K レンダリングにアップグレードするようアプリから要求できるようになりました。
+現在の物理的解像度を照会するには、新しい
+{@code android.view.Display.Mode} API を使用します。UI が低い論理的解像度で描画されていて、より高い物理的解像度にアップスケールされた場合は、
+{@code Display.Mode.getPhysicalWidth()} メソッドが返す物理的解像度が {@link android.view.Display#getSize(android.graphics.Point) getSize()} で報告される論理的解像度と異なる場合があります。
+
+</p>
+
+<p>アプリ ウィンドウの
+{@code WindowManager.LayoutParams.preferredDisplayModeId} プロパティを設定することで、アプリの実行時に物理的解像度を変更するようシステムに要求できます。この機能は、4K ディスプレイの解像度に切り替えたい場合に便利です。
+4K ディスプレイ モード中、UI は引き続き元の解像度(1080p など)で表示され、4K にアップスケールされますが、
+{@link android.view.SurfaceView} オブジェクトではコンテンツをネイティブの解像度で表示する場合があります。
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">テーマ化可能な ColorStateLists</h2>
+<p>M Preview を実行する端末で、テーマの属性が
+{@link android.content.res.ColorStateList} でサポートされるようになりました。
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} メソッドと
+{@link android.content.res.Resources#getColor(int) getColor()} メソッドは廃止されました。これらの API を呼び出す場合は、代わりに新しい {@code Context.getColorStateList()} メソッドか
+{@code Context.getColor()} メソッドを呼び出します。
+これらのメソッドは、{@link android.support.v4.content.ContextCompat} の v4 appcompat ライブラリにもあります。
+</p>
+
+<h2 id="audio">オーディオ機能</h2>
+
+<p>このプレビューでは、次のように Android でのオーディオ処理が改善されました。 </p>
+<ul>
+ <li>新しい {@code android.media.midi} API を使った <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a> プロトコルのサポート。
+これらの API を使用して MIDI イベントを送受信できます。
+</li>
+ <li>デジタル オーディオの録音を作成して、それぞれのオブジェクトを再生し、システムのデフォルトをオーバーライドするオーディオ ソースとシンク プロパティを構成するための新しい {@code android.media.AudioRecord.Builder} クラスと {@code android.media.AudioTrack.Builder} クラス
+
+。</li>
+ <li>オーディオと入力端末を関連付ける API フック。これは、ユーザーが Android TV に接続されているゲーム コントローラーやリモート コントロールから音声検索を開始できるアプリの場合に特に便利です。ユーザーが検索を開始すると、システムが新しい
+{@code android.app.Activity.onSearchRequested()} コールバックを呼び出します。
+
+ユーザーの入力端末に組み込みのマイクがあるかどうかを確認するには、そのコールバックから {@link android.view.InputDevice} オブジェクトを取得して、新しい
+{@code InputDevice.hasMic()} メソッドを呼び出します。
+</li>
+ <li>アタッチされたすべてのソースとシンク オーディオ端末の一覧を取得できる新しい {@code android.media.AudioDevicesManager} クラス。
+また、オーディオ端末の接続時と接続解除時にアプリで通知を受けたい場合は、
+{@code android.media.OnAudioDeviceConnectionListener} オブジェクトを指定することもできます。
+</li>
+</ul>
+
+<h2 id="video">ビデオ機能</h2>
+<p>このプレビューでは、ビデオ処理の API に次のような新機能が追加されました。</p>
+<ul>
+<li>アプリでオーディオ ストリームとビデオ ストリームを同調してレンダリングできる新しい {@code android.media.MediaSync}。
+オーディオ バッファはノンブロッキング方式で送信され、コールバック経由で返されます。
+ダイナミック再生レートもサポートしています。
+</li>
+<li>アプリで開かれたセッションが、リソース マネージャーによって再要求されたことを示す新しい {@code MediaDrm.EVENT_SESSION_RECLAIMED} イベント。
+アプリが DRM セッションを使用する場合は、必ずこのイベントを処理し、再要求されたセッションは使用しないようにします。
+
+</li>
+<li>リソース マネージャーがコーデックで使用されたメディア リソースを再要求したことを示す新しい {@code MediaCodec.CodecException.ERROR_RECLAIMED} エラーコード。
+この例外では、コーデックはターミナル状態に移動するため、解放する必要があります。
+
+</li>
+<li>同時に発生できるコーデック インスタンスの最大数のヒントを得られる新しい {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} インターフェース。
+
+</li>
+<li>高速または低速モーション再生におけるメディアの再生レートを設定する新しい {@code MediaPlayer.setPlaybackParams()} メソッド。
+ビデオと共にオーディオの再生を自動的に延ばしたり早めたりもします。
+</li>
+</ul>
+
+<h2 id="camera">カメラ機能</h2>
+<p>このプレビューでは、カメラのフラッシュやカメラによる画像の再処理にアクセスするための新しい API が用意されています。
+</p>
+
+<h3 id="flashlight">Flashlight API</h3>
+<p>カメラ端末にフラッシュ ユニットが付属している場合は、{@code CameraManager.setTorchMode()} メソッドを呼び出すことで、カメラ端末を開かずにフラッシュ ユニットのタッチモードのオン/オフを切り替えることができます。
+アプリには、フラッシュ ユニットやカメラ端末のフラッシュの独占所有権はありません。
+トーチモードは、カメラ端末が利用不可になったときや、トーチを付けている他のカメラリソースが利用不可になったときにオフになり、利用できなくなります。
+
+他のアプリでも {@code setTorchMode()} を呼び出してトーチモードをオフにできます。
+最後にトーチモードをオンにしたアプリが閉じられると、トーチモードはオフになります。
+</p>
+
+<p>
+{@code CameraManager.registerTorchCallback()} メソッドを呼び出すことで、トーチモードの状態に関する通知を受けるようコールバックを登録できます。コールバックを初めて登録したときに、現在検知されているすべてのフラッシュ ユニット付きのカメラ端末のトーチモードの状態が即座に呼び出されます。
+
+トーチモードが正常にオン/オフされると、
+{@code CameraManager.TorchCallback.onTorchModeChanged()} メソッドが呼び出されます。</p>
+
+<h3 id="reprocessing">Reprocessing API</h3>
+<p>{@link android.hardware.camera2 Camera2} API は、YUV とプライベートな不透明形式の画像の再処理をサポートするよう拡張されました。
+アプリは、再処理機能が利用可能かどうかを {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES} 経由で確認します。
+端末が再処理をサポートしている場合は、
+{@code CameraDevice.createReprocessableCaptureSession()} を呼び出して再処理可能なカメラ撮影セッションを作成し、入力バッファの再処理の要求を作成できます。
+
+</p>
+
+<p>入力バッファのフローをカメラの再処理入力に接続するには、{@code ImageWriter} クラスを使用します。
+空のバッファを取得するには、次のプログラミング モデルを使用します。</p>
+
+<ol>
+<li>{@code ImageWriter.dequeueInputImage()} メソッドを呼び出します。</li>
+<li>入力バッファにデータを入力します。</li>
+<li>{@code ImageWriter.queueInputImage()} メソッドを呼び出して、バッファをカメラに送ります。</li>
+</ol>
+
+<p>{@code ImageWriter} オブジェクトを
+{@code android.graphics.ImageFormat.PRIVATE} 画像と共に使用する場合、アプリから直接画像データにアクセスすることはできません。
+代わりに、{@code ImageWriter.queueInputImage()} メソッドをバッファコピーなしで呼び出して、{@code ImageFormat.PRIVATE} 画像を直接
+{@code ImageWriter} に渡します。
+</p>
+
+<p>{@code ImageReader} クラスで {@code android.graphics.ImageFormat.PRIVATE} 形式の画像ストリームがサポートされるようになりました。
+これにより、アプリが
+{@code ImageReader} 出力画像の循環的な画像のキューを維持でき、1 つ以上の画像を選択して、それらをカメラの再処理用に
+{@code ImageWriter} に送ることができます。</p>
+
+<h2 id="afw">Android for Work の機能</h2>
+<p>このプレビューには、次のような Android for Work 用の新しい API が含まれています。</p>
+<ul>
+ <li><strong>企業の専用端末の制御の強化:</strong>デバイス オーナーは次の設定を制御でき、企業の専用端末を管理しやすくなります。
+
+
+ <ul>
+ <li>
+{@code DevicePolicyManager.setKeyguardEnabledState()} メソッドを使ったキーガードの無効化と有効化。</li>
+ <li>
+{@code DevicePolicyManager.setStatusBarEnabledState()} メソッドを使ったステータスバー(クイック設定、通知、Google Now を起動するスワイプアップのジェスチャ)の無効化と有効化。
+</li>
+ <li>{@link android.os.UserManager} の定数 {@code DISALLOW_SAFE_BOOT} を使ったセーフブートの無効化と有効化。
+</li>
+ <li>
+{@link android.provider.Settings.Global} の定数 {@code STAY_ON_WHILE_PLUGGED_IN} を使った電源接続時の画面オフの回避。</li>
+ </ul>
+ </li>
+ <li><strong>デバイス オーナーによるアプリのサイレント インストールとアンインストール:</strong>デバイス オーナーでは、{@link android.content.pm.PackageInstaller} API を使って、Google Play for Work から独立してアプリケーションをサイレントにインストール、アンインストールできます。
+
+デバイス オーナー経由で、ユーザー操作なしでアプリを取得したりインストールしたりできる端末を提供できます。
+この機能は、Google アカウントのアクティベートなしでキオスクや同様の端末のワンタッチ プロビジョニングを有効にする際に便利です。
+</li>
+<li><strong>企業証明書のサイレント アクセス: </strong>ユーザーが証明書の選択を求められる前にアプリが
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()} を呼び出すと、プロファイルやデバイス オーナーが {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} メソッドを呼び出して要求元のアプリケーションにエイリアスをサイレントに提供できるようになりました。
+
+
+この機能によって、ユーザー操作なしでマネージド アプリが証明書にアクセスできるようになります。
+</li>
+<li><strong>システムアップデートの自動受信。</strong>
+{@code DevicePolicyManager.setSystemUpdatePolicy()} を使ってシステムアップデートのポリシーを設定することで、デバイス オーナーがキオスク端末などでシステムアップデートを自動的に受信できるようにしたり、ユーザーが操作しないようアップデートを最大 30 日間保留したりできます。
+
+さらに、管理者はアップデートを実行する時間枠を、キオスク端末が使用されていない時間帯などに設定できます。
+利用可能なシステムアップデートがある場合、システムは Work Policy Controller アプリにシステムアップデートのポリシーがあるかどうかを確認し、それに基づいて動作します。
+
+
+</li>
+<li>
+<strong>代理証明書のインストール:</strong>プロファイルやデバイス オーナーで、サードパーティ アプリが次の {@link android.app.admin.DevicePolicyManager} 証明書の管理 API を呼び出す権限を付与できるようになりました。
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>企業のファクトリー リセット制限:</strong>デバイス オーナーをプロビジョニングする際、
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} バンドルを設定して、ファクトリー リセット保護(FRP)をロック解除するようパラメータを構成できます。
+NFC プログラマー アプリでは、端末が FRP のロック解除するようリセットされ、端末がプロビジョニングされた後にこれらのパラメータを提供でき、事前に Google アカウントを設定しておく必要はありません。
+
+これらのパラメータを修正しない場合、FRP は続行し、事前にアクティブ化された Google の資格情報なしで端末がアクティベートされないようにします。
+
+
+<p>さらに、Google Play サービスでアプリの制限を設定することで、デバイス オーナーは FRP のロック解除用の別の Google アカウントを指定して、端末でアクティベートされたアカウントを置き換えることができます。
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>データ使用のトラッキング</strong>プロファイルやデバイス オーナーでは、新しい
+{@code android.app.usage.NetworkStatsManager} メソッドを使用して、<strong>[設定] > [データ]</strong> に表示されるデータ使用の統計を照会できます。
+プロファイル オーナーには、管理するプロファイルのデータを照会するパーミッションが自動的に付与され、デバイス オーナーは管理されたプライマリ ユーザーの使用データへのアクセス権が付与されます。
+
+</li>
+<li><strong>実行時パーミッションの管理:</strong>
+<p>プロファイルやデバイス オーナーは、
+{@code DevicePolicyManager.setPermissionPolicy()} を使用するすべてのアプリケーションのすべての実行時の要求に対するパーミッション ポリシーを設定でき、通常のとおりユーザーにパーミッションを付与するよう要求する、自動的に付与する、パーミッションをサイレントに拒否する、のいずれかを行うことができます。
+
+後者のポリシーが設定されている場合、ユーザーはプロファイルやデバイス オーナーによって選択された内容を <strong>[設定]</strong> にあるアプリのパーミッション画面で修正できません。
+
+</p></li>
+<li><strong>設定の VPN:</strong>VPN アプリは、<strong>[設定] > [その他] > [VPN]</strong> に表示されます。さらに、VPN の使用に関する通知は、その VPN の構成状況によるものになります。
+
+
+プロファイル オーナーの場合、通知は VPN が マネージド プロファイル、個人プロファイル、または両方のどれに構成されているかによって、それ固有のものになります。
+デバイス オーナーの場合、通知は VPN が端末全体に構成されているかどうかによって、それ固有のものになります。
+</li>
+<li><strong>ワーク ステータスの通知:</strong>マネージド プロファイルからのアプリのアクティビティがフォアグラウンドにある場合は、ステータスバーのブリーフケース アイコンが表示されます。
+さらに、端末がマネージド プロファイルのアプリのアクティビティに直接ロック解除されている場合、ユーザーがワーク プロファイル内にいることがトースト通知で表示されます。
+
+
+</li>
+</ul>
+
+<p class="note">
+ M Developer Preview のすべての API の変更点の詳細については、<a href="{@docRoot}preview/download.html">API Differences Report</a> をご覧ください。
+</p>
diff --git a/docs/html-intl/intl/ja/preview/behavior-changes.jd b/docs/html-intl/intl/ja/preview/behavior-changes.jd
new file mode 100644
index 0000000..a7950a1
--- /dev/null
+++ b/docs/html-intl/intl/ja/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=動作の変更点
+page.keywords=プレビュー,sdk,compatibility
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本書の内容</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">実行時パーミッション</a></li>
+ <li><a href="#behavior-power">省電力の最適化 </a>
+ <ol>
+ <li><a href="#behavior-doze">Doze</a></li>
+ <li><a href="#behavior-app-standby">App Standby</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">追加可能なストレージ端末</a></li>
+ <li><a href="#behavior-apache-http-client">Apache HTTP Client の削除</a></li>
+ <li><a href="#behavior-audiomanager-Changes">AudioManager の変更点</a></li>
+ <li><a href="#behavior-test-selection">テキスト選択</a></li>
+ <li><a href="#behavior-keystore">Android キーストロークの変更点</a></li>
+ <li><a href="#behavior-network">Wi-Fi とネットワークの変更点</a></li>
+ <li><a href="#behavior-camera">カメラ サービスの変更点</a></li>
+ <li><a href="#behavior-art-runtime">ART ランタイム</a></li>
+ <li><a href="#behavior-apk-validation">APK の検証</a></li>
+ <li><a href="#behavior-afw">Android for Work の変更点</a></li>
+</ol>
+
+<h2>API の変更点</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API レベル 22 から M Preview»</a> </li>
+</ol>
+
+
+<h2>関連ドキュメント</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">M Developer Preview API の概要</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M Developer Preview には、新機能以外にもさまざまなシステムの変更点や API の動作の変更点が盛り込まれています。
+このドキュメントでは、アプリ開発において把握しておくべき主な変更点について説明します。
+</p>
+
+<p>過去に Android にアプリを公開したことがある場合は、アプリがこれらの変更による影響を受ける場合があることに注意してください。
+</p>
+
+<h2 id="behavior-runtime-permissions">実行時パーミッション</h1>
+<p>このプレビューでは、アプリのパーミッションを実行時にユーザーが直接管理できる新しいパーミッション モデルが採用されました。
+このモデルによって、ユーザーに対するパーミッションの可視性と制御性が向上し、アプリ開発者にとってはアプリのインストールや自動アップデート プロセスの効率が上がります。ユーザーはインストール済みアプリのパーミッションを個別に付与したり取り消したりできます。
+
+ </p>
+
+<p>M Preview を対象としたアプリでは、必ずパーミッションを実行時に確認、要求するようにします。
+アプリにパーミッションが付与されているかどうかを確認するには、新しい {@code Context.checkSelfPermission()} メソッドを呼び出します。
+パーミッションを要求するには、新しい
+{@code Activity.requestPermission()} メソッドを呼び出します。アプリが M を対象としていない場合でも、新しいパーミッション モデルでアプリをテストするようにしてください。
+</p>
+
+<p>アプリで新しいパーミッションをサポートする際の詳細については、Developer Preview ページの
+<a href="{@docRoot}preview/features/runtime-permissions.html">Permissions</a> をご覧ください。
+アプリへの影響を評価する際のヒントについては、<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">Testing Guide</a> をご覧ください。
+</p>
+
+<h2 id="behavior-power">省電力の最適化 </h2>
+<p>このプレビューでは、アイドル中の端末やアプリに対する新しい省電力の最適化機能が採用されています。</p>
+
+<h3 id="behavior-doze">Doze</h3>
+<p>端末が電源に接続されておらず、画面が一定時間オフ状態の場合は <em>Doze</em> モードに入り、システムをスリープ状態に保ちます。
+このモードでは、端末は定期的に通常の操作を短時間再開することで、アプリを同期したり、システムが保留中の操作を行ったりすることができます。
+
+</p>
+
+<p>Doze 中は、アプリに次の制限が適用されます。</p>
+<ul>
+<li>アプリで優先度の高い Google Cloud Messaging の通知を受信する場合以外、ネットワーク アクセスは無効になります。
+</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">Wake ロック</a> は無視されます。</li>
+<li>{@link android.app.AlarmManager} クラスを使ってスケジュールされたアラームは無効になりますが、{@link android.app.AlarmManager#setAlarmClock setAlarmClock()} メソッドと {@code AlarmManager.setAndAllowWhileIdle()} を使って設定したアラームは除きます。
+
+</li>
+<li>WiFi スキャンは実行されません。</li>
+<li>同期アダプタ と {@link android.app.job.JobScheduler} の同期とジョブは実行できません。
+</li>
+</ul>
+</p>
+<p>端末が Doze モードでなくなると、保留中のすべての同期とジョブが実行されます。</p>
+<p>この機能をテストするには、M Preview を実行する端末を開発マシンに接続して、次のコマンドを呼び出します。
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>注</strong>:
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud Messaging</a> の次期リリースでは、高優先度のメッセージを指定できます。
+
+アプリが高優先度の GCM メッセージを受信する場合は、端末が Doze 中でも短時間のネットワーク アクセスが付与されます。
+
+</p>
+
+<p>アプリで Doze をテストする方法のヒントについては、
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">Testing Guide</a> をご覧ください。
+ </p>
+
+<h3 id="behavior-app-standby">App Standby</h3>
+<p>このプレビューでは、アクティブに使用されていないアプリをシステムがアイドル状態であるとみなす場合があります。
+システムが次の信号を検出しない場合、一定時間の経過後にアプリはアイドル状態であるとみなされます。
+</p>
+
+<ul>
+<li>アプリがユーザーによって明示的に起動された。</li>
+<li>アプリのプロセスが現在フォアグラウンドにある(アクティビティかフォアグラウンド サービスとしてか、他のアクティビティかフォアグラウンド サービスによって使用されている)。
+</li>
+<li>アプリがロック画面や通知トレイに表示される通知を生成する。
+</li>
+<li>ユーザーが、アプリに最適化が適用されないよう <strong>[設定]</strong> で明示的に指定する。
+</li>
+</ul>
+
+<p>端末が電源に接続されていない場合、アイドル中のみなされたアプリのネットワーク アクセスは無効になり、同期とジョブは保留されます。
+端末が電源に接続されると、アプリのネットワーク アクセスは許可され、保留中のすべてのジョブと同期が実行されます。
+端末が長時間アイドル状態の場合、アイドル中のアプリは 1 日 1 回程度ネットワーク アクセスが許可されます。
+</p>
+
+<p>この機能をテストするには、M Preview を実行する端末を開発マシンに接続して、次のコマンドを呼び出します。
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>注:</strong>
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud Messaging</a>(GCM)の次期リリースでは、高優先度のメッセージを指定できます。
+
+アプリが高優先度の GCM メッセージを受信する場合は、アプリがアイドル 中でも短時間のネットワーク アクセスが付与されます。
+
+</p>
+
+<p>アプリで App Standby をテストする方法のヒントについては、
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">Testing Guide</a> をご覧ください。
+ </p>
+
+<h2 id="behavior-adoptable-storage">追加可能なストレージ端末</h2>
+<p>
+このプレビューでは、SD カードなどの外部ストレージ端末を<em>追加</em>できます。外部ストレージ端末を追加すると、端末が内部ストレージのように動作するよう暗号化とフォーマットが行われます。
+この機能によって、アプリとアプリの個人データをストレージ端末間で移動できるようになります。
+アプリを移動する際、システムはマニフェストの
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a> を遵守します。
+
+</p>
+
+<p>アプリが次の API やフィールドにアクセスする場合は、アプリが内部ストレージ端末と外部ストレージ端末間で移動する際に返されるファイルパスが動的に変化することに注意してください。ファイルパスの構築時は、これらの API を動的に呼び出すことを強くお勧めします。ハードコードされたファイル パスを使用したり、過去にビルドした完全修飾ファイルパスをそのまま使用したりしないでください。
+
+
+</p>
+
+<ul>
+<li>{@link android.content.Context} メソッド:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>{@link android.content.pm.ApplicationInfo} フィールド:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>Developer Preview のこの機能をデバッグするには、USB On-The-Go(OTG)ケーブルで Android 端末に接続された USB ドライブの追加を有効にして、次のコマンドを実行します。
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">Apache HTTP Client の削除</h2>
+<p>このプレビューでは、Apache HTTP クライアントのサポートが削除されました。アプリでこのクライアントを使用していて、Android 2.3(API レベル 9)以上を対象としている場合は、代わりに {@link java.net.HttpURLConnection} クラスを使用します。
+
+この API は透過的データ圧縮と応答のキャッシュによってネットワーク使用を軽減し、電源の消費を最小化するため、効率性が向上します。
+Apache HTTP API を引き続き使用するには、まず {@code build.gradle} ファイルで次のコンパイル時の依存関係を宣言する必要があります。
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android は、OpenSSL から
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a> ライブラリに移行しています。
+アプリで Android NDK を使用している場合は、{@code libcrypto.so} や {@code libssl.so} など、NDK API の一部でない暗号化ライブラリにリンクしないでください。
+これらのライブラリは パブリック API ではなく、リリースや端末に対する通知なしで変更されたり、中断したりする可能性があります。また、セキュリティ上の脆弱性を露呈する場合もあります。
+
+代わりに、ネイティブ コードを変更して JNI 経由で Java の暗号化 API を呼び出すか、希望の暗号化ライブラリに静的リンクします。
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">AudioManager の変更点</h2>
+<p>{@link android.media.AudioManager} クラスで音量を直接設定したり、特定のストリームをミュートにしたりする方法はサポートされなくなりました。
+{@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} メソッドは廃止されたため、代わりに
+{@code AudioManager.requestAudioFocus()} メソッドを呼び出す必要があります。同様に、
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} メソッドも廃止され、代わりに {@code AudioManager.adjustStreamVolume()} メソッドを呼び出して、値に {@code ADJUST_MUTE} か {@code ADJUST_UNMUTE} を渡します。
+
+</p>
+
+<h2 id="behavior-test-selection">テキスト選択</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>ユーザーがアプリ内でテキストを選択するとき、
+<em>切り取り</em>、<em>コピー</em>、<em>貼り付け</em>などのテキスト選択のアクションを
+<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">フローティング ツール バー</a>に表示できるようになりました。
+<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">個別のビューに対してコンテキスト アクション モードを有効にする</a>にあるように、コンテキスト アクションバーに関するユーザー操作の実装も同様です。
+
+</p>
+
+<p>テキスト選択にフローティング ツール バーを実装するには、既存のアプリに次の変更を加えます。
+</p>
+<ol>
+<li>{@link android.view.View} オブジェクトか {@link android.app.Activity} オブジェクトで、{@link android.view.ActionMode} の呼び出しを
+{@code startActionMode(Callback)} から {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)} に変更します。
+</li>
+<li>既存の {@code ActionMode.Callback} の実装を、{@code ActionMode.Callback2} に拡張します。
+</li>
+<li>{@code Callback2.onGetContentRect()} メソッドをオーバーライドして、ビューのコンテンツの {@link android.graphics.Rect} オブジェクト)テキスト選択の四角形など)の座標を指定します。
+</li>
+<li>四角形の位置が有効でなくなり、無効な要素がこれのみである場合は、{@code ActionMode.invalidateContentRect()} メソッドを呼び出します。
+</li>
+</ol>
+
+<p><a href="{@docRoot}tools/support-library/index.html">
+Android Support Library</a> revision 22.2 を使用している場合、フローティング ツール バーに下方互換性はなく、デフォルトで appcompat が代わりに {@link android.view.ActionMode} オブジェクトを制御することに注意してください。
+
+これにより、フローティング ツール バーは表示されなくなります。
+{@link android.support.v7.app.AppCompatActivity} で
+{@link android.view.ActionMode} がサポートされるようにするには、
+{@code android.support.v7.app.AppCompatActivity.getDelegate()} を呼び出して、返された
+{@link android.support.v7.app.AppCompatDelegate} オブジェクトで
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} を呼び出し、 入力パラメータを {@code false} に設定します。
+この呼び出して、{@link android.view.ActionMode} オブジェクトの制御がフレームワークに戻ります。
+M Preview を実行する端末ではフレームワークによる
+{@link android.support.v7.app.ActionBar} やフローティング ツール バー モードのサポートが可能ですが、M Preview 以前の端末では
+{@link android.support.v7.app.ActionBar} モードのみがサポートされます。</p>
+
+<h2 id="behavior-keystore">Android キーストロークの変更点</h2>
+<p>このプレビューでは、
+<a href="{@docRoot}training/articles/keystore.html">Android Keystore プロバイダ</a>による DSA のサポートがなくなります。
+ECDSA は引き続きサポートされます。</p>
+
+<p>停止時に暗号化を必要としないキーが、ロック画面の(ユーザーや端末の管理者などによる)無効時やリセット時に削除されなくなりました。
+停止時に暗号化を必要とするキーは、これらのイベント時に削除されます。
+</p>
+
+<h2 id="behavior-network">Wi-Fi とネットワークの変更点</h2>
+
+<p>このプレビューでは、Wi-Fi API とネットワーク API の動作に次のような変更点が追加されました。</p>
+<ul>
+<li>オブジェクトの作成者である場合のみ、アプリで{@link android.net.wifi.WifiConfiguration} オブジェクトの状態を変更できます。
+ユーザーや他のアプリによって作成された
+{@link android.net.wifi.WifiConfiguration} オブジェクトは変更、削除できません。
+</li>
+<li>
+以前は、
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} で
+{@code disableAllOthers=true} 設定を使ってアプリから端末を特定の Wi-Fi ネットワークに接続させた場合、端末はセルラー データなどの他のネットワークから切断されていました。
+このプレビューでは、端末が他のネットワークから切断されないようになりました。アプリの {@code targetSdkVersion} が {@code “20”} 以下の場合は、選択した Wi-Fi ネットワークに固定されます。
+
+アプリの {@code targetSdkVersion} が {@code “21”} 以上の場合は、マルチネットワーク API(
+{@link android.net.Network#openConnection(java.net.URL) openConnection()}メソッド、
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()}メソッド、新しい
+{@code ConnectivityManager.bindProcessToNetwork()} メソッドなど)を使用してネットワーク トラフィックが選択したネットワークに送られるようにします。
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">カメラ サービスの変更点</h2>
+<p>このプレビューでは、カメラ サービスの共有リソースへのアクセスモデルが、以前の "先着順" モデルから、"優先度順" に変更されました。
+
+この動作の変更には、次のようなものがあります。</p>
+<ul>
+<li>カメラ端末を開いて構成するなど、カメラのサブシステム リソースへのアクセスは、クライアント アプリケーション プロセスの "優先度" に基づいて与えられます。
+通常、ユーザーに表示されているアクティビティやフォアグラウンドにあるアクティビティのあるアプリケーション プロセスの優先度が最も高くなり、カメラ リソースの取得や使用の信頼性が高まります。
+
+</li>
+<li>優先度の低いアプリでアクティブなカメラ クライアントは、より優先度の高いアプリケーションがカメラを使おうとした際に使用が中断される場合があります。
+廃止された {@link android.hardware.Camera} API では、使用が中断されたクライアントに
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()} が呼び出されます。
+
+{@link android.hardware.camera2 Camera2} API では、使用が中断されたクライアントに
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()} が呼び出されます。
+</li>
+<li>適切なカメラ ハードウェア付きの端末では、別のアプリケーション プロセスを独立して開き、別のカメラ端末を同時に使用できます。
+ただし、同時アクセスによってパフォーマンスや開いているカメラ端末の性能が著しく低下するマルチプロセスの使用が検出可能になり、カメラ サービスでは許可されなくなりました。
+
+この変更によって、同じカメラ端末にアクセスしようとしているアプリが他になくても、優先度の低いクライアントによる使用が中断される場合があります。
+
+
+</li>
+<li>
+現在のユーザーを変更すると、アプリ内で前のユーザー アカウントで所有していたアクティブなカメラ クライアントが中断させられることになります。
+カメラへのアクセスは、現在の端末ユーザーが所有するユーザー プロファイルのみに制限されます。つまり、ユーザーが別のアカウントに切り替えた場合、"ゲスト" アカウントはカメラのサブシステムを使用するプロセスを実行したまま去ることはできません。
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">ART ランタイム</h2>
+<p>ART ランタイムで、
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} メソッドに対するアクセスルールを正常に実装できるようになりました。この変更によって、以前のバージョンで Dalvik がアクセス ルールを正しく確認できなかった問題が解決しました。アプリで
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} メソッドを使用していて、アクセス チェックをオーバーライドしたい場合は、 {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} メソッドを使って入力パラメータを {@code true} に設定します。
+
+
+
+
+アプリで
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat ライブラリ</a>や
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview ライブラリ</a>を使用する場合は、これらのライブラリの最新バージョンを使用するようアプリをアップデートする必要があります。
+アップデートしない場合は、XML から参照するカスタム クラスがアップデートされていて、クラス コンストラクタがアクセス可能であることを確認しておく必要があります。
+</p>
+
+<p>このプレビューでは、動的リンクの動作がアップデートされました。動的リンクでは、ライブラリの {@code soname} とそのパス(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
+public bug 6670</a>)の違いを認識でき、{@code soname} が実装されています。
+
+
+以前動作していたアプリで間違った {@code DT_NEEDED} エントリを持つもの(ビルドマシンのファイル システムの絶対パスなど)は、読み込み時に失敗する場合があります。
+</p>
+
+<p>{@code dlopen(3) RTLD_LOCAL} フラグは正常に実装されました。
+{@code RTLD_LOCAL} はデフォルトのため、
+{@code RTLD_LOCAL} を明示的に使用しない {@code dlopen(3)} への呼び出しは影響を受けます(アプリで明示的に {@code RTLD_GLOBAL} を使用している場合を除く)。
+{@code RTLD_LOCAL} では、後に
+{@code dlopen(3)} への呼び出しで読み込まれたライブラリで記号は使用できません({@code DT_NEEDED} エントリによって参照された場合とは逆)。</p>
+</p>
+
+<h2 id="behavior-apk-validation">APK の検証</h2>
+<p>プラットフォームでより厳しい APK の検証が行われるようになりました。APK がマニフェスト ファイルで宣言されているにもかかわらず、APK 自体に存在しない場合、その APK は破損しているとみなされます。
+コンテンツが一部でも削除された場合は、APK の再署名が必要になります。
+</p>
+
+<h2 id="behavior-afw">Android for Work の変更点</h2>
+<p>このプレビューには、次のような Android for Work に関する動作の変更点が含まれています。</p>
+<ul>
+<li><strong>個人のコンテキストでの仕事用の連絡先</strong>ユーザーが過去の通話履歴を表示したときに、Google Dialer
+Call Log に仕事用の連絡先が表示されるようになりました。{@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} を {@code true} に設定すると、Google Dialer Call Log に仕事用プロファイルの連絡先は表示されなくなります。
+
+{@code DevicePolicyManager.setBluetoothContactSharingDisabled()} を {@code false} に設定した場合のみ、Bluetooth 経由で端末に仕事用の連絡先と個人用の連絡先を表示できます。
+
+デフォルトでは、{@code true} に設定されています。
+
+</li>
+<li><strong>WiFi 設定の削除:</strong>プロファイル オーナーによって追加された WiFi 設定(@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()} メソッドへの呼び出しなどを介して)は、その仕事用プロファイルが削除されると同時に削除されます。
+
+</li>
+<li><strong>WiFi 設定のロック:</strong>アクティブなデバイス オーナーによって作成された WiFi 設定は、ユーザーが修正したり削除したりできなくなりました。
+ユーザーに {@link android.os.UserManager} 定数
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI} が設定されていない限り、ユーザー自身の WiFi 設定を作成、修正することはできます。
+</li>
+<li><strong>Google アカウントの追加経由での Work Policy Controller のダウンロード:</strong>Work Policy Controller(WPC)アプリ経由で管理する必要のある Google アカウントがマネージド コンテキスト外で端末に追加されると、アカウントの追加フローでユーザーに適切な WPC をインストールするよう要求します。この動作は、初期の端末のセットアップ ウィザードでの
+<strong>[設定]> [アカウント]</strong> で追加されるアカウントにも適用されます。
+
+
+</li>
+<li><strong>特定の DevicePolicyManager API の動作の変更点: </strong>
+{@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} メソッドの呼び出しは、呼び出し元のユーザーのカメラにのみ影響を与えます。マネージド プロファイルから呼び出した場合は、プライマリ ユーザーで実行しているカメラ アプリに影響はありません。
+
+さらに、
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} メソッドは、デバイス オーナーに加えてプロファイル オーナーでも利用可能になりました。
+プロファイル オーナーは、これらのキーガード制限を設定できます:
+
+<ul>
+<li>プロファイルの親ユーザーのキーガード設定に影響を与える {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} と {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}。
+
+</li>
+<li>マネージド プロファイルのアプリケーションで生成された通知のみに影響を与える {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}。
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/ja/preview/features/runtime-permissions.jd b/docs/html-intl/intl/ja/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..f582756
--- /dev/null
+++ b/docs/html-intl/intl/ja/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=パーミッション
+page.tags=previewresources, androidm
+page.keywords=パーミッション,実行時,プレビュー
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>クイックビュー</h2>
+ <ul>
+ <li>アプリのターゲットが M Preview SDK の場合、インストール時ではなく実行時に、パーミッションを付与するようユーザーに求めます。
+</li>
+ <li>ユーザーはいつでもアプリの [設定] 画面からパーミッションを取り消すことができます。
+</li>
+ <li>アプリは実行時に毎回、必要なパーミッションがあることを確認する必要があります。
+</li>
+ </ul>
+
+ <h2>本書の内容</h2>
+ <ol>
+ <li><a href="#overview">概要</a></li>
+ <li><a href="#coding">実行時のパーミッションのコード</a></li>
+ <li><a href="#testing">実行時のパーミッションをテストする</a></li>
+ <li><a href="#best-practices">ベスト プラクティス</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M Developer Preview では、アプリをインストールしてアップグレードするユーザーのプロセスを効率化する新しいアプリのパーミッション モデルが導入されました。
+M Preview で実行しているアプリで新しいパーミッション モデルがサポートされている場合、ユーザーはアプリをインストールまたはアップグレードするときにパーミッションを付与する必要はありません。その代わりに、アプリは必要になるとパーミッションを要求し、パーミッションを確認するよう求めるダイアログが表示されます。
+
+
+
+
+</p>
+
+<p>
+ アプリで新しいパーミッション モデルがサポートされている場合、以前のバージョンの Android を実行している端末で、以前のパーミッション モデルを使ってインストールして実行することもできます。
+
+
+</p>
+
+<h2 id="overview">
+ 概要
+</h2>
+
+<p>
+ M Developer Preview とともに、プラットフォームでは新しいアプリのパーミッション モデルが導入されました。
+この新しいモデルの主要なコンポーネントの概要を次に示します。
+</p>
+
+<ul>
+ <li>
+ <strong>パーミッションを宣言する:</strong> アプリは、以前の Android プラットフォームと同様に、マニフェストで必要なすべてのパーミッションを宣言します。
+
+ </li>
+
+ <li>
+ <strong>パーミッション グループ:</strong> パーミッションは、その機能に基づいて<em>パーミッション グループ</em>に分けられます。
+たとえば、<code>CONTACTS</code> パーミッション グループにはユーザーの連絡先とプロフィール情報を読み書きするパーミッションが含まれます。
+
+
+ </li>
+
+ <li>
+ <p><strong>インストール時に付与される制限付きのパーミッション:</strong> ユーザーがアプリをインストールまたはアップデートするとき、{@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} に該当する、アプリが要求するすべてのパーミッションがアプリに付与されます。
+
+
+ たとえば、目覚まし時計とインターネットのパーミッションは {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} に該当するため、インストール時に自動的にそれらのパーミッションが付与されます。
+
+ </p>
+
+ <p>システムは、<a href="#system-apps">システムアプリと署名のパーミッション</a>に記載のとおり、アプリの署名とシステムのパーミッションも付与することがあります。
+
+ユーザーは、インストール時にパーミッションを付与するように促すメッセージは表示<em>されません</em>。
+</p>
+ </li>
+
+ <li>
+ <strong>実行時にユーザーがパーミッションを付与する:</strong> アプリがパーミッションを要求すると、ユーザーにダイアログが表示されます。その後、アプリのコールバック関数を呼び出して、パーミッションが付与されているかどうかを知らせます。
+
+ユーザーがパーミッションを付与する場合、アプリ マニフェストで宣言されたパーミッションの機能領域にあるすべてのパーミッションがアプリに付与されます。
+
+
+ </li>
+
+</ul>
+
+<p>
+ このパーミッション モデルにより、パーミッションを要求する機能に対するアプリの動作方法が変わります。
+このモデルに合わせるために、従う必要のある開発プラクティスの概要を次に示します。
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>常にパーミッションを確認する:</strong> アプリがパーミッションを必要とするアクションを実行する必要があるとき、まずパーミッションが既にあるかどうかを確認する必要があります。
+
+パーミッションがない場合、そのパーミッションを付与するよう要求します。
+
+ </li>
+
+ <li>
+ <strong>パーミッションの不足をスムーズに処理する:</strong> アプリに適切なパーミッションが付与されていない場合、エラーが完全に処理される必要があります。
+
+ たとえば、追加機能に対してのみパーミッションが必要な場合、アプリはその機能を無効にできます。
+アプリが機能するためにパーミッションが必須である場合、アプリはすべての機能を無効にしてパーミッションを付与する必要があることをユーザーに知らせることがあります。
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>図 1.</strong>アプリの [設定] のパーミッション画面。
+ </p>
+ </div>
+
+ <li>
+ <strong>パーミッションは取り消し可能:</strong> ユーザーはいつでもアプリのパーミッションを取り消すことができます。
+アプリのパーミッションをオフにすると、アプリに通知<em>されません</em>。
+アプリは制限されたアクションを実行する前に、必要なパーミッションがあることを確認する必要があります。
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>注:</strong> アプリのターゲットが M Developer Preview の場合、新しいパーミッション モデルを使う<em>必要があります</em>。
+
+</p>
+
+<p>
+ M Developer Preview のローンチ時点では、すべての Google アプリで新しいパーミッション モデルが完全に実装されているわけではありません。
+Google はこれらのアプリを M Developer Preview 中にアップデートして、パーミッションの切り替え設定を完全に実装します。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong> アプリに独自の API サーフェスがある場合、まず呼び出し側にそのデータへのアクセスに必要なパーミッションがあることを確認しないままパーミッションをプロキシしないでください。
+
+
+</p>
+
+<h3 id="system-apps">
+ システムアプリと署名のパーミッション
+</h3>
+
+<p>
+ 本来、ユーザーがアプリをインストールするとき、システムはアプリに
+ {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL} のみを付与します。ただし、特定の環境では、アプリにより多くのパーミッションが付与されます。
+
+</p>
+
+<ul>
+ <li>アプリがシステム イメージの一部である場合、そのマニフェストにリストされているすべてのパーミッションが自動的に付与されます。
+
+ </li>
+
+ <li>アプリが {@link
+ android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} に該当するマニフェストでパーミッションを要求し、アプリがこれらのパーミッションを宣言したアプリと同じ証明書で署名される場合、要求しているアプリに対してこれらのパーミッションがインストール時に付与されます。
+
+
+
+ </li>
+</ul>
+
+<p>
+
+
+どちらの場合でも、ユーザーはシステムの [<strong>設定</strong>] 画面に移動して [<strong>アプリ</strong>] > <i>[app_name]</i> > [<strong>パーミッション</strong>] を選ぶと、いつでもパーミッションを取り消すことができます。アプリは実行時にパーミッションを継続して確認し、必要に応じて要求する必要があります。
+
+
+</p>
+
+<h3 id="compatibility">
+ 上方互換と下方互換
+</h3>
+
+<p>
+ アプリのターゲットが M Developer Preview 以外の場合、M Preview 端末でも以前のパーミッション モデルを引き続き使います。
+ユーザーがアプリをインストールするとき、ユーザーはアプリのマニフェストでリストされているすべてのパーミッションを付与するように要求されます。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong> M Developer Preview を実行している端末で、ユーザーはアプリの [設定] 画面から従来のアプリを含むすべてのアプリのパーミッションをオフにできます。
+
+従来のアプリに対してパーミッションをオフにすると、適切な機能がサイレント状態で無効になります。
+アプリがそのパーミッションを必要とする操作を実行しようとするとき、その操作によって必ずしも例外が発生するとは限りません。
+
+代わりに、空のデータセットを返す、エラーを示す、または予期しない動作を返すことがあります。
+たとえば、パーミッションなしでカレンダーを照会すると、メソッドは空のデータセットを返します。
+
+</p>
+
+<p>
+ M Preview を実行していない端末で新しいパーミッション モデルを使ってアプリをインストールする場合、他のすべてのアプリと同様に扱われ、インストール時に、すべての宣言されたパーミッションを付与するようユーザーに求めます。
+
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong> Preview リリースの場合、M Preview SDK に SDK の最小バージョンを設定して Preview SDK でコンパイルする必要があります。
+つまり、Developer Preview 中は従来のプラットフォームでそのようなアプリをテストできません。
+
+
+</p>
+
+<h3 id="perms-vs-intents">パーミッションとインテント</h3>
+
+<p>
+ 多くの場合、アプリがタスクを実行するには 2 つの方法から選択できます。
+アプリ自体が操作を実行するパーミッションを要求できます。
+アプリでインテントを使うようにして、別のアプリがそのタスクを実行するようにすることもできます。
+
+</p>
+
+<p>
+ たとえば、端末のカメラで写真を撮る機能がアプリに必要だとします。
+アプリは <code>android.permission.CAMERA</code> パーミッションをリクエストでき、それによりアプリが直接カメラにアクセスできるようになります。
+
+そのとき、アプリはカメラの API を使ってカメラを制御し、写真を撮ります。
+このアプローチにより、アプリが写真のプロセスを完全に制御し、カメラの UI をアプリに組み込むことができます。
+
+
+</p>
+
+<p>
+ ただし、そのような制御が不要な場合は、{@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} インテントを使うだけで画像を要求できます。
+インテントを開始すると、カメラアプリ(デフォルトのカメラアプリがない場合)を選んでアプリで写真を撮るよう求めるメッセージが表示されます。
+
+カメラアプリはアプリの {@link
+ android.app.Activity#onActivityResult onActivityResult()} メソッドに写真を返します。
+</p>
+
+<p>
+ 同様に、ユーザーの連絡先にアクセスするなどして電話をかける必要がある場合、適切なインテントを作成するか、パーミッションを要求して適切なオブジェクトに直接アクセスできます。
+
+各アプローチにはメリットとデメリットがあります。
+
+</p>
+
+<p>
+ パーミッションを使う場合:
+</p>
+
+<ul>
+ <li>操作を実行するとき、アプリによってユーザーの操作感が完全に制御されます。
+ただし、そのような幅広い制御により、適切な UI を設計する必要があるため、タスクが複雑化します。
+
+ </li>
+
+ <li>操作を初めて実行するときに、ユーザーに一度だけパーミッションの付与を求めるメッセージが表示されます。
+その後、アプリはユーザーからの介入は必要とせずに操作を実行できます。
+ただし、ユーザーがパーミッションを付与しない(または後でパーミッションを取り消す)場合、アプリは操作を一切実行できなくなります。
+
+
+ </li>
+</ul>
+
+<p>
+ インテントを使う場合:
+</p>
+
+<ul>
+ <li>操作用に UI を設計する必要はありません。インテントを処理するアプリでは UI が提供されますが、これはユーザーの操作感を制御できないことを意味します。
+
+ユーザーはこれまでに見たことのないアプリと相互操作することになります。
+
+ </li>
+
+ <li>操作に対してデフォルトのアプリを持たないユーザーの場合、ユーザーにアプリの選択を求めるメッセージが表示されます。ユーザーがデフォルトのハンドラを指定しない場合、操作のたびに別のダイアログで指定する必要があることがあります。
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">実行時のパーミッションのコード</h2>
+
+<p>
+ アプリのターゲットが新しい M Developer Preview の場合、新しいパーミッション モデルを使う必要があります。
+つまり、マニフェストで必要なパーミッションを宣言する他に、実行時にパーミッションがあることを確認し、まだパーミッションがない場合にはパーミッションを要求します。
+
+
+
+</p>
+
+<h3 id="enabling">
+ 新しいパーミッション モデルを有効にする
+</h3>
+
+<p>
+ 新しい M Developer Preview パーミッション モデルを有効にするには、アプリの <code>targetSdkVersion</code> 属性を <code>"MNC"</code> に、<code>compileSdkVersion</code> を <code>"android-MNC"</code> に設定します。
+
+このように設定することで、新しいパーミッション機能すべてが有効になります。
+
+</p>
+
+<p>
+ Preview リリースの場合、<code>minSdkVersion</code> を <code>"MNC"</code> に設定して Preview SDK でコンパイルする必要があります。
+
+</p>
+
+<h3 id="m-only-perm">
+ M Preview のみに対するパーミッションの設計
+</h3>
+
+<p>
+ アプリ マニフェストで新しい <code><uses-permission-sdk-m></code> 要素を使って、M Developer Preview のみで必要なパーミッションを表示できます。
+このようにしてパーミッションを宣言すると、アプリを以前の端末にインストールする場合はユーザーにメッセージが表示されないか、アプリにパーミッションが付与されません。<code><uses-permission-sdk-m></code> 要素を使うと、新しいパーミッションを追加してインストールをアップデートするときにパーミッションの付与を強制せずにアプリのバージョンがアップデートされます。
+
+
+
+
+
+
+</p>
+
+<p>
+ M Developer Preview を使ってアプリが端末で実行されている場合、<code><uses-permission-sdk-m></code> は <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code> と同じように動作します。
+
+
+ アプリをインストールするとき、パーミッションの付与を求めるメッセージは表示されず、アプリは必要なときにパーミッションを要求します。
+
+</p>
+
+<h3 id="prompting">
+ パーミッションについてのダイアログを表示する
+</h3>
+
+<p>
+ アプリで新しい M Developer Preview パーミッション モデルが使われている場合、M Preview を実行している端末でアプリを初めて起動するとき、すべての権限を付与する必要はありません。
+
+その代わりに、アプリは必要なときにパーミッションを要求します。
+アプリがパーミッションを要求すると、ユーザーにダイアログが表示されます。
+
+</p>
+
+<p>
+ SDK 22 以降がインストールされた端末でアプリを実行する場合、アプリでは以前のパーミッション モデルが使われます。
+ユーザーがアプリをインストールすると、アプリがそのマニフェストで要求するすべてのパーミッションの付与を求めるメッセージが表示されます。ただし、<code><uses-permission-sdk-m></code> というラベルの付いたパーミッションは例外です。
+
+
+</p>
+
+<h4 id="check-platform">アプリが実行されているプラットフォームを確認する</h4>
+
+<p>
+ このパーミッション モデルは、M Developer Preview を実行している端末でのみサポートされます。
+これらのメソッドのいずれかを呼び出す前に、アプリは {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME} の値を確認してどのプラットフォーム上で実行されているのかを確認する必要があります。
+
+端末で M Developer Preview が実行されている場合、{@link android.os.Build.VERSION#CODENAME CODENAME} は <code>"MNC"</code> です。
+
+</p>
+
+<h4 id="check-for-permission">アプリに必要なパーミッションがあるかどうかを確認する</h4>
+
+<p>ユーザーがパーミッションを要求する動作を行うと、アプリは現在この操作を実行するためのパーミッションがあるかどうかを確認します。
+
+
+確認するために、アプリは <code>Context.checkSelfPermission(<i>permission_name</i>)</code> を呼び出します。ユーザーが既にパーミッションを付与していることをアプリが認識している場合でも、ユーザーはいつでもアプリのパーミッションを取り消すことができるため、この確認が行われます。
+
+
+たとえば、ユーザーがアプリを使って写真を撮る場合、アプリは <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code> を呼び出します。
+
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>表 1.</strong>パーミッションとパーミッション グループ。</p>
+<table>
+ <tr>
+ <th scope="col">パーミッション グループ</th>
+ <th scope="col">パーミッション</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">必要に応じてパーミッションを要求する</h4>
+
+<p>アプリに必要なパーミッションがない場合、アプリは <code>Activity.requestPermissions(String[], int)</code> メソッドを呼び出して適切なパーミッションを要求します。
+
+アプリは必要なパーミッションと整数の「要求コード」を渡します。
+
+ このメソッドは非同期に機能します。このメソッドはすぐに返され、ユーザーがダイアログ ボックスに応答した後、システムはその結果と一緒にアプリのコールバック メソッドを呼び出し、アプリが <code>requestPermissions()</code> に渡すのと同じ「要求コード」を渡します。
+
+
+</p>
+
+ <p>次のコードは、ユーザーの連絡先を読み込むパーミッションがアプリにあることを確認し、必要に応じてパーミッションを要求します。
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">パーミッションの要求への応答を処理する</h4>
+
+<p>
+ アプリがパーミッションを要求すると、システムによってダイアログ ボックスが表示されます。
+ユーザーが応答すると、システムはアプリの <code>Activity.onRequestPermissionsResult(int, String[], int[])</code> を呼び出し、ユーザーの応答を渡します。
+
+アプリはそのメソッドをオーバーライドする必要があります。コールバックには開発者が <code>requestPermissions()</code> に渡したのと同じ要求コードが渡されます。
+
+たとえばアプリが <code>READ_CONTACTS</code> アクセスを要求する場合、次のコールバック メソッドが含まれる可能性があります。
+
+
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>ユーザーがパーミッションを付与すると、システムは、機能領域のアプリ マニフェストがリストするすべてのパーミッションを付与します。
+ユーザーが要求を拒否する場合は、適切なアクションを取ってください。
+たとえば、このパーミッションに応じて、すべてのメニュー アクションを無効にできます。
+
+ </li>
+</p>
+
+<p>
+ ユーザーにパーミッションの付与を確認するとき、ユーザーにそのパーミッションについて再度確認しないようにするオプションがあります。
+この場合、アプリが <code>requestPermissions()</code> を使ってパーミッションを確認すると、システムはその要求をすぐに拒否します。
+
+この場合、システムはユーザーが要求を再度明示的に拒否する場合と同様に <code>onRequestPermissionsResult()</code> を呼び出します。
+
+このため、アプリではユーザーとの直接的なやり取りが発生することが想定されません。
+
+</p>
+
+<h2 id="testing">実行時のパーミッションをテストする</h2>
+
+
+<p>
+ アプリのターゲットが M Developer Preview の場合、パーミッションが正しく処理されることをテストする必要があります。
+アプリ起動時に特定のパーミッションがアプリにあることは想定できません。
+アプリが初めて起動されるとき、パーミッションがない可能性が高く、ユーザーはいつでもパーミッションを取り消すまたは復元できます。
+
+
+</p>
+
+<p>
+ アプリがすべてのパーミッションの状況下で確実に正しく動作することをテストしてください。
+M Preview SDK とともに、新しい <a href="{@docRoot}tools/help/adb.html">Android デバッグ ブリッジ(adb)</a>コマンドが導入され、試す必要のあるあらゆるパーミッション設定でアプリをテストできます。
+
+
+
+</p>
+
+<h3>
+ 新しい adb コマンドとオプション
+</h3>
+
+<p>
+ M Preview SDK Platform-tools では、アプリがパーミッションをどう処理するかをテストするための、いくつかの新しいコマンドが導入されました
+
+</p>
+
+<h4>
+ パーミッション付きでインストールする
+</h4>
+
+<p>
+ <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a> コマンドの新しい <code>-g</code> オプションを使ってアプリをインストールし、そのマニフェストにリストされるすべてのパーミッションを付与できます。
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ パーミッションの付与と取り消し
+</h4>
+
+<p>
+ 新しい ADB <a href="{@docRoot}tools/help/adb.html#pm">Package Manager(pm)</a>コマンドを使って、インストールされているアプリにパーミッションを付与したり取り消したりできます。この機能は自動化されたテストに役立ちます。
+
+
+</p>
+
+<p>
+ パーミッションを付与するには、Package Manager の <code>grant</code> コマンドを使います。
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ たとえば、com.example.myapp パッケージ パーミッションを付与してオーディオを録音するには、このコマンドを使います。
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ パーミッションを取り消すには、Package Manager の <code>revoke</code> コマンドを使います。
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">ベスト プラクティス</h2>
+
+<p>
+ 新しいパーミッション モデルにより、ユーザーはよりスムーズな操作感を得られ、アプリを簡単にインストールできるようになり、アプリが実行している内容に満足します。
+
+新しいモデルを最大限に活用するために、次のベスト プラクティスをお勧めします。
+
+</p>
+
+
+<h3 id="bp-what-you-need">必要なパーミッションのみを要求する</h3>
+
+<p>
+ パーミッションを要求するたびに、ユーザーに決定するよう強制します。
+ ユーザーが要求を却下すると、アプリの機能が低下します。
+ これらの要求回数は最小限にしてください。
+</p>
+
+<p>
+ たとえば、アプリがパーミッションを要求する代わりに、<a href="{@docRoot}guide/components/intents-filters.html">インテント</a>を使って必要な機能を取得できる場合がよくあります。
+
+アプリが携帯電話のカメラで写真を撮る必要がある場合、そのアプリでは {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE} インテントを使用できます。
+アプリがインテントを実行すると、写真を撮るためのインストール済みのカメラアプリを選ぶようユーザーに促します。
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ ユーザーを疲れさせない
+</h3>
+
+<p>
+ ユーザーにパーミッションをたくさん要求すると、ユーザーを疲れさせてしまい、アプリが終了される原因になります。代わりに、ユーザーには必要なパーミッションのみを要求してください。
+
+
+</p>
+
+<p>
+ アプリ対して 1 つ以上のパーミッションが必須である場合もあります。その場合は、アプリの起動後すぐに、すべてのパーミッションを要求することが合理的である場合があります。
+
+たとえば、カメラアプリを作成する場合、アプリは端末のカメラにアクセスする必要があります。
+アプリを初めて起動するときにカメラの使用についてのパーミッションを求められても驚かないはずです。
+
+ただし、同じアプリにユーザーの連絡先と写真を共有する機能もある場合は、最初の起動時にパーミッションを要求<em>しない</em>方が無難です。
+
+その代わりに、ユーザーが「共有」機能を使うまで待ち、そのときにパーミッションを要求します。
+
+</p>
+
+<p>
+ アプリにチュートリアルが含まれる場合は、チュートリアルのシーケンスの最後で、アプリに必須のパーミッションを要求する方が合理的です。
+
+</p>
+
+<h3 id="bp-explain">
+ パーミッションが必要な理由を説明する
+</h3>
+
+<p>
+ <code>requestPermissions()</code> を呼び出すとき、システムによって表示されるパーミッション ダイアログにはアプリが必要としているパーミッションは表示されますが、理由は表示されません。
+
+これによりユーザーが困惑する場合もあります。
+ <code>requestPermissions()</code> を呼び出す前に、アプリがパーミッションを必要としている理由をユーザーに説明するのはよい方法です。
+
+</p>
+
+<p>
+ たとえば、カメラアプリでは、位置情報サービスを使って写真に位置情報タグを付けられるようにする場合があります。
+通常のユーザーは、写真に位置情報が含まれる場合があることを認識していない可能性があり、なぜカメラアプリで位置情報が必要なのか困惑する可能性があります。
+
+この場合、アプリが <code>requestPermissions()</code> を呼び出す<em>前</em>に、この機能についてユーザーに知らせることをお勧めします。
+
+
+</p>
+
+<p>
+ その方法として、これらの要求をアプリのチュートリアルに組み込むこともできます。チュートリアルでは、アプリの各機能を順番に表示できるので、必要なパーミッションを説明できます。
+
+たとえば、カメラアプリのチュートリアルでは、「連絡先と写真を共有する」機能について説明し、ユーザーの連絡先を参照するためにアプリにパーミッションが必要であることをユーザーに知らせることができます。
+
+
+その後、アプリは <code>requestPermissions()</code> を呼び出して、ユーザーにそのアクセスを求めることができます。
+もちろん、すべてのユーザーがチュートリアルに従うわけではないため、アプリの通常操作中にパーミッションを確認して要求することも必要です。
+
+
+</p>
diff --git a/docs/html-intl/intl/ja/preview/overview.jd b/docs/html-intl/intl/ja/preview/overview.jd
new file mode 100644
index 0000000..4cefdd1
--- /dev/null
+++ b/docs/html-intl/intl/ja/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=プログラム概要
+page.metaDescription=Android M Developer Preview では、Android の次のバージョンでアプリをテストして最適化するためのすべてを備えています。
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ <strong>Android M Developer Preview</strong> では、Android の次のバージョンでアプリをテストして最適化するためのすべてを備えています。
+
+M Developer Preview ツールをダウンロードするだけで、無料ですぐにご利用いただけます。
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ ハードウェアとエミュレータのシステム イメージ
+ </h5>
+
+ <p>
+ Nexus 5、6、9、Nexus Player(TV 向け)やエミュレータでアプリをテストしましょう。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 最新プラットフォーム コード
+ </h5>
+
+ <p>
+ プレビューで複数のアップデートが提供されますので、最新プラットフォームの変更に応じてテストできます。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ OTA でのアップデート
+ </h5>
+
+ <p>
+ デバイスに初期プレビューをコピーしたら、無線経由でアップデートを入手できます。
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ 新しい動作と機能
+ </h5>
+
+ <p>
+ 新しい実行時パーミッション モデルや省電力機能など、新しいプラットフォームの動作をあらかじめサポートする
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 開発者が報告した問題に対する優先度ウィンドウ
+ </h5>
+
+ <p>
+ 最初の数週間で開発者から報告のあった問題について優先度を設定し、可能な限り早くテストを行いフィードバックを提供できるようにします。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ フィードバックとサポート
+ </h5>
+
+ <p>
+ <a href="https://code.google.com/p/android-developer-preview/">Issue Tracker</a> で問題を報告し、フィードバックをお送りください。
+ <a href="http://g.co/dev/AndroidMDevPreview">M Developer コミュニティ</a> で他の開発者とつながりましょう。
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ タイムラインとアップデート
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M Developer Preview は 5 月 28 日から最終の Android M SDK まで実行されます。Android M SDK はまもなく、2015 年第三四半期に予定されている正式公開の前にリリースされます。
+
+
+</p>
+
+<p>
+ 開発の主なマイルストーンごとにテスト端末へアップデートを配信する予定としています。
+ 暫定マイルストーンは以下のとおりです。
+</p>
+
+<ul>
+ <li>
+ <strong>Preview 1</strong>(初期プレビュー リリース、5 月下旬)
+ </li>
+
+ <li>
+ <strong>Preview 2</strong>(6 月下旬/7 月上旬)
+ </li>
+
+ <li>
+ <strong>Preview 3</strong>(最終近く、7 月下旬)
+ </li>
+</ul>
+
+<p>
+ アップデートは第三四半期後半に予定されている<strong>最終 SDK</strong> で終了します。最終版では新しい Android に対する正式な API や最終的なシステム動作や機能が提供されます。
+
+
+</p>
+
+<p>
+ Android M でのテストや開発に際しては、Preview アップデートがリリースされるたびに<strong>開発環境を最新に保つ</strong>ことを強くお勧めします。
+
+ プロセスをより容易にするため、既に Preview ビルドがインストールされた端末に<strong>無線経由でアップデート(OTA)</strong>を配信します。また手動でダウンロードして展開できるシステム イメージもご提供します。
+
+
+</p>
+<p class="note">
+ <strong>注:</strong> 最終 SDK とシステム イメージは OTA では配信できません。代わりにテスト端末に<strong>手動でコピー</strong>する必要があります。</strong>
+
+
+</p>
+
+<p>
+ Preview アップデートをご利用いただけるようになった際は <a href="http://android-developers.blogspot.com/">Android デベロッパー ブログ</a>、このサイト、<a href="http://g.co/dev/AndroidMDevPreview">Android M デベロッパー コミュニティ</a>でお知らせします。
+
+
+</p>
+
+<h2 id="preview_tools">
+ Preview の内容
+</h2>
+
+<p>
+ M Developer Preview では、ご利用のアプリをさまざまな画面サイズ、ネットワーク、テクノロジー、CPU や GPU チップセット、ハードウェア設計でテストするために必要なあらゆるものを備えています。
+
+
+</p>
+
+<h4>
+ SDK ツール
+</h4>
+
+<p>
+ 各コンポーネントは <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> の SDK Manager でダウンロードできます。
+</p>
+
+<ul>
+ <li>M Developer Preview <strong>SDK ツール</strong>
+ </li>
+
+ <li>M Developer Preview <strong>エミュレータ システム イメージ</strong>(32 ビット版と 64 ビット版)
+
+ </li>
+
+ <li>M Developer Preview <strong>Android TV 版エミュレータ システム イメージ</strong>(32 ビット版)
+
+ </li>
+</ul>
+
+<h4>
+ ハードウェアのシステム イメージ
+</h4>
+
+<p>
+ Nexus 端末向けハードウェア システム イメージは、<a href="download.html">ダウンロード ページ</a>からダウンロードできます。
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong>(GSM と LTE)“hammerhead” 端末システム イメージ
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> “shamu” 端末システム イメージ
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong>(Wi-Fi)“volantis” 端末システム イメージ
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong>(AndroidTV)“fugu” 端末システム イメージ
+ </li>
+</ul>
+
+<h4>
+ ドキュメントとサンプル コード
+</h4>
+
+<p>
+ 次のドキュメント リソースで Preview についての詳細をご確認いただけます。
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">SDK のセットアップ</a>では、はじめの手順をステップ バイ ステップでご説明しています。
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">Testing Guide</a> と <a href="behavior-changes.html">Behavior Changes</a> では、テストでカバーされる主な分野について示しています。
+ </li>
+
+ <li>新しい API のドキュメントである <a href="api-overview.html">API 概要</a>、ダウンロード可能な <a href="{@docRoot}preview/download.html#docs">API リファレンス</a>や、主な機能のデベロッパー ガイドである<a href="{@docRoot}preview/features/runtime-permissions.html">パーミッション</a>、<a href="{@docRoot}preview/backup/index.html">アプリのバックアップ</a>などをご提供しています。
+
+
+
+
+ </li>
+
+ <li>
+ パーミッションや他の新しい機能をサポートする方法について、<a href="{@docRoot}preview/samples.html">サンプル コード</a>でお試しいただけます。
+
+ </li>
+
+ <li>
+ 現行バージョンの<a href="{@docRoot}preview/support.html#release-notes">リリース ノート</a>で M Developer Preview の変更メモや差分レポートなどをご覧いただけます。
+
+ </li>
+</ul>
+
+<h4>
+ サポート リソース
+</h4>
+
+<p>
+ M Developer Preview でのテストや開発について、次のサポート リソースをご確認いただけます。
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">M Developer Preview Issue Tracker</a> は、<strong>主なフィードバック チャンネル</strong>としてご利用になれます。
+
+バグやパフォーマンスの問題、一般的なフィードバックなど Issue Tracker からご連絡いただけます。
+また、<a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">既知の問題</a>
+やその回避策をご確認いただけます。
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M Developer コミュニティ</a>は Google+ のコミュニティで、Android M を使っている<strong>他のデベロッパーとつながる</strong>ことができます。Android M に関する現象や考えを共有したり、疑問点を解消したりできます。
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ 対象、プレビュー API、公開
+</h2>
+
+<p>
+ Android M Developer Preview は開発リリースのみであり、<strong>標準 API レベルはありません</strong>。
+アプリのテストで互換性の問題は除外する場合(強く推奨します)、アプリの<code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code> を <code>“MNC”</code> に設定することで M Developer Preview を対象にできます。
+
+
+
+</p>
+
+<p>
+ Android M Developer Preview では<strong>プレビュー API</strong> を配信しています。現在 2015 年度第三四半期に予定されている最終 SDK がリリースされるまで、API は正式版ではありません。
+
+つまり、時間がたつにつれて <strong>API の細かな変更</strong>が見込まれます(特にプログラムの最初の数週間)。
+
+Android M Developer Preview でアップデートがあればその都度変更の概要をご提供します。
+
+</p>
+
+<p class="note">
+ プレビュー API は変更される可能性がありますが、実行時パーミッションや省電力機能などのシステムの基幹にかかわる機能には変更はありませんので、すぐにテストしていただけます。
+
+
+</p>
+
+<p>
+ 公開に関して、Google Play では <strong>M Developer Preview 対象アプリは公開できません</strong>。
+Android M 最終 SDK が利用可能になれば正式な Android M API レベルを対象にして、Google Play でアプリを公開できるようになります。
+
+それまでは、Android M 対象のアプリをテスターに配布する場合は電子メールで送付したりご自分のサイトから直接ダウンロードしてもらったりしてください。
+
+
+</p>
+
+<h2 id="get_started">
+ 開始するには
+</h2>
+
+<p>
+ アプリのテストをはじめるには:
+</p>
+
+<ol>
+ <li><a href="{@docRoot}preview/api-overview.html">API 概要</a>や <a href="{@docRoot}preview/behavior-changes.html">Behavior Changes</a> で新しい機能やご自分のアプリへの影響についてご確認ください。
+
+特に、<a href="{@docRoot}preview/features/runtime-permissions.html">実行時パーミッション</a> モデルや省電力機能、自動バックアップ機能についてお確かめください。
+
+
+ </li>
+
+ <li><a href="{@docRoot}preview/setup-sdk.html">Setting up the Preview SDK</a> の手順に従い、ご利用の環境をセットアップしてテスト端末を構成してください。
+
+
+ </li>
+
+ <li><a href="https://developers.google.com/android/nexus/images">コピー手順</a>に従い、最新の M Developer Preview システム イメージを Nexus 5、6、9、Nexus Player にコピーします。
+
+1 度開発端末に Preview 環境をコピーすると、アップデートが無線経由(OTA)で配信されます。</a>
+
+ </li>
+
+ <li><a href="{@docRoot}preview/download.html#docs">M Preview API リファレンス</a>や<a href="{@docRoot}preview/samples.html">M Preview サンプル</a>をダウンロードして、新しい API の機能についてさらに学び、ご自分のアプリで活用する方法についてご確認ください。
+
+
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M Developer コミュニティ</a>に参加して最新のニュースを入手し、Preview に取り組んでいる他のデベロッパーとつながってください。
+
+
+ </li>
+</ol>
+
+<p>
+ Android M Developer Preview プログラムへのご参加ありがとうございます。
+</p>
diff --git a/docs/html-intl/intl/ko/preview/api-overview.jd b/docs/html-intl/intl/ko/preview/api-overview.jd
new file mode 100644
index 0000000..aac9a44
--- /dev/null
+++ b/docs/html-intl/intl/ko/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=API 개요
+page.keywords=미리 보기, SDK, 호환성
+page.tags=previewresources, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>이 문서의 내용
+ <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">더 보기</span>
+ <span class="less" style="display:none">숨기기</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">앱 연결</a></li>
+ <li><a href="#backup">앱용 자동 백업</a></li>
+ <li><a href="#authentication">인증</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">지문 인증</a></li>
+ <li><a href="#confirm-credential">확인 자격 증명</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">직접 공유</a></li>
+ <li><a href="#voice-interactions">음성 상호작용</a></li>
+ <li><a href="#assist">지원 API</a></li>
+ <li><a href="#notifications">알림</a></li>
+ <li><a href="#bluetooth-stylus">블루투스 스타일러스 지원</a></li>
+ <li><a href="#ble-scanning">블루투스 저전력 스캔 개선</a></li>
+ <li><a href="#hotspot">핫스팟 2.0 릴리스 1 지원</a></li>
+ <li><a href="#4K-display">4K 디스플레이 모드</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">테마 지정 가능 ColorStateLists</a></li>
+ <li><a href="#audio">오디오 기능</a></li>
+ <li><a href="#video">비디오 기능</a></li>
+ <li><a href="#camera">카메라 기능</a>
+ <ol>
+ <li><a href="#flashlight">Flashlight API</a></li>
+ <li><a href="#reprocessing">카메라 재처리</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Android for Work 기능</a></li>
+</ol>
+
+<h2>API 차이점</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">M 미리 보기에 대한 API 레벨 22 »</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 개발자 미리 보기에서는 다가오는 Android 플랫폼 릴리스를 미리 볼 수 있도록 하였습니다. 이 릴리스는 사용자와 앱 개발자를 위한 여러 가지 새 기능을 제공합니다.
+
+ 이 문서에서는 가장 중요한 API를 몇 가지 소개합니다.</p>
+
+<p>M 개발자 미리 보기는 <strong>개발자 얼리 어답터</strong>와 <strong>테스터</strong>를 위해 마련된 것입니다.
+ Android 프레임워크가 나아갈 방향에 영향을 미치는 데 관심이 있으시다면, <a href="{@docRoot}preview/setup-sdk.html">M 개발자 미리 보기를 시도해 보시고</a> 피드백을 보내주세요!
+
+
+</p>
+
+<p class="caution"><strong>주의:</strong> M 개발자 미리 보기를 사용하는 앱을 Google Play 스토어에 게시하지 마세요.
+</p>
+
+<p class="note"><strong>참고:</strong> 이 문서에서 종종 언급하는 클래스와 메서드 중에는 아직 <a href="{@docRoot}">developer.android.com</a>에서 참조 자료로 이용할 수 없는 것도 있습니다.
+ 이와 같은 API 요소는 이 문서에서 {@code code style}로 형식 지정되어 있습니다(하이퍼링크 없이).
+ 이러한 요소에 대한 임시 API 관련 문서가 필요한 경우, <a href="{@docRoot}preview/download.html#docs">미리 보기 참조</a>를 다운로드하세요.
+</p>
+
+<h3>중요한 동작 변경</h3>
+
+<p>이전에 Android용 앱을 게시한 적이 있는 경우, 플랫폼 변경으로 인해 앱이 영향받을 수 있다는 점을 유의하세요.
+</p>
+
+<p>완전한 정보는 <a href="behavior-changes.html">동작 변경</a>을 참조하세요.</p>
+
+<h2 id="app-linking">앱 연결</h2>
+<p>이 미리 보기는 더욱 강력한 앱 연결을 제공하여 Android의 인텐트 시스템을 한층 강화합니다. 이 기능을 사용하면 앱을 본인이 소유한 웹 도메인과 연관시킬 수 있습니다.
+ 플랫폼은 이 연관 관계를 근거로 특정한 웹 링크를 처리하는 데 사용할 기본 앱을 결정할 수 있고 사용자에게 앱을 선택하라는 메시지를 건너뛸 수 있습니다. 이 기능을 구현하는 방법을 알아보려면 <a href="{@docRoot}preview/features/app-linking.html">앱 연결</a>을 참조하세요.
+
+
+
+
+<h2 id="backup">앱용 자동 백업</h2>
+<p>시스템에서 이제 앱에 대한 완전한 데이터 백업과 복원을 자동으로 수행합니다. 이 동작은 앱 대상 지정 M 미리 보기에 대한 기본으로 활성화되며, 추가 코드를 전혀 추가하지 않아도 됩니다.
+ 사용자가 Google 계정을 삭제하면 계정의 백업 데이터도 함께 삭제됩니다.
+ 이 기능의 작동 원리와 파일 시스템에서 백업 내용 구성하는 방법에 대해 알아보려면 <a href="{@docRoot}preview/backup/index.html">앱용 자동 백업</a>을 참조하세요.
+
+</p>
+
+<h2 id="authentication">인증</h2>
+<p>이 미리 보기에서는 사용자를 인증할 때 지원되는 기기에서 지문 스캔을 사용하도록 해주는 새로운 API를 제공합니다. 또한 기기 잠금 해제 메커니즘(예: 화면 잠금 비밀번호)을 사용해 사용자의 마지막 인증 시간을 확인할 수도 있습니다.
+
+ 이러한 API는 <a href="{@docRoot}training/articles/keystore.html">Android Keystore 시스템</a>과 함께 사용하세요.
+</p>
+
+<h3 id="fingerprint-authentication">지문 인증</h3>
+
+<p>지문 스캔을 통해 사용자를 인증하려면 새로운 {@code android.hardware.fingerprint.FingerprintManager} 클래스의 인스턴스를 가져와 {@code FingerprintManager.authenticate()} 메서드를 호출하세요.
+
+ 앱이 지문 센서가 있는 호환되는 기기에서 실행되고 있어야 합니다.
+ 지문 인증 흐름에 대한 사용자 인터페이스를 앱에 구현해야 하며, UI에 표준 Android 지문 아이콘을 사용해야 합니다. 이 Android 지문 아이콘({@code c_fp_40px.png})은 <a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">샘플 앱</a>에 포함되어 있습니다. 지문 인증을 사용하는 앱을 여러 개 개발하는 경우, 각 앱이 사용자의 지문을 따로따로 인증해야 한다는 사실을 명심하세요.
+
+
+
+
+</p>
+
+<p>앱에서 이 기능을 사용하려면 우선 매니페스트에 {@code USE_FINGERPRINT} 권한을 추가해야 합니다.
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>지문 인증의 앱 구현을 확인하려면, <a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">지문 대화 샘플</a>을 참조하세요.
+
+</p>
+
+<p>이 기능을 테스트하는 경우, 다음 단계를 따르면 됩니다.</p>
+<ol>
+<li>아직 Android SDK 도구 수정 버전 24.3을 설치합니다(설치하지 않은 경우).</li>
+<li>에뮬레이터에 새 지문을 등록하려면 <strong>설정 > 보안 > 지문</strong>으로 이동한 다음, 등록 지침을 따르면 됩니다.
+</li>
+<li>에뮬레이터를 사용하여 지문 터치 이벤트를 에뮬레이트하되 다음 명령을 사용하세요.
+ 잠금 화면이나 앱에서 지문 터치 이벤트를 에뮬레이트할 때에도 같은 명령을 사용합니다.
+
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>Windows에서는 {@code telnet 127.0.0.1 <emulator-id>}에 뒤이어 {@code finger touch <finger_id>}를 실행해야 할 수도 있습니다.
+
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">확인 자격 증명</h3>
+<p>앱에서 사용자를 인증할 때 해당 사용자가 기기를 마지막으로 잠금 해제한 시간을 근거로 할 수 있습니다. 이 기능을 사용하면 사용자가 앱에 따라 각기 다른 비밀번호를 기억할 필요가 없어지고, 개발자는 자신만의 인증 사용자 인터페이스를 구현하지 않아도 됩니다.
+
+ 앱에서 이 기능을 사용하려면 사용자 인증에 대한 공개 또는 비밀 키 구현과 함께 사용해야 합니다.
+</p>
+
+<p>사용자를 성공적으로 인증한 다음 같은 키를 재사용하기 위한 시간 초과 기간을 설정하려면, 새로운 {@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()} 메서드를 호출하세요. {@link javax.crypto.KeyGenerator} 또는 {@link java.security.KeyPairGenerator}를 설정할 때 사용하면 됩니다.
+
+
+
+ 현재 이 기능은 대칭형 암호화 작동에 맞게 작동합니다.
+</p>
+
+<p>재인증 대화창을 과도하게 표시하는 것을 삼가세요. 우선 앱에서 암호화 객체 사용을 시도해보고, 제한 시간이 만료되면 {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} 메서드를 사용해 앱 내에서 해당 사용자를 재인증하면 됩니다.
+
+
+
+</p>
+
+<p>이 기능의 앱 구현을 확인하려면, <a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">확인 자격 증명 샘플</a>를 참조하세요.
+
+</p>
+
+<h2 id="direct-share">직접 공유</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>이 미리 보기에서는 사용자가 공유 기능을 간편하고 신속하게 이용할 수 있도록 해주는 API를 제공합니다. 이제 앱에서 특정 액티비티를 시작하는 <em>직접 공유 대상</em>을 정의할 수 있습니다. 이와 같은 직접 공유 대상은 <em>공유</em> 메뉴를 통해 사용자에게 노출됩니다.
+
+ 이 기능을 사용하면 사용자가 다른 앱 내의 대상(예: 연락처)에 대해 콘텐츠를 공유할 수 있습니다.
+ 예를 들어, 직접 공유 대상이 다른 소셜 네트워크 앱에서 액티비티를 시작하면 사용자가 해당 앱에 있는 특정 친구나 커뮤니티와 콘텐츠를 공유할 수 있습니다.
+
+</p>
+
+<p>직접 공유 대상을 활성화하려면 반드시 {@code android.service.}
+ <br>
+{@code chooser.ChooserTargetService} 클래스를 확장하는 클래스를 정의해야 합니다. 매니페스트에서 {@code ChooserTargetService}를 선언하고
+ 해당 선언 내에서 {@code BIND_CHOOSER_TARGET_SERVICE} 권한을 지정하고 {@code SERVICE_INTERFACE} 작업으로 인텐트 필터를 지정합니다.
+
+</p>
+<p>다음 예는 매니페스트에서 {@code ChooserTargetService}를 선언할 수 있는 방법입니다.
+</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>{@code ChooserTargetService}에 노출하고자 하는 액티비티마다 {@code <meta-data>} 요소를 하나씩 추가하고, 앱 매니페스트에 {@code "android.service.chooser.chooser_target_service"} 이름을 추가합니다.
+
+
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">음성 상호작용</h2>
+<p>
+이 미리 보기에서 제공하는 새로운 음성 상호작용 API는 <a href="https://developers.google.com/voice-actions/" class="external-link">음성 액션</a>과 같이 앱에 대화형 음성 환경을 구축할 수 있도록 합니다.
+
+ {@code android.app.Activity.isVoiceInteraction()} 메서드를 호출하여 액티비티가 음성 액션에 대응하여 시작된 것인지 알아보세요.
+
+ 이 경우에 해당되면, 앱이 {@code android.app.VoiceInteractor} 클래스를 사용하여 사용자로부터 음성 확인을 요청하거나, 선택 항목 목록에서 선택하게 하는 등 여러 가지 일을 할 수 있습니다.
+
+ 음성 액션 구현에 대한 자세한 정보는 <a href="https://developers.google.com/voice-actions/interaction/" class="external-link">음성 액션 개발자 사이트</a>를 참조하세요.
+
+</p>
+
+<h2 id="assist">지원 API</h2>
+<p>
+이 미리 보기에서는 사용자가 도우미를 통해 앱에 참여하게 하는 새로운 방식을 제시합니다. 이 기능을 사용하려면, 사용자가 현재 컨텍스트를 사용하기 위해 도우미를 활성화해야 합니다.
+ 일단 활성화하고 나면 <strong>홈</strong> 버튼을 길게 눌러 해당 도우미를 어느 앱에서나 불러낼 수 있습니다.
+</p>
+<p>앱이 현재 컨텍스트를 도우미와 공유하지 않기로 선택하는 경우, {@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 플래그를 설정하면 됩니다.
+ 플랫폼이 도우미에게 전달하는 일반적인 일련의 정보 외에도 앱이 추가적인 정보를 공유할 수 있도록 하려면 새로 나온 {@code android.app.Activity.AssistContent} 클래스를 사용할 수 있습니다.
+
+</p>
+
+<p>도우미에게 앱에서 가져온 추가 컨텍스트를 제공하려면, 다음 단계를 따르면 됩니다.</p>
+
+<ol>
+<li>{@link android.app.Application.OnProvideAssistDataListener} 인터페이스를 구현합니다.</li>
+<li>{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}를 사용하여 이 수신기를 등록합니다.
+</li>
+<li>액티비티에 따라 각기 다른 상황별 정보를 제공하려면 {@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()} 콜백을 재정의하고, 선택 사항으로 새로운 {@code Activity.onProvideAssistContent()} 콜백도 재정의합니다.
+
+
+</ol>
+
+<h2 id="notifications">알림</h2>
+<p>이 미리 보기에서는 알림 기능에 다음과 같은 API 변경을 추가합니다.</p>
+<ul>
+ <li>새 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 필터 수준이 추가되었습니다. 이것은 새로운 <em>알람 전용</em> 방해 금지 모드에 상응하는 것입니다.
+</li>
+ <li>새 {@code Notification.CATEGORY_REMINDER} 카테고리 값이 추가되었습니다. 이것은 다른 이벤트로부터 사용자가 일정을 지정한 미리 알림({@link android.app.Notification#CATEGORY_EVENT}) 및 알람({@link android.app.Notification#CATEGORY_ALARM})를 구분하는 데 사용됩니다.
+
+
+</li>
+ <li>새 {@code android.graphics.drawable.Icon} 클래스가 추가되었습니다. 이것은 {@code Notification.Builder.setSmallIcon(Icon)} 및 {@code Notification.Builder.setLargeIcon(Icon)} 메서드를 통해 알림에 첨부할 수 있습니다.
+
+</li>
+ <li>새 {@code NotificationManager.getActiveNotifications()} 메서드가 추가되었습니다. 이것을 사용하면 앱이 자신의 알림 중 현재 활성 상태인 것이 무엇인지 알아낼 수 있습니다.
+ 이 기능을 사용하는 앱 구현을 확인하려면 <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">활성 알림 샘플</a>을 참조하세요.
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">블루투스 스타일러스 지원</h2>
+<p>이 미리 보기에서는 블루투스 스타일러스를 사용하는 사용자 입력에 대한 지원을 개선하여 제공합니다. 사용자는 전화기나 태블릿을 호환되는 블루투스 스타일러스와 페어링하고 이에 연결할 수 있습니다.
+ 연결된 동안 터치 스크린에서 가져온 위치 정보가 스타일러스에서 가져온 압력 및 버튼 정보와 합쳐져 하나의 터치 스크린을 사용할 때보다 훨씬 폭넓은 표현을 제공합니다.
+
+ 앱이 스타일러스 버튼 누르기를 수신 대기하고 보조 작업을 수행하도록 하려면, 액티비티에 새로운 {@code View.onStylusButtonPressListener} 및 {@code GestureDetector.OnStylusButtonPressListener} 콜백을 등록하면 됩니다.
+
+
+</p>
+
+<p>스타일러스 버튼 상호작용을 감지하려면 {@link android.view.MotionEvent} 메서드와 상수를 사용하세요.
+</p>
+<ul>
+<li>사용자가 앱의 화면에 있는 버튼으로 스타일러스를 터치하면 {@link android.view.MotionEvent#getToolType(int) getTooltype()} 메서드가 {@link android.view.MotionEvent#TOOL_TYPE_STYLUS}를 반환합니다.
+
+</li>
+<li>M 미리 보기를 대상으로 삼는 앱의 경우, {@link android.view.MotionEvent#getButtonState() getButtonState()} 메서드는 사용자가 기본 스타일러스 버튼을 누르면 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}를 반환합니다.
+
+
+ 스타일러스에 두 번째 버튼이 있는 경우, 사용자가 그것을 누르면 같은 메서드가 {@code MotionEvent.STYLUS_BUTTON_SECONDARY}를 반환합니다.
+ 사용자가 두 버튼을 동시에 누르는 경우, 이 메서드는 두 값을 'OR'로 함께 묶어 모두 반환합니다({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).
+
+</li>
+<li>
+더 낮은 플랫폼 버전을 대상으로 하는 앱의 경우, {@link android.view.MotionEvent#getButtonState() getButtonState()} 메서드가 {@link android.view.MotionEvent#BUTTON_SECONDARY}(기본 스타일러스 버튼 누름)를 반환하고, {@link android.view.MotionEvent#BUTTON_TERTIARY}(보조 스타일러스 버튼 누름)를 반환하거나 둘 모두를 반환합니다.
+
+
+
+</li>
+</ul>
+
+<h2 id="ble-scanning">블루투스 저전력 스캔 개선</h2>
+<p>
+앱이 블루투스 저전력 스캔을 수행하는 경우, 새로운 {@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 메서드를 사용해 콜백에 알림을 원하는 시점을 지정할 수 있습니다.즉, 정해진 {@link android.bluetooth.le.ScanFilter}에 일치하는 광고 패킷을 처음 찾았을 때와 이것을 일정한 시간 동안 확인하지 못했을 때에만 콜백에 알리도록 하면 됩니다.
+
+
+
+ 스캔 기능에 대해 이런 식으로 접근하면 이전 버전의 플랫폼에서 제공되었던 것에 비해 훨씬 전력 효율적입니다.
+
+</p>
+
+<h2 id="hotspot">핫스팟 2.0 릴리스 1 지원</h2>
+<p>
+이 미리 보기에서는 Nexus 6 및 Nexus 9 기기에서의 핫스팟 2.0 릴리스 1 사양에 대한 지원을 추가합니다. 앱에 핫스팟 2.0 자격 증명을 프로비저닝하려면 {@link android.net.wifi.WifiEnterpriseConfig} 클래스의 새 메서드를 사용할 수 있습니다(예: {@code setPlmn()} 및 {@code setRealm()}).
+
+
+ {@link android.net.wifi.WifiConfiguration} 객체에서는 {@link android.net.wifi.WifiConfiguration#FQDN} 및 {@code providerFriendlyName} 필드를 설정하면 됩니다. 새로 나온 {@code ScanResult.PasspointNetwork} 속성이 감지된 네트워크가 핫스팟 2.0 액세스 지점을 나타내는지 여부를 알려줍니다.
+
+
+
+</p>
+
+<h2 id="4K-display">4K 디스플레이 모드</h2>
+<p>이제 플랫폼에서 앱이 호환되는 하드웨어에서 디스플레이 해상도를 4K 렌더링으로 업그레이드하도록 요청할 수 있습니다.
+ 현재의 물리적 해상도를 쿼리하려면 새로운 {@code android.view.Display.Mode} API를 사용할 수 있습니다.
+ UI가 더 낮은 논리적 해상도에서 그려졌고 더 큰 물리적 해상도에 맞춰 확장된 경우, {@code Display.Mode.getPhysicalWidth()} 메서드가 반환하는 물리적 해상도가 {@link android.view.Display#getSize(android.graphics.Point) getSize()}가 보고하는 논리적 해상도와 다를 수 있다는 점을 유의하세요.
+
+
+</p>
+
+<p>앱이 실행되는 중에 시스템에 물리적 해상도를 변경하도록 요청할 수도 있습니다. 앱의 창에서 {@code WindowManager.LayoutParams.preferredDisplayModeId} 속성을 설정하면 됩니다.
+ 이 기능은 4K 디스플레이 해상도로 전환하고자 하는 경우 무척 유용합니다.
+ 4K 디스플레이 모드에서 UI는 계속 원래 해상도(예: 1080p)에서 렌더링되며 4K로 확장되지만, {@link android.view.SurfaceView} 객체는 원래 해상도에서 콘텐츠를 표시할 수 있습니다.
+
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">테마 지정 가능 ColorStateLists</h2>
+<p>이제 M 미리 보기를 실행하는 기기에 대해 테마 속성이 {@link android.content.res.ColorStateList}에서 지원됩니다.
+ {@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 및 {@link android.content.res.Resources#getColor(int) getColor()} 메서드는 사용이 중단되었습니다.
+
+ 이러한 API를 호출하려면, 대신 새로운 {@code Context.getColorStateList()} 또는 {@code Context.getColor()} 메서드를 호출하세요.
+
+ 이 두 메서드는 v4 AppCompat 라이브러리에서도 {@link android.support.v4.content.ContextCompat}를 통해 이용할 수 있습니다.
+</p>
+
+<h2 id="audio">오디오 기능</h2>
+
+<p>이 미리 보기에서는 Android에서의 오디오 처리에 개선점을 더했습니다. </p>
+<ul>
+ <li><a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a> 프로토콜을 지원하는 새로운 {@code android.media.midi} API를 추가했습니다.
+ 이와 같은 API를 사용하면 MIDI 이벤트를 전송 및 수신할 수 있습니다.
+</li>
+ <li>새 {@code android.media.AudioRecord.Builder} 및 {@code android.media.AudioTrack.Builder} 클래스를 추가하여 각각 디지털 오디오 캡처와 재생 객체를 생성하고, 오디오 소스와 싱크 속성을 구성하여 시스템 기본 설정을 재정의하도록 하였습니다.
+
+</li>
+ <li>오디오 및 입력 기기를 연관시키기 위한 API Hook이 추가되었습니다. 이것은 특히 앱이 사용자에게 게임 컨트롤러 또는 Android TV에 연결된 리모컨에서 음성을 검색하는 데 유용합니다. 사용자가 검색을 시작하면 시스템이 새로운 {@code android.app.Activity.onSearchRequested()} 콜백을 호출합니다.
+
+
+ 사용자의 입력 기기에 마이크가 내장되어 있는지 판별하려면, 해당 콜백에서 {@link android.view.InputDevice} 객체를 검색한 다음 새 {@code InputDevice.hasMic()} 메서드를 호출하면 됩니다.
+
+</li>
+ <li>새 {@code android.media.AudioDevicesManager} 클래스를 추가하여 첨부된 소스와 싱크 오디오 기기 전체 목록을 검색할 수 있습니다.
+ 이외에도, {@code android.media.OnAudioDeviceConnectionListener} 객체를 지정하여 오디오 기기가 연결되거나 연결 해제되었을 때 앱에 알릴 수도 있습니다.
+
+</li>
+</ul>
+
+<h2 id="video">비디오 기능</h2>
+<p>이 미리 보기에서는 비디오 처리 API에 새로운 기능을 추가합니다.</p>
+<ul>
+<li>새 {@code android.media.MediaSync} 클래스를 추가하여 여러 애플리케이션이 오디오와 비디오 스트림을 동기적으로 렌더링하는 데 지원하도록 하였습니다.
+ 오디오 버퍼는 비블로킹 방식으로 제출된 다음 콜백을 통해 반환됩니다.
+ 이것은 동적 재생 속도도 지원합니다.
+</li>
+<li>새 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 이벤트를 추가하여 앱이 연 세션을 리소스 관리자가 회수했다는 내용을 나타낼 수 있습니다.
+ 앱이 DRM 세션을 사용하는 경우, 이 이벤트를 처리해야 하고 회수된 세션을 사용하지 않도록 해야 합니다.
+
+</li>
+<li>새 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 오류 코드를 추가했습니다. 이것은 코덱이 사용하는 미디어 리소스를 리소스 관리자가 회수했다는 내용을 나타냅니다.
+ 이런 경우를 예외로 하고, 코덱은 종료 상태로 이동하면서 해제되어야 합니다.
+
+</li>
+<li>새 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 인터페이스를 추가하여 지원되는 동시 코덱 인스턴스의 최대 수에 대한 힌트를 얻을 수 있습니다.
+
+</li>
+<li>새 {@code MediaPlayer.setPlaybackParams()} 메서드로는 빠른 재생 또는 느린 동작 재생에 대한 미디어 재생 속도를 설정할 수 있습니다.
+ 이는 또한 비디오와 함께 오디오 재생을 자동으로 늘리거나 속도를 높이기도 합니다.
+</li>
+</ul>
+
+<h2 id="camera">카메라 기능</h2>
+<p>이 미리 보기에는 다음과 같은 새 API를 제공하여 카메라의 플래시에 액세스하고 이미지를 재처리하는 카메라에 액세스할 수 있도록 했습니다.
+</p>
+
+<h3 id="flashlight">Flashlight API</h3>
+<p>카메라 기기에 플래시 장치가 있는 경우, {@code CameraManager.setTorchMode()} 메서드를 호출하여 카메라 기기를 열지 않고도 플래시 장치의 Torch 모드를 켜거나 끌 수 있습니다.
+ 앱에는 플래시 장치 또는 카메라 기기에 대한 독점적인 소유권이 없습니다.
+ Torch 모드는 꺼져 있다가 카메라 기기를 이용할 수 없게 될 때마다 이용 불가능한 상태가 되고, Torch 모드를 켜진 상태로 유지하던 다른 카메라 리소스를 이용할 수 없게 되면 이용 불가능하게 됩니다.
+
+ 다른 앱도 {@code setTorchMode()}를 호출하여 Torch 모드를 끌 수 있습니다.
+ Torch 모드를 켠 마지막 앱이 종료되면 Troch 모드도 꺼집니다.
+</p>
+
+<p>Torch 모드 상태에 대해 알림을 받기 위한 콜백을 등록하려면 {@code CameraManager.registerTorchCallback()} 메서드를 호출하면 됩니다.
+ 콜백을 처음 등록하면 그 즉시, 현재 알려진 모든 카메라 기기(플래시 장치가 있는)의 Torch 모드 상태와 함께 호출됩니다.
+
+ Torch 모드가 성공적으로 켜지거나 꺼지면 {@code CameraManager.TorchCallback.onTorchModeChanged()} 메서드가 불려나옵니다.
+</p>
+
+<h3 id="reprocessing">재처리 API</h3>
+<p>{@link android.hardware.camera2 Camera2} API를 확장하여 YUV를 지원하고 비공개 불투명 형식 이미지 재처리를 지원하게 되었습니다.
+ 앱은 재처리 기능을 이용할 수 있는지 알아보기 위해 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}를 통합니다.
+ 기기가 재처리를 지원하는 경우, 재처리 가능한 카메라 캡처 세션을 생성하려면 {@code CameraDevice.createReprocessableCaptureSession()}을 호출하고 입력 버퍼 재처리를 위한 요청을 생성하면 됩니다.
+
+
+</p>
+
+<p>{@code ImageWriter} 클래스를 사용하여 카메라 재처리 입력에 입력 버퍼 흐름을 연결시키세요.
+ 빈 버퍼를 가져오려면 다음과 같은 프로그래밍 모델을 따르면 됩니다.</p>
+
+<ol>
+<li>{@code ImageWriter.dequeueInputImage()} 메서드를 호출합니다.</li>
+<li>입력 버퍼에 이 데이터를 채웁니다.</li>
+<li>{@code ImageWriter.queueInputImage()} 메서드를 호출하여 해당 버퍼를 카메라에 전송합니다.</li>
+</ol>
+
+<p>{@code ImageWriter} 객체와 {@code android.graphics.ImageFormat.PRIVATE} 이미지를 함께 사용하는 경우, 앱이 이미지 데이터에 직접 액세스할 수 없습니다.
+
+ 대신, 버퍼 사본 없이 {@code ImageWriter.queueInputImage()} 메서드를 호출하여 {@code ImageFormat.PRIVATE} 이미지를 {@code ImageWriter}에 직접 전달하면 됩니다.
+
+</p>
+
+<p>이제 {@code ImageReader} 클래스가 {@code android.graphics.ImageFormat.PRIVATE} 형식 이미지 스트림을 지원합니다.
+ 이로써 앱이 {@code ImageReader} 출력 이미지의 원형 이미지 대기열을 유지하고 하나 이상의 이미지를 선택하여 이들을 {@code ImageWriter}에 보내 카메라 재처리를 할 수 있습니다.
+
+</p>
+
+<h2 id="afw">Android for Work 기능</h2>
+<p>이 미리 보기에는 다음과 같은 Android for Work에 대한 새 API가 포함되어 있습니다.</p>
+<ul>
+ <li><strong>회사 소유, 일회용 기기 제어 능력 향상:</strong> 이제 기기 소유자가 다음과 같은 설정을 제어하여 회사 소유, 일회용(COSU) 기기 관리를 한층 개선할 수 있습니다.
+
+
+ <ul>
+ <li>키가드를 비활성화하거나 다시 활성화하려면 {@code DevicePolicyManager.setKeyguardEnabledState()} 메서드를 사용하세요.
+</li>
+ <li>상태 표시줄(빠른 설정, 알림과 Google Now를 시작하는 탐색 스와이프 업 동작 포함)을 비활성화하거나 다시 활성화하려면 {@code DevicePolicyManager.setStatusBarEnabledState()} 메서드를 사용하세요.
+
+</li>
+ <li>안전 부팅을 비활성화하거나 다시 활성화하려면 {@link android.os.UserManager} 상수 {@code DISALLOW_SAFE_BOOT}를 사용하세요.
+</li>
+ <li>플러그인 상태에서 화면이 꺼지지 않도록 방지하려면 {@link android.provider.Settings.Global} 상수 {@code STAY_ON_WHILE_PLUGGED_IN}을 사용하세요.
+</li>
+ </ul>
+ </li>
+ <li><strong>기기 소유자의 앱 자동 설치 및 설치 제거:</strong> 이제 기기 소유자가 애플리케이션을 자동으로 설치하고 제거할 수 있습니다. 업무용 Google Play와는 따로 {@link android.content.pm.PackageInstaller} API를 사용하면 됩니다.
+
+ 이제 사용자 상호작용 없이도 앱을 가져오고 설치하는 기기 소유자를 통해 기기를 프로비저닝할 수 있습니다.
+ 이 기능은 Google 계정을 활성화하지 않고도 키오스크 또는 그와 같은 다른 기기를 원터치 방식으로 프로비저닝하는 데 유용합니다.
+</li>
+<li><strong>자동 엔터프라이즈 인증서 액세스: </strong> 사용자에게 인증서를 선택하라는 메시지가 표시되기 전에 앱이{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()}를 호출하는 경우, 이제 프로필 또는 기기 소유자가 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()}를 호출하여 요청하는 애플리케이션에 자동으로 별칭을 제공할 수 있습니다.
+
+
+
+ 이 기능을 사용하면 관리된 앱에 사용자 상호작용 없이도 인증서에 대한 액세스 권한을 부여할 수 있습니다.
+</li>
+<li><strong>시스템 업데이트 자동 수락:</strong> 시스템 업데이트 정책을 {@code DevicePolicyManager.setSystemUpdatePolicy()}로 설정하면, 이제 기기 소유자가 자동으로 시스템 업데이트를 수락할 수 있습니다(예: 키오스크 기기의 경우). 또는 업데이트를 연기하거나 사용자가 업데이트를 수행하지 못하도록 최대 30일까지 막을 수 있습니다.
+
+
+ 이에 더해, 관리자가 매일 시간 창을 설정하여 여기에서 업데이트를 수행하도록 할 수 있습니다. 예를 들어, 키오스크 기기를 사용하지 않는 시간 중에 업데이트하도록 합니다.
+ 시스템 업데이트를 사용할 수 있게 되면 시스템이 작업 정책 컨트롤러 앱에 시스템 업데이트 정책이 설정되어 있는지 확인하고, 그에 따라 동작합니다.
+
+
+</li>
+<li>
+<strong>인증서 설치 위임:</strong> 이제 프로필 또는 기기 소유자가 타사 앱에 권한을 부여하여 다음과 같은 {@link android.app.admin.DevicePolicyManager} 인증서 관리 API를 호출할 수 있습니다.
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>엔터프라이즈 공장 재설정 보호:</strong> 기기 소유자를 프로비저닝하는 경우, 이제 {@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 번들을 설정하여 공장 재설정 보호(FRP)를 잠금 해제하는 데 사용되는 매개변수를 구성할 수 있습니다.
+
+ 이와 같은 매개변수는 기기를 재설정하여 FRP를 잠금 해제하도록 하고 기기를 프로비저닝하기로 한 다음에 NFC 프로그래머 앱이 제공할 수 있으며, 이전에 구성한 Google 계정도 필요하지 않습니다.
+
+ 이와 같은 매개변수를 수정하지 않으면 FRP가 제자리에 유지되어 이전에 활성화한 Google 자격 증명 없이는 기기가 활성화되지 않도록 방지합니다.
+
+
+<p>이외에도 Google Play 서비스에 앱 제한을 설정하면 기기 소유자가 기기에서 활성화된 것을 대신할 대체 Google 계정을 지정하여 FRP를 잠금 해제하는 데 사용할 수 있습니다.
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>데이터 사용량 추적:</strong> 새로운 {@code android.app.usage.NetworkStatsManager} 메서드를 사용하여 이제 프로필 또는 기기 소유자가 <strong>설정 > 데이터</strong>에 표시되는 데이터 사용량 통계를 쿼리할 수 있습니다.
+
+ 프로필 소유자에게는 자신이 관리하는 프로필에서 데이터를 쿼리할 권한이 자동으로 부여되는 반면, 기기 소유자의 경우에는 관리된 기본 사용자의 사용량 데이터에 대한 액세스 권한이 주어집니다.
+
+</li>
+<li><strong>런타임 권한 관리:</strong>
+<p>프로필 또는 기기 소유자는 모든 애플리케이션의 모든 런타임 요청에 대해 권한 정책을 설정할 수 있습니다. {@code DevicePolicyManager.setPermissionPolicy()}를 사용해 사용자에게 정상적으로 권한을 부여하라는 메시지를 표시하거나, 자동으로 권한을 허용하거나 해당 권한을 자동으로 거부하도록 할 수도 있습니다.
+
+
+ 후자의 정책이 설정된 경우, 사용자는 앱의 <strong>설정</strong> 내에 있는 권한 화면 안에서 프로필 또는 기기 소유자가 선택한 내용을 수정할 수 없습니다.
+
+</p></li>
+<li><strong>설정 VPN:</strong> 이제 VPN 앱이 <strong>설정 > 더 보기 > VPN</strong>에 표시됩니다. 이외에도, VPN 사용량에 수반되는 알림은 이제 VPN 구성 방식만 구체적으로 다루게 되었습니다.
+
+
+ 프로필 소유자의 경우, 이러한 알림은 VPN이 관리된 프로필에 대해 구성되었는지, 아니면 개인 프로필에 구성되었거나 둘 모두에 구성되었는지 여부에 한정됩니다.
+ 기기 소유자의 경우, 이 알림은 VPN이 기기 전체에 대해 구성되었는지 여부만 나타냅니다.
+</li>
+<li><strong>작업 상태 알림:</strong> 이제 관리된 프로필에서 온 앱에 전경에 있는 액티비티가 있을 때마다 상태 표시줄 서류가방 아이콘이 나타납니다.
+ 또한, 기기가 관리된 프로필 내 앱의 액티비티에 대해 직접 잠금 해제된 경우, 알림 메시지가 표시되어 사용자에게 지금 작업 프로필 내에 있다는 사실을 알려주기도 합니다.
+
+
+</li>
+</ul>
+
+<p class="note">
+ M 개발자 미리 보기의 모든 API 변경 내용에 대한 상세한 정보는 <a href="{@docRoot}preview/download.html">API 차이점 보고서</a>를 참조하세요.
+</p>
diff --git a/docs/html-intl/intl/ko/preview/behavior-changes.jd b/docs/html-intl/intl/ko/preview/behavior-changes.jd
new file mode 100644
index 0000000..fa95070
--- /dev/null
+++ b/docs/html-intl/intl/ko/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=동작 변경
+page.keywords=미리 보기, SDK, 호환성
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>이 문서의 내용</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">런타임 권한</a></li>
+ <li><a href="#behavior-power">절전 최적화</a>
+ <ol>
+ <li><a href="#behavior-doze">Doze</a></li>
+ <li><a href="#behavior-app-standby">앱 대기 모드</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">채택 가능한 저장소 기기</a></li>
+ <li><a href="#behavior-apache-http-client">Apache HTTP 클라이언트 제거</a></li>
+ <li><a href="#behavior-audiomanager-Changes">AudioManager 변경</a></li>
+ <li><a href="#behavior-test-selection">텍스트 선택</a></li>
+ <li><a href="#behavior-keystore">Android 키노트 변경</a></li>
+ <li><a href="#behavior-network">Wi-Fi 및 네트워킹 변경</a></li>
+ <li><a href="#behavior-camera">카메라 서비스 변경</a></li>
+ <li><a href="#behavior-art-runtime">ART 런타임</a></li>
+ <li><a href="#behavior-apk-validation">APK 유효성 검사</a></li>
+ <li><a href="#behavior-afw">Android for Work 변경</a></li>
+</ol>
+
+<h2>API 차이점</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">M 미리 보기에 대한 API 레벨 22 »</a> </li>
+</ol>
+
+
+<h2>참고 항목</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">M 개발자 미리 보기 API 개요</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 개발자 미리 보기에는 새로운 기능 및 특징과 더불어 다양한 시스템 변경과 API 동작 변경 내용이 포함되어 있습니다.
+ 이 문서에서는 개발자 여러분이 숙지해야 하고 앱을 개발할 때 감안해야 하는 몇 가지 주요 변경 내용을 소개하겠습니다.
+</p>
+
+<p>이전에 Android용 앱을 게시한 적이 있는 경우, 이와 같은 플랫폼 변경으로 인해 앱이 영향을 받을 수 있다는 점을 유의하세요.
+</p>
+
+<h2 id="behavior-runtime-permissions">런타임 권한</h1>
+<p>이 미리 보기에서는 새 권한 모델을 소개합니다. 여기에서는 이제 사용자가 런타임에 직접 앱 권한을 관리할 수 있게 됩니다.
+ 이 모델을 사용하면 사용자에게 개선된 가시성과 권한에 대한 제어권을 부여하는 한편 앱 개발자에게는 설치와 자동 업데이트 과정을 간소화해줍니다. 사용자는 설치된 여러 앱에 대해 따로따로 권한을 허용하거나 취소할 수 있습니다.
+
+ </p>
+
+<p>M 미리 보기를 대상으로 하는 앱을 개발하는 경우, 권한 확인과 요청은 런타임에 해야 합니다.
+ 앱에 어떤 권한이 허용되었는지 판단하려면, 새로운 {@code Context.checkSelfPermission()} 메서드를 호출하면 됩니다.
+ 권한을 요청하려면 새 {@code Activity.requestPermission()} 메서드를 호출하세요.
+ 앱이 M을 대상으로 하지 않더라도, 앱을 새 권한 모델에서 테스트해보는 것이 좋습니다.
+</p>
+
+<p>앱에서 새 권한 모델을 지원하는 방법에 대한 자세한 내용은 <a href="{@docRoot}preview/features/runtime-permissions.html">권한</a> 개발자 미리 보기 페이지를 참조하세요.
+
+ 앱에 미친 영향을 평가하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">테스트 가이드</a>를 참조하세요.
+</p>
+
+<h2 id="behavior-power">절전 최적화</h2>
+<p>이 미리 보기에서는 유휴 상태의 기기 및 앱에 대한 새로운 절전 최적화 기능을 소개합니다.</p>
+
+<h3 id="behavior-doze">Doze</h3>
+<p>기기의 플러그가 뽑히고 화면이 꺼진 채로 일정 시간 동안 변화 없는 상태로 유지되면, <em>Doze</em> 상태로 들어갑니다. 이 상태에서는 기기가 시스템을 절전 모드 상태로 유지하려 시도합니다.
+ 이 모드에서 기기는 정기적으로 잠시 동안 정상 작동을 재개하여 앱 동기화가 일어날 수 있도록 하고 보류된 작업이 있으면 시스템이 이를 수행할 수 있도록 합니다.
+
+</p>
+
+<p>앱이 Doze 상태에 있는 동안 다음과 같은 제한 사항이 적용됩니다.</p>
+<ul>
+<li>네트워크 액세스가 비활성화됩니다. 다만 앱이 우선 순위가 높은 Google Cloud 메시지 Tickle을 받을 때는 예외입니다.
+</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">절전 모드 해제 잠금</a>이 무시됩니다.</li>
+<li>{@link android.app.AlarmManager} 클래스로 일정이 예약된 알람이 비활성화됩니다. 다만 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()} 메서드 및 {@code AlarmManager.setAndAllowWhileIdle()}로 설정한 알람은 예외입니다.
+
+</li>
+<li>WiFi 스캔을 수행하지 않습니다.</li>
+<li>동기화 어댑터와 {@link android.app.job.JobScheduler}의 동기화와 작업 실행이 금지됩니다.
+</li>
+</ul>
+</p>
+<p>기기가 Doze 모드를 종료하면 보류되어 있던 작업과 동기화를 모두 실행합니다.</p>
+<p>이 기능을 테스트하려면 개발 머신에 M 미리 보기를 실행하는 기기를 연결하여 다음과 같은 명령을 호출하면 됩니다.
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>참고:</strong> 다가오는 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud 메시지</a> 릴리스에서는 개발자에게 우선 순위가 높은 메시지를 지정하게 해줍니다.
+
+
+ 앱이 우선 순위가 높은 GCM 메시지를 수신하면 이 앱에는 기기가 Doze 모드에 있더라도 잠시 네트워크 액세스가 허용됩니다.
+
+</p>
+
+<p>앱에서 Doze를 테스트하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#doze-standby">테스트 가이드</a>를 참조하세요.
+
+ </p>
+
+<h3 id="behavior-app-standby">앱 대기 모드</h3>
+<p>이 미리 보기에서는 시스템이 보기에 앱이 활성 사용 중이 아닌 경우 해당 앱은 유휴 상태라고 판별할 수 있습니다.
+ 일정 시간이 지나면 앱이 유휴 상태인 것으로 간주되는데, 시스템이 다음과 같은 신호 중 하나를 감지하는 경우는 예외입니다.
+</p>
+
+<ul>
+<li>사용자가 명시적으로 앱을 시작했습니다.</li>
+<li>앱에 현재 전경에 있는 프로세스가 있습니다(액티비티 또는 전경 서비스 중 하나의 형태로, 또는 다른 액티비티나 전경 서비스가 사용 중인 상태로).
+</li>
+<li>앱이 알림을 생성하여 사용자가 그것을 잠금 화면에서 보거나 알림 트레이에서 확인합니다.
+</li>
+<li><strong>설정</strong>을 통해 사용자가 명시적으로 앱이 최적화에서 면제되도록 요청합니다.
+</li>
+</ul>
+
+<p>기기의 플러그가 뽑혀 있는 경우, 유휴 상태인 것으로 간주된 앱은 자신의 네트워크 액세스를 비활성화하고 동기화와 작업을 일시 중단시킵니다.
+ 기기가 전원 공급 장치에 연결되면 이와 같은 앱에 네트워크 액세스가 허용되며 보류 중이었던 작업과 동기화를 모두 실행할 수 있습니다.
+ 기기가 오랜 시간 동안 유휴 상태인 경우, 유휴 앱에는 하루에 한 번 정도 네트워크 액세스가 허용됩니다.
+</p>
+
+<p>이 기능을 테스트하려면 개발 머신에 M 미리 보기를 실행하는 기기를 연결하여 다음과 같은 명령을 호출하면 됩니다.
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>참고:</strong> 다가오는 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud 메시지</a>(GCM) 릴리스에서는 개발자에게 우선 순위가 높은 메시지를 지정할 수 있습니다.
+
+
+ 앱이 우선 순위가 높은 GCM 메시지를 수신하면 이 앱에는 앱이 유휴 상태에 있더라도 잠시 네트워크 액세스가 허용됩니다.
+
+</p>
+
+<p>앱에서 앱 대기 모드를 테스트하는 방법에 대한 팁은 <a href="{@docRoot}preview/testing/guide.html#doze-standby">테스트 가이드</a>를 참조하세요.
+
+ </p>
+
+<h2 id="behavior-adoptable-storage">채택 가능한 저장소 기기</h2>
+<p>
+이 미리 보기에서는 사용자가 SD 카드와 같은 외부 저장소 기기를 <em>채택</em>할 수 있습니다. 외부 저장소 기기를 채택하면 기기를 암호화하고 포맷하여 내부 저장소처럼 작동하도록 합니다.
+ 이 기능을 사용하면 사용자가 앱과 해당 앱의 비공개 데이터를 여러 저장소 기기 사이에서 이동시킬 수 있습니다.
+ 앱을 이동시키는 경우, 시스템은 매니페스트의 <a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a> 기본 설정을 사용합니다.
+
+
+</p>
+
+<p>앱이 다음과 같은 API 또는 필드에 액세스하는 경우, 앱이 내부 및 외부 저장소 기기 사이를 이동하면서 반환하는 파일 경로가 급격하게 달라진다는 점을 유의하세요. 파일 경로를 구축할 때에는 이와 같은 API를 항상 동적으로 호출하는 것을 강력히 권장합니다. 하드코드된 파일 경로를 사용하거나 이전에 구축된 정규화된 파일 경로를 유지하지 마세요.
+
+
+</p>
+
+<ul>
+<li>{@link android.content.Context} 메서드:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>{@link android.content.pm.ApplicationInfo} 필드:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>개발자 미리 보기에서 이 기능을 디버그하려면, 다음 명령을 실행하여 USB On-The-Go(OTG) 케이블을 통해 Android 기기에 연결된 USB 드라이브 채택을 활성화하면 됩니다.
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">Apache HTTP 클라이언트 제거</h2>
+<p>이 미리 보기에서는 Apache HTTP 클라이언트에 대한 지원을 제거합니다. 앱이 이 클라이언트를 사용하고 Android 2.3(API 레벨 9) 이상을 대상으로 하는 경우, {@link java.net.HttpURLConnection} 클래스를 대신 사용하세요.
+
+ 이는 투명한 압축과 응답 캐싱을 통해 네트워크 사용량을 줄이고 전력 소모를 최소화하기 때문에 API가 더 효율적입니다.
+ Apache HTTP API를 계속 사용하려면 우선 다음과 같은 컴파일-시간 종속성을 {@code build.gradle} 파일에서 선언해야 합니다.
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android는 OpenSSL에서 <a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a> 라이브러리로 옮겨갑니다.
+
+ 앱에서 Android NDK를 사용하는 경우, NDK API의 일부분이 아닌 암호화 라이브러리에 대해 링크를 연결하지 마세요(예:{@code libcrypto.so} 및 {@code libssl.so}).
+ 이러한 라이브러리는 공개 API가 아니며, 여러 릴리스와 기기에 걸쳐 통보 없이 변경되거나 중단될 수 있으며 스스로를 보안 취약점에 노출시킬 수도 있습니다.
+
+ 대신에 원래 코드를 수정하여 JNI를 통해 Java 암호화 API를 호출하도록 하거나, 직접 선택한 암호화 라이브러리에 대해 정적으로 연결하도록 하세요.
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">AudioManager 변경</h2>
+<p>볼륨을 직접 설정하거나 특정 스트림을 {@link android.media.AudioManager} 클래스를 통해 음소거하는 것은 이제 더 이상 지원되지 않습니다.
+ {@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} 메서드는 사용이 중단되었으며, 그 대신 {@code AudioManager.requestAudioFocus()} 메서드를 호출해야 합니다.
+ 이와 마찬가지로, {@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 메서드도 사용이 중단되었습니다. 그 대신 {@code AudioManager.adjustStreamVolume()} 메서드를 호출하고 방향 값 {@code ADJUST_MUTE} 또는 {@code ADJUST_UNMUTE}에서 전달해야 합니다.
+
+
+</p>
+
+<h2 id="behavior-test-selection">텍스트 선택</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>사용자가 앱에서 텍스트를 선택하면 이제 텍스트 선택 작업을 표시할 수 있습니다. 예를 들어 <em>잘라내기</em>, <em>복사</em> 및 <em>붙여넣기</em>를 <a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">부동 도구 모음</a>으로 표시하게 됩니다.
+
+ 이 사용자 상호작용 구현은 상황별 작업 모음에서와 비슷합니다. 이 내용은 <a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">각각의 보기에 대한 상황별 작업 모드의 활성화</a>에 설명되어 있습니다.
+
+
+</p>
+
+<p>텍스트 선택을 위해 부동 도구 모음을 구현하려면 기존 앱에 다음과 같은 변경을 적용하면 됩니다.
+</p>
+<ol>
+<li>{@link android.view.View} 또는 {@link android.app.Activity} 객체에서 {@link android.view.ActionMode} 호출을 {@code startActionMode(Callback)}에서 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}로 변경합니다.
+
+</li>
+<li>기존 {@code ActionMode.Callback} 구현을 변경하여 대신 {@code ActionMode.Callback2}를 확장합니다.
+</li>
+<li>{@code Callback2.onGetContentRect()} 메서드를 재정의하여 보기에서 콘텐츠 {@link android.graphics.Rect} 객체(예: 텍스트 선택 직사각형)의 좌표를 제공합니다.
+</li>
+<li>직사각형 위치 지정이 더 이상 유효하지 않고, 무효화할 요소가 이것뿐인 경우 {@code ActionMode.invalidateContentRect()} 메서드를 호출합니다.
+</li>
+</ol>
+
+<p><a href="{@docRoot}tools/support-library/index.html">Android 지원 라이브러리</a> 수정 버전 22.2를 사용하는 경우, 부동 도구 모음은 이전 버전과 호환되지 않으며 AppCompat이 기본적으로 {@link android.view.ActionMode} 객체의 제어권을 넘겨받는다는 점을 유의하세요.
+
+
+ 이렇게 하면 부동 도구 모음이 표시되지 않도록 방지합니다. {@link android.support.v7.app.AppCompatActivity}에서 {@link android.view.ActionMode}를 활성화하려면, {@code android.support.v7.app.AppCompatActivity.getDelegate()}를 호출한 다음 {@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()}를 반환된 {@link android.support.v7.app.AppCompatDelegate} 객체에서 호출하고 입력 매개변수를 {@code false}로 설정하세요.
+
+
+
+
+
+ 이 호출은 {@link android.view.ActionMode} 객체의 제어권을 프레임워크에 돌려줍니다.
+ M 미리 보기를 실행하는 기기에서 이렇게 하면 프레임워크가 {@link android.support.v7.app.ActionBar} 또는 부동 도구 모음 모드를 지원할 수 있고, 한편 M 미리 보기 이전 기기에서는 {@link android.support.v7.app.ActionBar} 모드만 지원됩니다.
+
+</p>
+
+<h2 id="behavior-keystore">Android 키노트 변경</h2>
+<p>이 미리 보기에서는 <a href="{@docRoot}training/articles/keystore.html">Android 키노트 제공자</a>가 더 이상 DSA를 지원하지 않습니다.
+
+ ECDSA는 여전히 지원됩니다.</p>
+
+<p>휴식 중일 때 암호화가 필요하지 않은 키도 보안 잠금 화면이 비활성화되거나 재설정될 때(예: 사용자가 또는 기기 관리자가 재설정) 더 이상 삭제되지 않습니다.
+ 휴식 중일 때 암호화가 필요한 키는 이러한 이벤트 중에 삭제됩니다.
+</p>
+
+<h2 id="behavior-network">Wi-Fi 및 네트워킹 변경</h2>
+
+<p>이 미리 보기에서는 Wi-Fi와 네트워킹 API에 다음과 같은 동작 변경을 도입합니다.</p>
+<ul>
+<li>이제 앱이 {@link android.net.wifi.WifiConfiguration} 객체의 상태를 변경할 수 있는 것은 개발자가 이와 같은 객체를 생성한 경우뿐입니다.
+ 사용자 또는 다른 앱이 생성한 {@link android.net.wifi.WifiConfiguration} 객체는 개발자가 수정하거나 삭제할 권한이 없습니다.
+
+</li>
+<li>
+이전에는 앱이 기기에 강제로 특정 Wi-Fi 네트워크에 연결하도록 하는 경우, 즉{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()}를 {@code disableAllOthers=true} 설정으로 사용하면 기기가 셀룰러 데이터와 같은 다른 네트워크에서는 연결을 해제했습니다.
+
+
+ 이 미리 보기에서는 기기가 그러한 다른 네트워크에서 더 이상 연결을 해제하지 않습니다. 앱의 {@code targetSdkVersion}이 {@code “20”} 이하인 경우, 이것은 선택한 Wi-Fi 네트워크에 고정되어 있습니다.
+
+ 앱의 {@code targetSdkVersion}이 {@code “21”} 이상인 경우, 멀티네트워크 API를 사용합니다(예: {@link android.net.Network#openConnection(java.net.URL) openConnection()}, {@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 및 새로운 {@code ConnectivityManager.bindProcessToNetwork()} 메서드). 이렇게 하면 네트워크 트래픽이 선택한 네트워크에서 전송되도록 보장할 수 있습니다.
+
+
+
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">카메라 서비스 변경</h2>
+<p>이 미리 보기에서는 카메라 서비스에서 공유된 리소스에 액세스하는 모델이 이전의 "선착순" 액세스 모델에서 바뀌어 우선 순위가 높은 프로세스를 선호하는 액세스 모델로 변경되었습니다.
+
+ 서비스 동작에 대한 변경 내용은 다음과 같습니다.</p>
+<ul>
+<li>카메라 하위 시스템 리소스(카메라 기기 열기 및 구성하기 포함)에 대한 액세스 권한은 클라이언트 애플리케이션 프로세스의 "우선 순위"를 기반으로 부여됩니다.
+ 대개는 사용자에게 표시되는 액티비티 또는 전경 액티비티가 있는 애플리케이션 프로세스에 높은 우선 순위가 부여되어 카메라 리소스 획득과 사용에 좀 더 신뢰감을 더합니다.
+
+</li>
+<li>우선 순위가 낮은 앱에 대한 활성 카메라 클라이언트는 우선 순위가 더 높은 애플리케이션이 카메라를 사용하려 시도하면 "제거"될 수 있습니다.
+ 사용이 중단된 {@link android.hardware.Camera} API의 경우, 이 때문에 {@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}가 제거된 클라이언트에 대해 호출되는 결과를 초래합니다.
+
+
+ {@link android.hardware.camera2 Camera2} API에서는 제거된 클라이언트에 대해 {@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}가 호출됩니다.
+
+</li>
+<li>적절한 카메라 하드웨어를 갖춘 기기에서는 별도의 애플리케이션 프로세스가 각자 따로따로 열려 동시에 각기 다른 카메라 기기를 사용할 수 있습니다.
+ 하지만 여러 프로세스를 사용하는 경우 동시에 액세스하면 열려 있는 카메라 기기 모두의 성능 또는 기능이 대폭 저하되는 결과를 유발했었는데, 이런 경우도 이제 카메라 서비스가 감지하여 허용하지 않게 됩니다.
+
+ 이러한 변경으로 인해, 같은 카메라 기기에 직접 액세스하려 시도하는 앱이 없는 경우에도 우선 순위가 낮은 클라이언트를 "제거"하는 결과를 초래할 수도 있습니다.
+
+
+</li>
+<li>
+현재 사용자를 변경하면 앱 내에서 이전 사용자 계정이 소유하는 활성 카메라 클라이언트를 제거하는 결과를 유발할 수 있습니다.
+ 카메라에 대한 액세스는 현재 기기 사용자가 소유한 사용자 프로필에게만 국한됩니다. 이것은 실제로 예를 들면, 사용자가 다른 계정으로 전환하면 "Guest" 계정은 카메라 시스템을 사용하는 실행 중인 프로세스에서 나갈 수 없게 된다는 뜻입니다.
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">ART 런타임</h2>
+<p>이제 ART 런타임이 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 메서드에 대한 액세스 규칙을 제대로 구현할 수 있습니다.
+ 이 변경 덕분에 이전 버전에서는 Dalvik이 액세스 규칙을 잘못 확인하던 문제를 해결했습니다. 앱이 {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 메서드를 사용하고 액세스 확인을 재정의하고자 하는 경우, {@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 메서드를 호출하되 입력 매개변수를 {@code true}로 설정한 상태로 사용합니다.
+
+
+
+
+
+ 앱이 <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 AppCompat 라이브러리</a> 또는 <a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 RecyclerView 라이브러리</a>를 사용하는 경우, 앱을 업데이트하여 이러한 라이브러리의 최신 버전을 사용하도록 해야 합니다.
+
+
+ 그렇지 않으면, XML에서 참조되는 모든 사용자 지정 클래스가 업데이트되도록 확인하여 그 클래스 생성자에 액세스할 수 있도록 해야 합니다.
+</p>
+
+<p>이 미리 보기에서는 동적 링커의 동작을 업데이트합니다. 동적 링커는 이제 라이브러리의 {@code soname}과 그 경로(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">공개 버그 6670</a>) 사이의 차이점을 숙지하고 있으며, 이제 {@code soname} 기준 검색도 구현되었습니다.
+
+
+
+ 이전에 작동한 앱 중에서 {@code DT_NEEDED} 항목이 있는 경우(주로 빌드 머신의 파일 시스템에 있는 절대 경로) 로딩했을 때 실패할 수 있습니다.
+</p>
+
+<p>이제 {@code dlopen(3) RTLD_LOCAL} 플래그를 올바르게 구현했습니다. 이때 {@code RTLD_LOCAL}이 기본이므로 {@code dlopen(3)}에 대한 호출 중에서 {@code RTLD_LOCAL}을 명시적으로 사용하지 않으면 영향받을 수 있다는 점을 유의하세요(다만 앱이 명시적으로 {@code RTLD_GLOBAL}을 사용한 경우는 예외입니다).
+
+ {@code RTLD_LOCAL}의 경우, 나중에 {@code dlopen(3)}으로 한 호출로 인해 로딩된 라이브러리에서는 기호를 이용할 수 없게 됩니다({@code DT_NEEDED} 항목에 의해 참조된 것과는 반대입니다).
+
+</p>
+</p>
+
+<h2 id="behavior-apk-validation">APK 유효성 검사</h2>
+<p>이제 플랫폼이 APK에 대해 좀 더 엄격한 유효성 검사를 수행합니다. APK는 파일이 매니페스트에서는 선언되었지만 APK 자체에는 없는 경우 손상된 것으로 간주됩니다.
+ 콘텐츠가 하나라도 제거되면 APK를 다시 서명해야 합니다.
+</p>
+
+<h2 id="behavior-afw">Android for Work 변경</h2>
+<p>이 미리 보기에는 Android for Work에 대해 다음과 같은 동작 변경을 포함합니다.</p>
+<ul>
+<li><strong>업무용 연락처를 개인적인 맥락에서 이용.</strong> 이제 Google 다이얼러 통화 기록에서 사용자가 이전 통화 목록을 볼 때 업무용 연락처를 표시합니다. {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()}를 {@code true}로 설정하면 Google 다이얼러 통화 기록에서 업무용 프로필 연락처를 숨길 수 있습니다.
+
+
+ {@code DevicePolicyManager.setBluetoothContactSharingDisabled()}를 {@code false}로 설정했을 때에만 블루투스를 통해 기기에 업무용 연락처를 개인용 연락처와 함께 표시합니다.
+
+ 이것은 기본적으로 {@code true}로 설정되어 있습니다.
+
+</li>
+<li><strong>WiFi 구성 제거:</strong> 프로필 소유자가 추가한 WiFi 구성(예를 들어 {@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()} 메서드로의 호출을 통해)은 이제 해당 작업 프로필이 삭제되면 함께 제거됩니다.
+
+</li>
+<li><strong>WiFi 구성 잠금:</strong> 이제 활성 기기 소유자가 생성한 WiFi 구성이라면 사용자는 임의의 구성을 수정 또는 삭제할 수 없습니다.
+ 사용자는 여전히 본인의 WiFi 구성을 생성하고 수정할 수 있습니다. 해당 사용자에 대해 {@link android.os.UserManager} 상수 {@link android.os.UserManager#DISALLOW_CONFIG_WIFI}가 설정되지만 않았으면 됩니다.
+
+</li>
+<li><strong>Google 계정 추가를 통해 작업 정책 컨트롤러 다운로드:</strong> 작업 정책 컨트롤러(WPC) 앱을 통해 관리해야 하는 Google 계정이 관리된 맥락을 벗어나 기기에 추가되는 경우, 이제 추가 계정 흐름이 사용자에게 메시지를 표시하여 적절한 WPC를 설치하도록 합니다. 이 동작은 최초 기기 설정 마법사의 <strong>설정 > 계정</strong>을 통해서 추가되는 계정에도 적용됩니다.
+
+
+
+</li>
+<li><strong>특정 DevicePolicyManager API 동작에 적용된 변경:</strong> {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} 메서드를 호출하면 호출한 사용자에 대한 카메라에만 영향을 미칩니다. 이것을 관리된 프로필에서 호출하면 기본 사용자에서 실행 중인 카메라 앱에 영향을 미치지 않습니다.
+
+
+ 또한, 이제 {@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} 메서드를 기기 소유자뿐만 아니라 프로필 소유자에 대해서도 이용할 수 있습니다.
+
+ 프로필 소유자는 다음과 같은 키가드 제한 사항을 설정할 수 있습니다.
+
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 및 {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}를 설정하면 프로필의 상위 사용자에 대한 키가드 설정에 영향을 미칩니다.
+
+</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}를 설정하면 관리된 프로필에 있는 애플리케이션이 생성한 알림에만 영향을 미칩니다.
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd b/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..20c5232
--- /dev/null
+++ b/docs/html-intl/intl/ko/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=권한
+page.tags=previewresources, androidm
+page.keywords=권한, 런타임, 미리 보기
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>간략히 보기</h2>
+ <ul>
+ <li>앱이 M 미리 보기 SDK를 대상으로 하는 경우, 앱은 사용자에게 설치 시점이 아닌 런타임에 권한을 허용하도록 메시지를 표시합니다.
+</li>
+ <li>사용자는 앱 설정 화면에서 언제든 권한을 취소할 수 있습니다.
+</li>
+ <li>앱은 실행될 때마다 자신에게 필요한 권한이 있는지 확인해야 합니다.
+</li>
+ </ul>
+
+ <h2>이 문서의 내용</h2>
+ <ol>
+ <li><a href="#overview">개요</a></li>
+ <li><a href="#coding">런타임 권한에 대한 코딩</a></li>
+ <li><a href="#testing">런타임 권한 테스트</a></li>
+ <li><a href="#best-practices">모범 사례</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M 개발자 미리 보기에서는 새로운 앱 권한 모델을 소개하여 사용자가 앱을 설치하고 업그레이드하는 과정을 간소화할 수 있습니다.
+ M 미리 보기에서 실행되는 앱이 새 권한 모델을 지원하는 경우, 사용자가 앱을 설치하거나 업그레이드할 때 아무런 권한을 허용하지 않아도 됩니다. 그 대신, 앱이 필요할 때마다 권한을 요청하고 시스템이 사용자에게 해당 권한을 요청하는 대화창을 표시합니다.
+
+
+
+
+</p>
+
+<p>
+ 앱이 새 권한 모델을 지원하는 경우, Android 이전 버전을 실행하는 기기에서도 설치 및 실행할 수 있는 것은 변하지 않습니다. 이 경우, 그러한 기기의 기존 권한 모델을 사용합니다.
+
+
+</p>
+
+<h2 id="overview">
+ 개요
+</h2>
+
+<p>
+ M 개발자 미리 보기에서는 플랫폼에 새로운 권한 모델을 도입합니다.
+ 이 새로운 모델의 주요 구성 요소를 다음과 같이 요약해 보았습니다.
+</p>
+
+<ul>
+ <li>
+ <strong>권한 선언:</strong> 이전 Android 플랫폼에서와 같이 앱은 자신이 필요로 하는 권한을 모두 매니페스트에서 선언합니다.
+
+ </li>
+
+ <li>
+ <strong>권한 그룹:</strong> 권한은 각자의 기능을 기반으로 <em>권한 그룹</em>으로 나뉩니다.
+ 예를 들어 <code>CONTACTS</code> 권한 그룹에는 사용자의 연락처와 프로필 정보를 읽고 쓰는 데 필요한 권한이 들어있습니다.
+
+
+ </li>
+
+ <li>
+ <p><strong>설치 시점에 제한된 권한 허용:</strong> 사용자가 앱을 설치 또는 업데이트하면 시스템이 해당 앱에 앱이 요청하는 권한 중 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}에 포함되는 것을 모두 허용합니다.
+
+
+
+ 예를 들어 알람 시계와 인터넷 권한은 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}에 속하므로 이들 권한은 설치 시점에 자동으로 허용됩니다.
+
+
+ </p>
+
+ <p>시스템은 이외에도 앱 서명과 시스템 권한을 허용할 수도 있습니다. 이 내용은 <a href="#system-apps">시스템 앱 및 서명 권한</a>에 설명되어 있습니다.
+
+ 설치 시 사용자에게 권한을 허용하라는 메시지가 표시되지 <em>않습니다.</em>
+</p>
+ </li>
+
+ <li>
+ <strong>사용자가 런타임에 권한 허용:</strong> 앱이 권한을 요청하면, 시스템이 사용자에게 대화창을 표시한 다음 앱의 콜백 기능을 호출해 권한이 허용되었는지를 알려줍니다.
+
+ 사용자가 권한을 허용하는 경우, 앱에는 앱 매니페스트에서 선언한 해당 권한의 기능 영역에 관한 모든 권한이 부여됩니다.
+
+
+ </li>
+
+</ul>
+
+<p>
+ 이 권한 모델은 앱이 권한을 필요로 하는 기능에 대해 동작하는 방식을 바꾸어 놓습니다.
+ 다음은 이 모델에 적응하기 위한 몇 가지 개발 사례를 요약했습니다.
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>항상 권한을 확인:</strong> 앱이 권한을 필요로 하는 작업을 수행해야 할 때마다, 우선 앱에 해당 권한이 있는지 확인해야 합니다.
+
+ 권한이 없는 경우, 해당 권한을 허용해도록 요청합니다.
+
+ </li>
+
+ <li>
+ <strong>권한 부족을 안정적으로 처리:</strong> 앱이 적절한 권한을 허용받지 못하면, 실패를 깔끔하게 처리할 수 있어야 합니다.
+
+ 예를 들어 권한에 기능만 추가하면 되는 것이었다면, 앱이 해당 기능을 비활성화하면 됩니다.
+ 해당 권한이 앱이 제대로 기능하는 데 꼭 필요한 것이라면, 앱이 자신의 기능을 모두 비활성화하고 사용자에게 그 권한을 허용해야 한다고 알릴 수도 있습니다.
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>그림 1.</strong> 앱의 '설정'에 있는 권한 화면.
+ </p>
+ </div>
+
+ <li>
+ <strong>취소 가능한 권한:</strong> 사용자는 언제든 앱의 권한을 취소할 수 있습니다.
+ 사용자가 앱의 권한을 끄면 해당 앱에 그 사실을 알리지 <em>않습니다.</em>
+ 이런 경우, 앱이 제한된 작업을 수행하려면 필요한 권한이 있다는 점을 다시 확인해야 합니다.
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>참고:</strong> 앱이 M 개발자 미리 보기를 대상으로 하는 경우, <em>반드시</em> 새 권한 모델을 사용해야 합니다.
+
+</p>
+
+<p>
+ M 개발자 미리 보기 시작 시점에는 Google 앱 중에 새 권한 모델을 완전히 구현하지 않는 앱도 있습니다.
+ Google은 이러한 앱을 M 개발자 미리 보기를 시행하면서 시간을 두고 업데이트하여 권한 설정/해제 설정을 제대로 사용하도록 할 예정입니다.
+
+
+</p>
+
+<p class="note">
+ <strong>참고:</strong> 앱에 자체 API 표면이 있는 경우, 권한을 대리로 허가하기 전에 우선 발신자에게 해당 데이터에 액세스할 필수 권한이 있는지 확인해야 합니다.
+
+
+</p>
+
+<h3 id="system-apps">
+ 시스템 앱 및 서명 권한
+</h3>
+
+<p>
+ 보통 사용자가 앱을 설치하면 시스템이 앱에 {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}만 허용합니다.
+
+ 하지만 시스템이 앱에 더 많은 권한을 허용하는 경우도 몇 가지 있습니다.
+
+</p>
+
+<ul>
+ <li>앱이 시스템 이미지의 일부분인 경우, 이 앱의 매니페스트에 목록으로 표시된 권한을 자동으로 모두 허용합니다.
+
+ </li>
+
+ <li>앱이 매니페스트에서 권한을 요청했는데 그것이 {@link android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE}에 속하며 해당 앱이 그러한 권한을 선언한 앱과 같은 인증서로 서명되어 있는 경우, 시스템은 요청하는 앱을 설치할 때 그러한 권한을 허용합니다.
+
+
+
+
+ </li>
+</ul>
+
+<p>
+ 두 가지 경우 모두, 사용자가 언제든 권한을 취소할 수 있는 것은 변하지 않습니다. 시스템의 <strong>설정</strong> 화면으로 이동하여 <strong>앱 ></strong>
+
+ <i>app_name</i> <strong>> 권한</strong>을 선택하면 됩니다. 이 앱은 계속해서 런타임에 권한을 확인하고 필요한 경우 해당 권한을 요청해야 합니다.
+
+
+</p>
+
+<h3 id="compatibility">
+ 이전 및 이후 버전과의 호환성
+</h3>
+
+<p>
+ 앱이 M 개발자 미리 보기를 대상으로 하지 않더라도, 앱은 M 미리 보기 기기에서도 기존 권한 모델을 계속 사용합니다.
+ 사용자가 앱을 설치하면 시스템이 사용자에게 앱의 매니페스트에 목록으로 표시된 권한을 모두 허용하도록 요청합니다.
+
+
+</p>
+
+<p class="note">
+ <strong>참고:</strong> M 개발자 미리 보기를 실행하는 기기에서는 사용자가 어느 앱에 대해서든(레거시 앱 포함) 앱의 설정 화면에서 권한을 끌 수 있습니다.
+
+ 사용자가 레거시 앱에 대한 권한을 끄면, 시스템이 자동으로 적절한 기능을 비활성화합니다.
+ 앱이 해당 권한을 필요로 하는 작업을 수행하려 시도한다고 해도 그 작업이 반드시 예외를 발생시키는 것은 아닙니다.
+
+ 그 대신에 빈 데이터 세트를 반환하거나 오류를 신호하거나, 기타 예기치 못한 동작을 선보일 수 있습니다.
+ 예를 들어 권한 없이 캘린더를 쿼리하면 해당 메서드가 빈 데이터 세트를 반환합니다.
+
+</p>
+
+<p>
+ M 미리 보기를 실행하지 않는 기기에서 새 권한 모델을 사용하는 앱을 설치하면 시스템은 해당 앱을 다른 앱과 똑같이 다룹니다. 즉, 설치 시점에 시스템에 사용자에게 선언된 권한 모두를 허용하도록 요청합니다.
+
+
+
+</p>
+
+<p class="note">
+ <strong>참고:</strong> 미리 보기 릴리스에서는 최소 SDK 버전을 M 미리 보기 SDK로 설정해야 미리 보기 SDK와 컴파일할 수 있습니다.
+ 즉, 개발자 미리 보기 시행 중에는 그러한 앱을 기존 플랫폼에서 테스트할 수 없다는 뜻입니다.
+
+
+</p>
+
+<h3 id="perms-vs-intents">권한과 인텐트 비교</h3>
+
+<p>
+ 대부분의 경우, 앱에게 어떤 작업을 수행하도록 하려면 두 가지 방식 중 하나를 선택할 수 있습니다.
+ 첫째로 앱이 작업을 직접 수행하도록 권한을 요청할 수 있습니다.
+ 또는, 앱에 인텐트를 사용하도록 하여 또 다른 앱이 해당 작업을 수행하도록 할 수 있습니다.
+
+</p>
+
+<p>
+ 예를 들어 앱이 기기 카메라로 사진을 촬영할 수 있어야 한다고 가정합시다.
+ 그러면 앱은 <code>android.permission.CAMERA</code> 권한을 요청할 수 있습니다. 이렇게 하면 앱이 카메라에 직접 액세스할 수 있습니다.
+
+ 그런 다음 앱이 카메라 API를 사용하여 카메라를 제어하고 사진을 촬영합니다.
+ 이 방식을 사용하면 앱에 사진 촬영 과정에 대해 완전한 제어권을 부여하고, 카메라 UI를 앱에 통합할 수 있습니다.
+
+
+</p>
+
+<p>
+ 하지만, 그러한 제어권이 필요하지 않은 경우라면 그저 {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 인텐트를 사용해 이미지를 요청하면 됩니다.
+
+ 이 인텐트를 시작하면 사용자에게 카메라 앱을 선택하라는 메시지가 표시되고(기본 카메라 앱이 이미 있는 경우) 그 앱이 사진을 촬영합니다.
+
+ 이 카메라 앱은 촬영한 사진을 개발자의 앱의 {@link android.app.Activity#onActivityResult onActivityResult()} 메서드에 반환합니다.
+
+</p>
+
+<p>
+ 이와 마찬가지로, 전화를 걸어야 하거나 사용자의 연락처에 액세스해야 하는 경우 등에는 적절한 인텐트를 만들거나 적절한 객체에 직접 액세스하도록 권한을 요청할 수 있습니다.
+
+ 이 두 가지 방식에는 각각 장단점이 있습니다.
+
+</p>
+
+<p>
+ 권한을 사용하는 경우:
+</p>
+
+<ul>
+ <li>개발자가 직접 작업을 수행하는 경우 본인의 앱이 사용자 환경을 완전히 제어합니다.
+ 다만, 그렇게 포괄적인 제어권을 가지면 적절한 UI를 디자인해야 하므로 작업이 복잡해집니다.
+
+ </li>
+
+ <li>사용자에게 권한을 부여하라는 메시지는 작업을 처음 수행할 때만 표시됩니다.
+ 그 다음부터는 앱이 사용자로부터 더 이상의 상호작용을 요청하지 않아도 작업을 수행할 수 있습니다.
+ 다만, 사용자가 해당 권한을 허용하지 않는 경우(또는 나중에 취소하는 경우), 앱은 해당 작업을 수행할 수 없게 됩니다.
+
+
+ </li>
+</ul>
+
+<p>
+ 인텐트를 사용하는 경우:
+</p>
+
+<ul>
+ <li>작업을 위해 UI를 디자인하지 않아도 됩니다. 이는 인텐트를 처리하는 앱이 UI를 제공하기 때문입니다. 하지만, 이것은 즉 개발자에게 사용자 환경에 대한 제어권이 전혀 없다는 뜻이기도 합니다.
+
+ 사용자는 어쩌면 개발자가 본 적도 없는 앱과 상호작용하고 있을지 모릅니다.
+
+ </li>
+
+ <li>사용자에게 해당 작업에 대한 기본 앱이 없는 경우, 시스템은 사용자에게 앱을 선택하라는 메시지를 표시합니다. 사용자가 기본 처리기를 지정하지 않으면 해당 작업을 수행할 때마다 추가 대화창을 거쳐야 할 수도 있습니다.
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">런타임 권한에 대한 코딩</h2>
+
+<p>
+ 새로운 M 개발자 미리 보기를 대상으로 앱을 개발하는 경우, 새 권한 모델을 사용해야 합니다.
+ 이는 즉, 매니페스트에 필요한 권한을 선언하는 것 말고도 런타임에 자신이 해당 권한을 가지고 있는지도 확인해야 하며, 그러한 권한을 이미 가지고 있지 않으면 권한을 요청해야 한다는 뜻입니다.
+
+
+
+</p>
+
+<h3 id="enabling">
+ 새 권한 모델 활성화하기
+</h3>
+
+<p>
+ 새로운 M 개발자 미리 보기 권한 모델을 활성화하려면 앱의 <code>targetSdkVersion</code> 특성을 <code>"MNC"</code>로 설정하고, <code>compileSdkVersion</code>은 <code>"android-MNC"</code>로 설정하세요.
+
+ 이렇게 하면 새 권한 기능이 모두 활성화됩니다.
+
+</p>
+
+<p>
+ 미리 보기 릴리스에서는 <code>minSdkVersion</code>을 <code>"MNC"</code>로 설정해야만 미리 보기 SDK와 컴파일할 수 있습니다.
+
+</p>
+
+<h3 id="m-only-perm">
+ M 미리 보기 전용 권한 지정하기
+</h3>
+
+<p>
+ 새 <code><uses-permission-sdk-m></code> 요소를 앱 매니페스트에 사용하여 권한이 M 개발자 미리 보기에서만 필요하다는 것을 나타낼 수 있습니다.
+ 권한을 이런 식으로 선언하면 앱이 이전 버전의 기기에 설치될 때마다 시스템에서 사용자에게 메시지를 표시하지도 않고 앱에 권한을 허용하지도 않습니다. <code><uses-permission-sdk-m></code> 요소를 사용하면 새 권한을 앱의 업데이트된 버전에 추가하면서도 사용자가 업데이트를 설치할 때 권한을 허용하라고 강제로 시키지 않아도 됩니다.
+
+
+
+
+
+
+</p>
+
+<p>
+ 앱이 M 개발자 미리 보기를 갖춘 기기에서 실행되는 경우, <code><uses-permission-sdk-m></code>은 <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>과 똑같이 동작합니다.
+
+
+ 시스템은 사용자가 앱을 설치할 때 권한을 허용하라는 메시지를 표시하지 않고, 앱이 필요할 때마다 권한을 요청하게 됩니다.
+
+</p>
+
+<h3 id="prompting">
+ 권한에 대한 메시지 표시하기
+</h3>
+
+<p>
+ 앱이 새로운 M 개발자 미리 보기 권한 모델을 사용하는 경우, 앱이 M 미리 보기에서 실행되는 기기에서 처음 시작되었을 때 사용자에게 모든 권한을 허용하도록 요청하지 않습니다.
+
+ 대신, 앱은 필요할 때마다 권한을 요청합니다.
+ 앱이 권한을 요청하면 시스템이 사용자에게 대화창으로 표시합니다.
+
+</p>
+
+<p>
+ 앱이 SDK 22 이하를 탑재한 기기에서 실행되는 경우, 앱은 기존 권한 모델을 사용합니다.
+ 사용자가 앱을 설치하면 앱이 자신의 매니페스트에서 요청하는 모든 권한을 허용하라는 메시지가 표시되는데, 이때 <code><uses-permission-sdk-m></code>이라는 레이블이 붙은 권한은 예외입니다.
+
+
+</p>
+
+<h4 id="check-platform">앱이 실행되는 플랫폼 확인</h4>
+
+<p>
+ 이 권한 모델은 M 개발자 미리 보기를 실행하는 기기에서만 지원됩니다.
+ 이러한 메서드 중에서 호출하려면 앱은 우선 {@link android.os.Build.VERSION#CODENAME Build.VERSION.CODENAME} 값을 확인하여 자신이 어느 플랫폼에서 실행 중인지 확인해야 합니다.
+
+
+ 기기가 M 개발자 미리 보기에서 실행 중인 경우, {@link android.os.Build.VERSION#CODENAME CODENAME}은 <code>"MNC"</code>입니다.
+
+</p>
+
+<h4 id="check-for-permission">앱에 필요한 권한이 있는지 확인</h4>
+
+<p>사용자가 권한을 필요로 하는 무언가를 하려고 시도하면, 앱은 자신이 현재 이 작업을 수행하는 데 필요한 권한을 가지고 있는지 확인합니다.
+ 이렇게 하기 위해 앱은 <code>Context.checkSelfPermission( )</code>을 호출합니다.
+
+<i>permission_name</i> 사용자가 앱의 권한을 언제든 취소할 수 있기 때문에 앱은 사용자가 해당 권한을 이미 허용했다는 것을 알고 있더라도 확인 작업을 수행해야 합니다.
+
+
+ 예를 들어, 사용자가 사진 촬영 앱을 사용하고자 한다면 앱은 <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>를 호출합니다.
+
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>표 1.</strong> 권한과 권한 그룹.</p>
+<table>
+ <tr>
+ <th scope="col">권한 그룹</th>
+ <th scope="col">권한</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">필요한 경우 권한 요청</h4>
+
+<p>앱이 자신에게 필요한 권한을 이미 가지고 있지 않은 경우, 앱은 <code>Activity.requestPermissions(String[], int)</code> 메서드를 호출하여 적절한 권한(여러 개일 수 있음)을 요청합니다.
+
+ 앱은 원하는 권한을 요청하면서 정수 "요청 코드"를 요청합니다.
+
+ 이 메서드는 비동기화 방식으로 기능합니다. 이는 즉각적으로 반환되며, 사용자가 대화 상자에 응답한 다음에는 시스템이 결과를 가지고 앱의 콜백 메서드를 호출하여 앱이 <code>requestPermissions()</code>에 전달한 "요청 코드"와 같은 코드를 전달합니다.
+
+
+</p>
+
+ <p>다음 코드는 앱에 사용자의 연락처를 읽을 권한이 있는지 코드 확인을 하고, 필요한 경우 해당 권한을 요청합니다.
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">권한 요청 응답 처리하기</h4>
+
+<p>
+ 앱이 권한을 요청하면 시스템이 사용자에게 대화 상자를 표시합니다.
+ 사용자가 응답하면 시스템은 앱의 <code>Activity.onRequestPermissionsResult(int, String[], int[])</code>를 불러내 이를 사용자 응답에 전달합니다.
+
+ 앱은 해당 메서드를 재정의해야 합니다. 이 콜백에는 개발자가 <code>requestPermissions()</code>에 전달한 것과 같은 요청 코드가 전달됩니다.
+
+ 예를 들어 어느 앱이 <code>READ_CONTACTS</code> 액세스를 요청한다면 다음과 같은 콜백 메서드를 가지고 있을 수 있습니다.
+
+
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>사용자가 권한을 허용하면 시스템은 앱 매니페스트에 그 기능 영역에 대해 목록으로 표시된 모든 권한을 해당 앱에 부여합니다.
+ 사용자가 요청을 거부하면 적절한 조치를 취해야 합니다.
+ 예를 들어 이 권한에 좌우되는 메뉴 작업을 모두 비활성화할 수 있습니다.
+
+ </li>
+</p>
+
+<p>
+ 시스템이 사용자에게 권한을 허용하도록 요청하면 사용자에게는 시스템에 해당 권한을 다시 요청하지 말라고 지시할 선택권이 있습니다.
+ 그런 경우, 앱이 해당 권한을 요청하기 위해 <code>requestPermissions()</code>를 사용하면 시스템이 즉시 요청을 거부합니다.
+
+ 이 경우 시스템은 사용자가 명시적으로 개발자의 요청을 다시 거부한 것처럼 <code>onRequestPermissionsResult()</code>를 호출합니다.
+
+ 이러한 이유로, 앱은 사용자와의 직접적인 상호작용이 일어났다고 가정해서는 안 됩니다.
+
+</p>
+
+<h2 id="testing">런타임 권한 테스트</h2>
+
+
+<p>
+ M 개발자 미리 보기를 대상으로 삼고 앱을 개발하는 경우, 이 앱이 권한을 적절하게 처리하는지 테스트해보아야 합니다.
+ 앱이 실행될 때 특정 권한을 가지고 있다고 가정해서는 안 됩니다.
+ 앱을 처음 시작할 때에는 아무런 권한도 없을 가능성이 높고, 사용자가 언제든 권한을 취소하거나 복원할 수 있기 때문입니다.
+
+
+</p>
+
+<p>
+ 앱을 테스트하여 모든 권한 관련 상황에서 제대로 작동하는지 확인하는 것이 좋습니다.
+ M 미리 보기 SDK에서는 새로운 <a href="{@docRoot}tools/help/adb.html">Android 디버그 브리지(adb)</a> 명령을 제공하여 여러분이 시도해 보아야 하는 권한 설정이 무엇이든 앱을 테스트할 수 있도록 하였습니다.
+
+
+
+</p>
+
+<h3>
+ 새로운 adb 명령 및 선택 사항
+</h3>
+
+<p>
+ M 미리 보기 SDK 플랫폼 도구에서는 여러 가지 새로운 명령을 제공하여 앱이 권한을 처리하는 방식을 테스트해볼 수 있습니다.
+
+</p>
+
+<h4>
+ 권한으로 설치
+</h4>
+
+<p>
+ <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a> 명령의 새로운 <code>-g</code> 선택 항목을 사용하면 앱을 설치하고 해당 앱의 매니페스트에 목록으로 표시된 모든 권한을 허용합니다.
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ 권한 허용 및 취소
+</h4>
+
+<p>
+ 새로운 ADB <a href="{@docRoot}tools/help/adb.html#pm">패키지 관리자(pm)</a> 명령을 사용하면 설치된 앱에 권한을 허용하고 취소할 수 있습니다. 이 기능은 자동화 설정에서 유용하게 쓰일 수 있습니다.
+
+
+</p>
+
+<p>
+ 권한을 허용하려면, 패키지 관리자의 <code>grant</code> 명령을 사용하세요.
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ 예를 들어 com.example.myapp 패키지 권한을 허용하여 오디오를 녹음하려면 이 명령을 사용하면 됩니다.
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ 권한을 취소하려면, 패키지 관리자의 <code>revoke</code> 명령을 사용하세요.
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">모범 사례</h2>
+
+<p>
+ 새 권한 모델을 사용하면 사용자에게 보다 원활한 환경을 제공하고, 앱을 더욱 쉽게 설치하며 앱이 어떤 작업을 하고 있는지 바로 확인할 수 있습니다.
+
+ 새 모델의 장점을 최대한 활용할 수 있도록 다음과 같은 모범 사례를 추천해 드립니다.
+
+</p>
+
+
+<h3 id="bp-what-you-need">필요한 권한만 요청</h3>
+
+<p>
+ 권한을 요청할 때마다 사용자에게는 결정을 내리라는 강요를 하는 셈입니다.
+ 사용자가 요청을 거절하면 앱의 기능이 저하됩니다.
+ 때문에 이러한 요청을 하는 횟수를 최소한으로 줄이는 것이 좋습니다.
+</p>
+
+<p>
+ 예를 들어 앱이 권한을 요청하는 대신 <a href="{@docRoot}guide/components/intents-filters.html">인텐트</a>를 사용해 필요한 기능을 얻을 수 있는 경우도 꽤 많습니다.
+
+ 앱이 전화기의 카메라를 사용해 사진을 촬영해야 하는 경우, 앱은 {@link android.provider.MediaStore#ACTION_IMAGE_CAPTURE MediaStore.ACTION_IMAGE_CAPTURE} 인텐트를 사용할 수 있습니다.
+
+
+ 앱이 인텐트를 실행하면 시스템이 사용자에게 메시지를 표시해 이미 설치된 카메라 앱을 선택하여 사진을 촬영하도록 합니다.
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ 사용자에게 부담을 주지 말 것
+</h3>
+
+<p>
+ 사용자에게 엄청나게 많은 수의 권한 요청을 한꺼번에 들이밀면 사용자가 부담을 느끼고 앱을 종료해버리는 결과를 초래할 수 있습니다. 대신 권한이 필요할 때마다 요청하는 것이 좋습니다.
+
+
+</p>
+
+<p>
+ 일부 경우에는 앱에 절대적으로 꼭 필요한 권한이 한 개 이상 있을 수도 있습니다. 그런 경우에는 앱이 시작되자마자 해당 권한을 모두 요청하는 것을 권장합니다.
+
+ 예를 들어 사진 앱을 만들면 앱이 기기 카메라로 액세스할 수 있는 권한이 필요합니다.
+ 사용자가 앱을 처음으로 시작할 때 카메라를 사용할 권한을 요청받아도 놀라지는 않을 것입니다.
+
+ 하지만 같은 앱에 사용자의 연락처과 사진을 공유하는 기능도 있다고 가정한다면 이 경우 해당 권한을 첫 시작 시점에 요청하는 것은 별로 권장할 만한 일이 <em>아닙니다.</em>
+
+ 대신, 사용자가 "공유" 기능을 요청하려 할 때까지 기다렸다가 그 때 해당 권한을 요청하면 됩니다.
+
+</p>
+
+<p>
+ 앱이 튜토리얼을 제공하는 경우, 튜토리얼 시퀀스가 다 끝날 무렵에 앱의 필수 권한을 요청하는 것이 이치에 맞을 수 있습니다.
+
+</p>
+
+<h3 id="bp-explain">
+ 권한이 필요한 이유 설명
+</h3>
+
+<p>
+ 개발자가 <code>requestPermissions()</code>를 호출하면 시스템이 표시하는 권한 대화창에는 앱이 원하는 권한이 무엇인지는 나타나 있지만 그것이 필요한 이유는 설명하지 않습니다.
+
+ 사용자가 이런 것을 의아하게 여기는 경우가 있을 수 있습니다.
+ 우선 사용자에게 앱이 왜 그런 권한을 원하는지 설명한 다음 <code>requestPermissions()</code>를 호출하는 것이 좋습니다.
+
+</p>
+
+<p>
+ 예를 들어 사진 앱인 경우 위치 서비스를 이용하고자 할 수 있습니다. 그래야 사진에 지오태그를 표시할 수 있기 때문입니다.
+ 일반적인 사용자는 사진에 위치 정보를 담을 수 있다는 점을 모를 수도 있고, 그러면 사진 앱이 왜 위치를 알고 싶어 하는지 의아하게 여길 수 있습니다.
+
+ 그러므로 이런 경우에는 앱이 사용자에게 이런 기능에 대해 <em>미리</em> 알려드린 후 <code>requestPermissions()</code>를 호출하는 것이 좋습니다.
+
+
+</p>
+
+<p>
+ 이를 수행하기 위한 한 가지 방법은 이러한 요청을 앱 튜토리얼에 넣는 것입니다. 튜토리얼에는 앱의 각 기능을 표시할 수 있고, 그러면서 어느 권한이 필요한지 설명할 수도 있기 때문입니다.
+
+ 예를 들어 사진 앱의 튜토리얼에서 "연락처 목록의 지인들과 사진 공유" 기능을 시연한 다음 사용자에게 앱이 사용자의 연락처를 보려면 권한을 부여해야 한다고 알리면 됩니다.
+
+
+ 그런 다음, 앱이 <code>requestPermissions()</code>를 호출하여 사용자에게 해당 액세스를 요청합니다.
+ 물론 튜토리얼을 따르지 않는 사용자도 있게 마련이므로 앱의 정상 작동 중에 권한을 확인하고 요청해야 합니다.
+
+
+</p>
diff --git a/docs/html-intl/intl/ko/preview/overview.jd b/docs/html-intl/intl/ko/preview/overview.jd
new file mode 100644
index 0000000..d325725
--- /dev/null
+++ b/docs/html-intl/intl/ko/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=프로그램 개요
+page.metaDescription=Android M 개발자 미리 보기를 시작하신 여러분, 환영합니다. 이 프로그램은 Android의 다음 버전에 대해 앱을 테스트하고 최적화하는 데 필요한 모든 것을 제공해 드립니다.
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ <strong>Android M 개발자 미리 보기</strong>를 시작하신 여러분, 환영합니다. 이 프로그램은 Android의 다음 버전에 대해 앱을 테스트하고 최적화하는 데 필요한 모든 것을 제공해 드립니다.
+
+ 이 프로그램은 무료이며, M 개발자 미리 보기 도구만 다운로드하면 시작하실 수 있습니다.
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ 하드웨어 및 에뮬레이터 시스템 이미지
+ </h5>
+
+ <p>
+ Nexus 5, 6, 9, Player(TV용)와 에뮬레이터에서 앱을 실행하고 테스트해 보세요.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 최신 플랫폼 코드
+ </h5>
+
+ <p>
+ 미리 보기 시행 중에 여러 번의 업데이트를 제공할 예정입니다. 이로써 여러분은 항상 최신 플랫폼 변경에 대해 테스트할 수 있습니다.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 업데이트를 OTA로 전달
+ </h5>
+
+ <p>
+ 일단 기기를 최초 미리 보기에 플래시하고 나면 OTA로 업데이트를 받을 수 있습니다.
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ 새 동작 및 기능
+ </h5>
+
+ <p>
+ 작업을 일찍 시작하여 새 런타임 권한 모델과 절전 기능 등 새로운 플랫폼 동작을 지원합니다.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 개발자가 보고한 문제에 대한 우선 순위 창
+ </h5>
+
+ <p>
+ Google에서는 처음 몇 주 동안 개발자가 보고한 문제에 우선 순위를 부여할 예정입니다. 가능한 빨리 테스트하고 피드백을 보내 주세요.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 피드백 및 지원
+ </h5>
+
+ <p>
+ 문제를 보고하고 Google의 <a href="https://code.google.com/p/android-developer-preview/">문제 추적기</a>를 사용해 피드백을 보내 주세요.
+ <a href="http://g.co/dev/AndroidMDevPreview">M 개발자 커뮤니티</a>를 이용하면 다른 개발자들과 의견을 주고받을 수 있습니다.
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ 일정 및 업데이트
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M 개발자 미리 보기는 5월 28일부터 최종 Android M SDK가 출시될 때까지 실행됩니다. 최종 버전은 2015년 3사분기 중으로 예정된 공개 릴리스 직전에 출시할 계획입니다.
+
+
+</p>
+
+<p>
+ 개발 중 중요 단계에 다다를 때마다 여러분의 테스트 기기를 위해 업데이트를 전달해 드리겠습니다.
+ 잠정적인 중요 단계는 다음과 같습니다.
+</p>
+
+<ul>
+ <li>
+ <strong>미리 보기 1</strong>(최초 미리 보기 릴리스, 5월 말)
+ </li>
+
+ <li>
+ <strong>미리 보기 2</strong>(6월 말/7월 초)
+ </li>
+
+ <li>
+ <strong>미리 보기 3</strong>(최종 버전 출시 직전, 7월 말)
+ </li>
+</ul>
+
+<p>
+ 이러한 업데이트는 <strong>최종 SDK</strong>(3사분기 후반)로 막을 내릴 것이며, 이것으로 Android 새 버전에 대한 공식 API뿐만 아니라 최종 시스템 동작 및 기능도 제공하게 됩니다.
+
+
+</p>
+
+<p>
+ Android M에서 테스트와 개발을 수행하는 동안 미리 보기 업데이트가 출시되는 것에 맞춰 <strong>개발 환경을 최신 상태로 유지</strong>할 것을 강력히 권장합니다.
+
+ 이 과정을 보다 단순화하기 위해 이미 미리 보기 빌드에 플래시한 기기에는 <strong>OTA(over-the-air) 업데이트</strong>를 제공할 예정이며, 이외에도 수동으로 다운로드하고 플래시할 수 있는 시스템 이미지도 제공할 계획입니다.
+
+
+</p>
+<p class="note">
+ <strong>참고:</strong> 최종 SDK와 시스템 이미지는 OTA로 전달할 수 없습니다. 그 대신 개발자 본인의 테스트 기기에서 <strong>수동으로 플래시</strong>해야 합니다.</strong>
+
+
+</p>
+
+<p>
+ 미리 보기 업데이트를 이용할 수 있게 될 때마다 <a href="http://android-developers.blogspot.com/">Android 개발자 블로그</a>, 해당 사이트 및 <a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>를 통해서 알려드릴 것입니다.
+
+
+</p>
+
+<h2 id="preview_tools">
+ 미리 보기 내용
+</h2>
+
+<p>
+ M 개발자 미리 보기에는 기존 앱을 여러 가지 화면 크기, 네트워크 기술, CPU/GPU 칩세트 및 하드웨어 아키텍처에서 테스트하는 데 필요한 모든 것이 포함되어 있습니다.
+
+
+</p>
+
+<h4>
+ SDK 도구
+</h4>
+
+<p>
+ 이러한 구성 요소는 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>에서 SDK Manager를 통해 다운로드할 수 있습니다.
+</p>
+
+<ul>
+ <li>M 개발자 미리 보기 <strong>SDK 도구</strong>
+ </li>
+
+ <li>M 개발자 미리 보기 <strong>에뮬레이터 시스템 이미지</strong>(32비트 및 64비트)
+
+ </li>
+
+ <li>M 개발자 미리 보기 <strong>Android TV용 에뮬레이터 시스템 이미지</strong>(32비트)
+
+ </li>
+</ul>
+
+<h4>
+ 하드웨어 시스템 이미지
+</h4>
+
+<p>
+ Nexus 기기에 대한 다음과 같은 하드웨어 시스템 이미지는 <a href="download.html">다운로드 페이지</a>에서 다운로드할 수 있습니다.
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong>(GSM/LTE) “hammerhead” 기기 시스템 이미지
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> “shamu” 기기 시스템 이미지
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong>(Wi-Fi) “volantis” 기기 시스템 이미지
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong>(Android TV) “fugu” 기기 시스템 이미지
+ </li>
+</ul>
+
+<h4>
+ 관련 문서 및 샘플 코드
+</h4>
+
+<p>
+ 다음과 같은 관련 문서 리소스는 미리 보기에 대해 익히는 데 유용합니다.
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">SDK 설정</a>에는 시작하는 데 필요한 단계별 지침이 들어 있습니다.
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">테스트 가이드</a>와 <a href="behavior-changes.html">동작 변경</a>에서는 테스트해야 할 주요 영역을 알려줍니다.
+ </li>
+
+ <li>새 API 관련 문서 중에서 <a href="api-overview.html">API 개요</a>, 다운로드할 수 있는 <a href="{@docRoot}preview/download.html#docs">API 참조</a>와 자세한 개발자 가이드(<a href="{@docRoot}preview/features/runtime-permissions.html">권한</a>, <a href="{@docRoot}preview/backup/index.html">앱 백업</a> 등 주요 기능에 대한 내용)도 참조하세요.
+
+
+
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">샘플 코드</a>는 권한과 기타 새로운 기능을 지원하는 방법을 설명합니다.
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/support.html#release-notes">릴리스 노트</a>를 보면 M 개발자 미리 보기의 현재 버전에 대해 변경 내용 참고 사항과 차이점 보고서 등 관련 정보를 확인할 수 있습니다.
+
+ </li>
+</ul>
+
+<h4>
+ 지원 리소스
+</h4>
+
+<p>
+ M 개발자 미리 보기에서 테스트하고 개발하는 데 유용한 지원 리소스를 소개합니다.
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">M 개발자 미리 보기 문제 추적기</a>가 여러분의 <strong>기본 피드백 채널</strong>입니다.
+
+ 문제 추적기를 통해 버그와 성능 문제를 보고하고 전반적인 피드백을 주시면 됩니다.
+ 이를 통해 <a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">알려진 문제</a>를 확인하고 해결 방법 단계를 찾아볼 수도 있습니다.
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>는 일종의 Google+ 커뮤니티로, 여기에서 여러분은 Android M을 가지고 작업하는 <strong>다른 개발자들과 이야기</strong>를 나눌 수 있습니다. 서로의 의견이나 아이디어를 나누고 Android M 관련 질문에 대한 대답을 찾을 수도 있습니다.
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ 대상 지정, 미리 보기 API 및 게시
+</h2>
+
+<p>
+ Android M 개발자 미리 보기는 개발 전용 릴리스이며 <strong>표준 API 레벨이 없습니다</strong>.
+ 앱을 테스트하기 위해 호환성 동작에서 옵트아웃하고자 하는 경우(강력히 권장함), M 개발자 미리 보기를 대상으로 지정하면 됩니다. 앱의 <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>을 <code>“MNC”</code>로 지정하세요.
+
+
+
+</p>
+
+<p>
+ Android M 개발자 미리 보기에서는 <strong>미리 보기 API</strong>를 제공합니다. —이 API는 최종 SDK가 출시될 때까지 공식적인 버전으로 인정되지 않습니다. 최종 SDK 릴리스는 현재 2015년 삼사분기 무렵으로 예정되어 있습니다.
+
+ 이는 즉, 시간이 지나면서 <strong>사소한 API 변경</strong>이 있을 것이라는 점을 예상해야 한다는 뜻입니다. 특히 프로그램 초반 몇 주 동안은 유의해야 합니다.
+
+ Android M 개발자 미리 보기를 업데이트할 때마다 변경 내용을 요약해서 제공해 드릴 것입니다.
+
+</p>
+
+<p class="note">
+ 미리 보기 API는 변경될 수 있지만, 런타임 권한과 절전 기능과 같은 기본 시스템 동작은 안정적이며 지금 바로 테스트 가능한 상태입니다.
+
+
+</p>
+
+<p>
+ 게시에 관해서는, Google Play에서는 <strong>M 개발자 미리 보기를 대상으로 삼는 앱의 게시를 방지합니다.</strong>
+ Android M 최종 SDK를 이용할 수 있게 되면 공식 Android M API 레벨을 대상으로 지정할 수 있고, 그때 Google Play에 앱을 게시하면 됩니다.
+
+ 그때까지는 테스터들에게 Android M을 대상으로 지정한 앱을 배포하고자 하는 경우 이메일이나 본인의 사이트에서 직접 다운로드를 통해 하시면 됩니다.
+
+
+</p>
+
+<h2 id="get_started">
+ 시작 방법
+</h2>
+
+<p>
+ 앱 테스트를 시작하려면
+</p>
+
+<ol>
+ <li><a href="{@docRoot}preview/api-overview.html">API 개요</a>와 <a href="{@docRoot}preview/behavior-changes.html">동작 변경</a>을 검토해 새로운 내용과 이것이 본인의 앱에 미치는 영향에 대해 알고 있어야 합니다.
+
+ 특히, 새로운 <a href="{@docRoot}preview/features/runtime-permissions.html">런타임 권한</a> 모델, 절전 기능과 자동 백업에 대해 숙지하는 것이 좋습니다.
+
+
+ </li>
+
+ <li>환경을 설정할 때에는 <a href="{@docRoot}preview/setup-sdk.html">미리 보기 SDK 설정</a>과 테스트 기기를 구성하는 데 관련된 지침을 따르세요.
+
+
+ </li>
+
+ <li><a href="https://developers.google.com/android/nexus/images">플래시 지침</a>을 따라 최신 M 개발자 미리 보기 시스템 이미지를 Nexus 5, 6, 9 및 Player에 플래시하세요.
+
+ 일단 개발 기기를 플래시하고 나면, 미리 보기 업데이트가 OTA(over-the-air) 업데이트를 통해 전달됩니다.</a>
+
+ </li>
+
+ <li><a href="{@docRoot}preview/download.html#docs">M 미리 보기 API 참조</a>와 <a href="{@docRoot}preview/samples.html">M 미리 보기 샘플</a>을 다운로드하면 새로운 API 기능과 앱에서 그러한 기능을 사용하는 방법에 대해 좀 더 자세히 파악할 수 있습니다.
+
+
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 개발자 커뮤니티</a>에 가입하여 최신 소식을 알아보고, 새 플랫폼으로 작업하는 다른 개발자들과 이야기를 나눠보세요.
+
+
+ </li>
+</ol>
+
+<p>
+ Android M 개발자 미리 보기 프로그램에 참가해 주셔서 대단히 감사합니다!
+</p>
diff --git a/docs/html-intl/intl/pt-br/preview/api-overview.jd b/docs/html-intl/intl/pt-br/preview/api-overview.jd
new file mode 100644
index 0000000..33e8c1f
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=Visão geral da API
+page.keywords=preview,sdk,compatibility
+page.tags=previewresources, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Neste documento
+ <a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">mostrar mais</span>
+ <span class="less" style="display:none">mostrar menos</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">Vínculo de aplicativo</a></li>
+ <li><a href="#backup">Backup automático para aplicativos</a></li>
+ <li><a href="#authentication">Autenticação</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">Autenticação com impressão digital</a></li>
+ <li><a href="#confirm-credential">Confirmação de credencial</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">Compartilhamento direto</a></li>
+ <li><a href="#voice-interactions">Interações por voz</a></li>
+ <li><a href="#assist">Auxiliar API</a></li>
+ <li><a href="#notifications">Notificações</a></li>
+ <li><a href="#bluetooth-stylus">Suporte para Bluetooth Stylus</a></li>
+ <li><a href="#ble-scanning">Digitalização de baixa energia por Bluetooth aprimorada</a></li>
+ <li><a href="#hotspot">Suporte a Hotspot 2.0 Release 1</a></li>
+ <li><a href="#4K-display">Modo de exibição 4K</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">ColorStateLists com tema</a></li>
+ <li><a href="#audio">Recursos de áudio</a></li>
+ <li><a href="#video">Recursos de vídeo</a></li>
+ <li><a href="#camera">Recursos de câmera</a>
+ <ol>
+ <li><a href="#flashlight">API da lanterna</a></li>
+ <li><a href="#reprocessing">Reprocessamento da câmera</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Recursos do Android for Work</a></li>
+</ol>
+
+<h2>Diferenças de API</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API de nível 22 para M Preview »</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>O M Developer Preview fornece uma visualização avançada no próximo lançamento
+ para a plataforma Android, oferecendo novos recursos para desenvolvedores e usuários
+de aplicativos. Este documento fornece uma introdução às APIs mais notáveis.</p>
+
+<p>O M Developer Preview foi feito para <strong>novos desenvolvedores
+adotantes</strong> e <strong>testadores</strong>. Caso tenha interesse
+ em influenciar a direção da estrutura do Android,
+<a href="{@docRoot}preview/setup-sdk.html">experimente o M Developer
+ Preview</a> e envie-nos feedback!</p>
+
+<p class="caution"><strong>Cuidado:</strong> não publique aplicativos
+que usam o M Developer Preview na Google Play Store.</p>
+
+<p class="note"><strong>Observação:</strong> este documento frequentemente
+menciona classes e métodos que ainda não possuem material de referência disponível em <a href="{@docRoot}">developer.android.com</a>. Esses elementos de API
+são formatados em {@code code style} neste documento (sem hyperlinks). Para a
+documentação de API preliminar destes elementos, faça o download da <a href="{@docRoot}preview/download.html#docs">referência da prévia</a>.</p>
+
+<h3>Alterações importantes de comportamento</h3>
+
+<p>Caso tenha publicado anteriormente um aplicativo para Android, saiba que ele pode ser afetado
+pelas alterações na plataforma.</p>
+
+<p>Consulte <a href="behavior-changes.html">alterações de comportamento</a> para obter mais informações.</p>
+
+<h2 id="app-linking">Vínculo de aplicativo</h2>
+<p>Esta prévia aprimora o sistema de intenções do Android fornecendo vínculo de aplicativo mais poderoso.
+Este recurso permite que você associe um aplicativo com um domínio de web próprio. Com base nesta
+associação, a plataforma pode determinar o aplicativo padrão a ser usado para lidar com um link da web
+em particular e ignorar a solicitação aos usuários para selecionar um aplicativo. Para aprender como implementar este aplicativo, consulte
+<a href="{@docRoot}preview/features/app-linking.html">vínculo de aplicativo</a>.
+
+<h2 id="backup">Backup automático para aplicativos</h2>
+<p>O sistema agora realiza backup automático completo de dados e restauração para aplicativos. Este comportamento
+é ativado por padrão para aplicativos com M Preview; não é necessário mais código adicional. Se
+os usuários excluírem as contas da Google, os dados de backup também serão excluídos. Para aprender como este recurso
+funciona e como configurar o backup no sistema do arquivo, consulte
+<a href="{@docRoot}preview/backup/index.html">backup automático para aplicativos</a>.</p>
+
+<h2 id="authentication">Autenticação</h2>
+<p>Esta prévia oferece novas APIs para permitir que você autentique os usuários usando digitalizadores de impressão digital em dispositivos
+suportados e verifique o quão recentemente os usuários autenticaram pela última vez usando o
+mecanismo de desbloqueio por dispositivo (como senha de tela de bloqueio). Use essas APIs em conjunto com
+o <a href="{@docRoot}training/articles/keystore.html">sistema Android Keystore</a>.</p>
+
+<h3 id="fingerprint-authentication">Autenticação com impressão digital</h3>
+
+<p>Para autenticar os usuários por meio de digitalização de impressão digital, adquira uma instância da nova classe
+{@code android.hardware.fingerprint.FingerprintManager} e chame o método
+{@code FingerprintManager.authenticate()}. O aplicativo deve ser executado em um dispositivo
+compatível com sensor de impressão digital. Deve-se implementar a interface do usuário para o fluxo de autenticação
+de impressão digital no aplicativo e usar o ícone de impressão digital padrão do Android na IU.
+O ícone de impressão digital do Android ({@code c_fp_40px.png}) é incluído no
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">aplicativo de exemplo</a>. Caso esteja desenvolvendo vários aplicativos que usam
+autenticação de impressão digital, observe que cada aplicativo deve autenticar a impressão digital do usuário independentemente.
+</p>
+
+<p>Para usar este recurso no aplicativo, adicione primeiro a permissão {@code USE_FINGERPRINT} no
+manifesto.</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>Para ver a implementação do aplicativo da autenticação com impressão digital, consulte o
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">
+ exemplo de caixa de diálogo de impressão digital</a>.</p>
+
+<p>Caso esteja testando este recurso, siga estas etapas:</p>
+<ol>
+<li>Instale o Android SDK Tools Revision 24.3, caso ainda não tenha instalado.</li>
+<li>Registre uma nova impressão digital no emulador acessando
+<strong>Configurações > Segurança > Impressão digital</strong> e, em seguida, siga as instruções de registro.</li>
+<li>Use um emulador para emular eventos de toque de dedo com o
+comando a seguir. Use o mesmo comando para emular os eventos de toque de impressão digital na tela de
+bloqueio ou no aplicativo.
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>No Windows, talvez seja necessário executar {@code telnet 127.0.0.1 <emulator-id>} seguido de
+{@code finger touch <finger_id>}.
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">Confirmação de credencial</h3>
+<p>O aplicativo pode autenticar os usuários com base no quão recentemente o dispositivo foi desbloqueado pela última vez. Este
+recurso libera o usuário de ter que lembrar de senhas específicas de aplicativo extras e evita
+a necessidade de implementar a própria interface do usuário de autenticação. O aplicativo deve usar este recurso
+em conjunto com uma implementação de chave secreta ou pública para a implementação de usuário.</p>
+
+<p>Para definir uma duração de tempo limite em que a mesma chave pode ser usada novamente
+após o usuário autenticar, chame o novo método
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+ ao definir um {@link javax.crypto.KeyGenerator} ou
+{@link java.security.KeyPairGenerator}. Este recurso funciona para operações criptográficas
+simétricas.</p>
+
+<p>Evite exibir o diálogo de nova autenticação excessivamente — os aplicativos devem tentar
+usar o objeto criptográfico primeiro e, se o tempo limite expirar, usar o método
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
+ para autenticar novamente o usuário dentro do aplicativo.
+</p>
+
+<p>Para ver uma implementação de aplicativo deste recurso, consulte o
+<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">
+exemplo de confirmação de credencial</a>.</p>
+
+<h2 id="direct-share">Compartilhamento direto</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>Esta prévia fornece as APIs para tornar o compartilhamento intuitivo e rápido para os usuários. É possível
+definir os <em>alvos de compartilhamento direto</em> que iniciam uma atividade específica no aplicativo.
+Esses alvos de compartilhamento direto são expostos aos usuários por meio do menu <em>Compartilhar</em>. Este recurso permite que os usuários
+compartilhem conteúdos aos alvos, como contatos, dentro de outros aplicativos. Por exemplo: o alvo de compartilhamento direto
+pode iniciar uma atividade em outro aplicativo de rede social, o que permite que o usuário compartilhe o conteúdo diretamente
+para um amigo ou comunidade específica neste aplicativo.</p>
+
+<p>Para ativar os alvos de compartilhamento direto, deve-se definir uma classe que estende a classe
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService}. Declare o
+{@code ChooserTargetService} no manifesto. Dentro desta declaração, especifique a permissão
+{@code BIND_CHOOSER_TARGET_SERVICE} e um filtro de intenções na ação
+{@code SERVICE_INTERFACE}.</p>
+<p>O seguinte exemplo mostra como se deve declarar o {@code ChooserTargetService} no
+manifesto.</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>Para cada atividade que quiser expor ao {@code ChooserTargetService}, adicione um elemento
+{@code <meta-data>} com o nome
+{@code "android.service.chooser.chooser_target_service"} no manifesto do aplicativo.
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">Interações por voz</h2>
+<p>
+Esta prévia fornece uma API de interação por voz que, junto com
+<a href="https://developers.google.com/voice-actions/" class="external-link">ações de voz</a>
+, permite a criação de experiências por voz nos aplicativos. Chame o método
+{@code android.app.Activity.isVoiceInteraction()} para determinar se a atividade
+foi iniciada em resposta à ação de voz. Caso tenha sido iniciada, o aplicativo pode usar a classe
+{@code android.app.VoiceInteractor} para solicitar uma confirmação de voz do usuário,
+selecionar a partir de uma lista de opções e muito mais. Para aprender mais sobre a implementação de ações de voz, consulte
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">o site de desenvolvedor de ações de voz</a>.
+</p>
+
+<h2 id="assist">Auxiliar API</h2>
+<p>
+Esta prévia oferece uma nova maneira de usuários se envolverem com os aplicativos com um assistente. Para usar este
+recurso, o usuário deve possibilitar que o assistente use o contexto atual. Quando ativado,
+o usuário pode invocar um assistente dentro de qualquer aplicativo mantendo o botão <strong>Iniciar</strong> pressionado.</p>
+<p>O aplicativo pode optar por não compartilhar o contexto atual com o assistente configurando o sinalizador
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE}. Além do conjunto
+padrão de informações que a plataforma passa ao assistente, o aplicativo pode compartilhar
+informações adicionais usando a nova classe {@code android.app.Activity.AssistContent}.</p>
+
+<p>Para fornecer ao assistente contexto adicional do aplicativo, siga estas etapas:</p>
+
+<ol>
+<li>Implemente a interface {@link android.app.Application.OnProvideAssistDataListener}.</li>
+<li>Registre esta escuta usando
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li>
+<li>Para fornecer informações contextuais específicas da atividade, substitua o retorno de chamada
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
+ e, opcionalmente, o novo retorno de chamada {@code Activity.onProvideAssistContent()}.
+</ol>
+
+<h2 id="notifications">Notificações</h2>
+<p>Esta prévia adiciona as seguintes alterações de API às notificações:</p>
+<ul>
+ <li>Novo nível de filtro {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} que corresponde
+ao modo "não perturbe" de <em>despertadores apenas</em>.</li>
+ <li>Novo valor da categoria {@code Notification.CATEGORY_REMINDER} que é usado para distinguir
+lembretes de agendamentos do usuário de outros eventos (
+{@link android.app.Notification#CATEGORY_EVENT}) e despertadores (
+{@link android.app.Notification#CATEGORY_ALARM}).</li>
+ <li>Nova classe {@code android.graphics.drawable.Icon} que pode ser anexada às notificações
+por meio dos métodos {@code Notification.Builder.setSmallIcon(Icon)} e
+{@code Notification.Builder.setLargeIcon(Icon)}.</li>
+ <li>Novo método {@code NotificationManager.getActiveNotifications()} que permite que os aplicativos
+descubram quais das notificações ainda estão ativas. Para ver uma implementação de aplicativo que usa este recurso,
+consulte o <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">exemplo de notificações ativas</a>.</li>
+</ul>
+
+<h2 id="bluetooth-stylus">Suporte para Bluetooth Stylus</h2>
+<p>Esta prévia fornece um suporte aprimorado para a entrada de usuário usando um Bluetooth Stylus. Os usuários podem
+parear e conectar um Bluetooth Stylus compatível com o telefone ou tablet. Quando conectado, as informações
+de posição da tela tátil são fundidas com as informações de botão e pressão do Stylus
+para fornecer um alcance maior de expressão em comparação à tela tátil sozinha. O aplicativo pode escutar o pressionar
+de botões do Stylus e realizar ações secundárias registrando os novos retornos de chamada
+{@code View.onStylusButtonPressListener} e {@code GestureDetector.OnStylusButtonPressListener}
+ na atividade.</p>
+
+<p>Use as constantes e os métodos {@link android.view.MotionEvent} para detectar as interações
+de botão do Stylus:</p>
+<ul>
+<li>Se o usuário toca no Stylus com um botão na tela do aplicativo, o método
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} retorna
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
+<li>Para aplicativos com M Preview, o método
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+ retorna {@code MotionEvent.STYLUS_BUTTON_PRIMARY} quando o usuário
+pressiona o botão principal do Stylus. Se o Stylus tiver um segundo botão, o mesmo método retorna
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY} quando o usuário o pressiona. Se o usuário pressiona
+os dois botões simultaneamente, o método retorna os valores com OR juntos (
+{@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).</li>
+<li>
+Para aplicativos com uma versão de plataforma inferior , o método
+{@link android.view.MotionEvent#getButtonState() getButtonState()} retorna
+{@link android.view.MotionEvent#BUTTON_SECONDARY} (para o pressionar do botão principal do Stylus),
+{@link android.view.MotionEvent#BUTTON_TERTIARY} (para o pressionar do botão secundário do Stylus) ou ambos.
+</li>
+</ul>
+
+<h2 id="ble-scanning">Digitalização de baixa energia por Bluetooth aprimorada</h2>
+<p>
+Se o aplicativo realizar digitalizações de baixa energia por Bluetooth, é possível usar o novo método
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} para especificar
+que você quer que os retornos de chamada sejam notificados apenas quando um pacote de propaganda correspondente ao conjunto
+{@link android.bluetooth.le.ScanFilter} for encontrado primeiro e quando
+ele não for visto por um período. Esta abordagem de digitalização é mais eficiente
+do que a fornecida na versão anterior da plataforma.
+</p>
+
+<h2 id="hotspot">Suporte a Hotspot 2.0 Release 1</h2>
+<p>
+Esta prévia adiciona suporte ao Hotspot 2.0 Release 1 nos dispositivos Nexus 6 e Nexus 9. Para fornecer
+as credenciais de Hotspot 2.0 no aplicativo, use os novos métodos da classe
+{@link android.net.wifi.WifiEnterpriseConfig}, como {@code setPlmn()} e
+{@code setRealm()}. No objeto {@link android.net.wifi.WifiConfiguration}, é possível definir os campos
+{@link android.net.wifi.WifiConfiguration#FQDN} e {@code providerFriendlyName}.
+A nova propriedade {@code ScanResult.PasspointNetwork} indica se uma rede detectada representa
+um ponto de acesso Hotspot 2.0.
+</p>
+
+<h2 id="4K-display">Modo de exibição 4K</h2>
+<p>A plataforma agora permite que aplicativos solicitem que a resolução seja aprimorada para renderização 4K
+em hardware compatível. Para consultar a resolução física atual, use as novas APIs
+{@code android.view.Display.Mode}. Se a IU for desenhada em uma resolução lógica
+menor e for redimensionada para uma resolução física maior, saiba que a resolução física que o método
+{@code Display.Mode.getPhysicalWidth()} retorna pode ser diferente da resolução
+física informada por {@link android.view.Display#getSize(android.graphics.Point) getSize()}.</p>
+
+<p>É possível solicitar que o sistema altere a resolução física no aplicativo à medida que ele é executado configurando
+a propriedade {@code WindowManager.LayoutParams.preferredDisplayModeId} da janela do aplicativo. Este
+recurso é útil se quiser alternar para a resolução de exibição 4K. Enquanto estiver no modo de exibição 4K,
+a IU continua a ser renderizada na resolução original (como 1080 p) e é escalonada para 4K, mas os objetos
+{@link android.view.SurfaceView} podem exibir o conteúdo na resolução nativa.</p>
+
+<h2 id="behavior-themeable-colorstatelists">ColorStateLists com tema</h2>
+<p>Os atributos de tema agora são suportados no
+{@link android.content.res.ColorStateList} para dispositivos que executam o M Preview. Os métodos
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} e
+{@link android.content.res.Resources#getColor(int) getColor()} ficaram obsoletos. Caso esteja chamando
+essas APIs, chame os novos métodos {@code Context.getColorStateList()} ou
+{@code Context.getColor()}. Esses métodos também estão disponíveis na biblioteca
+v4 appcompat via {@link android.support.v4.content.ContextCompat}.</p>
+
+<h2 id="audio">Recursos de áudio</h2>
+
+<p>Esta prévia adiciona aprimoramentos ao processamento de áudio no Android, incluindo: </p>
+<ul>
+ <li>Suporte para protocolo <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
+, com as novas APIs {@code android.media.midi}. Use essas APIs para enviar e receber eventos
+de MIDI.</li>
+ <li>Use as novas classes {@code android.media.AudioRecord.Builder} e {@code android.media.AudioTrack.Builder}
+ para criar captura de áudio digital e objetos de reprodução, respectivamente,
+e configure a fonte de áudio e as propriedades do coletor para substituir os padrões do sistema.</li>
+ <li>Ganchos de API para associação de dispositivos de entrada e áudio. Isto é particularmente útil se o aplicativo
+permite que os usuários iniciem uma pesquisa de voz a partir de um controle de jogo ou controle remoto para Android
+TV. O sistema invoca o novo retorno de chamada {@code android.app.Activity.onSearchRequested()} quando
+o usuário inicia uma pesquisa. Para determinar se o dispositivo de entrada do usuário tem um microfone integrado, recupere
+o objeto {@link android.view.InputDevice} deste retorno de chamada e, em seguida, chame o novo método
+{@code InputDevice.hasMic()}.</li>
+ <li>Novas classes {@code android.media.AudioDevicesManager} que permitem que você
+recupere uma lista completa de todas as fontes e dispositivos de áudio do coletor anexados. Também é possível especificar um objeto
+{@code android.media.OnAudioDeviceConnectionListener} caso queira que o aplicativo seja notificado
+quando um dispositivo de áudio for conectado ou desconectado.</li>
+</ul>
+
+<h2 id="video">Recursos de vídeo</h2>
+<p>Esta prévia adiciona novas capacidades às APIs de processamento de vídeo, incluindo:</p>
+<ul>
+<li>A nova classe {@code android.media.MediaSync} que ajuda os aplicativos a renderizar transmissões
+de vídeo e áudio sincronizadamente. Os buffers de áudio são enviados sem bloqueio e retornados
+por um retorno de chamada. Eles também suportam taxa de reprodução dinâmica.
+</li>
+<li>O novo evento {@code MediaDrm.EVENT_SESSION_RECLAIMED}, que indica que uma sessão aberta pelo aplicativo
+foi recuperada pelo gerenciador de recursos. Se o aplicativo usa sessões de DRM, deve-se
+lidar com este evento e garantir que uma sessão recuperada não seja usada.
+</li>
+<li>O novo código de erro {@code MediaCodec.CodecException.ERROR_RECLAIMED}, que indica que o gerenciador
+de recurso recuperou o recurso de mídia usado pelo codec. Com esta exceção, o codec
+deve ser liberado, como se fosse movido para o estado terminal.
+</li>
+<li>A nova interface {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} para obter
+uma dica do número máximo suportado de instâncias de codec concorrentes.
+</li>
+<li>O novo método {@code MediaPlayer.setPlaybackParams()} para definir a taxa de reprodução de mídia
+para reprodução de movimento lento ou rápido. Ele também estica ou acelera a reprodução de áudio automaticamente
+em conjunto com o vídeo.</li>
+</ul>
+
+<h2 id="camera">Recursos de câmera</h2>
+<p>Esta prévia inclui as seguintes novas APIs para acessar a lanterna da câmera
+e para o reprocessamento da câmera de imagens:</p>
+
+<h3 id="flashlight">API da lanterna</h3>
+<p>Se um dispositivo de câmera tem uma unidade de flash, é possível chamar o método {@code CameraManager.setTorchMode()}
+para ligar ou desligar o modo de tocha da unidade de flash sem abrir o dispositivo da câmera. O aplicativo
+não tem propriedade exclusiva da unidade de flash ou do dispositivo de câmera. O modo de tocha é desativado
+e torna-se indisponível sempre que o dispositivo de câmera estiver indisponível ou quando outros
+recursos de câmera que mantêm a tocha ativada ficam indisponíveis. Outros aplicativos também podem chamar {@code setTorchMode()}
+para desativar o modo de tocha. Quando o aplicativo que ativou o modo
+de tocha for fechado, o modo é desativado.</p>
+
+<p>É possível registrar um retorno de chamada para ser notificado sobre o estado da tocha chamando o método
+{@code CameraManager.registerTorchCallback()}. Na primeira vez que o retorno de chamada é registrado,
+ele é imediatamente chamado com o estado do modo de tocha de todos os dispositivos de câmera conhecidos com
+uma unidade de flash. Se o modo de tocha é ativado ou desativado, o método
+{@code CameraManager.TorchCallback.onTorchModeChanged()} é invocado.</p>
+
+<h3 id="reprocessing">API de reprocessamento</h3>
+<p>A API {@link android.hardware.camera2 Camera2} é estendida para suportar YUV e reprocessamento
+de imagem de formato opaco privado. O aplicativo determina se as capacidades de reprocessamento estão disponíveis
+via {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}. Se um dispositivo suporta o reprocessamento,
+é possível criar uma sessão de captura de câmera de reprocessamento chamando
+{@code CameraDevice.createReprocessableCaptureSession()} e criando solicitações para o reprocessamento
+do buffer de entrada.</p>
+
+<p>Use a classe {@code ImageWriter} para conectar o fluxo de buffer de entrada à entrada de reprocessamento
+da câmera. Para obter um buffer vazio, siga este modelo de programação:</p>
+
+<ol>
+<li>Chame o método {@code ImageWriter.dequeueInputImage()}.</li>
+<li>Preencha os dados no buffer de entrada.</li>
+<li>Envie o buffer à câmera chamando o método {@code ImageWriter.queueInputImage()}.</li>
+</ol>
+
+<p>Caso esteja usando um objeto {@code ImageWriter} junto com uma imagem
+{@code android.graphics.ImageFormat.PRIVATE}, o aplicativo não poderá acessar os dados
+da imagem diretamente. Em vez disso, passe a imagem {@code ImageFormat.PRIVATE} diretamente ao
+{@code ImageWriter} chamando o método {@code ImageWriter.queueInputImage()} sem nenhuma
+cópia de buffer.</p>
+
+<p>A classe {@code ImageReader} agora suporta as transmissões de imagem
+de formato {@code android.graphics.ImageFormat.PRIVATE}. Este suporte permite que o aplicativo mantenha uma fila de imagem circular de imagens de saída
+{@code ImageReader}, selecione uma ou mais imagens e envie-as para
+{@code ImageWriter} para o reprocessamento de câmera.</p>
+
+<h2 id="afw">Recursos do Android for Work</h2>
+<p>Esta prévia inclui as seguintes novas APIs para Android for Work:</p>
+<ul>
+ <li><strong>Controles aprimorados para dispositivos de uso único e pertencentes a empresas:</strong> O dono do dispositivo
+pode controlar as seguintes configurações para aprimorar
+os dispositivos de uso único pertencentes a empresas (COSU):
+ <ul>
+ <li>Desativar ou reativar a proteção de bloqueio com o método
+{@code DevicePolicyManager.setKeyguardEnabledState()}.</li>
+ <li>Desativar ou reativar a barra de status (incluindo configurações rápidas,
+notificações e o gesto de arrastar para cima que inicia o Google Now) com o método
+{@code DevicePolicyManager.setStatusBarEnabledState()}.</li>
+ <li>Desativar ou reativar inicialização segura com a constante {@link android.os.UserManager}
+{@code DISALLOW_SAFE_BOOT}.</li>
+ <li>Evitar que a tela desligue quando conectada com a constante
+{@link android.provider.Settings.Global} {@code STAY_ON_WHILE_PLUGGED_IN}.</li>
+ </ul>
+ </li>
+ <li><strong>Instalação e desinstalação silenciosa de aplicativos pelo dono do dispositivo:</strong> O dono do dispositivo pode agora
+instalar e desinstalar aplicativos silenciosamente usando as APIs {@link android.content.pm.PackageInstaller},
+independente do Google Play for Work. É possível tomar providências para os dispositivos
+por meio de um dono do dispositivo que recupera e instala aplicativos se a interação de usuário. Este recurso é útil para ativar a provisão de um toque
+de telefones públicos ou de outros dispositivos sem a ativação da conta Google.</li>
+<li><strong>Acesso silencioso de certificado empresarial: </strong> Quando um aplicativo chama
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()}
+, antes do usuário receber a solicitação para selecionar um certificado, o perfil ou dono do dispositivo
+pode chamar o método {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} para fornecer
+o alias silenciosamente ao aplicativo da solicitação. Este recurso permite que você forneça acesso de aplicativos gerenciados para certificados
+sem a interação de usuário.</li>
+<li><strong>Aceitação automática de atualizações do sistema.</strong> Ao configurar a política de atualização do sistema com
+{@code DevicePolicyManager.setSystemUpdatePolicy()}, o dono do dispositivo pode aceitar automaticamente a atualização
+do sistema, no caso de um dispositivo público, ou adiar a atualização e evitar
+que ela seja feita pelo usuário por até 30 dias. Além disso, um administrador pode definir uma janela de tempo diária
+em que uma atualização deve ser realizada. Por exemplo: durante os momentos em que um dispositivo público não está em uso. Quando
+uma atualização do sistema está disponível, o sistema verifica se o aplicativo de controlador de política de trabalho definiu uma política de atualização
+do sistema e, portanto, comporta-se de acordo com a definição.
+</li>
+<li>
+<strong>Instalação de certificado delegado:</strong> Um perfil ou dono do dispositivo pode agora fornecer ao aplicativo
+de terceiros a habilidade de chamar essas APIs de gerenciamento
+de certificado de {@link android.app.admin.DevicePolicyManager}:
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>Proteção de redefinição de fábrica da empresa:</strong> Ao preparar um dono do dispositivo, agora é possível
+configurar parâmetros para desbloquear a proteção de redefinição de fábrica (FRP) configurando o pacote
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS}. Um aplicativo de programador
+NFC pode fornecer estes parâmetros depois que um dispositivo for redefinido para desbloquear o FRP e preparar o dispositivo,
+sem a necessidade da conta Google anteriormente configurada. Caso não modifique esses parâmetros,
+o FRP permanece no local e evita que o dispositivo seja ativado sem as credenciais
+Google anteriormente ativadas.
+<p>Além disso, ao configurar as restrições do aplicativo nos serviços Google, o dono do dispositivo pode especificar contas
+Google alternativas para desbloquear o FRP para substituir as contas ativadas no dispositivo.</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>Rastreamento de uso de dados.</strong> Um perfil ou dono do dispositivo pode agora
+consultar as estatísticas de uso de dados visíveis em <strong>Configurações > Uso de</strong> dados usando os novos métodos
+{@code android.app.usage.NetworkStatsManager}. Os donos de perfis recebem automaticamente
+a permissão para consultar os dados no perfil que gerenciam, enquanto que os donos do dispositivo têm acesso aos dados
+de uso do usuário principal gerenciado.</li>
+<li><strong>Gerenciamento de permissão de tempo de execução:</strong>
+<p>Um perfil ou dono do dispositivo pode definir uma política
+de permissão para todas as solicitações do tempo de execução de todos os aplicativos que usam
+{@code DevicePolicyManager.setPermissionPolicy()}, seja para solicitar ao usuário para conceder
+a permissão como normal ou automaticamente conceder ou negar a permissão silenciosamente. Se a política posterior
+for definida, o usuário não poderá modificar a seleção feita pelo perfil ou dono do dispositivo dentro da tela de permissões
+do aplicativo em <strong>configurações</strong>.</p></li>
+<li><strong>VPN em configurações:</strong> Os aplicativos de VPN agora estão visíveis em
+<strong>Configurações > Mais > VPN</strong>.
+Além disso, as notificações que acompanham o uso de VPN são específicas sobre como essa VPN
+é configurada. Para o dono de um perfil, as notificações são específicas para determinar
+se a VPN é configurada para um perfil gerenciado, um perfil pessoal ou ambos. Para o dono do dispositivo, as notificações
+são específicas para determinar se a VPN é configurada para todo o dispositivo.</li>
+<li><strong>Notificação de estado de trabalho:</strong> Um ícone de pasta da barra de status agora aparece
+sempre que um aplicativo do perfil gerenciado tiver uma atividade no primeiro plano. Além disso, se o usuário é desbloqueado
+diretamente para a atividade de um aplicativo no perfil gerenciado, um aviso é exibido notificando
+ao usuário que ele está dentro do perfil de trabalho.
+</li>
+</ul>
+
+<p class="note">
+ Para obter uma vista detalhada de todas as alterações de API no M Developer Preview, consulte o <a href="{@docRoot}preview/download.html">relatório de diferenças de API</a>.
+</p>
diff --git a/docs/html-intl/intl/pt-br/preview/behavior-changes.jd b/docs/html-intl/intl/pt-br/preview/behavior-changes.jd
new file mode 100644
index 0000000..cd99bbd
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=Mudanças de comportamento
+page.keywords=preview,sdk,compatibility
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Neste documento</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">Permissões do tempo de execução</a></li>
+ <li><a href="#behavior-power">Otimizações de economia de energia</a>
+ <ol>
+ <li><a href="#behavior-doze">Soneca</a></li>
+ <li><a href="#behavior-app-standby">Aplicativo em espera</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">Dispositivos de armazenamento adotáveis</a></li>
+ <li><a href="#behavior-apache-http-client">Remoção do cliente Apache HTTP</a></li>
+ <li><a href="#behavior-audiomanager-Changes">Mudanças no AudioManager</a></li>
+ <li><a href="#behavior-test-selection">Seleção de texto</a></li>
+ <li><a href="#behavior-keystore">Mudanças no Android Keystore</a></li>
+ <li><a href="#behavior-network">Mudanças de rede e Wi-Fi</a></li>
+ <li><a href="#behavior-camera">Mudanças no serviço de câmera</a></li>
+ <li><a href="#behavior-art-runtime">Tempo de execução de ART</a></li>
+ <li><a href="#behavior-apk-validation">Validação de APK</a></li>
+ <li><a href="#behavior-afw">Mudanças do Android for Work</a></li>
+</ol>
+
+<h2>Diferenças de API</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API de nível 22 para M Preview »</a> </li>
+</ol>
+
+
+<h2>Veja também</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">Visão geral da API do M Developer Preview</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>Junto com novas capacidades e recursos, o M Developer Preview inclui uma variedade
+de mudanças do sistema e alterações no comportamento da API. Este documento destaca algumas
+das alterações principais que você deve entender e levar em consideração nos aplicativos.</p>
+
+<p>Caso tenha publicado anteriormente um aplicativo para Android, saiba que ele pode ser afetado
+ pelas alterações na plataforma.</p>
+
+<h2 id="behavior-runtime-permissions">Permissões do tempo de execução</h1>
+<p>Esta prévia introduz um novo modelo de permissões em que os usuários podem gerenciar diretamente
+ as permissões do aplicativo no tempo de execução. Este modelo fornece aos usuários uma visibilidade aprimorada e controle sobre permissões,
+ ao mesmo tempo em que agiliza os processos de atualização automática e instalação para os desenvolvedores de aplicativos.
+Os usuários podem conceder ou revogar as permissões individualmente para os aplicativos instalados. </p>
+
+<p>Nos aplicativos direcionados para o M Preview, certifique-se de verificar e solicitar as permissões
+ no tempo de execução. Para determinar se o aplicativo recebeu uma permissão, chame
+ o novo método {@code Context.checkSelfPermission()}. Para solicitar uma permissão, chame o novo método
+ {@code Activity.requestPermission()}. Mesmo se o aplicativo não é direcionado para o M,
+ deve-se testá-lo sob o novo modelo de permissões.</p>
+
+<p>Para obter mais detalhes sobre o suporte do novo modelo de permissões no aplicativo, consulte a página de prévia de desenvolvedor
+<a href="{@docRoot}preview/features/runtime-permissions.html">
+Permissões</a>. Para obter dicas sobre como avaliar o impacto no aplicativo,
+ consulte o <a href="{@docRoot}preview/testing/guide.html#runtime-permissions">guia de teste</a>.</p>
+
+<h2 id="behavior-power">Otimizações de economia de energia</h2>
+<p>Esta prévia introduz novas otimizações de economia de energia para dispositivos e aplicativos ociosos.</p>
+
+<h3 id="behavior-doze">Soneca</h3>
+<p>Se o dispositivo estiver desconectado e parado com a tela desligada por um período,
+ o modo <em>Soneca</em> será ativado, onde ele tentará manter o sistema em um estado ocioso. Neste modo,
+ os dispositivos retomam as operações normais periodicamente por breves períodos para que a sincronização de aplicativos
+ possa ocorrer e para que o sistema possa realizar quaisquer operações pendentes.</p>
+
+<p>As seguintes restrições se aplicam aos aplicativos durante a Soneca:</p>
+<ul>
+<li>O acesso à rede é desativado, a não ser que o aplicativo receba um convite de alta prioridade
+ do Google Cloud Messaging.</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">Bloqueios de soneca</a> são ignorados.</li>
+<li>Os despertadores agendados com a classe {@link android.app.AlarmManager} são ignorados,
+ exceto os alarmes definidos com o método {@link android.app.AlarmManager#setAlarmClock setAlarmClock()}
+ e {@code AlarmManager.setAndAllowWhileIdle()}.</li>
+<li>As verificações de Wi-Fi não são realizadas.</li>
+<li>Sincronizações e trabalhos para os adaptadores de sincronização e {@link android.app.job.JobScheduler}
+ não têm permissão para serem executados.</li>
+</ul>
+</p>
+<p>Quando o dispositivo sair do modo soneca, quaisquer sincronizações e trabalhos pendentes são executados.</p>
+<p>É possível testar este recurso conectando o dispositivo executando o M Preview
+ à máquina de desenvolvimento e chamando os seguintes comandos:
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>Observação</strong>: o próximo lançamento do
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+Google Cloud Messaging</a> permite que você designe
+ mensagens de alta prioridade. Se o aplicativo recebe mensagens de alta prioridade do GCM,
+ um acesso breve à rede é concedido mesmo quando o dispositivo está no modo soneca.
+</p>
+
+<p>Consulte o
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">guia de teste</a> para obter dicas sobre
+como testar a soneca nos aplicativos. </p>
+
+<h3 id="behavior-app-standby">Aplicativo em espera</h3>
+<p>Com esta prévia, o sistema pode determinar quais aplicativos estão em espera quando
+não estão em uso ativo. O aplicativo é considerado em espera após um período, a não ser que o sistema detecte
+algum destes sinais:</p>
+
+<ul>
+<li>O aplicativo foi explicitamente iniciado pelo usuário.</li>
+<li>O aplicativo tem um processo atualmente em primeiro plano (seja uma atividade ou serviço de primeiro plano
+ ou esteja em uso por outra atividade ou serviço de primeiro plano).</li>
+<li>O aplicativo gera uma notificação que o usuário vê na tela de bloqueio
+ ou na bandeja de notificações.</li>
+<li>O usuário explicitamente pede para que o aplicativo seja liberado das otimizações,
+ ajustado em <strong>Settings (Configurações)</strong>.</li>
+</ul>
+
+<p>Se o dispositivo estiver desconectado, o aplicativo considerado ocioso terá o acesso
+à rede desativado e as sincronizações e os trabalhos suspensos. Quando o dispositivo está conectado em uma fonte de alimentação,
+ esses aplicativos têm acesso à rede permitido e podem executar quaisquer sincronizações e trabalhos pendentes. Se o dispositivo permanece ocioso por longos períodos,
+ os aplicativos ociosos têm acesso à rede permitido aproximadamente uma vez por dia.</p>
+
+<p>É possível testar este recurso conectando o dispositivo executando o M Preview
+ à máquina de desenvolvimento e chamando os seguintes comandos:
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>Observação</strong>: o próximo lançamento do
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+Google Cloud Messaging</a> (GCM) permite que você
+designe mensagens de alta prioridade. Se o aplicativo recebe mensagens de alta prioridade do GCM,
+um acesso breve à rede é concedido mesmo quando o aplicativo está ocioso.
+</p>
+
+<p>Consulte o
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">guia de teste</a> para obter dicas sobre como
+testar a espera dos aplicativos. </p>
+
+<h2 id="behavior-adoptable-storage">Dispositivos de armazenamento adotáveis</h2>
+<p>
+Com esta prévia, os usuários podem <em>adotar</em> dispositivos de armazenamento externo como cartões SD. Adotar um dispositivo
+de armazenamento externo criptografa e formata o dispositivo para agir como um armazenamento interno. Este recurso
+permite que os usuários movam aplicativos e dados privados desses aplicativos entre dispositivos de armazenamento. Ao mover aplicativos,
+o sistema respeita a preferência
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
+no manifesto.</p>
+
+<p>Se o aplicativo acessar as seguintes APIs ou campos, saiba que os caminhos de arquivos retornados
+serão alterados dinamicamente quando o aplicativo for movido entre os dispositivos de armazenamento externo e interno.
+Ao compilar caminhos de arquivos, é recomendado que essas APIs sempre sejam chamadas dinamicamente.
+Não use caminhos de arquivo criptografados nem persista em caminhos de arquivo completamente qualificados que foram compilados anteriormente.</p>
+
+<ul>
+<li>Métodos {@link android.content.Context}:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>Campos {@link android.content.pm.ApplicationInfo}:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>Para depurar este recurso na prévia de desenvolvedor, é possível ativar a adoção
+de uma unidade USB que está conectada a um dispositivo Android por meio de um cabo USB On-The-Go (OTG) executando este comando:</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">Remoção do cliente Apache HTTP</h2>
+<p>Esta prévia remove o suporte para o cliente Apache HTTP. Se o aplicativo estiver usando este cliente e for direcionado
+para Android 2.3 (nível da API 9) ou mais recente, use
+a classe {@link java.net.HttpURLConnection}. Esta API é mais eficiente, pois reduz o uso de rede por meio de compressão transparente e armazenamento
+em cachê de respostas, além de minimizar o consumo de energia. Para continuar usando as APIs do Apache HTTP,
+deve-se primeiro declarar a dependência de tempo de compilação no arquivo {@code build.gradle}:
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>O Android está mudando da biblioteca OpenSSL para
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
+. Caso esteja usando o Android NDK no aplicativo, não vincule contra bibliotecas criptográficas
+que não fazem parte da API de NDK, como {@code libcrypto.so} e {@code libssl.so}. Estas bibliotecas não são APIs públicas
+e podem mudar ou apresentar erros sem notificar entre liberações e dispositivos.
+Além disso, você pode se expor a vulnerabilidades de segurança. Em vez disso,
+modifique o código nativo para chamar as APIs de criptografia Java via JNI ou para vincular estaticamente
+com relação a uma biblioteca criptográfica de sua escolha.</p>
+
+<h2 id="behavior-audiomanager-Changes">Mudanças no AudioManager</h2>
+<p>Ajustar o volume diretamente ou desativar o áudio de transmissões específicas por meio da classe {@link android.media.AudioManager}
+não são mais recursos suportados. O método {@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} é obsoleto e deve-se chamar o método
+{@code AudioManager.requestAudioFocus()}. De forma semelhante, o método
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} é
+obsoleto; em vez disso, chame o método {@code AudioManager.adjustStreamVolume()}
+e passe o valor da direção de {@code ADJUST_MUTE} ou {@code ADJUST_UNMUTE}.</p>
+
+<h2 id="behavior-test-selection">Seleção de texto</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>Quando os usuários selecionam o texto no aplicativo, agora é possível exibir ações de seleção de texto como
+<em>Recortar</em>, <em>Copiar</em> e <em>Colar</em> na
+<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">barra de ferramentas flutuante</a>. A implementação da interação do usuário é semelhante ao processo
+da barra de ação contextual, como descrito em
+<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">
+Ativação do modo de ação contextual para vistas individuais</a>.</p>
+
+<p>Para implementar uma barra de ferramentas flutuante para seleção de texto, faça as seguintes alterações nos aplicativos
+existentes:</p>
+<ol>
+<li>No objeto {@link android.view.View} ou {@link android.app.Activity}, altere as chamadas
+{@link android.view.ActionMode} de
+{@code startActionMode(Callback)} para {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}.</li>
+<li>Pegue a implementação existente de {@code ActionMode.Callback} e torne-a uma extensão de
+{@code ActionMode.Callback2}.</li>
+<li>Substitua o método {@code Callback2.onGetContentRect()} para fornecer as coordenadas do conteúdo
+do objeto {@link android.graphics.Rect} (como um retângulo de seleção de texto) na vista.</li>
+<li>Se o posicionamento do retângulo deixar de ser válido e for o único elemento a ser invalidado,
+chame o método {@code ActionMode.invalidateContentRect()}.</li>
+</ol>
+
+<p>Caso esteja usando a <a href="{@docRoot}tools/support-library/index.html">
+biblioteca de suporte Android</a> revisão 22.2, saiba que as barras de ferramentas flutuantes não
+têm compatibilidade com versões anteriores e que o appcompat tem controle sobre os objetos {@link android.view.ActionMode} por
+padrão. Isto evita que barras de ferramentas flutuantes sejam exibidas. Para ativar o suporte de
+{@link android.view.ActionMode} em um
+{@link android.support.v7.app.AppCompatActivity}, chame
+{@code android.support.v7.app.AppCompatActivity.getDelegate()} e, em seguida, chame
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} no objeto
+{@link android.support.v7.app.AppCompatDelegate} retornado e defina
+o parâmetro de entrada para {@code false}. Esta chamada retorna o controle dos objetos {@link android.view.ActionMode}
+à estrutura. Em dispositivos que são executados no M Preview, isto permite que a estrutura suporte os modos de
+{@link android.support.v7.app.ActionBar} ou de barra de ferramenta flutuante, enquanto que, para dispositivos anteriores ao M Preview,
+somente os modos {@link android.support.v7.app.ActionBar} são suportados.</p>
+
+<h2 id="behavior-keystore">Mudanças no Android Keystore</h2>
+<p>Com esta prévia,
+o <a href="{@docRoot}training/articles/keystore.html">provedor Android Keystore</a> não suporta mais
+DSA. ECDSA ainda é suportado.</p>
+
+<p>As chaves que não exigem criptografia em rest não precisam ser excluídas quando a tela de bloqueio segura
+é desativada ou redefinida (por exemplo, pelo usuário ou por um administrador do dispositivo). As chaves que exigem
+criptografia serão excluídas durante esses eventos.</p>
+
+<h2 id="behavior-network">Mudanças de rede e Wi-Fi</h2>
+
+<p>Esta prévia introduz as seguintes alterações de comportamento nas APIs de rede e Wi-Fi.</p>
+<ul>
+<li>Os aplicativos podem alterar o estado dos objetos {@link android.net.wifi.WifiConfiguration}
+somente se você os tiver criado. Você não tem permissão para modificar nem excluir objetos
+{@link android.net.wifi.WifiConfiguration} criados pelo usuário ou outros aplicativos.
+</li>
+<li>
+Anteriormente, se um aplicativo forçasse o dispositivo a se conectar a uma rede Wi-Fi específica usando
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} com a configuração
+{@code disableAllOthers=true}, o dispositivo desconectava de outras redes,
+como dados de celular. Nesta prévia, o dispositivo não rompe a conexão com outras redes. Se
+o {@code targetSdkVersion} do aplicativo for {@code “20”} ou menor, ele é fixado
+à rede Wi-Fi selecionada. Se o {@code targetSdkVersion} do aplicativo for {@code “21”} ou maior, use
+as APIS de multi-rede (como
+{@link android.net.Network#openConnection(java.net.URL) openConnection()},
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} e o novo método
+{@code ConnectivityManager.bindProcessToNetwork()}) para garantir que o tráfego de rede
+seja enviado na rede selecionada.</li>
+</ul>
+
+<h2 id="behavior-camera">Mudanças no serviço de câmera</h2>
+<p>Nesta prévia, o modelo para acessar recursos compartilhados no serviço de câmera foi alterado
+do antigo modelo de acesso “primeiro a chegar, primeiro a ser atendido” para um modelo de acesso onde
+os processos de alta prioridade são favorecidos. As mudanças no comportamento do serviço incluem:</p>
+<ul>
+<li>Acesso aos recursos do subsistema da câmera, incluindo abertura e configuração de um dispositivo de câmera,
+concedido com base na prioridade do processo do aplicativo do cliente. Processos de aplicativos com atividades
+visíveis ao usuário ou de primeiro plano são geralmente de alta prioridade, tornando a aquisição
+e o uso de recursos da câmera mais dependentes.</li>
+<li>Clientes de câmera ativa para aplicativos de menor prioridade podem ser "despejados" quando
+um aplicativo de alta prioridade tenta usar a câmera. Na API {@link android.hardware.Camera} obsoleta,
+isto resulta em
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()} sendo
+chamado para o cliente despejado. Na API {@link android.hardware.camera2 Camera2}, isto resulta em
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}
+sendo chamado para o cliente despejado.</li>
+<li>Em dispositivos com hardware de câmera adequado, processos de aplicativo separados podem
+abrir e usar independentemente os dispositivos de câmera simultaneamente. No entanto, casos de uso de vários processos
+em que o acesso simultâneo causa uma degradação significante de desempenho ou capacidades
+de qualquer um dos dispositivos de câmera abertos agora são detectados e proibidos pelo serviço da câmera. Esta alteração
+pode resultar em "despejos" para clientes de menor prioridade quando nenhum aplicativo está
+tentando acessar o mesmo dispositivo de câmera diretamente.
+</li>
+<li>
+Alterar o usuário atual faz com que os clientes da câmera ativa em aplicativos pertencentes à conta do usuário anterior
+sejam despejados. O acesso à câmera é limitado a perfis de usuário pertencentes ao usuário do dispositivo atual.
+Na prática, isso significa que uma conta de "convidado", por exemplo, não poderá deixar
+processos em execução que usam o subsistema da câmera quando o usuário alternar para uma conta diferente.
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">Tempo de execução de ART</h2>
+<p>O tempo de execução de ART agora implementa adequadamente as regras de acesso
+para o método {@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()}. Esta
+alteração corrige um problema onde o Dalvik estava verificando as regras de acesso incorretamente em versões anteriores.
+Se o aplicativo usa o método
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} e você quer
+substituir as verificações de acesso, chame o método
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} com o parâmetro
+de entrada definido como {@code true}. Se o aplicativo usar a
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">biblioteca v7 appcompat</a> ou a
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">biblioteca v7 recyclerview</a>,
+deve-se atualizá-lo para usar as versões mais recentes dessas bibliotecas. Caso contrário, certifique-se
+de que as classes personalizadas mencionadas a partir do XML sejam atualizadas para que os construtores de classe estejam acessíveis.</p>
+
+<p>Esta prévia atualiza o comportamento do vinculador dinâmico. O vinculador dinâmico agora entende
+a diferença entre um {@code soname} da biblioteca e o seu caminho
+(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
+erro público 6670</a>), e a pesquisa por {@code soname}
+agora está implementada. Os aplicativos que anteriormente trabalhavam e têm entradas {@code DT_NEEDED} inválidas
+(geralmente, caminhos absolutos no sistema de arquivo na máquina de programação) podem falhar ao serem carregados.</p>
+
+<p>O sinalizador {@code dlopen(3) RTLD_LOCAL} agora está corretamente implementado. Observe que
+{@code RTLD_LOCAL} é o padrão. Portanto, chamadas para {@code dlopen(3)} que não usam explicitamente
+{@code RTLD_LOCAL} serão afetadas (a não ser que o aplicativo tenha usado explicitamente {@code RTLD_GLOBAL}). Com
+{@code RTLD_LOCAL}, os símbolos não estarão disponíveis para as bibliotecas carregadas por chamadas posteriores a
+{@code dlopen(3)} (o oposto ocorre quando mencionado por entradas {@code DT_NEEDED}).</p>
+</p>
+
+<h2 id="behavior-apk-validation">Validação de APK</h2>
+<p>A plataforma agora realiza validações mais estritas de APKs. Um APK é considerado corrompido se um arquivo
+for declarado no manifesto, mas não estiver presente no próprio APK. Um APK deve ser atribuído novamente se qualquer
+conteúdo for removido.</p>
+
+<h2 id="behavior-afw">Mudanças do Android for Work</h2>
+<p>Esta prévia inclui as seguintes mudanças de comportamento para Android for Work:</p>
+<ul>
+<li><strong>Contatos de trabalho em contextos pessoais.</strong> O registro de chamadas do telefone do Google
+agora exibe os contatos de trabalho quando o usuário visualiza chamadas anteriores.
+A configuração {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} para {@code true} oculta
+os contatos do perfil de trabalho no registro de chamadas do telefone. Os contatos de trabalho podem ser exibidos junto com os contatos pessoais
+aos dispositivos por meio de Bluetooth somente
+se {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} estiver definido como {@code false}. Por
+padrão, ele está definido como {@code true}.
+</li>
+<li><strong>Remoção de configuração Wi-Fi:</strong> as configurações de Wi-Fi adicionadas por um dono de perfil
+(por exemplo, por meio de chamadas para o método
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()}) agora são removidas se esse perfil de trabalho é excluído.</li>
+<li><strong>Bloqueio de configuração Wi-Fi:</strong> qualquer configuração Wi-Fi criada por um dono do dispositivo
+ativo não pode mais ser modificada nem excluída pelo usuário. O usuário ainda pode criar
+e modificar as próprias configurações de Wi-Fi, contanto que a constante {@link android.os.UserManager}
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI} não tenha sido definida por ele.</li>
+<li><strong>Faça o download do Work Policy Controller por meio de uma adição de conta Google:</strong> quando uma conta Google
+que requer um gerenciamento por meio do aplicativo Work Policy Controller (WPC) é adicionada ao dispositivo
+fora de um contexto gerenciado, o fluxo de conta adicionada agora solicita ao usuário para instalar
+o WPC adequado. Este comportamento também se aplica a contas adicionadas por meio de
+<strong>Settings (Configurações) > Accounts (Contas)</strong> no assistente de configuração inicial do dispositivo.</li>
+<li><strong>Alterações aos comportamentos específicos da API DevicePolicyManager:</strong>
+chamar o método {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()}
+afeta a câmera somente para o usuário que realizou a chamada. Chamá-lo a partir do perfil gerenciado
+não afeta os aplicativos de câmera em execução no usuário principal. Além disso,
+o método {@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()}
+agora está disponível para donos de perfil, além dos donos do dispositivo. Um dono de perfil pode definir
+estas restrições de proteção de bloqueio:
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} e
+ {@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}, que afetam
+ as configurações de proteção de bloqueio para o usuário pai do perfil.</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, que
+ afeta somente as notificações geradas por aplicativos no perfil gerenciado.</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/pt-br/preview/features/runtime-permissions.jd b/docs/html-intl/intl/pt-br/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..762e1ae
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=Permissões
+page.tags=previewresources, androidm
+page.keywords=permissions, runtime, preview
+page.image={@docRoot}preview/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Visualização rápida</h2>
+ <ul>
+ <li>Se o aplicativo direciona o M Preview SDK, ele indica aos usuários para conceder
+ permissões no tempo de execução, em vez de tempo de instalação.</li>
+ <li>Os usuários podem revogar as permissões a qualquer momento na tela de configurações
+do aplicativo.</li>
+ <li>O aplicativo precisa verificar se tem as permissões necessárias
+sempre que for executado.</li>
+ </ul>
+
+ <h2>Neste documento</h2>
+ <ol>
+ <li><a href="#overview">Visão geral</a></li>
+ <li><a href="#coding">Codificação para permissões de tempo de execução</a></li>
+ <li><a href="#testing">Teste de permissões de tempo de execução</a></li>
+ <li><a href="#best-practices">Práticas recomendadas</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ O M Developer Preview introduz um novo modelo de permissões de aplicativo
+que agiliza o processo de instalação e atualização de aplicativos para os usuários. Se um aplicativo
+ que está sendo executado no M Preview suporta o novo modelo de permissões, o usuário não precisa conceder
+ permissões ao instalar ou atualizar o aplicativo. Em vez disso, o aplicativo
+ solicita as permissões à medida que precisar e o sistema exibe um diálogo
+ ao usuário pedindo a permissão.
+</p>
+
+<p>
+ Se um aplicativo suportar o novo modelo de permissões, ele
+ ainda poderá ser instalado e executado em versões mais antigas do Android, usando o antigo modelo
+ de permissões nesses dispositivos.
+</p>
+
+<h2 id="overview">
+ Visão geral
+</h2>
+
+<p>
+ Com o M Developer Preview, a plataforma introduz um novo modelo
+ de permissões. Eis um resumo dos componentes essenciais deste novo modelo:
+</p>
+
+<ul>
+ <li>
+ <strong>Declaração de permissões:</strong> O aplicativo declara todas
+ as permissões necessárias no manifesto, como nas plataformas anteriores do Android.
+ </li>
+
+ <li>
+ <strong>Grupos de permissão:</strong> As permissões são divididas em
+<em>grupos de permissão</em>, baseados na funcionalidade. Por exemplo: o grupo de permissão
+ <code>CONTACTS</code> contém permissões para ler e escrever
+ informações de perfil e contatos do usuário.
+ </li>
+
+ <li>
+ <p><strong>Permissões limitadas concedidas no tempo de instalação:</strong> Quando o usuário
+ instala ou atualiza o aplicativo, o sistema concede todas
+ as permissões que o aplicativo solicita que estão em {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}.
+ Por exemplo: as permissões de internet e despertador estão em {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}. Portanto,
+ as permissões são concedidas automaticamente no tempo de instalação.
+ </p>
+
+ <p>O sistema pode também conceder as permissões de sistema e assinatura de aplicativo,
+ como descrito em <a href="#system-apps">permissões de assinatura
+ e aplicativos do sistema</a>. O usuário <em>não</em> é alertado a conceder permissões
+ no tempo de instalação.</p>
+ </li>
+
+ <li>
+ <strong>O usuário concede permissões no tempo de execução:</strong> Quando um aplicativo solicita
+ uma permissão, o sistema exibe um diálogo ao usuário e, em seguida,
+ chama a função de retorno de chamada do aplicativo para notificá-lo se a permissão foi concedida. Se um
+ usuário concede uma permissão, o aplicativo recebe todas
+ as permissões na área funcional desta permissão que foram declaradas no manifesto do aplicativo.
+ </li>
+
+</ul>
+
+<p>
+ Este modelo de permissões altera a forma como o aplicativo se comporta diante os recursos
+ que precisam de permissões. Eis um resumo das práticas de desenvolvimento que devem
+ ser seguidas para ajustar para este modelo:
+</p>
+
+<ul>
+
+ <li>
+ <strong>Sempre verificar as permissões:</strong> Quando o aplicativo
+ precisa realizar uma ação que requer uma permissão, ele deve primeiro verificar
+ se já a tem. Caso não tenha, ele solicita
+ o concedimento desta permissão.
+ </li>
+
+ <li>
+ <strong>Lidar com falta de permissões dignamente:</strong> Se o aplicativo não
+ recebe a permissão adequada, ele deve lidar com a falha de forma limpa.
+ Por exemplo, se a permissão é necessária para um recurso adicionado,
+ o aplicativo pode desativar este recurso. Se a permissão for essencial
+ para que o aplicativo funcione, ele desativará toda sua funcionalidade
+ e informará ao usuário que precisa desta permissão.
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>Figura 1.</strong> Tela de permissões nas configurações do aplicativo.
+ </p>
+ </div>
+
+ <li>
+ <strong>As permissões são revogáveis:</strong> Os usuários podem revogar as permissões
+ de um aplicativo a qualquer momento. Se um usuário desativar as permissões de um aplicativo,
+ o aplicativo <em>não</em> é notificado. Novamente, o aplicativo deve verificar
+ se tem todas as permissões necessárias antes de realizar qualquer ação restrita.
+ </li>
+</ul>
+
+<p class="note">
+ <strong>Observação:</strong> se um aplicativo direcionar o M Developer Preview, ele
+ <em>deve</em> usar o novo modelo de permissões.
+</p>
+
+<p>
+ No momento do lançamento do M Developer Preview,
+ nem todos os aplicativos Google implementam completamente o novo modelo de permissões. A Google está atualizando estes aplicativos
+ durante o curso do M Developer Preview para respeitar adequadamente a configuração
+ de alternação de permissões.
+</p>
+
+<p class="note">
+ <strong>Observação:</strong> se o aplicativo tiver a própria superfície de API,
+ não represente permissões sem antes garantir que o autor da chamada tenha as permissões necessárias
+ para acessar esses dados.
+</p>
+
+<h3 id="system-apps">
+ Permissões de assinatura e aplicativos do sistema
+</h3>
+
+<p>
+ Geralmente, quando um usuário instala um aplicativo, o sistema somente fornece ao aplicativo o
+ {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL}. No entanto, sob algumas circunstâncias, o sistema concede
+ ao aplicativo mais permissões:
+</p>
+
+<ul>
+ <li>Se um aplicativo faz parte da imagem do sistema, ele recebe automaticamente
+ todas as permissões listadas no manifesto.
+ </li>
+
+ <li>Se o aplicativo solicitar as permissões no manifesto que está em {@link
+ android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE},
+ e estiver assinado com o mesmo certificado que o aplicativo que declarou essas permissões,
+ o sistema concederá essas permissões na instalação ao aplicativo
+ que fez a solicitação.
+ </li>
+</ul>
+
+<p>
+ Em ambos os casos, o usuário ainda pode revogar as permissões a qualquer
+ momento acessando a tela de <strong>configurações</strong> do sistema e escolhendo <strong>Aplicativos
+ ></strong> <i>app_name</i> <strong>> Permissões</strong>. O aplicativo
+ deve continuar com a verificação das permissões no tempo de execução e solicitá-las
+ se necessário.
+</p>
+
+<h3 id="compatibility">
+ Compatibilidade anterior e posterior
+</h3>
+
+<p>
+ Se um aplicativo não direciona para o M Developer Preview, ele deve continuar a usar
+ o modelo antigo de permissões mesmo nos dispositivos M Preview. Quando o usuário instala
+ o aplicativo, o sistema pede para que ele conceda todas as permissões
+ listadas no manifesto do aplicativo.
+</p>
+
+<p class="note">
+ <strong>Observação:</strong> em dispositivos que são executados no M Developer Preview,
+ um usuário pode desativar as permissões para qualquer aplicativo (incluindo aplicativos de legado)
+ na tela de configurações do aplicativo. Se um usuário desativa as permissões de um aplicativo de legado, o sistema
+ silenciosamente desativa a funcionalidade adequada. Quando um aplicativo tentar realizar
+ uma operação que requer esta permissão, a operação não necessariamente causará
+ uma exceção. Em vez disso, ele retornará um conjunto de dados vazio,
+ sinalizará um erro ou exibirá um comportamento inesperado. Por exemplo, caso queira
+ consultar um calendário sem permissão, o método retorna um conjunto de dados vazio.
+</p>
+
+<p>
+ Se instalar um aplicativo usando o novo modelo de permissões em um dispositivo
+ que não está executando o M Preview,
+ o sistema o tratará da mesma forma que qualquer outro aplicativo: o sistema pedirá
+ para que o usuário conceda todas as permissões declaradas no momento da instalação.
+</p>
+
+<p class="note">
+ <strong>Observação:</strong> para a liberação de prévia, deve-se definir a versão mínima de SDK
+ para o M Preview SDK para compilar com o SDK de prévia. Isto significa que você
+ não poderá testar tais aplicativos em plataformas mais antigas durante a prévia
+ de desenvolvedor.
+</p>
+
+<h3 id="perms-vs-intents">Permissões versus intenções</h3>
+
+<p>
+ Em vários casos, é possível escolher entre duas maneiras para que o aplicativo realize
+ uma tarefa. É possível fazer com que o aplicativo solicite uma permissão para realizar a operação
+ por conta própria. Alternativamente, é possível fazer com que o aplicativo use uma intenção para que outro aplicativo
+ realize a tarefa.
+</p>
+
+<p>
+ Por exemplo, imagine que o aplicativo precisa da função de tirar fotos com
+ a câmera do dispositivo. O aplicativo pode solicitar a permissão
+<code>android.permission.CAMERA</code>, que permite que ele acesse
+ a câmera diretamente. O aplicativo então usará as APIs da câmera
+ para controlar a câmera e tirar uma foto. Esta abordagem fornece ao aplicativo
+ controle completo sobre o processo de fotografia e permite
+ que você incorpore a IU da câmera.
+</p>
+
+<p>
+ No entanto, caso não precise de tal controle, é possível apenas usar uma intenção {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE}
+ para solicitar uma imagem. Ao iniciar a intenção, o usuário deve escolher
+ um aplicativo de câmera (se não houver um aplicativo padrão de câmera)
+ para tirar a foto. O aplicativo da câmera retorna a imagem ao método {@link
+ android.app.Activity#onActivityResult onActivityResult()} do aplicativo.
+</p>
+
+<p>
+ De forma semelhante, caso precise realizar uma ligação,
+ acessar os contatos do usuário etc., é possível fazer estas ações criando uma intenção adequada
+ ou solicitar a permissão e o acesso aos objetos adequados diretamente. Essas são
+ as vantagens e desvantagens de cada abordagem.
+</p>
+
+<p>
+ Se usar permissões:
+</p>
+
+<ul>
+ <li>O aplicativo tem controle completo sobre a experiência do usuário ao realizar
+ a operação. No entanto, esse controle amplo é adicionado à complexidade da tarefa,
+ levando em consideração a necessidade de projetar uma IU adequada.
+ </li>
+
+ <li>O usuário deve fornecer a permissão uma vez: na primeira realização
+ da operação. Depois, o aplicativo pode realizar a operação sem
+ precisar de mais interações do usuário. No entanto,
+ se o usuário não conceder a permissão (ou revogá-la posteriormente),
+ o aplicativo não conseguirá realizar a operação.
+ </li>
+</ul>
+
+<p>
+ Se usar uma intenção:
+</p>
+
+<ul>
+ <li>Você não terá que projetar a IU para a operação. O aplicativo que lida com
+ a intenção fornece a IU. No entanto, isso significa que você não terá controle
+ completo sobre a experiência de usuário. O usuário poderá interagir com um aplicativo
+ que você nunca viu.
+ </li>
+
+ <li>Se o usuário não tem um aplicativo padrão para a operação,
+ o sistema pede para que o usuário escolha um aplicativo.
+ Se o usuário não designar um manipulador padrão,
+ ele terá que acessar uma caixa de diálogo extra sempre que realizar a operação.
+ </li>
+</ul>
+
+<h2 id="coding">Codificação para permissões de tempo de execução</h2>
+
+<p>
+ Se um aplicativo direciona o novo M Developer Preview, ele deve usar o novo
+ modelo de permissões. Isto significa que, além de declarar as permissões necessárias no manifesto,
+ deve-se também verificar se o aplicativo
+ tem as permissões no tempo de execução e,
+ caso ainda não as tenha, solicitá-las.
+</p>
+
+<h3 id="enabling">
+ Possibilitar um novo modelo de permissões
+</h3>
+
+<p>
+ Para possibilitar o modelo de permissões do M Developer Preview, configure o atributo
+<code>targetSdkVersion</code> do aplicativo para <code>"MNC"</code> e
+<code>compileSdkVersion</code> para <code>"android-MNC"</code>. Isto ativará
+ todos os novos recursos de permissão.
+</p>
+
+<p>
+ Para a liberação de uma prévia, deve-se definir <code>minSdkVersion</code> para
+<code>"MNC"</code> para compilar com o SDK de prévia.
+</p>
+
+<h3 id="m-only-perm">
+ Designar uma permissão somente para o M Preview
+</h3>
+
+<p>
+ É possível usar o novo elemento <code><uses-permission-sdk-m></code> no manifesto do aplicativo
+ para indicar que uma permissão é necessária apenas no M Developer Preview. Se você
+ declarar uma permissão desta maneira, sempre que o aplicativo for instalado
+ em um dispositivo mais antigo, o sistema não solicitará ao usuário
+ nem concederá a permissão ao aplicativo. Usando o elemento <code><uses-permission-sdk-m></code>
+, é possível adicionar novas permissões
+ a versões atualizadas do aplicativo sem forçar os usuários a conceder permissões
+ ao instalar a atualização.
+</p>
+
+<p>
+ Se o aplicativo está sendo executado em um dispositivo com M Developer Preview, o
+<code><uses-permission-sdk-m></code> se comporta da mesma forma que
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>.
+ O sistema não solicita ao usuário que conceda quaisquer permissões ao instalar o aplicativo
+ e o aplicativo solicita as permissões à medida que forem necessárias.
+</p>
+
+<h3 id="prompting">
+ Solicitação de permissões
+</h3>
+
+<p>
+ Se o aplicativo usa o novo modelo de permissões do M Developer Preview,
+ o usuário não recebe solicitações para conceder todas as permissões quando o aplicativo é iniciado pela primeira vez em um dispositivo
+ que está sendo executado no M Preview. Em vez disso, o aplicativo solicita as permissões à medida
+ que forem necessárias. Quando um aplicativo solicita uma permissão, o sistema exibe uma caixa de diálogo
+ ao usuário.
+</p>
+
+<p>
+ Se o aplicativo executar em um dispositivo que tem SDK 22 ou inferior,
+ ele usará o antigo modelo de permissões. Quando o usuário instala o aplicativo, ele é solicitado a conceder
+ todas as permissões que o aplicativo lista no manifesto,
+ exceto as permissões que forem marcadas com <code><uses-permission-sdk-m></code>.
+</p>
+
+<h4 id="check-platform">Verifique em qual plataforma o aplicativo está sendo executado</h4>
+
+<p>
+ Este modelo de permissões é suportado apenas em dispositivos que estão executando
+ o M Developer Preview. Antes de chamar qualquer um destes métodos,
+ o aplicativo deve verificar em qual plataforma está sendo executado
+ verificando o valor de {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME}. Se o dispositivo estiver sendo executado no M Developer Preview,
+ {@link android.os.Build.VERSION#CODENAME CODENAME} será <code>"MNC"</code>.
+</p>
+
+<h4 id="check-for-permission">Verifique se o aplicativo tem a permissão necessária</h4>
+
+<p>Quando o usuário tenta fazer algo que requer uma permissão,
+ o aplicativo verifica se tem a permissão para realizar esta operação. Para fazer isto,
+ o aplicativo chama
+ <code>Context.checkSelfPermission(<i>permission_name</i>)</code>. O aplicativo
+ deve realizar isto para verificar se sabe que o usuário já concedeu esta permissão,
+ levando em consideração que o usuário pode revogar
+ as permissões do aplicativo a qualquer momento. Por exemplo,
+ se um usuário quiser usar um aplicativo para tirar uma foto, o aplicativo chamará
+ <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>.</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>Tabela 1.</strong> Permissões e grupos de permissões.</p>
+<table>
+ <tr>
+ <th scope="col">Grupo de permissões</th>
+ <th scope="col">Permissões</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">Solicitar permissões se necessário</h4>
+
+<p>Se o aplicativo já não tem a permissão necessária, ele chama o método
+ <code>Activity.requestPermissions(String[], int)</code> para solicitar
+ as permissões necessárias. O aplicativo passa
+ as permissões que deseja e também um "código de solicitação" do inteiro.
+ Este método funciona de forma assíncrona: ele retorna imediatamente e,
+ depois que o usuário responde à caixa de diálogo, o sistema chama
+ o método de retorno de chamada do aplicativo com os resultados, passando o mesmo "código de solicitação" que o aplicativo passou
+ para <code>requestPermissions()</code>.</p>
+
+ <p>O seguinte código verifica se o aplicativo tem a permissão
+ para ler os contatos do usuário e solicita a permissão, se necessário:</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">Lidar com a resposta de solicitação das permissões</h4>
+
+<p>
+ Quando um aplicativo solicita as permissões, o sistema apresenta uma caixa de diálogo
+ ao usuário. Quando o usuário responde, o sistema invoca o
+ <code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
+ do aplicativo, passando a ele a resposta do usuário. O aplicativo precisa substituir este método. O retorno de chamada
+ recebe o mesmo código de solicitação passado para
+ <code>requestPermissions()</code>. Por exemplo, se um aplicativo solicita o acesso
+ <code>READ_CONTACTS</code>, ele pode ter o seguinte
+ método de retorno de chamada:
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>Se o usuário concede a permissão, o sistema fornece ao aplicativo todas as permissões
+ que o manifesto do aplicativo lista para esta área funcional. Se o usuário negar a solicitação,
+ deve-se tomar a ação adequada. Por exemplo, deve-se desativar
+ quaisquer ações de menu que dependam desta permissão.
+ </li>
+</p>
+
+<p>
+ Quando o sistema pede para que o usuário conceda uma permissão, esse usuário tem a opção
+ de dizer ao sistema para que não peça esta permissão novamente. Nesse caso,
+ quando um aplicativo usa <code>requestPermissions()</code> para solicitar esta permissão,
+ o sistema nega imediatamente. Neste caso, o sistema chama
+ <code>onRequestPermissionsResult()</code> da mesma forma que faria se o usuário tivesse
+ rejeitado explicitamente a solicitação novamente. Por este motivo, o aplicativo
+ não pode presumir que uma interação direta com o usuário ocorreu.
+</p>
+
+<h2 id="testing">Teste de permissões de tempo de execução</h2>
+
+
+<p>
+ Se o aplicativo for direcionado para o M Developer Preview, deve-se testar
+ se ele lida com as permissões corretamente. Não se pode presumir que o aplicativo
+ terá qualquer permissão quando executado. Quando o aplicativo é iniciado pela primeira vez,
+ é provável que não tenha permissões. O usuário pode revogar e restaurar permissões
+ a qualquer momento.
+</p>
+
+<p>
+ Deve-se testar o aplicativo para garantir que ele se comporte corretamente em todas
+ as situações de permissão. Com o M Preview SDK, fornecemos os novos comandos
+ de <a href="{@docRoot}tools/help/adb.html">Android
+ Debug Bridge (adb)</a> para possibilitar que o aplicativo seja testado com quaisquer
+ configurações de permissões necessárias.
+</p>
+
+<h3>
+ Novas opções e comandos adb
+</h3>
+
+<p>
+ As ferramentas da plataforma M Preview SDK fornecem vários comandos novos para permitir
+ que você teste como o aplicativo lida com permissões.
+</p>
+
+<h4>
+ Instalar com permissões
+</h4>
+
+<p>
+ É possível usar a nova opção <code>-g</code> do comando <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a>, que instala o aplicativo
+ e fornece todas as permissões listadas em seu manifesto:
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ Conceder e revogar permissões
+</h4>
+
+<p>
+ É possível usar os novos comandos do <a href="{@docRoot}tools/help/adb.html#pm">gerenciador
+ de pacotes (pm)</a> de ADB para conceder e revogar as permissões de um aplicativo instalado.
+ Esta funcionalidade pode ser útil para testes automatizados.
+</p>
+
+<p>
+ Para conceder uma permissão, use o comando <code>grant</code> do gerenciador de pacote:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ Por exemplo: para conceder a permissão do pacote com.example.myapp para gravar áudios,
+ use este comando:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ Para revogar uma permissão, use o comando <code>revoke</code> do gerenciador de pacote:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">Práticas recomendadas</h2>
+
+<p>
+ O novo modelo de permissões fornece aos usuários uma experiência mais suave
+ e facilita a instalação de aplicativos, deixando-os mais confortáveis
+ com o que os aplicativos estão fazendo. Sugerimos que você siga as práticas recomendadas para aproveitar
+ todas as vantagens do novo modelo.
+</p>
+
+
+<h3 id="bp-what-you-need">Peça somente as permissões necessárias</h3>
+
+<p>
+ Sempre que você pede uma permissão, o usuário é forçado a tomar uma decisão.
+ Se o usuário negar a solicitação, a funcionalidade do aplicativo será reduzida.
+ Deve-se minimizar o número de solicitações realizadas.
+</p>
+
+<p>
+ Por exemplo: o aplicativo pode frequentemente adquirir a funcionalidade necessária usando
+ uma <a href="{@docRoot}guide/components/intents-filters.html">intenção</a> em vez
+ de solicitar permissões. Se o aplicativo precisa tirar fotos com a câmera do telefone,
+ é possível usar uma intenção {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE}. Quando o aplicativo executa a intenção,
+ o sistema pede para que o usuário escolha um aplicativo de câmera já instalado
+ para tirar a foto.
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ Não oprima o usuário
+</h3>
+
+<p>
+ Se você confrontar o usuário com várias solicitações de permissão de uma só vez,
+ é possível que ele se sinta oprimido e saia do aplicativo.
+ Em vez disso, deve-se solicitar as permissões somente quando necessário.
+</p>
+
+<p>
+ Em alguns casos, uma ou mais permissões podem ser absolutamente essenciais para o aplicativo.
+ Nesta situação, faz sentido solicitar todas as permissões assim
+ que o aplicativo é iniciado. Por exemplo: se você fizer um aplicativo de fotografia,
+ ele precisará de acesso à câmera do dispositivo. Quando o usuário iniciar o aplicativo
+ pela primeira vez, ele não se surpreenderá quando receber
+ uma solicitação de permissão para usar a câmera. Mas, se o mesmo aplicativo tiver um recurso
+ para compartilhar fotos com os contatos do usuário, <em>não</em> se deve
+ pedir esta permissão na primeira inicialização. Em vez disso, espere o usuário tentar usar
+ o recurso de compartilhamento para pedir a permissão.
+</p>
+
+<p>
+ Se o aplicativo fornecer um tutorial, faz sentido solicitar as permissões
+ necessárias no final da sequência do tutorial.
+</p>
+
+<h3 id="bp-explain">
+ Explique o porquê da necessidade das permissões
+</h3>
+
+<p>
+ O diálogo de permissões exibido pelo sistema ao chamar
+ <code>requestPermissions()</code> diz quais permissões o aplicativo requer,
+ mas não diz o porquê. Em alguns casos, o usuário pode achar isto confuso.
+ É uma boa ideia explicar ao usuário o porquê da necessidade das permissões
+ para o aplicativo antes de chamar <code>requestPermissions()</code>.
+</p>
+
+<p>
+ Por exemplo: um aplicativo de fotografia pode precisar usar serviços de localização
+ para poder marcar as fotos geograficamente. Um usuário normal pode não entender que uma foto
+ pode conter informações de localização e ficar confuso quando
+ o aplicativo de fotografia quiser saber a localização. Portanto, neste caso, é uma boa ideia o aplicativo explicar
+ ao usuário sobre este recurso <em>antes</em> de chamar
+ <code>requestPermissions()</code>.
+</p>
+
+<p>
+ Uma maneira de fazer isto é incorporar estas solicitações em um tutorial do aplicativo. O tutorial pode exibir cada um dos recursos
+ do aplicativo e, à medida que fizer isto,
+ pode também explicar quais permissões são necessárias. Por exemplo, o tutorial do aplicativo de fotografia
+ pode demonstrar os recursos de compartilhamento de fotos com os contatos e,
+ em seguida, dizer ao usuário que ele precisa fornecer as permissões
+ para que o aplicativo possa visualizar os contatos. O aplicativo pode então chamar <code>requestPermissions()</code> para solicitar
+ ao usuário este acesso. É claro que nem todos os usuários seguirão o tutorial.
+ Portanto, ainda é necessário verificar e solicitar as permissões durante
+ a operação normal do aplicativo.
+</p>
diff --git a/docs/html-intl/intl/pt-br/preview/images/direct-share-screen.png b/docs/html-intl/intl/pt-br/preview/images/direct-share-screen.png
new file mode 100644
index 0000000..a53a33e
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/direct-share-screen.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/direct-share-screen_2x.png b/docs/html-intl/intl/pt-br/preview/images/direct-share-screen_2x.png
new file mode 100644
index 0000000..87816ff
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/direct-share-screen_2x.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen.png b/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen.png
new file mode 100644
index 0000000..77f9982
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen_2x.png b/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen_2x.png
new file mode 100644
index 0000000..4749bcf
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/fingerprint-screen_2x.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline-crop.png b/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline-crop.png
new file mode 100644
index 0000000..724a6af
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline-crop.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline.png b/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline.png
new file mode 100644
index 0000000..e9a339e
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/m-preview-timeline.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/perf-test-frame-latency.png b/docs/html-intl/intl/pt-br/preview/images/perf-test-frame-latency.png
new file mode 100644
index 0000000..87d1cfc
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/perf-test-frame-latency.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/perf-test-framestats.png b/docs/html-intl/intl/pt-br/preview/images/perf-test-framestats.png
new file mode 100644
index 0000000..589a923
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/perf-test-framestats.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/text-selection.gif b/docs/html-intl/intl/pt-br/preview/images/text-selection.gif
new file mode 100644
index 0000000..1d82fc6
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/text-selection.gif
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/work-profile-screen.png b/docs/html-intl/intl/pt-br/preview/images/work-profile-screen.png
new file mode 100644
index 0000000..c3e4e44
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/work-profile-screen.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/images/work-profile-screen_2x.png b/docs/html-intl/intl/pt-br/preview/images/work-profile-screen_2x.png
new file mode 100644
index 0000000..5dcf610
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/images/work-profile-screen_2x.png
Binary files differ
diff --git a/docs/html-intl/intl/pt-br/preview/overview.jd b/docs/html-intl/intl/pt-br/preview/overview.jd
new file mode 100644
index 0000000..ce5a596
--- /dev/null
+++ b/docs/html-intl/intl/pt-br/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=Visão geral do programa
+page.metaDescription=Boas-vindas ao Android M Developer Preview, um programa que fornece tudo que é necessário para testar e otimizar os aplicativos para a próxima versão do Android.
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ Boas-vindas ao <strong>Android M Developer Preview</strong>, um programa que fornece
+ tudo que é necessário para testar e otimizar os aplicativos para a próxima versão
+ do Android. É de graça e você pode começar agora mesmo: basta fazer
+ o download das ferramentas M Developer Preview.
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ Imagens de sistema de emulador e hardware
+ </h5>
+
+ <p>
+ Execute e teste os aplicativos no Nexus 5, 6, 9 e Player (para TV), bem como
+ em emuladores.
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Código de plataforma mais recente
+ </h5>
+
+ <p>
+ Nós forneceremos várias atualizações durante a prévia. Portanto, você
+ testará de acordo com as alterações mais recentes da plataforma.
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Atualizações entregues por OTA
+ </h5>
+
+ <p>
+ É possível obter atualizações por OTA (over-the-air) ao programar o dispositivo
+ em flash para a prévia inicial.
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ Novos comportamentos e capacidades
+ </h5>
+
+ <p>
+ Inicie o trabalho cedo para suportar os novos comportamentos da plataforma,
+ como novo modelo de permissões de tempo de execução e recursos de economia de energia.
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Janela de prioridades para problemas informados por desenvolvedores
+ </h5>
+
+ <p>
+ Durante as primeiras semanas, nós daremos prioridade aos problemas informados
+ por desenvolvedores. Portanto, teste e forneça-nos feedback o quanto antes.
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Feedback e suporte
+ </h5>
+
+ <p>
+ Informe problemas e dê-nos feedback usando o <a href="https://code.google.com/p/android-developer-preview/">issue tracker</a>.
+ Conecte-se a outros desenvolvedores na <a href="http://g.co/dev/AndroidMDevPreview">Comunidade M Developer</a>.
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ Linha do tempo e atualizações
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ O M Developer Preview estará em execução de 28 de maio até o Android M SDK final, que
+ disponibilizaremos brevemente antes do lançamento público durante
+ o 3º trimestre de 2015.
+</p>
+
+<p>
+ Nos marcos de desenvolvimento principais, entregamos atualizações para os dispositivos de teste.
+ Os marcos de experiência são
+</p>
+
+<ul>
+ <li>
+ <strong>Preview 1</strong> (lançamento inicial do Preview, final de maio),
+ </li>
+
+ <li>
+ <strong>Preview 2</strong> (final de junho/início de julho) e
+ </li>
+
+ <li>
+ <strong>Preview 3</strong> (próximo ao final de julho)
+ </li>
+</ul>
+
+<p>
+ Estas atualizações culminam no <strong>SDK final</strong> (no 3º trimestre),
+ que fornecerá APIs oficiais para a nova versão do Android,
+ bem como os recursos e comportamentos do sistema final.
+</p>
+
+<p>
+ Ao testar e desenvolver no Android M, recomendamos que você <strong>mantenha
+ o ambiente de desenvolvimento atualizado</strong> à medida que atualizações do Preview são lançadas.
+ Para facilitar o processo, fornecemos <strong>atualizações "over-the-air"
+ (OTA)</strong> aos dispositivos já programados em flash para uma versão do Preview, além
+ de fornecemos imagens do sistema que estão disponíveis para download e programação em flash manualmente.
+</p>
+<p class="note">
+ <strong>Observação:</strong> as imagens do sistema e o SDK final não podem ser entregues
+ por OTA. Em vez disso, precisarão ser <strong>programadas em flash manualmente</strong> para
+ os dispositivos de teste.</strong>
+</p>
+
+<p>
+ Notificaremos você quando as atualizações do Preview estiverem disponíveis por meio do <a href="http://android-developers.blogspot.com/">Blogue de desenvolvedores do Android</a>, além
+ deste site
+ e da <a href="http://g.co/dev/AndroidMDevPreview">Comunidade Android M Developer</a>.
+</p>
+
+<h2 id="preview_tools">
+ O que há no Preview?
+</h2>
+
+<p>
+ O M Developer Preview inclui tudo que é necessário para testar os aplicativos existentes
+ em uma variedade de tamanhos de tela, tecnologias de rede, chipsets de CPU/GPU
+ e arquiteturas de hardware.
+</p>
+
+<h4>
+ Ferramentas SDK
+</h4>
+
+<p>
+ É possível fazer o download destes componentes pelo SDK Manager no <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a>:
+</p>
+
+<ul>
+ <li>M Developer Preview <strong>ferramentas SDK</strong>
+ </li>
+
+ <li>M Developer Preview <strong>imagem do sistema de emulador</strong> (32 bits
+e 64 bits)
+ </li>
+
+ <li>M Developer Preview <strong>imagem do sistema de emulador para Android TV</strong>
+ (32 bits)
+ </li>
+</ul>
+
+<h4>
+ Imagens do sistema de hardware
+</h4>
+
+<p>
+ É possível fazer o download destas imagens de sistema de hardware para dispositivos Nexus a partir
+ da <a href="download.html">página de download</a>:
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong> (GSM/LTE) imagem do sistema de dispositivo “hammerhead”
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> imagem do sistema de dispositivo “shamu”
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong> (Wi-Fi) imagem do sistema de dispositivo “volantis”
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong> (Android TV) imagem do sistema de dispositivo “fugu”
+ </li>
+</ul>
+
+<h4>
+ Exemplo de código e documentação
+</h4>
+
+<p>
+ Estes recursos de documentação ajudam você a aprender sobre o Preview:
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">Configuração do SDK</a> tem instruções passo a passo
+ para você começar.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">Guia de teste</a> e <a href="behavior-changes.html">Mudanças de comportamento</a> mostram as áreas essenciais para o teste.
+ </li>
+
+ <li>Documentação de novas APIs, incluindo uma <a href="api-overview.html">Visão geral das APIs</a>,
+ <a href="{@docRoot}preview/download.html#docs">Referência da API</a> disponível para download e guias de desenvolvedor detalhados sobre
+ os recursos principais, como
+ <a href="{@docRoot}preview/features/runtime-permissions.html">permissões</a>,
+ <a href="{@docRoot}preview/backup/index.html">backup de aplicativo</a> etc.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">Exemplo de código</a> que demonstra como suportar
+ permissões e outros novos recursos.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/support.html#release-notes">Notas de versão</a> para a versão atual do
+ M Developer Preview, incluindo notas de mudanças e relatórios de diferença.
+ </li>
+</ul>
+
+<h4>
+ Recursos de suporte
+</h4>
+
+<p>
+ Use estes recursos de suporte ao testar e desenvolver no
+ M Developer Preview:
+</p>
+
+<ul>
+ <li>O <a href="https://code.google.com/p/android-developer-preview/">Issue Tracker do M
+ Developer Preview</a> é o <strong>canal principal
+ de feedback.</strong> É possível informar erros, problemas de desempenho e feedback
+ geral pelo issue tracker. Também é possível verificar os <a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">erros conhecidos</a>
+ e encontrar etapas de resolução.
+ </li>
+
+ <li>A <a href="http://g.co/dev/AndroidMDevPreview">Comunidade Android M Developer
+</a> é uma comunidade do Google+ onde é possível <strong>se conectar
+ a outros desenvolvedores</strong> que trabalham com o Android M. É possível compartilhar
+ observações ou ideias, além de encontrar respostas para as dúvidas sobre o Android M.
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ Destinação, APIs de prévia e publicação
+</h2>
+
+<p>
+ O Android M Developer Preview é uma versão apenas para desenvolvimento
+ e <strong>não possui um nível da API padrão</strong>. Caso opte
+ pelos comportamentos de compatibilidade para testar o aplicativo (o que é muito recomendado),
+ é possível destinar o M Developer Preview configurando o <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>
+ do aplicativo para <code>“MNC”</code>.
+</p>
+
+<p>
+ O Android M Developer Preview fornece <strong>APIs de prévia</strong>
+ — as APIs não serão oficiais até o lançamento do SDK final,
+ atualmente planejado para o terceiro trimestre de 2015. Isto significa que é possível
+ <strong>esperar alterações secundárias de APIs</strong> com o tempo, especialmente
+ durante as semanas iniciais do programa. Forneceremos um resumo das alterações
+ com cada atualização do Android M Developer Preview.
+</p>
+
+<p class="note">
+ Observe que, apesar das APIs da prévia poderem ser alteradas, os comportamentos essenciais do sistema,
+ como permissões de tempo de execução e recursos de economia de energia, são estáveis e estão prontos
+ para serem testados.
+</p>
+
+<p>
+ Em termos de publicação, o Google Play <strong>evita a publicação de aplicativos
+ destinados para o M Developer Preview</strong>. Quando o SDK final do Android M estiver
+ disponível, você poderá destinar o nível da API do Android M oficial
+ e publicar o aplicativo no Google Play. Enquanto isso, caso queira distribuir um aplicativo
+ destinado para Android M para testadores, é possível fazê-lo por e-mail ou por download direto
+ a partir do site.
+</p>
+
+<h2 id="get_started">
+ Como começar
+</h2>
+
+<p>
+ Para começar o teste do aplicativo:
+</p>
+
+<ol>
+ <li>Revise a <a href="{@docRoot}preview/api-overview.html">Visão geral da API</a>
+ e as <a href="{@docRoot}preview/behavior-changes.html">Mudanças de comportamento</a> para
+ ter uma ideia do que há de novo e como isto afeta os aplicativos. Em particular, aprenda mais sobre
+ o novo modelo<a href="{@docRoot}preview/features/runtime-permissions.html">de permissões
+ de tempo de execução</a>, recursos de economia de energia e backup automático.
+ </li>
+
+ <li>Configure o ambiente seguindo as instruções para
+ <a href="{@docRoot}preview/setup-sdk.html">Configurar o Preview SDK</a>
+ e ajustar os dispositivos de teste.
+ </li>
+
+ <li>Siga <a href="https://developers.google.com/android/nexus/images">
+ as instruções de programação em flash</a> para programar em flash a imagem do sistema do M Developer Preview mais recente
+ para Nexus 5, 6, 9 e Player. Após programar em flash o dispositivo de desenvolvimento,
+ as atualizações do Preview serão entregues por atualizações OTA (over-the-air).</a>
+ </li>
+
+ <li>Faça o download da <a href="{@docRoot}preview/download.html#docs">Referência da API do
+ M Preview</a> e dos <a href="{@docRoot}preview/samples.html">exemplos do M Preview
+</a> para obter mais informações sobre os novos recursos de API e como usá-los
+ no aplicativo.
+ </li>
+
+ <li>Junte-se à <a href="http://g.co/dev/AndroidMDevPreview">Comunidade Android M
+ Developer</a> para obter as notícias mais recentes e conecte-se a outros
+ desenvolvedores que trabalham com a nova plataforma.
+ </li>
+</ol>
+
+<p>
+ Agradecemos a sua participação no programa M Developer Preview do Android!
+</p>
diff --git a/docs/html-intl/intl/ru/preview/api-overview.jd b/docs/html-intl/intl/ru/preview/api-overview.jd
new file mode 100644
index 0000000..ae30e09
--- /dev/null
+++ b/docs/html-intl/intl/ru/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=Обзор API-интерфейсов
+page.keywords=предварительная версия,пакет sdk,совместимость
+page.tags=previewresources, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Содержание
+<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">развернуть</span>
+ <span class="less" style="display:none">свернуть</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">Связывание приложений</a></li>
+ <li><a href="#backup">Автоматическое резервное копирование для приложений</a></li>
+ <li><a href="#authentication">Авторизация</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">Авторизация по отпечатку пальца</a></li>
+ <li><a href="#confirm-credential">Подтверждение учетных данных</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">Прямой обмен контентом</a></li>
+ <li><a href="#voice-interactions">Голосовой интерфейс</a></li>
+ <li><a href="#assist">API-интерфейс помощника</a></li>
+ <li><a href="#notifications">Уведомления</a></li>
+ <li><a href="#bluetooth-stylus">Поддержка пера Bluetooth</a></li>
+ <li><a href="#ble-scanning">Улучшенное сканирование Bluetooth с низким потреблением энергии</a></li>
+ <li><a href="#hotspot">Поддержка Hotspot 2.0, выпуск 1</a></li>
+ <li><a href="#4K-display">Режим отображения в формате 4K</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">Метод ColorStateLists для работы с темами</a></li>
+ <li><a href="#audio">Работа с аудио</a></li>
+ <li><a href="#video">Работа с видео</a></li>
+ <li><a href="#camera">Возможности камеры</a>
+ <ol>
+ <li><a href="#flashlight">API-интерфейс вспышки</a></li>
+ <li><a href="#reprocessing">Повторная обработка изображения с камеры</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Возможности Android for Work</a></li>
+</ol>
+
+<h2>Различия между API-интерфейсами</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API уровня 22 в M Preview »</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M Developer Preview — ознакомительная версия предстоящего выпуска платформы Android,
+в котором реализованы новые возможности как для пользователей, так и для
+разработчиков приложений. В этой статье мы расскажем о наиболее интересных API-интерфейсах.</p>
+
+<p>Версия M Developer Preview предназначена для тех, <strong>кто хочет первым ознакомиться с новой платформой</strong>,
+а также для <strong>тестировщиков</strong>. <a href="{@docRoot}preview/setup-sdk.html">M Developer Preview — прекрасная возможность
+</a>повлиять на вектор развития
+платформы Android.
+Мы с нетерпением ждем ваших отзывов!</p>
+
+<p class="caution"><strong>Внимание!</strong> Не публикуйте в магазине Google Play приложения,
+предназначенные для M Developer Preview.</p>
+
+<p class="note"><strong>Примечание.</strong> В этой статье часто упоминаются классы и методы,
+для которых на сайте <a href="{@docRoot}">developer.android.com</a> пока еще нет справочных материалов. Такие элементы API-интерфейса обозначаются здесь следующим образом:
+{@code code style} (без гиперссылок). Чтобы ознакомиться с предварительной документацией по этим элементам,
+загрузите <a href="{@docRoot}preview/download.html#docs">справочное руководство по предварительной версии</a>.</p>
+
+<h3>Важные изменения в работе приложений</h3>
+
+<p>Если вы ранее публиковали приложения для Android, то примите во внимание, что изменения в платформе могут повлиять
+на работу опубликованных приложений.</p>
+
+<p>Подробные сведения представлены в статье <a href="behavior-changes.html">Изменения в работе</a>.</p>
+
+<h2 id="app-linking">Связывание приложений</h2>
+<p>В M Preview улучшена система намерений Android за счет более эффективного связывания приложений.
+Теперь у вас есть возможность связывать приложения с вашими собственными веб-доменами. Благодаря этому
+платформа может сама, без вмешательства пользователя, определить приложение, которое будет использоваться по умолчанию
+для обработки определенной веб-ссылки. О том, как реализовать такую возможность, можно почитать в статье
+<a href="{@docRoot}preview/features/app-linking.html">Связывание приложений</a>.
+
+<h2 id="backup">Автоматическое резервное копирование для приложений</h2>
+<p>Теперь система автоматически выполняет полное резервное копирование и восстановление данных ваших приложений. Для приложений,
+написанных под M Preview, эта функция включена по умолчанию — вам даже не нужно добавлять отдельный код. Если пользователь решит удалить свою учетную запись Google, все резервные копии его данных также будут удалены.
+ О том, как работает эта функция и как настроить параметры резервного копирования элементов файловой системы,
+ рассказано в статье
+<a href="{@docRoot}preview/backup/index.html">Автоматическое резервное копирование для приложений</a>.</p>
+
+<h2 id="authentication">Авторизация</h2>
+<p>В M Preview представлены новые API-интерфейсы, которые позволяют авторизовать пользователей по отпечатку пальца
+(на устройствах, поддерживающих такую возможность), а также подтвердить учетные данные, если пользователь недавно авторизовался через механизмы разблокировки устройства
+(например, вводил пароль для разблокировки экрана). Эти API-интерфейсы рекомендуется использовать совместно с
+<a href="{@docRoot}training/articles/keystore.html">системой хранилища ключей Android</a>.</p>
+
+<h3 id="fingerprint-authentication">Авторизация по отпечатку пальца</h3>
+
+<p>Чтобы авторизовать пользователя по отпечатку пальца, получите экземпляр нового класса
+{@code android.hardware.fingerprint.FingerprintManager} и вызовите метод
+{@code FingerprintManager.authenticate()}. Эта функция доступна для совместимых
+устройств, оснащенных сканером отпечатков пальцев. Прежде всего, вам необходимо реализовать в своем приложении пользовательский интерфейс проверки
+подлинности по отпечатку пальца, а также использовать для него стандартный значок отпечатка пальца Android.
+Этот значок ({@code c_fp_40px.png}) вы можете найти в
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">примере приложения</a>. При разработке нескольких приложений, использующих функцию авторизации по отпечатку пальца,
+помните, что каждое из них должно самостоятельно выполнять проверку подлинности.
+</p>
+
+<p>Чтобы реализовать эту функцию, сначала добавьте в файл манифеста разрешение {@code USE_FINGERPRINT}.
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>Пример такой проверки подлинности вы найдете в
+<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">примере
+диалогового окна авторизации по отпечатку пальца</a>.</p>
+
+<p>Если вы тестируете эту функцию, выполните следующие действия:</p>
+<ol>
+<li>Установите инструменты SDK Android (версию 24.3), если у вас их еще нет.</li>
+<li>Зарегистрируйте в эмуляторе новый отпечаток пальца (в разделе
+<strong>Настройки > Безопасность > Отпечаток пальца</strong>) и следуйте дальнейшим инструкциям.</li>
+<li>Воспользовавшись указанной ниже командой, сымитируйте в эмуляторе события касания для проверки отпечатка пальца.
+ С помощью этой же команды сымитируйте события касания для проверки отпечатка пальца на экране блокировки или в
+своем приложении.
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>В Windows, возможно, потребуется выполнить команду {@code telnet 127.0.0.1 <emulator-id>}, а затем
+{@code finger touch <finger_id>}.
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">Подтверждение учетных данных</h3>
+<p>Для авторизации пользователей ваше приложение может обратиться к сведениям о том, как давно они разблокировали свое устройство в последний раз. Эта функция
+избавляет пользователя от необходимости запоминать отдельные пароли для каждого приложения, а вас — от необходимости
+реализовывать собственный пользовательский интерфейс авторизации. В приложении эту функцию следует
+использовать совместно с реализацией открытого или секретного ключа для авторизации пользователей.</p>
+
+<p>Чтобы задать временя ожидания, в течение которого после успешной
+авторизации можно использовать ключ повторно, вызовите новый метод
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+при настройке {@link javax.crypto.KeyGenerator} или
+{@link java.security.KeyPairGenerator}. На сегодняшний день эта функция совместима с симметричными криптографическими
+операциями.</p>
+
+<p>Не стоит слишком часто отображать диалоговое окно повторной авторизации — ваше
+приложение должно сначала попробовать использовать криптографический объект и только потом, если окажется, что время ожидания истекло, обратиться к методу
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
+для повторной авторизации пользователя.
+</p>
+
+<p>Как можно реализовать эту функцию, показано в
+<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">примерепроверки учетных данных</a>.
+</p>
+
+<h2 id="direct-share">Прямой обмен контентом</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>M Preview содержит API-интерфейсы для интуитивно понятного и быстрого обмена контентом между пользователями. Теперь вы можете
+определить <em>целевые объекты прямого обмена</em>, которые будут запускать определенную операцию в приложении
+и открываться в меню <em>Поделиться</em>. С помощью данной функции пользователи могут обмениваться контентом
+с целевыми объектами, такими как контакты, в других приложениях. Например, целевой объект прямого обмена может запустить операцию
+в другом приложении социальной сети, что позволит пользователю напрямую делиться контентом с другом
+или членами сообщества через это приложение.</p>
+
+<p>Чтобы включить использование целевых объектов прямого обмена, необходимо определить класс, который наследует класс
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService}. Объявите
+{@code ChooserTargetService} в манифесте. В этом объявлении укажите разрешение
+{@code BIND_CHOOSER_TARGET_SERVICE} и фильтр намерений с помощью действия
+{@code SERVICE_INTERFACE}.</p>
+<p>В примере ниже показано, как объявить {@code ChooserTargetService}
+ в вашем манифесте.</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>Для каждого действия, которое необходимо сделать доступным для {@code ChooserTargetService}, добавьте в манифест вашего приложения элемент
+{@code <meta-data>} с именем
+{@code "android.service.chooser.chooser_target_service"}.
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">Голосовой интерфейс</h2>
+<p>
+В M Preview представлен новый голосовой API-интерфейс, который, наряду с
+<a href="https://developers.google.com/voice-actions/" class="external-link">голосовыми командами</a>,
+позволяет встраивать в приложение диалоговое голосовое взаимодействие. Вызовите метод
+{@code android.app.Activity.isVoiceInteraction()}, чтобы определить, была ли операция запущена
+в ответ на голосовую команду. Если это так, ваше приложение может использовать класс
+{@code android.app.VoiceInteractor}, чтобы получить голосовое подтверждение от пользователя, предложить ему список вариантов
+на выбор и многое другое. Подробнее о реализации голосовых команд можно почитать в
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">руководстве к голосовому интерфейсу</a>.
+</p>
+
+<h2 id="assist">API-интерфейс помощника</h2>
+<p>
+M Preview предлагает новый способ взаимодействия пользователей с приложением — взаимодействие посредством помощника. Для этого
+пользователю необходимо разришить помощнику использовать текущий контекст, после чего он сможет вызывать помощника
+в любом приложении, удерживая кнопку <strong>Домой</strong>.</p>
+<p>Разработчик может также запретить приложению сообщать помощнику текущий контекст. Для этого установите флаг
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE}. Кроме стандартного набора
+информации, который платформа передает помощнику, ваше приложение может сообщать ему дополнительные
+сведения посредством нового класса {@code android.app.Activity.AssistContent}.</p>
+
+<p>Чтобы предоставить помощнику дополнительный контекст из вашего приложения, выполните следующие действия:</p>
+
+<ol>
+<li>Реализуйте интерфейс {@link android.app.Application.OnProvideAssistDataListener}.</li>
+<li>Зарегистрируйте этот приемник с помощью
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()}.</li>
+<li>Для предоставления контекста, относящего к конкретной операции, переопределите метод обратного вызова
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()},
+а также, при желании, новый метод обратного вызова{@code Activity.onProvideAssistContent()}.
+</ol>
+
+<h2 id="notifications">Уведомления</h2>
+<p>В API-интерфейс уведомлений внесены следующие изменения:</p>
+<ul>
+ <li>{@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} — новый уровень фильтрации,
+соответствующий новому режиму «Не беспокоить» <em>Только будильник</em>.</li>
+ <li>{@code Notification.CATEGORY_REMINDER} — новое значение категории, позволяющее отличить
+установленные пользователем напоминания от других событий
+({@link android.app.Notification#CATEGORY_EVENT}) и будильников
+({@link android.app.Notification#CATEGORY_ALARM}).</li>
+ <li>{@code android.graphics.drawable.Icon} — новый класс, который можно добавить к уведомлениям
+с помощью методов {@code Notification.Builder.setSmallIcon(Icon)} и
+{@code Notification.Builder.setLargeIcon(Icon)}.</li>
+ <li>{@code NotificationManager.getActiveNotifications()} — новый метод, с помощью которого ваше приложение
+может определить, какие из уведомлений в настоящее время активны. Если хотите взглянуть, как может быть реализовано приложение
+с этой функцией, пройдите по ссылке: <a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">Пример активных уведомлений</a>.</li>
+</ul>
+
+<h2 id="bluetooth-stylus">Поддержка пера Bluetooth</h2>
+<p>В M Preview улучшена поддержка ввода с помощью пера Bluetooth. Пользователи могут подключить
+совместимое перо Bluetooth к своему смартфону или планшету. Когда перо подключено, данные о его
+положении объединяются со сведениями о степени нажима и нажатия кнопки на пере,
+и таким образом при сенсорном вводе используются не только возможности сенсорного экрана. Ваше приложение может отслеживать
+нажатия кнопки пера и выполнять дополнительные действия, регистрируя в операции новые методы обратного вызова
+{@code View.onStylusButtonPressListener} и
+{@code GestureDetector.OnStylusButtonPressListener}.</p>
+
+<p>Для определения нажатий кнопок пера используйте методы и константы {@link android.view.MotionEvent}:
+</p>
+<ul>
+<li>Если пользователь касается пером кнопки на экране приложения, метод
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} возвращает
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}.</li>
+<li>В приложениях, разработанных для M Preview, при нажатии пользователем на основную кнопку на пере, метод
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+возвращает{@code MotionEvent.STYLUS_BUTTON_PRIMARY}.
+ Если перо оснащено дополнительной кнопкой, то при нажатии на нее этот метод возвращает
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY}. При нажатии пользователем
+на обе кнопки одновременно, метод возвращает оба значения через оператор «OR»
+({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY}).</li>
+<li>
+В приложениях, разработанных для более ранних версий платформы, метод
+{@link android.view.MotionEvent#getButtonState() getButtonState()} возвращает
+{@link android.view.MotionEvent#BUTTON_SECONDARY} (при нажатии на основную кнопку на пере),
+{@link android.view.MotionEvent#BUTTON_TERTIARY} (при нажатии дополнительной кнопки на пере) или оба этих значения.
+</li>
+</ul>
+
+<h2 id="ble-scanning">Улучшенное сканирование Bluetooth с низким потреблением энергии</h2>
+<p>
+Если ваше приложение выполняет сканирование Bluetooth с низким потреблением энергии, вы можете при помощи нового метода
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} указать, что обратные вызовы следует уведомлять только в случае, если прежде обнаружен пакет объявления,
+ совпадающий с заданным фильтром
+{@link android.bluetooth.le.ScanFilter}, или если он не обнаруживается в течение заданного периода времени.
+ Такой подход к сканированию обеспечивает еще большую экономию энергии, чем это было возможно в предыдущей
+версии платформы.
+</p>
+
+<h2 id="hotspot">Поддержка Hotspot 2.0, выпуск 1</h2>
+<p>
+В M Preview включена поддержка Hotspot 2.0 (выпуск 1) для устройств Nexus 6 и Nexus 9. Для
+предоставления учетных данных Hotspot 2.0 в вашем приложении используйте новые методы класса
+{@link android.net.wifi.WifiEnterpriseConfig}, такие как {@code setPlmn()} и
+{@code setRealm()}. В объекте {@link android.net.wifi.WifiConfiguration} можно задать поля
+{@link android.net.wifi.WifiConfiguration#FQDN} и {@code providerFriendlyName}.
+Новое свойство{@code ScanResult.PasspointNetwork} показывает, является ли обнаруженная
+сеть точкой доступа Hotspot 2.0.
+</p>
+
+<h2 id="4K-display">Режим отображения в формате 4K</h2>
+<p>Теперь платформа позволяет приложениям запрашивать увеличение разрешения экрана до 4K при обработке изображения
+на совместимом устройстве. Чтобы запросить текущее физическое разрешение, используйте новые API-интерфейсы
+{@code android.view.Display.Mode}. Если элементы пользовательского интерфейса, отрисованные в более низком логическом разрешении, масштабируются до
+более высокого физического разрешения, обратите внимание, что метод физического разрешения
+{@code Display.Mode.getPhysicalWidth()} возвращает результат, который может отличаться от результата выполнения метода логического разрешения
+{@link android.view.Display#getSize(android.graphics.Point) getSize()} .</p>
+
+<p>Можно отправить запрос системе на изменение физического разрешения в активном приложении, задав для окна вашего приложения свойство
+{@code WindowManager.LayoutParams.preferredDisplayModeId}. Эта
+функция особенно полезна в случаях, когда требуется переключиться на разрешение экрана 4K. В режиме отображения в формате 4K элементы
+пользовательского интерфейса отрисовываются в исходном разрешении (например, 1080p) и масштабируются до 4K, однако содержимое
+{@link android.view.SurfaceView} объектов может отображаться с использованием основного разрешения.</p>
+
+<h2 id="behavior-themeable-colorstatelists">Метод ColorStateLists для работы с темами</h2>
+<p>Теперь метод
+{@link android.content.res.ColorStateList} для устройств под управлением M Preview поддерживает атрибуты темы. Методы
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} и
+{@link android.content.res.Resources#getColor(int) getColor()} уже неактуальны. Если вы
+вызываете эти API-интерфейсы, вызовите вместо них новые методы {@code Context.getColorStateList()} или
+{@code Context.getColor()}, Доступные также в библиотеке v4 appcompat
+посредством {@link android.support.v4.content.ContextCompat}.</p>
+
+<h2 id="audio">Работа с аудио</h2>
+
+<p>В M Preview реализован ряд улучшений в области обработки аудиофайлов системой Android, включая следующие: </p>
+<ul>
+ <li>Новые API-интерфейсы {@code android.media.midi}, поддерживающие протокол <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
+ для отправки и получения событий
+MIDI.</li>
+ <li>Новые классы: {@code android.media.AudioRecord.Builder} позволяет создавать объекты захвата цифрового аудио, а {@code android.media.AudioTrack.Builder} — объекты воспроизведения,
+а также осуществлять настройку источника
+аудио и свойств приемника, переопределяя исходные системные настройки.</li>
+ <li>Обработчики API-интерфейсов предназначены для связывания аудиофайлов и устройств ввода. Это особенно полезно в случае, если ваше приложение
+предоставляет возможность выполнять голосовой поиск с помощью игрового контроллера или пульта дистанционного управления, подключенного к Android
+TV. Когда пользователь запустит поиск, система вызовет новый метод обратного вызова {@code android.app.Activity.onSearchRequested()}.
+ Чтобы определить, оснащено ли устройство ввода встроенным микрофоном, получите из этого метода обратного вызова объект
+{@link android.view.InputDevice} и вызовите новый метод
+{@code InputDevice.hasMic()}.</li>
+ <li>Новый класс {@code android.media.AudioDevicesManager}, позволяющий пользователю получить список всех
+подключенных источников аудио и приемников. Также можно указать объект
+{@code android.media.OnAudioDeviceConnectionListener}, если требуется, чтобы приложение
+получало уведомления о подключении или отключении аудиоустройств.</li>
+</ul>
+
+<h2 id="video">Работа с видео</h2>
+<p>В M Preview вы обнаружите новые возможности API-интерфейсов для обработки видео, в том числе:</p>
+<ul>
+<li>Новый класс {@code android.media.MediaSync} обеспечивает синхронную обработку потоков
+аудио и видео. Буферы аудио отправляются неблокируемым способом и возвращаются посредством
+обратного вызова. Также имеется поддержка динамической скорости воспроизведения.
+</li>
+<li>Новое событие {@code MediaDrm.EVENT_SESSION_RECLAIMED} указывает на то, что сеанс, запущенный
+приложением, освобожден диспетчером ресурсов. Если в вашем приложении используются сеансы DRM, то это событие
+необходимо обработать и убедиться в том, что освобожденный сеанс не используется.
+</li>
+<li>Новый код ошибки {@code MediaCodec.CodecException.ERROR_RECLAIMED} указывает на то, что
+диспетчер ресурсов освободил ресурс мультимедиа, используемый кодеком. Во всех остальных случаях кодек должен
+быть освобожден, поскольку его необходимо перевести в конечное состояние.
+</li>
+<li>Новый интерфейс {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} позволяет узнать максимальное количество
+ экземпляров кодека, которые могут выполняться одновременно.
+</li>
+<li>Новый {@code MediaPlayer.setPlaybackParams()} метод задает скорость при ускоренном или
+замедленном воспроизведении мультимедиа. Он также позволяет автоматически замедлять или ускорять воспроизведение аудио синхронно с
+видео.</li>
+</ul>
+
+<h2 id="camera">Возможности камеры</h2>
+<p>В M Preview представлены следующие API-интерфейсы для вспышки камеры и повторной обработки
+изображений камерой.</p>
+
+<h3 id="flashlight">API-интерфейс вспышки</h3>
+<p>Если камера оснащена вспышкой, вы можете вызвать метод{@code CameraManager.setTorchMode()},
+чтобы включить или отключить режим фонарика, не запуская камеру. Приложение
+не может заполучить вспышку или камеру в единоличное пользование. Режим фонарика отключается
+и становится недоступен, когда камера недоступна или ресурсов камеры недостаточно для использования вспышки в качестве
+фонарика. Кроме того, другие приложения могут вызывать метод {@code setTorchMode()}
+для отключения режима фонарика. При закрытии приложения, которое включило режим фонарика, этот режим
+отключается.</p>
+
+<p>Чтобы зарегистрировать обратный вызов для уведомления о режиме фонарика, вызовите метод
+{@code CameraManager.registerTorchCallback()}. При первой регистрации обратного вызова
+он сразу же вызывается со сведениями о состоянии режима фонарика для всех известных к настоящему моменту устройств,
+оснащенных вспышкой. При успешном включении или отключении фонарика вызывается метод
+{@code CameraManager.TorchCallback.onTorchModeChanged()}.</p>
+
+<h3 id="reprocessing">API-интерфейс повторной обработки</h3>
+<p>API-интерфейс {@link android.hardware.camera2 Camera2} теперь поддерживает повторную обработку цветовых моделей YUV и изображений в собственном
+формате непрозрачности. Чтобы определить, возможна ли повторная обработка, приложение использует метод
+{@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES}. Если устройство поддерживает повторную обработку,
+вы можете создать сеанс захвата изображения с камеры с возможностью повторной обработки, вызвав метод
+{@code CameraDevice.createReprocessableCaptureSession()}, а затем создать запросы на повторную обработку буфера
+входных данных.</p>
+
+<p>Чтобы подключить поток буфера входных данных к модулю повторной обработки изображения с камеры, используйте класс
+{@code ImageWriter}. Чтобы получить пустой буфер, выполните следующие действия:</p>
+
+<ol>
+<li>Вызовите метод {@code ImageWriter.dequeueInputImage()}.</li>
+<li>Заполните буфер входными данными.</li>
+<li>Отправьте буфер в камеру, вызвав метод {@code ImageWriter.queueInputImage()}.</li>
+</ol>
+
+<p>Если вы используете объект {@code ImageWriter} вместе с изображением
+{@code android.graphics.ImageFormat.PRIVATE}, вашему приложению не удастся получить доступ к изображению
+напрямую. Вместо этого передайте изображение {@code ImageFormat.PRIVATE} прямо в
+{@code ImageWriter}, вызвав метод {@code ImageWriter.queueInputImage()} без копии
+буфера.</p>
+
+<p>Класс {@code ImageReader} теперь поддерживает потоки изображений в формате {@code android.graphics.ImageFormat.PRIVATE}.
+ Благодаря этому ваше приложение может организовать циклическую очередь выходных изображений
+{@code ImageReader}, выбрать одно или несколько изображений и отправить их в
+{@code ImageWriter} для повторной обработки камерой.</p>
+
+<h2 id="afw">Возможности Android for Work</h2>
+<p>В M Preview представлены новые API-интерфейсы для Android for Work:</p>
+<ul>
+ <li><strong>Улучшенные элементы управления для корпоративных специализированных устройств.</strong> Владельцу устройства
+теперь доступны новые возможности управления
+корпоративными специализированными устройствами при помощие следующих настроек:
+ <ul>
+ <li>Отключение или повторное включение блокировки клавиатуры с помощью метода
+{@code DevicePolicyManager.setKeyguardEnabledState()}.</li>
+ <li>Отключение или повторное включение строки состояния (включая быстрые настройки, уведомления и
+запуск Google Now путем проведения пальцем по экрану) с помощью метода
+{@code DevicePolicyManager.setStatusBarEnabledState()}.</li>
+ <li>Отключение и повторное включение безопасной загрузки с помощью константы
+{@code DISALLOW_SAFE_BOOT} {@link android.os.UserManager}.</li>
+ <li>Предотвращение отключения экрана, если устройство питается от сети, с помощью константы
+{@code STAY_ON_WHILE_PLUGGED_IN} {@link android.provider.Settings.Global}.</li>
+ </ul>
+ </li>
+ <li><strong>Автоматические установка и удаление приложений владельцами устройств.</strong> Владелец устройства теперь может автоматически
+устанавливать и удалять приложения с помощью API-интерфейсов {@link android.content.pm.PackageInstaller},
+независимо от Google Play for Work. Теперь вы можете подготавливать устройства с помощью компонента «Владелец устройства», который
+получает и устанавливает приложения без участия пользователя. Такая возможность особенно полезна тем, что позволяет подготавливать
+киоски или иные подобные устройства одним касанием, не активируя аккаунт Google.</li>
+<li><strong>Автоматический доступ к корпоративному сертификату.</strong> Теперь, когда приложение вызывает метод
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()},
+владелец профиля или устройства, прежде чем ему будет предложено выбрать сертификат, может вызывать метод
+{@code DeviceAdminReceiver.onChoosePrivateKeyAlias()}, который автоматически предоставит предложению псевдоним.
+ С помощью этой возможности вы можете предоставлять управляемым приложениям доступ к сертификатам без
+вмешательства пользователя.</li>
+<li><strong>Автоматическое принятие обновлений системы.</strong> Настройка параметров обновления системы с помощью
+{@code DevicePolicyManager.setSystemUpdatePolicy()} теперь позволяет компоненту «Владелец устройства» автоматически принять обновление системы
+(например, в киоске) или отложить его на период до 30 дней, причем пользователь
+тоже не сможет установить обновление до истечения этого срока. Более того, администратор может задать ежедневный временной интервал, когда устройство будет принимать
+обновления (например, во те часы, когда киоск не используется). При наличии доступного
+обновления система проверяет, заданы ли параметры обновления системы приложением «Параметры работы»
+, и выполняет соответствующие действия.
+</li>
+<li>
+<strong>Делегированная установка сертификата.</strong> Владелец профиля или устройства теперь может предоставлять
+стороннему приложению возможность вызывать следующие API-интерфейсы управления сертификатом
+{@link android.app.admin.DevicePolicyManager}:
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>Корпоративная настройка защиты от сброса параметров до заводских настроек.</strong> При подготовке компонента «Владелец устройства» теперь
+имеется возможность настроить параметры разблокировки защиты от сброса параметров до заводских настроек (FRP) путем задания пакета
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS}. Приложение NFC Programmer
+может после перезагрузки устройства предоставить эти параметрыс целью разблокировки FRP и его подготовки
+(без необходимости запрашивать ранее настроенную учетную запись Google). Если не изменить эти параметры,
+заводские настройки сохранятся не позволят активировать устройство без ввода активированных ранее
+учетных данных Google.
+<p>Кроме того, задав ограничения на использование служб Google Play, компонент «Владелец устройства» может указать альтернативные учетные записи
+Google для разблокировки FRP и замены учетных записей, активированных на устройстве.</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>Отслеживание использования данных.</strong> Владелец профиля или устройства теперь может запрашивать статистику использования
+данных, которая отображается в разделе <strong>Настройки > Использование данных</strong>, с помощью новых методов
+{@code android.app.usage.NetworkStatsManager}. Владельцам профилей автоматически предоставляется
+разрешение запрашивать данные профиля, которым они управляют, тогда как владельцам устройств предоставляется доступ к сведениям об использовании данных
+основного управляемого пользователя.</li>
+<li><strong>Управление разрешениями на выполнение.</strong>
+<p>Владелец профиля или устройства может задавать политику разрешений
+для всех запросов на использование среды выполнения любых приложений с помощью
+{@code DevicePolicyManager.setPermissionPolicy()}. Это позволяет выбрать, будет ли система предлагать пользователю предоставить разрешение
+как обычно, или она будет автоматически предоставлять разрешения или отказывать в них. В последнем случае
+пользователю не удастся изменить выбор, сделанный владельцем профиля или устройства на экране
+разрешений приложения в разделе <strong>Настройки</strong>.</p></li>
+<li><strong>VPN в разделе «Настройки».</strong> Приложения VPN теперь отображаются в разделе
+<strong>Настройки > Другие сети > VPN</strong>.
+Кроме того, сведения в уведомлениях об использовании VPN теперь зависят от настроек самой VPN.
+ Для владельца профиля уведомления зависят от того, настроена ли VPN для
+управляемого профиля, личного профиля или же того и другого. Для владельца устройства уведомления зависят от того, настроена ли VPN для
+всего устройства.</li>
+<li><strong>Уведомление о состоянии «В работе».</strong> Теперь, когда приложения
+из управляемого профиля выполняет операцию в фоновом режиме, в строке состояния появляется значок портфеля. Кроме того, если после разблокировки устройства
+открывается операция приложения из управляемого профиля, отображается всплывающее уведомление о том,
+что операция выполняется в рабочем профиле.
+</li>
+</ul>
+
+<p class="note">
+ Подробные сведения обо всех изменениях в API-интерфейсах в версии M Developer Preview представлены в <a href="{@docRoot}preview/download.html">отчете о различиях между API-интерфейсами</a>.
+</p>
diff --git a/docs/html-intl/intl/ru/preview/behavior-changes.jd b/docs/html-intl/intl/ru/preview/behavior-changes.jd
new file mode 100644
index 0000000..0623ea7
--- /dev/null
+++ b/docs/html-intl/intl/ru/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=Изменения в работе
+page.keywords=предварительная версия,пакет sdk,совместимость
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>Содержание документа</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">Разрешения на выполнение</a></li>
+ <li><a href="#behavior-power">Оптимизация экономии энергии</a>
+ <ol>
+ <li><a href="#behavior-doze">Режим «Doze»</a></li>
+ <li><a href="#behavior-app-standby">Ждущий режим для приложений</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">Подключаемые устройства хранения</a></li>
+ <li><a href="#behavior-apache-http-client">Отказ от HTTP-клиента Apache</a></li>
+ <li><a href="#behavior-audiomanager-Changes">Изменения в классе AudioManager</a></li>
+ <li><a href="#behavior-test-selection">Выделение текста</a></li>
+ <li><a href="#behavior-keystore">Изменения в хранилище ключей Android</a></li>
+ <li><a href="#behavior-network">Изменения в работе с Wi-Fi и сетями</a></li>
+ <li><a href="#behavior-camera">Изменения в службе камеры</a></li>
+ <li><a href="#behavior-art-runtime">Среда выполнения ART</a></li>
+ <li><a href="#behavior-apk-validation">Проверка пакетов APK</a></li>
+ <li><a href="#behavior-afw">Изменения в Android for Work</a></li>
+</ol>
+
+<h2>Различия между API-интерфейсами</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API уровня 22 в M Preview »</a> </li>
+</ol>
+
+
+<h2>См. также:</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">Обзор API-интерфейсов M Developer Preview</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>Наряду с новыми функциями и возможностями, версия M Developer Preview также включает в себя ряд
+системных изменений и изменений в работе API-интерфейсов. В этом документе рассматриваются
+определенные ключевые изменения, о которых следует знать, чтобы учитывать их при разработке приложений.</p>
+
+<p>Если вы ранее публиковали приложения для Android, то примите во внимание,
+что эти изменения в платформе могут повлиять на работу ваших уже опубликованных приложений.</p>
+
+<h2 id="behavior-runtime-permissions">Разрешения на выполнение</h1>
+<p>В M Preview представлена новая модель разрешений: теперь пользователи могут управлять разрешениями приложений
+напрямую во время работы с ними. Такая модель обеспечивает улучшенное управление
+разрешениями и одновременно позволяет оптимизировать установку и автоматическое обновление для разработчиков.
+Пользователи могут предоставлять разрешения или отзывать их отдельно для каждого установленного приложения. </p>
+
+<p>В ваших приложениях, предназначенных для M Preview, следует в обязательном порядке проверить такие разрешения и при необходимости
+запросить их. Чтобы определить, было ли вашему приложению предоставлено разрешение, вызовите новый метод
+{@code Context.checkSelfPermission()}. Чтобы запросить разрешение, вызовите новый метод
+{@code Activity.requestPermission()}. Даже если ваше приложение не предназначено для использования в версии M, вам все равно следует
+протестировать его с использованием новой модели разрешений.</p>
+
+<p>Подробные сведения о поддержке новой модели
+разрешений вашим приложением представлены в статье
+<a href="{@docRoot}preview/features/runtime-permissions.html">Разрешения</a>. Как можно проверить влияние новой модели на ваше приложение, читайте в
+<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">руководстве по тестированию</a></p>
+
+<h2 id="behavior-power">Оптимизация экономии энергии</h2>
+<p>В M Preview реализован ряд новых функций оптимизации экономии энергии для неактивных устройств и приложений.</p>
+
+<h3 id="behavior-doze">Режим «Doze»</h3>
+<p>Если устройство отключено от сети и остается неактивным (и с выключенным экраном) в течение определенного времени,
+оно переходит в режим <em>Doze</em> и старается, чтобы система не выходила из спящего состояния. В этому режиме
+устройство периодически возобновляет свою обычную работу на краткие промежутки времени, чтобы произвести
+синхронизацию и позволить системе выполнить какие-либо отложенные операции.</p>
+
+<p>Когда устройство находится в режиме «Doze», к приложениям применяются следующие ограничения:</p>
+<ul>
+<li>Доступ к сети отключен до тех пор, пока от службы Google Cloud Messaging
+не будет получен высокоприоритетный сигнал побуждения приложения к действию.</li>
+<li>Механизмы <a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">WakeLock</a> игнорируются.</li>
+<li>Будильники, установленные с помощью класса {@link android.app.AlarmManager}, отключаются, кроме
+тех, которые установлены с помощью методов {@link android.app.AlarmManager#setAlarmClock setAlarmClock()}
+и {@code AlarmManager.setAndAllowWhileIdle()}.</li>
+<li>Поиск сетей Wi-Fi не производится.</li>
+<li>Операции синхронизации и заданий для адаптеров синхронизации и {@link android.app.job.JobScheduler} блокируются.
+</li>
+</ul>
+</p>
+<p>После выхода из режима «Doze», устройство приступает к выполнению любых отложенных заданий и операций синхронизации.</p>
+<p>Чтобы протестировать эту функцию, подключите устройство под управлением M Preview к своему компьютеру
+для разработки и выполните следующие команды:
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>Примечание.</strong> В предстоящем выпуске службы
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud Messaging</a>
+реализована возможность назначения сообщений
+с высоким приоритетом. При получении вашим приложением сообщений GCM с высоким приоритетом ему на короткое время предоставляется
+доступ к сети, даже если устройство находится в режиме «Doze».
+</p>
+
+<p>Советы по тестированию работы приложений в режиме «Doze» представлены
+в <a href="{@docRoot}preview/testing/guide.html#doze-standby">руководстве
+по тестированию</a>. </p>
+
+<h3 id="behavior-app-standby">Ждущий режим для приложений</h3>
+<p>В M Preview система может определять, что приложения неактивны, когда они
+не используются. Приложение считается неактивным по прошествии определенного периода времени до тех пор, пока система
+не обнаружит один из следующих сигналов:</p>
+
+<ul>
+<li>приложение явным образом запущено пользователем;</li>
+<li>у приложения имеется процесс, который в настоящее время выполняется на переднем плане (это может быть как сама операция или служба переднего плана,
+так и процесс, используемый другой операцией или службой переднего плана).</li>
+<li>приложение создает уведомление, которое пользователи видят на экране блокировки или в
+области уведомлений.</li>
+<li>пользователь явным образом исключает приложение из списка для оптимизации
+в разделе <strong>Настройки</strong>.</li>
+</ul>
+
+<p>Если устройство отключено от электросети, для приложений, которые считаются неактивными, закрывается доступ к Интернету,
+а их операции синхронизации и задания приостанавливаются. После подключения устройства к электросети доступ к Интернету для приложений возобновится
+и они смогут приступить к выполнению любых ожидающих заданий и операций синхронизации. Если устройство
+неактивно в течение длительного времени, неактивным приложениям раз в день предоставляется доступ к сети.</p>
+
+<p>Чтобы протестировать эту функцию, подключите устройство под управлением M Preview к своему компьютеру
+для разработки и выполните следующие команды:
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>Примечание.</strong> В предстоящем выпуске службы
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">Google Cloud Messaging</a> (GCM)
+реализована возможность назначения сообщений
+с высоким приоритетом. При получении вашим приложением сообщений GCM с высоким приоритетом ему на короткий промежуток времени предоставляется
+доступ к сети, даже если приложение находится в неактивном состоянии.
+</p>
+
+<p>Советы по тестированию работы приложений в ждущем режиме представлены
+в <a href="{@docRoot}preview/testing/guide.html#doze-standby">руководстве
+по тестированию</a>. </p>
+
+<h2 id="behavior-adoptable-storage">Подключаемые устройства хранения</h2>
+<p>
+В M Preview пользователи могут <em>подключать</em> внешние устройства хранения, такие как SD-карты, и использовать их как внутреннее хранилище,
+зашифровав и отформатировав требуемым образом. Благодаря этому
+ пользователи могут переносить как сами приложения, так свои файлы для этих приложений с одного устройства хранения на другое. При переносе
+приложений система руководствуется настройкой
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
+в манифесте.</p>
+
+<p>Если ваше приложение работает с указанными ниже API-интерфейсами или полями, следует помнить, что возвращаемые ими пути к файлам
+будут динамически изменяться при перемещении приложения с внутреннего хранилища на внешнее устройство или наоборот.
+При создании путей к файлам настоятельно рекомендуется всегда вызывать эти API-интерфейсы динамическим образом.
+Не используйте жестко запрограммированные пути к файлам и не указывайте созданные ранее полные пути к файлам.</p>
+
+<ul>
+<li>Методы {@link android.content.Context}:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>Поля {@link android.content.pm.ApplicationInfo}:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>Для отладки этой функции в Developer Preview подключите USB-устройство,
+ к устройству Android посредством USB-кабеля On-The-Go (OTG) и выполните следующую команду:</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">Отказ от HTTP-клиента Apache</h2>
+<p>В M Preview удалена поддержка HTTP-клиента Apache. Если ваше приложение, разработанное для
+Android 2.3 (уровень API 9) или более поздней версии, использует этот клиент, вам необходимо воспользоваться вместо него классом {@link java.net.HttpURLConnection}.
+ Этот API-интерфейс более эффективный, поскольку он сокращает использование сетевого трафика за счет прозрачного сжатия
+и кэширования ответов, а также сводит к минимуму потребление энергии. Чтобы продолжить использовать API-интерфейсы HTTP Apache,
+сначала объявите в своем файле {@code build.gradle} следующую зависимость compile-time:
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Вместо OpenSSL в Android теперь будет использоваться библиотека
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
+. Если вы используете в ваших приложениях Android NDK, не связывайте его с криптографическими библиотеками,
+которые не входят в состав API-интерфейса NDK, такими как {@code libcrypto.so} и {@code libssl.so}. Эти библиотеки
+не являются общедоступными API-интерфейсами, и в разных выпусках или на разных устройствах они могут быть изменены или разбиты без предварительного уведомления.
+Кроме того, этим вы можете создать уязвимости в системе безопасности вашего продукта. Вместо этого внесите изменения в
+собственный код для вызова криптографических API-интерфейсов Java посредством JNI или статической ссылки на
+библиотеку криптографии по своему выбору.</p>
+
+<h2 id="behavior-audiomanager-Changes">Изменения в классе AudioManager</h2>
+<p>Теперь в платформе не поддерживается настройка уровня громкости напрямую или отключение звука определенных потоков с помощью класса {@link android.media.AudioManager}.
+ Метод {@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} больше не используется. Вместо него следует вызывать метод
+{@code AudioManager.requestAudioFocus()}. Также больше не используется метод
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()};
+вместо него следует вызывать метод {@code AudioManager.adjustStreamVolume()}
+и передавать в него значение направления {@code ADJUST_MUTE} или {@code ADJUST_UNMUTE}.</p>
+
+<h2 id="behavior-test-selection">Выделение текста</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>Теперь, когда пользователь выделяет текст в приложении, такие дополнительные действия как
+<em>Вырезать</em>, <em>Копировать</em> и <em>Вставить</em>, можно отображать на
+<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">перемещаемой панели инструментов</a>. Реализация взаимодействия пользователя с текстом аналогична той, которая используется для
+контекстного меню,
+как описано в статье
+<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">Запуск контекстного меню для отдельных представлений</a>.</p>
+
+<p>Чтобы реализовать перемещаемую панель инструментов для выделения текста, внесите в ваши существующие приложения
+следующие изменения.</p>
+<ol>
+<li>В объекте {@link android.view.View} или {@link android.app.Activity} измените вызовы
+{@link android.view.ActionMode} с
+{@code startActionMode(Callback)} на {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}.</li>
+<li>Возьмите свою реализацию класса {@code ActionMode.Callback} и сделайте его наследуемой от класса
+{@code ActionMode.Callback2}.</li>
+<li>Переопределите метод {@code Callback2.onGetContentRect()} для указания координат объекта
+{@link android.graphics.Rect} контента (например, прямоугольника выделения текста) в представлении.</li>
+<li>Если расположение прямоугольника больше недействительно и это единственный элемент, который не подлежит пересчитыванию,
+вызовите метод {@code ActionMode.invalidateContentRect()}.</li>
+</ol>
+
+<p>Если вы используете
+<a href="{@docRoot}tools/support-library/index.html">вспомогательную библиотеку Android</a> версии 22.2, то помните, что перемещаемым панелям инструментов
+не свойственна обратная совместимость и по умолчанию для управления объектами {@link android.view.ActionMode}
+используется библиотека appcompat. Это означает, что перемещаемые панели инструментов не будут отображаться. Чтобы включить поддержку
+{@link android.view.ActionMode} в
+{@link android.support.v7.app.AppCompatActivity}, вызовите метод
+{@code android.support.v7.app.AppCompatActivity.getDelegate()}, затем вызовите
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()} для возвращенного объекта
+{@link android.support.v7.app.AppCompatDelegate} и задайте для параметра input
+значение {@code false}. Этот вызов возвращает управление объектами {@link android.view.ActionMode}
+платформе. На устройствах под управлением M Preview платформа поддерживает как режимы
+{@link android.support.v7.app.ActionBar}, так и режимы перемещаемых панелей инструментов, тогда как на устройствах под управлением более ранних версий
+поддерживаются только режимы {@link android.support.v7.app.ActionBar}.</p>
+
+<h2 id="behavior-keystore">Изменения в хранилище ключей Android</h2>
+<p>В M Preview
+<a href="{@docRoot}training/articles/keystore.html">поставщик хранилища ключей Android</a> больше не поддерживает
+DSA. ECDSA по-прежнему поддерживается.</p>
+
+<p>Ключи, для которых не требуется шифрование в хранилище, больше не будут удаляться при отключении или сбросе защищенного экрана блокировки
+(например, пользователем или администратором устройства). Ключи, для которых требуется шифрование
+в хранилище, во время таких событий будут удалены.</p>
+
+<h2 id="behavior-network">Изменения в работе с Wi-Fi и сетями</h2>
+
+<p>Ниже перечислены изменения в API-интерфейсах для работы с Wi-Fi и сетями, реализованные в M Preview.</p>
+<ul>
+<li>Теперь ваши приложения могут изменять состояние объектов {@link android.net.wifi.WifiConfiguration}
+только в том случае, если эти объекты вы создали сами. Вам запрещено изменять или удалять объекты
+{@link android.net.wifi.WifiConfiguration}, созданные пользователем или другими приложениями.
+</li>
+<li>
+Ранее, если приложение принудительно подключало устройство к определенной сети Wi-Fi с помощью метода
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} и настройки
+{@code disableAllOthers=true}, то устройство отключалось от других сетей, например, от
+сотовой сети. В M Preview устройство больше не отключается от других сетей. Если
+в вашем приложении для параметра {@code targetSdkVersion} выбрано значение {@code “20”} или меньше, оно закрепляется за выбранной сетью
+Wi-Fi. Если же параметр {@code targetSdkVersion} имеет значение {@code “21”} или больше, следует использовать
+API-интерфейсы для работы с несколькими сетями (такие как
+{@link android.net.Network#openConnection(java.net.URL) openConnection()},
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} и новый метод
+{@code ConnectivityManager.bindProcessToNetwork()}), чтобы обеспечить отправку
+сетевого трафика приложения в выбранную сеть.</li>
+</ul>
+
+<h2 id="behavior-camera">Изменения в службе камеры</h2>
+<p>В M Preview изменена модель получения доступа к ресурсам в службе камеры.
+ Если раньше запросы доступа обрабатывались в порядке поступления, то теперь процессы с высоким приоритетом имеют преимущество.
+ В работе службы камеры произошли следующие изменения:</p>
+<ul>
+<li>Доступ к ресурсам подсистемы камеры, включая открытие и настройку устройства камеры,
+предоставляется в зависимости от того, какой приоритет имеет процесс клиентского приложения. Процессы приложений с операциями, которые
+видны пользователю или выполняются на переднем плане, обычно имеют более высокий приоритет, что повышает возможность доступа к ресурсам камеры и их
+использования.</li>
+<li>Когда приложение с более высоким приоритетом пытается использовать камеру, активные клиенты камеры для приложений с более низким приоритетом могут быть исключены из очереди доступа.
+ В устаревшем API-интерфейсе {@link android.hardware.Camera}
+это приводит к вызову
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}
+для исключенного клиента. В API-интерфейсе {@link android.hardware.camera2 Camera2} в таких случаях для исключенного клиента вызывается
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}.
+</li>
+<li>На устройствах, где камера позволяет такое, отдельным процессам
+приложения предоставляется возможность одновременно и независимо друг от друга открывать и использовать ресурсы камеры. При этом служба камеры теперь отслеживает и исключает ситуации с использованием ресурсов несколькими процессами,
+когда одновременный доступ вызывает значительное снижение производительности или негативно влияет на возможности
+всех открытых камер. Это изменение
+может привести к отключению доступа для клиентов с более низким приоритетом, даже если к этой же камере не пытаются получить доступ другие приложения.
+
+</li>
+<li>
+Смена пользователя приводит к исключению активных клиентов камеры в приложениях, относящихся к предыдущей учетной записи,
+из очереди доступа. Доступ к камере предоставлен только профилям, которыми владеет активный пользователь устройства.
+Фактически это означает, что если, например, пользователь переключился с гостевой учетной записи на другую, гостевой аккаунт не сможет покинуть запущенные процессы
+, использующие ресурсы подсистемы камеры.
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">Среда выполнения ART</h2>
+<p>Среда выполнения ART теперь должным образом реализует правила доступа для метода
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()}. Это
+изменение позволило устранить проблему, связанную с тем, что в предыдущих версиях система Dalvik неправильно проверяла правила доступа.
+Если ваше приложение использует метод
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} и вы
+хотите переопределить проверки доступа, вызовите метод
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()}, присвоив параметру input
+значение {@code true}. Если ваше приложение использует
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">библиотеку appcompat v7</a> или
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">библиотеку recyclerview v7</a>,
+вам необходимо установить актуальные версии этих библиотек. В противном случае убедитесь в том,
+что любые настраиваемые классы, на которые имеются ссылки из XML, обновлены и их конструкторы классов доступны.</p>
+
+<p>В M Preview обновлено поведение динамического компоновщика. Теперь он распознает разницу между
+{@code soname} библиотеки и путем к ней
+(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">ошибка 6670, о которой сообщалось в открытых источниках</a>),
+и позволяет выполнять поиск по {@code soname}.
+ Приложения, которые ранее работали, но содержали неправильные записи {@code DT_NEEDED}
+(обычно абсолютные пути в файловой системе компьютера для сборки), теперь при загрузке могут выдавать ошибки.</p>
+
+<p>В M Preview правильно реализован флаг {@code dlopen(3) RTLD_LOCAL}. Обратите внимание, что
+{@code RTLD_LOCAL} используется по умолчанию, поэтому будут затронуты вызовы {@code dlopen(3)}, которые явно не используют
+{@code RTLD_LOCAL} (за исключением случаев, когда ваше приложение явным образом использует{@code RTLD_GLOBAL}). Поскольку используется
+{@code RTLD_LOCAL}, символы не будут доступны для библиотек, загруженных с использованием последующих вызовов
+{@code dlopen(3)} (в противоположность ссылкам из записей {@code DT_NEEDED}).</p>
+</p>
+
+<h2 id="behavior-apk-validation">Проверка пакетов APK</h2>
+<p>Теперь платформа более строго подходит к проверке пакетов APK. Пакет APK считается поврежденным, если файл объявлен
+в манифесте, но отсутствует в самом пакете APK. Пакет APK подлежит повторной подписи в случае удаления любого его
+содержимого.</p>
+
+<h2 id="behavior-afw">Изменения в Android for Work</h2>
+<p>В M Preview представлены следующие изменения работы Android for Work:</p>
+<ul>
+<li><strong>Рабочие контакты в контексте личных сведений.</strong> Теперь при просмотре пользователем прошлых звонков в журнале вызовов Google Dialer
+в нем отображаются и рабочие контакты.
+Чтобы скрыть эти сведения в журнале вызовов, установите для параметра {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} значение {@code true}.
+ Рабочие контакты могут отображаться на устройствах через Bluetooth вместе с
+личными контактами только в том случае, если
+для параметра {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} задано значение {@code false}. По
+умолчанию для этого параметра установлено значение {@code true}.
+</li>
+<li><strong>Удаление конфигурации Wi-Fi.</strong> Конфигурации Wi-Fi, добавленные владельцем профиля
+(например, посредством вызова метода
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()}), теперь удаляются при удалении соответствующего рабочего профиля.</li>
+<li><strong>Блокировка конфигурации Wi-Fi.</strong> Пользователю больше не удастся изменить или удалить любые конфигурации Wi-Fi, созданные активным
+владельцем устройства. Пользователь по-прежнему может создавать
+и изменять свои собственные конфигурации Wi-Fi, если для этого пользователя не задана константа
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI} {@link android.os.UserManager}.</li>
+<li><strong>Загрузка приложения «Контроллер политики работы» путем добавления учетной записи Google.</strong> Теперь при добавлении на устройство учетной записи Google,
+для управления которой требуется приложение «Контроллер политики работы»,
+вне управляемого контекста пользователю предлагается установить соответствующее приложение.
+Это также применимо к учетным записям, добавляемым посредством мастера первоначальной настройки устройства в разделе
+<strong>Настройки > Учетные записи</strong>.</li>
+<li><strong>Изменения, касающиеся работы API-интерфейса DevicePolicyManager.</strong>
+Вызов метода {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()}
+затрагивает только использование камеры пользователем, который его вызвал; вызов этого метода из управляемого профиля
+не влияет на работу приложений камеры, выполняющихся для основного пользователя. Кроме того, метод
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()}
+теперь доступен как для владельцев устройства, так и для владельцев профиля. Владелец профиля может задать
+следующие ограничения для блокировки клавиатуры:
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} и
+{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT}, которые влияют на настройки
+блокировки клавиатуры для родительского пользователя профиля;</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS}, которое
+влияет только на уведомления, создаваемые приложениями в управляемом профиле.</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd b/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..7d12b2d
--- /dev/null
+++ b/docs/html-intl/intl/ru/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=Разрешения
+page.tags=previewresources, androidm
+page.keywords=разрешения, среда выполнения, предварительная версия
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>Краткое описание</h2>
+ <ul>
+ <li>Если ваше приложение предназначено для пакета SDK M Preview, пользователю будет предложено предоставить для него разрешения
+ не в процессе установки, а при работе с приложением.</li>
+ <li>Пользователь также может в любой момент отозвать разрешения, воспользовавшись экраном приложения «Настройки»
+.</li>
+ <li>Ваше приложение должно проверять наличие соответствующих разрешений при каждом запуске.
+</li>
+ </ul>
+
+ <h2>Содержание документа</h2>
+ <ol>
+ <li><a href="#overview">Обзор</a></li>
+ <li><a href="#coding">Добавление в код разрешений на выполнение</a></li>
+ <li><a href="#testing">Тестирование разрешений на выполнение</a></li>
+ <li><a href="#best-practices">Советы и рекомендации</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ В версии M Developer Preview представлена новая модель разрешений для приложений, которая
+оптимизирует для пользователей процесс установки и обновления приложений. Если приложение,
+работающее в M Preview, поддерживает новую модель разрешений, пользователю не нужно предоставлять какие-либо
+разрешения при установке приложения или его обновлении. Вместо этого приложение
+запрашивает разрешения, когда в них возникает необходимость, — в таких случаях система отображает для пользователя диалоговое окно с просьбой предоставить
+соответствующее разрешение.
+</p>
+
+<p>
+ Если приложение поддерживает новую модель разрешений, его, тем не менее, можно установить и
+запустить на устройстве под управлением одной из более ранних версий Android, и оно будет использовать старую модель
+разрешений.
+</p>
+
+<h2 id="overview">
+ Обзор
+</h2>
+
+<p>
+ В версии M Developer Preview представлена новая
+модель разрешений. Ниже приводится краткий обзор ее ключевых компонентов:
+</p>
+
+<ul>
+ <li>
+ <strong>Объявление разрешений.</strong> Все разрешения, которые требуются
+приложению, объявляются в его манифесте, как и в более ранних версиях платформы Android.
+ </li>
+
+ <li>
+ <strong>Группы разрешений.</strong> Разрешения
+<em>группируются</em> по типу их функциональных возможностей. Например, в группе разрешений
+<code>CONTACTS</code> находятся разрешения на чтение и запись
+контактов пользователя и информации из его профиля.
+ </li>
+
+ <li>
+ <p><strong>Ограниченные разрешения, предоставляемые во время установки.</strong> Когда
+пользователь устанавливает или обновляет приложение, система предоставляет такому приложению все запрашиваемые им
+разрешения, соответствующие константе {@link
+android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL}.
+ Например, разрешения для будильника и подключения к Интернету соответствуют константе {@link
+android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL},
+поэтому они предоставляются автоматически во время установки.
+ </p>
+
+ <p>Система также может предоставить приложению подпись и системные разрешения, как описано в разделе
+<a href="#system-apps">Предоставление приложениям системных разрешений и
+подписи</a>. Пользователю <em>не предлагается</em> предоставить какие-либо разрешения
+во время установки.</p>
+ </li>
+
+ <li>
+ <strong>Предоставление пользователем разрешений во время выполнения.</strong> Когда приложение запрашивает разрешение,
+система отображает для пользователя соответствующее диалоговое окно, а затем вызывает функцию обратного вызова приложения
+с целью уведомить его о том, предоставлены ли необходимые разрешения. Если
+пользователь предоставляет разрешение, приложение получает весь набор разрешений в рамках данной функциональной области
+разрешения, который был объявлен в манифесте приложения.
+ </li>
+
+</ul>
+
+<p>
+ Новая модель разрешений влияет на поведение приложений при работе с функциями, для
+которых требуются разрешения. При использовании этой модели в разработке
+ обратите внимание на следующие рекомендации:
+</p>
+
+<ul>
+
+ <li>
+ <strong>Всегда проверяйте наличие разрешений.</strong> Когда приложению необходимо выполнить
+какое-либо действие, для которого требуется разрешение, оно должно сначала проверить,
+имеется ли у него такое разрешение. Если разрешение отсутствует, приложение
+должно запросить его.
+ </li>
+
+ <li>
+ <strong>Если вам не дают разрешения, выходите из положения красиво.</strong> Если у приложения
+нет нужного разрешения, оно должно обработать эту ошибку разумно.
+ Например, если разрешение требуется лишь для необязательной функции, приложение может
+просто отключить ее. Если же приложение не может работать без данного разрешения,
+ оно может отключить все свои функциональные возможности и проинформировать пользователя,
+что для работы ему требуется разрешение.
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>Рисунок 1.</strong> Экран разрешений в настройках приложения.
+ </p>
+ </div>
+
+ <li>
+ <strong>Разрешения можно отзывать.</strong> Пользователи могут в любое время отозвать разрешения
+приложения. Когда пользователь отзывает разрешения,
+приложение <em>не</em> уведомляется об этом. Снова повторим, что приложение должно всегда проверять наличие
+разрешений, прежде чем выполнять любые действия, для которых они необходимы.
+ </li>
+</ul>
+
+<p class="note">
+ <strong>Примечание.</strong> Если приложение предназначено для M Developer Preview, оно
+<em>должно в обязательном порядке</em> использовать новую модель разрешений.
+</p>
+
+<p>
+ На момент выпуска M Developer Preview не все приложения Google в полной мере реализуют
+ новую модель разрешений. Google обновляет эти приложения
+по мере разработки M Developer Preview, чтобы они должным образом поддерживали настройки
+разрешений.
+</p>
+
+<p class="note">
+ <strong>Примечание.</strong> Если у вашего приложения имеется собственная поверхность API-интерфейса, прежде чем проксировать
+разрешения, убедитесь сначала в том, что у вызывающей операции имеются надлежащие
+разрешения на доступ к данным.
+</p>
+
+<h3 id="system-apps">
+ Предоставление приложениям системных разрешений и подписи
+</h3>
+
+<p>
+ Как правило, когда пользователь устанавливает приложение, система предоставляет такому приложению только те
+разрешения, которые соответствуют константе {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+PROTECTION_NORMAL}. Однако в определенных ситуациях система предоставляет
+приложению больше разрешений:
+</p>
+
+<ul>
+ <li>если приложение является частью системного образа, ему автоматически предоставляются все
+разрешения, обозначенные в его манифесте;
+ </li>
+
+ <li>если в манифесте приложения запрашиваются разрешения, соответствующие константе {@link
+android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE},
+а для подписи приложения использовался то же сертификат, что и для приложения,
+объявившего эти разрешения, система предоставляет запрашивающему приложению необходимые разрешения при
+установке.
+ </li>
+</ul>
+
+<p>
+ В обоих случаях пользователь по-прежнему может в любое время отозвать разрешения, обратившись к
+экрану <strong>Настройки</strong> и выбрав <strong>Приложения
+></strong> <i>название_приложения</i> <strong>> Разрешения</strong>. Поэтому приложение все равноу
+должно проверять наличие разрешений во время выполнения и при необходимости запрашивать их.
+
+</p>
+
+<h3 id="compatibility">
+ Совместимость с предыдущими и последующими версиями
+</h3>
+
+<p>
+ Если приложение не предназначено для M Developer Preview, оно
+продолжает использовать старую модель разрешений даже на устройствах под управлением M Preview. В таком случае при установке приложения
+ система предлагает пользователю предоставить все разрешения,
+указанные в манифесте приложения.
+</p>
+
+<p class="note">
+ <strong>Примечание.</strong> На устройствах под управлением M Developer Preview пользователь может отключить
+разрешения для любого приложения (включая устаревшие приложения) на экране «Настройки».
+ Если пользователь решит отключить разрешения для устаревших приложений, система
+автоматически отключит соответствующие функциональные возможности. Когда приложение пытается
+выполнить операцию, для которой требуется такое разрешение, это
+не обязательно приведет к возникновению исключения. Вместо этого оно может выдать пустой набор данных,
+сигнал об ошибке или иным образом обозначить непредвиденное поведение. Например, если запросить
+календарь, не имея соответствующего разрешения, метод возвратит пустой набор данных.
+</p>
+
+<p>
+ При установке приложения с использованием новой модели разрешений на устройство
+под управлением другой версии ОС, отличной от M Preview,
+система рассматривает такое приложение как любое другое и предлагает
+пользователю предоставить все объявленные разрешения уже во время установки.
+</p>
+
+<p class="note">
+ <strong>Примечание.</strong> В случае с предварительной версией в качестве минимальной версии пакета SDK
+следует задать версию SDK M Preview, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии. Это означает,
+что вы не сможете протестировать такие приложения на старых платформах
+во время использования предварительной версии для разработчиков.
+</p>
+
+<h3 id="perms-vs-intents">Разрешения и намерения</h3>
+
+<p>
+ Во многих случаях при разработке приложения у вас есть выбор между двумя способами выполнения задачи:
+ вы можете настроить приложение таким образом, чтобы оно самостоятельно запрашивало соответствующие разрешения на выполнение
+операции, или же можно указать ему использовать намерение, чтобы задачу выполнило
+другое приложение.
+</p>
+
+<p>
+ Например, предположим, что вашему приложению требуется возможность делать снимки с помощью камеры устройства.
+ Ваше приложение может запросить разрешение
+<code>android.permission.CAMERA</code>, которое позволит ему напрямую получить доступ
+к камере. Затем ваше приложение использует API-интерфейсы камеры
+для управления камерой и получения снимков. Благодаря такому подходу ваше приложение получает
+полный контроль над процессом фотографирования. Кроме того, это позволяет вам вставить пользовательский интерфейс камеры
+в свое приложение.
+</p>
+
+<p>
+ Если же вам не требуется такой контроль, просто воспользуйтесь намерением {@link
+android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE}
+для запроса изображения. Когда вы запускаете намерение, пользователю предлагается выбрать
+приложение камеры (если оно отличается от приложения камеры по умолчанию), после чего
+это приложение делает снимок. Приложение камеры возвращает полученное изображение в метод {@link
+android.app.Activity#onActivityResult onActivityResult()} вашего приложения.
+</p>
+
+<p>
+ Аналогичным образом, если вам необходимо позвонить, получить доступ к контактам пользователя и так далее,
+можно создать соответствующее намерение или запросить
+разрешение и напрямую получить доступ к нужным объектам. У каждого подхода есть
+как преимущества, так и недостатки.
+</p>
+
+<p>
+ При использовании разрешений:
+</p>
+
+<ul>
+ <li>Ваше приложение получает полный контроль над взаимодействием пользователя с интерфейсом во время выполнения
+операции. Однако такой широкий контроль усложняет вашу задачу,
+требуя разработать подходящий пользовательский интерфейс.
+ </li>
+
+ <li>Пользователю предлагается предоставить разрешения только один раз, при первом
+выполнении операции. После этого ваше приложение может выполнять операцию без вмешательства
+со стороны пользователя. Однако если пользователь не
+предоставит разрешение (или отзовет его позже), ваше приложение не сможет выполнить
+операцию.
+ </li>
+</ul>
+
+<p>
+ При использовании намерений:
+</p>
+
+<ul>
+ <li>Вам не нужно разрабатывать пользовательский интерфейс для выполнения операции, его предоставляет приложение, которое обрабатывает
+намерение. Однако это также означает, что у вас отсутствует контроль над
+взаимодействием пользователя с интерфейсом. Возможно, пользователю придется взаимодействовать с
+приложением, которое вы даже не видели.
+ </li>
+
+ <li>Если у пользователя нет приложения по умолчанию для выполнения операции, система
+предлагает ему выбрать приложение. Если пользователь не назначит обработчик
+по умолчанию, то при каждом выполнении операции для него может
+отображаться дополнительное диалоговое окно.
+ </li>
+</ul>
+
+<h2 id="coding">Добавление в код разрешений на выполнение</h2>
+
+<p>
+ Если ваше приложение предназначено для новой версии M Developer Preview, вы должны в обязательном порядке использовать
+новую модель разрешений. Это означает, что кроме объявления требуемых разрешений
+в манифесте, вам следует проверять наличие этих разрешений
+во время выполнения, а также запрашивать их, если у вас
+еще нет необходимых разрешений.
+</p>
+
+<h3 id="enabling">
+ Активация новой модели разрешений
+</h3>
+
+<p>
+ Чтобы активировать новую модель разрешений M Developer Preview, задайте для атрибута
+<code>targetSdkVersion</code> приложения значение <code>"MNC"</code>, а для атрибута
+<code>compileSdkVersion</code> – значение <code>"android-MNC"</code>. Это позволит
+включить все функции новой модели разрешений.
+</p>
+
+<p>
+ В случае с предварительной версией необходимо задать для параметра <code>minSdkVersion</code> значение
+<code>"MNC"</code>, чтобы получить возможность компилировать код с помощью пакета SDK предварительной версии.
+</p>
+
+<h3 id="m-only-perm">
+ Назначение разрешений только для M Preview
+</h3>
+
+<p>
+ В манифесте приложения можно использовать новый элемент <code><uses-permission-sdk-m></code>,
+чтобы указать, что разрешение требуется только для M Developer Preview. Если объявить
+разрешение таким способом, то при установке приложения на устройство с более старой версией платформы
+система не будет отправлять запрос пользователю или предоставлять разрешение приложению.
+С помощью элемента <code><uses-permission-sdk-m></code>
+вы можете добавлять новые разрешения
+в обновленные версии вашего приложения без принудительного запроса у пользователей разрешений при
+установке обновления.
+</p>
+
+<p>
+ Если приложение запущено на устройстве под управлением M Developer Preview,
+поведение элемента <code><uses-permission-sdk-m></code> аналогично поведению
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code>.
+ Система не запрашивает у пользователей предоставление каких-либо разрешений, когда они устанавливают
+приложение. Вместо этого приложение само запрашивает разрешения, когда они требуются.
+</p>
+
+<h3 id="prompting">
+ Запрос разрешений
+</h3>
+
+<p>
+ Если ваше приложение использует новую модель разрешений M Developer Preview, то при первом запуске приложения
+на устройстве под управлением
+M Preview пользователю не предлагается предоставить все разрешения. Вместо этого приложение само запрашивает разрешения, когда они
+требуются. Когда приложение запрашивает разрешение, система отображает для пользователя соответствующее диалоговое
+окно.
+</p>
+
+<p>
+ Если ваше приложение запущено на устройстве с пакетом SDK уровня 22 или более низкого, то приложение использует старую
+модель разрешений. То есть при каждой устновке приложения пользователю будет предложено предоставить приложению все разрешения,
+запрашиваемые в манифесте приложения, кроме
+отмеченных элементом <code><uses-permission-sdk-m></code>.
+</p>
+
+<h4 id="check-platform">Проверка платформы, на которой выполняется приложение</h4>
+
+<p>
+ Новая модель разрешений поддерживается только на устройствах под управлением M Developer
+Preview. Прежде чем вызывать любые из этих методов, приложению следует проверить,
+на какой платформе оно выполняется,
+обратившись к значению параметра {@link android.os.Build.VERSION#CODENAME
+Build.VERSION.CODENAME}. Если устройство работает под управлением M Developer Preview,
+то значение параметра{@link android.os.Build.VERSION#CODENAME CODENAME} будет <code>"MNC"</code>.
+</p>
+
+<h4 id="check-for-permission">Проверка наличия у приложения необходимого разрешения</h4>
+
+<p>Когда пользователи пытаются выполнить какое-либо действие, для которого требуется разрешение, приложение
+проверяет, имеется ли у него в настоящее время разрешение на выполнение этой операции. Для этого
+приложение вызывает метод
+<code>Context.checkSelfPermission(<i>permission_name</i>)</code>. Приложению
+следует выполнять такую проверку даже в том случае, если ему известно, что пользователь уже предоставил
+необходимое разрешение,
+поскольку пользователь может в любое время отозвать разрешения приложения. Например, если пользователь
+хочет получить снимок с помощью приложения, то приложение вызывает метод
+<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>.</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>Таблица 1.</strong> Разрешения и группы разрешений.</p>
+<table>
+ <tr>
+ <th scope="col">Группа разрешений</th>
+ <th scope="col">Разрешения</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">Запрос разрешений при необходимости</h4>
+
+<p>Если у приложения нет требуемого разрешения, оно вызывает метод
+<code>Activity.requestPermissions(String[], int)</code>, чтобы запросить его.
+ Приложение передает в него
+требуемые разрешения, а также целочисленный код запроса.
+ Этот метод выполняется асинхронно: он возвращает результат сразу же, а после того как пользователь
+предоставляет ответ в диалоговом окне, система вызывает метод обратного вызова
+приложения с результатами и передает в него тот же код запроса, который приложение передало в метод
+<code>requestPermissions()</code>.</p>
+
+ <p>Ниже представлен пример кода для проверки наличия у приложения разрешения на чтение контактов
+пользователя и запроса соответствующего разрешения при необходимости.</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">Обработка ответа на запрос разрешений</h4>
+
+<p>
+ Когда приложение запрашивает разрешения, система отображает для пользователя соответствующее диалоговое
+окно. После получения ответа от пользователя система вызывает метод
+<code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
+вашего приложения и передает в него ответ пользователя. Вашему приложению необходимо переопределить этот метод. В обратном
+вызове передается тот же код запроса, который вы передали в метод
+<code>requestPermissions()</code>. Например, если приложение запрашивает доступ на
+<code>READ_CONTACTS</code>, то метод обратного вызова
+может быть следующим:
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>Если пользователь предоставляет разрешение, система, в свою очередь, представляет все разрешения,
+запрашиваемые в манифесте приложения для обозначенной функциональной области. Если пользователь
+отказывает в предоставлении разрешения, вам необходимо принять меры. Например, вы можете отключить любые пункты меню
+, для использования которых требуется это разрешение.
+ </li>
+</p>
+
+<p>
+ Когда система предлагает пользователю предоставить разрешение, он может указать системе,
+чтобы она больше не запрашивала это разрешение. В этом случае,
+когда приложение использует метод <code>requestPermissions()</code> для запроса такого разрешения,
+система сразу же отклоняет запрос. При этом система вызывает ваш метод
+<code>onRequestPermissionsResult()</code> так же, как если бы пользователь повторно
+отклонил ваш запрос. Поэтому ваше приложение
+не считает, что имело место прямое взаимодействие с пользователем.
+</p>
+
+<h2 id="testing">Тестирование разрешений на выполнение</h2>
+
+
+<p>
+ Если ваше приложение предназначено для новой версии M Developer Preview, то вы должны протестировать
+его и убедиться в том, что оно должным образом обрабатывает разрешения. Не надо исходить из того, что к началу работы ваше приложение уже имеет
+любые определенные разрешения. При первом запуске приложения оно,
+скорее всего, не будет обладать разрешениями, а в дальнейшем пользователь может в любой момент отозвать или восстановить
+разрешения.
+</p>
+
+<p>
+ Вам следует протестировать ваше приложение и убедиться в том, что оно ведет себя должным образом в
+любых ситуациях, касающихся разрешений. Мы включили в состав пакета SDK M Preview SDK новые команды
+<a href="{@docRoot}tools/help/adb.html">Android
+Debug Bridge (ADB)</a>, чтобы вы могли протестировать ваше приложение с любыми настройками разрешений,
+которые вы хотите попробовать в действии.
+</p>
+
+<h3>
+ Новые команды и параметры ADB
+</h3>
+
+<p>
+ В состав пакета инструментов SDK M Preview входит ряд новых команд, позволяющих протестировать обработку разрешений
+вашим приложением.
+</p>
+
+<h4>
+ Установка с разрешениями
+</h4>
+
+<p>
+ Можно воспользоваться новым параметром <code>-g</code> команды <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a>, который служит для установки
+приложения и предоставления всех разрешений, указанных в его манифесте:
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ Предоставление разрешений и их отзыв
+</h4>
+
+<p>
+ Для предоставления разрешений установленному приложению и их отзыва можно использовать новые команды <a href="{@docRoot}tools/help/adb.html#pm">диспетчера пакетов</a>
+ADB.
+Такая функциональная возможность может быть полезна для автоматизированного тестирования.
+</p>
+
+<p>
+ Для представления разрешения используйте команду <code>grant</code> диспетчера пакетов:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ Например, чтобы представить пакету com.example.myapp разрешение на запись
+аудио, воспользуйтесь следующей командой:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ Чтобы отозвать разрешение, используйте команду <code>revoke</code> диспетчера пакетов:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">Советы и рекомендации</h2>
+
+<p>
+ Новая модель разрешений делает работу пользователей удобнее,
+упрощает для них процесс установки приложений и позволяет лучше понимать,
+что делает то или иное приложение. Чтобы использовать все преимущества
+этой модели, примите во внимание следующие рекомендации:
+</p>
+
+
+<h3 id="bp-what-you-need">Запрашивайте только те разрешения, которые необходимы</h3>
+
+<p>
+ Каждый раз, когда вы запрашиваете разрешение, вы заставляете пользователя делать выбор.
+ Если пользователь отклоняет запрос, соответствующая функциональная возможность приложения отключается.
+ Вам следует сократить количество таких запросов.
+</p>
+
+<p>
+ Например, во многих случаях можно предоставить приложению доступ к нужной функции посредством
+<a href="{@docRoot}guide/components/intents-filters.html">намерения</a> вместо
+запроса разрешений. Если вашему приложению необходимо получить снимки с камеры
+телефона, можно использовать намерение {@link
+android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+MediaStore.ACTION_IMAGE_CAPTURE}. Когда ваше приложение выполняет намерение, система
+предлагает пользователю выбрать уже установленное приложение камеры для
+получения снимков.
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ Не перегружайте пользователя запросами
+</h3>
+
+<p>
+ Если на пользователя обрушивается сразу много запросов разрешений, он может
+решить, что все это слишком сложно, и просто закрыть приложение. Поэтому разрешения следует
+запрашивать только тогда, когда это необходимо.
+</p>
+
+<p>
+ Иногда приложению жизненно необходимы одно или несколько разрешений.
+В таких случаях имеет смысл запросить все разрешения
+сразу при запуске приложения. Например, если вы разрабатываете приложение для фотографирования, то ему
+однозначно потребуется доступ к камере устройства. Когда пользователь в первый раз запускает приложение,
+он не удивится, если приложение запросит у него разрешение на
+использование камеры. Однако если в этом же приложении имеется функция обмена фотографиями с
+контактами пользователя, возможно, <em>не следует</em> запрашивать соответствующее разрешение при
+первом запуске приложения. Лучше дождаться, когда пользователю потребуется функция обмена контентом,
+и уже тогда запросить разрешение.
+</p>
+
+<p>
+ Если в вашем приложении имеются обучающие материалы, может оказаться целесообразным запросить необходимые разрешения
+после того, как пользователь изучит материалы.
+</p>
+
+<h3 id="bp-explain">
+ Всегда поясняйте, для чего требуются те или иные разрешения
+</h3>
+
+<p>
+ В диалоговом окне запроса разрешений, которое система отображает при вызове вами метода
+<code>requestPermissions()</code>, обозначается требуемое для приложения разрешение,
+однако не указывается, для чего оно необходимо. В некоторых случаях это может озадачить пользователя.
+ Поэтому, прежде чем вызывать метод
+<code>requestPermissions()</code>, стоит пояснить пользователю, для чего вашему приложению требуются разрешения.
+</p>
+
+<p>
+ Например, приложению для фотографирования может потребоваться доступ к службам геолокации, чтобы фотографии можно было снабдить
+геотегами. Не все пользователи знают, что
+фотография может содержать данные о месте съемки, и им может показаться странным, что приложение для фотографирования запрашивает данные
+о местоположении. В этом случае полезно
+рассказать пользователю о такой возможности, <em>прежде</em> чем вызывать метод
+<code>requestPermissions()</code>.
+</p>
+
+<p>
+ Это можно сделать, в частности, внедрив такие запросы в обучающие материалы приложения. В обучающих
+материалах могут содержаться описания каждой из функций приложения с пояснением,
+какие разрешения необходимы для их использования. Например, в обучающий материал по работе с приложением для фотографирования
+можно включить описание функции обмена контентом с контактами, после чего
+пояснить, что для этого пользователю следует предоставить приложению доступ к его контактам.
+ После этого приложение может вызвать метод <code>requestPermissions()</code> для запроса
+доступа. Конечно, не все пользователи обращаются к обучающим материалам,
+поэтому вам по-прежнему следует проверять наличие разрешений и при необходимости запрашивать
+их во время обычной работы приложения.
+</p>
diff --git a/docs/html-intl/intl/ru/preview/overview.jd b/docs/html-intl/intl/ru/preview/overview.jd
new file mode 100644
index 0000000..6ed1d20
--- /dev/null
+++ b/docs/html-intl/intl/ru/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=Обзор программы
+page.metaDescription=Добро пожаловать в программу Android M Developer Preview, участники которой получают всё необходимое для тестирования и оптимизации своих приложений для следующей версии платформы Android.
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ Добро пожаловать в программу <strong>Android M Developer Preview</strong>, участники которой получают всё необходимоедля тестирования и оптимизации своих приложений для следующей версии платформы Android.
+
+ Это бесплатная программа, и приступить к ее использованию можно прямо сейчас, загрузив
+инструменты M Developer Preview.
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ Системные образы эмулятора и оборудования
+ </h5>
+
+ <p>
+ Запускайте и тестируйте ваши приложения на устройствах Nexus 5, 6, 9 и Player (для Android TV), а также в эмуляторе.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Самый актуальный код платформы
+ </h5>
+
+ <p>
+ Во время знакомства с предварительной версией платформы мы будем предоставлять различные обновления, поэтому вы сможете протестировать самые актуальные изменения в платформе.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Получение обновлений по беспроводной связи
+ </h5>
+
+ <p>
+ После прошивки своего устройства для работы с предварительной версией платформы вы сможете получать обновления по беспроводной связи.
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ Новые возможности и новые функции
+ </h5>
+
+ <p>
+ Начните уже заранее реализовывать в своих приложениях поддержку расширенной функциональности платформы, например, новую модель разрешений на выполнение и функции сбережения энергии.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Приоритетная обработка отчетов об ошибках от разработчиков
+ </h5>
+
+ <p>
+ В течение первых нескольких недель мы будем рассматривать отчеты об ошибках, поступающие от разработчиков, в приоритетном порядке, поэтому не теряйте времени и приступайте к тестированию и составлению отзывов как можно раньше.
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ Отзывы и поддержка
+ </h5>
+
+ <p>
+ Отправляйте нам отчеты об ошибках и предоставляйте свои отзывы с помощью нашей <a href="https://code.google.com/p/android-developer-preview/">системы отслеживания проблем</a>.
+ Обменивайтесь идеями и предложениями с другими разработчиками в <a href="http://g.co/dev/AndroidMDevPreview">сообществе разработчиков Android M</a>.
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ График и обновления
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ Тестирование версии M Developer Preview запланировано на период с 28 мая до выпуска окончательной версии пакета SDK Android M, который
+состоится незадолго до публикации новой платформы в открытом доступе в
+третьем квартале 2015 г.
+</p>
+
+<p>
+ На ключевых этапах разработки платформы мы предоставим обновления для тестовых устройств.
+ Ниже перечислены предварительные даты этих ключевых этапов.
+</p>
+
+<ul>
+ <li>
+ <strong>Preview 1</strong> (первоначальный выпуск версии Preview, конец мая)
+ </li>
+
+ <li>
+ <strong>Preview 2</strong> (конец июня/начало июля)
+ </li>
+
+ <li>
+ <strong>Preview 3</strong> (почти окончательный выпуск, конец июля)
+ </li>
+</ul>
+
+<p>
+ Завершающим этапом обновлений станет выход <strong>окончательной версии пакета SDK</strong> (в третьем квартале),
+где будут представлены официальные API-интерфейсы для новой версии Android, а также
+окончательные версии функций и поведений системы.
+</p>
+
+<p>
+ Мы настоятельно рекомендуем вам в ходе тестирования и разработки приложений для Android M <strong>постоянно
+обновлять вашу среду разработки</strong> по мере выхода обновлений для версии Preview.
+ Чтобы упростить этот процесс, мы будем отправлять на устройства, которые уже прошиты для работы с предварительной версией платформы, <strong>обновления по беспроводной сети</strong>.
+Мы также будем предоставлять вам системные образы, которые можно
+загрузить и использовать для прошивки устройства вручную.
+</p>
+<p class="note">
+ <strong>Примечание.</strong> Окончательные версии пакета SDK и системных образов не будут отправляться по беспроводной сети,
+их придется <strong>вручную установить</strong> на
+тестовые устройства.</strong>
+</p>
+
+<p>
+ Мы будем сообщать о появлении обновлений для версии Preview в <a href="http://android-developers.blogspot.com/">блоге разработчиков Android</a>, а
+также на этом сайте и в
+<a href="http://g.co/dev/AndroidMDevPreview">сообществе разработчиков Android M</a>.
+</p>
+
+<h2 id="preview_tools">
+ Что входит в состав Preview?
+</h2>
+
+<p>
+ M Developer Preview содержит всё, что вам необходимо для тестирования ваших существующих приложений на экранах различных размеров,
+тестирования с использованием различных сетевых технологий, чипсетов ЦП и графических процессоров,
+ а также на различных архитектурах оборудования.
+</p>
+
+<h4>
+ Инструменты SDK
+</h4>
+
+<p>
+ С помощью менеджера SDK в <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> вы можете загрузить следующие компоненты:
+</p>
+
+<ul>
+ <li><strong>Инструменты SDK</strong> для M Developer Preview.
+ </li>
+
+ <li><strong>Системный образ эмулятора</strong> (32- и
+64-разрядная версии) для M Developer Preview.
+ </li>
+
+ <li><strong>Системный образ эмулятора для Android TV</strong> (32- и
+32-разрядная версии)
+ </li>
+</ul>
+
+<h4>
+ Системные образы оборудования
+</h4>
+
+<p>
+ На странице
+<a href="download.html">Загрузки</a> можно скачать следующие системные образы оборудования:
+</p>
+
+<ul>
+ <li>
+ Системный образ устройства <strong>Nexus 5</strong> (GSM/LTE) («hammerhead»)
+ </li>
+
+ <li>
+ Системный образ устройства <strong>Nexus 6</strong> («shamu»)
+ </li>
+
+ <li>
+ Системный образ устройства <strong>Nexus 9</strong> (Wi-Fi) («volantis»)
+ </li>
+
+ <li>
+ Системный образ устройства <strong>Nexus Player</strong> (Android TV) («fugu»)
+ </li>
+</ul>
+
+<h4>
+ Документация и примеры кода
+</h4>
+
+<p>
+ Здесь вы можете найти документацию, где представлены подробные сведения о версии Preview:
+</p>
+
+<ul>
+ <li>
+ Документ, посвященный <a href="setup-sdk.html">настройке пакета SDK</a>, с пошаговыми инструкциями
+по началу работы.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">Руководство по тестированию</a> и <a href="behavior-changes.html">обзор изменений в работе</a> с указанием ключевых областей для тестирования.
+ </li>
+
+ <li>Документация по новым API-интерфейсам, включая <a href="api-overview.html">обзор API-интерфейсов</a>,
+<a href="{@docRoot}preview/download.html#docs">справочник по API-интерфейсам</a> для загрузки и подробные руководства для разработчиков,
+в которых освещаются такие ключевые функции платформы,
+как <a href="{@docRoot}preview/features/runtime-permissions.html">разрешения</a>,
+<a href="{@docRoot}preview/backup/index.html">резервное копирование приложений</a> и многое другое.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">Примеры кода</a>, где можно посмотреть реализацию поддержки
+разрешений и других новых функций.
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/support.html#release-notes">Примечания к выпуску</a> для текущей версии
+M Developer Preview, включая информацию об изменениях и различные отчеты.
+ </li>
+</ul>
+
+<h4>
+ Ресурсы поддержки
+</h4>
+
+<p>
+ При тестировании и разработке приложений для M
+Developer Preview рекомендуем пользоваться следующими ресурсами поддержки:
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">Система отслеживания проблем M
+Developer Preview</a> — это ваш <strong>основной канал для предоставления своих
+отзывов.</strong> С ее помощью вы можете сообщать нам об обнаруженных ошибках, проблемах производительности, а также предоставлять общие отзывы.
+ Также можно ознакомиться с <a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">известными проблемами</a>
+и действиями по их устранению.
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Сообщество разработчиков Android
+M</a> — это сообщество Google+, где можно <strong>общаться с другими
+разработчиками</strong>, работающими с Android M. Делитесь в сообществе своими наблюдениями
+и идеями, а также находите ответы на вопросы об Android M.
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ Выбор целевого уровня, предварительные версии API-интерфейсов и публикация приложений
+</h2>
+
+<p>
+ Выпуск Android M Developer Preview предназначен исключительно для разработки и
+<strong>не имеет стандартного уровня API</strong>. Если вы не хотите
+проверять свое приложение на совместимость (хотя мы настоятельно рекомендуем делать это),
+выберите целевой уровень M Developer Preview, задав для параметра <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>
+своего приложения значение <code>“MNC”</code>.
+</p>
+
+<p>
+ В Android M Developer Preview представлены <strong>предварительные версии API-интерфейсов</strong>
+—. Такие API-интерфейсы не будут официально опубликованы до выпуска окончательной версии пакета SDK,
+ намеченого на третий квартал 2015 г. Это означает, что в будущем можно
+<strong>ожидать незначительных изменений в API-интерфейсах</strong>, особенно в
+первые недели действия программы. Каждое обновление
+Android M Developer Preview будет включать обзор изменений.
+</p>
+
+<p class="note">
+ Обратите внимание, что несмотря на возможные изменения в предварительных версиях API-интерфейсов, соответствующие расширения функциональности системы,
+такие как разрешения на выполнение и функции сбережения энергии, работают стабильно и уже готовы для
+тестирования.
+</p>
+
+<p>
+ Что касается публикации приложений, то политика Google Play <strong>однозначно запрещает публикацию приложений,
+разработанных для M Developer Preview</strong>. После выхода окончательной версии пакета SDK Android M
+вы сможете выбрать официальный целевой уровень API Android M и приступить
+к публикации ваших приложений в магазине Google Play. Тем временем, если вы хотите распространить приложение, предназначенное для
+тестировщиков Android M, то используйте для этого электронную почту или разместите такие приложения на своем сайте
+для прямой загрузки.
+</p>
+
+<h2 id="get_started">
+ Начало работы
+</h2>
+
+<p>
+ Чтобы приступить к тестированию своего приложения, выполните указанные ниже действия.
+</p>
+
+<ol>
+ <li>Ознакомьтесь с <a href="{@docRoot}preview/api-overview.html">обзором API-интерфейсов</a>
+и сведениями об <a href="{@docRoot}preview/behavior-changes.html">изменениях в работе</a>, чтобы получить
+представление о новых возможностях платформы и о том, как это может повлиять на ваши приложения. В частности, узнайте подробнее о новой модели
+<a href="{@docRoot}preview/features/runtime-permissions.html">разрешений на
+выполнение</a>, функциях сбережения энергии и автоматическом резервном копировании.
+ </li>
+
+ <li>Настройте свою среду, руководствуясь инструкциями по
+<a href="{@docRoot}preview/setup-sdk.html">настройке пакета SDK Preview</a>
+и конфигурированию тестовых устройств.
+ </li>
+
+ <li>Выполните
+<a href="https://developers.google.com/android/nexus/images">инструкции по прошивке</a>, чтобы прошить устройства
+Nexus 5, 6, 9 и Player с использованием последнего системного образа M Developer Preview. После прошивки вашего устройства для разработки
+обновления Preview на него будут приходить по беспроводной сети.</a>
+ </li>
+
+ <li>Загрузите <a href="{@docRoot}preview/download.html#docs">справочник по API-интерфейсам M Preview</a>
+и <a href="{@docRoot}preview/samples.html">примеры кода M Preview</a>
+, чтобы узнать больше о новых возможностях API-интерфейсов и о том, как использовать их в ваших
+приложениях.
+ </li>
+
+ <li>Присоединяйтесь к <a href="http://g.co/dev/AndroidMDevPreview">сообществу разработчиков Android
+M</a>, чтобы всегда быть в курсе последних новостей и общаться с другими
+разработчиками, работающими с новой платформой.
+ </li>
+</ol>
+
+<p>
+ Благодарим за участие в программе Android M Developer!
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/api-overview.jd b/docs/html-intl/intl/zh-cn/preview/api-overview.jd
new file mode 100644
index 0000000..c64a38e
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=API 概览
+page.keywords=预览版,sdk,兼容性
+page.tags=previewresources, androidm
+sdk.platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文内容
+<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">显示详细信息</span>
+ <span class="less" style="display:none">显示精简信息</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">应用链接</a></li>
+ <li><a href="#backup">自动备份应用</a></li>
+ <li><a href="#authentication">身份验证</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">指纹身份验证</a></li>
+ <li><a href="#confirm-credential">确认凭据</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">直接共享</a></li>
+ <li><a href="#voice-interactions">语音交互</a></li>
+ <li><a href="#assist">助手 API</a></li>
+ <li><a href="#notifications">通知</a></li>
+ <li><a href="#bluetooth-stylus">蓝牙触控笔支持</a></li>
+ <li><a href="#ble-scanning">改进的蓝牙低功耗扫描</a></li>
+ <li><a href="#hotspot">Hotspot 2.0 第 1 版支持</a></li>
+ <li><a href="#4K-display">4K 显示模式</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">主题化 ColorStateList</a></li>
+ <li><a href="#audio">音频功能</a></li>
+ <li><a href="#video">视频功能</a></li>
+ <li><a href="#camera">相机功能</a>
+ <ol>
+ <li><a href="#flashlight">闪光灯 API</a></li>
+ <li><a href="#reprocessing">相机再处理</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Android for Work 功能</a></li>
+</ol>
+
+<h2>API 差异</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版»</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 开发者预览版可让您预览即将推出的 Android 平台版本为用户和应用开发者提供的新功能。
+
+本文旨在介绍其中最值得关注的 API。</p>
+
+<p>M 开发者预览版的适用对象是<strong>喜欢尝鲜的开发者</strong>和<strong>测试人员</strong>。
+如果您有兴趣影响 Android 框架的发展方向,<a href="{@docRoot}preview/setup-sdk.html">欢迎试用 M 开发者预览版</a>并向我们提供反馈!
+
+
+</p>
+
+<p class="caution"><strong>注意</strong>:请不要在 Google Play 商店中发布基于 M 开发者预览版的应用。
+</p>
+
+<p class="note"><strong>注:</strong>本文经常提及的一些类和方法在 <a href="{@docRoot}">developer.android.com</a> 上尚未提供相关参考资料。
+这些 API 元素在本文中设置为 {@code code style} 格式(不带超链接)。
+如需查看这些元素的初步 API 文档,请下载<a href="{@docRoot}preview/download.html#docs">预览版参考资料</a>。
+</p>
+
+<h3>重要的行为变更</h3>
+
+<p>如果您之前发布过 Android 应用,请注意您的应用可能受到平台变化的影响。
+</p>
+
+<p>如需了解完整信息,请参阅<a href="behavior-changes.html">行为变更</a>。</p>
+
+<h2 id="app-linking">应用链接</h2>
+<p>此预览版通过提供功能更强大的应用链接,增强了 Android 的意向系统。您可以利用此功能将应用与您拥有的某个 Web 域关联。
+平台可以根据此关联确定在处理特定 Web 链接时默认使用的应用,跳过提示用户选择应用的步骤。如需了解如何实现此功能,请参阅<a href="{@docRoot}preview/features/app-linking.html">应用链接</a>。
+
+
+
+
+<h2 id="backup">自动备份应用</h2>
+<p>现在,系统可以自动为应用执行完整数据备份和恢复。对于以 M 预览版为目标平台的应用,系统会默认启用此行为,您无需额外添加任何代码。
+如果用户删除其 Google 帐户,其备份数据也会被删除。
+如需了解该功能的工作方式以及配置文件系统备份内容的方法,请参阅<a href="{@docRoot}preview/backup/index.html">自动备份应用</a>。
+
+</p>
+
+<h2 id="authentication">身份验证</h2>
+<p>本预览版提供一些新的 API,在受支持的设备上,用户只需扫描其指纹即可完成身份验证,还可检查系统最后一次使用设备解锁机制(如锁屏密码)对用户进行身份验证是发生在多久之前。
+
+这些 API 可与 <a href="{@docRoot}training/articles/keystore.html">Android 密钥库系统</a>结合使用。
+</p>
+
+<h3 id="fingerprint-authentication">指纹身份验证</h3>
+
+<p>如需通过指纹扫描验证用户身份,请获取新增
+{@code android.hardware.fingerprint.FingerprintManager} 类的实例,并调用
+{@code FingerprintManager.authenticate()} 方法。您的应用必须运行在带有指纹传感器的兼容设备上。
+您必须在应用中实现指纹身份验证流的用户界面,并在 UI 中使用标准 Android 指纹图标。<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">示例应用</a>中包含有 Android 指纹图标 ({@code c_fp_40px.png})。请注意,如果您要开发多个使用指纹身份验证的应用,每个应用必须独立验证用户的指纹。
+
+
+
+
+</p>
+
+<p>如需在您的应用中使用此功能,请先在清单文件中添加 {@code USE_FINGERPRINT} 权限。
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>如需查看指纹身份验证的应用实现,请参阅<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">指纹对话框示例</a>。
+
+</p>
+
+<p>如果您要测试此功能,请执行以下步骤:</p>
+<ol>
+<li>如果您尚未安装 Android SDK 工具 24.3 修订版,请执行此操作。</li>
+<li>转到<strong>设置 > 安全 > 指纹</strong>,然后按照登记说明在模拟器中登记新指纹。
+</li>
+<li>使用模拟器通过以下命令模拟指纹触摸事件。
+使用同一命令模拟锁屏上或应用中的指纹触摸事件。
+
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>在 Windows 上,您可能需要运行带有
+{@code finger touch <finger_id>} 参数的 {@code telnet 127.0.0.1 <emulator-id>} 命令。
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">确认凭据</h3>
+<p>您的应用可以根据用户在多久之前最后一次解锁设备来验证其身份。此功能让用户不必费心记忆应用特定密码,您也无需实现自己的身份验证用户界面。
+
+您的应用应当利用此功能并结合实现公钥或私钥,以进行用户身份验证。
+</p>
+
+<p>如需设置成功验证用户身份后可再次使用同一密钥的超时持续时间,请在设置 {@link javax.crypto.KeyGenerator} 或
+{@link java.security.KeyPairGenerator} 时调用新增的
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+ 方法。
+此功能目前适用于对称加密操作。
+</p>
+
+<p>避免过多显示重新验证对话框 -- 您的应用应尝试先使用加密对象,如果超时到期,请使用
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()} 方法在您的应用内重新验证用户身份。
+
+
+</p>
+
+<p>如需查看此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">确认凭据示例</a>。
+
+</p>
+
+<h2 id="direct-share">直接共享</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>本预览版为您提供的 API 可让用户直观、快捷地进行共享。现在,您可以定义可在您的应用内启动特定活动的<em>直接共享目标</em>。这些直接共享目标通过“共享”<em></em>菜单公开给用户。
+
+此功能让用户可以向其他应用内的目标(如联系人)共享内容。
+例如,直接共享目标可以启动另一社交网络应用中的某个活动,让用户可以直接向该应用中的某位朋友或某个社区共享内容。
+
+</p>
+
+<p>如需启用直接共享目标,您必须定义一个类,用于扩展
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService} 类。在清单文件中声明您的
+{@code ChooserTargetService}。在该声明内,指定
+{@code BIND_CHOOSER_TARGET_SERVICE} 权限和一个带有
+{@code SERVICE_INTERFACE} 操作的意向过滤器。</p>
+<p>以下示例展示了如何在清单文件中声明 {@code ChooserTargetService}。
+</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>对于您想要向 {@code ChooserTargetService} 公开的每个活动,请在您的应用清单文件中为其添加一个名为
+{@code "android.service.chooser.chooser_target_service"} 的
+{@code <meta-data>} 元素。
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">语音交互</h2>
+<p>
+本预览版提供了一个新的语音交互 API,与
+<a href="https://developers.google.com/voice-actions/" class="external-link">语音操作</a>一起使用时,可让您为应用内建对话式语音体验。
+调用
+{@code android.app.Activity.isVoiceInteraction()} 方法可确定您的活动是否为响应语音操作而启动。
+如果是这样,则您的应用可以使用
+{@code android.app.VoiceInteractor} 类请求用户进行语音确认、从选项列表中进行选择以及执行其他操作。
+如需了解有关实现语音操作的更多信息,请参阅
+<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">语音操作开发者网站</a>。
+</p>
+
+<h2 id="assist">助手 API</h2>
+<p>
+本预览版提供了一种让用户通过助手程序与应用进行互动的新方式。如需使用此功能,用户必须启用助手以使用当前上下文。
+启用后,用户可通过长按<strong>主页</strong>按钮在任何应用内召唤助手。
+</p>
+<p>您的应用可通过设置
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 标志选择不与助手共享当前上下文。除了平台传递给助手的一组标准信息外,您的应用还可利用新增的 {@code android.app.Activity.AssistContent} 类共享其他信息。
+
+</p>
+
+<p>如需为助手提供您的应用内的其他上下文,请执行以下步骤:</p>
+
+<ol>
+<li>实现 {@link android.app.Application.OnProvideAssistDataListener} 接口。</li>
+<li>利用
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()} 注册此侦听器。</li>
+<li>如需提供特定于活动的上下文信息,请替代
+{@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
+ 回调和新增的 {@code Activity.onProvideAssistContent()} 回调(可选操作)。
+</ol>
+
+<h2 id="notifications">通知</h2>
+<p>本预览版针对通知功能引入了下列 API 变更:</p>
+<ul>
+ <li>新增了 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 过滤级别,它对应于新增的“仅闹铃”<em></em>免打扰模式。
+</li>
+ <li>新增了 {@code Notification.CATEGORY_REMINDER} 类别值,用于区分用户安排的提醒与其他事件 ({@link android.app.Notification#CATEGORY_EVENT}) 和闹铃 ({@link android.app.Notification#CATEGORY_ALARM})。
+
+
+</li>
+ <li>新增了 {@code android.graphics.drawable.Icon} 类,可通过 {@code Notification.Builder.setSmallIcon(Icon)} 方法和
+{@code Notification.Builder.setLargeIcon(Icon)} 方法附加到通知上。
+</li>
+ <li>新增了 {@code NotificationManager.getActiveNotifications()} 方法,让您的应用能够了解哪些通知目前处于活动状态。
+如需查看使用此功能的应用实现,请参阅<a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">活动通知示例</a>。
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">蓝牙触控笔支持</h2>
+<p>本预览版改善了对用户使用蓝牙触控笔进行输入的支持。用户可将兼容的蓝牙触控笔与其手机或平板电脑配对并建立连接。
+连接后,来自触摸屏的位置信息将与来自触控笔的压力和按键信息融合,从而实现比单纯使用触摸屏更丰富的表达。
+
+您的应用可以通过在活动中注册新增的
+{@code View.onStylusButtonPressListener} 回调和 {@code GestureDetector.OnStylusButtonPressListener}
+ 回调侦听触控笔按键动作并执行辅助操作。
+</p>
+
+<p>可使用 {@link android.view.MotionEvent} 方法和常量来检测触控笔按键交互:
+</p>
+<ul>
+<li>如果用户使用带按键的触控笔触按应用屏幕,
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} 方法会返回
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}。</li>
+<li>对于以 M 预览版为目标平台的应用,当用户按触控笔的主按键时,
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+ 方法会返回 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}。
+如果触控笔有辅助按键,当用户按下它时,同一方法会返回
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY}。如果用户同时按下两个按键,该方法会同时返回通过 OR 运算符连接起来的两个值 ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY})。
+
+</li>
+<li>
+对于以较低平台版本为目标的应用,
+{@link android.view.MotionEvent#getButtonState() getButtonState()} 方法返回
+{@link android.view.MotionEvent#BUTTON_SECONDARY}(按下触控笔主按键时)、
+{@link android.view.MotionEvent#BUTTON_TERTIARY}(按下触控笔辅助按键时)之一或同时返回这两者。
+</li>
+</ul>
+
+<h2 id="ble-scanning">改进的蓝牙低功耗扫描</h2>
+<p>
+如果您的应用执行蓝牙低功耗扫描,可以使用新增的
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 方法指定您只希望在下列条件下通知回调:首次找到与设置的
+{@link android.bluetooth.le.ScanFilter} 匹配的播发数据包并且该数据包已有一段时间没有出现。
+
+这种扫描方法与旧平台版本中提供的方法相比更加节能。
+
+</p>
+
+<h2 id="hotspot">Hotspot 2.0 第 1 版支持</h2>
+<p>
+本预览版在 Nexus 6 和 Nexus 9 设备上添加了对 Hotspot 2.0 第 1 版规范的支持。如需在您的应用中设置 Hotspot 2.0 凭据,请使用新增的
+{@link android.net.wifi.WifiEnterpriseConfig} 类方法,如 {@code setPlmn()} 方法和
+{@code setRealm()} 方法。
+在 {@link android.net.wifi.WifiConfiguration} 对象中,您可以设置
+{@link android.net.wifi.WifiConfiguration#FQDN} 字段和 {@code providerFriendlyName} 字段。
+新增的 {@code ScanResult.PasspointNetwork} 属性可指示检测到的网络是否为 Hotspot 2.0 接入点。
+
+</p>
+
+<h2 id="4K-display">4K 显示模式</h2>
+<p>现在,平台允许应用在兼容硬件上请求将显示分辨率升级到 4K 渲染。
+如需查询当前物理分辨率,请使用新增的
+{@code android.view.Display.Mode} API。请注意,如果 UI 是以较低逻辑分辨率绘制并通过放大达到更高的物理分辨率,则
+{@code Display.Mode.getPhysicalWidth()} 方法返回的物理分辨率可能不同于 {@link android.view.Display#getSize(android.graphics.Point) getSize()} 所报告的逻辑分辨率。
+
+</p>
+
+<p>您可以通过设置应用窗口的 {@code WindowManager.LayoutParams.preferredDisplayModeId} 属性请求系统更改应用运行时的物理分辨率。
+如果您想切换到 4K 显示分辨率,此功能会很有帮助。
+在 4K 显示模式下,UI 仍然以原始分辨率(如 1080p)渲染,通过放大达到 4K,但
+{@link android.view.SurfaceView} 对象可能会以原生分辨率显示内容。
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">主题化 ColorStateList</h2>
+<p>对于运行 M 预览版的设备,现在支持在
+{@link android.content.res.ColorStateList} 中使用主题属性。
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 方法和
+{@link android.content.res.Resources#getColor(int) getColor()} 方法已弃用。如果您要调用这些 API,请改为调用新增的 {@code Context.getColorStateList()} 方法或
+{@code Context.getColor()} 方法。
+还可在 v4 appcompat 库中通过 {@link android.support.v4.content.ContextCompat} 使用这些方法。
+</p>
+
+<h2 id="audio">音频功能</h2>
+
+<p>本预览版增强了 Android 上的音频处理功能,包括: </p>
+<ul>
+ <li>通过新增的 {@code android.media.midi} API 提供了对 <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a>
+ 协议的支持。使用这些 API 可发送和接收 MIDI 事件。
+</li>
+ <li>新增了 {@code android.media.AudioRecord.Builder} 类和 {@code android.media.AudioTrack.Builder}
+ 类,分别用于创建数字音频采集和回放对象,还可用于配置音频源和接收器属性来替代系统默认值。
+</li>
+ <li>用于关联音频和输入设备的 API 钩子。如果您的应用允许用户通过与 Android TV 相连的游戏控制器或遥控器启动语音搜索,此功能尤为有用。系统会在用户启动搜索时调用新增的 {@code android.app.Activity.onSearchRequested()} 回调。
+
+
+如需确定用户的输入设备是否内置麦克风,请从该回调检索 {@link android.view.InputDevice} 对象,然后调用新增的
+{@code InputDevice.hasMic()} 方法。
+</li>
+ <li>新增了 {@code android.media.AudioDevicesManager} 类,让您可以检索连接的所有源设备和接收器音频设备列表。
+如果您想让应用在音频设备连接或断开时收到通知,还可以指定一个
+{@code android.media.OnAudioDeviceConnectionListener} 对象。
+</li>
+</ul>
+
+<h2 id="video">视频功能</h2>
+<p>本预览版为视频处理 API 添加了新功能,包括:</p>
+<ul>
+<li>新增了 {@code android.media.MediaSync} 类,可帮助应用同步渲染音频流和视频流。
+音频缓冲区以非锁定方式提交,并通过回调返回。
+此外,它还支持动态回放速率。
+</li>
+<li>新增了 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 事件,它表示应用打开的会话已被资源管理器收回。
+如果您的应用使用 DRM 会话,则应处理此事件,并确保不使用收回的会话。
+
+</li>
+<li>新增了 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 错误代码,它表示资源管理器收回了编解码器使用的媒体资源。
+出现此异常时,必须释放编解码器,因为它已转入终止状态。
+
+</li>
+<li>新增了 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 接口,用于获取有关支持的编解码器实例最大并发数量的提示。
+
+</li>
+<li>新增了 {@code MediaPlayer.setPlaybackParams()} 方法,用于设置快动作回放或慢动作回放的媒体回放速率。
+此外,它还会随视频一起自动拉长或加速音频回放。
+</li>
+</ul>
+
+<h2 id="camera">相机功能</h2>
+<p>本预览版提供了下列用于访问相机闪光灯和相机图像再处理的新 API:
+</p>
+
+<h3 id="flashlight">闪光灯 API</h3>
+<p>如果相机设备带有闪光灯,您可以通过调用 {@code CameraManager.setTorchMode()}
+ 方法,在不打开相机设备的情况下打开或关闭闪光灯的火炬模式。应用对闪光灯或相机设备不享有独占所有权。
+每当相机设备不可用,或者开启火炬的其他相机资源不可用时,火炬模式即会被关闭并变为不可用状态。
+
+其他应用也可调用 {@code setTorchMode()} 来关闭火炬模式。
+当最后一个开启火炬模式的应用关闭时,火炬模式就会被关闭。
+</p>
+
+<p>您可以注册一个回调,通过调用
+{@code CameraManager.registerTorchCallback()} 方法接收有关火炬模式状态的通知。第一次注册回调时,系统会立即调用它,并返回所有当前已知配备闪光灯的相机设备的火炬模式状态。
+
+如果成功开启或关闭火炬模式,系统会调用
+{@code CameraManager.TorchCallback.onTorchModeChanged()} 方法。</p>
+
+<h3 id="reprocessing">再处理 API</h3>
+<p>{@link android.hardware.camera2 Camera2} API 进行了扩展,以支持 YUV 和专用不透明格式图像再处理。
+您的应用通过 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES} 确定再处理功能是否可用。
+如果设备支持再处理,您可以通过调用
+{@code CameraDevice.createReprocessableCaptureSession()} 创建一个可再处理的相机捕获会话并创建输入缓冲区再处理请求。
+
+</p>
+
+<p>使用 {@code ImageWriter} 类可将输入缓冲区流与相机再处理输入相连。
+如需获得空白缓冲区,请遵循以下编程模型:</p>
+
+<ol>
+<li>调用 {@code ImageWriter.dequeueInputImage()} 方法。</li>
+<li>在输入缓冲区中填充数据。</li>
+<li>通过调用 {@code ImageWriter.queueInputImage()} 方法将缓冲区发送至相机。</li>
+</ol>
+
+<p>如果您将 {@code ImageWriter} 对象与
+{@code android.graphics.ImageFormat.PRIVATE} 图像一起使用,您的应用并不能直接访问图像数据。
+请改为调用 {@code ImageWriter.queueInputImage()} 方法,将 {@code ImageFormat.PRIVATE} 图像直接传递给
+{@code ImageWriter},而无需进行任何缓冲区复制。
+</p>
+
+<p>{@code ImageReader} 类现在支持 {@code android.graphics.ImageFormat.PRIVATE} 格式图像流。
+凭借此支持特性,您的应用可使
+{@code ImageReader} 输出图像保持为循环图像队列,还可选择一个或多个图像并将其发送给
+{@code ImageWriter} 进行相机再处理。</p>
+
+<h2 id="afw">Android for Work 功能</h2>
+<p>本预览版提供了下列用于 Android for Work 的新 API:</p>
+<ul>
+ <li><strong>用于企业所有、单一用途设备的增强型控件</strong>:现在,设备所有者可以通过控制以下设置来改善企业所有、单一用途 (COSU) 设备的管理:
+
+
+ <ul>
+ <li>通过
+{@code DevicePolicyManager.setKeyguardEnabledState()} 方法禁用或重新启用键盘锁。</li>
+ <li>通过
+{@code DevicePolicyManager.setStatusBarEnabledState()} 方法禁用或重新启用状态栏(包括快速设置、通知以及启动 Google Now 的向上划动手势)。
+</li>
+ <li>通过 {@link android.os.UserManager} 常量
+{@code DISALLOW_SAFE_BOOT} 禁用或重新启用安全启动</li>
+ <li>通过
+{@link android.provider.Settings.Global} 常量 {@code STAY_ON_WHILE_PLUGGED_IN} 防止屏幕在插入电源的情况下关闭。</li>
+ </ul>
+ </li>
+ <li><strong>设备所有者静默式安装和卸载应用</strong>:现在,设备所有者可使用 {@link android.content.pm.PackageInstaller}
+ API 在不依赖 Google Play for Work 的情况下静默式安装和卸载应用。
+现在,您可以通过设备所有者配置设备,从而无需用户干预即可获取并安装应用。
+此功能可用于在不激活 Google 帐户的情况下实现信息亭或其他此类设备的一键式配置。
+</li>
+<li><strong>静默式企业证书访问</strong>:现在,当应用调用
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()} 时,配置文件所有者或设备所有者可以在系统提示用户选择证书前调用 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} 方法,静默式向发出请求的应用提供别名。
+
+
+此功能让您可以在无需用户干预的情况下授予托管应用访问证书的权限。
+</li>
+<li><strong>自动接受系统更新</strong>。现在,设备所有者可以通过
+{@code DevicePolicyManager.setSystemUpdatePolicy()} 设置一个系统更新政策来自动接受系统更新(例如对于信息亭设备),或者推迟更新并在至多 30 天的时间内防止用户获取更新。
+
+此外,管理员还可设置每日必须获取更新的时间窗口,例如在信息亭设备无人使用的时段。
+有可用的系统更新时,系统会检查工作政策控制器应用是否设置了系统更新政策,并相应地执行操作。
+
+
+</li>
+<li>
+<strong>授权证书安装</strong>:配置文件所有者或设备所有者现在可以授权第三方应用调用以下 {@link android.app.admin.DevicePolicyManager} 证书管理 API:
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>企业恢复出厂设置保护</strong>:现在,配置设备所有者时,您可以通过设置
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 捆绑包配置参数来解锁恢复出厂设置保护 (FRP)。
+在重置设备以解锁 FRP 和配置设备之后,NFC 编程器应用可提供这些参数,而无需事先配置 Google 帐户。
+
+如果您不修改这些参数,FRP 仍然发挥作用,必须使用之前激活的 Google 凭据方可激活设备。
+
+
+<p>此外,通过对 Google Play 服务设置应用限制,设备所有者可以指定用于 FRP 解锁的备用 Google 帐户,以替代在设备上激活的 Google 帐户。
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>数据使用情况跟踪</strong>。现在,配置文件所有者或设备所有者可以利用新增的
+{@code android.app.usage.NetworkStatsManager} 方法查询<strong>设置 > 数据使用情况</strong>中显示的数据使用情况统计信息。
+配置文件所有者会被自动授予查询其管理的配置文件相关数据的权限,而设备所有者则被授予对其管理的主要用户使用情况数据的访问权。
+
+</li>
+<li><strong>运行时权限管理</strong>:
+<p>配置文件所有者或设备所有者可以利用
+{@code DevicePolicyManager.setPermissionPolicy()} 设置适用于所有应用全部运行时请求的权限政策,以提示用户照常授予权限,或自动以静默方式授予或拒绝权限。
+
+如果设置后一种政策,则用户将无法修改配置文件所有者或设备所有者在应用权限屏幕的<strong>设置</strong>内所做的选择。
+
+</p></li>
+<li><strong>“设置”中的 VPN</strong>:现在,<strong>设置 > 更多 > VPN</strong> 中会显示 VPN 应用。此外,现在,关于 VPN 使用情况的通知取决于该 VPN 的配置方式。
+
+
+对于配置文件所有者,通知取决于该 VPN 是针对托管配置文件、个人配置文件还是同时针对这两者进行配置。
+对于设备所有者,通知取决于 VPN 是否针对整个设备进行配置。
+</li>
+<li><strong>工作状态通知</strong>:现在,每当来自托管配置文件的应用具有前台活动时,状态栏就会出现一个公文包图标。
+此外,如果设备直接解锁到托管配置文件中某个应用的活动,则会显示一个 Toast,通知用户他们位于托管配置文件内。
+
+
+</li>
+</ul>
+
+<p class="note">
+ 如需详细了解 M 开发者预览版中的所有 API 变更,请参阅 <a href="{@docRoot}preview/download.html">API 差异报告</a>。
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd b/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
new file mode 100644
index 0000000..39494b9
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=行为变更
+page.keywords=预览版,sdk,兼容性
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文内容</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">运行时权限</a></li>
+ <li><a href="#behavior-power">节能优化</a>
+ <ol>
+ <li><a href="#behavior-doze">打盹</a></li>
+ <li><a href="#behavior-app-standby">应用待机</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">可采用的存储设备</a></li>
+ <li><a href="#behavior-apache-http-client">取消支持 Apache HTTP 客户端</a></li>
+ <li><a href="#behavior-audiomanager-Changes">音频管理器变更</a></li>
+ <li><a href="#behavior-test-selection">文本选择</a></li>
+ <li><a href="#behavior-keystore">Android 密钥库变更</a></li>
+ <li><a href="#behavior-network">Wi-Fi 和网络连接变更</a></li>
+ <li><a href="#behavior-camera">相机服务变更</a></li>
+ <li><a href="#behavior-art-runtime">ART 运行时</a></li>
+ <li><a href="#behavior-apk-validation">APK 验证</a></li>
+ <li><a href="#behavior-afw">Android for Work 变更</a></li>
+</ol>
+
+<h2>API 差异</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 级别 22 至 M 预览版»</a> </li>
+</ol>
+
+
+<h2>另请参阅</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">M 开发者预览版 API 概览</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 开发者预览版除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更。
+本文重点介绍您应该了解并在开发应用时加以考虑的一些重要变更。
+</p>
+
+<p>如果您之前发布过 Android 应用,请注意您的应用可能受到这些平台变更的影响。
+</p>
+
+<h2 id="behavior-runtime-permissions">运行时权限</h1>
+<p>本预览版引入了一种新的权限模型,如今,用户可直接在运行时管理应用权限。
+这种模型让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
+
+ </p>
+
+<p>对于面向 M 预览版开发的应用,请务必在运行时检查和请求权限。
+如需确定您的应用是否已被授予权限,请调用新增的 {@code Context.checkSelfPermission()} 方法。
+如需请求权限,请调用新增的
+{@code Activity.requestPermission()} 方法。即使您的应用不是针对 M 开发的,您也应该在新权限模型下测试您的应用。
+</p>
+
+<p>如需了解有关在您的应用中支持新权限模型的详细信息,请参阅开发者预览版的<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>页面。
+
+如需了解如何评估新模型对应用的影响,请参阅<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">测试指南</a>。
+</p>
+
+<h2 id="behavior-power">节能优化</h2>
+<p>本预览版引入了针对空闲设备和应用的最新节能优化技术。</p>
+
+<h3 id="behavior-doze">打盹</h3>
+<p>如果设备未插入电源,并在屏幕关闭后的一段时间内保持不活动状态,则会进入<em>打盹</em>模式,在该模式下设备会尝试让系统保持休眠状态。
+在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,还可让系统执行任何挂起的操作。
+
+</p>
+
+<p>在打盹模式下,您的应用会受到以下限制:</p>
+<ul>
+<li>网络访问被禁用,除非您的应用获得高优先级 Google Cloud Messaging 操作消息 (tickle)。
+</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">唤醒锁</a>会被忽略。</li>
+<li>通过 {@link android.app.AlarmManager} 类设置的闹铃会被禁用,但通过 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()} 方法和 {@code AlarmManager.setAndAllowWhileIdle()} 方法设置的闹铃除外。
+
+</li>
+<li>不执行 WiFi 扫描</li>
+<li>不允许运行同步适配器和 {@link android.app.job.JobScheduler} 的同步和作业。
+</li>
+</ul>
+</p>
+<p>当设备退出打盹模式时,它会执行任何挂起的作业和同步。</p>
+<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>注</strong>:即将推出的
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+ Google Cloud Messaging</a> 版本允许您指定高优先级消息。
+如果您的应用收到高优先级 GCM 消息,即使设备处于打盹模式,系统也会向其授予短时间的网络访问权限。
+
+</p>
+
+<p>如需了解在您的应用中测试打盹模式的技巧,请参阅
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
+ </p>
+
+<h3 id="behavior-app-standby">应用待机</h3>
+<p>使用本预览版时,系统会在应用未被主动使用时确定其处于空闲状态。
+除非系统检测到以下信号之一,否则将在一段时间后将您的应用视为处于空闲状态:
+</p>
+
+<ul>
+<li>用户显式启动应用。</li>
+<li>应用当前有一个进程位于前台(表现为活动或前台服务形式,或被另一活动或前台服务占用)。
+</li>
+<li>应用生成用户可在锁屏或通知托盘中看到的通知。
+</li>
+<li>用户通过<strong>设置</strong>显式请求不对应用进行优化。
+</li>
+</ul>
+
+<p>如果设备未插入电源,系统会将被视为处于空闲状态的应用的网络访问禁用,并暂停其同步和作业。
+当设备插入电源时,系统将允许这些应用访问网络并执行任何挂起的作业和同步。
+如果设备长时间处于空闲状态,系统将按每天大约一次的频率允许空闲状态的应用访问网络。
+</p>
+
+<p>您可以通过将运行 M 预览版的设备与您的开发计算机相连,并调用以下命令来测试此功能:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>注</strong>:即将推出的
+<a href="https://developers.google.com/cloud-messaging/" class="external-link">
+ Google Cloud Messaging</a> (GCM) 版本允许您指定高优先级消息。
+如果您的应用收到高优先级 GCM 消息,即使其处于空闲状态,也会被授予短时间的网络访问权限。
+
+</p>
+
+<p>如需了解在您的应用中测试应用待机的技巧,请参阅
+<a href="{@docRoot}preview/testing/guide.html#doze-standby">测试指南</a>。
+ </p>
+
+<h2 id="behavior-adoptable-storage">可采用的存储设备</h2>
+<p>
+使用本预览版时,用户可以<em>采用</em> SD 卡等外部存储设备。采用外部存储设备可加密和格式化设备,使其具有类似内部存储设备的行为。
+用户可以利用此特性在存储设备之间移动应用及其私有数据。
+移动应用时,系统会遵守清单文件中的
+<a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a>
+ 首选项。
+</p>
+
+<p>请注意,在内部存储设备与外部存储设备之间移动应用时,如果您的应用访问以下 API 或字段,它们返回的文件路径将会动态变化。郑重建议:在生成文件路径时,请始终动态调用这些 API。请勿使用硬编码文件路径或之前生成的永久性完全限定文件路径。
+
+
+</p>
+
+<ul>
+<li>{@link android.content.Context} 方法:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>{@link android.content.pm.ApplicationInfo} 字段:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>如需在开发者预览版中调试此功能,您可以将一个 USB 驱动器通过一根 USB On-The-Go (OTG) 电缆连接到 Android 设备并运行以下命令启用对该 USB 驱动器的采用:
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">取消支持 Apache HTTP 客户端</h2>
+<p>本预览版取消了对 Apache HTTP 客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别 9)或更高版本为目标平台,请改用 {@link java.net.HttpURLConnection} 类。
+
+此 API 效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
+如需继续使用 Apache HTTP API,您必须先在 {@code build.gradle} 文件中声明以下编译时依赖项:
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android 正在从使用 OpenSSL 库转向使用
+<a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a>
+ 库。如果您要在应用中使用 Android NDK,请勿链接到并非 NDK API 组成部分的加密库,如 {@code libcrypto.so} 和 {@code libssl.so}。
+这些库并非公共 API,可能会在不同版本和设备上毫无征兆地发生变化或出现故障。此外,您还可能让自己暴露在安全漏洞的风险之下。
+
+请改为修改原生代码,以通过 JNI 调用 Java 加密 API,或静态链接到您选择的加密库。
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">音频管理器变更</h2>
+<p>不再支持通过 {@link android.media.AudioManager}
+ 类直接设置音量或将特定音频流静音。{@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} 方法已弃用,您应该改为调用
+{@code AudioManager.requestAudioFocus()} 方法。类似地,
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 方法也已弃用,请改为调用 {@code AudioManager.adjustStreamVolume()} 方法并传入方向值 {@code ADJUST_MUTE} 或 {@code ADJUST_UNMUTE}。
+
+</p>
+
+<h2 id="behavior-test-selection">文本选择</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>现在,当用户在您的应用中选择文本时,您可以在一个<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">浮动工具栏</a>中显示“剪切”<em></em>、“复制”<em></em>和“粘贴”<em></em>等文本选择操作。
+
+其在用户交互实现上与<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">为单个视图启用上下文操作模式</a>中所述的上下文操作栏类似。
+
+
+</p>
+
+<p>如需实现可用于文本选择的浮动工具栏,请在您的现有应用中做出以下更改:
+</p>
+<ol>
+<li>在 {@link android.view.View} 对象或 {@link android.app.Activity} 对象中,将
+{@link android.view.ActionMode} 调用从
+{@code startActionMode(Callback)} 更改为 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}。</li>
+<li>改为使用 {@code ActionMode.Callback} 的现有实现扩展
+{@code ActionMode.Callback2}。</li>
+<li>替代 {@code Callback2.onGetContentRect()} 方法,用于提供 {@link android.graphics.Rect} 内容对象(如文本选择矩形)在视图中的坐标。
+</li>
+<li>如果矩形的定位不再有效,并且这是唯一需要声明为无效的元素,请调用 {@code ActionMode.invalidateContentRect()} 方法。
+</li>
+</ol>
+
+<p>请注意,如果您使用 <a href="{@docRoot}tools/support-library/index.html">
+ Android Support Library</a> 22.2 修订版,浮动工具栏不向后兼容,默认情况下 appcompat 会获得对 {@link android.view.ActionMode} 对象的控制权。
+
+这会禁止显示浮动工具栏。如需在
+{@link android.support.v7.app.AppCompatActivity} 中启用
+{@link android.view.ActionMode} 支持,请调用
+{@code android.support.v7.app.AppCompatActivity.getDelegate()},然后对返回的
+{@link android.support.v7.app.AppCompatDelegate} 调用
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()},并将输入参数设置为 {@code false}。
+此调用会将 {@link android.view.ActionMode} 对象的控制权交还给框架。
+在运行 M 预览版的设备上,框架可以支持
+{@link android.support.v7.app.ActionBar} 模式或浮动工具栏模式;而在运行 M 预览版之前版本的设备上,框架仅支持 {@link android.support.v7.app.ActionBar} 模式。
+</p>
+
+<h2 id="behavior-keystore">Android 密钥库变更</h2>
+<p>使用本预览版时,
+<a href="{@docRoot}training/articles/keystore.html">Android 密钥库提供程序</a>不再支持 DSA,
+但仍支持 ECDSA。</p>
+
+<p>禁用或重置安全锁屏时(例如,由用户或设备管理员执行此类操作时),系统将不再删除需要闲时加密的密钥,
+但在上述事件期间会删除需要闲时加密的密钥。
+</p>
+
+<h2 id="behavior-network">Wi-Fi 和网络连接变更</h2>
+
+<p>本预览版对 Wi-Fi 和网络连接 API 引入了以下行为变更。</p>
+<ul>
+<li>现在,您的应用只能更改由您创建的 {@link android.net.wifi.WifiConfiguration} 对象的状态。
+系统不允许您修改或删除由用户或其他应用创建的
+{@link android.net.wifi.WifiConfiguration} 对象;
+</li>
+<li>
+在之前的版本中,如果应用利用带有
+{@code disableAllOthers=true} 设置的
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} 强制设备连接特定 Wi-Fi 网络,设备将会断开与蜂窝数据网络等其他网络的连接。
+在本预览版中,设备不再断开与上述其他网络的连接。如果您的应用的 {@code targetSdkVersion} 为 {@code “20”} 或更低,则会固定连接所选 Wi-Fi 网络。
+
+如果您的应用的 {@code targetSdkVersion} 为 {@code “21”} 或更高,请使用多网络 API(如
+{@link android.net.Network#openConnection(java.net.URL) openConnection()} 、
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 和新增的
+{@code ConnectivityManager.bindProcessToNetwork()} 方法)来确保通过所选网络传送网络流量。
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">相机服务变更</h2>
+<p>在本预览版中,相机服务中共享资源的访问模式已从之前的“先到先得”访问模式更改为高优先级进程优先的访问模式。
+
+对服务行为的变更包括:</p>
+<ul>
+<li>根据客户端应用进程的“优先级”授予对相机子系统资源的访问权,包括打开和配置相机设备。
+带有对用户可见活动或前台活动的应用进程一般会被授予较高的优先级,从而使相机资源的获取和使用更加可靠;
+
+</li>
+<li>当高优先级的应用尝试使用相机时,系统可能会“驱逐”正在使用相机客户端的低优先级应用。
+在已弃用的 {@link android.hardware.Camera} API 中,这会导致系统为被驱逐的客户端调用
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}。
+
+在 {@link android.hardware.camera2 Camera2} API 中,这会导致系统为被驱逐的客户端调用
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()};
+</li>
+<li>在配备相应相机硬件的设备上,不同的应用进程可同时独立打开和使用不同的相机设备。
+但现在,如果在多进程用例中同时访问相机会造成任何打开的相机设备的性能或能力严重下降,相机服务会检测到这种情况并禁止同时访问。
+
+即使并没有其他应用直接尝试访问同一相机设备,此变更也可能导致低优先级客户端被“驱逐”。
+
+
+</li>
+<li>
+更改当前用户会导致之前用户帐户拥有的应用内活动相机客户端被驱逐。
+对相机的访问仅限于访问当前设备用户拥有的用户个人资料。举例来说,这意味着,当用户切换到其他帐户后,“来宾”帐户实际上无法让使用相机子系统的进程保持运行状态。
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">ART 运行时</h2>
+<p>ART 运行时现在可正确实现
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法的访问规则。此变更修正了之前版本中 Dalvik 无法正确检查访问规则的问题。如果您的应用使用
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法,并且您想替代访问检查,请调用
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法(将输入参数设置为 {@code true})。
+
+
+
+如果您的应用使用
+<a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat 库</a>或
+<a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview 库</a>,则您必须更新应用以使用这些库的最新版本。
+否则,请务必更新从 XML 引用的任何自定义类,以便能够访问它们的类构造函数。
+</p>
+
+<p>本预览版更新了动态链接程序的行为。动态链接程序现在可以识别库的 {@code soname} 与其路径之间的差异(<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">
+公开 bug 6670</a>),并且现在已实现了按 {@code soname} 搜索。
+
+
+之前包含错误的 {@code DT_NEEDED} 条目(通常是开发计算机文件系统上的绝对路径)却仍工作正常的应用,如今可能会出现加载失败。
+</p>
+
+<p>现已正确实现 {@code dlopen(3) RTLD_LOCAL} 标志。请注意,
+{@code RTLD_LOCAL} 是默认值,因此不显式使用
+{@code RTLD_LOCAL} 的 {@code dlopen(3)} 调用将受到影响(除非您的应用显式使用 {@code RTLD_GLOBAL})。使用
+{@code RTLD_LOCAL} 时,在随后通过调用
+{@code dlopen(3)} 加载的库中并不能使用这些符号(这与由 {@code DT_NEEDED} 条目引用的情况截然不同)。</p>
+</p>
+
+<h2 id="behavior-apk-validation">APK 验证</h2>
+<p>该平台现在执行的 APK 验证更为严格。如果在清单文件中声明的文件在 APK 中并不存在,该 APK 将被视为已损坏。
+移除任何内容后必须重新签署 APK。
+</p>
+
+<h2 id="behavior-afw">Android for Work 变更</h2>
+<p>本预览版包含下列针对 Android for Work 的行为变更:</p>
+<ul>
+<li><strong>个人上下文中的工作联系人。</strong>Google Dialer Call Log 现在会在用户查看通话记录时显示工作联系人。将 {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} 设置为 {@code true} 可在 Google Dialer Call Log 中隐藏托管配置文件联系人。
+
+
+仅当您将 {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} 设置为 {@code false} 时,才可以通过蓝牙将工作联系人随个人联系人一起显示给设备。
+
+默认情况下,它设置为 {@code true}。
+
+</li>
+<li><strong>WiFi 配置移除</strong>:现在,当删除某个托管配置文件时,将会移除由配置文件所有者添加的 WiFi 配置(例如,通过调用
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()} 方法添加的配置);
+</li>
+<li><strong>WiFi 配置锁定</strong>:用户无法再修改或删除任何由活动设备所有者创建的 WiFi 配置。
+用户仍可创建和修改其自己的 WiFi 配置,前提是尚未针对该用户设置 {@link android.os.UserManager} 常量
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI}。
+</li>
+<li><strong>通过添加 Google 帐户下载工作策略控制器</strong>向托管环境以外的设备添加需要通过工作策略控制器 (WPC) 管理的 Google 帐户时,帐户添加流程现在会提示用户安装相应的 WPC。在设备初始设置向导中通过<strong>设置 > 帐户</strong>添加帐户时,也会出现此行为。
+
+
+
+</li>
+<li><strong>对特定 DevicePolicyManager API 行为的变更</strong>:调用 {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()} 方法只会影响调用该方法的用户的相机;从托管配置文件调用它不会影响主用户运行的相机应用。
+
+
+此外,
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()} 方法现在除了可供设备所有者使用外,还可供配置文件所有者使用。
+配置文件所有者可设置以下键盘锁限制:
+
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 和
+{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT},它们影响配置文件上级用户的键盘锁设置。
+</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},它只影响应用在托管配置文件中生成的通知。
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd b/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..94a6212
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=权限
+page.tags=预览资源, androidm
+page.keywords=权限, 运行时, 预览
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>内容快览</h2>
+ <ul>
+ <li>如果您的应用主要面向 M 预览版 SDK,则会在运行时(而非安装时)提示用户授予权限。
+</li>
+ <li>用户可以随时从应用“设置”屏幕撤销权限。
+</li>
+ <li>每次运行时,应用均需检查自身是否具备所需的权限。
+</li>
+ </ul>
+
+ <h2>本文内容</h2>
+ <ol>
+ <li><a href="#overview">概览</a></li>
+ <li><a href="#coding">为运行时权限编码</a></li>
+ <li><a href="#testing">测试运行时权限</a></li>
+ <li><a href="#best-practices">最佳做法</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M 开发者预览版引入了一种新的应用权限模型,旨在简化用户安装和升级应用的过程。
+如果在 M 预览版上运行的应用支持新权限模型,则用户无需在安装或升级应用时授予任何权限。相反,应用会根据需要请求权限,且系统将向用户显示一个请求权限的对话框。
+
+
+
+
+</p>
+
+<p>
+ 如果应用支持新权限模型,则仍可在运行旧版 Android 的设备上使用旧权限模型安装并运行此应用。
+
+
+</p>
+
+<h2 id="overview">
+ 概览
+</h2>
+
+<p>
+ 通过 M 开发者预览版,该平台引入了新的应用权限模型。
+以下概述了此新模型的主要组件:
+</p>
+
+<ul>
+ <li>
+ <strong>声明权限:</strong>应用使用清单文件声明其所需的所有权限,就像在早期的 Android 平台中一样。
+
+ </li>
+
+ <li>
+ <strong>权限组:</strong>权限根据相应的功能分为若干
+<em>权限组</em>。例如,
+<code>CONTACTS</code> 权限组包含读取和写入用户联系人和个人资料信息的权限。
+
+ </li>
+
+ <li>
+ <p><strong>安装时授予的有限权限:</strong>当用户安装或更新应用时,系统将授予应用所请求的属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} 的所有权限。
+
+
+ 例如,闹铃和 Internet 权限属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL},因此系统将在安装应用时自动授予这些权限。
+
+ </p>
+
+ <p>此外,系统还可以授予应用签名和系统权限,如<a href="#system-apps">系统应用和签名权限</a>中所述。
+
+系统不会在安装应用时提示用户授予任何权限。<em></em>
+</p>
+ </li>
+
+ <li>
+ <strong>用户在运行时授予权限:</strong>当应用请求权限时,系统将向用户显示一个对话框,然后调用应用的回调函数来通知它是否已授予权限。
+
+如果用户授予某项权限,则应用将获得应用清单文件中声明的、该权限功能区域中的所有权限。
+
+
+ </li>
+
+</ul>
+
+<p>
+ 对于需要权限的功能,此权限模型将改变应用的行为方式。
+以下概述了您调整此模型时所应遵循的开发实践:
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>始终检查权限:</strong>当应用必须执行任何需要权限的操作时,应先检查它是否已具备该权限。
+
+如果没有,则请求授予该权限。
+
+ </li>
+
+ <li>
+ <strong>妥善处理权限不足的情况:</strong>如果应用未被授予适当的权限,则应正常处理失败情况。
+
+ 例如,如果只有新增的功能需要该权限,则应用可以禁用该功能。
+如果该权限对于应用正常运行至关重要,则应用可能会禁用其所有功能,并通知用户需要授予该权限。
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>图 1.</strong>应用“设置”中的“权限”屏幕。
+ </p>
+ </div>
+
+ <li>
+ <strong>权限可撤销:</strong>用户可以随时撤销应用的权限。
+即使用户禁用应用的权限,应用也不会收到通知。<em></em>
+再次强调:您的应用应在执行任何受限操作之前验证是否具备所需的权限。
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>注:</strong>如果应用主要面向 M 开发者预览版,则必须使用新权限模型。
+<em></em>
+</p>
+
+<p>
+ 截至 M 开发者预览版发布,并非所有 Google 应用均已完全实现新权限模型。
+Google 会在 M 开发者预览版运行期间更新这些应用,以便严格遵守权限切换设置。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>如果您的应用拥有自己的 API 接口,请先确保调用方具备访问该数据所需的必要权限,然后再代理权限。
+
+
+</p>
+
+<h3 id="system-apps">
+ 系统应用和签名权限
+</h3>
+
+<p>
+ 通常,当用户安装应用时,系统仅授予应用
+ {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL}。但在某些情况下,系统将授予应用更多权限:
+
+</p>
+
+<ul>
+ <li>如果应用是系统映像的一部分,则系统会自动授予该应用清单文件中列出的所有权限。
+
+ </li>
+
+ <li>如果应用请求提供清单文件中属于 {@link
+ android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} 的权限,且该应用已使用与声明这些权限的应用相同的证书进行签名,则系统将在安装请求权限的应用时向其授予这些权限。
+
+
+
+ </li>
+</ul>
+
+<p>
+ 在这两种情况下,用户仍可随时撤销权限,具体方法是:转到系统的<strong>设置</strong>屏幕,然后选择<strong>应用 ></strong>
+
+ <i>应用名称</i> <strong>> 权限</strong>。应用应在运行时继续检查权限,并根据需要请求权限。
+
+
+</p>
+
+<h3 id="compatibility">
+ 前后兼容性
+</h3>
+
+<p>
+ 如果应用并非面向 M 开发者预览版,则即使是在 M 预览版设备上,该应用也会继续使用旧权限模型。
+当用户安装应用时,系统将要求用户授予应用清单文件中列出的所有权限。
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>在运行 M 开发者预览版的设备上,用户可以从应用的“设置”屏幕禁用任何应用(包括旧版应用)的权限。
+
+如果用户禁用某旧版应用的权限,则系统将以静默方式禁用相应的功能。
+当应用尝试执行需要该权限的操作时,该操作不一定会导致出现异常。
+
+相反,它可能会返回空数据集、报告错误或以其他方式表现出异常行为。
+例如,如果您未经许可查询日历,则该方法会返回空数据集。
+
+</p>
+
+<p>
+ 如果您在未运行 M 预览版的设备上使用新权限模型安装应用,则系统将采用与其他任何应用相同的方式处理:系统会在安装应用时要求用户授予声明的所有权限。
+
+
+
+</p>
+
+<p class="note">
+ <strong>注:</strong>对于预览版本,您必须将最低 SDK 版本设置为 M 预览版 SDK,才可使用预览版 SDK 进行编译。
+这意味着在开发者预览版运行期间,您无法在旧版平台上测试此类应用。
+
+
+</p>
+
+<h3 id="perms-vs-intents">权限与意向的比较</h3>
+
+<p>
+ 许多情况下,您可以使用以下两种方式之一来让您的应用执行某项任务。
+您可以将应用设置为请求执行操作本身所需的权限。
+或者,您可以将应用设置为通过传送意向,让其他应用来执行任务。
+
+</p>
+
+<p>
+ 例如,假设应用需要能够使用设备相机拍摄照片。
+应用可以请求
+<code>android.permission.CAMERA</code> 权限,以便允许其直接访问相机。
+然后,应用将使用 Camera API 控制相机并拍摄照片。
+利用此方法,您的应用能够完全控制摄影过程,并支持您将相机 UI 合并至应用中。
+
+
+</p>
+
+<p>
+ 但是,如果您无需此类控制,则可仅使用 {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 意向来请求图像。
+启动该意向时,系统会提示用户选择相机应用(如果没有默认相机应用),然后该应用将拍摄照片。
+
+该相机应用会将照片返回给应用的 {@link
+ android.app.Activity#onActivityResult onActivityResult()} 方法。
+</p>
+
+<p>
+ 同样,如果您需要打电话、访问用户的联系人或要执行其他操作,则可通过创建适当的意向来完成,或者您可以请求相应的权限并直接访问相应的对象。
+
+每种方法各有优缺点。
+
+</p>
+
+<p>
+ 如果使用权限:
+</p>
+
+<ul>
+ <li>应用可在您执行操作时完全控制用户体验。
+但是,如此广泛的控制会增加任务的复杂性,因为您需要设计适当的 UI。
+
+ </li>
+
+ <li>当您首次执行操作时,系统会显示一次让用户授予权限的提示。
+之后,应用即可执行操作,不再需要用户进行其他交互。
+但是,如果用户不授予权限(或稍后撤销权限),则应用根本无法执行操作。
+
+
+ </li>
+</ul>
+
+<p>
+ 如果使用意向:
+</p>
+
+<ul>
+ <li>您无需为操作设计 UI。处理意向的应用将提供 UI。不过这意味着您无法控制用户体验。
+
+用户可以与您从未见过的应用进行交互。
+
+ </li>
+
+ <li>如果用户没有适用于操作的默认应用,则系统会提示用户选择应用。如果用户未指定默认处理程序,则必须在每次执行此操作时额外处理一个对话框。
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">为运行时权限编码</h2>
+
+<p>
+ 如果应用主要面向新的 M 开发者预览版,则您必须使用新权限模型。
+这意味着除了通过清单文件声明所需的权限以外,您还必须检查应用运行时是否已有相应的权限,如果没有,则需要请求权限。
+
+
+
+</p>
+
+<h3 id="enabling">
+ 启用新权限模型
+</h3>
+
+<p>
+ 要启用新的 M 开发者预览版权限模型,请将应用的
+<code>targetSdkVersion</code> 属性设置为 <code>"MNC"</code>,并将
+<code>compileSdkVersion</code> 设置为 <code>"android-MNC"</code>。这样可启用所有新的权限功能。
+
+</p>
+
+<p>
+ 对于预览版本,您必须将 <code>minSdkVersion</code> 设置为
+<code>"MNC"</code>,才能使用预览版 SDK 进行编译。
+</p>
+
+<h3 id="m-only-perm">
+ 指定仅用于 M 预览版的权限
+</h3>
+
+<p>
+ 您可以使用应用清单文件中的新 <code><uses-permission-sdk-m></code> 元素指明仅在 M 开发者预览版中需要某权限。
+如果您以这种方式声明权限,则每当在旧版设备上安装应用时,系统都不会提示用户或向应用授予权限。通过使用 <code><uses-permission-sdk-m></code>
+ 元素,您可以将新权限添加到更新后的应用版本,而不必强制用户在安装更新时授予权限。
+
+
+
+
+
+</p>
+
+<p>
+ 如果应用在已安装 M 开发者预览版的设备上运行,则
+<code><uses-permission-sdk-m></code> 的行为与
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code> 相同。
+ 系统不会在安装应用时提示用户授予任何权限,且应用将根据需要请求权限。
+
+</p>
+
+<h3 id="prompting">
+ 提示授予权限
+</h3>
+
+<p>
+ 如果应用使用新的 M 开发者预览版权限模型,则在运行 M 预览版的设备上首次启动应用时,系统不会要求用户授予所有权限。
+
+相反,应用将根据需要请求权限。
+当应用请求某权限时,系统会向用户显示一个对话框。
+
+</p>
+
+<p>
+ 如果应用在已安装 SDK 22 或更低版本的设备上运行,则应用将使用旧权限模型。
+当用户安装应用时,系统将提示他们授予应用在清单文件中请求的所有权限,但那些带有 <code><uses-permission-sdk-m></code> 标记的权限除外。
+
+
+</p>
+
+<h4 id="check-platform">检查运行应用的平台</h4>
+
+<p>
+ 只有运行 M 开发者预览版的设备支持此权限模型。
+在调用其中任何方法之前,应用均应通过检查 {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME} 的值来验证运行应用的平台。
+
+如果设备正在运行 M 开发者预览版,则
+{@link android.os.Build.VERSION#CODENAME CODENAME} 为 <code>"MNC"</code>。
+</p>
+
+<h4 id="check-for-permission">检查应用是否具备所需的权限</h4>
+
+<p>当用户尝试执行需要权限的操作时,应用将检查目前是否具备执行此操作所需的权限。
+为此,应用将调用
+<code>Context.checkSelfPermission(
+<i>permission_name</i>)</code>。即便知道用户已授予该权限,应用也应执行此检查,因为用户可以随时撤销应用的权限。
+
+
+例如,如果用户需要使用应用拍摄照片,则应用将调用
+<code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>。
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>表 1.</strong>权限和权限组。</p>
+<table>
+ <tr>
+ <th scope="col">权限组</th>
+ <th scope="col">权限</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">根据需要请求权限</h4>
+
+<p>如果应用尚无所需的权限,则应用将调用
+<code>Activity.requestPermissions(String[], int)</code> 方法,请求提供一项或多项适当的权限。
+应用将传递所需的一项或多项权限,以及整数“请求代码”。
+
+ 此方法异步运行:它会立即返回,并且在用户响应对话框之后,系统会使用结果调用应用的回调方法,将应用传递的相同“请求代码”传递到 <code>requestPermissions()</code>。
+
+
+</p>
+
+ <p>以下代码检查应用是否具备读取用户联系人所需的权限,并根据需要请求该权限:
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">处理权限请求响应</h4>
+
+<p>
+ 当应用请求权限时,系统将向用户显示一个对话框。
+当用户响应时,系统将调用应用的
+<code>Activity.onRequestPermissionsResult(int, String[], int[])</code>
+,向其传递用户响应。应用需要替代该方法。回调会将您传递的相同请求代码传递给
+<code>requestPermissions()</code>。
+例如,如果应用请求
+<code>READ_CONTACTS</code> 访问权限,则可能采用以下回调方法:
+
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>如果用户授予权限,则系统会为应用授予应用清单文件为该功能区域列出的所有权限。
+如果用户拒绝请求,则您应采取适当的操作。
+例如,您可以禁用任何取决于此权限的菜单操作。
+
+ </li>
+</p>
+
+<p>
+ 当系统要求用户授予权限时,用户可以选择指示系统不再要求提供该权限。
+在这种情况下,当应用使用 <code>requestPermissions()</code> 请求该权限时,系统会立即拒绝此请求。
+
+在这种情况下,如果用户已再次明确拒绝您的请求,则系统会以同样的方式调用您的 <code>onRequestPermissionsResult()</code>。
+
+因此,您的应用不能假设用户采取了任何直接交互行为。
+
+</p>
+
+<h2 id="testing">测试运行时权限</h2>
+
+
+<p>
+ 如果应用主要面向 M 开发者预览版,则您必须测试它是否正确处理权限。
+您不能假设应用在运行时具备任何特定的权限。
+应用首次启动时,它可能没有任何权限,且用户可以随时撤销或恢复权限。
+
+
+</p>
+
+<p>
+ 您应测试应用,确保它在所有权限情况下均可正常运行。
+通过 M 预览版 SDK,我们提供了新的
+<a href="{@docRoot}tools/help/adb.html">Android
+ Debug Bridge (adb)</a> 命令,支持您使用需要尝试的任何权限设置测试应用。
+
+</p>
+
+<h3>
+ 新 adb 命令和选项
+</h3>
+
+<p>
+ M 预览版 SDK 平台工具提供了多个新命令,支持您测试应用处理权限的方式。
+
+</p>
+
+<h4>
+ 使用权限安装
+</h4>
+
+<p>
+ 您可以使用 <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a> 命令的新 <code>-g</code> 选项,该选项将安装应用并授予其清单文件中列出的所有权限:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ 授予和撤销权限
+</h4>
+
+<p>
+ 您可以使用新的 ADB <a href="{@docRoot}tools/help/adb.html#pm">软件包管理器 (pm)</a> 命令向已安装的应用授予权限和撤销其权限。此功能对于自动化测试非常有用。
+
+
+</p>
+
+<p>
+ 要授予权限,请使用软件包管理器的 <code>grant</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ 例如,要向录音授予 com.example.myapp 软件包权限,请使用以下命令:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ 要撤销权限,请使用软件包管理器的 <code>revoke</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">最佳做法</h2>
+
+<p>
+ 新权限模型为用户带来更流畅的体验,让他们能够更轻松地安装应用,并得心应手地使用应用的各项功能。
+
+为了充分利用该新模型,我们建议采用下列最佳做法。
+
+</p>
+
+
+<h3 id="bp-what-you-need">仅请求自己所需的权限</h3>
+
+<p>
+ 每次您请求权限时,实际上是在强迫用户作出决定。
+ 如果用户拒绝请求,则会减少应用的功能。
+ 您应尽量减少提出这些请求的次数。
+</p>
+
+<p>
+ 例如,应用往往可以通过使用
+<a href="{@docRoot}guide/components/intents-filters.html">意向</a>(而不是请求权限)获得所需的功能。
+如果应用需要使用手机的相机拍摄照片,则可使用
+ {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE} 意向。当应用执行该意向时,系统会提示用户选择已安装的相机应用拍摄照片。
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ 不要让用户感到无所适从
+</h3>
+
+<p>
+ 如果您让用户一次面对大量权限请求,用户可能会感到无所适从并因此退出应用。替代做法是,您应根据需要请求权限。
+
+
+</p>
+
+<p>
+ 某些情况下,您的应用可能绝对需要一项或多项权限。在这种情况下,合理的做法是,在应用启动之后立即请求所有权限。
+
+例如,如果您运行摄影应用,则该应用需要访问设备的相机。
+当用户首次启动该应用时,不会对请求使用相机所需的权限感到惊讶。
+
+但是,如果同一应用还具备与用户联系人共享照片的功能,则您不应在首次启动时请求用户提供该权限,<em></em>
+
+而是等到用户尝试使用“共享”功能之后,再请求该权限。
+
+</p>
+
+<p>
+ 如果应用提供了教程,则合理的做法是,在教程结束时请求提供应用的必要权限。
+
+</p>
+
+<h3 id="bp-explain">
+ 解释需要权限的原因
+</h3>
+
+<p>
+ 系统在您调用
+<code>requestPermissions()</code> 时显示的权限对话框将说明应用所需的权限,但不会解释为何需要这些权限。
+在某些情况下,用户可能会感到困惑。
+ 最好在调用 <code>requestPermissions()</code> 之前向用户解释应用需要权限的原因。
+
+</p>
+
+<p>
+ 例如,摄影应用可能需要使用位置服务,以便能够为照片添加地理标签。
+通常,用户可能不了解照片能够包含位置信息,并且对摄影应用想要了解具体位置感到不解。
+
+因此在这种情况下,应用最好在调用
+<code>requestPermissions()</code> 之前告知此功能的相关信息。<em></em>
+
+</p>
+
+<p>
+ 其中一种办法是将这些请求纳入应用教程。这样,教程可以依次显示应用的每项功能,并在显示每项功能时解释需要哪些相应的权限。
+
+例如,摄影应用的教程可以演示其“与您的联系人共享照片”功能,然后告知用户需要为应用授予权限以便其查看用户的联系人。
+
+
+然后,应用可以调用 <code>requestPermissions()</code>,要求用户提供该访问权限。
+当然,并非所有用户都会按照教程操作,因此您仍需在应用的正常操作期间检查和请求权限。
+
+
+</p>
diff --git a/docs/html-intl/intl/zh-cn/preview/overview.jd b/docs/html-intl/intl/zh-cn/preview/overview.jd
new file mode 100644
index 0000000..cebbf06
--- /dev/null
+++ b/docs/html-intl/intl/zh-cn/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=计划概览
+page.metaDescription=欢迎参加 Android M 开发者预览版计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ 欢迎使用 <strong>Android M 开发者预览版</strong>计划。此计划将为您提供针对 Android 的下一版本测试和优化应用所需的所有功能。
+
+它是一款免费软件。您仅需下载 M 开发者预览版工具即可立即使用。
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ 硬件和模拟器系统映像
+ </h5>
+
+ <p>
+ 在 Nexus 5、6、9 和 Player(适用于电视)以及模拟器中运行并测试应用。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 最新的平台代码
+ </h5>
+
+ <p>
+ 我们将在预览版期间提供多次更新,因此您将可以针对最新的平台变更测试您的应用。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 通过 OTA(空中下载技术)更新
+ </h5>
+
+ <p>
+ 在向设备刷入初始预览版后,即可通过 OTA 技术获取更新。
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ 新行为和新功能
+ </h5>
+
+ <p>
+ 尽早做好支持新平台行为(例如新运行时权限模型和省电功能)的准备工作。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 为处理开发者反馈问题而设的优先窗口
+ </h5>
+
+ <p>
+ 在最初的几周里,我们将优先处理开发者报告的问题,以便尽快测试并提供反馈。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 反馈和支持
+ </h5>
+
+ <p>
+ 使用<a href="https://code.google.com/p/android-developer-preview/">问题跟踪器</a>向我们报告问题并提供反馈。
+ 与 <a href="http://g.co/dev/AndroidMDevPreview">M 开发者社区</a>中的其他开发者建立联系。
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ 时间表和更新
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M 开发者预览版从 5 月 28 日开始一直运行到最终 Android M SDK 发布为止。最终的 Android M SDK 将于 2015 年第三季度公众版发布之前不久发布。
+
+
+</p>
+
+<p>
+ 在开发阶段的各个里程碑,我们将为您的测试设备提供预览版更新。
+ 暂定的里程碑包括
+</p>
+
+<ul>
+ <li>
+ <strong>预览版 1</strong>(5 月底发布初始预览版);
+ </li>
+
+ <li>
+ <strong>预览版 2</strong>(6 月底/7 月初);
+ </li>
+
+ <li>
+ <strong>预览版 3</strong>(7 月底发布近乎最终版本)
+ </li>
+</ul>
+
+<p>
+ 这些更新将促进形成<strong>最终版本的 SDK</strong>(第三季度末),为 Android 新版本以及最终的系统行为和功能交付官方 API。
+
+
+</p>
+
+<p>
+ 如果您在 Android M 中进行测试和开发,我们郑重建议您随着预览版更新的发布,<strong>将开发环境保持为相应的最新版本</strong>。
+
+ 为了简化这一过程,我们将为已刷入预览版内部版本的设备提供<strong>空中下载 (OTA) 更新</strong>功能,并提供可供您手动下载并刷入的系统映像。
+
+
+</p>
+<p class="note">
+ <strong>注:</strong>最终的 SDK 和系统映像无法通过 OTA 交付,而是需要<strong>手动刷入</strong>到测试设备中。</strong>
+
+
+</p>
+
+<p>
+ 当有预览版更新可用时,我们将通过 <a href="http://android-developers.blogspot.com/">Android 开发者博客</a>、此站点以及 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>通知您。
+
+
+</p>
+
+<h2 id="preview_tools">
+ 预览版具有哪些功能?
+</h2>
+
+<p>
+ M 开发者预览版包括您在各种使用不同屏幕尺寸、网络技术、CPU/GPU 芯片和硬件架构的设备中测试现有应用所需的所有功能。
+
+
+</p>
+
+<h4>
+ SDK 工具
+</h4>
+
+<p>
+ 您可通过 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> 中的 SDK 管理器下载这些组件:
+</p>
+
+<ul>
+ <li>M 开发者预览版 <strong>SDK 工具</strong>
+ </li>
+
+ <li>M 开发者预览版<strong>模拟器系统映像</strong>(32 位和 64 位)
+
+ </li>
+
+ <li>适用于 Android TV 的 M 开发者预览版<strong>模拟器系统映像</strong>(32 位)
+
+ </li>
+</ul>
+
+<h4>
+ 硬件系统映像
+</h4>
+
+<p>
+ 您可从<a href="download.html">“下载”页面</a>中下载这些供 Nexus 设备使用的硬件系统映像:
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong> (GSM/LTE) “hammerhead” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong> “shamu” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong> (Wi-Fi) “volantis” 设备系统映像
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong> (Android TV) “fugu” 设备系统映像
+ </li>
+</ul>
+
+<h4>
+ 文档和示例代码
+</h4>
+
+<p>
+ 以下文档资源有助于您了解预览版:
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">设置 SDK</a>,提供入门指南的分步说明。
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">测试指南</a>和<a href="behavior-changes.html">行为变更</a>,带您了解主要测试领域。
+ </li>
+
+ <li>新 API 文档,包括 <a href="api-overview.html">API 概览</a>、可下载的 <a href="{@docRoot}preview/download.html#docs">API 参考资料</a>以及有关<a href="{@docRoot}preview/features/runtime-permissions.html">权限</a>、<a href="{@docRoot}preview/backup/index.html">应用备份</a>等主要功能的详细开发者指南。
+
+
+
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/samples.html">示例代码</a>,演示如何支持权限和其他新功能。
+
+ </li>
+
+ <li>
+ M 开发者预览版当前版本的<a href="{@docRoot}preview/support.html#release-notes">版本说明</a>,包括变更说明和差异报告。
+
+ </li>
+</ul>
+
+<h4>
+ 支持资源
+</h4>
+
+<p>
+ 在 M 开发者预览版中测试和开发时,您可使用以下支持资源:
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">M 开发者预览版问题跟踪器</a>是您的<strong>主要反馈渠道。</strong>
+
+您可通过问题跟踪器报告错误、性能问题和一般反馈。
+您还可检查<a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">已知问题</a>并找出解决方法步骤。
+
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>是一家 Google+ 社区。在此社区中,您可<strong>与其他使用 Android M 的开发者建立联系</strong>。您可以共享观察结果或想法,或查找 Android M 问题的解决方法。
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ 锁定目标、预览版 API 和发布
+</h2>
+
+<p>
+ Android M 开发者预览版是仅面向开发的版本,
+<strong>并不具有标准的 API 级别</strong>。如果您想选择拒绝通过兼容性行为测试您的应用(强烈推荐),则可将应用的 <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code>
+ 设置为 <code>“MNC”</code>,从而锁定 M 开发者预览版。
+
+
+</p>
+
+<p>
+ Android M 开发者预览版提供<strong>预览 API</strong> 功能
+— 在最终的 SDK 发布之前,这些 API 都不是正式的 API。目前,最终的 SDK 计划于 2015 年第三季度发布。
+这意味着一段时期内,特别是该计划的最初几周内,
+<strong>API 可能会出现细微变化</strong>。
+我们会通过 Android M 开发者预览版的每次更新,为您提供一份变更摘要。
+
+</p>
+
+<p class="note">
+ 请注意,尽管预览版 API 可能会更改,但运行时权限和省电功能等基本系统行为仍保持稳定,可以立即用于测试。
+
+
+</p>
+
+<p>
+ 关于发布,Google Play 会<strong>禁止发布面向 M 开发者预览版的应用</strong>。
+当 Android M 最终版本 SDK 可用时,您可以锁定官方 Android M API 级别,并将应用发布至 Google Play。
+
+与此同时,如果您需要将针对 Android M 的应用分发给测试者,则可通过电子邮件或从您的站点直接下载实现这一点。
+
+
+</p>
+
+<h2 id="get_started">
+ 如何开始
+</h2>
+
+<p>
+ 要开始测试应用,请执行以下操作:
+</p>
+
+<ol>
+ <li>查看 <a href="{@docRoot}preview/api-overview.html">API 概览</a>和<a href="{@docRoot}preview/behavior-changes.html">行为变更</a>,大致了解新功能及其如何影响您的应用。
+
+特别地,您需要了解新的<a href="{@docRoot}preview/features/runtime-permissions.html">运行时权限</a>模型、省电功能和自动备份。
+
+
+ </li>
+
+ <li>遵循有关<a href="{@docRoot}preview/setup-sdk.html">设置预览版 SDK</a> 和配置测试设备的说明,来设置您的环境。
+
+
+ </li>
+
+ <li>遵循<a href="https://developers.google.com/android/nexus/images">刷入说明</a>,刷入 Nexus 5、6、9 和 Player 的最新 M 开发者预览版系统映像。
+
+为开发设备刷入系统映像后,预览版更新将通过无线 (OTA) 更新进行交付。</a>
+
+ </li>
+
+ <li>下载 <a href="{@docRoot}preview/download.html#docs">M 预览版 API 参考资料</a>和 <a href="{@docRoot}preview/samples.html">M 预览版示例</a>,更深入地了解新 API 功能以及如何在应用中使用这些功能。
+
+
+
+ </li>
+
+ <li>加入 <a href="http://g.co/dev/AndroidMDevPreview">Android M 开发者社区</a>,获取最新资讯并与使用新平台的其他开发者建立联系。
+
+
+ </li>
+</ol>
+
+<p>
+ 感谢您参加 Android M 开发者预览版计划!
+</p>
diff --git a/docs/html-intl/intl/zh-tw/preview/api-overview.jd b/docs/html-intl/intl/zh-tw/preview/api-overview.jd
new file mode 100644
index 0000000..f6c5696
--- /dev/null
+++ b/docs/html-intl/intl/zh-tw/preview/api-overview.jd
@@ -0,0 +1,521 @@
+page.title=API 總覽
+page.keywords=預覽,sdk,相容性
+page.tags=previewresources, androidm
+sdk。platform.apiLevel=22-mnc
+page.image=images/cards/card-api-overview_16-9_2x.png
+@jd:body
+
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文件內容
+<a href="#" onclick="hideNestedItems('#toc44',this);return false;" class="header-toggle">
+ <span class="more">顯示更多內容</span>
+ <span class="less" style="display:none">顯示較少內容</span></a></h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#app-linking">應用程式連結</a></li>
+ <li><a href="#backup">針對應用程式進行自動備份</a></li>
+ <li><a href="#authentication">驗證</a>
+ <ol>
+ <li><a href="#fingerprint-authentication">指紋驗證</a></li>
+ <li><a href="#confirm-credential">確認認證</a></li>
+ </ol>
+ </li>
+ <li><a href="#direct-share">直接分享</a></li>
+ <li><a href="#voice-interactions">語音互動</a></li>
+ <li><a href="#assist">協助 API</a></li>
+ <li><a href="#notifications">通知</a></li>
+ <li><a href="#bluetooth-stylus">藍牙手寫筆支援</a></li>
+ <li><a href="#ble-scanning">已改進藍牙低電量掃描</a></li>
+ <li><a href="#hotspot">無線基地台 2.0 版本 1 支援</a></li>
+ <li><a href="#4K-display">4K 顯示模式</a></li>
+ <li><a href="#behavior-themeable-colorstatelists">具備設計風格的 ColorStateList</a></li>
+ <li><a href="#audio">音訊功能</a></li>
+ <li><a href="#video">影片功能</a></li>
+ <li><a href="#camera">相機功能</a>
+ <ol>
+ <li><a href="#flashlight">閃光燈 API</a></li>
+ <li><a href="#reprocessing">相機重新處理</a></li>
+ </ol>
+ </li>
+ <li><a href="#afw">Android for Work 功能</a></li>
+</ol>
+
+<h2>API 差異</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 級別 22 到 M 預覽版»</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>M 開發人員預覽版讓您能夠搶先查看即將發行的 Android 平台版本,這個版本將提供可供使用者和應用程式開發人員使用的新功能。
+
+本文件提供最值得受到矚目的 API 簡介。</p>
+
+<p>M 開發人員預覽版的適用對象是<strong>早期採用的開發人員</strong>和<strong>測試者</strong>。
+如果您對於如何影響 Android 架構方向深感興趣,請<a href="{@docRoot}preview/setup-sdk.html">嘗試使用 M 開發人員預覽版</a>,然後將您的意見反應傳送給我們!
+
+
+</p>
+
+<p class="caution"><strong>注意:</strong>請勿將使用 M 開發人員預覽版的應用程式發行到 Google Play 商店。
+</p>
+
+<p class="note"><strong>注意:</strong>本文件通常會參考 <a href="{@docRoot}">developer.android.com</a> 上尚未提供可用參考資料的類別和方法。
+這些 API 元素在本文件中的格式是 {@code code style} (不含超連結)。
+如需這些元素的 API 初稿文件,請下載<a href="{@docRoot}preview/download.html#docs">預覽版參考資料</a>。
+</p>
+
+<h3>重要行為變更</h3>
+
+<p>如果您先前曾發行過適用於 Android 的應用程式,請注意,您的應用程式會受到平台中的變更所影響。
+</p>
+
+<p>如需完整資訊,請參閱<a href="behavior-changes.html">行為變更</a>。</p>
+
+<h2 id="app-linking">應用程式連結</h2>
+<p>這個預覽版提供功能更強大的應用程式連結來增強 Android 的意圖系統。此功能讓您能夠將應用程式關聯到您自己的 Web 網域。
+根據這個關聯,平台可以判斷要用來處理特定 Web 連結的預設應用程式,並略過提示使用者選取應用程式的程序。如要深入瞭解如何實作此功能,請參閱<a href="{@docRoot}preview/features/app-linking.html">應用程式連結</a>。
+
+
+
+
+<h2 id="backup">針對應用程式進行自動備份</h2>
+<p>系統現在會針對應用程式執行自動完整資料備份與還原。預設會針對目標為 M 預覽版的應用程式啟用這個行為;您不需要新增任何其他的程式碼。
+如果使用者刪除他們的 Google 帳戶,也會同時刪除他們的備份資料。
+如要深入瞭解此功能的運作方式以及如何在檔案系統上設定要備份的內容,請參閱<a href="{@docRoot}preview/backup/index.html">針對應用程式進行自動備份</a>。
+
+</p>
+
+<h2 id="authentication">驗證</h2>
+<p>這個預覽版提供新的 API,讓您能夠在支援的裝置上利用使用者的指紋掃描來驗證他們,並使用裝置解鎖機制 (例如鎖定螢幕密碼) 來檢查距離最後一次驗證該使用者的時間有多接近。
+
+將這些 API 與 <a href="{@docRoot}training/articles/keystore.html">Android 金鑰存放區系統</a>搭配使用。
+</p>
+
+<h3 id="fingerprint-authentication">指紋驗證</h3>
+
+<p>如要透過指紋掃描驗證使用者,請取得新的
+{@code android.hardware.fingerprint.FingerprintManager} 類別的執行個體,然後呼叫
+{@code FingerprintManager.authenticate()} 方法。您的應用程式必須在配備指紋感應器的相容裝置上執行。
+您必須在應用程式上實作適用於指紋驗證流程的使用者介面,並在您的 UI 中使用標準的 Android 指紋圖示。Android 指紋圖示 ({@code c_fp_40px.png}) 隨附於<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">範例應用程式</a>中。如果您正在開發多個使用指紋驗證的應用程式,請注意,每個應用程式都必須個別驗證使用者的指紋。
+
+
+
+
+</p>
+
+<p>如要在您的應用程式中使用此功能,請先在您的宣示說明中新增 {@code USE_FINGERPRINT} 權限。
+</p>
+
+<pre>
+<uses-permission
+ android:name="android.permission.USE_FINGERPRINT" />
+</pre>
+
+<img src="{@docRoot}preview/images/fingerprint-screen.png" srcset="{@docRoot}preview/images/fingerprint-screen.png 1x, {@docRoot}preview/images/fingerprint-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+
+<p>如要查看指紋驗證的應用程式實作,請參閱<a href="https://github.com/googlesamples/android-FingerprintDialog" class="external-link">指紋對話方塊範例</a>。
+
+</p>
+
+<p>如果您正在測試此功能,請依照下列步驟執行:</p>
+<ol>
+<li>安裝 Android SDK 工具修訂版 24.3 (如果您尚未安裝)。</li>
+<li>前往 [設定] > [安全性] > [指紋]<strong></strong>,然後依照註冊指示,在模擬器中註冊新的指紋。
+</li>
+<li>使用模擬器,利用下列命令來模擬指紋輕觸事件。
+使用同一個命令,在鎖定螢幕上或您的應用程式中模擬指紋輕觸事件。
+
+<pre class="no-prettyprint">
+adb -e emu finger touch <finger_id>
+</pre>
+<p>在 Windows 上,您可能必須執行 {@code telnet 127.0.0.1 <emulator-id>},後面接著
+{@code finger touch <finger_id>}。
+</p>
+</li>
+</ol>
+
+<h3 id="confirm-credential">確認認證</h3>
+<p>您的應用程式可以根據使用者最近一次將裝置解鎖的時間有多接近來驗證他們。此功能讓使用者不需記住其他應用程式特定的密碼,並且讓您不需要實作自己的驗證使用者介面。
+
+您的應用程式應該將此功能與公用或秘密金鑰實作搭配使用,來進行使用者驗證。
+</p>
+
+<p>如要設定在成功驗證使用者之後,同一個金鑰可重複使用的逾時時間長度,可在您設定 {@link javax.crypto.KeyGenerator} 或
+{@link java.security.KeyPairGenerator} 時,呼叫新的
+{@code android.security.keystore.KeyGenParameterSpec.setUserAuthenticationValidityDurationSeconds()}
+方法。
+此功能目前適用於對稱式密碼編譯操作。
+</p>
+
+<p>避免過度顯示重新驗證對話方塊 -- 您的應用程式應該先嘗試使用密碼編譯物件,如果逾時過期,才使用
+{@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence) createConfirmDeviceCredentialIntent()}
+方法在您的應用程式內重新驗證使用者。
+
+</p>
+
+<p>如要查看此功能的應用程式實作,請參閱<a href="https://github.com/googlesamples/android-ConfirmCredential" class="external-link">確認認證範例</a>。
+
+</p>
+
+<h2 id="direct-share">直接分享</h2>
+
+<img src="{@docRoot}preview/images/direct-share-screen.png" srcset="{@docRoot}preview/images/direct-share-screen.png 1x, {@docRoot}preview/images/direct-share-screen_2x.png 2x" style="float:right; margin:0 0 20px 30px" width="312" height="329" />
+
+<p>這個預覽版提供 API,讓使用者能夠以直覺且快速的方式進行分享。您現在可以定義「直接分享目標」<em></em>,在您的應用程式中啟動特定的行為。這些直接分享目標是透過 [分享]<em></em> 選單來向使用者公開。
+
+此功能讓使用者能夠將內容分享到其他應用程式內的目標,例如聯絡人。
+例如,直接分享目標可以在其他社交網路應用程式中啟動某個活動,讓使用者能夠在該應用程式中,直接與特定的朋友或社群分享內容。
+
+</p>
+
+<p>如要啟用直接分享目標,您必須定義一個類別來擴充
+{@code android.service.} <br>
+{@code chooser.ChooserTargetService} 類別。在宣示說明中宣告您的
+{@code ChooserTargetService}。在該宣告中,指定
+{@code BIND_CHOOSER_TARGET_SERVICE} 權限以及含有
+{@code SERVICE_INTERFACE} 動作的意圖篩選條件。</p>
+<p>下列範例示範如何在您的宣示說明中宣告 {@code ChooserTargetService}。
+</p>
+<pre>
+<service android:name=".ChooserTargetService"
+ android:label="@string/service_name"
+ android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE">
+ <intent-filter>
+ <action android:name="android.service.chooser.ChooserTargetService" />
+ </intent-filter>
+</service>
+</pre>
+
+<p>針對您要向 {@code ChooserTargetService} 公開的每個活動,在您的應用程式宣示說明中,新增名稱為
+{@code "android.service.chooser.chooser_target_service"} 的
+{@code <meta-data>} 元素。
+</p>
+
+<pre>
+<activity android:name=".MyShareActivity”
+ android:label="@string/share_activity_label">
+ <intent-filter>
+ <action android:name="android.intent.action.SEND" />
+ </intent-filter>
+<meta-data
+ android:name="android.service.chooser.chooser_target_service"
+ android:value=".ChooserTargetService" />
+</activity>
+</pre>
+
+<h2 id="voice-interactions">語音互動</h2>
+<p>
+這個預覽版提供新的語音互動 API,可與<a href="https://developers.google.com/voice-actions/" class="external-link">語音操作</a>搭配使用,讓您能夠在應用程式內建置交談式語音體驗。
+
+呼叫
+{@code android.app.Activity.isVoiceInteraction()} 方法,來判斷是否已啟動您的活動來回應語音操作。
+如果是,則您的應用程式可以使用
+{@code android.app.VoiceInteractor} 類別,來要求使用者進行語音確認、從選項清單中選取,以及其他更多動作。
+如要深入瞭解如何實作語音操作,請參閱<a href="https://developers.google.com/voice-actions/interaction/" class="external-link">語音操作開發人員網站</a>。
+
+</p>
+
+<h2 id="assist">協助 API</h2>
+<p>
+這個預覽版提供一種新方式,可透過小幫手吸引使用者來使用您的應用程式。如要使用此功能,使用者必須啟用小幫手來使用目前的內容。
+啟用之後,使用者就能夠在所有應用程式內,按住 <strong>Home</strong> 按鈕不放來啟用小幫手。
+</p>
+<p>您的應用程式可以設定
+{@link android.view.WindowManager.LayoutParams#FLAG_SECURE} 旗標,選擇不要與小幫手分享目前的內容。除了平台傳遞給小幫手的一組標準資訊之外,您的應用程式也可以使用新的 {@code android.app.Activity.AssistContent} 類別來分享其他資訊。
+
+</p>
+
+<p>如要將您應用程式的其他內容提供給小幫手,請依照下列步驟執行:</p>
+
+<ol>
+<li>實作 {@link android.app.Application.OnProvideAssistDataListener} 介面。</li>
+<li>使用
+{@link android.app.Application#registerOnProvideAssistDataListener(android.app.Application.OnProvideAssistDataListener) registerOnProvideAssistDataListener()} 來註冊這個監聽器。</li>
+<li>如要提供特定活動的內容資訊,請覆寫
+ {@link android.app.Activity#onProvideAssistData(android.os.Bundle) onProvideAssistData()}
+回呼,然後選擇性地覆寫新的 {@code Activity.onProvideAssistContent()} 回呼。
+</ol>
+
+<h2 id="notifications">通知</h2>
+<p>這個預覽版新增了下列適用於通知的 API 變更:</p>
+<ul>
+ <li>新的 {@code NotificationListenerService.INTERRUPTION_FILTER_ALARMS} 篩選條件級別,會對應至新的「僅允許鬧鐘」<em></em>的請勿打擾模式。
+</li>
+ <li>新的 {@code Notification.CATEGORY_REMINDER} 類別值,可用來分辨來自其他事件 ({@link android.app.Notification#CATEGORY_EVENT}) 與鬧鐘 ({@link android.app.Notification#CATEGORY_ALARM}) 的使用者排程提醒。
+
+
+</li>
+ <li>新的 {@code android.graphics.drawable.Icon} 類別,可以透過 {@code Notification.Builder.setSmallIcon(Icon)} 和
+{@code Notification.Builder.setLargeIcon(Icon)} 方法來附加您的通知。
+</li>
+ <li>新的 {@code NotificationManager.getActiveNotifications()} 方法,讓您的應用程式能夠找出它們目前有哪些通知仍處於有效狀態。
+如要查看使用此功能的應用程式實作,請參閱<a href="https://github.com/googlesamples/android-ActiveNotifications" class="external-link">使用中通知範例</a>。
+</li>
+</ul>
+
+<h2 id="bluetooth-stylus">藍牙手寫筆支援</h2>
+<p>這個預覽版提供對於使用者使用藍牙手寫筆進行輸入的改良支援。使用者可以將相容的藍芽手寫筆與他們的手機或平板電腦配對並連線。
+連線之後,來自觸控螢幕的位置資訊會與來自手寫筆的壓力和按鈕資訊結合,比起單獨使用觸控螢幕,這樣能夠提供更大範圍的表達方式。
+
+您的應用程式可以藉由在您的活動中註冊新的
+{@code View.onStylusButtonPressListener} 和 {@code GestureDetector.OnStylusButtonPressListener}
+回呼,來監聽手寫筆按鈕的按下動作,並執行次要動作。
+</p>
+
+<p>使用 {@link android.view.MotionEvent} 方法和常數來偵測手寫筆按鈕互動:
+</p>
+<ul>
+<li>如果使用者使用具有一個按鈕的手寫筆輕觸應用程式的螢幕,則
+{@link android.view.MotionEvent#getToolType(int) getTooltype()} 方法會傳回
+{@link android.view.MotionEvent#TOOL_TYPE_STYLUS}。</li>
+<li>針對目標為 M 預覽版的應用程式,
+{@link android.view.MotionEvent#getButtonState() getButtonState()}
+方法會在使用者按下主要手寫筆按鈕時傳回 {@code MotionEvent.STYLUS_BUTTON_PRIMARY}。
+如果手寫筆有第二個按鈕,則當使用者按下該按鈕時,同一個方法會傳回
+{@code MotionEvent.STYLUS_BUTTON_SECONDARY}。如果使用者同時按下這兩個按鈕,此方法即會使用 OR 連結,一併傳回這兩個值 ({@code STYLUS_BUTTON_PRIMARY|STYLUS_BUTTON_SECONDARY})。
+
+</li>
+<li>
+針對目標為較低平台版本的應用程式,
+{@link android.view.MotionEvent#getButtonState() getButtonState()} 方法會傳回
+{@link android.view.MotionEvent#BUTTON_SECONDARY} (針對主要手寫筆按鈕的按下動作)、
+{@link android.view.MotionEvent#BUTTON_TERTIARY} (針對次要手寫筆按鈕的按下動作),或兩者。
+</li>
+</ul>
+
+<h2 id="ble-scanning">已改進藍牙低電量掃描</h2>
+<p>
+如果您的應用程式會執行藍芽低電量掃描,就可以使用新的
+{@code android.bluetooth.le.ScanSettings.Builder.setCallbackType()} 方法,來指定如果先找到符合
+{@link android.bluetooth.le.ScanFilter} 組合的廣告封包,以及在某個時段中找不到它時,只需通知回呼。
+
+比起先前平台版本中所提供的功能,這個掃描方法功能更強大且更有效率。
+
+</p>
+
+<h2 id="hotspot">無線基地台 2.0 版本 1 支援</h2>
+<p>
+這個預覽版在 Nexus 6 和 Nexus 9 裝置上新增對於無線基地台 2.0 版本 1 規格的支援。如要在您的應用程式中佈建無線基地台 2.0 認證,請使用
+{@link android.net.wifi.WifiEnterpriseConfig} 類別的新方法,例如 {@code setPlmn()} 和
+{@code setRealm()}。
+在 {@link android.net.wifi.WifiConfiguration} 物件中,您可以設定
+{@link android.net.wifi.WifiConfiguration#FQDN} 和 {@code providerFriendlyName} 欄位。新的 {@code ScanResult.PasspointNetwork} 屬性指出偵測到的網路是否代表無線基地台 2.0 存取點。
+
+
+</p>
+
+<h2 id="4K-display">4K 顯示模式</h2>
+<p>此平台現在允許應用程式能夠要求將在相容硬體中呈現的顯示解析度升級到 4K。
+如要查詢目前的實際解析度,請使用新的
+{@code android.view.Display.Mode} API。如果 UI 是使用較低的邏輯解析度來繪製,並向上升級為較高的實際解析度,請注意,
+{@code Display.Mode.getPhysicalWidth()} 方法傳回的實際解析度可能會與 {@link android.view.Display#getSize(android.graphics.Point) getSize()} 報告的邏輯解析度不同。
+
+</p>
+
+<p>您可以在應用程式執行時,藉由設定應用程式視窗的 {@code WindowManager.LayoutParams.preferredDisplayModeId} 屬性,來要求系統變更該應用程式中的實際解析度。
+如果您想要切換為 4K 顯示解析度,這個功能非常實用。
+儘管在 4K 顯示模式中,UI 會持續使用原始解析度 (例如 1080p) 來呈現並向上升級為 4K,但是
+{@link android.view.SurfaceView} 物件可能會以原生解析度來顯示內容。
+</p>
+
+<h2 id="behavior-themeable-colorstatelists">具備設計風格的 ColorStateList</h2>
+<p>針對執行 M 預覽版的裝置,
+{@link android.content.res.ColorStateList} 中目前支援設計風格屬性。
+{@link android.content.res.Resources#getColorStateList(int) getColorStateList()} 和
+{@link android.content.res.Resources#getColor(int) getColor()} 方法已過時。如果您正在呼叫這些 API,請改為呼叫新的 {@code Context.getColorStateList()} 或
+{@code Context.getColor()} 方法。
+您也可以透過 {@link android.support.v4.content.ContextCompat},在 v4 appcompat 程式庫中取得這些方法。
+</p>
+
+<h2 id="audio">音訊功能</h2>
+
+<p>這個預覽版在 Android 上新增了音訊處理的增強功能,包括: </p>
+<ul>
+ <li>利用新的 {@code android.media.midi} API,來支援 <a href="http://en.wikipedia.org/wiki/MIDI" class="external-link">MIDI</a> 通訊協定。
+使用這些 API 來傳送與接收 MIDI 事件。
+</li>
+ <li>新的 {@code android.media.AudioRecord.Builder} 和 {@code android.media.AudioTrack.Builder}
+類別,可分別建立數位音訊擷取和播放物件,並設定音訊來源和接收屬性來覆寫系統預設值。
+</li>
+ <li>API 勾點,適合用來關聯音訊與輸入裝置。如果您的應用程式允許使用者從連接到 Android TV 的遊戲控制器或遙控器啟動音訊搜尋,則這特別有用。系統會在使用者啟動搜尋時,叫用新的 {@code android.app.Activity.onSearchRequested()} 回呼。
+
+
+如要判斷使用者的輸入裝置是否有內建的麥克風,請從該回呼中擷取 {@link android.view.InputDevice} 物件,然後呼叫新的
+{@code InputDevice.hasMic()} 方法。
+</li>
+ <li>新的 {@code android.media.AudioDevicesManager} 類別,讓您能夠擷取所有已連接的來源與接收音訊裝置的清單。
+如果您想要讓應用程式在連接或中斷連接音訊裝置時收到通知,也可以指定
+{@code android.media.OnAudioDeviceConnectionListener} 物件。
+</li>
+</ul>
+
+<h2 id="video">影片功能</h2>
+<p>這個預覽版在影片處理 API 中增加了新功能,包括:</p>
+<ul>
+<li>新的 {@code android.media.MediaSync} 類別,可協助應用程式同步轉譯音訊和影片串流。
+音訊緩衝區是利用非封鎖的方式來提交,並透過回呼來傳回。
+它也支援動態播放速率。
+</li>
+<li>新的 {@code MediaDrm.EVENT_SESSION_RECLAIMED} 事件,指出應用程式開啟的工作階段已由資源管理員所回收。
+如果您的應用程式使用 DRM 工作階段,就應該處理這個事件,並確定不會使用回收的工作階段。
+
+</li>
+<li>新的 {@code MediaCodec.CodecException.ERROR_RECLAIMED} 錯誤碼,表示資源管理員已回收轉碼器所使用的媒體資源。
+如果發生這個例外狀況,就必須釋放轉碼器,就如同它已進入終止狀態。
+
+</li>
+<li>新的 {@code MediaCodecInfo.CodecCapabilities.getMaxSupportedInstances()} 介面,可取得支援並行轉碼器執行個體數目上限的提示。
+
+</li>
+<li>新的 {@code MediaPlayer.setPlaybackParams()} 方法,可將媒體播放速率設定為快速或慢速播放。
+這也可以和影片一起自動延伸或加速音訊播放。
+</li>
+</ul>
+
+<h2 id="camera">相機功能</h2>
+<p>這個預覽版包含下列可用來存取相機閃光燈和相機重新處理影像的 API:
+</p>
+
+<h3 id="flashlight">閃光燈 API</h3>
+<p>如果相機裝置具有閃光裝置,則您可以呼叫 {@code CameraManager.setTorchMode()}
+方法,在不開啟相機裝置的情況下,開啟或關閉閃光裝置的閃光模式。應用程式不具備閃光裝置或相機裝置的獨佔擁有權。
+每當相機裝置變成無法使用時,或者,當其他相機資源讓閃光變成無法使用時,閃光模式也會關閉且變成無法使用。
+
+其他應用程式也會呼叫 {@code setTorchMode()}
+來關閉閃光模式。關閉最後一個開啟閃光模式的應用程式時,閃光模式即會關閉。
+</p>
+
+<p>您可以呼叫
+{@code CameraManager.registerTorchCallback()} 方法,來註冊回呼要收到有關閃光模式狀態的通知。第一次註冊回呼時,會立即使用所有目前已知具有閃光裝置之相機裝置的閃光模式來呼叫它。
+
+如果成功開啟或關閉閃光模式,即會叫用
+{@code CameraManager.TorchCallback.onTorchModeChanged()} 方法。</p>
+
+<h3 id="reprocessing">重新處理 API</h3>
+<p>{@link android.hardware.camera2 Camera2} API 已擴充,支援重新處理 YUV 和私人不透明格式的影像。
+您的應用程式會判斷是否可透過 {@code CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES} 使用重新處理功能。
+如果裝置支援重新處理,您就可以呼叫
+{@code CameraDevice.createReprocessableCaptureSession()} 來建立可重新處理的相機拍攝工作階段,然後建立適用於重新處理輸入緩衝區的要求。
+
+</p>
+
+<p>使用 {@code ImageWriter} 類別,將輸入緩衝區流程連接到相機重新處理輸入。
+如要取得空的緩衝區,請依照這個程式設計模型執行:</p>
+
+<ol>
+<li>呼叫 {@code ImageWriter.dequeueInputImage()} 方法。</li>
+<li>在輸入緩衝區中填入資料。</li>
+<li>呼叫 {@code ImageWriter.queueInputImage()} 方法,將緩衝區傳送到相機。</li>
+</ol>
+
+<p>如果您將 {@code ImageWriter} 物件和
+{@code android.graphics.ImageFormat.PRIVATE} 影像一起使用,您的應用程式就無法直接存取影像資料。
+請改為呼叫 {@code ImageWriter.queueInputImage()} 方法但不含任何緩衝區複本,直接將 {@code ImageFormat.PRIVATE} 影像傳遞到
+{@code ImageWriter}。
+</p>
+
+<p>{@code ImageReader} 類別現在支援 {@code android.graphics.ImageFormat.PRIVATE} 格式的影像串流。
+這個支援讓您的應用程式能夠保留
+{@code ImageReader} 輸出影像的循環影像佇列、選取一或多個影像,然後將它們傳送到
+{@code ImageWriter} 以進行相機重新處理。</p>
+
+<h2 id="afw">Android for Work 功能</h2>
+<p>這個預覽版包含下列適用於 Android for Work 功能的新 API:</p>
+<ul>
+ <li><strong>已增強適用於公司擁有、單一用途裝置的控制項:</strong>裝置擁有者現在可以控制下列設定,來改進公司擁有、單一用途 (COSU) 裝置的管理:
+
+
+ <ul>
+ <li>使用
+{@code DevicePolicyManager.setKeyguardEnabledState()} 方法來停用或重新啟用滑動解鎖。</li>
+ <li>使用
+{@code DevicePolicyManager.setStatusBarEnabledState()} 方法,來停用或重新啟用狀態列 (包括快速設定、通知,以及啟動 Google 即時資訊的導覽向上滑動手勢)。
+</li>
+ <li>使用 {@link android.os.UserManager} 常數
+{@code DISALLOW_SAFE_BOOT} 來停用或重新啟用安全開機。</li>
+ <li>使用
+ {@link android.provider.Settings.Global} 常數 {@code STAY_ON_WHILE_PLUGGED_IN},防止螢幕在使用者為裝置連接電源時關閉。</li>
+ </ul>
+ </li>
+ <li><strong>透過裝置擁有者自動安裝與解除安裝應用程式:</strong>裝置擁有者現在可以使用 {@link android.content.pm.PackageInstaller}
+API (與 Google Play for Work 無關) 自動安裝與解除安裝應用程式。
+您現在可以透過裝置擁有者佈建裝置,該裝置擁有者可在不與使用者互動的情況下擷取並安裝應用程式。
+如要在不啟用 Google 帳戶的情況下輕觸一次就能佈建 Kiosk 或其他這類裝置,這個功能非常有用。
+</li>
+<li><strong>自動存取企業憑證:</strong>當應用程式呼叫
+{@link android.security.KeyChain#choosePrivateKeyAlias(android.app.Activity,android.security.KeyChainAliasCallback,java.lang.String[],java.security.Principal[],java.lang.String,int,java.lang.String) choosePrivateKeyAlias()} 時,在系統提示使用者選取憑證之前,設定檔或裝置擁有者現在會呼叫 {@code DeviceAdminReceiver.onChoosePrivateKeyAlias()} 方法,為提出要求的應用程式自動提供別名。
+
+
+這個功能讓您能夠在不與使用者互動的情況下,為受管理的應用程式授與存取憑證的權限。
+</li>
+<li><strong>自動接受系統更新。</strong>藉由使用
+{@code DevicePolicyManager.setSystemUpdatePolicy()} 來設定系統更新原則,裝置擁有者現在可以自動接受系統更新 (例如,在 Kiosk 裝置的案例中),或者延後更新,並防止使用者進行更新,最多 30 天。
+
+因此,系統管理員可以設定必須取得更新的每日時間範圍 ,例如,在 Kiosk 裝置處於未使用狀態時。
+在系統更新可供使用時,系統就會檢查工作原則控制器應用程式是否已設定系統更新原則,並據以運作。
+
+
+</li>
+<li>
+<strong>委派的憑證安裝:</strong>設定檔或裝置擁有者現在可以授與第三方廠商的應用程式呼叫這些 {@link android.app.admin.DevicePolicyManager} 憑證管理 API 的能力:
+
+
+<ul>
+ <li>{@link android.app.admin.DevicePolicyManager#getInstalledCaCerts(android.content.ComponentName)
+getInstalledCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#hasCaCertInstalled(android.content.ComponentName,byte[])
+hasCaCertInstalled()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installCaCert(android.content.ComponentName,byte[])
+installCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallCaCert(android.content.ComponentName,byte[])
+uninstallCaCert()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#uninstallAllUserCaCerts(android.content.ComponentName)
+uninstallAllUserCaCerts()}</li>
+ <li>{@link android.app.admin.DevicePolicyManager#installKeyPair(android.content.ComponentName,java.security.PrivateKey,java.security.cert.Certificate,java.lang.String)
+installKeyPair()}</li>
+</ul>
+</li>
+<li><strong>企業原廠重設保護:</strong>佈建裝置擁有者時,您現在可以藉由設定
+{@code DeviceManagerPolicy.EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS} 套件組合,來設定參數以解除鎖定原廠重設保護 (FRP)。
+NFC 程式設計人員應用程式可以在已重設裝置來解除鎖定 FRP 並佈建裝置之後提供這些參數,而不需使用先前設定的 Google 帳戶。
+
+如果您並未修改這些參數,FRP 會就地保留,並防止裝置在沒有先前啟用的 Google 認證的情況下啟用。
+
+
+<p>此外,裝置擁有者可以在 Google Play 服務上設定應用程式限制,來指定可用來解除鎖定 FRP 的替代 Google 帳戶,以取代已在裝置上啟用的帳戶。
+</p>
+</li>
+<img src="{@docRoot}preview/images/work-profile-screen.png" srcset="{@docRoot}preview/images/work-profile-screen.png 1x, {@docRoot}preview/images/work-profile-screen_2x.png 2x" style="float:right; margin:0 0 10px 20px" width="282" height="476" />
+<li><strong>資料使用量追蹤。</strong>設定檔或裝置擁有者現在可以使用新的
+{@code android.app.usage.NetworkStatsManager} 方法,針對可在 [設定] > [資料]<strong></strong> 使用量中看見的資料使用量統計資料進行查詢。
+系統會自動授與設定檔擁有者權限來查詢他們所管理之設定檔上的資料,在此同時,裝置擁有者會取得受管理的主要使用者之使用量資料的存取權限。
+
+</li>
+<li><strong>執行階段權限管理:</strong>
+<p>設定檔或裝置擁有者可以使用
+{@code DevicePolicyManager.setPermissionPolicy()},針對所有應用程式的所有執行階段要求設定權限原則,以提示使用者授與一般權限,或者以無訊息方式自動授與或拒絕該權限。
+
+如果設定了後項原則,使用者就無法在應用程式權限畫面的 [設定]<strong></strong> 中,修改設定檔或裝置擁有者所做的選項。
+
+</p></li>
+<li><strong>設定中的 VPN:</strong>VPN 應用程式現在可以在 [設定] > [更多] > [VPN]<strong></strong> 中看見。此外,伴隨 VPN 使用量出現的通知是該 VPN 設定方式的特定通知。
+
+
+針對設定檔擁有者,通知是專門用來通知是否已針對受管理的設定檔、個人設定檔或兩者設定了 VPN。
+針對裝置擁有者,通知是專門用來通知是否已針對整個裝置設定了 VPN。
+</li>
+<li><strong>工作狀態通知:</strong>每當來自受管理設定檔的應用程式在前景中有活動時,狀態列上就會出現公事包圖示。
+因此,如果直接將裝置解除鎖定至受管理設定檔中應用程式的活動,即會顯示一個快顯通知,通知使用者他們正處於工作設定檔內。
+
+
+</li>
+</ul>
+
+<p class="note">
+ 如需 M 開發人員預覽版中所有 API 變更的詳細檢視,請參閱 <a href="{@docRoot}preview/download.html">API 差異報告</a>。
+</p>
diff --git a/docs/html-intl/intl/zh-tw/preview/behavior-changes.jd b/docs/html-intl/intl/zh-tw/preview/behavior-changes.jd
new file mode 100644
index 0000000..405aea1
--- /dev/null
+++ b/docs/html-intl/intl/zh-tw/preview/behavior-changes.jd
@@ -0,0 +1,402 @@
+page.title=行為變更
+page.keywords=預覽版,sdk,相容性
+sdk.platform.apiLevel=MNC
+@jd:body
+
+<div id="qv-wrapper">
+<div id="qv">
+
+<h2>本文件內容</h2>
+
+<ol id="toc44" class="hide-nested">
+ <li><a href="#behavior-runtime-permissions">執行階段權限</a></li>
+ <li><a href="#behavior-power">省電最佳化</a>
+ <ol>
+ <li><a href="#behavior-doze">休眠</a></li>
+ <li><a href="#behavior-app-standby">應用程式待命</a></li>
+ </ol>
+ </li>
+ <li><a href="#behavior-adoptable-storage">可採用的儲存裝置</a></li>
+ <li><a href="#behavior-apache-http-client">移除 Apache HTTP 用戶端</a></li>
+ <li><a href="#behavior-audiomanager-Changes">AudioManager 變更</a></li>
+ <li><a href="#behavior-test-selection">文字選取</a></li>
+ <li><a href="#behavior-keystore">Android 金鑰存放區變更</a></li>
+ <li><a href="#behavior-network">Wi-Fi 和網路變更</a></li>
+ <li><a href="#behavior-camera">相機服務變更</a></li>
+ <li><a href="#behavior-art-runtime">ART 執行階段</a></li>
+ <li><a href="#behavior-apk-validation">APK 驗證</a></li>
+ <li><a href="#behavior-afw">Android for Work 變更</a></li>
+</ol>
+
+<h2>API 差異</h2>
+<ol>
+<li><a href="{@docRoot}preview/download.html">API 級別 22 到 M 預覽版»</a> </li>
+</ol>
+
+
+<h2>另請參閱</h2>
+<ol>
+<li><a href="{@docRoot}preview/api-overview.html">M 開發人員預覽版 API 總覽</a> </li>
+</ol>
+
+</div>
+</div>
+
+<p>除了新特性和功能以外,M 開發人員預覽版還包含各種不同的系統變更和 API 行為變更。
+本文件將強調說明一些您應該知道且在您的應用程式中加以考量的重要變更。
+</p>
+
+<p>如果您先前曾發行過適用於 Android 的應用程式,請注意,您的應用程式可能會受到平台中的這類變更所影響。
+</p>
+
+<h2 id="behavior-runtime-permissions">執行階段權限</h1>
+<p>這個預覽版引進了新的權限模型,使用者現在可以在執行階段直接管理應用程式權限。
+這個模型為使用者提供了改良的能見度並使其可完全控制權限,同時為應用程式開發人員提供更流暢的安裝和自動更新程序。使用者可以針對安裝的應用程式個別授與或撤銷權限。
+
+ </p>
+
+<p>在目標為 M 預覽版的應用程式中,請務必在執行階段檢查並要求權限。
+如要判斷您的應用程式是否已獲授與權限,請呼叫新的 {@code Context.checkSelfPermission()} 方法。
+如要要求權限,請呼叫新的
+{@code Activity.requestPermission()} 方法。即使您的應用程式目標不是 M,還是應該在新的權限模型下測試您的應用程式。
+</p>
+
+<p>如需在您的應用程式中支援新權限模型的詳細資訊,請參閱<a href="{@docRoot}preview/features/runtime-permissions.html">權限</a>開發人員預覽版頁面。
+
+如需評估對您應用程式的影響的祕訣,請參閱<a href="{@docRoot}preview/testing/guide.html#runtime-permissions">測試指南</a>。
+</p>
+
+<h2 id="behavior-power">省電最佳化</h2>
+<p>這個預覽版針對閒置的裝置和應用程式引進了新的省電最佳化功能。</p>
+
+<h3 id="behavior-doze">休眠</h3>
+<p>如果拔除裝置電源並關閉螢幕使其保持靜止狀態一段時間,該裝置即會進入「休眠」<em></em>模式,它會嘗試讓系統保持睡眠狀態。
+在此模式中,裝置會在短期間內定期繼續執行正常操作,因此,會進行應用程式同步處理,而系統可以執行任何待處理的操作。
+
+</p>
+
+<p>處於休眠狀態時,下列限制會套用到您的應用程式:</p>
+<ul>
+<li>除非您的應用程式接收到高優先順序的 Google 雲端通訊活動訊號 (Tickle),否則會停用網路存取。
+</li>
+<li><a href="{@docRoot}reference/android/os/PowerManager.WakeLock.html">喚醒鎖定</a>會被忽略。</li>
+<li>使用 {@link android.app.AlarmManager} 類別排定的鬧鐘會被停用,但使用 {@link android.app.AlarmManager#setAlarmClock setAlarmClock()}方法和 {@code AlarmManager.setAndAllowWhileIdle()} 設定的鬧鐘則不會被停用。
+
+</li>
+<li>WiFi 掃描不會執行。</li>
+<li>不容許執行您同步配接器的同步處理和工作以及 {@link android.app.job.JobScheduler}。
+</li>
+</ul>
+</p>
+<p>當裝置離開休眠狀態時,就會執行所有待處理的工作和同步處理。</p>
+<p>您可以測試此功能,方法是將執行 M 預覽版的裝置連接到您的開發電腦並呼叫下列命令:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell dumpsys deviceidle step
+$ adb shell dumpsys deviceidle -h
+</pre>
+<p class="note"><strong>注意:</strong>即將發行的 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google 雲端通訊</a>版本讓您能夠指定高優先順序的訊息。
+
+
+如果您的應用程式收到高優先順序的 GCM 訊息,即使裝置處於休眠狀態,系統還是會授與它短暫的網路存取權限。
+
+</p>
+
+<p>如需如何在您的應用程式中測試休眠的祕訣,請參閱<a href="{@docRoot}preview/testing/guide.html#doze-standby">測試指南</a>。
+
+ </p>
+
+<h3 id="behavior-app-standby">應用程式待命</h3>
+<p>使用這個預覽版時,系統可在應用程式處於未使用狀態時,判斷它們是否處於閒置狀態。
+除非系統偵測到以下任一個訊號,否則會在一段時間之後將應用程式視為閒置:
+</p>
+
+<ul>
+<li>使用者明確啟動應用程式。</li>
+<li>應用程式目前在前景中有一個處理程序 (可能是做為活動或前景服務,也可能正由其他活動或前景服務所使用)。
+</li>
+<li>應用程式產生使用者可以在鎖定螢幕或通知匣中看見的通知。
+</li>
+<li>使用者透過 [設定]<strong></strong> 明確要求應用程式不需進行最佳化。
+</li>
+</ul>
+
+<p>如果拔除了裝置電源,即會停用被視為閒置之應用程式的網路存取,並擱置它們的同步處理和工作。
+為裝置插上電源時,就允許這些應用程式進行網路存取,且可執行所有已擱置的工作和同步處理。
+如果裝置長時間處於閒置狀態,則允許閒置的應用程式進行網路存取,大約是一天一次。
+</p>
+
+<p>您可以測試此功能,方法是將執行 M 預覽版的裝置連接到您的開發電腦並呼叫下列命令:
+
+</p>
+<pre class="no-prettyprint">
+$ adb shell dumpsys battery unplug
+$ adb shell am set-idle <packageName> true
+$ adb shell am set-idle <packageName> false
+$ adb shell am get-idle <packageName>
+</pre>
+
+<p class="note"><strong>注意:</strong>即將發行的 <a href="https://developers.google.com/cloud-messaging/" class="external-link">Google 雲端通訊</a> (GCM) 版本讓您能夠指定高優先順序的訊息。
+
+
+如果您的應用程式收到高優先順序的 GCM 訊息,即使應用程式處於閒置狀態,系統還是會授與它短暫的網路存取權限。
+
+</p>
+
+<p>如需如何在您的應用程式中測試應用程式待命的祕訣,請參閱<a href="{@docRoot}preview/testing/guide.html#doze-standby">測試指南</a>。
+
+ </p>
+
+<h2 id="behavior-adoptable-storage">可採用的儲存裝置</h2>
+<p>
+使用這個預覽版時,使用者可以採用<em></em>像是 SD 卡的外部儲存裝置。採用外部儲存裝置會加密並格式化裝置,使其可如內部儲存空間般運作。
+此功能讓使用者能夠在儲存裝置之間移動應用程式和這些應用程式的私人資料。
+移動應用程式時,系統會採用宣示說明中的 <a href="{@docRoot}guide/topics/manifest/manifest-element.html#install">{@code android:installLocation}</a> 偏好設定。
+
+
+</p>
+
+<p>如果您的應用程式會存取下列 API 或欄位,請注意,在內部和外部儲存裝置之間移動應用程式時,它們傳回的檔案路徑將會動態變更。建置檔案路徑時,強烈建議您一律動態呼叫這些 API。請勿使用硬式編碼的檔案路徑或保留先前建置的完整檔案路徑。
+
+
+</p>
+
+<ul>
+<li>{@link android.content.Context} 方法:
+ <ul>
+ <li>{@link android.content.Context#getFilesDir() getFilesDir()}</li>
+ <li>{@link android.content.Context#getCacheDir() getCacheDir()}</li>
+ <li>{@link android.content.Context#getCodeCacheDir() getCodeCacheDir()}</li>
+ <li>{@link android.content.Context#getDatabasePath(java.lang.String) getDatabasePath()}</li>
+ <li>{@link android.content.Context#getDir(java.lang.String,int) getDir()}</li>
+ <li>{@link android.content.Context#getNoBackupFilesDir() getNoBackupFilesDir()}</li>
+ <li>{@link android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()}</li>
+ <li>{@link android.content.Context#getPackageCodePath() getPackageCodePath()}</li>
+ <li>{@link android.content.Context#getPackageResourcePath() getPackageResourcePath()}</li>
+ </ul>
+</li>
+<li>{@link android.content.pm.ApplicationInfo} 欄位:
+ <ul>
+ <li>{@link android.content.pm.ApplicationInfo#dataDir dataDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#sourceDir sourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#nativeLibraryDir nativeLibraryDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#publicSourceDir publicSourceDir}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitSourceDirs splitSourceDirs}</li>
+ <li>{@link android.content.pm.ApplicationInfo#splitPublicSourceDirs splitPublicSourceDirs}</li>
+ </ul>
+</li>
+</ul>
+
+<p>如要在開發人員預覽版中對此功能進行偵錯,您可以執行下列命令來採用 USB 磁碟機 (這個磁碟機是透過 USB On-The-Go (OTG) 纜線連接到 Android 裝置):
+</p>
+
+<pre class="no-prettyprint">
+$ adb shell sm set-force-adoptable true
+</pre>
+
+<h2 id="behavior-apache-http-client">移除 Apache HTTP 用戶端</h2>
+<p>這個預覽版已移除對於 Apache HTTP 用戶端的支援。如果您的應用程式正在使用這個用戶端且目標為 Android 2.3 (API 級別 9) 或更高版本,請改為使用 {@link java.net.HttpURLConnection} 類別。
+
+這個 API 的效率更高,因為它能透過透明的壓縮和回應快取來降低網路使用量,並將電源耗用量降至最低。
+如要繼續使用 Apache HTTP API,您必須先在 {@code build.gradle} 檔案中宣告下列編譯時期的相依性:
+
+</p>
+<pre>
+android {
+ useLibrary 'org.apache.http.legacy'
+}
+</pre>
+<p>Android 正從 OpenSSL 移至 <a href="https://boringssl.googlesource.com/boringssl/" class="external-link">BoringSSL</a> 程式庫。
+
+如果您正在應用程式中使用 Android NDK,請勿連結不屬於 NDK API 一部分的密碼編譯程式庫,例如 {@code libcrypto.so} 和 {@code libssl.so}。
+這些程式庫不是公用 API,而且可能在沒有通知的情況下,在新的版本和裝置上變更或終止支援。此外,您可能會讓自己暴露於安全性弱點中。
+
+因此,請改為修改您的原生程式碼,透過 JNI 來呼叫 Java 密碼編譯 API,或以靜態方式連結您選擇的密碼編譯程式庫。
+
+</p>
+
+<h2 id="behavior-audiomanager-Changes">AudioManager 變更</h2>
+<p>不再支援透過 {@link android.media.AudioManager} 類別直接設定音量或將特定串流設定為靜音。
+{@link android.media.AudioManager#setStreamSolo(int,boolean)
+setStreamSolo()} 方法已過時,您應該改為呼叫
+{@code AudioManager.requestAudioFocus()} 方法。同樣地,
+{@link android.media.AudioManager#setStreamMute(int,boolean) setStreamMute()} 方法已過時;請改為呼叫 {@code AudioManager.adjustStreamVolume()} 方法並傳入方向值 {@code ADJUST_MUTE} 或 {@code ADJUST_UNMUTE}。
+
+</p>
+
+<h2 id="behavior-test-selection">文字選取</h2>
+
+<img src="{@docRoot}preview/images/text-selection.gif" style="float:right; margin:0 0 20px 30px" width="360" height="640" />
+
+<p>當使用者在您的應用程式中選取文字時,您現在可以在<a href="http://www.google.com/design/spec/patterns/selection.html#selection-text-selection" class="external-link">浮動工具列</a>中顯示文字選取動作,例如,剪下<em></em>、複製<em></em>及貼上<em></em>。
+
+使用者互動實作類似於針對內容關聯動作列所做的實作,如<a href="{@docRoot}guide/topics/ui/menus.html#CABforViews">為個別的檢視啟用內容關聯動作模式</a>中所述。
+
+
+</p>
+
+<p>如要實作適用於文字選取的浮動工具列,請在您現有的應用程式中進行下列變更:
+</p>
+<ol>
+<li>在您的 {@link android.view.View} 或 {@link android.app.Activity} 物件中,將
+{@link android.view.ActionMode} 呼叫從
+{@code startActionMode(Callback)} 變更為 {@code startActionMode(Callback, ActionMode.TYPE_FLOATING)}。</li>
+<li>進行 {@code ActionMode.Callback} 的現有實作,並改為讓它擴充
+{@code ActionMode.Callback2}。</li>
+<li>覆寫 {@code Callback2.onGetContentRect()} 方法,以在檢視中提供內容 {@link android.graphics.Rect} 物件 (例如,文字選取矩形區塊) 的座標。
+</li>
+<li>如果矩形區塊位置不再有效,而且這是唯一變成無效的元素,請呼叫 {@code ActionMode.invalidateContentRect()} 方法。
+</li>
+</ol>
+
+<p>如果您正在使用 <a href="{@docRoot}tools/support-library/index.html">Android 支援程式庫</a>版本 22.2,請注意,浮動工具列無法向下相容,而且 appcompat 預設會取得 {@link android.view.ActionMode} 物件的完整控制權。
+
+
+這可防止浮動工具列顯示。如要在
+{@link android.support.v7.app.AppCompatActivity} 中啟用
+{@link android.view.ActionMode} 支援,請呼叫
+{@code android.support.v7.app.AppCompatActivity.getDelegate()},然後在傳回的
+{@link android.support.v7.app.AppCompatDelegate} 物件中呼叫
+{@code android.support.v7.app.AppCompatDelegate.setHandleNativeActionModesEnabled()},並將輸入參數設定為 {@code false}。
+這個呼叫會將 {@link android.view.ActionMode} 物件的控制權傳回架構中。
+儘管在 M 預覽版之前的裝置中,只支援 {@link android.support.v7.app.ActionBar} 模式,但在執行 M 預覽版的裝置中,允許架構支援
+{@link android.support.v7.app.ActionBar} 或浮動工具列模式。
+</p>
+
+<h2 id="behavior-keystore">Android 金鑰存放區變更</h2>
+<p>使用這個預覽版時,<a href="{@docRoot}training/articles/keystore.html">Android 金鑰存放區供應程式</a>不再支援 DSA。
+
+但仍支援 ECDSA。</p>
+
+<p>在停用或重設安全鎖定螢幕時 (例如,由使用者或裝置管理員執行),將不再刪除其餘不需加密的金鑰。
+在這些事件期間,將會刪除其餘需要加密的金鑰。
+</p>
+
+<h2 id="behavior-network">Wi-Fi 和網路變更</h2>
+
+<p>這個預覽版引進了下列對於 Wi-Fi 和網路 API 的行為變更。</p>
+<ul>
+<li>唯有當您建立了 {@link android.net.wifi.WifiConfiguration} 物件時,您的應用程式現在才能變更這些物件的狀態。
+系統不容許您修改或刪除由使用者或其他應用程式所建立的
+{@link android.net.wifi.WifiConfiguration} 物件。
+</li>
+<li>
+在以前,如果應用程式使用
+{@link android.net.wifi.WifiManager#enableNetwork(int,boolean) enableNetwork()} 搭配
+{@code disableAllOthers=true} 設定來強制裝置連接到特定的 Wi-Fi 網路,裝置即會中斷與其他網路的連線,例如行動數據。
+在這個預覽版中,裝置不再中斷與這類其他網路的連線。如果您應用程式的 {@code targetSdkVersion} 是 {@code “20”} 或更低版本,即會將它固定到選取的 Wi-Fi 網路。
+
+如果您應用程式的 {@code targetSdkVersion} 是 {@code “21”} 或更高版本,請使用多網路 API (例如,
+{@link android.net.Network#openConnection(java.net.URL) openConnection()}、
+{@link android.net.Network#bindSocket(java.net.Socket) bindSocket()} 及新的
+{@code ConnectivityManager.bindProcessToNetwork()} 方法),以確保會在選取的網路上傳送它的網路流量。
+
+</li>
+</ul>
+
+<h2 id="behavior-camera">相機服務變更</h2>
+<p>在這個預覽版中,在相機服務中存取分享資源的模型已經從先前的「先進先服務」存取模型變更為依照優先順序針對處理程序進行處理的存取模型。
+
+對於服務行為的變更如下:</p>
+<ul>
+<li>存取相機子系統資源 (包括開啟和設定相機裝置) 的權限是根據用戶端應用程式處理程序的「優先順序」來授與。
+通常會為具有使用者可看見或前景活動的應用程式處理程序提供較高的優先順序,讓相機資源的取得和使用更可靠。
+
+</li>
+<li>優先順序較低之應用程式的使用中相機用戶端可能會在優先順序較高的應用程式嘗試使用相機時被系統「撤出」。
+在已過時的 {@link android.hardware.Camera} API 中,這會導致針對被撤出的用戶端呼叫
+{@link android.hardware.Camera.ErrorCallback#onError(int,android.hardware.Camera) onError()}。
+
+在 {@link android.hardware.camera2 Camera2} API 中,會導致針對被撤出的用戶端呼叫
+{@link android.hardware.camera2.CameraDevice.StateCallback#onDisconnected(android.hardware.camera2.CameraDevice) onDisconnected()}
+。</li>
+<li>在配備適當相機硬體的裝置上,個別的應用程式處理程序能夠單獨開啟,同時使用不同的相機裝置。
+但是,相機服務現在可以偵測到且不允許多處理程序使用案例,同時存取會對任何已開啟的相機裝置造成顯著的效能或功能降級。
+
+此變更可能會導致優先順序較低的用戶端被「撤出」,即使沒有任何其他應用程式正直接嘗試存取同一個相機裝置也一樣。
+
+
+</li>
+<li>
+變更目前的使用者會導致先前的使用者帳戶所擁有之應用程式的使用中相機用戶端被撤出。
+相機的存取權受限於目前裝置使用者所擁有的使用者設定檔。例如,這實際上表示「訪客」帳戶在使用者切換到不同帳戶之後,將無法保留使用相機子系統的執行中處理程序。
+
+
+</li>
+</ul>
+
+<h2 id="behavior-art-runtime">ART 執行階段</h2>
+<p>ART 執行階段現在可以正確實作
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法的存取規則。這個變更會修正 Dalvik 在先前版本中以不正確方式檢查存取規則的問題。如果您的應用程式使用
+{@link java.lang.reflect.Constructor#newInstance(java.lang.Object...) newInstance()} 方法且您想要覆寫存取檢查,請搭配已設定為 {@code true} 的輸入參數呼叫
+{@link java.lang.reflect.Constructor#setAccessible(boolean) setAccessible()} 方法。
+
+
+
+如果您的應用程式使用 <a href="{@docRoot}tools/support-library/features.html#v7-appcompat">v7 appcompat 程式庫</a>或 <a href="{@docRoot}tools/support-library/features.html#v7-recyclerview">v7 recyclerview 程式庫</a>,您就必須更新應用程式來使用這些程式庫的最新版本。
+
+
+否則,請確定從 XML 參考的所有自訂類別都會更新,如此一來就能存取其類別建構函式。
+</p>
+
+<p>這個預覽版會更新動態連結器的行為。動態連結器現在瞭解程式庫的 {@code soname} 與其路徑 (<a href="https://code.google.com/p/android/issues/detail?id=6670" class="external-link">公開的 Bug 6670</a>) 之間的差異,而且現在會實作依 {@code soname} 進行搜尋。
+
+
+
+先前可運作但含有錯誤 {@code DT_NEEDED} 項目 (通常是組建電腦之檔案系統上的絕對路徑) 的應用程式可能會在載入時失敗。
+</p>
+
+<p>{@code dlopen(3) RTLD_LOCAL} 旗標現在會以正確的方式實作。請注意,
+{@code RTLD_LOCAL} 是預設值,因此,對 {@code dlopen(3)} 的呼叫 (不會明確使用
+{@code RTLD_LOCAL}) 將會受到影響 (除非您的應用程式明確使用 {@code RTLD_GLOBAL})。使用
+{@code RTLD_LOCAL},由後續呼叫
+{@code dlopen(3)} (相對於 {@code DT_NEEDED} 項目所參考) 所載入的程式庫將無法使用符號。</p>
+</p>
+
+<h2 id="behavior-apk-validation">APK 驗證</h2>
+<p>此平台現在會執行較嚴格的 APK 驗證。如果檔案宣告於宣示說明中但未出現在 APK 本身中,則 APK 會被視為毀損。
+如果移除了任何內容,就必須重新簽署 APK。
+</p>
+
+<h2 id="behavior-afw">Android for Work 變更</h2>
+<p>這個預覽版包含下列對於 Android for Work 的行為變更:</p>
+<ul>
+<li><strong>個人內容中的工作聯絡人。</strong>Google 撥號程式通話記錄現在會在使用者檢視過去的通話記錄時顯示工作聯絡人。將 {@code DevicePolicyManager.setCrossProfileCallerIdDisabled()} 設定為 {@code true},可以在 Google 撥號程式通話記錄中隱藏工作設定檔聯絡人。
+
+
+只有在您將 {@code DevicePolicyManager.setBluetoothContactSharingDisabled()} 設定為 {@code false} 時,工作聯絡人才會透過藍牙,與個人聯絡人一起顯示於裝置上。
+
+預設會設定為 {@code true}。
+
+</li>
+<li><strong>移除 WiFi 設定:</strong>如果將工作設定檔刪除,則現在會移除由設定檔擁有者所新增的 WiFi 設定 (例如,透過呼叫
+{@link android.net.wifi.WifiManager#addNetwork(android.net.wifi.WifiConfiguration)
+addNetwork()} 方法)。
+</li>
+<li><strong>鎖定 WiFi 設定:</strong>使用者無法再修改或刪除任何由使用中裝置擁有者所建立的 WiFi 設定。
+只要尚未針對使用者設定 {@link android.os.UserManager} 常數
+{@link android.os.UserManager#DISALLOW_CONFIG_WIFI},該使用者就仍能建立和修改他們自己的 WiFi 設定。
+</li>
+<li><strong>透過 Google 帳戶新增來下載工作原則控制器:</strong>在將要求透過工作原則控制器 (WPC) 應用程式進行管理的 Google 帳戶新增到受管理內容以外的裝置時,新增帳戶流程現在會提示使用者安裝適當的 WPC。這個行為也適用於在初始裝置設定精靈中透過 [設定] > [帳戶]<strong></strong> 來新增的帳戶。
+
+
+
+</li>
+<li><strong>對於特定 DevicePolicyManager API 行為的變更:</strong>呼叫 {@link android.app.admin.DevicePolicyManager#setCameraDisabled(android.content.ComponentName,boolean) setCameraDisabled()}
+方法,只會對正在呼叫之使用者的相機產生影響;從受管理的設定檔呼叫它則不會對在主要使用者上執行的相機應用程式產生影響。
+
+此外,除了裝置擁有者,
+{@link android.app.admin.DevicePolicyManager#setKeyguardDisabledFeatures(android.content.ComponentName,int) setKeyguardDisabledFeatures()}
+方法現在還可供設定檔擁有者使用。設定檔擁有者可以設定下列滑動解鎖限制:
+
+<ul>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_TRUST_AGENTS} 和
+{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_FINGERPRINT},它們會對設定檔上層使用者的滑動解鎖設定產生影響。
+</li>
+<li>{@link android.app.admin.DevicePolicyManager#KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS},這只會影響受管理設定檔中由應用程式所產生的通知。
+</li>
+</ul>
+</li>
+</ul>
diff --git a/docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd b/docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd
new file mode 100644
index 0000000..cf756aa
--- /dev/null
+++ b/docs/html-intl/intl/zh-tw/preview/features/runtime-permissions.jd
@@ -0,0 +1,794 @@
+page.title=權限
+page.tags=previewresources, androidm
+page.keywords=權限, 執行階段, 預覽
+page.image={@docRoot}preview/features/images/permissions_check.png
+@jd:body
+
+
+<div id="qv-wrapper">
+ <div id="qv">
+ <h2>快速檢視</h2>
+ <ul>
+ <li>如果您的應用程式是以 M 預覽版 SDK 為目標,它會提示使用者在執行階段授與權限,而不是安裝期間。
+</li>
+ <li>使用者能隨時從應用程式 [設定] 畫面撤銷權限。
+</li>
+ <li>您的應用程式每次執行時都需要檢查它是否有所需的權限。
+</li>
+ </ul>
+
+ <h2>本文件內容</h2>
+ <ol>
+ <li><a href="#overview">總覽</a></li>
+ <li><a href="#coding">編寫執行階段權限的程式碼</a></li>
+ <li><a href="#testing">測試執行階段權限</a></li>
+ <li><a href="#best-practices">建議做法</a></li>
+ </ol>
+
+<!--
+ <h2>Related Samples</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+
+<!--
+ <h2>See also</h2>
+ <ol>
+ <li></li>
+ </ol>
+-->
+ </div> <!-- qv -->
+</div> <!-- qv-wrapper -->
+
+
+<p>
+ M 開發人員預覽版導入新的應用程式權限模型,簡化使用者安裝和升級應用程式的程序。
+如果 M 預覽版上執行的應用程式支援新的權限模型,使用者安裝或升級應用程式時,不需要授與任何權限。應用程式會在需要時才要求權限,而且系統會對使用者顯示要求權限的對話方塊。
+
+
+
+
+</p>
+
+<p>
+ 如果應用程式支援新的權限模型,它仍能在在執行舊版 Android 的裝置上安裝並執行 (在那些裝置上使用舊的權限模型)。
+
+
+</p>
+
+<h2 id="overview">
+ 總覽
+</h2>
+
+<p>
+ 使用 M 開發人員預覽版,平台導入新的應用程式權限模型。
+以下是這個新模型的主要元件摘要:
+</p>
+
+<ul>
+ <li>
+ <strong>宣告權限:</strong>應用程式會在宣示說明中宣告所需的所有權限,如舊版 Android 平台。
+
+ </li>
+
+ <li>
+ <strong>權限群組:</strong>權限會根據其功能分為「權限群組」
+<em></em>。例如,
+<code>CONTACTS</code> 權限群組包含讀取和寫入使用者聯絡人與設定檔資訊的權限。
+
+ </li>
+
+ <li>
+ <p><strong>安裝期間授與的有限權限:</strong>當使用者安裝或更新應用程式時,系統會將應用程式所要求且歸入 {@link
+android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} 的所有權限授與應用程式。
+
+
+ 例如,會在安裝期間自動授與歸入 {@link
+android.content.pm.PermissionInfo#PROTECTION_NORMAL PROTECTION_NORMAL} 的鬧鐘與網際網路權限。
+
+ </p>
+
+ <p>系統也會授與應用程式簽名和系統權限,如<a href="#system-apps">系統應用程式和簽名</a>所述。
+
+安裝期間「不」<em></em>會提示使用者授與任何權限。
+</p>
+ </li>
+
+ <li>
+ <strong>使用者在執行階段授與權限:</strong>應用程式要求權限時,系統會對使用者顯示對話方塊,接著呼叫應用程式的回呼函數,通知它是否已授與權限。
+
+如果使用者授與權限,應用程式會獲得在應用程式宣示說明中所宣告之權限功能區域中的所有權限。
+
+
+ </li>
+
+</ul>
+
+<p>
+ 此權限模型改變應用程式要求權限的功能行為。
+以下是您應遵循以調整此模型的開發做法摘要:
+
+</p>
+
+<ul>
+
+ <li>
+ <strong>一律檢查是否具備權限:</strong>當應用程式需要執行任何需要權限的動作時,都應要先檢查是否具備有該權限。
+
+若不具備,即要求獲得授與該權限。
+
+ </li>
+
+ <li>
+ <strong>適當處理缺少權限的情況:</strong>如果應用程式未獲授與適當的權限,它應要能完全處理失敗。
+
+ 例如,若只有新增功能需要該權限,應用程式可以將該功能停用。
+如果應用程式務必要具備該權限才能運作,應用程式可以停用其所有功能,並通知使用者務必要授與該權限。
+
+
+ </li>
+
+ <div class="figure" style="width:220px" id="fig-perms-screen">
+ <img src="{@docRoot}preview/features/images/app-permissions-screen_2x.png" srcset="{@docRoot}preview/features/images/app-permissions-screen.png 1x, {@docRoot}preview/features/images/app-permissions-screen_2x.png 2x" alt="" width="220">
+ <p class="img-caption">
+ <strong>圖 1.</strong>應用程式 [設定] 的權限畫面。
+ </p>
+ </div>
+
+ <li>
+ <strong>權限可以撤銷:</strong>使用者可以隨時撤銷應用程式的權限。
+如果使用者關閉應用程式的權限,並「不」<em></em>會通知應用程式。
+再次強調,您的應用程式在執行任何受限制的動作之前,應該驗證它是否具備所需的權限。
+
+ </li>
+</ul>
+
+<p class="note">
+ <strong>注意:</strong>如果應用程式是以 M 開發人員預覽版為目標,「務必要」
+<em></em>使用新的權限模型。
+</p>
+
+<p>
+ 自 M 開發人員預覽版推出起,並非所有 Google 應用程式都完全實作新的權限模型。
+Google 正透過 M 開發人員預覽版逐漸更新這些應用程式,以適當保留權限切換設定。
+
+
+</p>
+
+<p class="note">
+ <strong>注意:</strong>如果您的應用程式有自己的 API 介面,務必要先確定呼叫端具備存取該資料的必要權限後,再 Proxy 權限。
+
+
+</p>
+
+<h3 id="system-apps">
+ 系統應用程式和簽名權限
+</h3>
+
+<p>
+ 一般來說,當使用者安裝應用程式時,系統只會將
+ {@link android.content.pm.PermissionInfo#PROTECTION_NORMAL
+ PROTECTION_NORMAL} 授與應用程式。不過,在某些情況下,系統會授與應用程式更多權限:
+
+</p>
+
+<ul>
+ <li>如果應用程式屬於系統映像的一部分,會自動獲授與其宣示說明中列出的所有權限。
+
+ </li>
+
+ <li>如果應用程式要求宣示說明中歸入 {@link
+android.content.pm.PermissionInfo#PROTECTION_SIGNATURE PROTECTION_SIGNATURE} 的權限,並和宣告那些權限的應用程式一樣,以相同的憑證簽署應用程式,系統會在安裝時將那些權限授與要求的應用程式。
+
+
+
+ </li>
+</ul>
+
+<p>
+ 在這兩種情況下,使用者仍能隨時撤銷權限,只要前往系統的 [設定]<strong></strong> 畫面,然後選擇 [應用程式] ><strong></strong>
+
+ <i>app_name</i> > [權限]<strong></strong>。應用程式應持續在執行階段檢查是否具備權限,並在必要時予以要求。
+
+
+</p>
+
+<h3 id="compatibility">
+ 往後和回溯相容性
+</h3>
+
+<p>
+ 如果應用程式不是以 M 開發人員預覽版為目標,即使在 M 預覽版裝置上,應用程式也會持續使用舊的權限模型。
+當使用者安裝應用程式時,系統會要求使用者授與應用程式的宣示說明中列出的所有權現。
+
+
+</p>
+
+<p class="note">
+ <strong>注意:</strong>在執行 M 開發人員預覽版的裝置上,使用者能從應用程式的設定畫面關閉任何應用程式 (包括舊版應用程式) 的權限。
+
+如果使用者關閉舊版應用程式的權限,系統會自動停用適當功能。
+當應用程式嘗試執行需要那項權限的操作時,該操作不一定會造成例外狀況。
+
+而可能傳回空的資料集,通知發生錯誤,或展示未預期的行為。
+例如,如果您不具備查詢行事曆的權限,方法會傳回空的資料集。
+
+</p>
+
+<p>
+ 如果您在並非執行 M 預覽版的裝置上使用新的權限模型來安裝應用程式,系統會將它和任何其他應用程式一視同仁:系統會在安裝期間要求使用者授與所有宣告的權限。
+
+
+
+</p>
+
+<p class="note">
+ <strong>注意:</strong>對於預覽版,您必須將 SDK 最低版本設定為 M 預覽版 SDK,才能以預覽版 SDK 編譯。
+這表示在開發人員預覽版期間,您將無法在舊版平台上測試這類應用程式。
+
+
+</p>
+
+<h3 id="perms-vs-intents">權限與意圖比較</h3>
+
+<p>
+ 在許多情況下,您可以為應用程式在兩種方法當中擇一來執行工作。
+您可以讓應用程式要求權限以自行執行操作。
+或者,您可以讓應用程式使用意圖,讓其他應用程式來執行工作。
+
+</p>
+
+<p>
+ 例如,假設您的應用程式需要能夠使用裝置相機拍攝相片。
+您的應用程式能要求
+<code>android.permission.CAMERA</code> 權限,讓應用程式直接存取相機。
+接著,應用程式會使用相機 API 來控制相機並拍攝相片。
+這種方法可讓您的應用程式對攝影處理程序有完整控制權,並讓您將相機 UI 納入應用程式。
+
+
+</p>
+
+<p>
+ 不過,如果您不需要這類控制權,您可以只使用 {@link
+android.provider.MediaStore#ACTION_IMAGE_CAPTURE ACTION_IMAGE_CAPTURE} 意圖來要求影像。
+當您啟動意圖時,會提示使用者選擇相機應用程式 (如果還沒有預設的相機應用程式),然後該應用程式會拍攝相片。
+
+相機應用程式會將相片傳回應用程式的 {@link
+ android.app.Activity#onActivityResult onActivityResult()} 方法。
+</p>
+
+<p>
+ 同樣地,如果您需要撥打電話、存取使用者的聯絡人等等,您都可以建立適當的意圖來執行,或是要求權限,然後直接存取適當的物件。
+
+每種方法各有利弊。
+
+</p>
+
+<p>
+ 如果您使用權限:
+</p>
+
+<ul>
+ <li>當您執行操作時,應用程式對使用者體驗有完整控制權。
+不過,如此多樣化控制使您必須設計適當的 UI,而增加工作複雜度。
+
+ </li>
+
+ <li>當您初次執行操作時,會提示使用者授與權限 (僅此一次)。
+之後應用程式可以逕行執行該操作,不需要再與使用者有其他互動。
+不過,如果使用者未授與權限 (或稍後予以撤銷),您的應用程式會完全無法執行該操作。
+
+
+ </li>
+</ul>
+
+<p>
+ 如果您使用意圖:
+</p>
+
+<ul>
+ <li>您不必為該操作設計 UI。處理意圖的應用程式會提供 UI。不過,這表示您對使用者體驗沒有控制權。
+
+使用者可能會和您不曾見過的應用程式互動。
+
+ </li>
+
+ <li>如果使用者沒有執行該操作的預設應用程式,系統會提示使用者選擇應用程式。如果使用者未指定預設處理常式,每次執行操作時可能都要完成額外的對話方塊。
+
+
+
+ </li>
+</ul>
+
+<h2 id="coding">編寫執行階段權限的程式碼</h2>
+
+<p>
+ 如果您的應用程式是以新的 M 開發人員預覽版為目標,請務必使用新的權限模型。
+這表示除了在宣示說明中宣告所需的權限之外,您也必須在執行階段檢查是否具備權限,並在您不具備時要求權限。
+
+
+
+</p>
+
+<h3 id="enabling">
+ 啟用新的權限模型
+</h3>
+
+<p>
+ 如要啟用新的 M 開發人員預覽版權限模型,可將應用程式的
+<code>targetSdkVersion</code> 屬性設定為 <code>"MNC"</code>,並將
+<code>compileSdkVersion</code> 設定為 <code>"android-MNC"</code>。這樣做可啟用所有新權限功能。
+
+</p>
+
+<p>
+ 對於預覽版,您必須將 <code>minSdkVersion</code> 設定為
+<code>"MNC"</code>,才能以預覽版 SDK 編譯。
+</p>
+
+<h3 id="m-only-perm">
+ 指定只限 M 預覽版使用的權限
+</h3>
+
+<p>
+ 您可以在宣示說明中使用新的 <code><uses-permission-sdk-m></code> 元素,指出只有在 M 預覽版上才需要某權限。
+如果您以這種方式宣告權限,每當在舊版裝置上安裝應用程式時,系統都不會提示使用者或將權限授與應用程式。藉由使用 <code><uses-permission-sdk-m></code> 元素,當使用者安裝更新時,您不需要強制他們授與權限,就可以將新的權限新增至更新的應用程式版本。
+
+
+
+
+
+
+</p>
+
+<p>
+ 如果應用程式在使用 M 開發人員預覽版的裝置上執行,
+<code><uses-permission-sdk-m></code> 的運作方式會和
+<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html"><uses-permission></a></code> 相同。
+ 當他們安裝應用程式時,系統不會提示使用者授與任何權限,而應用程式會在需要時才要求權限。
+
+</p>
+
+<h3 id="prompting">
+ 提示授與權限
+</h3>
+
+<p>
+ 如果您的應用程式使用新的 M 開發人員預覽版權限模型,在執行 M 預覽版的裝置上初次啟動應用程式時,不會要求使用者授與所有權限。
+
+您的應用程式會在需要時才要求權限。
+應用程式要求權限時,系統會對使用者顯示對話方塊。
+
+</p>
+
+<p>
+ 如果您的應用程式在 SDK 22 以下版本的裝置上執行,應用程式會使用舊的權限模型。
+當使用者安裝應用程式時,會提示他們授與應用程式在其宣示說明中要求的所有權限,但標示為 <code><uses-permission-sdk-m></code> 的那些權限除外。
+
+
+</p>
+
+<h4 id="check-platform">檢查應用程式執行所在的平台</h4>
+
+<p>
+ 只有執行 M 開發人員預覽版的裝置上才支援此權限模型。
+呼叫這些方法之前,應用程式應該檢查 {@link android.os.Build.VERSION#CODENAME
+ Build.VERSION.CODENAME} 的值,驗證它執行所在的平台。
+
+如果裝置是執行 M 開發人員預覽版,
+{@link android.os.Build.VERSION#CODENAME CODENAME} 是 <code>"MNC"</code>。
+</p>
+
+<h4 id="check-for-permission">檢查應用程式是否具備所需權限</h4>
+
+<p>當使用者嘗試執行需要權限的操作時,應用程式會檢查它目前是否具備可執行此操作的權限。
+如要這麼做,應用程式可呼叫
+
+<code>Context.checkSelfPermission(<i>permission_name</i>)</code>。由於使用者可以隨時撤銷應用程式的權限,即使應用程式知道使用者已授與該權限,還是應該執行此檢查。
+
+
+例如,如果使用者想要使用應用程式拍攝相片,應用程式會呼叫 <code>Context.checkSelfPermission(Manifest.permission.CAMERA)</code>。
+
+</p>
+
+<p class="table-caption" id="permission-groups">
+ <strong>表 1.</strong>權限和權限群組。</p>
+<table>
+ <tr>
+ <th scope="col">權限群組</th>
+ <th scope="col">權限</th>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CALENDAR</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CALENDAR</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.WRITE_CALENDAR</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CAMERA</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.CAMERA</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.CONTACTS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CONTACTS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_PROFILE</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_PROFILE</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.LOCATION</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.ACCESS_FINE_LOCATION</code>
+ </li>
+ <li>
+ <code>android.permission.ACCESS_COARSE_LOCATION</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.MICROPHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.RECORD_AUDIO</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.PHONE</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.READ_PHONE_STATE</code>
+ </li>
+ <li>
+ <code>android.permission.CALL_PHONE</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CALL_LOG</code>
+ </li>
+ <li>
+ <code>android.permission.WRITE_CALL_LOG</code>
+ </li>
+ <li>
+ <code>com.android.voicemail.permission.ADD_VOICEMAIL</code>
+ </li>
+ <li>
+ <code>android.permission.USE_SIP</code>
+ </li>
+ <li>
+ <code>android.permission.PROCESS_OUTGOING_CALLS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SENSORS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.BODY_SENSORS</code>
+ </li>
+ </ul>
+ <ul>
+ <li>
+ <code>android.permission.USE_FINGERPRINT</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+ <tr>
+ <td><code>android.permission-group.SMS</code></td>
+ <td>
+ <ul>
+ <li>
+ <code>android.permission.SEND_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_SMS</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_WAP_PUSH</code>
+ </li>
+ <li>
+ <code>android.permission.RECEIVE_MMS</code>
+ </li>
+ <li>
+ <code>android.permission.READ_CELL_BROADCASTS</code>
+ </li>
+ </ul>
+ </td>
+ </tr>
+
+</table>
+
+<h4 id="request-permissions">必要時要求權限</h4>
+
+<p>如果應用程式還沒有所需的權限,應用程式會呼叫
+<code>Activity.requestPermissions(String[], int)</code> 方法以要求適當的權限。
+應用程式會傳遞它所需的權限,還有整數「要求代碼」。
+
+ 這種方法以非同步方式運作:它會立即傳回,並在使用者回應對話方塊後,系統會以該結果呼叫應用程式的回呼方法,傳遞應用程式傳遞給 <code>requestPermissions()</code> 的相同「要求代碼」。
+
+
+</p>
+
+ <p>下列程式碼會檢查應用程式是否具備讀取使用者聯絡人的權限,並在必要時要求權限。
+</p>
+
+<pre>
+if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
+ != PackageManager.PERMISSION_GRANTED) {
+ requestPermissions(new String[]{Manifest.permission.READ_CONTACTS},
+ MY_PERMISSIONS_REQUEST_READ_CONTACTS);
+
+ // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
+ // app-defined int constant
+
+ return;
+}
+</pre>
+
+<h4 id="handle-response">處理權限要求回應</h4>
+
+<p>
+ 當應用程式要求權限時,系統會對使用者呈現對話方塊。
+當使用者回應時,系統會呼叫 <code>Activity.onRequestPermissionsResult(int, String[], int[])</code> 並將使用者回應傳遞給它。
+
+您的應用程式需要覆寫該方法。將您傳遞給 <code>requestPermissions()</code> 的相同要求代碼傳遞給回呼。
+
+例如,如果應用程式要求 <code>READ_CONTACTS</code> 存取權,可能會有下列回呼方法:
+
+
+</p>
+
+<pre>
+@Override
+public void onRequestPermissionsResult(int requestCode,
+ String permissions[], int[] grantResults) {
+ switch (requestCode) {
+ case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
+ if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+
+ // permission was granted, yay! do the
+ // calendar task you need to do.
+
+ } else {
+
+ // permission denied, boo! Disable the
+ // functionality that depends on this permission.
+ }
+ return;
+ }
+
+ // other 'switch' lines to check for other
+ // permissions this app might request
+ }
+}
+</pre>
+
+ <p>如果使用者授與權限,系統就會將應用程式宣示說明所列出該功能區域的所有權限給予應用程式。
+如果使用者拒絕要求,您應該執行適當動作。
+例如,您可能會停用依存於此權限的任何選單動作。
+
+ </li>
+</p>
+
+<p>
+ 系統要求使用者授與權限時,使用者可選擇告知系統不要再次要求該權限。
+在上述情況下,當應用程式使用 <code>requestPermissions()</code> 要求該權限時,系統會立即拒絕要求。
+
+在這種情況下,如果使用者再次明確拒絕您的要求,系統會以相同的方式呼叫您的 <code>onRequestPermissionsResult()</code>。
+
+基於這個理由,您的應用程式不能假設已與使用者發生任何直接互動。
+
+</p>
+
+<h2 id="testing">測試執行階段權限</h2>
+
+
+<p>
+ 如果您的應用程式是以新的 M 開發人員預覽版為目標,您必須測試它是否能適當處理權限。
+您不能假設應用程式在執行時具備任何特定權限。
+應用程式初次啟動時,很可能不具備任何權限,且使用者可隨時撤銷或還原權限。
+
+
+</p>
+
+<p>
+ 您應該測試應用程式,確保它在所有權限情況下都能正常運作。
+使用 M 預覽版 SDK,我們現在提供 <a href="{@docRoot}tools/help/adb.html">Android 偵錯橋 (adb)</a> 命令,不管需要嘗試哪種權限設定都能讓您測試。
+
+
+
+</p>
+
+<h3>
+ 新的 adb 命令和選項
+</h3>
+
+<p>
+ M 預覽版 SDK 平台工具提供的數個命令可讓您測試應用程式如何處理權限。
+
+</p>
+
+<h4>
+ 連同權限一併安裝
+</h4>
+
+<p>
+ 您可以使用 <a href="{@docRoot}tools/help/adb.html#move"><code>adb
+ install</code></a> 命令的新 <code>-g</code> 選項,安裝應用程式並授與其宣示說明中列出的所有權限:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb install -g <path_to_apk>
+</pre>
+
+<h4>
+ 授與和撤銷權限
+</h4>
+
+<p>
+ 您可以使用新的 ADB <a href="{@docRoot}tools/help/adb.html#pm">套件管理員 (pm)</a> 命令,對安裝的應用程式授與和撤銷權限。此功能在自動化測試時非常實用。
+
+
+</p>
+
+<p>
+ 如要授與權限,可使用套件管理員的 <code>grant</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant <package_name> <permission_name>
+</pre>
+
+<p>
+ 例如,如要將可錄製音訊的權限授與 com.example.myapp 套件,請使用此命令:
+
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm grant com.example.myapp android.permission.RECORD_AUDIO
+</pre>
+
+<p>
+ 如要撤銷權限,可使用套件管理員的 <code>revoke</code> 命令:
+</p>
+
+<pre class="no-pretty-print">
+$ adb pm revoke <package_name> <permission_name>
+</pre>
+
+<h2 id="best-practices">最佳做法</h2>
+
+<p>
+ 新的權限模型讓使用者有更順暢的體驗,並能輕鬆安裝應用程式且對應用程式執行的工作感到自在。
+
+建議使用下列最佳做法以充分利用新的模型。
+
+</p>
+
+
+<h3 id="bp-what-you-need">只要求您所需的權限</h3>
+
+<p>
+ 每次要求權限時,您都是在強迫使用者做出決定。
+ 如果使用者拒絕要求,就會減少您應用程式的功能。
+ 您應該儘可能減少提出這些要求的次數。
+</p>
+
+<p>
+ 例如,您的應用程式可經常使用<a href="{@docRoot}guide/components/intents-filters.html">意圖</a>來取得所需功能,而不是要求權限。
+
+如果您的應用程式需要使用手機的相機拍攝相片,應用程式可以使用 {@link
+ android.provider.MediaStore#ACTION_IMAGE_CAPTURE
+ MediaStore.ACTION_IMAGE_CAPTURE} 意圖。
+當您的應用程式執行意圖時,系統會提示使用者選擇已安裝的相機應用程式來拍攝相片。
+
+
+</p>
+
+<h3 id="bp-dont-overwhelm">
+ 別讓使用者無法承受
+</h3>
+
+<p>
+ 如果您讓使用者一次面對太多權限要求,可能會讓使用者無法承受而結束您的應用程式。您應該改為在需要時才要求權限。
+
+
+</p>
+
+<p>
+ 在某些情況下,您的應用程式可能必須具備一或多個權限。在那種情況下,在應用程式啟動時立即要求所有權限是合理的舉措。
+
+例如,如果您建立攝影應用程式,該應用程式會需要存取裝置相機。
+使用者初次啟動應用程式時,看到要求使用相機的權限不會被嚇到。
+
+但如果相同的應用程式具有與使用者聯絡人分享相片的功能,您可能「不」<em></em>應該在初次啟動時要求該權限。
+
+可以等到使用者嘗試使用「分享」功能時,再要求該權限。
+
+</p>
+
+<p>
+ 如果您的應用程式提供教學課程,在教學課程結束時要求應用程式的基本權限是合理的舉措。
+
+</p>
+
+<h3 id="bp-explain">
+ 說明需要權限的原因
+</h3>
+
+<p>
+ 當您呼叫
+<code>requestPermissions()</code> 時,系統顯示的權限對話方塊會說明您的應用程式想要的權限,但不會說明原因。
+在某些情況下,使用者可能會感到不解。
+ 在呼叫 <code>requestPermissions()</code> 前對使用者說明應用程式想要權限的原因是不錯的想法。
+
+</p>
+
+<p>
+ 例如,攝影應用程式可能想要使用定位服務,以便將相片加上地理標籤。
+一般使用者可能不明白相片可以包含定位資訊,而不明白為何攝影應用程式會想要知道位置。
+
+在這種情況下,在呼叫 <code>requestPermissions()</code>「之前」<em></em>,將此功能的相關資訊告訴使用者會是不錯的想法。
+
+
+</p>
+
+<p>
+ 您可以將這些要求與應用程式教學課程結合來完成此作業。教學課程可依序顯示應用程式的各項功能,並可以同時說明需要哪些權限。
+
+例如,攝影應用程式的教學課程可以示範「與聯絡人分享相片」功能,接著告訴使用者需要提供權限,應用程式才能看到使用者的聯絡人。
+
+
+接著,應用程式可以呼叫 <code>requestPermissions()</code>,要求使用者提供該存取權。
+當然,並非每位使用者都會依照教學課程執行動作,所以您仍需要在應用程式的正常操作期間檢查和要求權限。
+
+
+</p>
diff --git a/docs/html-intl/intl/zh-tw/preview/overview.jd b/docs/html-intl/intl/zh-tw/preview/overview.jd
new file mode 100644
index 0000000..63cde32
--- /dev/null
+++ b/docs/html-intl/intl/zh-tw/preview/overview.jd
@@ -0,0 +1,362 @@
+page.title=程式總覽
+page.metaDescription=歡迎使用 Android M 開發人員預覽版,本程式提供為新版 Android 測試和最佳化您應用程式所需的一切。
+page.image=images/cards/card-preview_16-9_2x.png
+page.tags="preview", "developer", "android"
+
+@jd:body
+
+<p>
+ 歡迎使用「Android M 開發人員預覽版」<strong></strong>,本程式提供為新版 Android 測試和最佳化您應用程式所需的一切。
+
+免費使用,您只要下載 M 開發人員預覽版工具,就能立即開始使用。
+
+</p>
+
+<div style="background-color:#eceff1;padding:1em;">
+<div class="wrap">
+ <div class="cols">
+ <div class="col-4of12">
+ <h5>
+ 硬體與模擬器系統映像
+ </h5>
+
+ <p>
+ 在 Nexus 5、6、9 和 Player (適用於電視) ,以及模擬器上執行和測試您的應用程式。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 最新的平台程式碼
+ </h5>
+
+ <p>
+ 我們將在預覽版期間提供多次更新,讓您能夠針對最新的平台變更進行測試。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 透過 OTA 傳遞更新
+ </h5>
+
+ <p>
+ 在您將裝置刷新為初始預覽版之後,就能以無線方式取得更新。
+
+ </p>
+ </div>
+ </div>
+
+ <div class="cols">
+
+
+ <div class="col-4of12">
+ <h5>
+ 新行為和功能
+ </h5>
+
+ <p>
+ 儘早開始開發以支援新的平台行為,例如新的執行階段權限模型和省電功能。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 開發人員限時優先回報問題
+ </h5>
+
+ <p>
+ 在前幾個星期內,我們將讓開發人員優先回報問題,因此請盡快測試並提供意見反應。
+
+ </p>
+ </div>
+
+ <div class="col-4of12">
+ <h5>
+ 意見反應與支援
+ </h5>
+
+ <p>
+ 使用<a href="https://code.google.com/p/android-developer-preview/">問題追蹤器</a>回報問題並提供意見反應。
+ 與 <a href="http://g.co/dev/AndroidMDevPreview">M 開發人員社群</a>中的其他開發人員聯絡。
+
+ </p>
+ </div>
+ </div>
+</div>
+</div>
+
+<!--
+<p>
+ With the M Developer Preview, you'll get an early start on testing your apps,
+ with enough time to make adjustments before the public platform release later
+ in the year. We'll provide several updates to the Preview tools in the weeks
+ ahead, so you can keep in sync with the latest changes as the platform moves
+ toward launch.
+</p>
+<img src="{@docRoot}preview/images/m-preview-timeline.png" alt=
+"Preview program timeline" id="timeline">
+<p>
+ You can help us improve the platform by <a href=
+ "https://code.google.com/p/android-developer-preview/">reporting issues</a>
+ through our feedback channels. This is especially
+ critical in the first month of the preview, when we’ll be giving priority to
+ developer-reported issues and feedback.
+</p> -->
+
+
+<h2 id="timeline">
+ 時間軸和更新
+</h2>
+<img src="{@docRoot}preview/images/m-preview-timeline-crop.png" alt="Preview program timeline" id="timeline">
+<p>
+ M 開發人員預覽版可從 5 月 28 日開始執行,直到我們將在 2015 年第 3 季正式發行之前發行的最終版 Android M SDK。
+
+
+</p>
+
+<p>
+ 我們將在主要的開發里程碑為您的測試裝置提供更新。
+ 里程碑暫定如下
+</p>
+
+<ul>
+ <li>
+ <strong>預覽版 1</strong> (初始預覽版,五月下旬)、
+ </li>
+
+ <li>
+ <strong>預覽版 2</strong> (六月下旬/七月上旬) 及
+ </li>
+
+ <li>
+ <strong>預覽版 3</strong> (接近最終版,七月下旬)
+ </li>
+</ul>
+
+<p>
+ 這些更新最終會成為「最終版 SDK」<strong></strong> (稍後於第 3 季),為新版 Android 提供正式的 API,以及最終的系統行為和功能。
+
+
+</p>
+
+<p>
+ 當您在 Android M 上測試和開發時,強烈建議您在預覽版更新發行時立即更新,讓「您的開發環境保持在最新狀態」<strong></strong>。
+
+ 為了讓程序更簡單,我們將對更新為預覽版建置的裝置<strong>以無線 (OTA) 方式提供更新</strong>,還會提供您能手動下載和更新的系統映像。
+
+
+</p>
+<p class="note">
+ <strong>注意:</strong>最終版 SDK 與系統映像無法以 OTA 方式提供,將必須<strong>以手動方式更新</strong>至您的測試裝置。</strong>
+
+
+</p>
+
+<p>
+ 我們將透過 <a href="http://android-developers.blogspot.com/">Android 開發人員部落格</a>,還有本網站與 <a href="http://g.co/dev/AndroidMDevPreview">Android M 開發人員社群</a>來通知您有可用的預覽版更新。
+
+
+</p>
+
+<h2 id="preview_tools">
+ 預覽版新增功能
+</h2>
+
+<p>
+ M 開發人員預覽版包含您針對各種不同螢幕大小、網路技術、 CPU/GPU 晶片組及硬體架構,測試現有應用程式所需的一切。
+
+
+</p>
+
+<h4>
+ SDK 工具
+</h4>
+
+<p>
+ 您可以透過 <a href="{@docRoot}sdk/installing/adding-packages.html">Android Studio</a> 中的「SDK 管理器」下載以下元件:
+</p>
+
+<ul>
+ <li>M 開發人員預覽版 <strong>SDK 工具</strong>
+ </li>
+
+ <li>M 開發人員預覽版<strong>模擬器系統映像</strong> (32 位元和 64 位元)
+
+ </li>
+
+ <li>M 開發人員預覽版<strong>模擬器系統映像 (適用於 Android TV)</strong> (32 位元)
+
+ </li>
+</ul>
+
+<h4>
+ 硬體系統映像
+</h4>
+
+<p>
+ 您可以從<a href="download.html">下載頁面</a>下載適用於 Nexus 裝置的以下硬體系統映像:
+
+</p>
+
+<ul>
+ <li>
+ <strong>Nexus 5</strong> (GSM/LTE)“hammerhead”裝置系統映像
+ </li>
+
+ <li>
+ <strong>Nexus 6</strong>“shamu”裝置系統映像
+ </li>
+
+ <li>
+ <strong>Nexus 9</strong> (Wi-Fi)“volantis”裝置系統映像
+ </li>
+
+ <li>
+ <strong>Nexus Player</strong> (Android TV)“fugu”裝置系統映像
+ </li>
+</ul>
+
+<h4>
+ 文件和範例程式碼
+</h4>
+
+<p>
+ 這些文件資源可協助您瞭解預覽版:
+</p>
+
+<ul>
+ <li>
+ <a href="setup-sdk.html">設定 SDK</a> 涵蓋開始使用的逐步指示。
+
+ </li>
+
+ <li>
+ <a href="{@docRoot}preview/testing/guide.html">測試指南</a>與<a href="behavior-changes.html">行為變更</a>指出要測試的主要區域。
+ </li>
+
+ <li>新 API 的文件,包括 <a href="api-overview.html">API 總覽</a>、可下載的 <a href="{@docRoot}preview/download.html#docs">API 參考資料</a>以及主要功能 (例如<a href="{@docRoot}preview/features/runtime-permissions.html">權限</a>、<a href="{@docRoot}preview/backup/index.html">應用程式備份</a>及其他功能) 的詳細開發人員指南。
+
+
+
+
+ </li>
+
+ <li>
+ 示範如何支援權限和其他新功能的<a href="{@docRoot}preview/samples.html">範例程式碼</a>。
+
+ </li>
+
+ <li>
+ 適用於目前 M 開發人員預覽版的<a href="{@docRoot}preview/support.html#release-notes">版本資訊</a>,包括變更資訊與差異報告。
+
+ </li>
+</ul>
+
+<h4>
+ 支援資源
+</h4>
+
+<p>
+ 在 M 開發人員預覽版上測試和開發時,請使用以下支援資源:
+
+</p>
+
+<ul>
+ <li><a href="https://code.google.com/p/android-developer-preview/">M 開發人員預覽版問題追蹤器</a>是您的<strong>主要意見反應</strong>管道。
+
+您可以透過問題追蹤器來回報錯誤、效能問題及一般意見反應。
+您也可以檢查<a href="https://code.google.com/p/android-developer-preview/wiki/KnownIssues">已知問題</a>
+和尋找因應方式步驟。
+ </li>
+
+ <li><a href="http://g.co/dev/AndroidMDevPreview">Android M 開發人員社群</a>是您能<strong>與其他 Android M 開發人員聯絡</strong>的 Google+ 社群。您可以分享有關 Android M 的觀察或想法,或尋找解答。
+
+
+
+ </li>
+</ul>
+
+
+<h2 id="preview_apis_and_publishing">
+ 目標設定、預覽版 API 及發行
+</h2>
+
+<p>
+ Android M 開發人員預覽版是開發專用的版本,而且<strong>沒有標準的 API 層級</strong>。
+如果您想要選擇退出相容性行為以測試您的應用程式 (強烈建議),您可以將應用程式的 <code><a href=
+ "/guide/topics/manifest/uses-sdk-element.html">targetSdkVersion</a></code> 設定為 <code>“MNC”</code>,就能以 M 開發人員預覽版為目標。
+
+
+
+</p>
+
+<p>
+ Android M 開發人員預覽版提供<strong>預覽版 API</strong> — 在最終版 SDK (目前規劃在 2015 年第三季) 發行之前的都不是正式 API。
+
+這表示您可以預期 API 會隨時間而有些許變更,特別是程式一開始的幾週。<strong></strong>
+
+我們會將 Android M 開發人員預覽版每次更新的變更摘要提供給您。
+
+</p>
+
+<p class="note">
+ 請注意,雖然預覽版 API 可能會改變,但例如執行階段權限和省電功能等基本系統行為,均已穩定且能夠立即測試。
+
+
+</p>
+
+<p>
+ 在發行方面,Google Play 會<strong>禁止您發行以 M 開發人員預覽版為目標的應用程式</strong>。
+當 Android M 最終版 SDK 推出時,您將能夠以正式 Android M API 層級為目標,並將您的應用程式發行至 Google Play。
+
+同時,您可以透過電子郵件或直接從您的網站下載,來對測試者散佈以 Android M 為目標的應用程式。
+
+
+</p>
+
+<h2 id="get_started">
+ 如何開始
+</h2>
+
+<p>
+ 如要開始測試您的應用程式:
+</p>
+
+<ol>
+ <li>檢閱 <a href="{@docRoot}preview/api-overview.html">API 總覽</a>與<a href="{@docRoot}preview/behavior-changes.html">行為變更</a>,以瞭解新增功能,還有它會如何影響您的應用程式。
+
+特別是瞭解新的<a href="{@docRoot}preview/features/runtime-permissions.html">執行階段權限</a>模型、省電功能以及自動化備份。
+
+
+ </li>
+
+ <li>依照<a href="{@docRoot}preview/setup-sdk.html">設定預覽版 SDK</a> 的指示來設定您的環境,並設定測試裝置。
+
+
+ </li>
+
+ <li>依照<a href="https://developers.google.com/android/nexus/images">刷新指示</a>,針對 Nexus 5、6、9 及 Player 刷新最新的 M 開發人員預覽版系統映像。
+
+在您刷新開發裝置之後,預覽版更新將以無線 (OTA) 更新</a>的方式提供。
+
+ </li>
+
+ <li>下載 <a href="{@docRoot}preview/download.html#docs">M 預覽版 API 參考資料</a>與 <a href="{@docRoot}preview/samples.html">M 預覽版範例</a>,以深入瞭解新的 API 功能以及如何在您的應用程式中運用。
+
+
+
+ </li>
+
+ <li>加入 <a href="http://g.co/dev/AndroidMDevPreview">Android M 開發人員社群</a>以取得最新消息,並與其他使用新平台的開發人員聯絡。
+
+
+ </li>
+</ol>
+
+<p>
+ 感謝您參與 Android M 開發人員預覽版程式!
+</p>
diff --git a/docs/html/guide/topics/resources/providing-resources.jd b/docs/html/guide/topics/resources/providing-resources.jd
index b06da56..63eee96 100644
--- a/docs/html/guide/topics/resources/providing-resources.jd
+++ b/docs/html/guide/topics/resources/providing-resources.jd
@@ -549,6 +549,22 @@
which indicates whether the screen is long.</p>
</td>
</tr>
+ <tr id="ScreenRoundQualifier">
+ <td>Round screen</td>
+ <td>
+ <code>round</code><br/>
+ <code>notround</code>
+ </td>
+ <td>
+ <ul class="nolist">
+ <li>{@code round}: Round screens, such as a round wearable device</li>
+ <li>{@code notround}: Rectangular screens, such as phones or tablets</li>
+ </ul>
+ <p><em>Added in API level 23.</em></p>
+ <p>Also see the {@link android.content.res.Configuration#isScreenRound()} configuration
+method, which indicates whether the screen is round.</p>
+ </td>
+ </tr>
<tr id="OrientationQualifier">
<td>Screen orientation</td>
<td>
diff --git a/docs/html/guide/topics/ui/actionbar.jd b/docs/html/guide/topics/ui/actionbar.jd
index d972c47..b2f98ad 100644
--- a/docs/html/guide/topics/ui/actionbar.jd
+++ b/docs/html/guide/topics/ui/actionbar.jd
@@ -907,11 +907,7 @@
<p>To get started, your layout must include a {@link android.view.ViewGroup} in which you place
each {@link android.app.Fragment} associated with a tab. Be sure the {@link android.view.ViewGroup}
has a resource ID so you can reference it from your code and swap the tabs within it.
-Alternatively, if the tab content will fill the activity layout, then your activity doesn't need a
-layout at all (you don't even need to call {@link android.app.Activity#setContentView
-setContentView()}). Instead, you can place each fragment in the default root view, which you can
-refer to with the {@code android.R.id.content} ID.</p>
-
+</p>
<p>Once you determine where the fragments appear in the layout, the basic procedure to add tabs
is:</p>
diff --git a/docs/html/sdk/installing/migrate.jd b/docs/html/sdk/installing/migrate.jd
index d9829395..6dedad6 100644
--- a/docs/html/sdk/installing/migrate.jd
+++ b/docs/html/sdk/installing/migrate.jd
@@ -50,7 +50,7 @@
<p>Android Studio uses a different project structure. Each Eclipse ADT
project is called a module in Android Studio. Each instance of Android
Studio contains a project with one or more app modules. For more information see,
- <a href="{@docRoot}tools/studio/eclipse-migration-guide.html#project-structure">Project
+ <a href="{@docRoot}tools/studio/eclipse-transition-guide.html#project-structure">Project
Structure</a>.</p></li>
<li><strong>Manifest settings</strong>
@@ -59,14 +59,14 @@
<code>build.gradle</code> file. These elements are still valid manifest entries and may
appear in manifests from older projects, imported projects, dependencies, and libraries. For
more information see,
- <a href="{@docRoot}tools/studio/eclipse-migration-guide.html#manifest-settings">Manifest
+ <a href="{@docRoot}tools/studio/eclipse-transition-guide.html#manifest-settings">Manifest
Settings</a>.</p></li>
<li><strong>Dependencies</strong>
<p>Library dependencies are handled differently in Android Studio, using Gradle dependency
declarations and Maven dependencies for well-known local source and binary libraries with
Maven coordinates. For more information see,
- <a href="{@docRoot}tools/studio/eclipse-migration-guide.html#dependencies">Dependencies</a></p>
+ <a href="{@docRoot}tools/studio/eclipse-transition-guide.html#dependencies">Dependencies</a></p>
</li>
<li><strong>Test code</strong>
@@ -261,7 +261,7 @@
<a href="http://www.gradle.org">Gradle</a>-based build system to become familiar with the new
project and module structure, flexible build settings, and other advanced Android development
capabilities. For a comparison of Eclipse ADT and Android Studio features and usage, see
-<a href="{@docRoot}tools/studio/eclipse-migration-guide.html">Transitioning to Android Studio from
+<a href="{@docRoot}tools/studio/eclipse-transition-guide.html">Transitioning to Android Studio from
Eclipse</a>. For specific Android Studio how-to documentation, see the pages in the
<a href="{@docRoot}tools/workflow/index.html">Workflow</a> section.
</p>
diff --git a/docs/html/tools/workflow/index.jd b/docs/html/tools/workflow/index.jd
index a24a2b0..b32fa26 100644
--- a/docs/html/tools/workflow/index.jd
+++ b/docs/html/tools/workflow/index.jd
@@ -41,16 +41,16 @@
<a href="{@docRoot}tools/projects/index.html">Create an Android project</a>.</p>
</li>
<li><strong>Building, Debugging and Testing</strong>
- <p>During this phase you build your project into a debuggable <code>.apk</code> package(s)
- that you can install and run on the emulator or an Android-powered device. Android Studio uses
- a build system based on <a href="http://www.gradle.org/" target="_android">Gradle</a>
- that provides flexibility, customized build variants, dependency resolution, and much more.
- If you're using another IDE, you can build your project using Gradle and install it on a device
+ <p>During this phase you build your project into a debuggable <code>.apk</code> package(s)
+ that you can install and run on the emulator or an Android-powered device. Android Studio uses
+ a build system based on <a href="http://www.gradle.org/" target="_android">Gradle</a>
+ that provides flexibility, customized build variants, dependency resolution, and much more.
+ If you're using another IDE, you can build your project using Gradle and install it on a device
using <a href="{@docRoot}tools/help/adb.html">adb</a>. For more information, see
<a href="{@docRoot}tools/building/index.html">Build and run your application</a>.</p>
<p>Next, with Android Studio you debug your application using the
- <a href="{@docRoot}tools/help/monitor.html">Android Debug Monitor</a> and device log messages
- (<a href="{@docRoot}tools/help/logcat.html">logact</a>) along with the IntelliJ IDEA intelligent
+ <a href="{@docRoot}tools/help/monitor.html">Android Device Monitor</a> and device log messages
+ (<a href="{@docRoot}tools/help/logcat.html">logcat</a>) along with the IntelliJ IDEA intelligent
coding features. You can also use a JDWP-compliant debugger along with the debugging and logging
tools that are provided with the Android SDK. For more information see
<a href="{@docRoot}tools/debugging/index.html">Debug your application with the SDK debugging and logging tools</a>.</p>
diff --git a/docs/html/training/material/drawables.jd b/docs/html/training/material/drawables.jd
index a2de8e9..c58075e 100644
--- a/docs/html/training/material/drawables.jd
+++ b/docs/html/training/material/drawables.jd
@@ -36,8 +36,9 @@
resources (for example, <code>?android:attr/colorPrimary</code>). Usually, you create these assets
only once and color them automatically to match your theme.</p>
-<p>You can apply a tint to {@link android.graphics.drawable.BitmapDrawable} or {@link
-android.graphics.drawable.NinePatchDrawable} objects with the {@code setTint()} method. You can
+<p>You can apply a tint to {@link android.graphics.drawable.BitmapDrawable}, {@link
+android.graphics.drawable.NinePatchDrawable} or {@link
+android.graphics.drawable.VectorDrawable} objects with the {@code setTint()} method. You can
also set the tint color and mode in your layouts with the <code>android:tint</code> and
<code>android:tintMode</code> attributes.</p>
diff --git a/docs/html/training/wearables/watch-faces/drawing.jd b/docs/html/training/wearables/watch-faces/drawing.jd
index 8b6de76..30a7a6f 100644
--- a/docs/html/training/wearables/watch-faces/drawing.jd
+++ b/docs/html/training/wearables/watch-faces/drawing.jd
@@ -457,9 +457,23 @@
round devices. You can use this canvas to draw your watch face directly as follows:</p>
<ol>
-<li>If this is the first invocation of the
-<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>onDraw()</code></a>
-method, scale your background to fit.</li>
+<li>Override the
+<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onSurfaceChanged(android.view.SurfaceHolder, int, int, int)"><code>onSurfaceChanged()</code></a>
+method to scale your background to fit the device any time the view changes.
+<pre>
+@Override
+public void onSurfaceChanged(
+ SurfaceHolder holder, int format, int width, int height) {
+ if (mBackgroundScaledBitmap == null
+ || mBackgroundScaledBitmap.getWidth() != width
+ || mBackgroundScaledBitmap.getHeight() != height) {
+ mBackgroundScaledBitmap = Bitmap.createScaledBitmap(mBackgroundBitmap,
+ width, height, true /* filter */);
+ }
+ super.onSurfaceChanged(holder, format, width, height);
+}
+</pre>
+</li>
<li>Check whether the device is in ambient mode or interactive mode.</li>
<li>Perform any required graphic computations.</li>
<li>Draw your background bitmap on the canvas.</li>
@@ -482,13 +496,6 @@
int width = bounds.width();
int height = bounds.height();
- // Draw the background, scaled to fit.
- if (mBackgroundScaledBitmap == null
- || mBackgroundScaledBitmap.getWidth() != width
- || mBackgroundScaledBitmap.getHeight() != height) {
- mBackgroundScaledBitmap = Bitmap.createScaledBitmap(mBackgroundBitmap,
- width, height, true);
- }
canvas.drawBitmap(mBackgroundScaledBitmap, 0, 0, null);
// Find the center. Ignore the window insets so that, on round watches
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
index 3058bd3..459514d 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -287,6 +287,22 @@
mKeymasterBlockModes = KeyProperties.BlockMode.allToKeymaster(spec.getBlockModes());
mKeymasterEncryptionPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
spec.getEncryptionPaddings());
+ if (((spec.getPurposes() & KeyProperties.PURPOSE_ENCRYPT) != 0)
+ && (spec.isRandomizedEncryptionRequired())) {
+ for (int keymasterPadding : mKeymasterEncryptionPaddings) {
+ if (!KeymasterUtils
+ .isKeymasterPaddingSchemeIndCpaCompatibleWithAsymmetricCrypto(
+ keymasterPadding)) {
+ throw new InvalidAlgorithmParameterException(
+ "Randomized encryption (IND-CPA) required but may be violated"
+ + " by padding scheme: "
+ + KeyProperties.EncryptionPadding.fromKeymaster(
+ keymasterPadding)
+ + ". See " + KeyGenParameterSpec.class.getName()
+ + " documentation.");
+ }
+ }
+ }
mKeymasterSignaturePaddings = KeyProperties.SignaturePadding.allToKeymaster(
spec.getSignaturePaddings());
if (spec.isDigestsSpecified()) {
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 0006601..3cd3f2a 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -74,7 +74,7 @@
return true;
default:
throw new IllegalArgumentException(
- "Unsupported encryption padding scheme: " + keymasterPadding);
+ "Unsupported asymmetric encryption padding scheme: " + keymasterPadding);
}
}
diff --git a/libs/hwui/font/Font.cpp b/libs/hwui/font/Font.cpp
index b07a3c8..5de64a4 100644
--- a/libs/hwui/font/Font.cpp
+++ b/libs/hwui/font/Font.cpp
@@ -228,15 +228,15 @@
for (uint32_t cacheY = startY, bitmapY = dstY * bitmapWidth; cacheY < endY;
cacheY += srcStride, bitmapY += bitmapWidth) {
- if (formatSize == 1) {
- memcpy(&bitmap[bitmapY + dstX], &cacheBuffer[cacheY + glyph->mStartX], glyph->mBitmapWidth);
- } else {
- for (uint32_t i = 0; i < glyph->mBitmapWidth; ++i) {
- bitmap[bitmapY + dstX + i] = cacheBuffer[cacheY + (glyph->mStartX + i)*formatSize + alpha_channel_offset];
- }
+ for (uint32_t i = 0; i < glyph->mBitmapWidth; ++i) {
+ uint8_t* dst = &(bitmap[bitmapY + dstX + i]);
+ const uint8_t& src = cacheBuffer[
+ cacheY + (glyph->mStartX + i)*formatSize + alpha_channel_offset];
+ // Add alpha values to a max of 255, full opacity. This is done to handle
+ // fonts/strings where glyphs overlap.
+ *dst = std::min(*dst + src, 255);
}
}
-
}
void Font::drawCachedGlyph(CachedGlyphInfo* glyph, float x, float hOffset, float vOffset,
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index b3b2b97..2c28d8e 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -204,6 +204,17 @@
public static final String EXTRA_VOLUME_STREAM_TYPE = "android.media.EXTRA_VOLUME_STREAM_TYPE";
/**
+ * @hide
+ * The stream type alias for the volume changed intent.
+ * For instance the intent may indicate a change of the {@link #STREAM_NOTIFICATION} stream
+ * type (as indicated by the {@link #EXTRA_VOLUME_STREAM_TYPE} extra), but this is also
+ * reflected by a change of the volume of its alias, {@link #STREAM_RING} on some devices,
+ * {@link #STREAM_MUSIC} on others (e.g. a television).
+ */
+ public static final String EXTRA_VOLUME_STREAM_TYPE_ALIAS =
+ "android.media.EXTRA_VOLUME_STREAM_TYPE_ALIAS";
+
+ /**
* @hide The volume associated with the stream for the volume changed intent.
*/
public static final String EXTRA_VOLUME_STREAM_VALUE =
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 28d0713..f42fab7 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -701,13 +701,10 @@
final Map<String, Object> global = MediaCodecList.getGlobalSettings();
mMaxSupportedInstances = Utils.parseIntSafely(
- global.get("max-supported-instances"), DEFAULT_MAX_SUPPORTED_INSTANCES);
+ global.get("max-concurrent-instances"), DEFAULT_MAX_SUPPORTED_INSTANCES);
int maxInstances = Utils.parseIntSafely(
- map.get("max-supported-instances"), mMaxSupportedInstances);
- // TODO: replace all max-supported-instances with max-concurrent-instances.
- maxInstances = Utils.parseIntSafely(
- map.get("max-concurrent-instances"), maxInstances);
+ map.get("max-concurrent-instances"), mMaxSupportedInstances);
mMaxSupportedInstances =
Range.create(1, MAX_SUPPORTED_INSTANCES_LIMIT).clamp(maxInstances);
diff --git a/packages/DocumentsUI/res/values-bn-rBD/strings.xml b/packages/DocumentsUI/res/values-bn-rBD/strings.xml
index a999300..4167194 100644
--- a/packages/DocumentsUI/res/values-bn-rBD/strings.xml
+++ b/packages/DocumentsUI/res/values-bn-rBD/strings.xml
@@ -22,7 +22,7 @@
<string name="menu_create_dir" msgid="5947289605844398389">"ফোল্ডার তৈরি করুন"</string>
<string name="menu_grid" msgid="6878021334497835259">"গ্রিড দৃশ্য"</string>
<string name="menu_list" msgid="7279285939892417279">"তালিকা দৃশ্য"</string>
- <string name="menu_sort" msgid="7677740407158414452">"এর দ্বারা সাজান"</string>
+ <string name="menu_sort" msgid="7677740407158414452">"এই অনুসারে বাছুন"</string>
<string name="menu_search" msgid="3816712084502856974">"অনুসন্ধান করুন"</string>
<string name="menu_settings" msgid="6008033148948428823">"সেটিংস"</string>
<string name="menu_open" msgid="432922957274920903">"খুলুন"</string>
diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
index 14f82ce..03f09ff 100644
--- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml
+++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml
@@ -17,7 +17,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="2783841764617238354">"Documents"</string>
- <string name="title_open" msgid="4353228937663917801">"Ouvert à partir de"</string>
+ <string name="title_open" msgid="4353228937663917801">"Ouvrir à partir de"</string>
<string name="title_save" msgid="2433679664882857999">"Enregistrer dans"</string>
<string name="menu_create_dir" msgid="5947289605844398389">"Créer un dossier"</string>
<string name="menu_grid" msgid="6878021334497835259">"Grille"</string>
diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml
index 2b79f8e..84e5495 100644
--- a/packages/DocumentsUI/res/values-pl/strings.xml
+++ b/packages/DocumentsUI/res/values-pl/strings.xml
@@ -56,7 +56,7 @@
<string name="empty" msgid="7858882803708117596">"Brak elementów"</string>
<string name="toast_no_application" msgid="1339885974067891667">"Nie można otworzyć pliku"</string>
<string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string>
- <string name="share_via" msgid="8966594246261344259">"Udostępnij przez"</string>
+ <string name="share_via" msgid="8966594246261344259">"Udostępnij przez:"</string>
<string name="copy_notification_title" msgid="6374299806748219777">"Kopiowanie plików"</string>
<string name="copy_remaining" msgid="6283790937387975095">"Pozostało: <xliff:g id="DURATION">%s</xliff:g>"</string>
<plurals name="copy_begin" formatted="false" msgid="9071199452634086365">
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java
index 10baf23..e5f3dc9 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java
@@ -25,6 +25,6 @@
* Turns on debugging information for the whole Keyguard. This is very verbose and should only
* be used temporarily for debugging.
*/
- public static final boolean DEBUG = true;
- public static final boolean DEBUG_SIM_STATES = true;
+ public static final boolean DEBUG = false;
+ public static final boolean DEBUG_SIM_STATES = false;
}
diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml
index 1a6d34e..91e931d 100644
--- a/packages/SystemUI/res/layout/volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_row.xml
@@ -50,6 +50,8 @@
android:layout_below="@id/volume_row_header"
android:layout_toEndOf="@id/volume_row_icon"
android:layout_toStartOf="@+id/volume_settings_button"
+ android:focusable="true"
+ android:focusableInTouchMode="true"
android:paddingEnd="8dp"
android:paddingStart="8dp" />
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 895da77d..37aa1cc 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -417,7 +417,7 @@
<string name="status_bar_work" msgid="6022553324802866373">"Arbejdsprofil"</string>
<string name="status_bar_airplane" msgid="7057575501472249002">"Flytilstand"</string>
<string name="add_tile" msgid="2995389510240786221">"Tilføj et felt"</string>
- <string name="broadcast_tile" msgid="3894036511763289383">"Felt for udsendelser"</string>
+ <string name="broadcast_tile" msgid="3894036511763289383">"Broadcast-ikon"</string>
<string name="zen_alarm_warning_indef" msgid="3482966345578319605">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>, medmindre du slår funktionen fra inden da"</string>
<string name="zen_alarm_warning" msgid="444533119582244293">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="alarm_template" msgid="3980063409350522735">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
index 585f9ba..c3a8f2e 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistDisclosure.java
@@ -32,6 +32,7 @@
import android.os.Handler;
import android.view.View;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityEvent;
import android.view.animation.AnimationUtils;
/**
@@ -166,6 +167,7 @@
super.onAttachedToWindow();
startAnimation();
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
index 6ba5626..51d0bf1 100644
--- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
+++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java
@@ -131,7 +131,7 @@
}
final boolean isService = isAssistantService();
- if (isService || !isVoiceSessionRunning()) {
+ if (!isService || !isVoiceSessionRunning()) {
showOrb();
mView.postDelayed(mHideRunnable, isService
? TIMEOUT_SERVICE
@@ -227,10 +227,6 @@
mAssistUtils.launchVoiceAssistFromKeyguard();
}
- private boolean getVoiceInteractorSupportsAssistGesture() {
- return mAssistUtils.activeServiceSupportsAssistGesture();
- }
-
public boolean canVoiceAssistBeLaunchedFromKeyguard() {
return mAssistUtils.activeServiceSupportsLaunchFromKeyguard();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 1b74eb6..359ed5f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -28,6 +28,7 @@
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup;
+import android.widget.Toast;
import com.android.internal.logging.MetricsLogger;
import com.android.systemui.Prefs;
@@ -98,6 +99,14 @@
@Override
public void handleClick() {
+ if (mController.isVolumeRestricted()) {
+ // Collapse the panels, so the user can see the toast.
+ mHost.collapsePanels();
+ Toast.makeText(mContext, mContext.getString(
+ com.android.internal.R.string.error_message_change_not_allowed),
+ Toast.LENGTH_LONG).show();
+ return;
+ }
mDisable.setAllowAnimation(true);
mDisableTotalSilence.setAllowAnimation(true);
MetricsLogger.action(mContext, getMetricsCategory(), !mState.value);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 3e66907..6ad0ef9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -1623,7 +1623,13 @@
boolean clearNotificationEffects = !isPanelFullyCollapsed() &&
(mShowLockscreenNotifications ||
(mState == StatusBarState.SHADE || mState == StatusBarState.SHADE_LOCKED));
- mBarService.onPanelRevealed(clearNotificationEffects);
+ int notificationLoad = mNotificationData.getActiveNotifications().size();
+ if (mHeadsUpManager.hasPinnedHeadsUp() && isPanelFullyCollapsed()) {
+ notificationLoad = 1;
+ } else {
+ MetricsLogger.histogram(mContext, "note_load", notificationLoad);
+ }
+ mBarService.onPanelRevealed(clearNotificationEffects, notificationLoad);
} else {
mBarService.onPanelHidden();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index cf0d670..094b9b5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -721,7 +721,6 @@
if (mListenForHeadsUp && !mHeadsUpTouchHelper.isTrackingHeadsUp()
&& mHeadsUpTouchHelper.onInterceptTouchEvent(event)) {
mIsExpansionFromHeadsUp = true;
- MetricsLogger.count(mContext, COUNTER_PANEL_OPEN, 1);
MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_PEEK, 1);
}
if ((!mIsExpanding || mHintAnimationRunning)
@@ -1126,38 +1125,41 @@
};
private void animateKeyguardStatusBarOut() {
- mKeyguardStatusBar.animate()
- .alpha(0f)
- .setStartDelay(mStatusBar.isKeyguardFadingAway()
- ? mStatusBar.getKeyguardFadingAwayDelay()
- : 0)
- .setDuration(mStatusBar.isKeyguardFadingAway()
- ? mStatusBar.getKeyguardFadingAwayDuration() / 2
- : StackStateAnimator.ANIMATION_DURATION_STANDARD)
- .setInterpolator(PhoneStatusBar.ALPHA_OUT)
- .setUpdateListener(mStatusBarAnimateAlphaListener)
- .withEndAction(mAnimateKeyguardStatusBarInvisibleEndRunnable)
- .start();
+ ValueAnimator anim = ValueAnimator.ofFloat(mKeyguardStatusBar.getAlpha(), 0f);
+ anim.addUpdateListener(mStatusBarAnimateAlphaListener);
+ anim.setStartDelay(mStatusBar.isKeyguardFadingAway()
+ ? mStatusBar.getKeyguardFadingAwayDelay()
+ : 0);
+ anim.setDuration(mStatusBar.isKeyguardFadingAway()
+ ? mStatusBar.getKeyguardFadingAwayDuration() / 2
+ : StackStateAnimator.ANIMATION_DURATION_STANDARD);
+ anim.setInterpolator(mDozeAnimationInterpolator);
+ anim.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mAnimateKeyguardStatusBarInvisibleEndRunnable.run();
+ }
+ });
+ anim.start();
}
private final ValueAnimator.AnimatorUpdateListener mStatusBarAnimateAlphaListener =
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- mKeyguardStatusBarAnimateAlpha = mKeyguardStatusBar.getAlpha();
+ mKeyguardStatusBarAnimateAlpha = (float) animation.getAnimatedValue();
+ updateHeaderKeyguardAlpha();
}
};
private void animateKeyguardStatusBarIn(long duration) {
mKeyguardStatusBar.setVisibility(View.VISIBLE);
mKeyguardStatusBar.setAlpha(0f);
- mKeyguardStatusBar.animate()
- .alpha(1f)
- .setStartDelay(0)
- .setDuration(duration)
- .setInterpolator(mDozeAnimationInterpolator)
- .setUpdateListener(mStatusBarAnimateAlphaListener)
- .start();
+ ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
+ anim.addUpdateListener(mStatusBarAnimateAlphaListener);
+ anim.setDuration(duration);
+ anim.setInterpolator(mDozeAnimationInterpolator);
+ anim.start();
}
private final Runnable mAnimateKeyguardBottomAreaInvisibleEndRunnable = new Runnable() {
@@ -1716,12 +1718,16 @@
return alpha;
}
- private void updateHeaderKeyguard() {
+ private void updateHeaderKeyguardAlpha() {
float alphaQsExpansion = 1 - Math.min(1, getQsExpansionFraction() * 2);
mKeyguardStatusBar.setAlpha(Math.min(getKeyguardContentsAlpha(), alphaQsExpansion)
* mKeyguardStatusBarAnimateAlpha);
mKeyguardStatusBar.setVisibility(mKeyguardStatusBar.getAlpha() != 0f
&& !mDozing ? VISIBLE : INVISIBLE);
+ }
+
+ private void updateHeaderKeyguard() {
+ updateHeaderKeyguardAlpha();
setQsTranslation(mQsExpansionHeight);
}
@@ -1811,6 +1817,7 @@
|| mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED) {
mAfforanceHelper.animateHideLeftRightIcon();
}
+ mNotificationStackScroller.onPanelTrackingStarted();
}
@Override
@@ -1820,6 +1827,7 @@
mNotificationStackScroller.setOverScrolledPixels(
0.0f, true /* onTop */, true /* animate */);
}
+ mNotificationStackScroller.onPanelTrackingStopped();
if (expand && (mStatusBar.getBarState() == StatusBarState.KEYGUARD
|| mStatusBar.getBarState() == StatusBarState.SHADE_LOCKED)) {
if (!mHintAnimationRunning) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index 39a06aa..9343172 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -834,8 +834,10 @@
}
} else if (!isFullyCollapsed() && !mTracking && !mClosing) {
cancelHeightAnimator();
- mClosing = true;
notifyExpandingStarted();
+
+ // Set after notifyExpandingStarted, as notifyExpandingStarted resets the closing state.
+ mClosing = true;
if (delayed) {
mNextCollapseSpeedUpFactor = speedUpFactor;
postDelayed(mFlingCollapseRunnable, 120);
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 3678cf1..a637e24 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -1180,6 +1180,7 @@
notification.getKey());
notification.getNotification().fullScreenIntent.send();
shadeEntry.notifyFullScreenIntentLaunched();
+ MetricsLogger.count(mContext, "note_fullscreen", 1);
} catch (PendingIntent.CanceledException e) {
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
index 98bbe7c..63f5711 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpManager.java
@@ -29,6 +29,7 @@
import android.view.ViewTreeObserver;
import android.view.accessibility.AccessibilityEvent;
+import com.android.internal.logging.MetricsLogger;
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
@@ -82,6 +83,7 @@
private final View mStatusBarWindowView;
private final int mStatusBarHeight;
private final int mNotificationsTopPadding;
+ private final Context mContext;
private PhoneStatusBar mBar;
private int mSnoozeLengthMs;
private ContentObserver mSettingsObserver;
@@ -101,7 +103,8 @@
private boolean mIsObserving;
public HeadsUpManager(final Context context, View statusBarWindowView) {
- Resources resources = context.getResources();
+ mContext = context;
+ Resources resources = mContext.getResources();
mTouchAcceptanceDelay = resources.getInteger(R.integer.touch_acceptance_delay);
mSnoozedPackages = new ArrayMap<>();
mDefaultSnoozeLengthMs = resources.getInteger(R.integer.heads_up_default_snooze_length_ms);
@@ -165,6 +168,7 @@
*/
public void showNotification(NotificationData.Entry headsUp) {
if (DEBUG) Log.v(TAG, "showNotification");
+ MetricsLogger.count(mContext, "note_peek", 1);
addHeadsUpEntry(headsUp);
updateNotification(headsUp, true);
headsUp.setInterruption();
@@ -522,7 +526,6 @@
});
}
-
/**
* This represents a notification and how long it is in a heads up mode. It also manages its
* lifecycle automatically when created.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
index 9d84a85..b2df40a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeController.java
@@ -36,6 +36,7 @@
ComponentName getEffectsSuppressor();
boolean isCountdownConditionSupported();
int getCurrentUser();
+ boolean isVolumeRestricted();
public static class Callback {
public void onZenChanged(int zen) {}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index 5b80ac2..c07f1a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -29,6 +29,7 @@
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings.Global;
import android.provider.Settings.Secure;
import android.service.notification.Condition;
@@ -57,6 +58,7 @@
private final LinkedHashMap<Uri, Condition> mConditions = new LinkedHashMap<Uri, Condition>();
private final AlarmManager mAlarmManager;
private final SetupObserver mSetupObserver;
+ private final UserManager mUserManager;
private int mUserId;
private boolean mRequesting;
@@ -84,6 +86,13 @@
mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mSetupObserver = new SetupObserver(handler);
mSetupObserver.register();
+ mUserManager = context.getSystemService(UserManager.class);
+ }
+
+ @Override
+ public boolean isVolumeRestricted() {
+ return mUserManager.hasUserRestriction(UserManager.DISALLOW_ADJUST_VOLUME,
+ new UserHandle(mUserId));
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index f98840b..7040864 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -163,6 +163,7 @@
private boolean mChildrenUpdateRequested;
private SpeedBumpView mSpeedBumpView;
private boolean mIsExpansionChanging;
+ private boolean mPanelTracking;
private boolean mExpandingNotification;
private boolean mExpandedInThisMotion;
private boolean mScrollingEnabled;
@@ -1513,7 +1514,7 @@
}
if (mExpandedInThisMotion) {
return RUBBER_BAND_FACTOR_AFTER_EXPAND;
- } else if (mIsExpansionChanging) {
+ } else if (mIsExpansionChanging || mPanelTracking) {
return RUBBER_BAND_FACTOR_ON_PANEL_EXPAND;
} else if (mScrolledToTopOnFirstDown) {
return 1.0f;
@@ -1527,7 +1528,7 @@
* overscroll view (e.g. expand QS).
*/
private boolean isRubberbanded(boolean onTop) {
- return !onTop || mExpandedInThisMotion || mIsExpansionChanging
+ return !onTop || mExpandedInThisMotion || mIsExpansionChanging || mPanelTracking
|| !mScrolledToTopOnFirstDown;
}
@@ -2249,6 +2250,13 @@
}
}
+ public void onPanelTrackingStarted() {
+ mPanelTracking = true;
+ }
+ public void onPanelTrackingStopped() {
+ mPanelTracking = false;
+ }
+
public void resetScrollPosition() {
mScroller.abortAnimation();
mOwnScrollY = 0;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
index 81461bd..f432808 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/SegmentedButtons.java
@@ -57,7 +57,7 @@
return mSelectedValue;
}
- public void setSelectedValue(Object value) {
+ public void setSelectedValue(Object value, boolean fromClick) {
if (Objects.equals(value, mSelectedValue)) return;
mSelectedValue = value;
for (int i = 0; i < getChildCount(); i++) {
@@ -67,7 +67,7 @@
c.setSelected(selected);
c.setTypeface(selected ? MEDIUM : REGULAR);
}
- fireOnSelected();
+ fireOnSelected(fromClick);
}
public void addButton(int labelResId, int contentDescriptionResId, Object value) {
@@ -100,9 +100,9 @@
}
}
- private void fireOnSelected() {
+ private void fireOnSelected(boolean fromClick) {
if (mCallback != null) {
- mCallback.onSelected(mSelectedValue);
+ mCallback.onSelected(mSelectedValue, fromClick);
}
}
@@ -115,11 +115,11 @@
private final View.OnClickListener mClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
- setSelectedValue(v.getTag());
+ setSelectedValue(v.getTag(), true /* fromClick */);
}
};
public interface Callback extends Interaction.Callback {
- void onSelected(Object value);
+ void onSelected(Object value, boolean fromClick);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
index 0ab0392..3964820 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java
@@ -741,12 +741,7 @@
private void updateVolumeRowSliderTintH(VolumeRow row, boolean isActive) {
if (isActive && mExpanded) {
- row.slider.setFocusable(true);
- row.slider.setFocusableInTouchMode(true);
row.slider.requestFocus();
- } else {
- row.slider.setFocusableInTouchMode(false);
- row.slider.setFocusable(false);
}
final ColorStateList tint = isActive && row.slider.isEnabled() ? mActiveSliderTint
: mInactiveSliderTint;
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
index 9a59a2a..32d6805 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogController.java
@@ -768,6 +768,7 @@
filter.addAction(NotificationManager.ACTION_EFFECTS_SUPPRESSOR_CHANGED);
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
+ filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
mContext.registerReceiver(this, filter, null, mWorker);
}
@@ -822,6 +823,9 @@
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
if (D.BUG) Log.d(TAG, "onReceive ACTION_SCREEN_OFF");
mCallbacks.onScreenOff();
+ } else if (action.equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
+ if (D.BUG) Log.d(TAG, "onReceive ACTION_CLOSE_SYSTEM_DIALOGS");
+ dismiss();
}
if (changed) {
mCallbacks.onStateChanged(mState);
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
index 7de02f3..4bb1011 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogMotion.java
@@ -126,6 +126,11 @@
return mChevron.getHeight() / 6;
}
+ private int chevronPosY() {
+ final Object tag = mChevron == null ? null : mChevron.getTag();
+ return tag == null ? 0 : (Integer) tag;
+ }
+
private void startShowAnimation() {
if (D.BUG) Log.d(TAG, "startShowAnimation");
mDialogView.animate()
@@ -139,7 +144,7 @@
if (mChevronPositionAnimator == null) return;
// reposition chevron
final float v = (Float) mChevronPositionAnimator.getAnimatedValue();
- final int posY = (Integer) mChevron.getTag();
+ final int posY = chevronPosY();
mChevron.setTranslationY(posY + v + -mDialogView.getTranslationY());
}})
.start();
@@ -216,7 +221,7 @@
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mContents.setTranslationY(-mDialogView.getTranslationY());
- int posY = (Integer) mChevron.getTag();
+ final int posY = chevronPosY();
mChevron.setTranslationY(posY + -mDialogView.getTranslationY());
}
})
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 8035cd3..3c9a7fc 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -391,7 +391,7 @@
setExpanded(isShown());
mSessionZen = zen;
}
- mZenButtons.setSelectedValue(zen);
+ mZenButtons.setSelectedValue(zen, false /* fromClick */);
updateWidgets();
handleUpdateConditions();
if (mExpanded) {
@@ -968,10 +968,12 @@
private final SegmentedButtons.Callback mZenButtonsCallback = new SegmentedButtons.Callback() {
@Override
- public void onSelected(final Object value) {
+ public void onSelected(final Object value, boolean fromClick) {
if (value != null && mZenButtons.isShown() && isAttachedToWindow()) {
final int zen = (Integer) value;
- MetricsLogger.action(mContext, MetricsLogger.QS_DND_ZEN_SELECT, zen);
+ if (fromClick) {
+ MetricsLogger.action(mContext, MetricsLogger.QS_DND_ZEN_SELECT, zen);
+ }
if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen);
final Uri realConditionId = getRealConditionId(mSessionExitCondition);
AsyncTask.execute(new Runnable() {
diff --git a/rs/java/android/renderscript/ScriptGroup.java b/rs/java/android/renderscript/ScriptGroup.java
index 9000d4d..54180f4 100644
--- a/rs/java/android/renderscript/ScriptGroup.java
+++ b/rs/java/android/renderscript/ScriptGroup.java
@@ -995,6 +995,8 @@
*
* @param name name for the script group. Legal names can only contain letters, digits,
* '-', or '_'. The name can be no longer than 100 characters.
+ * Try to use unique names, to avoid name conflicts and reduce
+ * the cost of group creation.
* @param outputs futures intended as outputs of the script group
* @return a script group
*/
diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
index aa72fba..06134e5 100644
--- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
+++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java
@@ -3277,11 +3277,11 @@
* just before there's a shift down to drop the fractional parts. The output
* values are gated to 0 to 255 to fit in a byte, but the 10-bit format
* gives some headroom to avoid wrapping around on small overflows.
- *
+ *
* @param A The input allocation contains matrix A, supported elements type {@link Element#U8}.
- * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset.
+ * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset. Value should be from 0 to 255.
* @param B The input allocation contains matrix B, supported elements type {@link Element#U8}.
- * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset.
+ * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset. Value should be from 0 to 255.
* @param C The input allocation contains matrix C, supported elements type {@link Element#U8}.
* @param c_offset The offset for all values in matrix C.
* @param c_mult The multiplier for all values in matrix C, e.g C[i,j] = (C[i,j] + c_offset) * c_mult.
@@ -3289,6 +3289,12 @@
public void BNNM(Allocation A, int a_offset, Allocation B, int b_offset, Allocation C, int c_offset, int c_mult) {
validateL3(Element.U8(mRS), NO_TRANSPOSE, TRANSPOSE, 0, A, B, C);
+ if (a_offset < 0 || a_offset > 255) {
+ throw new RSRuntimeException("Invalid a_offset passed to BNNM");
+ }
+ if (b_offset < 0 || b_offset > 255) {
+ throw new RSRuntimeException("Invalid b_offset passed to BNNM");
+ }
int M = -1, N = -1, K = -1;
M = A.getType().getY();
N = B.getType().getY();
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index 1833a1c..ffc4fd8 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -696,8 +696,8 @@
call.M = M;
call.N = N;
call.K = K;
- call.a_offset = a_offset;
- call.b_offset = b_offset;
+ call.a_offset = a_offset & 0xFF;
+ call.b_offset = b_offset & 0xFF;
call.c_offset = c_offset;
call.c_mult_int = c_mult_int;
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 7bcbcfb..57769e7 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -3351,6 +3351,8 @@
case AccessibilityEvent.TYPE_TOUCH_INTERACTION_END:
case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:
case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT:
+ // Also always dispatch the event that assist is reading context.
+ case AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT:
// Also windows changing should always be anounced.
case AccessibilityEvent.TYPE_WINDOWS_CHANGED: {
return true;
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index af83a53..ed48f91 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -3223,6 +3223,27 @@
}
}
+ void tearDownAgentAndKill(ApplicationInfo app) {
+ try {
+ // unbind and tidy up even on timeout or failure, just in case
+ mActivityManager.unbindBackupAgent(app);
+
+ // The agent was running with a stub Application object, so shut it down.
+ // !!! We hardcode the confirmation UI's package name here rather than use a
+ // manifest flag! TODO something less direct.
+ if (app.uid != Process.SYSTEM_UID
+ && !app.packageName.equals("com.android.backupconfirm")
+ && app.uid != Process.PHONE_UID) {
+ if (MORE_DEBUG) Slog.d(TAG, "Killing agent host process");
+ mActivityManager.killApplicationProcess(app.processName, app.uid);
+ } else {
+ if (MORE_DEBUG) Slog.d(TAG, "Not killing after operation: " + app.processName);
+ }
+ } catch (RemoteException e) {
+ Slog.d(TAG, "Lost app trying to shut down");
+ }
+ }
+
// Core logic for performing one package's full backup, gathering the tarball from the
// application and emitting it to the designated OutputStream.
@@ -3525,21 +3546,7 @@
if (pkg != null) {
final ApplicationInfo app = pkg.applicationInfo;
if (app != null) {
- try {
- // unbind and tidy up even on timeout or failure, just in case
- mActivityManager.unbindBackupAgent(app);
-
- // The agent was running with a stub Application object, so shut it down.
- if (app.uid != Process.SYSTEM_UID
- && app.uid != Process.PHONE_UID) {
- if (MORE_DEBUG) Slog.d(TAG, "Backup complete, killing host process");
- mActivityManager.killApplicationProcess(app.processName, app.uid);
- } else {
- if (MORE_DEBUG) Slog.d(TAG, "Not killing after backup: " + app.processName);
- }
- } catch (RemoteException e) {
- Slog.d(TAG, "Lost app trying to shut down");
- }
+ tearDownAgentAndKill(app);
}
}
}
@@ -4697,7 +4704,11 @@
mBytes = 0;
}
- public boolean restoreOneFile(InputStream instream) {
+ public IBackupAgent getAgent() {
+ return mAgent;
+ }
+
+ public boolean restoreOneFile(InputStream instream, boolean mustKillAgent) {
if (!isRunning()) {
Slog.w(TAG, "Restore engine used after halting");
return false;
@@ -5011,8 +5022,10 @@
Slog.i(TAG, "No [more] data for this package; tearing down");
}
tearDownPipes();
- tearDownAgent(mTargetApp);
setRunning(false);
+ if (mustKillAgent) {
+ tearDownAgent(mTargetApp);
+ }
}
return (info != null);
}
@@ -5037,23 +5050,7 @@
void tearDownAgent(ApplicationInfo app) {
if (mAgent != null) {
- try {
- // unbind and tidy up even on timeout or failure, just in case
- mActivityManager.unbindBackupAgent(app);
-
- // The agent was running with a stub Application object, so shut it down.
- // !!! We hardcode the confirmation UI's package name here rather than use a
- // manifest flag! TODO something less direct.
- if (app.uid != Process.SYSTEM_UID
- && !app.packageName.equals("com.android.backupconfirm")) {
- if (MORE_DEBUG) Slog.d(TAG, "Killing host process");
- mActivityManager.killApplicationProcess(app.processName, app.uid);
- } else {
- if (MORE_DEBUG) Slog.d(TAG, "Not killing after full restore");
- }
- } catch (RemoteException e) {
- Slog.d(TAG, "Lost app trying to shut down");
- }
+ tearDownAgentAndKill(app);
mAgent = null;
}
}
@@ -7956,7 +7953,7 @@
IoUtils.closeQuietly(mTransportPipes[0]);
IoUtils.closeQuietly(mTransportPipes[1]);
- // Don't proceed until the engine has torn down the agent etc
+ // Don't proceed until the engine has finished
eThread.waitForResult();
if (MORE_DEBUG) {
@@ -7969,8 +7966,12 @@
// If we hit a transport-level error, we are done with everything;
// if we hit an agent error we just go back to running the queue.
if (status == BackupTransport.TRANSPORT_OK) {
- // Clean finish, so just carry on
- nextState = UnifiedRestoreState.RUNNING_QUEUE;
+ // Clean finish means we issue the restore-finished callback
+ nextState = UnifiedRestoreState.RESTORE_FINISHED;
+
+ // the engine bound the target's agent, so recover that binding
+ // to use for the callback.
+ mAgent = mEngine.getAgent();
} else {
// Something went wrong somewhere. Whether it was at the transport
// level is immaterial; we need to tell the transport to bail
@@ -8021,7 +8022,8 @@
@Override
public void run() {
while (mEngine.isRunning()) {
- mEngine.restoreOneFile(mEngineStream);
+ // Tell it to be sure to leave the agent instance up after finishing
+ mEngine.restoreOneFile(mEngineStream, false);
}
}
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 47971a1..7f124dc 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -140,14 +140,12 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Inet4Address;
-import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -2713,7 +2711,10 @@
} else {
nai = getNetworkAgentInfoForNetwork(network);
}
- if (nai == null) return;
+ if (nai == null || nai.networkInfo.getState() == NetworkInfo.State.DISCONNECTING ||
+ nai.networkInfo.getState() == NetworkInfo.State.DISCONNECTED) {
+ return;
+ }
// Revalidate if the app report does not match our current validated state.
if (hasConnectivity == nai.lastValidated) return;
final int uid = Binder.getCallingUid();
@@ -4014,51 +4015,10 @@
return !routeDiff.added.isEmpty() || !routeDiff.removed.isEmpty();
}
- // TODO: investigate moving this into LinkProperties, if only to make more accurate
- // the isProvisioned() checks.
- private static Collection<InetAddress> getLikelyReachableDnsServers(LinkProperties lp) {
- final ArrayList<InetAddress> dnsServers = new ArrayList<InetAddress>();
- final List<RouteInfo> allRoutes = lp.getAllRoutes();
- for (InetAddress nameserver : lp.getDnsServers()) {
- // If the LinkProperties doesn't include a route to the nameserver, ignore it.
- final RouteInfo bestRoute = RouteInfo.selectBestRoute(allRoutes, nameserver);
- if (bestRoute == null) {
- continue;
- }
-
- // TODO: better source address evaluation for destination addresses.
- if (nameserver instanceof Inet4Address) {
- if (!lp.hasIPv4Address()) {
- continue;
- }
- } else if (nameserver instanceof Inet6Address) {
- if (nameserver.isLinkLocalAddress()) {
- if (((Inet6Address)nameserver).getScopeId() == 0) {
- // For now, just make sure link-local DNS servers have
- // scopedIds set, since DNS lookups will fail otherwise.
- // TODO: verify the scopeId matches that of lp's interface.
- continue;
- }
- } else {
- if (bestRoute.isIPv6Default() && !lp.hasGlobalIPv6Address()) {
- // TODO: reconsider all corner cases (disconnected ULA networks, ...).
- continue;
- }
- }
- }
-
- dnsServers.add(nameserver);
- }
- return Collections.unmodifiableList(dnsServers);
- }
-
private void updateDnses(LinkProperties newLp, LinkProperties oldLp, int netId,
boolean flush, boolean useDefaultDns) {
- // TODO: consider comparing the getLikelyReachableDnsServers() lists, in case the
- // route to a DNS server has been removed (only really applicable in special cases
- // where there is no default route).
if (oldLp == null || (newLp.isIdenticalDnses(oldLp) == false)) {
- Collection<InetAddress> dnses = getLikelyReachableDnsServers(newLp);
+ Collection<InetAddress> dnses = newLp.getDnsServers();
if (dnses.size() == 0 && mDefaultDns != null && useDefaultDns) {
dnses = new ArrayList();
dnses.add(mDefaultDns);
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 43b640b..76afab3 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -60,7 +60,7 @@
2752 notification_cancel_all (uid|1|5),(pid|1|5),(pkg|3),(userid|1|5),(required_flags|1),(forbidden_flags|1),(reason|1|5),(listener|3)
# when the notification panel is shown
# Note: New tag range starts here since 2753+ have been used below.
-27500 notification_panel_revealed
+27500 notification_panel_revealed (items|1)
# when the notification panel is hidden
27501 notification_panel_hidden
# when notifications are newly displayed on screen, or disappear from screen
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index ebbd9e5..42794e7 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -79,6 +79,7 @@
void setCredential(String credential, String savedCredential, int userId)
throws RemoteException;
byte[] toHash(String credential, int userId);
+ String adjustForKeystore(String credential);
}
public LockSettingsService(Context context) {
@@ -528,6 +529,11 @@
return LockPatternUtils.patternToHash(
LockPatternUtils.stringToPattern(pattern));
}
+
+ @Override
+ public String adjustForKeystore(String pattern) {
+ return LockPatternUtils.patternStringToBaseZero(pattern);
+ }
}
);
@@ -568,6 +574,11 @@
public byte[] toHash(String password, int userId) {
return mLockPatternUtils.passwordToHash(password, userId);
}
+
+ @Override
+ public String adjustForKeystore(String password) {
+ return password;
+ }
}
);
}
@@ -587,7 +598,7 @@
if (storedHash.version == CredentialHash.VERSION_LEGACY) {
byte[] hash = credentialUtil.toHash(credential, userId);
if (Arrays.equals(hash, storedHash.hash)) {
- unlockKeystore(credential, userId);
+ unlockKeystore(credentialUtil.adjustForKeystore(credential), userId);
// migrate credential to GateKeeper
credentialUtil.setCredential(credential, null, userId);
if (!hasChallenge) {
diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java
index 45a7767..b4fa46d 100644
--- a/services/core/java/com/android/server/MountService.java
+++ b/services/core/java/com/android/server/MountService.java
@@ -1202,6 +1202,21 @@
}
}
+ private void enforceAdminUser() {
+ UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
+ final int callingUserId = UserHandle.getCallingUserId();
+ boolean isAdmin;
+ long token = Binder.clearCallingIdentity();
+ try {
+ isAdmin = um.getUserInfo(callingUserId).isAdmin();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ if (!isAdmin) {
+ throw new SecurityException("Only admin users can adopt sd cards");
+ }
+ }
+
/**
* Constructs a new MountService instance
*
@@ -1537,6 +1552,7 @@
@Override
public void partitionPrivate(String diskId) {
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
+ enforceAdminUser();
waitForReady();
final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
@@ -1551,6 +1567,7 @@
@Override
public void partitionMixed(String diskId, int ratio) {
enforcePermission(android.Manifest.permission.MOUNT_FORMAT_FILESYSTEMS);
+ enforceAdminUser();
waitForReady();
final CountDownLatch latch = findOrCreateDiskScanLatch(diskId);
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 5bce6eb..aace66c 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -18,6 +18,7 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.content.PackageMonitor;
+import com.android.internal.inputmethod.InputMethodUtils;
import com.android.internal.textservice.ISpellCheckerService;
import com.android.internal.textservice.ISpellCheckerSession;
import com.android.internal.textservice.ISpellCheckerSessionListener;
@@ -61,9 +62,11 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
@@ -141,7 +144,7 @@
buildSpellCheckerMapLocked(mContext, mSpellCheckerList, mSpellCheckerMap, mSettings);
SpellCheckerInfo sci = getCurrentSpellChecker(null);
if (sci == null) {
- sci = findAvailSpellCheckerLocked(null, null);
+ sci = findAvailSpellCheckerLocked(null);
if (sci != null) {
// Set the current spell checker if there is one or more spell checkers
// available. In this case, "sci" is the first one in the available spell
@@ -190,7 +193,7 @@
change == PACKAGE_PERMANENT_CHANGE || change == PACKAGE_TEMPORARY_CHANGE
// Package modified
|| isPackageModified(packageName)) {
- sci = findAvailSpellCheckerLocked(null, packageName);
+ sci = findAvailSpellCheckerLocked(packageName);
if (sci != null) {
setCurrentSpellCheckerLocked(sci.getId());
}
@@ -331,8 +334,7 @@
mSpellCheckerBindGroups.clear();
}
- // TODO: find an appropriate spell checker for specified locale
- private SpellCheckerInfo findAvailSpellCheckerLocked(String locale, String prefPackage) {
+ private SpellCheckerInfo findAvailSpellCheckerLocked(String prefPackage) {
final int spellCheckersCount = mSpellCheckerList.size();
if (spellCheckersCount == 0) {
Slog.w(TAG, "no available spell checker services found");
@@ -349,6 +351,38 @@
}
}
}
+
+ // Look up a spell checker based on the system locale.
+ // TODO: Still there is a room to improve in the following logic: e.g., check if the package
+ // is pre-installed or not.
+ final Locale systemLocal = mContext.getResources().getConfiguration().locale;
+ final ArrayList<Locale> suitableLocales =
+ InputMethodUtils.getSuitableLocalesForSpellChecker(systemLocal);
+ if (DBG) {
+ Slog.w(TAG, "findAvailSpellCheckerLocked suitableLocales="
+ + Arrays.toString(suitableLocales.toArray(new Locale[suitableLocales.size()])));
+ }
+ final int localeCount = suitableLocales.size();
+ for (int localeIndex = 0; localeIndex < localeCount; ++localeIndex) {
+ final Locale locale = suitableLocales.get(localeIndex);
+ for (int spellCheckersIndex = 0; spellCheckersIndex < spellCheckersCount;
+ ++spellCheckersIndex) {
+ final SpellCheckerInfo info = mSpellCheckerList.get(spellCheckersIndex);
+ final int subtypeCount = info.getSubtypeCount();
+ for (int subtypeIndex = 0; subtypeIndex < subtypeCount; ++subtypeIndex) {
+ final SpellCheckerSubtype subtype = info.getSubtypeAt(subtypeIndex);
+ final Locale subtypeLocale = InputMethodUtils.constructLocaleFromString(
+ subtype.getLocale());
+ if (locale.equals(subtypeLocale)) {
+ // TODO: We may have more spell checkers that fall into this category.
+ // Ideally we should pick up the most suitable one instead of simply
+ // returning the first found one.
+ return info;
+ }
+ }
+ }
+ }
+
if (spellCheckersCount > 1) {
Slog.w(TAG, "more than one spell checker service found, picking first");
}
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 20f6f1c..30f4dce 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -47,7 +47,10 @@
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ListIterator;
@@ -58,6 +61,8 @@
private static final boolean DEBUG = false;
private final LinkedList<Vibration> mVibrations;
+ private final LinkedList<VibrationInfo> mPreviousVibrations;
+ private final int mPreviousVibrationsLimit;
private Vibration mCurrentVibration;
private final WorkSource mTmpWorkSource = new WorkSource();
private final Handler mH = new Handler();
@@ -146,6 +151,47 @@
}
}
+ private static class VibrationInfo {
+ long timeout;
+ long startTime;
+ long[] pattern;
+ int repeat;
+ int usageHint;
+ int uid;
+ String opPkg;
+
+ public VibrationInfo(long timeout, long startTime, long[] pattern, int repeat,
+ int usageHint, int uid, String opPkg) {
+ this.timeout = timeout;
+ this.startTime = startTime;
+ this.pattern = pattern;
+ this.repeat = repeat;
+ this.usageHint = usageHint;
+ this.uid = uid;
+ this.opPkg = opPkg;
+ }
+
+ @Override
+ public String toString() {
+ return new StringBuilder()
+ .append("timeout: ")
+ .append(timeout)
+ .append(", startTime: ")
+ .append(startTime)
+ .append(", pattern: ")
+ .append(Arrays.toString(pattern))
+ .append(", repeat: ")
+ .append(repeat)
+ .append(", usageHint: ")
+ .append(usageHint)
+ .append(", uid: ")
+ .append(uid)
+ .append(", opPkg: ")
+ .append(opPkg)
+ .toString();
+ }
+ }
+
VibratorService(Context context) {
// Reset the hardware to a default state, in case this is a runtime
// restart instead of a fresh boot.
@@ -161,7 +207,11 @@
mBatteryStatsService = IBatteryStats.Stub.asInterface(ServiceManager.getService(
BatteryStats.SERVICE_NAME));
- mVibrations = new LinkedList<Vibration>();
+ mPreviousVibrationsLimit = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_previousVibrationsDumpLimit);
+
+ mVibrations = new LinkedList<>();
+ mPreviousVibrations = new LinkedList<>();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
@@ -252,6 +302,7 @@
removeVibrationLocked(token);
doCancelVibrateLocked();
mCurrentVibration = vib;
+ addToPreviousVibrationsLocked(vib);
startVibrationLocked(vib);
}
} finally {
@@ -315,6 +366,7 @@
mCurrentVibration = vib;
startVibrationLocked(vib);
}
+ addToPreviousVibrationsLocked(vib);
}
}
finally {
@@ -322,6 +374,14 @@
}
}
+ private void addToPreviousVibrationsLocked(Vibration vib) {
+ if (mPreviousVibrations.size() > mPreviousVibrationsLimit) {
+ mPreviousVibrations.removeFirst();
+ }
+ mPreviousVibrations.addLast(new VibratorService.VibrationInfo(vib.mTimeout, vib.mStartTime,
+ vib.mPattern, vib.mRepeat, vib.mUsageHint, vib.mUid, vib.mOpPkg));
+ }
+
@Override // Binder call
public void cancelVibrate(IBinder token) {
mContext.enforceCallingOrSelfPermission(
@@ -649,7 +709,6 @@
if (!mDone) {
// If this vibration finished naturally, start the next
// vibration.
- mVibrations.remove(mVibration);
unlinkVibration(mVibration);
startNextVibrationLocked();
}
@@ -685,4 +744,23 @@
}
}
};
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+
+ pw.println("Permission Denial: can't dump vibrator service from from pid="
+ + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
+ return;
+ }
+ pw.println("Previous vibrations:");
+ synchronized (mVibrations) {
+ for (VibrationInfo info : mPreviousVibrations) {
+ pw.print(" ");
+ pw.println(info.toString());
+ }
+ }
+ }
}
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 0dc4076..dd4111d 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3791,6 +3791,8 @@
// fire changed intents for all streams
mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_VALUE, index);
mVolumeChanged.putExtra(AudioManager.EXTRA_PREV_VOLUME_STREAM_VALUE, oldIndex);
+ mVolumeChanged.putExtra(AudioManager.EXTRA_VOLUME_STREAM_TYPE_ALIAS,
+ mStreamVolumeAlias[mStreamType]);
sendBroadcastToAll(mVolumeChanged);
}
return changed;
diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
index 310e361..e4729286 100644
--- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java
@@ -47,6 +47,7 @@
import android.telephony.CellInfoLte;
import android.telephony.CellInfoWcdma;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import android.util.LocalLog;
import android.util.LocalLog.ReadOnlyLocalLog;
import android.util.Log;
@@ -59,6 +60,7 @@
import java.io.IOException;
import java.net.HttpURLConnection;
+import java.net.InetAddress;
import java.net.URL;
import java.util.List;
import java.util.Random;
@@ -273,7 +275,7 @@
@Override
protected void log(String s) {
- Log.d(TAG + "/" + mNetworkAgentInfo.name(), s);
+ if (DBG) Log.d(TAG + "/" + mNetworkAgentInfo.name(), s);
}
private void validationLog(String s) {
@@ -290,18 +292,15 @@
private class DefaultState extends State {
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
switch (message.what) {
case CMD_NETWORK_LINGER:
- if (DBG) log("Lingering");
+ log("Lingering");
transitionTo(mLingeringState);
return HANDLED;
case CMD_NETWORK_CONNECTED:
- if (DBG) log("Connected");
transitionTo(mEvaluatingState);
return HANDLED;
case CMD_NETWORK_DISCONNECTED:
- if (DBG) log("Disconnected - quitting");
if (mLaunchCaptivePortalAppBroadcastReceiver != null) {
mContext.unregisterReceiver(mLaunchCaptivePortalAppBroadcastReceiver);
mLaunchCaptivePortalAppBroadcastReceiver = null;
@@ -310,13 +309,14 @@
return HANDLED;
case CMD_FORCE_REEVALUATION:
case CMD_CAPTIVE_PORTAL_RECHECK:
- if (DBG) log("Forcing reevaluation");
+ log("Forcing reevaluation for UID " + message.arg1);
mUidResponsibleForReeval = message.arg1;
transitionTo(mEvaluatingState);
return HANDLED;
case CMD_CAPTIVE_PORTAL_APP_FINISHED:
if (!mCaptivePortalLoggedInResponseToken.equals((String)message.obj))
return HANDLED;
+ log("CaptivePortal App responded with " + message.arg1);
// Previous token was sent out, come up with a new one.
mCaptivePortalLoggedInResponseToken = String.valueOf(new Random().nextLong());
switch (message.arg1) {
@@ -354,14 +354,12 @@
private class ValidatedState extends State {
@Override
public void enter() {
- if (DBG) log("Validated");
mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,
NETWORK_TEST_RESULT_VALID, 0, mNetworkAgentInfo));
}
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
switch (message.what) {
case CMD_NETWORK_CONNECTED:
transitionTo(mValidatedState);
@@ -377,7 +375,6 @@
private class MaybeNotifyState extends State {
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
switch (message.what) {
case CMD_LAUNCH_CAPTIVE_PORTAL_APP:
final Intent intent = new Intent(
@@ -421,7 +418,6 @@
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
switch (message.what) {
case CMD_REEVALUATE:
if (message.arg1 != mReevaluateToken || mUserDoesNotWant)
@@ -546,12 +542,6 @@
}
@Override
- public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
- return NOT_HANDLED;
- }
-
- @Override
public void exit() {
removeMessages(CMD_CAPTIVE_PORTAL_RECHECK);
}
@@ -583,9 +573,9 @@
@Override
public boolean processMessage(Message message) {
- if (DBG) log(getName() + message.toString());
switch (message.what) {
case CMD_NETWORK_CONNECTED:
+ log("Unlingered");
// Go straight to active as we've already evaluated.
transitionTo(mValidatedState);
return HANDLED;
@@ -655,15 +645,31 @@
// fact block fetching of the generate_204 URL which would lead to false negative
// results for network validation.
boolean fetchPac = false;
- {
- final ProxyInfo proxyInfo = mNetworkAgentInfo.linkProperties.getHttpProxy();
- if (proxyInfo != null && !Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
- url = new URL(proxyInfo.getPacFileUrl().toString());
- fetchPac = true;
+ final ProxyInfo proxyInfo = mNetworkAgentInfo.linkProperties.getHttpProxy();
+ if (proxyInfo != null && !Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) {
+ url = new URL(proxyInfo.getPacFileUrl().toString());
+ fetchPac = true;
+ }
+ final StringBuffer connectInfo = new StringBuffer();
+ String hostToResolve = null;
+ // Only resolve a host if HttpURLConnection is about to, to avoid any potentially
+ // unnecessary resolution.
+ if (proxyInfo == null || fetchPac) {
+ hostToResolve = url.getHost();
+ } else if (proxyInfo != null) {
+ hostToResolve = proxyInfo.getHost();
+ }
+ if (!TextUtils.isEmpty(hostToResolve)) {
+ connectInfo.append(", " + hostToResolve + "=");
+ final InetAddress[] addresses =
+ mNetworkAgentInfo.network.getAllByName(hostToResolve);
+ for (InetAddress address : addresses) {
+ connectInfo.append(address.getHostAddress());
+ if (address != addresses[addresses.length-1]) connectInfo.append(",");
}
}
validationLog("Checking " + url.toString() + " on " +
- mNetworkAgentInfo.networkInfo.getExtraInfo());
+ mNetworkAgentInfo.networkInfo.getExtraInfo() + connectInfo);
urlConnection = (HttpURLConnection) mNetworkAgentInfo.network.openConnection(url);
urlConnection.setInstanceFollowRedirects(fetchPac);
urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS);
@@ -729,7 +735,6 @@
long requestTimestampMs, long responseTimestampMs) {
if (Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 0) == 0) {
- if (DBG) log("Don't send network conditions - lacking user consent.");
return;
}
@@ -763,7 +768,7 @@
if (cellInfo.isRegistered()) {
numRegisteredCellInfo++;
if (numRegisteredCellInfo > 1) {
- if (DBG) log("more than one registered CellInfo. Can't " +
+ log("more than one registered CellInfo. Can't " +
"tell which is active. Bailing.");
return;
}
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 93ed2ee..2c57833 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -23,12 +23,14 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.IContentService;
+import android.content.Intent;
import android.content.ISyncStatusObserver;
import android.content.PeriodicSync;
import android.content.SyncAdapterType;
import android.content.SyncInfo;
import android.content.SyncRequest;
import android.content.SyncStatusInfo;
+import android.content.pm.PackageManager;
import android.database.IContentObserver;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
@@ -161,8 +163,9 @@
* Register a content observer tied to a specific user's view of the provider.
* @param userHandle the user whose view of the provider is to be observed. May be
* the calling user without requiring any permission, otherwise the caller needs to
- * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and
- * USER_CURRENT are properly handled; all other pseudousers are forbidden.
+ * hold the INTERACT_ACROSS_USERS_FULL permission or hold a read uri grant to the uri.
+ * Pseudousers USER_ALL and USER_CURRENT are properly handled; all other pseudousers
+ * are forbidden.
*/
@Override
public void registerContentObserver(Uri uri, boolean notifyForDescendants,
@@ -171,8 +174,17 @@
throw new IllegalArgumentException("You must pass a valid uri and observer");
}
- enforceCrossUserPermission(userHandle,
- "no permission to observe other users' provider view");
+ final int uid = Binder.getCallingUid();
+ final int pid = Binder.getCallingPid();
+ final int callingUserHandle = UserHandle.getCallingUserId();
+ // Registering an observer for any user other than the calling user requires uri grant or
+ // cross user permission
+ if (callingUserHandle != userHandle &&
+ mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_READ_URI_PERMISSION)
+ != PackageManager.PERMISSION_GRANTED) {
+ enforceCrossUserPermission(userHandle,
+ "no permission to observe other users' provider view");
+ }
if (userHandle < 0) {
if (userHandle == UserHandle.USER_CURRENT) {
@@ -185,7 +197,7 @@
synchronized (mRootNode) {
mRootNode.addObserverLocked(uri, observer, notifyForDescendants, mRootNode,
- Binder.getCallingUid(), Binder.getCallingPid(), userHandle);
+ uid, pid, userHandle);
if (false) Log.v(TAG, "Registered observer " + observer + " at " + uri +
" with notifyForDescendants " + notifyForDescendants);
}
@@ -211,8 +223,9 @@
* Notify observers of a particular user's view of the provider.
* @param userHandle the user whose view of the provider is to be notified. May be
* the calling user without requiring any permission, otherwise the caller needs to
- * hold the INTERACT_ACROSS_USERS_FULL permission. Pseudousers USER_ALL and
- * USER_CURRENT are properly interpreted; no other pseudousers are allowed.
+ * hold the INTERACT_ACROSS_USERS_FULL permission or hold a write uri grant to the uri.
+ * Pseudousers USER_ALL and USER_CURRENT are properly interpreted; no other pseudousers are
+ * allowed.
*/
@Override
public void notifyChange(Uri uri, IContentObserver observer,
@@ -223,11 +236,14 @@
+ " from observer " + observer + ", syncToNetwork " + syncToNetwork);
}
- // Notify for any user other than the caller's own requires permission.
+ final int uid = Binder.getCallingUid();
+ final int pid = Binder.getCallingPid();
final int callingUserHandle = UserHandle.getCallingUserId();
- if (userHandle != callingUserHandle) {
- mContext.enforceCallingOrSelfPermission(Manifest.permission.INTERACT_ACROSS_USERS,
- "no permission to notify other users");
+ // Notify for any user other than the caller requires uri grant or cross user permission
+ if (callingUserHandle != userHandle &&
+ mContext.checkUriPermission(uri, pid, uid, Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
+ != PackageManager.PERMISSION_GRANTED) {
+ enforceCrossUserPermission(userHandle, "no permission to notify other users");
}
// We passed the permission check; resolve pseudouser targets as appropriate
@@ -240,7 +256,6 @@
}
}
- final int uid = Binder.getCallingUid();
// This makes it so that future permission checks will be in the context of this
// process rather than the caller's process. We will restore this before returning.
long identityToken = clearCallingIdentity();
diff --git a/services/core/java/com/android/server/dreams/DreamController.java b/services/core/java/com/android/server/dreams/DreamController.java
index cff4814..8105675 100644
--- a/services/core/java/com/android/server/dreams/DreamController.java
+++ b/services/core/java/com/android/server/dreams/DreamController.java
@@ -16,6 +16,8 @@
package com.android.server.dreams;
+import com.android.internal.logging.MetricsLogger;
+
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -25,6 +27,7 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.os.IBinder.DeathRecipient;
+import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.service.dreams.DreamService;
@@ -55,6 +58,7 @@
private final Handler mHandler;
private final Listener mListener;
private final IWindowManager mIWindowManager;
+ private long mDreamStartTime;
private final Intent mDreamingStartedIntent = new Intent(Intent.ACTION_DREAMING_STARTED)
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
@@ -123,6 +127,10 @@
mCurrentDream = new DreamRecord(token, name, isTest, canDoze, userId);
+ mDreamStartTime = SystemClock.elapsedRealtime();
+ MetricsLogger.visible(mContext,
+ mCurrentDream.mCanDoze ? MetricsLogger.DOZING : MetricsLogger.DREAMING);
+
try {
mIWindowManager.addWindowToken(token, WindowManager.LayoutParams.TYPE_DREAM);
} catch (RemoteException ex) {
@@ -185,6 +193,11 @@
Slog.i(TAG, "Stopping dream: name=" + oldDream.mName
+ ", isTest=" + oldDream.mIsTest + ", canDoze=" + oldDream.mCanDoze
+ ", userId=" + oldDream.mUserId);
+ MetricsLogger.hidden(mContext,
+ oldDream.mCanDoze ? MetricsLogger.DOZING : MetricsLogger.DREAMING);
+ MetricsLogger.histogram(mContext,
+ oldDream.mCanDoze ? "dozing_minutes" : "dreaming_minutes" ,
+ (int) ((SystemClock.elapsedRealtime() - mDreamStartTime) / (1000L * 60L)));
mHandler.removeCallbacks(mStopUnconnectedDreamRunnable);
mHandler.removeCallbacks(mStopStubbornDreamRunnable);
diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java
index 87b4f8c..6a1401c 100644
--- a/services/core/java/com/android/server/notification/NotificationDelegate.java
+++ b/services/core/java/com/android/server/notification/NotificationDelegate.java
@@ -28,7 +28,7 @@
void onNotificationError(int callingUid, int callingPid,
String pkg, String tag, int id,
int uid, int initialPid, String message, int userId);
- void onPanelRevealed(boolean clearEffects);
+ void onPanelRevealed(boolean clearEffects, int numItems);
void onPanelHidden();
void clearEffects();
void onNotificationVisibilityChanged(
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index d6a7bf93..87e9d42 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -567,8 +567,8 @@
}
@Override
- public void onPanelRevealed(boolean clearEffects) {
- EventLogTags.writeNotificationPanelRevealed();
+ public void onPanelRevealed(boolean clearEffects, int items) {
+ EventLogTags.writeNotificationPanelRevealed(items);
if (clearEffects) {
clearEffects();
}
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index c9555c4a..d71904e 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -18,6 +18,7 @@
import android.Manifest;
import android.app.DownloadManager;
+import android.app.admin.DevicePolicyManager;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -28,6 +29,8 @@
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
+import android.provider.CalendarContract;
+import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.util.ArraySet;
import android.util.Log;
@@ -51,12 +54,13 @@
private static final boolean DEBUG = false;
private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
+ private static final String AUDIO_MIME_TYPE = "audio/mpeg";
private static final Set<String> PHONE_PERMISSIONS = new ArraySet<>();
static {
PHONE_PERMISSIONS.add(Manifest.permission.READ_PHONE_STATE);
PHONE_PERMISSIONS.add(Manifest.permission.CALL_PHONE);
- PHONE_PERMISSIONS.add( Manifest.permission.READ_CALL_LOG);
+ PHONE_PERMISSIONS.add(Manifest.permission.READ_CALL_LOG);
PHONE_PERMISSIONS.add(Manifest.permission.WRITE_CALL_LOG);
PHONE_PERMISSIONS.add(Manifest.permission.ADD_VOICEMAIL);
PHONE_PERMISSIONS.add(Manifest.permission.USE_SIP);
@@ -112,6 +116,11 @@
STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
+ private static final Set<String> ACCOUNTS_PERMISSIONS = new ArraySet<>();
+ static {
+ //ACCOUNTS_PERMISSIONS.add(Manifest.permission.GET_ACCOUNTS);
+ }
+
private static final Set<String> SETTINGS_PERMISSIONS = new ArraySet<>();
static {
SETTINGS_PERMISSIONS.add(Manifest.permission.WRITE_SETTINGS);
@@ -135,7 +144,8 @@
private PackagesProvider mImePackagesProvider;
private PackagesProvider mLocationPackagesProvider;
private PackagesProvider mVoiceInteractionPackagesProvider;
- private PackagesProvider mCarrierAppPackagesProvider;
+ private PackagesProvider mSmsAppPackagesProvider;
+ private PackagesProvider mDialerAppPackagesProvider;
public DefaultPermissionGrantPolicy(PackageManagerService service) {
mService = service;
@@ -153,8 +163,12 @@
mVoiceInteractionPackagesProvider = provider;
}
- public void setCarrierAppPackagesProviderLPw(PackagesProvider provider) {
- mCarrierAppPackagesProvider = provider;
+ public void setSmsAppPackagesProviderLPw(PackagesProvider provider) {
+ mSmsAppPackagesProvider = provider;
+ }
+
+ public void setDialerAppPackagesProviderLPw(PackagesProvider provider) {
+ mDialerAppPackagesProvider = provider;
}
public void grantDefaultPermissions(int userId) {
@@ -163,7 +177,7 @@
}
private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
- Log.i(TAG, "Granting permissions to platform components");
+ Log.i(TAG, "Granting permissions to platform components for user " + userId);
synchronized (mService.mPackages) {
for (PackageParser.Package pkg : mService.mPackages.values()) {
@@ -195,18 +209,20 @@
}
private void grantDefaultSystemHandlerPermissions(int userId) {
- Log.i(TAG, "Granting permissions to default platform handlers");
+ Log.i(TAG, "Granting permissions to default platform handlers for user " + userId);
final PackagesProvider imePackagesProvider;
final PackagesProvider locationPackagesProvider;
final PackagesProvider voiceInteractionPackagesProvider;
- final PackagesProvider carrierAppPackagesProvider;
+ final PackagesProvider smsAppPackagesProvider;
+ final PackagesProvider dialerAppPackagesProvider;
synchronized (mService.mPackages) {
imePackagesProvider = mImePackagesProvider;
locationPackagesProvider = mLocationPackagesProvider;
voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider;
- carrierAppPackagesProvider = mCarrierAppPackagesProvider;
+ smsAppPackagesProvider = mSmsAppPackagesProvider;
+ dialerAppPackagesProvider = mDialerAppPackagesProvider;
}
String[] imePackageNames = (imePackagesProvider != null)
@@ -215,8 +231,10 @@
? voiceInteractionPackagesProvider.getPackages(userId) : null;
String[] locationPackageNames = (locationPackagesProvider != null)
? locationPackagesProvider.getPackages(userId) : null;
- String[] carrierAppPackageNames = (carrierAppPackagesProvider != null)
- ? carrierAppPackagesProvider.getPackages(userId) : null;
+ String[] smsAppPackageNames = (smsAppPackagesProvider != null)
+ ? smsAppPackagesProvider.getPackages(userId) : null;
+ String[] dialerAppPackageNames = (dialerAppPackagesProvider != null)
+ ? dialerAppPackagesProvider.getPackages(userId) : null;
synchronized (mService.mPackages) {
// Installers
@@ -230,7 +248,7 @@
for (int i = 0; i < installerCount; i++) {
PackageParser.Package installPackage = installerPackages.get(i);
grantInstallPermissionsLPw(installPackage, INSTALLER_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(installPackage, STORAGE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(installPackage, STORAGE_PERMISSIONS, true, userId);
}
// Verifiers
@@ -248,7 +266,7 @@
// SetupWizard
Intent setupIntent = new Intent(Intent.ACTION_MAIN);
setupIntent.addCategory(Intent.CATEGORY_HOME);
- PackageParser.Package setupPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package setupPackage = getDefaultSystemHandlerActivityPackageLPr(
setupIntent, userId);
if (setupPackage != null
&& doesPackageSupportRuntimePermissions(setupPackage)) {
@@ -257,21 +275,23 @@
grantRuntimePermissionsLPw(setupPackage, SETTINGS_PERMISSIONS, userId);
}
- // Phone
- Intent dialerIntent = new Intent(Intent.ACTION_DIAL);
- PackageParser.Package dialerPackage = getDefaultSystemHandlerActvityPackageLPr(
- dialerIntent, userId);
- if (dialerPackage != null
- && doesPackageSupportRuntimePermissions(dialerPackage)) {
- grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
+ // Dialer
+ if (dialerAppPackageNames != null) {
+ for (String dialerAppPackageName : dialerAppPackageNames) {
+ PackageParser.Package dialerPackage = getPackageLPr(dialerAppPackageName);
+ if (dialerPackage != null
+ && doesPackageSupportRuntimePermissions(dialerPackage)) {
+ grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
+ }
+ }
}
// Camera
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- PackageParser.Package cameraPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
cameraIntent, userId);
if (cameraPackage != null
&& doesPackageSupportRuntimePermissions(cameraPackage)) {
@@ -296,51 +316,90 @@
// Downloads UI
Intent downloadsUiIntent = new Intent(DownloadManager.ACTION_VIEW_DOWNLOADS);
- PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package downloadsUiPackage = getDefaultSystemHandlerActivityPackageLPr(
downloadsUiIntent, userId);
if (downloadsUiPackage != null
&& doesPackageSupportRuntimePermissions(downloadsUiPackage)) {
grantRuntimePermissionsLPw(downloadsUiPackage, STORAGE_PERMISSIONS, userId);
}
- // Messaging
- Intent messagingIntent = new Intent(Intent.ACTION_MAIN);
- messagingIntent.addCategory(Intent.CATEGORY_APP_MESSAGING);
- PackageParser.Package messagingPackage = getDefaultSystemHandlerActvityPackageLPr(
- messagingIntent, userId);
- if (messagingPackage != null
- && doesPackageSupportRuntimePermissions(messagingPackage)) {
- grantRuntimePermissionsLPw(messagingPackage, PHONE_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(messagingPackage, CONTACTS_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(messagingPackage, SMS_PERMISSIONS, userId);
+ // Storage provider
+ PackageParser.Package storagePackage = getDefaultProviderAuthorityPackageLPr(
+ "com.android.externalstorage.documents", userId);
+ if (storagePackage != null) {
+ grantRuntimePermissionsLPw(storagePackage, STORAGE_PERMISSIONS, userId);
+ }
+
+ // SMS
+ if (smsAppPackageNames != null) {
+ for (String smsPackageName : smsAppPackageNames) {
+ PackageParser.Package smsPackage = getPackageLPr(smsPackageName);
+ if (smsPackage != null
+ && doesPackageSupportRuntimePermissions(smsPackage)) {
+ grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
+ }
+ }
}
// Calendar
Intent calendarIntent = new Intent(Intent.ACTION_MAIN);
calendarIntent.addCategory(Intent.CATEGORY_APP_CALENDAR);
- PackageParser.Package calendarPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package calendarPackage = getDefaultSystemHandlerActivityPackageLPr(
calendarIntent, userId);
if (calendarPackage != null
&& doesPackageSupportRuntimePermissions(calendarPackage)) {
grantRuntimePermissionsLPw(calendarPackage, CALENDAR_PERMISSIONS, userId);
grantRuntimePermissionsLPw(calendarPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(calendarPackage, ACCOUNTS_PERMISSIONS, userId);
+ }
+
+ // Calendar provider
+ PackageParser.Package calendarProviderPackage = getDefaultProviderAuthorityPackageLPr(
+ CalendarContract.AUTHORITY, userId);
+ if (calendarProviderPackage != null) {
+ grantRuntimePermissionsLPw(calendarProviderPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(calendarProviderPackage, CALENDAR_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(calendarProviderPackage, ACCOUNTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(calendarProviderPackage, STORAGE_PERMISSIONS, userId);
}
// Contacts
Intent contactsIntent = new Intent(Intent.ACTION_MAIN);
contactsIntent.addCategory(Intent.CATEGORY_APP_CONTACTS);
- PackageParser.Package contactsPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package contactsPackage = getDefaultSystemHandlerActivityPackageLPr(
contactsIntent, userId);
if (contactsPackage != null
&& doesPackageSupportRuntimePermissions(contactsPackage)) {
grantRuntimePermissionsLPw(contactsPackage, CONTACTS_PERMISSIONS, userId);
grantRuntimePermissionsLPw(contactsPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(contactsPackage, ACCOUNTS_PERMISSIONS, userId);
+ }
+
+ // Contacts provider
+ PackageParser.Package contactsProviderPackage = getDefaultProviderAuthorityPackageLPr(
+ ContactsContract.AUTHORITY, userId);
+ if (contactsProviderPackage != null) {
+ grantRuntimePermissionsLPw(contactsProviderPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(contactsProviderPackage, ACCOUNTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(contactsProviderPackage, STORAGE_PERMISSIONS, userId);
+ }
+
+ // Device provisioning
+ Intent deviceProvisionIntent = new Intent(
+ DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE);
+ PackageParser.Package deviceProvisionPackage =
+ getDefaultSystemHandlerActivityPackageLPr(deviceProvisionIntent, userId);
+ if (deviceProvisionPackage != null
+ && doesPackageSupportRuntimePermissions(deviceProvisionPackage)) {
+ grantRuntimePermissionsLPw(contactsPackage, ACCOUNTS_PERMISSIONS, userId);
}
// Maps
Intent mapsIntent = new Intent(Intent.ACTION_MAIN);
mapsIntent.addCategory(Intent.CATEGORY_APP_MAPS);
- PackageParser.Package mapsPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package mapsPackage = getDefaultSystemHandlerActivityPackageLPr(
mapsIntent, userId);
if (mapsPackage != null
&& doesPackageSupportRuntimePermissions(mapsPackage)) {
@@ -350,7 +409,7 @@
// Email
Intent emailIntent = new Intent(Intent.ACTION_MAIN);
emailIntent.addCategory(Intent.CATEGORY_APP_EMAIL);
- PackageParser.Package emailPackage = getDefaultSystemHandlerActvityPackageLPr(
+ PackageParser.Package emailPackage = getDefaultSystemHandlerActivityPackageLPr(
emailIntent, userId);
if (emailPackage != null
&& doesPackageSupportRuntimePermissions(emailPackage)) {
@@ -358,10 +417,17 @@
}
// Browser
- Intent browserIntent = new Intent(Intent.ACTION_MAIN);
- browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
- PackageParser.Package browserPackage = getDefaultSystemHandlerActvityPackageLPr(
- browserIntent, userId);
+ PackageParser.Package browserPackage = null;
+ String defaultBrowserPackage = mService.getDefaultBrowserPackageName(userId);
+ if (defaultBrowserPackage != null) {
+ browserPackage = getPackageLPr(defaultBrowserPackage);
+ }
+ if (browserPackage == null) {
+ Intent browserIntent = new Intent(Intent.ACTION_MAIN);
+ browserIntent.addCategory(Intent.CATEGORY_APP_BROWSER);
+ browserPackage = getDefaultSystemHandlerActivityPackageLPr(
+ browserIntent, userId);
+ }
if (browserPackage != null
&& doesPackageSupportRuntimePermissions(browserPackage)) {
grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
@@ -420,22 +486,77 @@
}
}
- // Carrier apps
- if (carrierAppPackageNames != null) {
- for (String packageName : carrierAppPackageNames) {
- PackageParser.Package carrierPackage = getSystemPackageLPr(packageName);
- if (carrierPackage != null
- && doesPackageSupportRuntimePermissions(carrierPackage)) {
- grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId);
- grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId);
- }
- }
+ // Music
+ Intent musicIntent = new Intent(Intent.ACTION_VIEW);
+ musicIntent.addCategory(Intent.CATEGORY_DEFAULT);
+ musicIntent.setDataAndType(Uri.fromFile(new File("foo.mp3")),
+ AUDIO_MIME_TYPE);
+ PackageParser.Package musicPackage = getDefaultSystemHandlerActivityPackageLPr(
+ musicIntent, userId);
+ if (musicPackage != null
+ && doesPackageSupportRuntimePermissions(musicPackage)) {
+ grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
}
mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
}
}
+ public void grantDefaultPermissionsToDefaultSmsAppLPr(String packageName, int userId) {
+ Log.i(TAG, "Granting permissions to default sms app for user:" + userId);
+ if (packageName == null) {
+ return;
+ }
+ PackageParser.Package smsPackage = getPackageLPr(packageName);
+ if (smsPackage != null && doesPackageSupportRuntimePermissions(smsPackage)) {
+ grantRuntimePermissionsLPw(smsPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(smsPackage, SMS_PERMISSIONS, userId);
+ }
+ }
+
+ public void grantDefaultPermissionsToDefaultDialerAppLPr(String packageName, int userId) {
+ Log.i(TAG, "Granting permissions to default dialer app for user:" + userId);
+ if (packageName == null) {
+ return;
+ }
+ PackageParser.Package dialerPackage = getPackageLPr(packageName);
+ if (dialerPackage != null
+ && doesPackageSupportRuntimePermissions(dialerPackage)) {
+ grantRuntimePermissionsLPw(dialerPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, CONTACTS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, SMS_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(dialerPackage, MICROPHONE_PERMISSIONS, userId);
+ }
+ }
+
+ public void grantDefaultPermissionsToEnabledCarrierAppsLPr(String[] packageNames, int userId) {
+ Log.i(TAG, "Granting permissions to enabled carrier apps for user:" + userId);
+ if (packageNames == null) {
+ return;
+ }
+ for (String packageName : packageNames) {
+ PackageParser.Package carrierPackage = getSystemPackageLPr(packageName);
+ if (carrierPackage != null
+ && doesPackageSupportRuntimePermissions(carrierPackage)) {
+ grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId);
+ grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId);
+ }
+ }
+ }
+
+ public void grantDefaultPermissionsToDefaultBrowserLPr(String packageName, int userId) {
+ Log.i(TAG, "Granting permissions to default browser for user:" + userId);
+ if (packageName == null) {
+ return;
+ }
+ PackageParser.Package browserPackage = getSystemPackageLPr(packageName);
+ if (browserPackage != null
+ && doesPackageSupportRuntimePermissions(browserPackage)) {
+ grantRuntimePermissionsLPw(browserPackage, LOCATION_PERMISSIONS, userId);
+ }
+ }
+
private List<PackageParser.Package> getPrivilegedHandlerReceiverPackagesLPr(
Intent intent, int userId) {
List<ResolveInfo> handlers = mService.queryIntentReceivers(
@@ -466,7 +587,7 @@
return handlerPackages;
}
- private PackageParser.Package getDefaultSystemHandlerActvityPackageLPr(
+ private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr(
Intent intent, int userId) {
List<ResolveInfo> handlers = mService.queryIntentActivities(intent, null, 0, userId);
final int handlerCount = handlers.size();
@@ -491,8 +612,12 @@
return null;
}
+ private PackageParser.Package getPackageLPr(String packageName) {
+ return mService.mPackages.get(packageName);
+ }
+
private PackageParser.Package getSystemPackageLPr(String packageName) {
- PackageParser.Package pkg = mService.mPackages.get(packageName);
+ PackageParser.Package pkg = getPackageLPr(packageName);
if (pkg != null && pkg.isSystemApp()) {
return !isSysComponentOrPersistentPrivApp(pkg) ? pkg : null;
}
@@ -509,6 +634,12 @@
private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
int userId) {
+ grantRuntimePermissionsLPw(pkg, permissions, false, userId);
+
+ }
+
+ private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
+ boolean systemFixed, int userId) {
List<String> requestedPermissions = pkg.requestedPermissions;
if (pkg.isUpdatedSystemApp()) {
@@ -533,6 +664,12 @@
Log.i(TAG, "Granted " + permission + " to default handler "
+ pkg.packageName);
}
+
+ if (systemFixed) {
+ mService.updatePermissionFlags(permission, pkg.packageName,
+ PackageManager.FLAG_PERMISSION_SYSTEM_FIXED,
+ PackageManager.FLAG_PERMISSION_SYSTEM_FIXED, userId);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 4d5f566..1385440 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -102,7 +102,6 @@
import android.content.pm.IPackageManager;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
-import android.content.pm.IPackagesProvider;
import android.content.pm.InstrumentationInfo;
import android.content.pm.IntentFilterVerificationInfo;
import android.content.pm.KeySet;
@@ -3412,11 +3411,16 @@
"resetRuntimePermissions");
}
+ final int[] userIds;
+
synchronized (mPackages) {
updatePermissionsLPw(null, null, UPDATE_PERMISSIONS_ALL);
- for (int userId : UserManagerService.getInstance().getUserIds()) {
- mDefaultPermissionPolicy.grantDefaultPermissions(userId);
- }
+ final int userCount = UserManagerService.getInstance().getUserIds().length;
+ userIds = Arrays.copyOf(UserManagerService.getInstance().getUserIds(), userCount);
+ }
+
+ for (int userId : userIds) {
+ mDefaultPermissionPolicy.grantDefaultPermissions(userId);
}
}
@@ -9711,6 +9715,8 @@
result |= updateIntentVerificationStatus(packageName,
PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS,
UserHandle.myUserId());
+ mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultBrowserLPr(
+ packageName, userId);
}
return result;
}
@@ -13026,7 +13032,7 @@
* @param flags The flags that is going to be reset.
*/
private void revokeRuntimePermissionsAndClearFlagsLocked(
- PermissionsState permissionsState, int userId, int flags) {
+ PermissionsState permissionsState, final int userId, int flags) {
boolean needsWrite = false;
for (PermissionState state : permissionsState.getRuntimePermissionStates(userId)) {
@@ -13039,7 +13045,12 @@
}
// Ensure default permissions are never cleared.
- mDefaultPermissionPolicy.grantDefaultPermissions(userId);
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mDefaultPermissionPolicy.grantDefaultPermissions(userId);
+ }
+ });
if (needsWrite) {
mSettings.writeRuntimePermissionsForUserLPr(userId, true);
@@ -15943,48 +15954,44 @@
mDefaultPermissionPolicy.setVoiceInteractionPackagesProviderLPw(provider);
}
}
- }
- @Override
- public void grantDefaultPermissions(final int userId) {
- enforceSystemOrPhoneCaller("grantDefaultPermissions");
- long token = Binder.clearCallingIdentity();
- try {
- // We cannot grant the default permissions with a lock held as
- // we query providers from other components for default handlers
- // such as enabled IMEs, etc.
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mDefaultPermissionPolicy.grantDefaultPermissions(userId);
- }
- });
- } finally {
- Binder.restoreCallingIdentity(token);
+ @Override
+ public void setSmsAppPackagesProvider(PackagesProvider provider) {
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.setSmsAppPackagesProviderLPw(provider);
+ }
+ }
+
+ @Override
+ public void setDialerAppPackagesProvider(PackagesProvider provider) {
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.setDialerAppPackagesProviderLPw(provider);
+ }
+ }
+
+ @Override
+ public void grantDefaultPermissionsToDefaultSmsApp(String packageName, int userId) {
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultSmsAppLPr(
+ packageName, userId);
+ }
+ }
+
+ @Override
+ public void grantDefaultPermissionsToDefaultDialerApp(String packageName, int userId) {
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.grantDefaultPermissionsToDefaultDialerAppLPr(
+ packageName, userId);
+ }
}
}
@Override
- public void setCarrierAppPackagesProvider(final IPackagesProvider provider) {
- enforceSystemOrPhoneCaller("setCarrierAppPackagesProvider");
- long token = Binder.clearCallingIdentity();
- try {
- PackageManagerInternal.PackagesProvider wrapper =
- new PackageManagerInternal.PackagesProvider() {
- @Override
- public String[] getPackages(int userId) {
- try {
- return provider.getPackages(userId);
- } catch (RemoteException e) {
- return null;
- }
- }
- };
- synchronized (mPackages) {
- mDefaultPermissionPolicy.setCarrierAppPackagesProviderLPw(wrapper);
- }
- } finally {
- Binder.restoreCallingIdentity(token);
+ public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
+ enforceSystemOrPhoneCaller("grantPermissionsToEnabledCarrierApps");
+ synchronized (mPackages) {
+ mDefaultPermissionPolicy.grantDefaultPermissionsToEnabledCarrierAppsLPr(
+ packageNames, userId);
}
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 51ac81d..0ad2b4a 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4487,7 +4487,9 @@
serializer.startTag(null, TAG_RUNTIME_PERMISSIONS);
String fingerprint = mFingerprints.get(userId);
- serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
+ if (fingerprint != null) {
+ serializer.attribute(null, ATTR_FINGERPRINT, fingerprint);
+ }
final int packageCount = permissionsForPackage.size();
for (int i = 0; i < packageCount; i++) {
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 93e1f18..3393d7d 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -51,6 +51,7 @@
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.media.session.MediaSessionLegacyHelper;
+import android.os.Binder;
import android.os.Bundle;
import android.os.Debug;
import android.os.FactoryTest;
@@ -61,6 +62,7 @@
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
+import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -93,6 +95,8 @@
import android.view.KeyCharacterMap.FallbackAction;
import android.view.KeyEvent;
import android.view.MotionEvent;
+
+import com.android.internal.logging.MetricsLogger;
import com.android.internal.policy.PhoneWindow;
import android.view.Surface;
import android.view.View;
@@ -267,6 +271,7 @@
SearchManager mSearchManager;
AccessibilityManager mAccessibilityManager;
BurnInProtectionHelper mBurnInProtectionHelper;
+ AppOpsManager mAppOpsManager;
// Vibrator pattern for haptic feedback of a long press.
long[] mLongPressVibePattern;
@@ -544,6 +549,8 @@
Display mDisplay;
+ private int mDisplayRotation;
+
int mLandscapeRotation = 0; // default landscape rotation
int mSeascapeRotation = 0; // "other" landscape rotation, 180 degrees from mLandscapeRotation
int mPortraitRotation = 0; // default portrait rotation
@@ -1034,6 +1041,11 @@
case MULTI_PRESS_POWER_NOTHING:
break;
case MULTI_PRESS_POWER_THEATER_MODE:
+ if (!isUserSetupComplete()) {
+ Slog.i(TAG, "Ignoring toggling theater mode - device not setup.");
+ break;
+ }
+
if (isTheaterModeEnabled()) {
Slog.i(TAG, "Toggling theater mode off.");
Settings.Global.putInt(mContext.getContentResolver(),
@@ -1255,6 +1267,7 @@
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
mDreamManagerInternal = LocalServices.getService(DreamManagerInternal.class);
+ mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
// Init display burn-in protection
boolean burnInProtectionEnabled = context.getResources().getBoolean(
@@ -1689,6 +1702,8 @@
if (mImmersiveModeConfirmation != null) {
mImmersiveModeConfirmation.loadSetting(mCurrentUserId);
}
+ }
+ synchronized (mWindowManagerFuncs.getWindowManagerLock()) {
PolicyControl.reloadFromSetting(mContext);
}
if (updateRotation) {
@@ -1810,6 +1825,25 @@
permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
}
if (permission != null) {
+ if (permission == android.Manifest.permission.SYSTEM_ALERT_WINDOW) {
+ final int callingUid = Binder.getCallingUid();
+ // check if this is a system uid first before bothering with
+ // obtaining package name
+ if (callingUid == Process.SYSTEM_UID) {
+ return WindowManagerGlobal.ADD_OKAY;
+ }
+
+ final int mode = mAppOpsManager.checkOp(outAppOp[0], callingUid,
+ attrs.packageName);
+ if (mode == AppOpsManager.MODE_DEFAULT) {
+ if (mContext.checkCallingPermission(permission) !=
+ PackageManager.PERMISSION_GRANTED) {
+ return WindowManagerGlobal.ADD_PERMISSION_DENIED;
+ }
+ }
+ return WindowManagerGlobal.ADD_OKAY;
+ }
+
if (mContext.checkCallingOrSelfPermission(permission)
!= PackageManager.PERMISSION_GRANTED) {
return WindowManagerGlobal.ADD_PERMISSION_DENIED;
@@ -3272,12 +3306,28 @@
}
@Override
- public void getInsetHintLw(WindowManager.LayoutParams attrs, Rect outContentInsets,
- Rect outStableInsets) {
+ public void getInsetHintLw(WindowManager.LayoutParams attrs, int displayRotation,
+ Rect outContentInsets, Rect outStableInsets, Rect outOutsets) {
final int fl = PolicyControl.getWindowFlags(null, attrs);
final int sysuiVis = PolicyControl.getSystemUiVisibility(null, attrs);
final int systemUiVisibility = (sysuiVis | attrs.subtreeSystemUiVisibility);
+ final boolean useOutsets = outOutsets != null && shouldUseOutsets(attrs, fl);
+ if (useOutsets) {
+ int outset = ScreenShapeHelper.getWindowOutsetBottomPx(mContext.getResources());
+ if (outset > 0) {
+ if (displayRotation == Surface.ROTATION_0) {
+ outOutsets.bottom += outset;
+ } else if (displayRotation == Surface.ROTATION_90) {
+ outOutsets.right += outset;
+ } else if (displayRotation == Surface.ROTATION_180) {
+ outOutsets.top += outset;
+ } else if (displayRotation == Surface.ROTATION_270) {
+ outOutsets.left += outset;
+ }
+ }
+ }
+
if ((fl & (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR))
== (FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR)) {
int availRight, availBottom;
@@ -3317,10 +3367,16 @@
outStableInsets.setEmpty();
}
+ private boolean shouldUseOutsets(WindowManager.LayoutParams attrs, int fl) {
+ return attrs.type == TYPE_WALLPAPER || (fl & (WindowManager.LayoutParams.FLAG_FULLSCREEN
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN)) != 0;
+ }
+
/** {@inheritDoc} */
@Override
public void beginLayoutLw(boolean isDefaultDisplay, int displayWidth, int displayHeight,
int displayRotation) {
+ mDisplayRotation = displayRotation;
final int overscanLeft, overscanTop, overscanRight, overscanBottom;
if (isDefaultDisplay) {
switch (displayRotation) {
@@ -4107,19 +4163,13 @@
// need to provide information to the clients that want to pretend that you can draw there.
// We only want to apply outsets to certain types of windows. For example, we never want to
// apply the outsets to floating dialogs, because they wouldn't make sense there.
- final boolean useOutsets = attrs.type == TYPE_WALLPAPER
- || (fl & (WindowManager.LayoutParams.FLAG_FULLSCREEN
- | WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN)) != 0;
+ final boolean useOutsets = shouldUseOutsets(attrs, fl);
if (isDefaultDisplay && useOutsets) {
osf = mTmpOutsetFrame;
osf.set(cf.left, cf.top, cf.right, cf.bottom);
int outset = ScreenShapeHelper.getWindowOutsetBottomPx(mContext.getResources());
if (outset > 0) {
- int rotation = Surface.ROTATION_0;
- try {
- rotation = mWindowManager.getRotation();
- } catch (RemoteException e) {
- }
+ int rotation = mDisplayRotation;
if (rotation == Surface.ROTATION_0) {
osf.bottom += outset;
} else if (rotation == Surface.ROTATION_90) {
@@ -4219,7 +4269,8 @@
/** {@inheritDoc} */
@Override
- public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs) {
+ public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs,
+ WindowState attached) {
if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw="
+ win.isVisibleOrBehindKeyguardLw());
final int fl = PolicyControl.getWindowFlags(win, attrs);
@@ -4264,8 +4315,12 @@
}
}
- if (appWindow) {
- final IApplicationToken appToken = win.getAppToken();
+ final IApplicationToken appToken = win.getAppToken();
+
+ // For app windows that are not attached, we decide if all windows in the app they
+ // represent should be hidden or if we should hide the lockscreen. For attached app
+ // windows we defer the decision to the window it is attached to.
+ if (appWindow && attached == null) {
if (showWhenLocked) {
// Remove any previous windows with the same appToken.
mAppsToBeHidden.remove(appToken);
@@ -5323,6 +5378,7 @@
public void finishedGoingToSleep(int why) {
EventLog.writeEvent(70000, 0);
if (DEBUG_WAKEUP) Slog.i(TAG, "Finished going to sleep... (why=" + why + ")");
+ MetricsLogger.histogram(mContext, "screen_timeout", mLockScreenTimeout / 1000);
// We must get this work done here because the power manager will drop
// the wake lock and let the system suspend once this function returns.
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index 7640837..5ceb6ad 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -571,11 +571,11 @@
* LED, vibration, and ringing
*/
@Override
- public void onPanelRevealed(boolean clearNotificationEffects) {
+ public void onPanelRevealed(boolean clearNotificationEffects, int numItems) {
enforceStatusBarService();
long identity = Binder.clearCallingIdentity();
try {
- mNotificationDelegate.onPanelRevealed(clearNotificationEffects);
+ mNotificationDelegate.onPanelRevealed(clearNotificationEffects, numItems);
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/services/core/java/com/android/server/telecom/TelecomLoaderService.java b/services/core/java/com/android/server/telecom/TelecomLoaderService.java
index 9abdf21..b165b42 100644
--- a/services/core/java/com/android/server/telecom/TelecomLoaderService.java
+++ b/services/core/java/com/android/server/telecom/TelecomLoaderService.java
@@ -20,12 +20,21 @@
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.content.pm.PackageManagerInternal;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Looper;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.provider.Settings;
+import android.telecom.DefaultDialerManager;
import android.util.Slog;
+import com.android.internal.telephony.SmsApplication;
+import com.android.server.LocalServices;
import com.android.server.SystemService;
/**
@@ -48,7 +57,7 @@
connectToTelecom();
}
}, 0);
-
+ SmsApplication.getDefaultMmsApplication(mContext, false);
ServiceManager.addService(Context.TELECOM_SERVICE, service);
} catch (RemoteException e) {
Slog.w(TAG, "Failed linking to death.");
@@ -73,6 +82,7 @@
public TelecomLoaderService(Context context) {
super(context);
mContext = context;
+ registerDefaultAppProviders();
}
@Override
@@ -82,6 +92,7 @@
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_ACTIVITY_MANAGER_READY) {
+ registerDefaultAppNotifier();
connectToTelecom();
}
}
@@ -104,4 +115,74 @@
mServiceConnection = serviceConnection;
}
}
+
+ private void registerDefaultAppProviders() {
+ final PackageManagerInternal packageManagerInternal = LocalServices.getService(
+ PackageManagerInternal.class);
+
+ // Set a callback for the package manager to query the default sms app.
+ packageManagerInternal.setSmsAppPackagesProvider(
+ new PackageManagerInternal.PackagesProvider() {
+ @Override
+ public String[] getPackages(int userId) {
+ ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
+ mContext, true);
+ if (smsComponent != null) {
+ return new String[]{smsComponent.getPackageName()};
+ }
+ return null;
+ }
+ });
+
+ // Set a callback for the package manager to query the default dialer app.
+ packageManagerInternal.setDialerAppPackagesProvider(
+ new PackageManagerInternal.PackagesProvider() {
+ @Override
+ public String[] getPackages(int userId) {
+ String packageName = DefaultDialerManager.getDefaultDialerApplication(mContext);
+ if (packageName != null) {
+ return new String[]{packageName};
+ }
+ return null;
+ }
+ });
+ }
+
+ private void registerDefaultAppNotifier() {
+ final PackageManagerInternal packageManagerInternal = LocalServices.getService(
+ PackageManagerInternal.class);
+
+ // Notify the package manager on default app changes
+ final Uri defaultSmsAppUri = Settings.Secure.getUriFor(
+ Settings.Secure.SMS_DEFAULT_APPLICATION);
+ final Uri defaultDialerAppUri = Settings.Secure.getUriFor(
+ Settings.Secure.DIALER_DEFAULT_APPLICATION);
+
+ ContentObserver contentObserver = new ContentObserver(
+ new Handler(Looper.getMainLooper())) {
+ @Override
+ public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (defaultSmsAppUri.equals(uri)) {
+ ComponentName smsComponent = SmsApplication.getDefaultSmsApplication(
+ mContext, true);
+ if (smsComponent != null) {
+ packageManagerInternal.grantDefaultPermissionsToDefaultSmsApp(
+ smsComponent.getPackageName(), userId);
+ }
+ } else if (defaultDialerAppUri.equals(uri)) {
+ String packageName = DefaultDialerManager.getDefaultDialerApplication(
+ mContext);
+ if (packageName != null) {
+ packageManagerInternal.grantDefaultPermissionsToDefaultDialerApp(
+ packageName, userId);
+ }
+ }
+ }
+ };
+
+ mContext.getContentResolver().registerContentObserver(defaultSmsAppUri,
+ false, contentObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(defaultDialerAppUri,
+ false, contentObserver, UserHandle.USER_ALL);
+ }
}
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index e9c5ac7..a8ba0f9 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -158,15 +158,15 @@
int viewVisibility, Rect outContentInsets, Rect outStableInsets,
InputChannel outInputChannel) {
return addToDisplay(window, seq, attrs, viewVisibility, Display.DEFAULT_DISPLAY,
- outContentInsets, outStableInsets, outInputChannel);
+ outContentInsets, outStableInsets, null /* outOutsets */, outInputChannel);
}
@Override
public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets,
- InputChannel outInputChannel) {
+ Rect outOutsets, InputChannel outInputChannel) {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
- outContentInsets, outStableInsets, outInputChannel);
+ outContentInsets, outStableInsets, outOutsets, outInputChannel);
}
@Override
@@ -180,7 +180,7 @@
public int addToDisplayWithoutInputChannel(IWindow window, int seq, WindowManager.LayoutParams attrs,
int viewVisibility, int displayId, Rect outContentInsets, Rect outStableInsets) {
return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId,
- outContentInsets, outStableInsets, null);
+ outContentInsets, outStableInsets, null /* outOutsets */, null);
}
public void remove(IWindow window) {
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index b285b66..605733d 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2357,7 +2357,8 @@
public int addWindow(Session session, IWindow client, int seq,
WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
- Rect outContentInsets, Rect outStableInsets, InputChannel outInputChannel) {
+ Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
+ InputChannel outInputChannel) {
int[] appOp = new int[1];
int res = mPolicy.checkAddPermission(attrs, appOp);
if (res != WindowManagerGlobal.ADD_OKAY) {
@@ -2594,7 +2595,8 @@
winAnimator.mEnteringAnimation = true;
if (displayContent.isDefaultDisplay) {
- mPolicy.getInsetHintLw(win.mAttrs, outContentInsets, outStableInsets);
+ mPolicy.getInsetHintLw(win.mAttrs, mRotation, outContentInsets, outStableInsets,
+ outOutsets);
} else {
outContentInsets.setEmpty();
outStableInsets.setEmpty();
@@ -9937,7 +9939,7 @@
for (i = windows.size() - 1; i >= 0; i--) {
WindowState w = windows.get(i);
if (w.mHasSurface) {
- mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs);
+ mPolicy.applyPostLayoutPolicyLw(w, w.mAttrs, w.mAttachedWindow);
}
}
displayContent.pendingLayoutChanges |= mPolicy.finishPostLayoutPolicyLw();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 5cfbb40..0670cd2 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -225,6 +225,7 @@
private static final Set<String> SECURE_SETTINGS_WHITELIST;
private static final Set<String> SECURE_SETTINGS_DEVICEOWNER_WHITELIST;
private static final Set<String> GLOBAL_SETTINGS_WHITELIST;
+ private static final Set<String> GLOBAL_SETTINGS_DEPRECATED;
static {
SECURE_SETTINGS_WHITELIST = new HashSet();
SECURE_SETTINGS_WHITELIST.add(Settings.Secure.DEFAULT_INPUT_METHOD);
@@ -240,13 +241,17 @@
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.AUTO_TIME);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.AUTO_TIME_ZONE);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.DATA_ROAMING);
- GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED);
- GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.MODE_RINGER);
- GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.NETWORK_PREFERENCE);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.USB_MASS_STORAGE_ENABLED);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.WIFI_SLEEP_POLICY);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.STAY_ON_WHILE_PLUGGED_IN);
GLOBAL_SETTINGS_WHITELIST.add(Settings.Global.WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN);
+
+ GLOBAL_SETTINGS_DEPRECATED = new HashSet();
+ GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.BLUETOOTH_ON);
+ GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.DEVELOPMENT_SETTINGS_ENABLED);
+ GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.MODE_RINGER);
+ GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.NETWORK_PREFERENCE);
+ GLOBAL_SETTINGS_DEPRECATED.add(Settings.Global.WIFI_ON);
}
// Keyguard features that when set of a profile will affect the profiles
@@ -5954,14 +5959,16 @@
synchronized (this) {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+ // Some settings are no supported any more. However we do not want to throw a
+ // SecurityException to avoid breaking apps.
+ if (GLOBAL_SETTINGS_DEPRECATED.contains(setting)) {
+ Log.i(LOG_TAG, "Global setting no longer supported: " + setting);
+ return;
+ }
+
if (!GLOBAL_SETTINGS_WHITELIST.contains(setting)) {
- // BLUETOOTH_ON and WIFI_ON used to be supported but not any more. We do not want to
- // throw a SecurityException not to break apps.
- if (!Settings.Global.BLUETOOTH_ON.equals(setting)
- && !Settings.Global.WIFI_ON.equals(setting)) {
- throw new SecurityException(String.format(
- "Permission denial: device owners cannot update %1$s", setting));
- }
+ throw new SecurityException(String.format(
+ "Permission denial: device owners cannot update %1$s", setting));
}
if (Settings.Global.STAY_ON_WHILE_PLUGGED_IN.equals(setting)) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
index 549a511..bd043ac 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionSessionConnection.java
@@ -198,8 +198,11 @@
isScreenCaptureAllowed = mAm.isScreenCaptureAllowedOnCurrentActivity();
} catch (RemoteException e) {
}
- boolean allDataEnabled = (Settings.Secure.getIntForUser(mContext.getContentResolver(),
- Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, mUser) != 0)
+ boolean structureEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_STRUCTURE_ENABLED, 1, mUser) != 0
+ && isScreenCaptureAllowed;
+ boolean screenshotEnabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ASSIST_SCREENSHOT_ENABLED, 1, mUser) != 0
&& isScreenCaptureAllowed;
mShowArgs = args;
mShowFlags = flags;
@@ -208,7 +211,7 @@
if ((flags& VoiceInteractionSession.SHOW_WITH_ASSIST) != 0) {
if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ASSIST_STRUCTURE, mCallingUid,
mSessionComponentName.getPackageName()) == AppOpsManager.MODE_ALLOWED
- && allDataEnabled) {
+ && structureEnabled) {
try {
needDisclosure = true;
mAm.requestAssistContextExtras(ActivityManager.ASSIST_CONTEXT_FULL,
@@ -226,7 +229,7 @@
if ((flags& VoiceInteractionSession.SHOW_WITH_SCREENSHOT) != 0) {
if (mAppOps.noteOpNoThrow(AppOpsManager.OP_ASSIST_SCREENSHOT, mCallingUid,
mSessionComponentName.getPackageName()) == AppOpsManager.MODE_ALLOWED
- && allDataEnabled) {
+ && screenshotEnabled) {
try {
needDisclosure = true;
mIWindowManager.requestAssistScreenshot(mScreenshotReceiver);
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 6055211..721b718 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -40,7 +40,8 @@
import java.util.concurrent.ConcurrentHashMap;
/**
- * Represents a connection to a remote endpoint that carries voice traffic.
+ * Represents a phone call or connection to a remote endpoint that carries voice and/or video
+ * traffic.
* <p>
* Implementations create a custom subclass of {@code Connection} and return it to the framework
* as the return value of
@@ -53,21 +54,52 @@
*/
public abstract class Connection extends Conferenceable {
+ /**
+ * The connection is initializing. This is generally the first state for a {@code Connection}
+ * returned by a {@link ConnectionService}.
+ */
public static final int STATE_INITIALIZING = 0;
+ /**
+ * The connection is new and not connected.
+ */
public static final int STATE_NEW = 1;
+ /**
+ * An incoming connection is in the ringing state. During this state, the user's ringer or
+ * vibration feature will be activated.
+ */
public static final int STATE_RINGING = 2;
+ /**
+ * An outgoing connection is in the dialing state. In this state the other party has not yet
+ * answered the call and the user traditionally hears a ringback tone.
+ */
public static final int STATE_DIALING = 3;
+ /**
+ * A connection is active. Both parties are connected to the call and can actively communicate.
+ */
public static final int STATE_ACTIVE = 4;
+ /**
+ * A connection is on hold.
+ */
public static final int STATE_HOLDING = 5;
+ /**
+ * A connection has been disconnected. This is the final state once the user has been
+ * disconnected from a call either locally, remotely or by an error in the service.
+ */
public static final int STATE_DISCONNECTED = 6;
- /** Connection can currently be put on hold or unheld. */
+ /**
+ * Connection can currently be put on hold or unheld. This is distinct from
+ * {@link #CAPABILITY_SUPPORT_HOLD} in that although a connection may support 'hold' most times,
+ * it does not at the moment support the function. This can be true while the call is in the
+ * state {@link #STATE_DIALING}, for example. During this condition, an in-call UI may
+ * display a disabled 'hold' button.
+ */
public static final int CAPABILITY_HOLD = 0x00000001;
/** Connection supports the hold feature. */
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index 1e8ae88..d2e7a74 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -41,8 +41,8 @@
import java.util.concurrent.ConcurrentHashMap;
/**
- * {@code ConnectionService} is an abstract service that should be implemented by any app which can
- * make phone calls and want those calls to be integrated into the built-in phone app.
+ * An abstract service that should be implemented by any apps which can make phone calls (VoIP or
+ * otherwise) and want those calls to be integrated into the built-in phone app.
* Once implemented, the {@code ConnectionService} needs two additional steps before it will be
* integrated into the phone app:
* <p>
@@ -62,7 +62,7 @@
* <br/>
* See {@link PhoneAccount} and {@link TelecomManager#registerPhoneAccount} for more information.
* <p>
- * Once registered and enabled by the user in the dialer settings, telecom will bind to a
+ * Once registered and enabled by the user in the phone app settings, telecom will bind to a
* {@code ConnectionService} implementation when it wants that {@code ConnectionService} to place
* a call or the service has indicated that is has an incoming call through
* {@link TelecomManager#addNewIncomingCall}. The {@code ConnectionService} can then expect a call
diff --git a/telecomm/java/android/telecom/InCallService.java b/telecomm/java/android/telecom/InCallService.java
index 0f8ac63..19c613d 100644
--- a/telecomm/java/android/telecom/InCallService.java
+++ b/telecomm/java/android/telecom/InCallService.java
@@ -248,7 +248,7 @@
}
/**
- * Obtains the current list of {@code Call}s to be displayed by this in-call experience.
+ * Obtains the current list of {@code Call}s to be displayed by this in-call service.
*
* @return A list of the relevant {@code Call}s.
*/
diff --git a/telecomm/java/android/telecom/PhoneAccount.java b/telecomm/java/android/telecom/PhoneAccount.java
index a25d327..df6fa2e 100644
--- a/telecomm/java/android/telecom/PhoneAccount.java
+++ b/telecomm/java/android/telecom/PhoneAccount.java
@@ -412,7 +412,7 @@
* bit mask.
*
* @param capability The capabilities to check.
- * @return {@code True} if the phone account has the capability.
+ * @return {@code true} if the phone account has the capability.
*/
public boolean hasCapabilities(int capability) {
return (mCapabilities & capability) == capability;
@@ -455,9 +455,10 @@
}
/**
- * Indicates whether the user has enabled this phone account or not {@code PhoneAccounts}.
+ * Indicates whether the user has enabled this {@code PhoneAccount} or not. This value is only
+ * populated for {@code PhoneAccount}s returned by {@link TelecomManager#getPhoneAccount}.
*
- * @return The {@code true} if the account is enabled by the user, {@code false} otherwise.
+ * @return {@code true} if the account is enabled by the user, {@code false} otherwise.
*/
public boolean isEnabled() {
return mIsEnabled;
@@ -468,7 +469,7 @@
* scheme.
*
* @param uriScheme The URI scheme to check.
- * @return {@code True} if the {@code PhoneAccount} supports calls to/from addresses with the
+ * @return {@code true} if the {@code PhoneAccount} supports calls to/from addresses with the
* specified URI scheme.
*/
public boolean supportsUriScheme(String uriScheme) {
diff --git a/telecomm/java/android/telecom/RemoteConference.java b/telecomm/java/android/telecom/RemoteConference.java
index c2261c3..ae5cd46 100644
--- a/telecomm/java/android/telecom/RemoteConference.java
+++ b/telecomm/java/android/telecom/RemoteConference.java
@@ -32,25 +32,90 @@
import java.util.concurrent.CopyOnWriteArraySet;
/**
- * A conference provided to a {@link ConnectionService} by another {@code ConnectionService}
- * running in a different process.
+ * A conference provided to a {@link ConnectionService} by another {@code ConnectionService} through
+ * {@link ConnectionService#conferenceRemoteConnections}. Once created, a {@code RemoteConference}
+ * can be used to control the conference call or monitor changes through
+ * {@link RemoteConnection.Callback}.
*
* @see ConnectionService#onRemoteConferenceAdded
*/
public final class RemoteConference {
+ /**
+ * Callback base class for {@link RemoteConference}.
+ */
public abstract static class Callback {
+ /**
+ * Invoked when the state of this {@code RemoteConferece} has changed. See
+ * {@link #getState()}.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param oldState The previous state of the {@code RemoteConference}.
+ * @param newState The new state of the {@code RemoteConference}.
+ */
public void onStateChanged(RemoteConference conference, int oldState, int newState) {}
+
+ /**
+ * Invoked when this {@code RemoteConference} is disconnected.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param disconnectCause The ({@see DisconnectCause}) associated with this failed
+ * conference.
+ */
public void onDisconnected(RemoteConference conference, DisconnectCause disconnectCause) {}
+
+ /**
+ * Invoked when a {@link RemoteConnection} is added to the conference call.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param connection The {@link RemoteConnection} being added.
+ */
public void onConnectionAdded(RemoteConference conference, RemoteConnection connection) {}
+
+ /**
+ * Invoked when a {@link RemoteConnection} is removed from the conference call.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param connection The {@link RemoteConnection} being removed.
+ */
public void onConnectionRemoved(RemoteConference conference, RemoteConnection connection) {}
+
+ /**
+ * Indicates that the call capabilities of this {@code RemoteConference} have changed.
+ * See {@link #getConnectionCapabilities()}.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param connectionCapabilities The new capabilities of the {@code RemoteConference}.
+ */
public void onConnectionCapabilitiesChanged(
RemoteConference conference,
int connectionCapabilities) {}
+
+ /**
+ * Invoked when the set of {@link RemoteConnection}s which can be added to this conference
+ * call have changed.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param conferenceableConnections The list of conferenceable {@link RemoteConnection}s.
+ */
public void onConferenceableConnectionsChanged(
RemoteConference conference,
List<RemoteConnection> conferenceableConnections) {}
+
+ /**
+ * Indicates that this {@code RemoteConference} has been destroyed. No further requests
+ * should be made to the {@code RemoteConference}, and references to it should be cleared.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ */
public void onDestroyed(RemoteConference conference) {}
+
+ /**
+ * Handles changes to the {@code RemoteConference} extras.
+ *
+ * @param conference The {@code RemoteConference} invoking this method.
+ * @param extras The extras containing other information associated with the conference.
+ */
public void onExtrasChanged(RemoteConference conference, @Nullable Bundle extras) {}
}
diff --git a/telecomm/java/android/telecom/RemoteConnection.java b/telecomm/java/android/telecom/RemoteConnection.java
index 8f7b82f..f960959 100644
--- a/telecomm/java/android/telecom/RemoteConnection.java
+++ b/telecomm/java/android/telecom/RemoteConnection.java
@@ -45,6 +45,9 @@
*/
public final class RemoteConnection {
+ /**
+ * Callback base class for {@link RemoteConnection}.
+ */
public static abstract class Callback {
/**
* Invoked when the state of this {@code RemoteConnection} has changed. See
@@ -200,7 +203,7 @@
RemoteConference conference) {}
/**
- * Handles changes to the {@code RemoteConference} extras.
+ * Handles changes to the {@code RemoteConnection} extras.
*
* @param connection The {@code RemoteConnection} invoking this method.
* @param extras The extras containing other information associated with the connection.
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 11f206a..a30e1c0 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -67,11 +67,19 @@
public static final String ACTION_NEW_UNKNOWN_CALL = "android.telecom.action.NEW_UNKNOWN_CALL";
/**
- * The {@link android.content.Intent} action used to configure a
- * {@link android.telecom.ConnectionService}.
+ * An {@link android.content.Intent} action sent by the telecom framework to start a
+ * configuration dialog for a registered {@link PhoneAccount}. There is no default dialog
+ * and each app that registers a {@link PhoneAccount} should provide one if desired.
+ * <p>
+ * A user can access the list of enabled {@link android.telecom.PhoneAccount}s through the Phone
+ * app's settings menu. For each entry, the settings app will add a click action. When
+ * triggered, the click-action will start this intent along with the extra
+ * {@link #EXTRA_PHONE_ACCOUNT_HANDLE} to indicate the {@link PhoneAccount} to configure. If the
+ * {@link PhoneAccount} package does not register an {@link android.app.Activity} for this
+ * intent, then it will not be sent.
*/
- public static final String ACTION_CONNECTION_SERVICE_CONFIGURE =
- "android.telecom.action.CONNECTION_SERVICE_CONFIGURE";
+ public static final String ACTION_CONFIGURE_PHONE_ACCOUNT =
+ "android.telecom.action.CONFIGURE_PHONE_ACCOUNT";
/**
* The {@link android.content.Intent} action used to show the call accessibility settings page.
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 3fcd7d9..d18b86a 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -2080,14 +2080,35 @@
* @hide
*/
public static boolean isVoiceMailNumber(int subId, String number) {
- String vmNumber;
+ return isVoiceMailNumber(null, subId, number);
+ }
+ /**
+ * isVoiceMailNumber: checks a given number against the voicemail
+ * number provided by the RIL and SIM card. The caller must have
+ * the READ_PHONE_STATE credential.
+ *
+ * @param context a non-null {@link Context}.
+ * @param subId the subscription id of the SIM.
+ * @param number the number to look up.
+ * @return true if the number is in the list of voicemail. False
+ * otherwise, including if the caller does not have the permission
+ * to read the VM number.
+ * @hide
+ */
+ public static boolean isVoiceMailNumber(Context context, int subId, String number) {
+ String vmNumber;
try {
- vmNumber = TelephonyManager.getDefault().getVoiceMailNumber(subId);
+ final TelephonyManager tm;
+ if (context == null) {
+ tm = TelephonyManager.getDefault();
+ } else {
+ tm = TelephonyManager.from(context);
+ }
+ vmNumber = tm.getVoiceMailNumber(subId);
} catch (SecurityException ex) {
return false;
}
-
// Strip the separators from the number before comparing it
// to the list.
number = extractNetworkPortionAlt(number);
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 3a0f765..3c488ed 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4161,6 +4161,8 @@
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#canChangeDtmfToneLength", e);
+ } catch (SecurityException e) {
+ Log.w(TAG, "Permission error calling ITelephony#canChangeDtmfToneLength", e);
}
return false;
}
diff --git a/telephony/java/com/android/ims/ImsCallProfile.java b/telephony/java/com/android/ims/ImsCallProfile.java
index b0b95f6..2c4354b 100644
--- a/telephony/java/com/android/ims/ImsCallProfile.java
+++ b/telephony/java/com/android/ims/ImsCallProfile.java
@@ -143,6 +143,8 @@
public static final int OIR_DEFAULT = 0; // "user subscription default value"
public static final int OIR_PRESENTATION_RESTRICTED = 1;
public static final int OIR_PRESENTATION_NOT_RESTRICTED = 2;
+ public static final int OIR_PRESENTATION_UNKNOWN = 3;
+ public static final int OIR_PRESENTATION_PAYPHONE = 4;
/**
* Values for EXTRA_DIALSTRING
@@ -373,6 +375,10 @@
return ImsCallProfile.OIR_PRESENTATION_RESTRICTED;
case PhoneConstants.PRESENTATION_ALLOWED:
return ImsCallProfile.OIR_PRESENTATION_NOT_RESTRICTED;
+ case PhoneConstants.PRESENTATION_PAYPHONE:
+ return ImsCallProfile.OIR_PRESENTATION_PAYPHONE;
+ case PhoneConstants.PRESENTATION_UNKNOWN:
+ return ImsCallProfile.OIR_PRESENTATION_UNKNOWN;
default:
return ImsCallProfile.OIR_DEFAULT;
}
@@ -389,6 +395,10 @@
return PhoneConstants.PRESENTATION_RESTRICTED;
case ImsCallProfile.OIR_PRESENTATION_NOT_RESTRICTED:
return PhoneConstants.PRESENTATION_ALLOWED;
+ case ImsCallProfile.OIR_PRESENTATION_PAYPHONE:
+ return PhoneConstants.PRESENTATION_PAYPHONE;
+ case ImsCallProfile.OIR_PRESENTATION_UNKNOWN:
+ return PhoneConstants.PRESENTATION_UNKNOWN;
default:
return PhoneConstants.PRESENTATION_UNKNOWN;
}
diff --git a/tests/Assist/src/com/android/test/assist/AssistInteractionSession.java b/tests/Assist/src/com/android/test/assist/AssistInteractionSession.java
index e4ea0bc..43f1e32 100644
--- a/tests/Assist/src/com/android/test/assist/AssistInteractionSession.java
+++ b/tests/Assist/src/com/android/test/assist/AssistInteractionSession.java
@@ -52,28 +52,23 @@
}
@Override
- public void onConfirm(Caller caller,
- Request request, CharSequence prompt, Bundle extras) {
-
+ public void onRequestConfirmation(ConfirmationRequest request) {
}
@Override
- public void onPickOption(Caller caller,
- Request request, CharSequence prompt,
- VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
-
+ public void onRequestPickOption(PickOptionRequest request) {
}
@Override
- public void onCommand(Caller caller,
- Request request, String command, Bundle extras) {
-
+ public void onRequestCommand(CommandRequest request) {
}
@Override
- public void onCreate(Bundle args) {
- super.onCreate(args);
+ public void onCancelRequest(Request request) {
+ }
+ @Override
+ public void onCreate() {
// Simulate slowness of Assist app
try {
Thread.sleep(1000);
@@ -83,11 +78,6 @@
}
@Override
- public void onCancel(Request request) {
-
- }
-
- @Override
public View onCreateContentView() {
View v = getLayoutInflater().inflate(R.layout.assist, null);
mScrim = v.findViewById(R.id.scrim);
diff --git a/tests/VoiceInteraction/res/layout/test_interaction.xml b/tests/VoiceInteraction/res/layout/test_interaction.xml
index 6209bd08..d1a7ad5 100644
--- a/tests/VoiceInteraction/res/layout/test_interaction.xml
+++ b/tests/VoiceInteraction/res/layout/test_interaction.xml
@@ -51,6 +51,19 @@
android:text="@string/abortVoice"
/>
+ </LinearLayout>
+
+ <LinearLayout android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="16dp"
+ android:orientation="horizontal">
+
+ <Button android:id="@+id/command"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/commandVoice"
+ />
+
<Button android:id="@+id/pick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/tests/VoiceInteraction/res/values/strings.xml b/tests/VoiceInteraction/res/values/strings.xml
index 4cf4104..cf660e6 100644
--- a/tests/VoiceInteraction/res/values/strings.xml
+++ b/tests/VoiceInteraction/res/values/strings.xml
@@ -24,6 +24,7 @@
<string name="abort">Abort</string>
<string name="complete">Complete</string>
<string name="abortVoice">Abort Voice</string>
+ <string name="commandVoice">Command</string>
<string name="completeVoice">Complete Voice</string>
<string name="pickVoice">Pick Voice</string>
<string name="cancelVoice">Cancel</string>
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
index 578e356..8381aa1 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
@@ -80,7 +80,8 @@
Bundle args = new Bundle();
args.putParcelable("intent", new Intent(this, TestInteractionActivity.class));
args.putBundle("assist", intent.getExtras());
- startSession(args, VoiceInteractionSession.SHOW_WITH_ASSIST | VoiceInteractionSession.SHOW_WITH_SCREENSHOT);
+ showSession(args, VoiceInteractionSession.SHOW_WITH_ASSIST
+ | VoiceInteractionSession.SHOW_WITH_SCREENSHOT);
} else {
Log.w(TAG, "Not starting -- not current voice interaction service");
}
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
index 97c1e85..a6585ba 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
@@ -60,7 +60,7 @@
static final int STATE_COMMAND = 4;
static final int STATE_ABORT_VOICE = 5;
static final int STATE_COMPLETE_VOICE = 6;
- static final int STATE_DONE=7;
+ static final int STATE_DONE = 7;
int mState = STATE_IDLE;
VoiceInteractor.PickOptionRequest.Option[] mPendingOptions;
@@ -72,8 +72,8 @@
}
@Override
- public void onCreate(Bundle args, int startFlags) {
- super.onCreate(args, startFlags);
+ public void onCreate() {
+ super.onCreate();
ActivityManager am = getContext().getSystemService(ActivityManager.class);
am.setWatchHeapLimit(40 * 1024 * 1024);
}
@@ -163,8 +163,8 @@
if (screenshot != null) {
mScreenshot.setImageBitmap(screenshot);
mScreenshot.setAdjustViewBounds(true);
- mScreenshot.setMaxWidth(screenshot.getWidth()/3);
- mScreenshot.setMaxHeight(screenshot.getHeight()/3);
+ mScreenshot.setMaxWidth(screenshot.getWidth() / 3);
+ mScreenshot.setMaxHeight(screenshot.getHeight() / 3);
mFullScreenshot.setImageBitmap(screenshot);
} else {
mScreenshot.setImageDrawable(null);
@@ -207,11 +207,12 @@
updateState();
startVoiceActivity(mStartIntent);
} else if (v == mConfirmButton) {
- if (mState == STATE_CONFIRM) {
- mPendingRequest.sendConfirmResult(true, null);
+ if (mPendingRequest instanceof ConfirmationRequest) {
+ ((ConfirmationRequest)mPendingRequest).sendConfirmationResult(true, null);
mPendingRequest = null;
mState = STATE_LAUNCHING;
- } else if (mState == STATE_PICK_OPTION) {
+ } else if (mPendingRequest instanceof PickOptionRequest) {
+ PickOptionRequest pick = (PickOptionRequest)mPendingRequest;
int numReturn = mPendingOptions.length/2;
if (numReturn <= 0) {
numReturn = 1;
@@ -223,23 +224,25 @@
}
mPendingOptions = picked;
if (picked.length <= 1) {
- mPendingRequest.sendPickOptionResult(true, picked, null);
+ pick.sendPickOptionResult(picked, null);
mPendingRequest = null;
mState = STATE_LAUNCHING;
} else {
- mPendingRequest.sendPickOptionResult(false, picked, null);
+ pick.sendIntermediatePickOptionResult(picked, null);
updatePickText();
}
- } else if (mPendingRequest != null) {
- mPendingRequest.sendCommandResult(true, null);
+ } else if (mPendingRequest instanceof CommandRequest) {
+ Bundle result = new Bundle();
+ result.putString("key", "a result!");
+ ((CommandRequest)mPendingRequest).sendResult(result);
mPendingRequest = null;
mState = STATE_LAUNCHING;
}
- } else if (v == mAbortButton) {
- mPendingRequest.sendAbortVoiceResult(null);
+ } else if (v == mAbortButton && mPendingRequest instanceof AbortVoiceRequest) {
+ ((AbortVoiceRequest)mPendingRequest).sendAbortResult(null);
mPendingRequest = null;
- } else if (v == mCompleteButton) {
- mPendingRequest.sendCompleteVoiceResult(null);
+ } else if (v == mCompleteButton && mPendingRequest instanceof CompleteVoiceRequest) {
+ ((CompleteVoiceRequest)mPendingRequest).sendCompleteResult(null);
mPendingRequest = null;
} else if (v == mScreenshot) {
if (mFullScreenshot.getVisibility() != View.VISIBLE) {
@@ -261,29 +264,45 @@
}
@Override
- public boolean[] onGetSupportedCommands(Caller caller, String[] commands) {
- return new boolean[commands.length];
+ public boolean[] onGetSupportedCommands(String[] commands) {
+ boolean[] res = new boolean[commands.length];
+ for (int i=0; i<commands.length; i++) {
+ if ("com.android.test.voiceinteraction.COMMAND".equals(commands[i])) {
+ res[i] = true;
+ }
+ }
+ return res;
}
+ void setPrompt(VoiceInteractor.Prompt prompt) {
+ if (prompt == null) {
+ mText.setText("(null)");
+ mPendingPrompt = "";
+ } else {
+ mText.setText(prompt.getVisualPrompt());
+ mPendingPrompt = prompt.getVisualPrompt();
+ }
+ }
+
@Override
- public void onConfirm(Caller caller, Request request, CharSequence prompt, Bundle extras) {
- Log.i(TAG, "onConfirm: prompt=" + prompt + " extras=" + extras);
- mText.setText(prompt);
+ public void onRequestConfirmation(ConfirmationRequest request) {
+ Log.i(TAG, "onConfirm: prompt=" + request.getVoicePrompt() + " extras="
+ + request.getExtras());
+ setPrompt(request.getVoicePrompt());
mConfirmButton.setText("Confirm");
mPendingRequest = request;
- mPendingPrompt = prompt;
mState = STATE_CONFIRM;
updateState();
}
@Override
- public void onPickOption(Caller caller, Request request, CharSequence prompt,
- VoiceInteractor.PickOptionRequest.Option[] options, Bundle extras) {
- Log.i(TAG, "onPickOption: prompt=" + prompt + " options=" + options + " extras=" + extras);
+ public void onRequestPickOption(PickOptionRequest request) {
+ Log.i(TAG, "onPickOption: prompt=" + request.getVoicePrompt() + " options="
+ + request.getOptions() + " extras=" + request.getExtras());
mConfirmButton.setText("Pick Option");
mPendingRequest = request;
- mPendingPrompt = prompt;
- mPendingOptions = options;
+ setPrompt(request.getVoicePrompt());
+ mPendingOptions = request.getOptions();
mState = STATE_PICK_OPTION;
updatePickText();
updateState();
@@ -303,27 +322,33 @@
}
@Override
- public void onCompleteVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
- Log.i(TAG, "onCompleteVoice: message=" + message + " extras=" + extras);
- mText.setText(message);
+ public void onRequestCompleteVoice(CompleteVoiceRequest request) {
+ Log.i(TAG, "onCompleteVoice: message=" + request.getVoicePrompt() + " extras="
+ + request.getExtras());
+ setPrompt(request.getVoicePrompt());
mPendingRequest = request;
mState = STATE_COMPLETE_VOICE;
updateState();
}
@Override
- public void onAbortVoice(Caller caller, Request request, CharSequence message, Bundle extras) {
- Log.i(TAG, "onAbortVoice: message=" + message + " extras=" + extras);
- mText.setText(message);
+ public void onRequestAbortVoice(AbortVoiceRequest request) {
+ Log.i(TAG, "onAbortVoice: message=" + request.getVoicePrompt() + " extras="
+ + request.getExtras());
+ setPrompt(request.getVoicePrompt());
mPendingRequest = request;
mState = STATE_ABORT_VOICE;
updateState();
}
@Override
- public void onCommand(Caller caller, Request request, String command, Bundle extras) {
- Log.i(TAG, "onCommand: command=" + command + " extras=" + extras);
- mText.setText("Command: " + command);
+ public void onRequestCommand(CommandRequest request) {
+ Bundle extras = request.getExtras();
+ if (extras != null) {
+ extras.getString("arg");
+ }
+ Log.i(TAG, "onCommand: command=" + request.getCommand() + " extras=" + extras);
+ mText.setText("Command: " + request.getCommand() + ", " + extras);
mConfirmButton.setText("Finish Command");
mPendingRequest = request;
mState = STATE_COMMAND;
@@ -331,8 +356,13 @@
}
@Override
- public void onCancel(Request request) {
+ public void onCancelRequest(Request request) {
Log.i(TAG, "onCancel");
- request.sendCancelResult();
+ if (mPendingRequest == request) {
+ mPendingRequest = null;
+ mState = STATE_LAUNCHING;
+ updateState();
+ }
+ request.cancel();
}
}
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
index 943c647..2487e1ca 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/TestInteractionActivity.java
@@ -33,6 +33,7 @@
static final String REQUEST_ABORT = "abort";
static final String REQUEST_COMPLETE = "complete";
+ static final String REQUEST_COMMAND = "command";
static final String REQUEST_PICK = "pick";
static final String REQUEST_CONFIRM = "confirm";
@@ -41,6 +42,7 @@
TextView mLog;
Button mAbortButton;
Button mCompleteButton;
+ Button mCommandButton;
Button mPickButton;
Button mJumpOutButton;
Button mCancelButton;
@@ -68,6 +70,8 @@
mAbortButton.setOnClickListener(this);
mCompleteButton = (Button)findViewById(R.id.complete);
mCompleteButton.setOnClickListener(this);
+ mCommandButton = (Button)findViewById(R.id.command);
+ mCommandButton.setOnClickListener(this);
mPickButton = (Button)findViewById(R.id.pick);
mPickButton.setOnClickListener(this);
mJumpOutButton = (Button)findViewById(R.id.jump);
@@ -117,6 +121,9 @@
} else if (v == mCompleteButton) {
VoiceInteractor.CompleteVoiceRequest req = new TestCompleteVoice();
mInteractor.submitRequest(req, REQUEST_COMPLETE);
+ } else if (v == mCommandButton) {
+ VoiceInteractor.CommandRequest req = new TestCommand("Some arg");
+ mInteractor.submitRequest(req, REQUEST_COMMAND);
} else if (v == mPickButton) {
VoiceInteractor.PickOptionRequest.Option[] options =
new VoiceInteractor.PickOptionRequest.Option[5];
@@ -176,6 +183,37 @@
}
}
+ static class TestCommand extends VoiceInteractor.CommandRequest {
+ public TestCommand(String arg) {
+ super("com.android.test.voiceinteraction.COMMAND", makeBundle(arg));
+ }
+ @Override public void onCancel() {
+ Log.i(TAG, "Canceled!");
+ ((TestInteractionActivity)getActivity()).mLog.append("Canceled command\n");
+ }
+ @Override
+ public void onCommandResult(boolean finished, Bundle result) {
+ Log.i(TAG, "Command result: finished=" + finished + " result=" + result);
+ StringBuilder sb = new StringBuilder();
+ if (finished) {
+ sb.append("Command final result: ");
+ } else {
+ sb.append("Command intermediate result: ");
+ }
+ if (result != null) {
+ result.getString("key");
+ }
+ sb.append(result);
+ sb.append("\n");
+ ((TestInteractionActivity)getActivity()).mLog.append(sb.toString());
+ }
+ static Bundle makeBundle(String arg) {
+ Bundle b = new Bundle();
+ b.putString("key", arg);
+ return b;
+ }
+ }
+
static class TestPickOption extends VoiceInteractor.PickOptionRequest {
public TestPickOption(Option[] options) {
super(new VoiceInteractor.Prompt("Need to pick something"), options, null);
@@ -200,10 +238,8 @@
}
sb.append(selections[i].getLabel());
}
+ sb.append("\n");
((TestInteractionActivity)getActivity()).mLog.append(sb.toString());
- if (finished) {
- getActivity().finish();
- }
}
}
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 422b2aa..582ac33 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -742,7 +742,7 @@
if (item != null) {
// item is a reference to a style entry. Search for it.
item = mRenderResources.findResValue(item.getValue(), item.isFramework());
-
+ item = mRenderResources.resolveResValue(item);
if (item instanceof StyleResourceValue) {
defStyleValues = (StyleResourceValue) item;
}
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
index c92df6d..bea1f86 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java
@@ -47,7 +47,7 @@
@Override
public int addToDisplay(IWindow arg0, int seq, LayoutParams arg1, int arg2, int displayId,
- Rect arg3, Rect arg4, InputChannel outInputchannel)
+ Rect arg3, Rect arg4, Rect arg5, InputChannel outInputchannel)
throws RemoteException {
// pass for now.
return 0;
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
index 8b8cc38..958b7aa 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/AppCompatActionBar.java
@@ -151,7 +151,7 @@
@Override
public void createMenuPopup() {
- // it's hard to addd menus to appcompat's actionbar, since it'll use a lot of reflection.
+ // it's hard to add menus to appcompat's actionbar, since it'll use a lot of reflection.
// so we skip it for now.
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
index f6c2626..dae5509 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/AsmGenerator.java
@@ -94,14 +94,8 @@
ListIterator<Class<?>> iter = injectedClasses.listIterator();
while (iter.hasNext()) {
Class<?> clazz = iter.next();
- try {
- int i = 1;
- while(i < 100) {
- iter.add(Class.forName(clazz.getName() + "$" + i));
- i++;
- }
- } catch (ClassNotFoundException ignored) {
- // Expected.
+ for (Class<?> aClass : clazz.getDeclaredClasses()) {
+ iter.add(aClass);
}
}
mInjectClasses = injectedClasses.toArray(new Class<?>[0]);