Loading api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -125396,6 +125396,17 @@ visibility="public" > </method> <method name="isExternalStorageRemovable" return="boolean" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > </method> <field name="DIRECTORY_ALARMS" type="java.lang.String" transient="false" core/java/android/os/Environment.java +32 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.os; import java.io.File; import android.content.res.Resources; import android.os.storage.IMountService; /** Loading Loading @@ -116,6 +117,19 @@ public class Environment { * happened. You can determine its current state with * {@link #getExternalStorageState()}. * * <p><em>Note: don't be confused by the word "external" here. This * directory can better be thought as media/shared storage. It is a * filesystem that can hold a relatively large amount of data and that * is shared across all applications (does not enforce permissions). * Traditionally this is an SD card, but it may also be implemented as * built-in storage in a device that is distinct from the protected * internal storage and can be mounted as a filesystem on a computer.</em></p> * * <p>In devices with multiple "external" storage directories (such as * both secure app storage and mountable shared storage), this directory * represents the "primary" external storage that the user will interact * with.</p> * * <p>Applications should not directly use this top-level directory, in * order to avoid polluting the user's root namespace. Any files that are * private to the application should be placed in a directory returned Loading @@ -130,6 +144,9 @@ public class Environment { * * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java * monitor_storage} * * @see #getExternalStorageState() * @see #isExternalStorageRemovable() */ public static File getExternalStorageDirectory() { return EXTERNAL_STORAGE_DIRECTORY; Loading Loading @@ -359,11 +376,9 @@ public class Environment { public static final String MEDIA_UNMOUNTABLE = "unmountable"; /** * Gets the current state of the external storage device. * Note: This call should be deprecated as it doesn't support * multiple volumes. * Gets the current state of the primary "external" storage device. * * <p>See {@link #getExternalStorageDirectory()} for an example of its use. * <p>See {@link #getExternalStorageDirectory()} for more information. */ public static String getExternalStorageState() { try { Loading @@ -377,6 +392,19 @@ public class Environment { } } /** * Returns whether the primary "external" storage device is removable. * If true is returned, this device is for example an SD card that the * user can remove. If false is returned, the storage is built into * the device and can not be physically removed. * * <p>See {@link #getExternalStorageDirectory()} for more information. */ public static boolean isExternalStorageRemovable() { return Resources.getSystem().getBoolean( com.android.internal.R.bool.config_externalStorageRemovable); } static File getDirectory(String variableName, String defaultPath) { String path = System.getenv(variableName); return path == null ? new File(defaultPath) : new File(path); Loading core/res/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,15 @@ when there's no network connection. If the scan doesn't timeout, use zero --> <integer name="config_radioScanningTimeout">0</integer> <!-- A product with no SD card == not removable. --> <bool name="config_externalStorageRemovable" product="nosdcard">false</bool> <!-- Configures whether the primary external storage device is removable. For example, if external storage is on an SD card, it is removable; if it is built in to the device, it is not removable. The default product has external storage on an SD card, which is removable. --> <bool name="config_externalStorageRemovable" product="default">true</bool> <!-- XXXXX NOTE THE FOLLOWING RESOURCES USE THE WRONG NAMING CONVENTION. Please don't copy them, copy anything else. --> Loading tools/aapt/ResourceTable.cpp +10 −8 Original line number Diff line number Diff line Loading @@ -782,7 +782,6 @@ status_t compileResourceFile(Bundle* bundle, const String16 translatable16("translatable"); const String16 formatted16("formatted"); const String16 false16("false"); const String16 product16("product"); const String16 myPackage(assets->getPackage()); Loading Loading @@ -830,7 +829,6 @@ status_t compileResourceFile(Bundle* bundle, bool curIsStyled = false; bool curIsPseudolocalizable = false; bool curIsFormatted = fileIsTranslatable; String16 curProduct; bool localHasErrors = false; if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { Loading Loading @@ -1228,8 +1226,6 @@ status_t compileResourceFile(Bundle* bundle, translatable.setTo(block.getAttributeStringValue(i, &length)); } else if (strcmp16(attr, formatted16.string()) == 0) { formatted.setTo(block.getAttributeStringValue(i, &length)); } else if (strcmp16(attr, product16.string()) == 0) { curProduct.setTo(block.getAttributeStringValue(i, &length)); } } Loading Loading @@ -1356,6 +1352,12 @@ status_t compileResourceFile(Bundle* bundle, hasErrors = localHasErrors = true; } String16 product; identIdx = block.indexOfAttribute(NULL, "product"); if (identIdx >= 0) { product = String16(block.getAttributeStringValue(identIdx, &len)); } String16 comment(block.getComment(&len) ? block.getComment(&len) : nulStr); if (curIsBag) { Loading Loading @@ -1447,7 +1449,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType, ident, parentIdent, itemIdent, curFormat, curIsFormatted, curProduct, false, overwrite, outTable); product, false, overwrite, outTable); if (err == NO_ERROR) { if (curIsPseudolocalizable && localeIsDefined(curParams) && bundle->getPseudolocalize()) { Loading @@ -1456,7 +1458,7 @@ status_t compileResourceFile(Bundle* bundle, block.setPosition(parserPosition); err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage, curType, ident, parentIdent, itemIdent, curFormat, curIsFormatted, curProduct, true, overwrite, outTable); curIsFormatted, product, true, overwrite, outTable); #endif } } Loading @@ -1480,7 +1482,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, curProduct, false, overwrite, outTable); product, false, overwrite, outTable); if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR? hasErrors = localHasErrors = true; Loading @@ -1492,7 +1494,7 @@ status_t compileResourceFile(Bundle* bundle, block.setPosition(parserPosition); err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, curProduct, curIsFormatted, product, true, overwrite, outTable); if (err != NO_ERROR) { hasErrors = localHasErrors = true; Loading Loading
api/current.xml +11 −0 Original line number Diff line number Diff line Loading @@ -125396,6 +125396,17 @@ visibility="public" > </method> <method name="isExternalStorageRemovable" return="boolean" abstract="false" native="false" synchronized="false" static="true" final="false" deprecated="not deprecated" visibility="public" > </method> <field name="DIRECTORY_ALARMS" type="java.lang.String" transient="false"
core/java/android/os/Environment.java +32 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.os; import java.io.File; import android.content.res.Resources; import android.os.storage.IMountService; /** Loading Loading @@ -116,6 +117,19 @@ public class Environment { * happened. You can determine its current state with * {@link #getExternalStorageState()}. * * <p><em>Note: don't be confused by the word "external" here. This * directory can better be thought as media/shared storage. It is a * filesystem that can hold a relatively large amount of data and that * is shared across all applications (does not enforce permissions). * Traditionally this is an SD card, but it may also be implemented as * built-in storage in a device that is distinct from the protected * internal storage and can be mounted as a filesystem on a computer.</em></p> * * <p>In devices with multiple "external" storage directories (such as * both secure app storage and mountable shared storage), this directory * represents the "primary" external storage that the user will interact * with.</p> * * <p>Applications should not directly use this top-level directory, in * order to avoid polluting the user's root namespace. Any files that are * private to the application should be placed in a directory returned Loading @@ -130,6 +144,9 @@ public class Environment { * * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java * monitor_storage} * * @see #getExternalStorageState() * @see #isExternalStorageRemovable() */ public static File getExternalStorageDirectory() { return EXTERNAL_STORAGE_DIRECTORY; Loading Loading @@ -359,11 +376,9 @@ public class Environment { public static final String MEDIA_UNMOUNTABLE = "unmountable"; /** * Gets the current state of the external storage device. * Note: This call should be deprecated as it doesn't support * multiple volumes. * Gets the current state of the primary "external" storage device. * * <p>See {@link #getExternalStorageDirectory()} for an example of its use. * <p>See {@link #getExternalStorageDirectory()} for more information. */ public static String getExternalStorageState() { try { Loading @@ -377,6 +392,19 @@ public class Environment { } } /** * Returns whether the primary "external" storage device is removable. * If true is returned, this device is for example an SD card that the * user can remove. If false is returned, the storage is built into * the device and can not be physically removed. * * <p>See {@link #getExternalStorageDirectory()} for more information. */ public static boolean isExternalStorageRemovable() { return Resources.getSystem().getBoolean( com.android.internal.R.bool.config_externalStorageRemovable); } static File getDirectory(String variableName, String defaultPath) { String path = System.getenv(variableName); return path == null ? new File(defaultPath) : new File(path); Loading
core/res/res/values/config.xml +9 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,15 @@ when there's no network connection. If the scan doesn't timeout, use zero --> <integer name="config_radioScanningTimeout">0</integer> <!-- A product with no SD card == not removable. --> <bool name="config_externalStorageRemovable" product="nosdcard">false</bool> <!-- Configures whether the primary external storage device is removable. For example, if external storage is on an SD card, it is removable; if it is built in to the device, it is not removable. The default product has external storage on an SD card, which is removable. --> <bool name="config_externalStorageRemovable" product="default">true</bool> <!-- XXXXX NOTE THE FOLLOWING RESOURCES USE THE WRONG NAMING CONVENTION. Please don't copy them, copy anything else. --> Loading
tools/aapt/ResourceTable.cpp +10 −8 Original line number Diff line number Diff line Loading @@ -782,7 +782,6 @@ status_t compileResourceFile(Bundle* bundle, const String16 translatable16("translatable"); const String16 formatted16("formatted"); const String16 false16("false"); const String16 product16("product"); const String16 myPackage(assets->getPackage()); Loading Loading @@ -830,7 +829,6 @@ status_t compileResourceFile(Bundle* bundle, bool curIsStyled = false; bool curIsPseudolocalizable = false; bool curIsFormatted = fileIsTranslatable; String16 curProduct; bool localHasErrors = false; if (strcmp16(block.getElementName(&len), skip16.string()) == 0) { Loading Loading @@ -1228,8 +1226,6 @@ status_t compileResourceFile(Bundle* bundle, translatable.setTo(block.getAttributeStringValue(i, &length)); } else if (strcmp16(attr, formatted16.string()) == 0) { formatted.setTo(block.getAttributeStringValue(i, &length)); } else if (strcmp16(attr, product16.string()) == 0) { curProduct.setTo(block.getAttributeStringValue(i, &length)); } } Loading Loading @@ -1356,6 +1352,12 @@ status_t compileResourceFile(Bundle* bundle, hasErrors = localHasErrors = true; } String16 product; identIdx = block.indexOfAttribute(NULL, "product"); if (identIdx >= 0) { product = String16(block.getAttributeStringValue(identIdx, &len)); } String16 comment(block.getComment(&len) ? block.getComment(&len) : nulStr); if (curIsBag) { Loading Loading @@ -1447,7 +1449,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddBag(bundle, in, &block, curParams, myPackage, curType, ident, parentIdent, itemIdent, curFormat, curIsFormatted, curProduct, false, overwrite, outTable); product, false, overwrite, outTable); if (err == NO_ERROR) { if (curIsPseudolocalizable && localeIsDefined(curParams) && bundle->getPseudolocalize()) { Loading @@ -1456,7 +1458,7 @@ status_t compileResourceFile(Bundle* bundle, block.setPosition(parserPosition); err = parseAndAddBag(bundle, in, &block, pseudoParams, myPackage, curType, ident, parentIdent, itemIdent, curFormat, curIsFormatted, curProduct, true, overwrite, outTable); curIsFormatted, product, true, overwrite, outTable); #endif } } Loading @@ -1480,7 +1482,7 @@ status_t compileResourceFile(Bundle* bundle, err = parseAndAddEntry(bundle, in, &block, curParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, curProduct, false, overwrite, outTable); product, false, overwrite, outTable); if (err < NO_ERROR) { // Why err < NO_ERROR instead of err != NO_ERROR? hasErrors = localHasErrors = true; Loading @@ -1492,7 +1494,7 @@ status_t compileResourceFile(Bundle* bundle, block.setPosition(parserPosition); err = parseAndAddEntry(bundle, in, &block, pseudoParams, myPackage, curType, ident, *curTag, curIsStyled, curFormat, curIsFormatted, curProduct, curIsFormatted, product, true, overwrite, outTable); if (err != NO_ERROR) { hasErrors = localHasErrors = true; Loading