Loading core/java/android/content/res/ThemeManager.java +84 −51 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Looper; import android.os.RemoteException; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -56,13 +57,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeChangeListener> iterator = mChangeListeners.iterator(); while(iterator.hasNext()) { synchronized (mChangeListeners) { List<ThemeChangeListener> listenersToRemove = new ArrayList <ThemeChangeListener>(); for (ThemeChangeListener listener : mChangeListeners) { try { iterator.next().onProgress(progress); listener.onProgress(progress); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change progress", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeChangeListener listener : listenersToRemove) { mChangeListeners.remove(listener); } } } } Loading @@ -74,13 +83,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeChangeListener> iterator = mChangeListeners.iterator(); while(iterator.hasNext()) { synchronized (mChangeListeners) { List<ThemeChangeListener> listenersToRemove = new ArrayList <ThemeChangeListener>(); for (ThemeChangeListener listener : mChangeListeners) { try { iterator.next().onFinish(isSuccess); listener.onFinish(isSuccess); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change listener", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeChangeListener listener : listenersToRemove) { mChangeListeners.remove(listener); } } } } Loading @@ -95,13 +112,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeProcessingListener> iterator = mProcessingListeners.iterator(); while(iterator.hasNext()) { synchronized (mProcessingListeners) { List<ThemeProcessingListener> listenersToRemove = new ArrayList <ThemeProcessingListener>(); for (ThemeProcessingListener listener : mProcessingListeners) { try { iterator.next().onFinishedProcessing(pkgName); listener.onFinishedProcessing(pkgName); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change progress", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeProcessingListener listener : listenersToRemove) { mProcessingListeners.remove(listener); } } } } Loading @@ -111,6 +136,7 @@ public class ThemeManager { public void addClient(ThemeChangeListener listener) { synchronized (mChangeListeners) { if (mChangeListeners.contains(listener)) { throw new IllegalArgumentException("Client was already added "); } Loading @@ -123,8 +149,10 @@ public class ThemeManager { } mChangeListeners.add(listener); } } public void removeClient(ThemeChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.remove(listener); if (mChangeListeners.size() == 0) { try { Loading @@ -134,6 +162,7 @@ public class ThemeManager { } } } } public void onClientPaused(ThemeChangeListener listener) { removeClient(listener); Loading @@ -152,6 +181,7 @@ public class ThemeManager { * @param listener ThemeChangeListener to register */ public void registerProcessingListener(ThemeProcessingListener listener) { synchronized (mProcessingListeners) { if (mProcessingListeners.contains(listener)) { throw new IllegalArgumentException("Listener was already added "); } Loading @@ -164,12 +194,14 @@ public class ThemeManager { } mProcessingListeners.add(listener); } } /** * Unregister a ThemeChangeListener. * @param listener ThemeChangeListener to unregister */ public void unregisterProcessingListener(ThemeChangeListener listener) { synchronized (mProcessingListeners) { mProcessingListeners.remove(listener); if (mProcessingListeners.size() == 0) { try { Loading @@ -179,6 +211,7 @@ public class ThemeManager { } } } } /** * Convenience method. Applies the entire theme. Loading core/java/android/os/RecoverySystem.java +42 −2 Original line number Diff line number Diff line Loading @@ -348,8 +348,10 @@ public class RecoverySystem { * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. * * @hide */ public static void rebootWipeUserData(Context context) throws IOException { private static void doRebootWipeUserData(Context context, boolean wipeMedia) throws IOException { final ConditionVariable condition = new ConditionVariable(); Intent intent = new Intent("android.intent.action.MASTER_CLEAR_NOTIFICATION"); Loading @@ -365,7 +367,45 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); bootCommand(context, "--wipe_data\n--locale=" + Locale.getDefault().toString()); String cmd = "--wipe_data\n"; if (wipeMedia) { cmd += "--wipe_media\n"; } cmd += "--locale=" + Locale.getDefault().toString(); bootCommand(context, cmd); } /** * Reboots the device and wipes the user data partition. This is * sometimes called a "factory reset", which is something of a * misnomer because the system partition is not restored to its * factory state. * Requires the {@link android.Manifest.permission#REBOOT} permission. * * @param context the Context to use * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. */ public static void rebootWipeUserData(Context context) throws IOException { doRebootWipeUserData(context, false); } /** * Reboots the device and formats the user data partition. This is * like rebootWipeUserData except that it forces the data partition * to be formatted on datamedia devices. * Requires the {@link android.Manifest.permission#REBOOT} permission. * * @param context the Context to use * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. * @hide */ public static void rebootFormatUserData(Context context) throws IOException { doRebootWipeUserData(context, true); } /** Loading core/java/android/os/storage/StorageManager.java +17 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.net.TrafficStats.MB_IN_BYTES; import android.content.ContentResolver; import android.content.Context; import android.hardware.usb.UsbManager; import android.os.Environment; import android.os.Handler; import android.os.Looper; Loading Loading @@ -380,6 +381,22 @@ public class StorageManager { } } /** * Switch USB Mass Storage (UMS) on the device. * * @hide */ public void setUsbMassStorageEnabled(boolean enable) { UsbManager manager = new UsbManager(null, null); if (enable && manager.isFunctionEnabled(UsbManager.USB_FUNCTION_MASS_STORAGE)) { if(!isUsbMassStorageEnabled()) { enableUsbMassStorage(); } } else if (isUsbMassStorageEnabled()) { disableUsbMassStorage(); } } /** * Enables USB Mass Storage (UMS) on the device. * Loading core/java/android/provider/Settings.java +41 −0 Original line number Diff line number Diff line Loading @@ -58,8 +58,10 @@ import android.util.Log; import com.android.internal.widget.ILockSettings; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; /** Loading Loading @@ -2462,6 +2464,15 @@ public final class Settings { public static final String HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY = "hide_rotation_lock_toggle_for_accessibility"; /** * Call recording format value * 0: AMR_WB * 1: MPEG_4 * Default: 0 * @hide */ public static final String CALL_RECORDING_FORMAT = "call_recording_format"; /** * Whether the phone vibrates when it is ringing due to an incoming call. This will * be used by Phone and Setting apps; it shouldn't affect other apps. Loading Loading @@ -4241,6 +4252,30 @@ public final class Settings { return sNameValueCache.getStringForUser(resolver, name, userHandle); } /** * Get a delimited string returned as a list * @param resolver to access the database with * @param name to store * @param delimiter to split the list with * @return list of strings for a specific Settings.Secure item * @hide */ public static List<String> getDelimitedStringAsList(ContentResolver resolver, String name, String delimiter) { String baseString = Settings.Secure.getString(resolver, name); List<String> list = new ArrayList<String>(); if (!TextUtils.isEmpty(baseString)) { final String[] array = TextUtils.split(baseString, delimiter); for (String item : array) { if (TextUtils.isEmpty(item)) { continue; } list.add(item); } } return list; } /** * Store a name/value pair into the database. * @param resolver to access the database with Loading Loading @@ -4873,6 +4908,12 @@ public final class Settings { */ public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url"; /** * Known good originating source sms addresses * @hide */ public static final String PROTECTED_SMS_ADDRESSES = "protected_sms_addresses"; /** * Settings classname to launch when Settings is clicked from All * Applications. Needed because of user testing between the old Loading core/java/com/android/internal/util/cm/QSConstants.java +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ public class QSConstants { public static final String TILE_NETWORKADB = "toggleNetworkAdb"; public static final String TILE_COMPASS = "toggleCompass"; public static final String TILE_HEADS_UP = "toggleHeadsUp"; public static final String TILE_THEMES = "toggleThemes"; public static final String TILE_DELIMITER = "|"; public static ArrayList<String> TILES_DEFAULT = new ArrayList<String>(); Loading Loading
core/java/android/content/res/ThemeManager.java +84 −51 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.os.Looper; import android.os.RemoteException; import android.util.Log; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; Loading Loading @@ -56,13 +57,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeChangeListener> iterator = mChangeListeners.iterator(); while(iterator.hasNext()) { synchronized (mChangeListeners) { List<ThemeChangeListener> listenersToRemove = new ArrayList <ThemeChangeListener>(); for (ThemeChangeListener listener : mChangeListeners) { try { iterator.next().onProgress(progress); listener.onProgress(progress); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change progress", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeChangeListener listener : listenersToRemove) { mChangeListeners.remove(listener); } } } } Loading @@ -74,13 +83,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeChangeListener> iterator = mChangeListeners.iterator(); while(iterator.hasNext()) { synchronized (mChangeListeners) { List<ThemeChangeListener> listenersToRemove = new ArrayList <ThemeChangeListener>(); for (ThemeChangeListener listener : mChangeListeners) { try { iterator.next().onFinish(isSuccess); listener.onFinish(isSuccess); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change listener", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeChangeListener listener : listenersToRemove) { mChangeListeners.remove(listener); } } } } Loading @@ -95,13 +112,21 @@ public class ThemeManager { mHandler.post(new Runnable() { @Override public void run() { Iterator<ThemeProcessingListener> iterator = mProcessingListeners.iterator(); while(iterator.hasNext()) { synchronized (mProcessingListeners) { List<ThemeProcessingListener> listenersToRemove = new ArrayList <ThemeProcessingListener>(); for (ThemeProcessingListener listener : mProcessingListeners) { try { iterator.next().onFinishedProcessing(pkgName); listener.onFinishedProcessing(pkgName); } catch (Throwable e) { Log.w(TAG, "Unable to update theme change progress", e); iterator.remove(); listenersToRemove.add(listener); } } if (listenersToRemove.size() > 0) { for (ThemeProcessingListener listener : listenersToRemove) { mProcessingListeners.remove(listener); } } } } Loading @@ -111,6 +136,7 @@ public class ThemeManager { public void addClient(ThemeChangeListener listener) { synchronized (mChangeListeners) { if (mChangeListeners.contains(listener)) { throw new IllegalArgumentException("Client was already added "); } Loading @@ -123,8 +149,10 @@ public class ThemeManager { } mChangeListeners.add(listener); } } public void removeClient(ThemeChangeListener listener) { synchronized (mChangeListeners) { mChangeListeners.remove(listener); if (mChangeListeners.size() == 0) { try { Loading @@ -134,6 +162,7 @@ public class ThemeManager { } } } } public void onClientPaused(ThemeChangeListener listener) { removeClient(listener); Loading @@ -152,6 +181,7 @@ public class ThemeManager { * @param listener ThemeChangeListener to register */ public void registerProcessingListener(ThemeProcessingListener listener) { synchronized (mProcessingListeners) { if (mProcessingListeners.contains(listener)) { throw new IllegalArgumentException("Listener was already added "); } Loading @@ -164,12 +194,14 @@ public class ThemeManager { } mProcessingListeners.add(listener); } } /** * Unregister a ThemeChangeListener. * @param listener ThemeChangeListener to unregister */ public void unregisterProcessingListener(ThemeChangeListener listener) { synchronized (mProcessingListeners) { mProcessingListeners.remove(listener); if (mProcessingListeners.size() == 0) { try { Loading @@ -179,6 +211,7 @@ public class ThemeManager { } } } } /** * Convenience method. Applies the entire theme. Loading
core/java/android/os/RecoverySystem.java +42 −2 Original line number Diff line number Diff line Loading @@ -348,8 +348,10 @@ public class RecoverySystem { * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. * * @hide */ public static void rebootWipeUserData(Context context) throws IOException { private static void doRebootWipeUserData(Context context, boolean wipeMedia) throws IOException { final ConditionVariable condition = new ConditionVariable(); Intent intent = new Intent("android.intent.action.MASTER_CLEAR_NOTIFICATION"); Loading @@ -365,7 +367,45 @@ public class RecoverySystem { // Block until the ordered broadcast has completed. condition.block(); bootCommand(context, "--wipe_data\n--locale=" + Locale.getDefault().toString()); String cmd = "--wipe_data\n"; if (wipeMedia) { cmd += "--wipe_media\n"; } cmd += "--locale=" + Locale.getDefault().toString(); bootCommand(context, cmd); } /** * Reboots the device and wipes the user data partition. This is * sometimes called a "factory reset", which is something of a * misnomer because the system partition is not restored to its * factory state. * Requires the {@link android.Manifest.permission#REBOOT} permission. * * @param context the Context to use * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. */ public static void rebootWipeUserData(Context context) throws IOException { doRebootWipeUserData(context, false); } /** * Reboots the device and formats the user data partition. This is * like rebootWipeUserData except that it forces the data partition * to be formatted on datamedia devices. * Requires the {@link android.Manifest.permission#REBOOT} permission. * * @param context the Context to use * * @throws IOException if writing the recovery command file * fails, or if the reboot itself fails. * @hide */ public static void rebootFormatUserData(Context context) throws IOException { doRebootWipeUserData(context, true); } /** Loading
core/java/android/os/storage/StorageManager.java +17 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import static android.net.TrafficStats.MB_IN_BYTES; import android.content.ContentResolver; import android.content.Context; import android.hardware.usb.UsbManager; import android.os.Environment; import android.os.Handler; import android.os.Looper; Loading Loading @@ -380,6 +381,22 @@ public class StorageManager { } } /** * Switch USB Mass Storage (UMS) on the device. * * @hide */ public void setUsbMassStorageEnabled(boolean enable) { UsbManager manager = new UsbManager(null, null); if (enable && manager.isFunctionEnabled(UsbManager.USB_FUNCTION_MASS_STORAGE)) { if(!isUsbMassStorageEnabled()) { enableUsbMassStorage(); } } else if (isUsbMassStorageEnabled()) { disableUsbMassStorage(); } } /** * Enables USB Mass Storage (UMS) on the device. * Loading
core/java/android/provider/Settings.java +41 −0 Original line number Diff line number Diff line Loading @@ -58,8 +58,10 @@ import android.util.Log; import com.android.internal.widget.ILockSettings; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; /** Loading Loading @@ -2462,6 +2464,15 @@ public final class Settings { public static final String HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY = "hide_rotation_lock_toggle_for_accessibility"; /** * Call recording format value * 0: AMR_WB * 1: MPEG_4 * Default: 0 * @hide */ public static final String CALL_RECORDING_FORMAT = "call_recording_format"; /** * Whether the phone vibrates when it is ringing due to an incoming call. This will * be used by Phone and Setting apps; it shouldn't affect other apps. Loading Loading @@ -4241,6 +4252,30 @@ public final class Settings { return sNameValueCache.getStringForUser(resolver, name, userHandle); } /** * Get a delimited string returned as a list * @param resolver to access the database with * @param name to store * @param delimiter to split the list with * @return list of strings for a specific Settings.Secure item * @hide */ public static List<String> getDelimitedStringAsList(ContentResolver resolver, String name, String delimiter) { String baseString = Settings.Secure.getString(resolver, name); List<String> list = new ArrayList<String>(); if (!TextUtils.isEmpty(baseString)) { final String[] array = TextUtils.split(baseString, delimiter); for (String item : array) { if (TextUtils.isEmpty(item)) { continue; } list.add(item); } } return list; } /** * Store a name/value pair into the database. * @param resolver to access the database with Loading Loading @@ -4873,6 +4908,12 @@ public final class Settings { */ public static final String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url"; /** * Known good originating source sms addresses * @hide */ public static final String PROTECTED_SMS_ADDRESSES = "protected_sms_addresses"; /** * Settings classname to launch when Settings is clicked from All * Applications. Needed because of user testing between the old Loading
core/java/com/android/internal/util/cm/QSConstants.java +1 −0 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ public class QSConstants { public static final String TILE_NETWORKADB = "toggleNetworkAdb"; public static final String TILE_COMPASS = "toggleCompass"; public static final String TILE_HEADS_UP = "toggleHeadsUp"; public static final String TILE_THEMES = "toggleThemes"; public static final String TILE_DELIMITER = "|"; public static ArrayList<String> TILES_DEFAULT = new ArrayList<String>(); Loading