diff --git a/Android.mk b/Android.mk index 012583e92e5f7df056385575c08b93eab32a2271..7fbaefd57c144cf7be8c4063cdd527f890caae1e 100644 --- a/Android.mk +++ b/Android.mk @@ -107,7 +107,6 @@ LOCAL_SRC_FILES += \ core/java/android/bluetooth/IBluetoothA2dpSink.aidl \ core/java/android/bluetooth/IBluetoothAvrcpController.aidl \ core/java/android/bluetooth/IBluetoothCallback.aidl \ - core/java/android/bluetooth/IBluetoothProfileServiceConnection.aidl \ core/java/android/bluetooth/IBluetoothHeadset.aidl \ core/java/android/bluetooth/IBluetoothHeadsetPhone.aidl \ core/java/android/bluetooth/IBluetoothHealth.aidl \ @@ -125,6 +124,7 @@ LOCAL_SRC_FILES += \ core/java/android/bluetooth/IBluetoothGatt.aidl \ core/java/android/bluetooth/IBluetoothGattCallback.aidl \ core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \ + core/java/android/bluetooth/IBluetoothDun.aidl \ core/java/android/content/IClipboard.aidl \ core/java/android/content/IContentService.aidl \ core/java/android/content/IIntentReceiver.aidl \ @@ -326,6 +326,7 @@ LOCAL_SRC_FILES += \ core/java/com/android/internal/policy/IShortcutService.aidl \ core/java/com/android/internal/os/IDropBoxManagerService.aidl \ core/java/com/android/internal/os/IParcelFileDescriptorFactory.aidl \ + core/java/com/android/internal/os/IRegionalizationService.aidl \ core/java/com/android/internal/os/IResultReceiver.aidl \ core/java/com/android/internal/statusbar/IStatusBar.aidl \ core/java/com/android/internal/statusbar/IStatusBarService.aidl \ diff --git a/cmds/bootanimation/Android.mk b/cmds/bootanimation/Android.mk index 7c8842ca02316ba9b6e3aefd2cd9e3f157745c0c..7a119bd32d228cb6a20b58a73ba1297621a16584 100644 --- a/cmds/bootanimation/Android.mk +++ b/cmds/bootanimation/Android.mk @@ -23,7 +23,8 @@ LOCAL_SHARED_LIBRARIES := \ libEGL \ libGLESv1_CM \ libgui \ - libtinyalsa + libtinyalsa \ + libregionalization LOCAL_MODULE:= bootanimation diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index c597ed2cc61e77d6d075dc65a5b4c7e37a676abc..c5a3239875ef791d5869fcbfb393c135f2001511 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -57,9 +57,12 @@ #include "BootAnimation.h" #include "AudioPlayer.h" +#include + #define OEM_BOOTANIMATION_FILE "/oem/media/bootanimation.zip" #define SYSTEM_BOOTANIMATION_FILE "/system/media/bootanimation.zip" #define SYSTEM_ENCRYPTED_BOOTANIMATION_FILE "/system/media/bootanimation-encrypted.zip" + #define EXIT_PROP_NAME "service.bootanim.exit" namespace android { @@ -224,6 +227,35 @@ status_t BootAnimation::initTexture(const Animation::Frame& frame) return NO_ERROR; } + +// Get bootup Animation File +// Parameter: ImageID: IMG_OEM IMG_SYS IMG_ENC +// Return Value : File path +const char *BootAnimation::getAnimationFileName(ImageID image) +{ + const char *fileName[3] = { OEM_BOOTANIMATION_FILE, + SYSTEM_BOOTANIMATION_FILE, + SYSTEM_ENCRYPTED_BOOTANIMATION_FILE }; + + // Load animations of Carrier through regionalization environment + if (Environment::isSupported()) { + Environment* environment = new Environment(); + const char* animFile = environment->getMediaFile( + Environment::ANIMATION_TYPE, Environment::BOOT_STATUS); + ALOGE("Get Carrier Animation type: %d,status:%d", Environment::ANIMATION_TYPE,Environment::BOOT_STATUS); + if (animFile != NULL && strcmp(animFile, "") != 0) { + return animFile; + }else{ + ALOGD("Get Carrier Animation file: %s failed", animFile); + } + delete environment; + }else{ + ALOGE("Get Carrier Animation file,since it's not support carrier"); + } + + return fileName[image]; +} + status_t BootAnimation::readyToRun() { mAssets.addDefaultAssets(); @@ -285,14 +317,14 @@ status_t BootAnimation::readyToRun() { bool encryptedAnimation = atoi(decrypt) != 0 || !strcmp("trigger_restart_min_framework", decrypt); - if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) { - mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE; + if (encryptedAnimation && (access(getAnimationFileName(IMG_ENC), R_OK) == 0)) { + mZipFileName = getAnimationFileName(IMG_ENC); } - else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) { - mZipFileName = OEM_BOOTANIMATION_FILE; + else if (access(getAnimationFileName(IMG_OEM), R_OK) == 0) { + mZipFileName = getAnimationFileName(IMG_OEM); } - else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) { - mZipFileName = SYSTEM_BOOTANIMATION_FILE; + else if (access(getAnimationFileName(IMG_SYS), R_OK) == 0) { + mZipFileName = getAnimationFileName(IMG_SYS); } return NO_ERROR; } diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index d49e1ec837b95299e6207b72aca22e54250f8404..f6846e85ea77bb5d48a515225f3057ba80e64f79 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -87,6 +87,13 @@ private: ZipFileRO* zip; }; + /** + *IMG_OEM: bootanimation file from oem/media + *IMG_SYS: bootanimation file from system/media + *IMG_ENC: encrypted bootanimation file from system/media + */ + enum ImageID { IMG_OEM = 0, IMG_SYS = 1, IMG_ENC = 2 }; + const char *getAnimationFileName(ImageID image); status_t initTexture(Texture* texture, AssetManager& asset, const char* name); status_t initTexture(const Animation::Frame& frame); bool android(); diff --git a/cmds/idmap/scan.cpp b/cmds/idmap/scan.cpp index 6d30f0d0ce343a90ee3d5eff7d8644e218226b96..d94086be09de7e0f818b2dc91b3b8d8afa965042 100644 --- a/cmds/idmap/scan.cpp +++ b/cmds/idmap/scan.cpp @@ -169,12 +169,6 @@ namespace { int idmap_scan(const char *target_package_name, const char *target_apk_path, const char *idmap_dir, const android::Vector *overlay_dirs) { - String8 filename = String8(idmap_dir); - filename.appendPath("overlays.list"); - if (unlink(filename.string()) != 0 && errno != ENOENT) { - return EXIT_FAILURE; - } - SortedVector overlayVector; const size_t N = overlay_dirs->size(); for (size_t i = 0; i < N; ++i) { @@ -189,38 +183,56 @@ int idmap_scan(const char *target_package_name, const char *target_apk_path, struct stat st; char overlay_apk_path[PATH_MAX + 1]; snprintf(overlay_apk_path, PATH_MAX, "%s/%s", overlay_dir, dirent->d_name); + if (stat(overlay_apk_path, &st) < 0) { continue; } - if (!S_ISREG(st.st_mode)) { - continue; - } - int priority = parse_apk(overlay_apk_path, target_package_name); - if (priority < 0) { + if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) { continue; } - String8 idmap_path(idmap_dir); - idmap_path.appendPath(flatten_path(overlay_apk_path + 1)); - idmap_path.append("@idmap"); + if (S_ISDIR(st.st_mode)) { + String8 dir_name = String8(overlay_apk_path).getPathLeaf(); + if (dir_name == "." || dir_name == "..") { + // Skip the "." and ".." dir. + continue; + } + android::Vector ovector; + ovector.push(overlay_apk_path); + idmap_scan(target_package_name, target_apk_path, idmap_dir, &ovector); + }else{ + int priority = parse_apk(overlay_apk_path, target_package_name); + if (priority < 0) { + continue; + } - if (idmap_create_path(target_apk_path, overlay_apk_path, idmap_path.string()) != 0) { - ALOGE("error: failed to create idmap for target=%s overlay=%s idmap=%s\n", - target_apk_path, overlay_apk_path, idmap_path.string()); - continue; - } + String8 filename = String8(idmap_dir); + filename.appendPath("overlays.list"); + if (unlink(filename.string()) != 0 && errno != ENOENT) { + return EXIT_FAILURE; + } + + String8 idmap_path(idmap_dir); + idmap_path.appendPath(flatten_path(overlay_apk_path + 1)); + idmap_path.append("@idmap"); + if (idmap_create_path(target_apk_path, overlay_apk_path, idmap_path.string()) != 0) { + ALOGE("error: failed to create idmap for target=%s overlay=%s idmap=%s\n", + target_apk_path, overlay_apk_path, idmap_path.string()); + continue; + } + + Overlay overlay(String8(overlay_apk_path), idmap_path, priority); + overlayVector.add(overlay); - Overlay overlay(String8(overlay_apk_path), idmap_path, priority); - overlayVector.add(overlay); + if (!writePackagesList(filename.string(), overlayVector)) { + return EXIT_FAILURE; + } + } } closedir(dir); } - if (!writePackagesList(filename.string(), overlayVector)) { - return EXIT_FAILURE; - } - return EXIT_SUCCESS; } diff --git a/cmds/media/src/com/android/commands/media/Media.java b/cmds/media/src/com/android/commands/media/Media.java index d7f23cb440989beb23f27d3cc3ec737e70d347f6..d185b5625d4e406a2ccc10ed81b78a733c7acc1e 100644 --- a/cmds/media/src/com/android/commands/media/Media.java +++ b/cmds/media/src/com/android/commands/media/Media.java @@ -222,6 +222,26 @@ public class Media extends BaseCommand { System.out.println("onVolumeInfoChanged " + info); } + @Override + public void onPlayItemResponse(boolean success) throws RemoteException { + System.out.println("onPlayItemResponse "); + } + + @Override + public void onUpdateNowPlayingEntries(long[] playList) throws RemoteException { + System.out.println("onUpdateNowPlayingEntries "); + } + + @Override + public void onUpdateFolderInfoBrowsedPlayer(String stringUri) throws RemoteException { + System.out.println("onUpdateFolderInfoBrowsedPlayer "); + } + + @Override + public void onUpdateNowPlayingContentChange() throws RemoteException { + System.out.println("onUpdateNowPlayingContentChange "); + } + void printUsageMessage() { try { System.out.println("V2Monitoring session " + mController.getTag() diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java index 7465ed92e4692471e288ab8eef1a512f2e52c92f..e0f07962ea372818f37b021051a451fa599f7ce7 100644 --- a/core/java/android/accounts/AccountManager.java +++ b/core/java/android/accounts/AccountManager.java @@ -349,6 +349,7 @@ public class AccountManager { * @return The account's password, null if none or if the account doesn't exist */ public String getPassword(final Account account) { + android.util.SeempLog.record(22); if (account == null) throw new IllegalArgumentException("account is null"); try { return mService.getPassword(account); @@ -376,6 +377,7 @@ public class AccountManager { * @return The user data, null if the account or key doesn't exist */ public String getUserData(final Account account, final String key) { + android.util.SeempLog.record(23); if (account == null) throw new IllegalArgumentException("account is null"); if (key == null) throw new IllegalArgumentException("key is null"); try { @@ -584,6 +586,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.getAuthTokenLabel(mResponse, accountType, authTokenType); } @@ -630,6 +633,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.hasFeatures(mResponse, account, features, mContext.getOpPackageName()); } @Override @@ -684,6 +688,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.getAccountsByFeatures(mResponse, type, features, mContext.getOpPackageName()); } @@ -728,6 +733,7 @@ public class AccountManager { * already exists, the account is null, or another error occurs. */ public boolean addAccountExplicitly(Account account, String password, Bundle userdata) { + android.util.SeempLog.record(24); if (account == null) throw new IllegalArgumentException("account is null"); try { return mService.addAccountExplicitly(account, password, userdata); @@ -797,6 +803,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.renameAccount(mResponse, account, newName); } @Override @@ -856,10 +863,12 @@ public class AccountManager { @Deprecated public AccountManagerFuture removeAccount(final Account account, AccountManagerCallback callback, Handler handler) { + android.util.SeempLog.record(25); if (account == null) throw new IllegalArgumentException("account is null"); return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.removeAccount(mResponse, account, false); } @Override @@ -915,10 +924,12 @@ public class AccountManager { */ public AccountManagerFuture removeAccount(final Account account, final Activity activity, AccountManagerCallback callback, Handler handler) { + android.util.SeempLog.record(28); if (account == null) throw new IllegalArgumentException("account is null"); return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(34); mService.removeAccount(mResponse, account, activity != null); } }.start(); @@ -940,6 +951,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.removeAccountAsUser(mResponse, account, false, userHandle.getIdentifier()); } @Override @@ -966,6 +978,7 @@ public class AccountManager { return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(34); mService.removeAccountAsUser(mResponse, account, activity != null, userHandle.getIdentifier()); } @@ -1079,6 +1092,7 @@ public class AccountManager { * @param password The password to set, null to clear the password */ public void setPassword(final Account account, final String password) { + android.util.SeempLog.record(26); if (account == null) throw new IllegalArgumentException("account is null"); try { mService.setPassword(account, password); @@ -1107,6 +1121,7 @@ public class AccountManager { * @param account The account whose password to clear */ public void clearPassword(final Account account) { + android.util.SeempLog.record(27); if (account == null) throw new IllegalArgumentException("account is null"); try { mService.clearPassword(account); @@ -1134,6 +1149,7 @@ public class AccountManager { * @param value String value to set, {@code null} to clear this user data key */ public void setUserData(final Account account, final String key, final String value) { + android.util.SeempLog.record(28); if (account == null) throw new IllegalArgumentException("account is null"); if (key == null) throw new IllegalArgumentException("key is null"); try { @@ -1284,6 +1300,7 @@ public class AccountManager { return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.getAuthToken(mResponse, account, authTokenType, false /* notifyOnAuthFailure */, true /* expectActivityLaunch */, optionsIn); @@ -1453,6 +1470,7 @@ public class AccountManager { return new AmsTask(null, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.getAuthToken(mResponse, account, authTokenType, notifyAuthFailure, false /* expectActivityLaunch */, optionsIn); } @@ -1513,6 +1531,7 @@ public class AccountManager { final String authTokenType, final String[] requiredFeatures, final Bundle addAccountOptions, final Activity activity, AccountManagerCallback callback, Handler handler) { + android.util.SeempLog.record(29); if (accountType == null) throw new IllegalArgumentException("accountType is null"); final Bundle optionsIn = new Bundle(); if (addAccountOptions != null) { @@ -1523,6 +1542,7 @@ public class AccountManager { return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.addAccount(mResponse, accountType, authTokenType, requiredFeatures, activity != null, optionsIn); } @@ -1548,6 +1568,7 @@ public class AccountManager { return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.addAccountAsUser(mResponse, accountType, authTokenType, requiredFeatures, activity != null, optionsIn, userHandle.getIdentifier()); } @@ -1597,6 +1618,7 @@ public class AccountManager { return new Future2Task(handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(34); mService.copyAccountToUser( mResponse, account, fromUser.getIdentifier(), toUser.getIdentifier()); } @@ -1723,6 +1745,7 @@ public class AccountManager { return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.confirmCredentialsAsUser(mResponse, account, options, activity != null, userId); } @@ -1836,10 +1859,12 @@ public class AccountManager { public AccountManagerFuture editProperties(final String accountType, final Activity activity, final AccountManagerCallback callback, final Handler handler) { + android.util.SeempLog.record(30); if (accountType == null) throw new IllegalArgumentException("accountType is null"); return new AmsTask(activity, handler, callback) { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); mService.editProperties(mResponse, accountType, activity != null); } }.start(); @@ -2227,6 +2252,7 @@ public class AccountManager { @Override public void doWork() throws RemoteException { + android.util.SeempLog.record(31); getAccountsByTypeAndFeatures(mAccountType, mFeatures, new AccountManagerCallback() { @Override diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ae3e0ce201a4856904827f7a104dd85d3898e54d..65aec72b1cd0620136cf9d0d6a327a1b22a1aaed 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -127,6 +127,7 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import android.util.BoostFramework; /** * An activity is a single, focused thing that the user can do. Almost all @@ -689,6 +690,10 @@ public class Activity extends ContextThemeWrapper OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindowDismissedCallback, WindowControllerCallback { private static final String TAG = "Activity"; + private static BoostFramework mPerf = null; + private static int mDragBoostPossible = -1; + private static int mPerfLockDuration = -1; + private static int mAsParamVal[]; private static final boolean DEBUG_LIFECYCLE = false; /** Standard activity result: operation canceled. */ @@ -3055,6 +3060,42 @@ public class Activity extends ContextThemeWrapper * @return boolean Return true if this event was consumed. */ public boolean dispatchTouchEvent(MotionEvent ev) { + if(mDragBoostPossible == -1) { + mDragBoostPossible = 0; + String currentActivity = getPackageName(); + String[] activityList = getResources().getStringArray( + com.android.internal.R.array.boost_activityList); + if(activityList != null){ + for (String match : activityList) { + if (currentActivity.indexOf(match) != -1){ + mDragBoostPossible = 1; + break; + } + } + } + } + + Context context = getApplicationContext(); + if (mPerf == null){ + mPerf = new BoostFramework(); + } + boolean override = mPerf.boostOverride(context, ev, getResources().getDisplayMetrics()); + + if (mDragBoostPossible == 1 && override != true) { + if (mPerf == null){ + mPerf = new BoostFramework(); + } + if(mPerfLockDuration == -1){ + mPerfLockDuration = getResources().getInteger( + com.android.internal.R.integer.ascrollboost_timeout); + mAsParamVal = getResources().getIntArray( + com.android.internal.R.array.ascrollboost_param_value); + } + mPerf.perfLockAcquireTouch(ev, + getResources().getDisplayMetrics(), + mPerfLockDuration, mAsParamVal); + } + if (ev.getAction() == MotionEvent.ACTION_DOWN) { onUserInteraction(); } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index c96bd39eeffe1c46b19b2ba673680ee66cff0c10..5eca0b3fd83e9bc6a26f86e5e5e292b5b82f29aa 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -899,7 +899,8 @@ public class ActivityManager { * @hide */ static public boolean isHighEndGfx() { - return !isLowRamDeviceStatic() && + return !("1".equals(SystemProperties.get("persist.sys.force_sw_gles", "0"))) && + !isLowRamDeviceStatic() && !Resources.getSystem().getBoolean(com.android.internal.R.bool.config_avoidGfxAccel); } diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index c561a1908b213983f2dae42900a27e151f9320f2..602e1f104517b8c75b9fa86bdc85962201a52258 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -33,6 +33,9 @@ import android.util.Log; import libcore.util.ZoneInfoDB; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; /** @@ -106,6 +109,51 @@ public class AlarmManager { */ public static final int ELAPSED_REALTIME = 3; + /** + * Alarm time in {@link System#currentTimeMillis System.currentTimeMillis()} + * (wall clock time in UTC), which will wake up the device when + * it goes off. And it will power on the devices when it shuts down. + * Set as 5 to make it be compatible with android_alarm_type. + * @hide + */ + public static final int RTC_POWEROFF_WAKEUP = 5; + + /** + * File to save value to indicate that power off alarm is set + * @hide + */ + public static final String POWER_OFF_ALARM_SET_FILE = + "/persist/alarm/powerOffAlarmSet"; + /** + * File to indicate that if power off alarm is handled in + * encryption status. + * @hide + */ + public static final String POWER_OFF_ALARM_HANDLE_FILE = + "/persist/alarm/powerOffAlarmHandle"; + /** + * File to save instance time which will handle in encryption status. + * @hide + */ + public static final String POWER_OFF_ALARM_INSTANCE_FILE = + "/persist/alarm/powerOffAlarmInstance"; + /** + * @hide + */ + public static final String POWER_OFF_ALARM_SET = "1"; + /** + * @hide + */ + public static final String POWER_OFF_ALARM_NOT_SET = "0"; + /** + * @hide + */ + public static final String POWER_OFF_ALARM_NOT_HANDLED = "0"; + /** + * @hide + */ + public static final String POWER_OFF_ALARM_HANDLED = "1"; + /** * Broadcast Action: Sent after the value returned by * {@link #getNextAlarmClock()} has changed. @@ -1031,6 +1079,57 @@ public class AlarmManager { } } + + /** + * Read value from power off alarm files + * + * @hide + */ + public static String readPowerOffAlarmFile(String fileName) { + BufferedReader reader = null; + String line = null; + try { + reader = new BufferedReader(new FileReader(fileName)); + line = reader.readLine(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + return line; + } + + + /** + * Write value to power off alarm files + * + * @hide + */ + public static void writePowerOffAlarmFile(String fileName, String value) { + FileWriter writer = null; + try { + writer = new FileWriter(fileName, false); + writer.write(value); + writer.flush(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (writer != null) { + try { + writer.close(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + } + /** * An immutable description of a scheduled "alarm clock" event. * diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java old mode 100644 new mode 100755 index 1e4ffbeca33d7654fb3f6df26071080b5121349e..3f17f26a115561da888944c26734d403173f7757 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -239,8 +239,12 @@ public class AppOpsManager { public static final int OP_GET_ACCOUNTS = 62; /** @hide Control whether an application is allowed to run in the background. */ public static final int OP_RUN_IN_BACKGROUND = 63; + /** @hide CHANGE_WIFI_STATE . */ + public static final int OP_CHANGE_WIFI_STATE = 64; + /** @hide BLUETOOTH_ADMIN . */ + public static final int OP_BLUETOOTH_ADMIN = 65; /** @hide */ - public static final int _NUM_OP = 64; + public static final int _NUM_OP = 66; /** Access to coarse location information. */ public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; @@ -338,6 +342,12 @@ public class AppOpsManager { /** @hide Get device accounts. */ public static final String OPSTR_GET_ACCOUNTS = "android:get_accounts"; + /** @hide CHANGE_WIFI_STATE . */ + public static final String OPSTR_CHANGE_WIFI_STATE + = "android:change_wifi_state"; + /** @hide BLUETOOTH_ADMIN . */ + public static final String OPSTR_BLUETOOTH_ADMIN + = "android:bluetooth_admin"; private static final int[] RUNTIME_PERMISSIONS_OPS = { // Contacts @@ -386,8 +396,8 @@ public class AppOpsManager { */ private static int[] sOpToSwitch = new int[] { OP_COARSE_LOCATION, - OP_COARSE_LOCATION, - OP_COARSE_LOCATION, + OP_FINE_LOCATION, + OP_GPS, OP_VIBRATE, OP_READ_CONTACTS, OP_WRITE_CONTACTS, @@ -426,8 +436,8 @@ public class AppOpsManager { OP_AUDIO_NOTIFICATION_VOLUME, OP_AUDIO_BLUETOOTH_VOLUME, OP_WAKE_LOCK, - OP_COARSE_LOCATION, - OP_COARSE_LOCATION, + OP_FINE_LOCATION, + OP_FINE_LOCATION, OP_GET_USAGE_STATS, OP_MUTE_MICROPHONE, OP_TOAST_WINDOW, @@ -449,6 +459,8 @@ public class AppOpsManager { OP_TURN_SCREEN_ON, OP_GET_ACCOUNTS, OP_RUN_IN_BACKGROUND, + OP_CHANGE_WIFI_STATE, + OP_BLUETOOTH_ADMIN, }; /** @@ -520,6 +532,8 @@ public class AppOpsManager { null, OPSTR_GET_ACCOUNTS, null, + OPSTR_CHANGE_WIFI_STATE, + OPSTR_BLUETOOTH_ADMIN, }; /** @@ -591,6 +605,8 @@ public class AppOpsManager { "TURN_ON_SCREEN", "GET_ACCOUNTS", "RUN_IN_BACKGROUND", + "CHANGE_WIFI_STATE", + "BLUETOOTH_ADMIN", }; /** @@ -662,6 +678,8 @@ public class AppOpsManager { null, // no permission for turning the screen on Manifest.permission.GET_ACCOUNTS, null, // no permission for running in background + android.Manifest.permission.CHANGE_WIFI_STATE, + android.Manifest.permission.BLUETOOTH_ADMIN, }; /** @@ -734,6 +752,8 @@ public class AppOpsManager { null, // TURN_ON_SCREEN null, // GET_ACCOUNTS null, // RUN_IN_BACKGROUND + null, // OP_CHANGE_WIFI_STATE + null, // OP_BLUETOOTH_ADMIN }; /** @@ -805,6 +825,8 @@ public class AppOpsManager { false, // TURN_ON_SCREEN false, // GET_ACCOUNTS false, // RUN_IN_BACKGROUND + false, // OP_CHANGE_WIFI_STATE + false, // OP_BLUETOOTH_ADMIN }; /** @@ -875,6 +897,8 @@ public class AppOpsManager { AppOpsManager.MODE_ALLOWED, // OP_TURN_ON_SCREEN AppOpsManager.MODE_ALLOWED, AppOpsManager.MODE_ALLOWED, // OP_RUN_IN_BACKGROUND + AppOpsManager.MODE_ALLOWED, //OP_CHANGE_WIFI_STATE + AppOpsManager.MODE_ALLOWED, //OP_BLUETOOTH_ADMIN }; /** @@ -949,6 +973,8 @@ public class AppOpsManager { false, false, false, + false, //OP_CHANGE_WIFI_STATE + false, //OP_BLUETOOTH_ADMIN }; /** diff --git a/core/java/android/app/IAlarmManager.aidl b/core/java/android/app/IAlarmManager.aidl index 7b05b4918103be8cce5535b20f48e9eb64d232c1..ab45e29151ea4cd66ee543355262aad7dc5b9abe 100644 --- a/core/java/android/app/IAlarmManager.aidl +++ b/core/java/android/app/IAlarmManager.aidl @@ -37,4 +37,6 @@ interface IAlarmManager { void remove(in PendingIntent operation, in IAlarmListener listener); long getNextWakeFromIdleTime(); AlarmManager.AlarmClockInfo getNextAlarmClock(int userId); + // update the uids being synchronized by network socket request manager + void updateBlockedUids(int uid, boolean isBlocked); } diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java index 95ea2a561bbeeed6f16748616d5f94176afa9a39..5c2aa37df1bc334cfbd5bc22847b55d4b1e7d0d4 100644 --- a/core/java/android/app/Instrumentation.java +++ b/core/java/android/app/Instrumentation.java @@ -385,6 +385,7 @@ public class Instrumentation { * @see Context#startActivity */ public Activity startActivitySync(Intent intent) { + android.util.SeempLog.record_str(376, intent.toString()); validateNotAppThread(); synchronized (mSync) { @@ -1492,6 +1493,7 @@ public class Instrumentation { public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options) { + android.util.SeempLog.record_str(377, intent.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; Uri referrer = target != null ? target.onProvideReferrer() : null; if (referrer != null) { @@ -1552,6 +1554,7 @@ public class Instrumentation { public void execStartActivitiesAsUser(Context who, IBinder contextThread, IBinder token, Activity target, Intent[] intents, Bundle options, int userId) { + android.util.SeempLog.record_str(378, intents.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { @@ -1615,6 +1618,7 @@ public class Instrumentation { public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, String target, Intent intent, int requestCode, Bundle options) { + android.util.SeempLog.record_str(377, intent.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { @@ -1675,6 +1679,7 @@ public class Instrumentation { public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options, UserHandle user) { + android.util.SeempLog.record_str(377, intent.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { @@ -1714,6 +1719,7 @@ public class Instrumentation { Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options, boolean ignoreTargetSecurity, int userId) { + android.util.SeempLog.record_str(379, intent.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { @@ -1752,6 +1758,7 @@ public class Instrumentation { public void execStartActivityFromAppTask( Context who, IBinder contextThread, IAppTask appTask, Intent intent, Bundle options) { + android.util.SeempLog.record_str(380, intent.toString()); IApplicationThread whoThread = (IApplicationThread) contextThread; if (mActivityMonitors != null) { synchronized (mSync) { diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index bc8280681e4a1ccd1db2d3cbb75dbd1991dec5ba..44b1487f0825f2b0d985bc82350df2bc55d2a4d1 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -634,8 +634,11 @@ public abstract class BackupAgent extends ContextWrapper { // Pull out the domain and set it aside to use when making the tarball. String domainPath = FullBackup.getBackupScheme(this).tokenToDirectoryPath(domain); if (domainPath == null) { - // Should never happen. - return; + if (startingPath == null) { + return; + } else { + domainPath = startingPath; + } } File rootFile = new File(startingPath); diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 47ae68796f65dd1e30922536e1a01db8a3591d00..9c9b8340aca288a864aa41e2dbcc96d839f2708b 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -545,6 +545,7 @@ public final class BluetoothAdapter { * @throws IllegalArgumentException if address is invalid */ public BluetoothDevice getRemoteDevice(String address) { + android.util.SeempLog.record(62); return new BluetoothDevice(address); } @@ -560,6 +561,7 @@ public final class BluetoothAdapter { * @throws IllegalArgumentException if address is invalid */ public BluetoothDevice getRemoteDevice(byte[] address) { + android.util.SeempLog.record(62); if (address == null || address.length != 6) { throw new IllegalArgumentException("Bluetooth address must have 6 bytes"); } @@ -799,6 +801,7 @@ public final class BluetoothAdapter { public int getState() { int state = BluetoothAdapter.STATE_OFF; + android.util.SeempLog.record(63); try { mServiceLock.readLock().lock(); if (mService != null) { @@ -897,6 +900,7 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public boolean enable() { + android.util.SeempLog.record(56); if (isEnabled() == true) { if (DBG) Log.d(TAG, "enable(): BT is already enabled..!"); return true; @@ -933,6 +937,7 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public boolean disable() { + android.util.SeempLog.record(57); try { return mManagerService.disable(true); } catch (RemoteException e) {Log.e(TAG, "", e);} @@ -950,6 +955,7 @@ public final class BluetoothAdapter { * @hide */ public boolean disable(boolean persist) { + android.util.SeempLog.record(57); try { return mManagerService.disable(persist); @@ -1221,6 +1227,7 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN) public boolean startDiscovery() { + android.util.SeempLog.record(58); if (getState() != STATE_ON) return false; try { mServiceLock.readLock().lock(); @@ -1479,6 +1486,7 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH) public Set getBondedDevices() { + android.util.SeempLog.record(61); if (getState() != STATE_ON) { return toDeviceSet(new BluetoothDevice[0]); } @@ -1537,6 +1545,7 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH) public int getProfileConnectionState(int profile) { + android.util.SeempLog.record(64); if (getState() != STATE_ON) return BluetoothProfile.STATE_DISCONNECTED; try { mServiceLock.readLock().lock(); @@ -1660,6 +1669,7 @@ public final class BluetoothAdapter { @RequiresPermission(Manifest.permission.BLUETOOTH) public BluetoothServerSocket listenUsingInsecureRfcommWithServiceRecord(String name, UUID uuid) throws IOException { + android.util.SeempLog.record(59); return createNewRfcommSocketAndRecord(name, uuid, false, false); } @@ -1832,6 +1842,35 @@ public final class BluetoothAdapter { return listenUsingL2capOn(port, false, false); } + + /** + * Construct an insecure L2CAP server socket. + * Call #accept to retrieve connections to this socket. + *

To auto assign a port without creating a SDP record use + * {@link SOCKET_CHANNEL_AUTO_STATIC_NO_SDP} as port number. + * @param port the PSM to listen on + * @return An L2CAP BluetoothServerSocket + * @throws IOException On error, for example Bluetooth not available, or + * insufficient permissions. + * @hide + */ + public BluetoothServerSocket listenUsingInsecureL2capOn(int port) throws IOException { + BluetoothServerSocket socket = new BluetoothServerSocket( + BluetoothSocket.TYPE_L2CAP, false, false, port, false, false); + int errno = socket.mSocket.bindListen(); + if(port == SOCKET_CHANNEL_AUTO_STATIC_NO_SDP) { + socket.setChannel(socket.mSocket.getPort()); + } + if (errno != 0) { + //TODO(BT): Throw the same exception error code + // that the previous code was using. + //socket.mSocket.throwErrnoNative(errno); + throw new IOException("Error: " + errno); + } + return socket; + + } + /** * Read the local Out of Band Pairing Data *

Requires {@link android.Manifest.permission#BLUETOOTH} @@ -1910,6 +1949,9 @@ public final class BluetoothAdapter { } else if (profile == BluetoothProfile.PAN) { BluetoothPan pan = new BluetoothPan(context, listener); return true; + } else if (profile == BluetoothProfile.DUN) { + BluetoothDun dun = new BluetoothDun(context, listener); + return true; } else if (profile == BluetoothProfile.HEALTH) { BluetoothHealth health = new BluetoothHealth(context, listener); return true; @@ -1969,6 +2011,10 @@ public final class BluetoothAdapter { BluetoothPan pan = (BluetoothPan)proxy; pan.close(); break; + case BluetoothProfile.DUN: + BluetoothDun dun = (BluetoothDun)proxy; + dun.close(); + break; case BluetoothProfile.HEALTH: BluetoothHealth health = (BluetoothHealth)proxy; health.close(); @@ -2038,6 +2084,8 @@ public final class BluetoothAdapter { } synchronized (mProxyServiceStateCallbacks) { + Log.d(TAG, "onBluetoothServiceDown: Sending callbacks to " + + mProxyServiceStateCallbacks.size() + " clients"); for (IBluetoothManagerCallback cb : mProxyServiceStateCallbacks ){ try { if (cb != null) { @@ -2045,11 +2093,10 @@ public final class BluetoothAdapter { } else { Log.d(TAG, "onBluetoothServiceDown: cb is null!!!"); } - } catch (Exception e) { - Log.e(TAG,"",e); - } + } catch (Exception e) { Log.e(TAG,"",e);} } } + Log.d(TAG, "onBluetoothServiceDown: Finished sending callbacks to registered clients"); } public void onBrEdrDown() { diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index f43fb30abb186e84a1ee6677153765c61fe1bf87..87be4a8d7a3d4911871ec472f111e610ebb6250a 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1400,6 +1400,27 @@ public final class BluetoothDevice implements Parcelable { null); } + /** + * Create an L2cap {@link BluetoothSocket} ready to start an insecure + * outgoing connection to this remote device on given channel. + *

The remote device will be not authenticated and communication on this + * socket will not be encrypted. + *

Use {@link BluetoothSocket#connect} to initiate the outgoing + * connection. + *

Valid L2CAP PSM channels are in range 1 to 2^16. + *

Requires {@link android.Manifest.permission#BLUETOOTH} + * + * @param channel L2cap PSM/channel to connect to + * @return a RFCOMM BluetoothServerSocket ready for an outgoing connection + * @throws IOException on error, for example Bluetooth not available, or + * insufficient permissions + * @hide + */ + public BluetoothSocket createInsecureL2capSocket(int channel) throws IOException { + return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, false, false, this, channel, + null); + } + /** * Create an RFCOMM {@link BluetoothSocket} ready to start a secure * outgoing connection to this remote device using SDP lookup of uuid. diff --git a/core/java/android/bluetooth/BluetoothDevicePicker.java b/core/java/android/bluetooth/BluetoothDevicePicker.java index c794be2e2c9efc48a3114a2aea626e1c008c3d0e..51d14cc0a117abea94c7879fc939a0121cd78a9d 100644 --- a/core/java/android/bluetooth/BluetoothDevicePicker.java +++ b/core/java/android/bluetooth/BluetoothDevicePicker.java @@ -43,6 +43,14 @@ public interface BluetoothDevicePicker { public static final String ACTION_DEVICE_SELECTED = "android.bluetooth.devicepicker.action.DEVICE_SELECTED"; + /** + * Broadcast when no BT device is selected from BT device picker screen. + * This happens when user presses back button. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_DEVICE_NOT_SELECTED = + "org.codeaurora.bluetooth.devicepicker.action.DEVICE_NOT_SELECTED"; + /** * Broadcast when someone want to select one BT device from devices list. * This intent contains below extra data: diff --git a/core/java/android/bluetooth/BluetoothDun.java b/core/java/android/bluetooth/BluetoothDun.java new file mode 100644 index 0000000000000000000000000000000000000000..09120610caa3f893e583f69c27b3d95df78c72fe --- /dev/null +++ b/core/java/android/bluetooth/BluetoothDun.java @@ -0,0 +1,296 @@ +/* +*Copyright (c) 2013, The Linux Foundation. All rights reserved. +* +*Redistribution and use in source and binary forms, with or without +*modification, are permitted provided that the following conditions are +*met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +*THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +*WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +*MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +*ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +*BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +*CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +*SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +*WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +*OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +*IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +package android.bluetooth; + +import android.annotation.SdkConstant; +import android.annotation.SdkConstant.SdkConstantType; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.os.RemoteException; +import android.util.Log; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class provides the APIs to control the Bluetooth Dun + * Profile. + * + *

BluetoothDun is a proxy object for controlling the Bluetooth DUN + * Service via IPC. Use {@link BluetoothAdapter#getProfileProxy} to get + * the BluetoothDun proxy object. + * + *

Each method is protected with its appropriate permission. + *@hide + */ +public final class BluetoothDun implements BluetoothProfile { + private static final String TAG = "BluetoothDun"; + private static final boolean DBG = false; + private static final boolean VDBG = false; + + /** + * Intent used to broadcast the change in connection state of the Dun + * profile. + * + *

This intent will have 3 extras: + *

    + *
  • {@link #EXTRA_STATE} - The current state of the profile.
  • + *
  • {@link #EXTRA_PREVIOUS_STATE}- The previous state of the profile.
  • + *
  • {@link BluetoothDevice#EXTRA_DEVICE} - The remote device.
  • + *
+ * + *

{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of + * {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTED}. + * + *

Requires {@link android.Manifest.permission#BLUETOOTH} permission to + * receive. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_CONNECTION_STATE_CHANGED = + "codeaurora.bluetooth.dun.profile.action.CONNECTION_STATE_CHANGED"; + + private Context mContext; + private ServiceListener mServiceListener; + private BluetoothAdapter mAdapter; + private IBluetoothDun mDunService; + + /** + * Create a BluetoothDun proxy object for interacting with the local + * Bluetooth Service which handles the Dun profile + * + */ + /*package*/ BluetoothDun(Context context, ServiceListener l) { + mContext = context; + mServiceListener = l; + mAdapter = BluetoothAdapter.getDefaultAdapter(); + try { + mAdapter.getBluetoothManager().registerStateChangeCallback(mStateChangeCallback); + } catch (RemoteException re) { + Log.w(TAG,"Unable to register BluetoothStateChangeCallback",re); + } + Log.d(TAG, "BluetoothDun() call bindService"); + doBind(); + } + + boolean doBind() { + Intent intent = new Intent(IBluetoothDun.class.getName()); + ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); + intent.setComponent(comp); + if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, + android.os.Process.myUserHandle())) { + Log.e(TAG, "Could not bind to Bluetooth Dun Service with " + intent); + return false; + } + return true; + } + + + /*package*/ void close() { + if (VDBG) log("close()"); + mServiceListener = null; + IBluetoothManager mgr = mAdapter.getBluetoothManager(); + if (mgr != null) { + try { + mgr.unregisterStateChangeCallback(mStateChangeCallback); + } catch (RemoteException re) { + Log.w(TAG,"Unable to unregister BluetoothStateChangeCallback",re); + } + } + + synchronized (mConnection) { + if ( mDunService != null) { + try { + mDunService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } + } + + protected void finalize() { + close(); + } + + private IBluetoothStateChangeCallback mStateChangeCallback = + new IBluetoothStateChangeCallback.Stub() { + + @Override + public void onBluetoothStateChange(boolean on) { + //Handle enable request to bind again. + Log.d(TAG, "onBluetoothStateChange on: " + on); + if (on) { + try { + if (mDunService == null) { + Log.d(TAG, "onBluetoothStateChange call bindService"); + doBind(); + } + } catch (IllegalStateException e) { + Log.e(TAG,"onBluetoothStateChange: could not bind to DUN service: ", e); + } catch (SecurityException e) { + Log.e(TAG,"onBluetoothStateChange: could not bind to DUN service: ", e); + } + } else { + if (VDBG) Log.d(TAG,"Unbinding service..."); + synchronized (mConnection) { + if ( mDunService != null) { + try { + mDunService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } + } + } + }; + + /** + * Initiate disconnection from DUN server. + * + *

Once the disconnection is initiated by any device either local host + * or remote device, the state will transition from {@link #STATE_CONNECTED} + * to {@link #STATE_DISCONNECTED}. + * + *

Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} + * permission. + * + * @param device Remote Bluetooth Device + * @return false on immediate error, + * true otherwise + * @hide + */ + public boolean disconnect(BluetoothDevice device) { + if (DBG) log("disconnect(" + device + ")"); + if (mDunService != null && isEnabled() && + isValidDevice(device)) { + try { + return mDunService.disconnect(device); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return false; + } + } + if (mDunService == null) Log.w(TAG, "Proxy not attached to service"); + return false; + } + /** + * {@inheritDoc} + */ + public List getConnectedDevices() { + if (VDBG) log("getConnectedDevices()"); + if (mDunService != null && isEnabled()) { + try { + return mDunService.getConnectedDevices(); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return new ArrayList(); + } + } + if (mDunService == null) Log.w(TAG, "Proxy not attached to service"); + return new ArrayList(); + } + + /** + * {@inheritDoc} + */ + public List getDevicesMatchingConnectionStates(int[] states) { + if (VDBG) log("getDevicesMatchingStates()"); + if (mDunService != null && isEnabled()) { + try { + return mDunService.getDevicesMatchingConnectionStates(states); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return new ArrayList(); + } + } + if (mDunService == null) Log.w(TAG, "Proxy not attached to service"); + return new ArrayList(); + } + + /** + * {@inheritDoc} + */ + public int getConnectionState(BluetoothDevice device) { + if (VDBG) log("getState(" + device + ")"); + if (mDunService != null && isEnabled() + && isValidDevice(device)) { + try { + return mDunService.getConnectionState(device); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return BluetoothProfile.STATE_DISCONNECTED; + } + } + if (mDunService == null) Log.w(TAG, "Proxy not attached to service"); + return BluetoothProfile.STATE_DISCONNECTED; + } + + private ServiceConnection mConnection = new ServiceConnection() { + public void onServiceConnected(ComponentName className, IBinder service) { + if (DBG) Log.d(TAG, "BluetoothDUN Proxy object connected"); + mDunService = IBluetoothDun.Stub.asInterface(service); + + if (mServiceListener != null) { + mServiceListener.onServiceConnected(BluetoothProfile.DUN, + BluetoothDun.this); + } + } + public void onServiceDisconnected(ComponentName className) { + if (DBG) Log.d(TAG, "BluetoothDUN Proxy object disconnected"); + mDunService = null; + if (mServiceListener != null) { + mServiceListener.onServiceDisconnected(BluetoothProfile.DUN); + } + } + }; + + private boolean isEnabled() { + if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true; + return false; + } + + private boolean isValidDevice(BluetoothDevice device) { + if (device == null) return false; + + if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true; + return false; + } + + private static void log(String msg) { + Log.d(TAG, msg); + } +} diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index 09a15de8778e57756f8cbe3123bd8939dc3bc381..da810329aa60ed45940da50ab672221a992a94cf 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -20,11 +20,11 @@ import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; import android.content.ComponentName; import android.content.Context; -import android.os.Handler; +import android.content.Intent; +import android.content.ServiceConnection; import android.os.IBinder; -import android.os.Looper; -import android.os.Message; import android.os.RemoteException; +import android.os.UserHandle; import android.util.Log; import java.util.ArrayList; @@ -47,7 +47,7 @@ import java.util.List; public final class BluetoothHeadset implements BluetoothProfile { private static final String TAG = "BluetoothHeadset"; private static final boolean DBG = true; - private static final boolean VDBG = false; + private static final boolean VDBG = true; /** * Intent used to broadcast the change in connection state of the Headset @@ -128,6 +128,13 @@ public final class BluetoothHeadset implements BluetoothProfile { public static final String ACTION_VENDOR_SPECIFIC_HEADSET_EVENT = "android.bluetooth.headset.action.VENDOR_SPECIFIC_HEADSET_EVENT"; + /** + * @hide Broadcast intent when HF indicator value changed is updated by HS. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_HF_INDICATOR_VALUE_CHANGED = + "codeaurora.bluetooth.headset.action.ACTION_HF_INDICATOR_VALUE_CHANGED"; + /** * A String extra field in {@link #ACTION_VENDOR_SPECIFIC_HEADSET_EVENT} * intents that contains the name of the vendor-specific command. @@ -198,6 +205,20 @@ public final class BluetoothHeadset implements BluetoothProfile { */ public static final String VENDOR_RESULT_CODE_COMMAND_ANDROID = "+ANDROID"; + /** + * @hide Used for sharing the HF indicator assigned number. + */ + public static final String HF_INDICATOR_ASSIGNED_NUMBER = + "codeaurora.bluetooth.headset.intent.category.anum"; + + + /** + * @hide Used for sharing the HF indicator assigned number's value. + */ + public static final String HF_INDICATOR_ASSIGNED_NUMBER_VALUE = + "codeaurora.bluetooth.headset.intent.category.anumvalue"; + + /** * Headset state when SCO audio is not connected. * This state can be one of @@ -222,8 +243,6 @@ public final class BluetoothHeadset implements BluetoothProfile { */ public static final int STATE_AUDIO_CONNECTED = 12; - private static final int MESSAGE_HEADSET_SERVICE_CONNECTED = 100; - private static final int MESSAGE_HEADSET_SERVICE_DISCONNECTED = 101; private Context mContext; private ServiceListener mServiceListener; @@ -236,7 +255,14 @@ public final class BluetoothHeadset implements BluetoothProfile { if (DBG) Log.d(TAG, "onBluetoothStateChange: up=" + up); if (!up) { if (VDBG) Log.d(TAG,"Unbinding service..."); - doUnbind(); + synchronized (mConnection) { + try { + mService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } } else { synchronized (mConnection) { try { @@ -273,26 +299,15 @@ public final class BluetoothHeadset implements BluetoothProfile { } boolean doBind() { - try { - return mAdapter.getBluetoothManager().bindBluetoothProfileService( - BluetoothProfile.HEADSET, mConnection); - } catch (RemoteException e) { - Log.e(TAG, "Unable to bind HeadsetService", e); - } - return false; - } - - void doUnbind() { - synchronized (mConnection) { - if (mService != null) { - try { - mAdapter.getBluetoothManager().unbindBluetoothProfileService( - BluetoothProfile.HEADSET, mConnection); - } catch (RemoteException e) { - Log.e(TAG,"Unable to unbind HeadsetService", e); - } - } + Intent intent = new Intent(IBluetoothHeadset.class.getName()); + ComponentName comp = intent.resolveSystemService(mContext.getPackageManager(), 0); + intent.setComponent(comp); + if (comp == null || !mContext.bindServiceAsUser(intent, mConnection, 0, + UserHandle.CURRENT_OR_SELF)) { + Log.e(TAG, "Could not bind to Bluetooth Headset Service with " + intent); + return false; } + return true; } /** @@ -312,8 +327,18 @@ public final class BluetoothHeadset implements BluetoothProfile { Log.e(TAG,"",e); } } + + synchronized (mConnection) { + if (mService != null) { + try { + mService = null; + mContext.unbindService(mConnection); + } catch (Exception re) { + Log.e(TAG,"",re); + } + } + } mServiceListener = null; - doUnbind(); } /** @@ -969,21 +994,21 @@ public final class BluetoothHeadset implements BluetoothProfile { return false; } - private final IBluetoothProfileServiceConnection mConnection - = new IBluetoothProfileServiceConnection.Stub() { - @Override + private final ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { if (DBG) Log.d(TAG, "Proxy object connected"); mService = IBluetoothHeadset.Stub.asInterface(service); - mHandler.sendMessage(mHandler.obtainMessage( - MESSAGE_HEADSET_SERVICE_CONNECTED)); + + if (mServiceListener != null) { + mServiceListener.onServiceConnected(BluetoothProfile.HEADSET, BluetoothHeadset.this); + } } - @Override public void onServiceDisconnected(ComponentName className) { if (DBG) Log.d(TAG, "Proxy object disconnected"); mService = null; - mHandler.sendMessage(mHandler.obtainMessage( - MESSAGE_HEADSET_SERVICE_DISCONNECTED)); + if (mServiceListener != null) { + mServiceListener.onServiceDisconnected(BluetoothProfile.HEADSET); + } } }; @@ -1007,25 +1032,4 @@ public final class BluetoothHeadset implements BluetoothProfile { private static void log(String msg) { Log.d(TAG, msg); } - - private final Handler mHandler = new Handler(Looper.getMainLooper()) { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MESSAGE_HEADSET_SERVICE_CONNECTED: { - if (mServiceListener != null) { - mServiceListener.onServiceConnected(BluetoothProfile.HEADSET, - BluetoothHeadset.this); - } - break; - } - case MESSAGE_HEADSET_SERVICE_DISCONNECTED: { - if (mServiceListener != null) { - mServiceListener.onServiceDisconnected(BluetoothProfile.HEADSET); - } - break; - } - } - } - }; } diff --git a/core/java/android/bluetooth/BluetoothHeadsetClient.java b/core/java/android/bluetooth/BluetoothHeadsetClient.java index 874026fb157d859acf2fb29438b19a46f581238b..484a856539b860b051aafc4ccb270e6dcf6616b7 100644 --- a/core/java/android/bluetooth/BluetoothHeadsetClient.java +++ b/core/java/android/bluetooth/BluetoothHeadsetClient.java @@ -100,7 +100,9 @@ public final class BluetoothHeadsetClient implements BluetoothProfile { * {@link #EXTRA_BATTERY_LEVEL}, * {@link #EXTRA_OPERATOR_NAME}, * {@link #EXTRA_VOICE_RECOGNITION}, - * {@link #EXTRA_IN_BAND_RING}

+ * {@link #EXTRA_IN_BAND_RING} + * {@link #EXTRA_MANF_ID} + * {@link #EXTRA_MANF_MODEL}

*/ public static final String ACTION_AG_EVENT = "android.bluetooth.headsetclient.profile.action.AG_EVENT"; @@ -205,6 +207,21 @@ public final class BluetoothHeadsetClient implements BluetoothProfile { public static final String EXTRA_SUBSCRIBER_INFO = "android.bluetooth.headsetclient.extra.SUBSCRIBER_INFO"; + /** + * Extra for AG_EVENT intent indicates manufacturer identification. + *

Value: String containing manufacturer identification.

+ */ + public static final String EXTRA_MANF_ID = + "android.bluetooth.headsetclient.extra.MANF_ID"; + + /** + * Extra for AG_EVENT intent indicates manufacturer model. + *

Value: String containing manufacturer model.

+ */ + public static final String EXTRA_MANF_MODEL = + "android.bluetooth.headsetclient.extra.MANF_MODEL"; + + /** * Extra for AG_CALL_CHANGED intent indicates the * {@link BluetoothHeadsetClientCall} object that has changed. diff --git a/core/java/android/bluetooth/BluetoothInputDevice.java b/core/java/android/bluetooth/BluetoothInputDevice.java index 252e3d28a25e8b8160dedfb3d1eef35307d6d1a6..db23ef548998040cdee7ea5adfaa8f543ece708a 100644 --- a/core/java/android/bluetooth/BluetoothInputDevice.java +++ b/core/java/android/bluetooth/BluetoothInputDevice.java @@ -96,6 +96,12 @@ public final class BluetoothInputDevice implements BluetoothProfile { public static final String ACTION_VIRTUAL_UNPLUG_STATUS = "android.bluetooth.input.profile.action.VIRTUAL_UNPLUG_STATUS"; + /** + * @hide + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_IDLE_TIME_CHANGED = + "codeaurora.bluetooth.input.profile.action.IDLE_TIME_CHANGED"; /** * Return codes for the connect and disconnect Bluez / Dbus calls. @@ -199,6 +205,11 @@ public final class BluetoothInputDevice implements BluetoothProfile { */ public static final String EXTRA_VIRTUAL_UNPLUG_STATUS = "android.bluetooth.BluetoothInputDevice.extra.VIRTUAL_UNPLUG_STATUS"; + /** + * @hide + */ + public static final String EXTRA_IDLE_TIME = "codeaurora.bluetooth.BluetoothInputDevice.extra.IDLE_TIME"; + private Context mContext; private ServiceListener mServiceListener; private BluetoothAdapter mAdapter; @@ -658,6 +669,56 @@ public final class BluetoothInputDevice implements BluetoothProfile { if (mService == null) Log.w(TAG, "Proxy not attached to service"); return false; } + + /** + * Send Get_Idle_Time command to the connected HID input device. + * + *

Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission. + * + * @param device Remote Bluetooth Device + * @return false on immediate error, + * true otherwise + * @hide + */ + public boolean getIdleTime(BluetoothDevice device) { + if (DBG) log("getIdletime(" + device + ")"); + if (mService != null && isEnabled() && isValidDevice(device)) { + try { + return mService.getIdleTime(device); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return false; + } + } + if (mService == null) Log.w(TAG, "Proxy not attached to service"); + return false; + } + + /** + * Send Set_Idle_Time command to the connected HID input device. + * + *

Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission. + * + * @param device Remote Bluetooth Device + * @param idleTime Idle time to be set on HID Device + * @return false on immediate error, + * true otherwise + * @hide + */ + public boolean setIdleTime(BluetoothDevice device, byte idleTime) { + if (DBG) log("setIdletime(" + device + "), idleTime=" + idleTime); + if (mService != null && isEnabled() && isValidDevice(device)) { + try { + return mService.setIdleTime(device, idleTime); + } catch (RemoteException e) { + Log.e(TAG, "Stack:" + Log.getStackTraceString(new Throwable())); + return false; + } + } + if (mService == null) Log.w(TAG, "Proxy not attached to service"); + return false; + } + private static void log(String msg) { Log.d(TAG, msg); } diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java index eee66d193fe43322dec16c7489c2bb21b814232a..da79b586cf66d52c94c09935d4663831bff78cff 100644 --- a/core/java/android/bluetooth/BluetoothProfile.java +++ b/core/java/android/bluetooth/BluetoothProfile.java @@ -136,6 +136,12 @@ public interface BluetoothProfile { */ public static final int PBAP_CLIENT = 17; + /** + * DUN + * @hide + */ + public static final int DUN = 21; + /** * Default priority for devices that we try to auto-connect to and * and allow incoming connections for the profile diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index ae12c88ff2336fe808ff5fba7545fd194cfc4a69..eae6e8db0a650f83492414c06048a727cf684a57 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -248,6 +248,7 @@ public final class BluetoothSocket implements Closeable { as.mSocketOS = as.mSocket.getOutputStream(); as.mAddress = RemoteAddr; as.mDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(RemoteAddr); + as.mPort = mPort; return as; } /** @@ -469,6 +470,61 @@ public final class BluetoothSocket implements Closeable { return acceptedSocket; } + /** + * setSocketOpt for the Buetooth Socket. + * + * @param optionName socket option name + * @param optionVal socket option value + * @param optionLen socket option length + * @return -1 on immediate error, + * 0 otherwise + * @hide + */ + public int setSocketOpt(int optionName, byte [] optionVal, int optionLen) throws IOException { + int ret = 0; + if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed"); + IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null); + if (bluetoothProxy == null) { + Log.e(TAG, "setSocketOpt fail, reason: bluetooth is off"); + return -1; + } + try { + if(VDBG) Log.d(TAG, "setSocketOpt(), mType: " + mType + " mPort: " + mPort); + ret = bluetoothProxy.setSocketOpt(mType, mPort, optionName, optionVal, optionLen); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return -1; + } + return ret; + } + + /** + * getSocketOpt for the Buetooth Socket. + * + * @param optionName socket option name + * @param optionVal socket option value + * @return -1 on immediate error, + * length of returned socket option otherwise + * @hide + */ + public int getSocketOpt(int optionName, byte [] optionVal) throws IOException { + int ret = 0; + if (mSocketState == SocketState.CLOSED) throw new IOException("socket closed"); + IBluetooth bluetoothProxy = BluetoothAdapter.getDefaultAdapter().getBluetoothService(null); + if (bluetoothProxy == null) { + Log.e(TAG, "getSocketOpt fail, reason: bluetooth is off"); + return -1; + } + try { + if(VDBG) Log.d(TAG, "getSocketOpt(), mType: " + mType + " mPort: " + mPort); + ret = bluetoothProxy.getSocketOpt(mType, mPort, optionName, optionVal); + } catch (RemoteException e) { + Log.e(TAG, Log.getStackTraceString(new Throwable())); + return -1; + } + return ret; + } + /*package*/ int available() throws IOException { if (VDBG) Log.d(TAG, "available: " + mSocketIS); return mSocketIS.available(); diff --git a/core/java/android/bluetooth/IBluetooth.aidl b/core/java/android/bluetooth/IBluetooth.aidl index a4205396367809991042b3b4e187cb64858f8650..3049255f81ac2351d64cdf8f596299014300307c 100644 --- a/core/java/android/bluetooth/IBluetooth.aidl +++ b/core/java/android/bluetooth/IBluetooth.aidl @@ -115,4 +115,7 @@ interface IBluetooth void onLeServiceUp(); void onBrEdrDown(); + + int setSocketOpt(int type, int port, int optionName, in byte [] optionVal, int optionLen); + int getSocketOpt(int type, int port, int optionName, out byte [] optionVal); } diff --git a/core/java/android/bluetooth/IBluetoothDun.aidl b/core/java/android/bluetooth/IBluetoothDun.aidl new file mode 100644 index 0000000000000000000000000000000000000000..a4f2017cc81be1cb3951c44c608b2e8a424cdaf4 --- /dev/null +++ b/core/java/android/bluetooth/IBluetoothDun.aidl @@ -0,0 +1,45 @@ +/* +*Copyright (c) 2013, The Linux Foundation. All rights reserved. +* +*Redistribution and use in source and binary forms, with or without +*modification, are permitted provided that the following conditions are +*met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +*THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +*WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +*MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +*ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +*BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +*CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +*SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +*WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +*OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +*IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package android.bluetooth; + +import android.bluetooth.BluetoothDevice; + +/** + * API for Bluetooth Dun service + * + * {@hide} + */ +interface IBluetoothDun { + // Public API + boolean disconnect(in BluetoothDevice device); + int getConnectionState(in BluetoothDevice device); + List getConnectedDevices(); + List getDevicesMatchingConnectionStates(in int[] states); +} diff --git a/core/java/android/bluetooth/IBluetoothInputDevice.aidl b/core/java/android/bluetooth/IBluetoothInputDevice.aidl index 1ebb9ca6eb12dc7743c776c89e4d2045e2d87683..5bd3f7819323da6920ca3e87d64814fd1890b98d 100644 --- a/core/java/android/bluetooth/IBluetoothInputDevice.aidl +++ b/core/java/android/bluetooth/IBluetoothInputDevice.aidl @@ -56,4 +56,12 @@ interface IBluetoothInputDevice { * @hide */ boolean sendData(in BluetoothDevice device, String report); + /** + * @hide + */ + boolean getIdleTime(in BluetoothDevice device); + /** + * @hide + */ + boolean setIdleTime(in BluetoothDevice device, byte idleTime); } diff --git a/core/java/android/bluetooth/IBluetoothManager.aidl b/core/java/android/bluetooth/IBluetoothManager.aidl index 0b81ee8c547e34c7193ef9bdefd60b53b321c424..5b7d29a05878d1354bbbac2d02cf7a91f0d01d44 100644 --- a/core/java/android/bluetooth/IBluetoothManager.aidl +++ b/core/java/android/bluetooth/IBluetoothManager.aidl @@ -19,7 +19,6 @@ package android.bluetooth; import android.bluetooth.IBluetooth; import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothManagerCallback; -import android.bluetooth.IBluetoothProfileServiceConnection; import android.bluetooth.IBluetoothStateChangeCallback; /** @@ -39,9 +38,6 @@ interface IBluetoothManager boolean disable(boolean persist); IBluetoothGatt getBluetoothGatt(); - boolean bindBluetoothProfileService(int profile, IBluetoothProfileServiceConnection proxy); - void unbindBluetoothProfileService(int profile, IBluetoothProfileServiceConnection proxy); - String getAddress(); String getName(); diff --git a/core/java/android/bluetooth/IBluetoothProfileServiceConnection.aidl b/core/java/android/bluetooth/IBluetoothProfileServiceConnection.aidl deleted file mode 100755 index 96c59e239151533d4a92b1b5ba7fbda5f3bd5c34..0000000000000000000000000000000000000000 --- a/core/java/android/bluetooth/IBluetoothProfileServiceConnection.aidl +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2014 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.bluetooth; - -import android.content.ComponentName; -import android.os.IBinder; - -/** - * Callback for bluetooth profile connections. - * - * {@hide} - */ -interface IBluetoothProfileServiceConnection { - void onServiceConnected(in ComponentName comp, in IBinder service); - void onServiceDisconnected(in ComponentName comp); -} diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index c8d89204d8d4889b873b943597b9eb89e1e0cc3f..f1f71950e3326ca5aa88592892cbae8fbf1bf2f9 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -469,6 +469,7 @@ public abstract class ContentResolver { public final @Nullable Cursor query(@RequiresPermission.Read @NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { + android.util.SeempLog.record_uri(13, uri); return query(uri, projection, selection, selectionArgs, sortOrder, null); } @@ -510,6 +511,7 @@ public abstract class ContentResolver { @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder, @Nullable CancellationSignal cancellationSignal) { + android.util.SeempLog.record_uri(13, uri); Preconditions.checkNotNull(uri, "uri"); IContentProvider unstableProvider = acquireUnstableProvider(uri); if (unstableProvider == null) { @@ -1264,6 +1266,7 @@ public abstract class ContentResolver { */ public final @Nullable Uri insert(@RequiresPermission.Write @NonNull Uri url, @Nullable ContentValues values) { + android.util.SeempLog.record_uri(37, url); Preconditions.checkNotNull(url, "url"); IContentProvider provider = acquireProvider(url); if (provider == null) { diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index b7364e2997844a6fb0071097b58410382294e39a..cf30f0c4787496ba85f3fd6c202d8c228b245f80 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -541,6 +541,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public int privateFlags; + /** + * Boolean indicating whether the resolution of the SurfaceView associated + * with this appplication can be overriden. + * {@hide} + */ + public int overrideRes = 0; + /** * The required smallest screen width the application can run on. If 0, * nothing has been specified. Comes from @@ -897,6 +904,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { theme = orig.theme; flags = orig.flags; privateFlags = orig.privateFlags; + overrideRes = orig.overrideRes; requiresSmallestWidthDp = orig.requiresSmallestWidthDp; compatibleWidthLimitDp = orig.compatibleWidthLimitDp; largestWidthLimitDp = orig.largestWidthLimitDp; @@ -953,6 +961,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { dest.writeInt(theme); dest.writeInt(flags); dest.writeInt(privateFlags); + dest.writeInt(overrideRes); dest.writeInt(requiresSmallestWidthDp); dest.writeInt(compatibleWidthLimitDp); dest.writeInt(largestWidthLimitDp); @@ -1009,6 +1018,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { theme = source.readInt(); flags = source.readInt(); privateFlags = source.readInt(); + overrideRes = source.readInt(); requiresSmallestWidthDp = source.readInt(); compatibleWidthLimitDp = source.readInt(); largestWidthLimitDp = source.readInt(); @@ -1214,6 +1224,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** {@hide} */ public void setResourcePath(String resourcePath) { scanPublicSourceDir = resourcePath; } /** {@hide} */ public void setBaseResourcePath(String baseResourcePath) { publicSourceDir = baseResourcePath; } /** {@hide} */ public void setSplitResourcePaths(String[] splitResourcePaths) { splitPublicSourceDirs = splitResourcePaths; } + /** {@hide} */ public void setOverrideRes(int overrideResolution) { overrideRes = overrideResolution; } /** {@hide} */ public String getCodePath() { return scanSourceDir; } /** {@hide} */ public String getBaseCodePath() { return sourceDir; } @@ -1221,4 +1232,5 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { /** {@hide} */ public String getResourcePath() { return scanPublicSourceDir; } /** {@hide} */ public String getBaseResourcePath() { return publicSourceDir; } /** {@hide} */ public String[] getSplitResourcePaths() { return splitSourceDirs; } + /** {@hide} */ public int canOverrideRes() { return overrideRes; } } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index b91017e52553f5a1146d21f814162ebf01596e60..9e86edd9275c9b3280a89a53dbbfb9a0ddc6cad1 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -24,6 +24,7 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.app.ActivityManager; +import android.content.Context; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; @@ -161,6 +162,8 @@ public class PackageParser { private static final String TAG_PACKAGE = "package"; private static final String TAG_RESTRICT_UPDATE = "restrict-update"; + private Context mContext; + // These are the tags supported by child packages private static final Set CHILD_PACKAGE_TAGS = new ArraySet<>(); static { @@ -254,6 +257,7 @@ public class PackageParser { private String[] mSeparateProcesses; private boolean mOnlyCoreApps; private DisplayMetrics mMetrics; + private boolean mOnlyPowerOffAlarmApps; private static final int SDK_VERSION = Build.VERSION.SDK_INT; private static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES; @@ -426,6 +430,11 @@ public class PackageParser { mMetrics.setToDefaults(); } + public PackageParser(Context context) { + this(); + mContext = context; + } + public void setSeparateProcesses(String[] procs) { mSeparateProcesses = procs; } @@ -443,6 +452,10 @@ public class PackageParser { mMetrics = metrics; } + public void setOnlyPowerOffAlarmApps(boolean onlyPowerOffAlarmApps) { + mOnlyPowerOffAlarmApps = onlyPowerOffAlarmApps; + } + public static final boolean isApkFile(File file) { return isApkPath(file.getName()); } @@ -797,6 +810,27 @@ public class PackageParser { } } + + /* + * Check if the package belongs to power off alarm packages + */ + private boolean isPowerOffAlarmPackage(String packageName) { + if (mContext != null) { + String[] packageArray = + mContext.getResources().getStringArray(R.array.power_off_alarm_apps); + if(packageArray.length ==0) { + Slog.w(TAG, "power off alarm app array is empty " + packageName); + return false; + } else { + List tempList = Arrays.asList(packageArray); + if (tempList.contains(packageName)) { + return true; + } + } + } + return false; + } + /** * Parse all APKs contained in the given directory, treating them as a * single package. This also performs sanity checking, such as requiring @@ -808,8 +842,15 @@ public class PackageParser { */ private Package parseClusterPackage(File packageDir, int flags) throws PackageParserException { final PackageLite lite = parseClusterPackageLite(packageDir, 0); + // When mOnlyPowerOffAlarmApps is true, only parse power off alarm packages + if (mOnlyPowerOffAlarmApps) { + if (!isPowerOffAlarmPackage(lite.packageName)) { + throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Not a powerOffAlarmApp: " + packageDir); + } + } - if (mOnlyCoreApps && !lite.coreApp) { + if (!mOnlyPowerOffAlarmApps && mOnlyCoreApps && !lite.coreApp) { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Not a coreApp: " + packageDir); } @@ -867,7 +908,15 @@ public class PackageParser { @Deprecated public Package parseMonolithicPackage(File apkFile, int flags) throws PackageParserException { final PackageLite lite = parseMonolithicPackageLite(apkFile, flags); - if (mOnlyCoreApps) { + // When mOnlyPowerOffAlarmApps is true, only parse power off alarm packages + if (mOnlyPowerOffAlarmApps) { + if (!isPowerOffAlarmPackage(lite.packageName)) { + throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Not a powerOffAlarmApp: " + apkFile); + } + } + + if (!mOnlyPowerOffAlarmApps && mOnlyCoreApps) { if (!lite.coreApp) { throw new PackageParserException(INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, "Not a coreApp: " + apkFile); diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java index 9e326d2b1f6b27d2a8a5b22a1096ff0c67d9279d..fe0eece611681e405718135d4575eb4128e70e00 100644 --- a/core/java/android/hardware/Camera.java +++ b/core/java/android/hardware/Camera.java @@ -41,6 +41,7 @@ import android.util.Log; import android.text.TextUtils; import android.view.Surface; import android.view.SurfaceHolder; +import android.os.SystemProperties; import java.io.IOException; import java.lang.ref.WeakReference; @@ -156,6 +157,10 @@ public class Camera { private static final int CAMERA_MSG_RAW_IMAGE_NOTIFY = 0x200; private static final int CAMERA_MSG_PREVIEW_METADATA = 0x400; private static final int CAMERA_MSG_FOCUS_MOVE = 0x800; + /* ### QC ADD-ONS: START */ + private static final int CAMERA_MSG_STATS_DATA = 0x1000; + private static final int CAMERA_MSG_META_DATA = 0x2000; + /* ### QC ADD-ONS: END */ private long mNativeContext; // accessed by native methods private EventHandler mEventHandler; @@ -176,6 +181,17 @@ public class Camera { private final Object mAutoFocusCallbackLock = new Object(); private static final int NO_ERROR = 0; + private static final int EACCESS = -13; + private static final int ENODEV = -19; + private static final int EBUSY = -16; + private static final int EINVAL = -22; + private static final int ENOSYS = -38; + private static final int EUSERS = -87; + private static final int EOPNOTSUPP = -95; + /* ### QC ADD-ONS: START */ + private CameraDataCallback mCameraDataCallback; + private CameraMetaDataCallback mCameraMetaDataCallback; + /* ### QC ADD-ONS: END */ /** * @deprecated This broadcast is no longer delivered by the system; use @@ -270,6 +286,17 @@ public class Camera { */ public static final int CAMERA_FACING_FRONT = 1; + /* ### QC ADD-ONS: START TBD*/ + /** @hide + * camera is in ZSL mode. + */ + public static final int CAMERA_SUPPORT_MODE_ZSL = 2; + + /** @hide + * camera is in non-ZSL mode. + */ + public static final int CAMERA_SUPPORT_MODE_NONZSL = 3; + /* ### QC ADD-ONS: END */ /** * The direction that the camera faces. It should be * CAMERA_FACING_BACK or CAMERA_FACING_FRONT. @@ -452,6 +479,10 @@ public class Camera { mPostviewCallback = null; mUsingPreviewAllocation = false; mZoomListener = null; + /* ### QC ADD-ONS: START */ + mCameraDataCallback = null; + mCameraMetaDataCallback = null; + /* ### QC ADD-ONS: END */ Looper looper; if ((looper = Looper.myLooper()) != null) { @@ -462,8 +493,21 @@ public class Camera { mEventHandler = null; } - return native_setup(new WeakReference(this), cameraId, halVersion, - ActivityThread.currentOpPackageName()); + String packageName = ActivityThread.currentOpPackageName(); + + //Force HAL1 if the package name falls in this bucket + String packageList = SystemProperties.get("camera.hal1.packagelist", ""); + if (packageList.length() > 0) { + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(packageList); + for (String str : splitter) { + if (packageName.equals(str)) { + halVersion = CAMERA_HAL_API_VERSION_1_0; + break; + } + } + } + return native_setup(new WeakReference(this), cameraId, halVersion, packageName); } private int cameraInitNormal(int cameraId) { @@ -766,6 +810,7 @@ public class Camera { * @see android.media.MediaActionSound */ public final void setPreviewCallback(PreviewCallback cb) { + android.util.SeempLog.record(66); mPreviewCallback = cb; mOneShot = false; mWithBuffer = false; @@ -792,6 +837,7 @@ public class Camera { * @see android.media.MediaActionSound */ public final void setOneShotPreviewCallback(PreviewCallback cb) { + android.util.SeempLog.record(68); mPreviewCallback = cb; mOneShot = true; mWithBuffer = false; @@ -830,6 +876,7 @@ public class Camera { * @see android.media.MediaActionSound */ public final void setPreviewCallbackWithBuffer(PreviewCallback cb) { + android.util.SeempLog.record(67); mPreviewCallback = cb; mOneShot = false; mWithBuffer = true; @@ -1152,7 +1199,23 @@ public class Camera { mAutoFocusMoveCallback.onAutoFocusMoving(msg.arg1 == 0 ? false : true, mCamera); } return; + /* ### QC ADD-ONS: START */ + case CAMERA_MSG_STATS_DATA: + int statsdata[] = new int[257]; + for(int i =0; i<257; i++ ) { + statsdata[i] = byteToInt( (byte[])msg.obj, i*4); + } + if (mCameraDataCallback != null) { + mCameraDataCallback.onCameraData(statsdata, mCamera); + } + return; + case CAMERA_MSG_META_DATA: + if (mCameraMetaDataCallback != null) { + mCameraMetaDataCallback.onCameraMetaData((byte[])msg.obj, mCamera); + } + return; + /* ### QC ADD-ONS: END */ default: Log.e(TAG, "Unknown message type " + msg.what); return; @@ -1376,6 +1439,7 @@ public class Camera { */ public final void takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg) { + android.util.SeempLog.record(65); takePicture(shutter, raw, null, jpeg); } private native final void native_takePicture(int msgType); @@ -1411,6 +1475,7 @@ public class Camera { */ public final void takePicture(ShutterCallback shutter, PictureCallback raw, PictureCallback postview, PictureCallback jpeg) { + android.util.SeempLog.record(65); mShutterCallback = shutter; mRawImageCallback = raw; mPostviewCallback = postview; @@ -1806,6 +1871,23 @@ public class Camera { * as a set. Either they are all valid, or none of them are. */ public Point mouth = null; + + /** + * {@hide} + */ + public int smileDegree = 0; + /** + * {@hide} + */ + public int smileScore = 0; + /** + * {@hide} + */ + public int blinkDetected = 0; + /** + * {@hide} + */ + public int faceRecognised = 0; } /** @@ -1898,6 +1980,27 @@ public class Camera { return p; } + /** @hide + * Returns the current cct value of white balance. + * + * If it's in AWB mode, cct is determined by stats/awb module. + * + * If it's in Manual WB mode, it actually returns cct value + * set by user via {@link #setParameters(Camera.Parameters)}. + */ + public int getWBCurrentCCT() { + Parameters p = new Parameters(); + String s = native_getParameters(); + p.unflatten(s); + + int cct = 0; + if (p.getWBCurrentCCT() != null) { + cct = Integer.parseInt(p.getWBCurrentCCT()); + } + + return cct; + } + /** * Returns an empty {@link Parameters} for testing purpose. * @@ -1910,6 +2013,157 @@ public class Camera { return camera.new Parameters(); } + /* ### QC ADD-ONS: START */ + private static int byteToInt(byte[] b, int offset) { + int value = 0; + for (int i = 0; i < 4; i++) { + int shift = (4 - 1 - i) * 8; + value += (b[(3-i) + offset] & 0x000000FF) << shift; + } + return value; + } + /** @hide + * Handles the callback for when Camera Data is available. + * data is read from the camera. + */ + public interface CameraDataCallback { + /** + * Callback for when camera data is available. + * + * @param data a int array of the camera data + * @param camera the Camera service object + */ + void onCameraData(int[] data, Camera camera); + }; + + /** @hide + * Set camera histogram mode and registers a callback function to run. + * Only valid after startPreview() has been called. + * + * @param cb the callback to run + */ + public final void setHistogramMode(CameraDataCallback cb) + { + mCameraDataCallback = cb; + native_setHistogramMode(cb!=null); + } + private native final void native_setHistogramMode(boolean mode); + + /** @hide + * Set camera histogram command to send data. + * + */ + public final void sendHistogramData() + { + native_sendHistogramData(); + } + private native final void native_sendHistogramData(); + + /** @hide + * Handles the callback for when Camera Meta Data is available. + * Meta data is read from the camera. + */ + public interface CameraMetaDataCallback { + /** + * Callback for when camera meta data is available. + * + * @param data a byte array of the camera meta data + * @param camera the Camera service object + */ + void onCameraMetaData(byte[] data, Camera camera); + }; + + /** @hide + * Set camera meta data and registers a callback function to run. + * Only valid after startPreview() has been called. + * + * @param cb the callback to run + */ + public final void setMetadataCb(CameraMetaDataCallback cb) + { + mCameraMetaDataCallback = cb; + native_setMetadataCb(cb!=null); + } + private native final void native_setMetadataCb(boolean mode); + + /** @hide + * Set camera face detection command to send meta data. + */ + public final void sendMetaData() + { + native_sendMetaData(); + } + private native final void native_sendMetaData(); + + /** @hide + * Configure longshot mode. Available only in ZSL. + * + * @param enable enable/disable this mode + */ + public final void setLongshot(boolean enable) + { + native_setLongshot(enable); + } + private native final void native_setLongshot(boolean enable); + + /** @hide + * Handles the Touch Co-ordinate. + */ + public class Coordinate { + /** + * Sets the x,y co-ordinates for a touch event + * + * @param x the x co-ordinate (pixels) + * @param y the y co-ordinate (pixels) + */ + public Coordinate(int x, int y) { + xCoordinate = x; + yCoordinate = y; + } + /** + * Compares {@code obj} to this co-ordinate. + * + * @param obj the object to compare this co-ordinate with. + * @return {@code true} if the xCoordinate and yCoordinate of {@code obj} is the + * same as those of this coordinate. {@code false} otherwise. + */ + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Coordinate)) { + return false; + } + Coordinate c = (Coordinate) obj; + return xCoordinate == c.xCoordinate && yCoordinate == c.yCoordinate; + } + + /** x co-ordinate for the touch event*/ + public int xCoordinate; + + /** y co-ordinate for the touch event */ + public int yCoordinate; + }; + + /** @hide + * Returns the current focus position. + * + * If it's in AF mode, it's the lens position after af is done. + * + * If it's in Manual Focus mode, it actually returns the value + * set by user via {@link #setParameters(Camera.Parameters)}. + */ + public int getCurrentFocusPosition() { + Parameters p = new Parameters(); + String s = native_getParameters(); + p.unflatten(s); + + int focus_pos = -1; + if (p.getCurrentFocusPosition() != null) { + focus_pos = Integer.parseInt(p.getCurrentFocusPosition()); + } + return focus_pos; + } + + /* ### QC ADD-ONS: END */ /** * Returns a copied {@link Parameters}; for shim use only. * @@ -2157,6 +2411,10 @@ public class Camera { public static final String WHITE_BALANCE_CLOUDY_DAYLIGHT = "cloudy-daylight"; public static final String WHITE_BALANCE_TWILIGHT = "twilight"; public static final String WHITE_BALANCE_SHADE = "shade"; + /** @hide + * wb manual cct mode. + */ + public static final String WHITE_BALANCE_MANUAL_CCT = "manual-cct"; // Values for color effect settings. public static final String EFFECT_NONE = "none"; @@ -2204,6 +2462,11 @@ public class Camera { */ public static final String FLASH_MODE_TORCH = "torch"; + /** @hide + * Scene mode is off. + */ + public static final String SCENE_MODE_ASD = "asd"; + /** * Scene mode is off. */ @@ -2280,6 +2543,14 @@ public class Camera { * Capture the naturally warm color of scenes lit by candles. */ public static final String SCENE_MODE_CANDLELIGHT = "candlelight"; + /** @hide + * SCENE_MODE_BACKLIGHT + **/ + public static final String SCENE_MODE_BACKLIGHT = "backlight"; + /** @hide + * SCENE_MODE_FLOWERS + **/ + public static final String SCENE_MODE_FLOWERS = "flowers"; /** * Applications are looking for a barcode. Camera driver will be @@ -2322,6 +2593,13 @@ public class Camera { */ public static final String FOCUS_MODE_FIXED = "fixed"; + /** @hide + * Normal focus mode. Applications should call + * {@link #autoFocus(AutoFocusCallback)} to start the focus in this + * mode. + */ + public static final String FOCUS_MODE_NORMAL = "normal"; + /** * Extended depth of field (EDOF). Focusing is done digitally and * continuously. Applications should not call {@link @@ -2374,6 +2652,11 @@ public class Camera { */ public static final String FOCUS_MODE_CONTINUOUS_PICTURE = "continuous-picture"; + /** @hide + * manual focus mode + */ + public static final String FOCUS_MODE_MANUAL_POSITION = "manual"; + // Indices for focus distance array. /** * The array index of near focus distance for use with @@ -2410,11 +2693,15 @@ public class Camera { // Formats for setPreviewFormat and setPictureFormat. private static final String PIXEL_FORMAT_YUV422SP = "yuv422sp"; private static final String PIXEL_FORMAT_YUV420SP = "yuv420sp"; + private static final String PIXEL_FORMAT_YUV420SP_ADRENO = "yuv420sp-adreno"; private static final String PIXEL_FORMAT_YUV422I = "yuv422i-yuyv"; private static final String PIXEL_FORMAT_YUV420P = "yuv420p"; private static final String PIXEL_FORMAT_RGB565 = "rgb565"; private static final String PIXEL_FORMAT_JPEG = "jpeg"; private static final String PIXEL_FORMAT_BAYER_RGGB = "bayer-rggb"; + private static final String PIXEL_FORMAT_RAW = "raw"; + private static final String PIXEL_FORMAT_YV12 = "yv12"; + private static final String PIXEL_FORMAT_NV12 = "nv12"; /** * Order matters: Keys that are {@link #set(String, String) set} later @@ -3202,8 +3489,11 @@ public class Camera { * parameters. */ public void removeGpsData() { + remove(KEY_QC_GPS_LATITUDE_REF); remove(KEY_GPS_LATITUDE); + remove(KEY_QC_GPS_LONGITUDE_REF); remove(KEY_GPS_LONGITUDE); + remove(KEY_QC_GPS_ALTITUDE_REF); remove(KEY_GPS_ALTITUDE); remove(KEY_GPS_TIMESTAMP); remove(KEY_GPS_PROCESSING_METHOD); @@ -4227,5 +4517,1231 @@ public class Camera { if (s1 != null && s1.equals(s2)) return true; return false; } + /* ### QC ADD-ONS: START */ + + /* ### QC ADDED PARAMETER KEYS*/ + private static final String KEY_QC_HFR_SIZE = "hfr-size"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_MODE = "preview-frame-rate-mode"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_AUTO_MODE = "frame-rate-auto"; + private static final String KEY_QC_PREVIEW_FRAME_RATE_FIXED_MODE = "frame-rate-fixed"; + private static final String KEY_QC_GPS_LATITUDE_REF = "gps-latitude-ref"; + private static final String KEY_QC_GPS_LONGITUDE_REF = "gps-longitude-ref"; + private static final String KEY_QC_GPS_ALTITUDE_REF = "gps-altitude-ref"; + private static final String KEY_QC_GPS_STATUS = "gps-status"; + private static final String KEY_QC_EXIF_DATETIME = "exif-datetime"; + private static final String KEY_QC_TOUCH_AF_AEC = "touch-af-aec"; + private static final String KEY_QC_TOUCH_INDEX_AEC = "touch-index-aec"; + private static final String KEY_QC_TOUCH_INDEX_AF = "touch-index-af"; + private static final String KEY_QC_MANUAL_FOCUS_POSITION = "manual-focus-position"; + private static final String KEY_QC_MANUAL_FOCUS_POS_TYPE = "manual-focus-pos-type"; + private static final String KEY_QC_SCENE_DETECT = "scene-detect"; + private static final String KEY_QC_ISO_MODE = "iso"; + private static final String KEY_QC_EXPOSURE_TIME = "exposure-time"; + private static final String KEY_QC_MIN_EXPOSURE_TIME = "min-exposure-time"; + private static final String KEY_QC_MAX_EXPOSURE_TIME = "max-exposure-time"; + private static final String KEY_QC_LENSSHADE = "lensshade"; + private static final String KEY_QC_HISTOGRAM = "histogram"; + private static final String KEY_QC_SKIN_TONE_ENHANCEMENT = "skinToneEnhancement"; + private static final String KEY_QC_AUTO_EXPOSURE = "auto-exposure"; + private static final String KEY_QC_SHARPNESS = "sharpness"; + private static final String KEY_QC_MAX_SHARPNESS = "max-sharpness"; + private static final String KEY_QC_CONTRAST = "contrast"; + private static final String KEY_QC_MAX_CONTRAST = "max-contrast"; + private static final String KEY_QC_SATURATION = "saturation"; + private static final String KEY_QC_MAX_SATURATION = "max-saturation"; + private static final String KEY_QC_DENOISE = "denoise"; + private static final String KEY_QC_CONTINUOUS_AF = "continuous-af"; + private static final String KEY_QC_SELECTABLE_ZONE_AF = "selectable-zone-af"; + private static final String KEY_QC_FACE_DETECTION = "face-detection"; + private static final String KEY_QC_MEMORY_COLOR_ENHANCEMENT = "mce"; + private static final String KEY_QC_REDEYE_REDUCTION = "redeye-reduction"; + private static final String KEY_QC_ZSL = "zsl"; + private static final String KEY_QC_CAMERA_MODE = "camera-mode"; + private static final String KEY_QC_VIDEO_HIGH_FRAME_RATE = "video-hfr"; + private static final String KEY_QC_VIDEO_HDR = "video-hdr"; + private static final String KEY_QC_POWER_MODE = "power-mode"; + private static final String KEY_QC_POWER_MODE_SUPPORTED = "power-mode-supported"; + private static final String KEY_QC_WB_MANUAL_CCT = "wb-manual-cct"; + private static final String KEY_QC_MIN_WB_CCT = "min-wb-cct"; + private static final String KEY_QC_MAX_WB_CCT = "max-wb-cct"; + private static final String KEY_QC_AUTO_HDR_ENABLE = "auto-hdr-enable"; + private static final String KEY_QC_VIDEO_ROTATION = "video-rotation"; + + /** @hide + * KEY_QC_AE_BRACKET_HDR + **/ + public static final String KEY_QC_AE_BRACKET_HDR = "ae-bracket-hdr"; + + /* ### QC ADDED PARAMETER VALUES*/ + + // Values for touch af/aec settings. + /** @hide + * TOUCH_AF_AEC_OFF + **/ + public static final String TOUCH_AF_AEC_OFF = "touch-off"; + /** @hide + * TOUCH_AF_AEC_ON + **/ + public static final String TOUCH_AF_AEC_ON = "touch-on"; + + // Values for auto exposure settings. + /** @hide + * Auto exposure frame-avg + **/ + public static final String AUTO_EXPOSURE_FRAME_AVG = "frame-average"; + /** @hide + * Auto exposure center weighted + **/ + public static final String AUTO_EXPOSURE_CENTER_WEIGHTED = "center-weighted"; + /** @hide + * Auto exposure spot metering + **/ + public static final String AUTO_EXPOSURE_SPOT_METERING = "spot-metering"; + + //Values for ISO settings + /** @hide + * ISO_AUTO + **/ + public static final String ISO_AUTO = "auto"; + /** @hide + * ISO_HJR + **/ + public static final String ISO_HJR = "ISO_HJR"; + /** @hide + * ISO_100 + **/ + public static final String ISO_100 = "ISO100"; + /** @hide + * ISO_200 + **/ + public static final String ISO_200 = "ISO200"; + /** @hide + * ISO_400 + **/ + public static final String ISO_400 = "ISO400"; + /** @hide + * ISO_800 + **/ + public static final String ISO_800 = "ISO800"; + /** @hide + * ISO_1600 + **/ + public static final String ISO_1600 = "ISO1600"; + + /** @hide + * ISO_3200 + **/ + public static final String ISO_3200 = "ISO3200"; + + //Values for Lens Shading + /** @hide + * LENSSHADE_ENABLE + **/ + public static final String LENSSHADE_ENABLE = "enable"; + /** @hide + * LENSSHADE_DISABLE + **/ + public static final String LENSSHADE_DISABLE= "disable"; + + //Values for Histogram + /** @hide + * Histogram enable + **/ + public static final String HISTOGRAM_ENABLE = "enable"; + /** @hide + * Histogram disable + **/ + public static final String HISTOGRAM_DISABLE= "disable"; + + //Values for Skin Tone Enhancement + /** @hide + * SKIN_TONE_ENHANCEMENT_ENABLE + **/ + public static final String SKIN_TONE_ENHANCEMENT_ENABLE = "enable"; + /** @hide + * SKIN_TONE_ENHANCEMENT_DISABLE + **/ + public static final String SKIN_TONE_ENHANCEMENT_DISABLE= "disable"; + + // Values for MCE settings. + /** @hide + * MCE_ENaBLE + **/ + public static final String MCE_ENABLE = "enable"; + /** @hide + * MCE_DISABLE + **/ + public static final String MCE_DISABLE = "disable"; + + // Values for ZSL settings. + /** @hide + * ZSL_ON + **/ + public static final String ZSL_ON = "on"; + /** @hide + * ZSL_OFF + **/ + public static final String ZSL_OFF = "off"; + + // Values for HDR Bracketing settings. + + /** @hide + * AEC bracketing off + **/ + public static final String AE_BRACKET_HDR_OFF = "Off"; + /** @hide + * AEC bracketing hdr + **/ + public static final String AE_BRACKET_HDR = "HDR"; + /** @hide + * AEC bracketing aec-bracket + **/ + public static final String AE_BRACKET = "AE-Bracket"; + + // Values for Power mode. + /** @hide + * LOW_POWER + **/ + public static final String LOW_POWER = "Low_Power"; + /** @hide + * NORMAL_POWER + **/ + public static final String NORMAL_POWER = "Normal_Power"; + + // Values for HFR settings. + /** @hide + * VIDEO_HFR_OFF + **/ + public static final String VIDEO_HFR_OFF = "off"; + /** @hide + * VIDEO_HFR_2X + **/ + public static final String VIDEO_HFR_2X = "60"; + /** @hide + * VIDEO_HFR_3X + **/ + public static final String VIDEO_HFR_3X = "90"; + /** @hide + * VIDEO_HFR_4X + **/ + public static final String VIDEO_HFR_4X = "120"; + + // Values for auto scene detection settings. + /** @hide + * SCENE_DETECT_OFF + **/ + public static final String SCENE_DETECT_OFF = "off"; + /** @hide + * SCENE_DETECT_ON + **/ + public static final String SCENE_DETECT_ON = "on"; + + //Values for Continuous AF + + /** @hide + * CAF off + **/ + public static final String CONTINUOUS_AF_OFF = "caf-off"; + /** @hide + * CAF on + **/ + public static final String CONTINUOUS_AF_ON = "caf-on"; + /** @hide + * Denoise off + **/ + public static final String DENOISE_OFF = "denoise-off"; + /** @hide + * Denoise on + **/ + public static final String DENOISE_ON = "denoise-on"; + + // Values for Redeye Reduction settings. + /** @hide + * REDEYE_REDUCTION_ENABLE + **/ + public static final String REDEYE_REDUCTION_ENABLE = "enable"; + /** @hide + * REDEYE_REDUCTION_DISABLE + **/ + public static final String REDEYE_REDUCTION_DISABLE = "disable"; + + // Values for selectable zone af settings. + /** @hide + * SELECTABLE_ZONE_AF_AUTO + **/ + public static final String SELECTABLE_ZONE_AF_AUTO = "auto"; + /** @hide + * SELECTABLE_ZONE_AF_SPOTMETERING + **/ + public static final String SELECTABLE_ZONE_AF_SPOTMETERING = "spot-metering"; + /** @hide + * SELECTABLE_ZONE_AF_CENTER_WEIGHTED + **/ + public static final String SELECTABLE_ZONE_AF_CENTER_WEIGHTED = "center-weighted"; + /** @hide + * SELECTABLE_ZONE_AF_FRAME_AVERAGE + **/ + public static final String SELECTABLE_ZONE_AF_FRAME_AVERAGE = "frame-average"; + + // Values for Face Detection settings. + /** @hide + * Face Detection off + **/ + public static final String FACE_DETECTION_OFF = "off"; + /** @hide + * Face Detction on + **/ + public static final String FACE_DETECTION_ON = "on"; + + // Values for video rotation settings. + + /** @hide + * VIDEO_ROTATION_0 + **/ + public static final String VIDEO_ROTATION_0 = "0"; + /** @hide + * VIDEO_ROTATION_90 + **/ + public static final String VIDEO_ROTATION_90 = "90"; + /** @hide + * VIDEO_ROTATION_180 + **/ + public static final String VIDEO_ROTATION_180 = "180"; + /** @hide + * VIDEO_ROTATION_270 + **/ + public static final String VIDEO_ROTATION_270 = "270"; + + /* ### QC ADDED PARAMETER APIS*/ + /** @hide + * Gets the supported preview sizes in high frame rate recording mode. + * + * @return a list of Size object. This method will always return a list + * with at least one element. + */ + public List getSupportedHfrSizes() { + String str = get(KEY_QC_HFR_SIZE + SUPPORTED_VALUES_SUFFIX); + return splitSize(str); + } + + /** @hide + * Gets the supported Touch AF/AEC setting. + * + * @return a List of TOUCH_AF_AEC_XXX string constants. null if TOUCH AF/AEC + * setting is not supported. + * + */ + public List getSupportedTouchAfAec() { + String str = get(KEY_QC_TOUCH_AF_AEC + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** + * Gets the supported Touch AF/AEC setting. + * + * @return a List of TOUCH_AF_AEC_XXX string constants. null if TOUCH AF/AEC + * setting is not supported. + * + */ + + /** @hide + * Gets the supported frame rate modes. + * + * @return a List of FRAME_RATE_XXX_MODE string constant. null if this + * setting is not supported. + */ + public List getSupportedPreviewFrameRateModes() { + String str = get(KEY_QC_PREVIEW_FRAME_RATE_MODE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported auto scene detection modes. + * + * @return a List of SCENE_DETECT_XXX string constant. null if scene detection + * setting is not supported. + * + */ + public List getSupportedSceneDetectModes() { + String str = get(KEY_QC_SCENE_DETECT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported ISO values. + * + * @return a List of FLASH_MODE_XXX string constants. null if flash mode + * setting is not supported. + */ + public List getSupportedIsoValues() { + String str = get(KEY_QC_ISO_MODE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Lensshade modes. + * + * @return a List of LENS_MODE_XXX string constants. null if lens mode + * setting is not supported. + */ + public List getSupportedLensShadeModes() { + String str = get(KEY_QC_LENSSHADE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Histogram modes. + * + * @return a List of HISTOGRAM_XXX string constants. null if histogram mode + * setting is not supported. + */ + public List getSupportedHistogramModes() { + String str = get(KEY_QC_HISTOGRAM + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Skin Tone Enhancement modes. + * + * @return a List of SKIN_TONE_ENHANCEMENT_XXX string constants. null if skin tone enhancement + * setting is not supported. + */ + public List getSupportedSkinToneEnhancementModes() { + String str = get(KEY_QC_SKIN_TONE_ENHANCEMENT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported auto exposure setting. + * + * @return a List of AUTO_EXPOSURE_XXX string constants. null if auto exposure + * setting is not supported. + */ + public List getSupportedAutoexposure() { + String str = get(KEY_QC_AUTO_EXPOSURE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported MCE modes. + * + * @return a List of MCE_ENABLE/DISABLE string constants. null if MCE mode + * setting is not supported. + */ + public List getSupportedMemColorEnhanceModes() { + String str = get(KEY_QC_MEMORY_COLOR_ENHANCEMENT + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported ZSL modes. + * + * @return a List of ZSL_OFF/OFF string constants. null if ZSL mode + * setting is not supported. + */ + public List getSupportedZSLModes() { + String str = get(KEY_QC_ZSL + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Video HDR modes. + * + * @return a List of Video HDR_OFF/OFF string constants. null if + * Video HDR mode setting is not supported. + */ + public List getSupportedVideoHDRModes() { + String str = get(KEY_QC_VIDEO_HDR + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported HFR modes. + * + * @return a List of VIDEO_HFR_XXX string constants. null if hfr mode + * setting is not supported. + */ + public List getSupportedVideoHighFrameRateModes() { + String str = get(KEY_QC_VIDEO_HIGH_FRAME_RATE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported Continuous AF modes. + * + * @return a List of CONTINUOUS_AF_XXX string constant. null if continuous AF + * setting is not supported. + * + */ + public List getSupportedContinuousAfModes() { + String str = get(KEY_QC_CONTINUOUS_AF + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported DENOISE modes. + * + * @return a List of DENOISE_XXX string constant. null if DENOISE + * setting is not supported. + * + */ + public List getSupportedDenoiseModes() { + String str = get(KEY_QC_DENOISE + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported selectable zone af setting. + * + * @return a List of SELECTABLE_ZONE_AF_XXX string constants. null if selectable zone af + * setting is not supported. + */ + public List getSupportedSelectableZoneAf() { + String str = get(KEY_QC_SELECTABLE_ZONE_AF + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported face detection modes. + * + * @return a List of FACE_DETECTION_XXX string constant. null if face detection + * setting is not supported. + * + */ + public List getSupportedFaceDetectionModes() { + String str = get(KEY_QC_FACE_DETECTION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Gets the supported redeye reduction modes. + * + * @return a List of REDEYE_REDUCTION_XXX string constant. null if redeye reduction + * setting is not supported. + * + */ + public List getSupportedRedeyeReductionModes() { + String str = get(KEY_QC_REDEYE_REDUCTION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + /** @hide + * Sets GPS altitude reference. This will be stored in JPEG EXIF header. + * @param altRef reference GPS altitude in meters. + */ + public void setGpsAltitudeRef(double altRef) { + set(KEY_QC_GPS_ALTITUDE_REF, Double.toString(altRef)); + } + + /** @hide + * Sets GPS Status. This will be stored in JPEG EXIF header. + * + * @param status GPS status (UTC in seconds since January 1, + * 1970). + */ + public void setGpsStatus(double status) { + set(KEY_QC_GPS_STATUS, Double.toString(status)); + } + + /** @hide + * Sets the touch co-ordinate for Touch AEC. + * + * @param x the x co-ordinate of the touch event + * @param y the y co-ordinate of the touch event + * + */ + public void setTouchIndexAec(int x, int y) { + String v = Integer.toString(x) + "x" + Integer.toString(y); + set(KEY_QC_TOUCH_INDEX_AEC, v); + } + + /** @hide + * Returns the touch co-ordinates of the touch event. + * + * @return a Index object with the x and y co-ordinated + * for the touch event + * + */ + public Coordinate getTouchIndexAec() { + String pair = get(KEY_QC_TOUCH_INDEX_AEC); + return strToCoordinate(pair); + } + + /** @hide + * Sets the touch co-ordinate for Touch AF. + * + * @param x the x co-ordinate of the touch event + * @param y the y co-ordinate of the touch event + * + */ + public void setTouchIndexAf(int x, int y) { + String v = Integer.toString(x) + "x" + Integer.toString(y); + set(KEY_QC_TOUCH_INDEX_AF, v); + } + + /** @hide + * Returns the touch co-ordinates of the touch event. + * + * @return a Index object with the x and y co-ordinated + * for the touch event + * + */ + public Coordinate getTouchIndexAf() { + String pair = get(KEY_QC_TOUCH_INDEX_AF); + return strToCoordinate(pair); + } + /** @hide + * Set Sharpness Level + * + * @param sharpness level + */ + public void setSharpness(int sharpness){ + if((sharpness < 0) || (sharpness > getMaxSharpness()) ) + throw new IllegalArgumentException( + "Invalid Sharpness " + sharpness); + + set(KEY_QC_SHARPNESS, String.valueOf(sharpness)); + } + + /** @hide + * Set Contrast Level + * + * @param contrast level + */ + public void setContrast(int contrast){ + if((contrast < 0 ) || (contrast > getMaxContrast())) + throw new IllegalArgumentException( + "Invalid Contrast " + contrast); + + set(KEY_QC_CONTRAST, String.valueOf(contrast)); + } + + /** @hide + * Set Saturation Level + * + * @param saturation level + */ + public void setSaturation(int saturation){ + if((saturation < 0 ) || (saturation > getMaxSaturation())) + throw new IllegalArgumentException( + "Invalid Saturation " + saturation); + + set(KEY_QC_SATURATION, String.valueOf(saturation)); + } + + /** @hide + * @return true if full size video snapshot is supported. + */ + public boolean isPowerModeSupported() { + String str = get(KEY_QC_POWER_MODE_SUPPORTED); + return TRUE.equals(str); + } + + /** @hide + * Get Sharpness level + * + * @return sharpness level + */ + public int getSharpness(){ + return getInt(KEY_QC_SHARPNESS); + } + + /** @hide + * Get Max Sharpness Level + * + * @return max sharpness level + */ + public int getMaxSharpness(){ + return getInt(KEY_QC_MAX_SHARPNESS); + } + + /** @hide + * Get Contrast level + * + * @return contrast level + */ + public int getContrast(){ + return getInt(KEY_QC_CONTRAST); + } + + /** @hide + * Get Max Contrast Level + * + * @return max contrast level + */ + public int getMaxContrast(){ + return getInt(KEY_QC_MAX_CONTRAST); + } + + /** @hide + * Get Saturation level + * + * @return saturation level + */ + public int getSaturation(){ + return getInt(KEY_QC_SATURATION); + } + + /** @hide + * Get Max Saturation Level + * + * @return max contrast level + */ + public int getMaxSaturation(){ + return getInt(KEY_QC_MAX_SATURATION); + } + + /** @hide + * Sets GPS latitude reference coordinate. This will be stored in JPEG EXIF + * header. + * @param latRef GPS latitude reference coordinate. + */ + public void setGpsLatitudeRef(String latRef) { + set(KEY_QC_GPS_LATITUDE_REF, latRef); + } + + /** @hide + * Sets GPS longitude reference coordinate. This will be stored in JPEG EXIF + * header. + * @param lonRef GPS longitude reference coordinate. + */ + public void setGpsLongitudeRef(String lonRef) { + set(KEY_QC_GPS_LONGITUDE_REF, lonRef); + } + + /** @hide + * Sets system timestamp. This will be stored in JPEG EXIF header. + * + * @param dateTime current timestamp (UTC in seconds since January 1, + * 1970). + */ + public void setExifDateTime(String dateTime) { + set(KEY_QC_EXIF_DATETIME, dateTime); + } + + /** @hide + * Gets the current Touch AF/AEC setting. + * + * @return one of TOUCH_AF_AEC_XXX string constant. null if Touch AF/AEC + * setting is not supported. + * + */ + public String getTouchAfAec() { + return get(KEY_QC_TOUCH_AF_AEC); + } + + /** @hide + * Sets the current TOUCH AF/AEC setting. + * + * @param value TOUCH_AF_AEC_XXX string constants. + * + */ + public void setTouchAfAec(String value) { + set(KEY_QC_TOUCH_AF_AEC, value); + } + + /** @hide + * Gets the current redeye reduction setting. + * + * @return one of REDEYE_REDUCTION_XXX string constant. null if redeye reduction + * setting is not supported. + * + */ + public String getRedeyeReductionMode() { + return get(KEY_QC_REDEYE_REDUCTION); + } + + /** @hide + * Sets the redeye reduction. Other parameters may be changed after changing + * redeye reduction. After setting redeye reduction, + * applications should call getParameters to know if some parameters are + * changed. + * + * @param value REDEYE_REDUCTION_XXX string constants. + * + */ + public void setRedeyeReductionMode(String value) { + set(KEY_QC_REDEYE_REDUCTION, value); + } + + /** @hide + * Gets the frame rate mode setting. + * + * @return one of FRAME_RATE_XXX_MODE string constant. null if this + * setting is not supported. + */ + public String getPreviewFrameRateMode() { + return get(KEY_QC_PREVIEW_FRAME_RATE_MODE); + } + + /** @hide + * Sets the frame rate mode. + * + * @param value FRAME_RATE_XXX_MODE string constants. + */ + public void setPreviewFrameRateMode(String value) { + set(KEY_QC_PREVIEW_FRAME_RATE_MODE, value); + } + + /** @hide + * Gets the current auto scene detection setting. + * + * @return one of SCENE_DETECT_XXX string constant. null if auto scene detection + * setting is not supported. + * + */ + public String getSceneDetectMode() { + return get(KEY_QC_SCENE_DETECT); + } + + /** @hide + * Sets the auto scene detect. Other parameters may be changed after changing + * scene detect. After setting auto scene detection, + * applications should call getParameters to know if some parameters are + * changed. + * + * @param value SCENE_DETECT_XXX string constants. + * + */ + public void setSceneDetectMode(String value) { + set(KEY_QC_SCENE_DETECT, value); + } + + /** @hide + * Gets the current hdr bracketing mode setting. + * + * @return current hdr bracketing mode. + * @see #KEY_AE_BRACKET_OFF + * @see #KEY_AE_BRACKET_HDR + * @see #KEY_AE_BRACKET_BRACKATING + */ + public String getAEBracket() { + return get(KEY_QC_AE_BRACKET_HDR); + } + + /** @hide + * Sets the Power mode. + * + * @param value Power mode. + * @see #getPowerMode() + */ + public void setPowerMode(String value) { + set(KEY_QC_POWER_MODE, value); + } + + /** @hide + * Gets the current power mode setting. + * + * @return current power mode. null if power mode setting is not + * supported. + * @see #POWER_MODE_LOW + * @see #POWER_MODE_NORMAL + */ + public String getPowerMode() { + return get(KEY_QC_POWER_MODE); + } + + /** @hide + * Set HDR-Bracketing Level + * + * @param value HDR-Bracketing + */ + public void setAEBracket(String value){ + set(KEY_QC_AE_BRACKET_HDR, value); + } + + /** @hide + * Gets the current ISO setting. + * + * @return one of ISO_XXX string constant. null if ISO + * setting is not supported. + */ + public String getISOValue() { + return get(KEY_QC_ISO_MODE); + } + + /** @hide + * Sets the ISO. + * + * @param iso ISO_XXX string constant. + */ + public void setISOValue(String iso) { + set(KEY_QC_ISO_MODE, iso); + } + + /** @hide + * Sets the exposure time. + * + * @param value exposure time. + */ + public void setExposureTime(int value) { + set(KEY_QC_EXPOSURE_TIME, Integer.toString(value)); + } + + /** @hide + * Gets the current exposure time. + * + * @return exposure time. + */ + public String getExposureTime() { + return get(KEY_QC_EXPOSURE_TIME); + } + + /** @hide + * Gets the min supported exposure time. + * + * @return min supported exposure time. + */ + public String getMinExposureTime() { + return get(KEY_QC_MIN_EXPOSURE_TIME); + } + + /** @hide + * Gets the max supported exposure time. + * + * @return max supported exposure time. + */ + public String getMaxExposureTime() { + return get(KEY_QC_MAX_EXPOSURE_TIME); + } + + /** @hide + * Gets the current LensShade Mode. + * + * @return LensShade Mode + */ + public String getLensShade() { + return get(KEY_QC_LENSSHADE); + } + + /** @hide + * Sets the current LensShade Mode. + * + * @return LensShade Mode + */ + public void setLensShade(String lensshade) { + set(KEY_QC_LENSSHADE, lensshade); + } + + /** @hide + * Gets the current auto exposure setting. + * + * @return one of AUTO_EXPOSURE_XXX string constant. null if auto exposure + * setting is not supported. + */ + public String getAutoExposure() { + return get(KEY_QC_AUTO_EXPOSURE); + } + + /** @hide + * Sets the current auto exposure setting. + * + * @param value AUTO_EXPOSURE_XXX string constants. + */ + public void setAutoExposure(String value) { + set(KEY_QC_AUTO_EXPOSURE, value); + } + + /** @hide + * Gets the current MCE Mode. + * + * @return MCE value + */ + public String getMemColorEnhance() { + return get(KEY_QC_MEMORY_COLOR_ENHANCEMENT); + } + + /** @hide + * Sets the current MCE Mode. + * + * @return MCE Mode + */ + public void setMemColorEnhance(String mce) { + set(KEY_QC_MEMORY_COLOR_ENHANCEMENT, mce); + } + + /** @hide + * Set white balance manual cct value. + * + * @param cct user CCT setting. + */ + public void setWBManualCCT(int cct) { + set(KEY_QC_WB_MANUAL_CCT, Integer.toString(cct)); + } + + /** @hide + * Gets the WB min supported CCT. + * + * @return min cct value. + */ + public String getWBMinCCT() { + return get(KEY_QC_MIN_WB_CCT); + } + + /** @hide + * Gets the WB max supported CCT. + * + * @return max cct value. + */ + public String getMaxWBCCT() { + return get(KEY_QC_MAX_WB_CCT); + } + + /** @hide + * Gets the current WB CCT. + * + * @return CCT value + */ + public String getWBCurrentCCT() { + return get(KEY_QC_WB_MANUAL_CCT); + } + + /** @hide + * Gets the current ZSL Mode. + * + * @return ZSL mode value + */ + public String getZSLMode() { + return get(KEY_QC_ZSL); + } + + /** @hide + * Sets the current ZSL Mode. ZSL mode is set as a 0th bit in KEY_CAMERA_MODE. + * + * @return null + */ + public void setZSLMode(String zsl) { + set(KEY_QC_ZSL, zsl); + } + + /** @hide + * Sets the current Auto HDR Mode. + * @ auto_hdr auto hdr string for enable/disable + * @return null + */ + public void setAutoHDRMode(String auto_hdr){ + set(KEY_QC_AUTO_HDR_ENABLE,auto_hdr); + } + + /** @hide + * Gets the current Camera Mode Flag. Camera mode includes a + * flag(byte) which indicates different camera modes. + * For now support for ZSL added at bit0 + * + * @return Camera Mode. + */ + public String getCameraMode() { + return get(KEY_QC_CAMERA_MODE); + } + + /** @hide + * Sets the current Camera Mode. + * + * @return null + */ + public void setCameraMode(int cameraMode) { + set(KEY_QC_CAMERA_MODE, cameraMode); + } + + private static final int MANUAL_FOCUS_POS_TYPE_INDEX = 0; + private static final int MANUAL_FOCUS_POS_TYPE_DAC = 1; + /** @hide + * Set focus position. + * + * @param pos user setting of focus position. + */ + public void setFocusPosition(int type, int pos) { + set(KEY_QC_MANUAL_FOCUS_POS_TYPE, Integer.toString(type)); + set(KEY_QC_MANUAL_FOCUS_POSITION, Integer.toString(pos)); + } + + /** @hide + * Gets the current focus position. + * + * @return current focus position + */ + public String getCurrentFocusPosition() { + return get(KEY_QC_MANUAL_FOCUS_POSITION); + } + + + /** @hide + * Gets the current HFR Mode. + * + * @return VIDEO_HFR_XXX string constants + */ + public String getVideoHighFrameRate() { + return get(KEY_QC_VIDEO_HIGH_FRAME_RATE); + } + + /** @hide + * Sets the current HFR Mode. + * + * @param hfr VIDEO_HFR_XXX string constants + */ + public void setVideoHighFrameRate(String hfr) { + set(KEY_QC_VIDEO_HIGH_FRAME_RATE, hfr); + } + + /** @hide + * Gets the current Video HDR Mode. + * + * @return Video HDR mode value + */ + public String getVideoHDRMode() { + return get(KEY_QC_VIDEO_HDR); + } + + /** @hide + * Sets the current Video HDR Mode. + * + * @return null + */ + public void setVideoHDRMode(String videohdr) { + set(KEY_QC_VIDEO_HDR, videohdr); + } + + /** @hide + * Gets the current DENOISE setting. + * + * @return one of DENOISE_XXX string constant. null if Denoise + * setting is not supported. + * + */ + public String getDenoise() { + return get(KEY_QC_DENOISE); + } + + /** @hide + * Gets the current Continuous AF setting. + * + * @return one of CONTINUOUS_AF_XXX string constant. null if continuous AF + * setting is not supported. + * + */ + public String getContinuousAf() { + return get(KEY_QC_CONTINUOUS_AF); + } + + /** @hide + * Sets the current Denoise mode. + * @param value DENOISE_XXX string constants. + * + */ + + public void setDenoise(String value) { + set(KEY_QC_DENOISE, value); + } + + /** @hide + * Sets the current Continuous AF mode. + * @param value CONTINUOUS_AF_XXX string constants. + * + */ + public void setContinuousAf(String value) { + set(KEY_QC_CONTINUOUS_AF, value); + } + + /** @hide + * Gets the current selectable zone af setting. + * + * @return one of SELECTABLE_ZONE_AF_XXX string constant. null if selectable zone af + * setting is not supported. + */ + public String getSelectableZoneAf() { + return get(KEY_QC_SELECTABLE_ZONE_AF); + } + + /** @hide + * Sets the current selectable zone af setting. + * + * @param value SELECTABLE_ZONE_AF_XXX string constants. + */ + public void setSelectableZoneAf(String value) { + set(KEY_QC_SELECTABLE_ZONE_AF, value); + } + + /** @hide + * Gets the current face detection setting. + * + * @return one of FACE_DETECTION_XXX string constant. null if face detection + * setting is not supported. + * + */ + public String getFaceDetectionMode() { + return get(KEY_QC_FACE_DETECTION); + } + + /** @hide + * Sets the auto scene detect. Other settings like Touch AF/AEC might be + * changed after setting face detection. + * + * @param value FACE_DETECTION_XXX string constants. + * + */ + public void setFaceDetectionMode(String value) { + set(KEY_QC_FACE_DETECTION, value); + } + + /** @hide + * Gets the current video rotation setting. + * + * @return one of VIDEO_QC_ROTATION_XXX string constant. null if video rotation + * setting is not supported. + */ + public String getVideoRotation() { + return get(KEY_QC_VIDEO_ROTATION); + } + + /** @hide + * Sets the current video rotation setting. + * + * @param value VIDEO_QC_ROTATION_XXX string constants. + */ + public void setVideoRotation(String value) { + set(KEY_QC_VIDEO_ROTATION, value); + } + /** @hide + * Gets the supported video rotation modes. + * + * @return a List of VIDEO_QC_ROTATION_XXX string constant. null if this + * setting is not supported. + */ + public List getSupportedVideoRotationValues() { + String str = get(KEY_QC_VIDEO_ROTATION + SUPPORTED_VALUES_SUFFIX); + return split(str); + } + + // Splits a comma delimited string to an ArrayList of Coordinate. + // Return null if the passing string is null or the Coordinate is 0. + private ArrayList splitCoordinate(String str) { + if (str == null) return null; + TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(','); + splitter.setString(str); + ArrayList coordinateList = new ArrayList(); + for (String s : splitter) { + Coordinate coordinate = strToCoordinate(s); + if (coordinate != null) coordinateList.add(coordinate); + } + if (coordinateList.size() == 0) return null; + return coordinateList; + } + + // Parses a string (ex: "500x500") to Coordinate object. + // Return null if the passing string is null. + private Coordinate strToCoordinate(String str) { + if (str == null) return null; + + int pos = str.indexOf('x'); + if (pos != -1) { + String x = str.substring(0, pos); + String y = str.substring(pos + 1); + return new Coordinate(Integer.parseInt(x), + Integer.parseInt(y)); + } + Log.e(TAG, "Invalid Coordinate parameter string=" + str); + return null; + } + /* ### QC ADD-ONS: END */ }; } diff --git a/core/java/android/hardware/SystemSensorManager.java b/core/java/android/hardware/SystemSensorManager.java index 259ca032918b7eef4cda0a12d89e92d68f5ce5eb..69f7b84d0da55a8e3412589e3700488a841f6c34 100644 --- a/core/java/android/hardware/SystemSensorManager.java +++ b/core/java/android/hardware/SystemSensorManager.java @@ -130,6 +130,7 @@ public class SystemSensorManager extends SensorManager { @Override protected boolean registerListenerImpl(SensorEventListener listener, Sensor sensor, int delayUs, Handler handler, int maxBatchReportLatencyUs, int reservedFlags) { + android.util.SeempLog.record_sensor_rate(381, sensor, delayUs); if (listener == null || sensor == null) { Log.e(TAG, "sensor or listener is null"); return false; @@ -171,6 +172,7 @@ public class SystemSensorManager extends SensorManager { /** @hide */ @Override protected void unregisterListenerImpl(SensorEventListener listener, Sensor sensor) { + android.util.SeempLog.record_sensor(382, sensor); // Trigger Sensors should use the cancelTriggerSensor call. if (sensor != null && sensor.getReportingMode() == Sensor.REPORTING_MODE_ONE_SHOT) { return; diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java old mode 100644 new mode 100755 index f9a7d192b5bb394435f7b86fe38ee50b1366168c..9afae31e774761e345f1ffc743f321a8070ba5ea --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -244,6 +244,14 @@ public class UsbManager { */ public static final String USB_FUNCTION_ACCESSORY = "accessory"; + /** + * Name of the charging USB function. + * Used in extras for the {@link #ACTION_USB_STATE} broadcast + * + * {@hide} + */ + public static final String USB_FUNCTION_CHARGING = "charging"; + /** * Name of extra for {@link #ACTION_USB_PORT_CHANGED} * containing the {@link UsbPort} object for the port. diff --git a/core/java/android/net/ZeroBalanceHelper.java b/core/java/android/net/ZeroBalanceHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..36b18d04360ed01e415c6daf9c331c658d311d90 --- /dev/null +++ b/core/java/android/net/ZeroBalanceHelper.java @@ -0,0 +1,100 @@ +/* + ** Copyright (c) 2015-16, The Linux Foundation. All rights reserved. + + ** Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions are + ** met: + ** * Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** * Redistributions in binary form must reproduce the above + ** copyright notice, this list of conditions and the following + ** disclaimer in the documentation and/or other materials provided + ** with the distribution. + ** * Neither the name of The Linux Foundation nor the names of its + ** contributors may be used to endorse or promote products derived + ** from this software without specific prior written permission. + + ** THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + ** BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + ** BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + ** OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + ** IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package android.net; + +import android.app.ActivityThread; +import android.content.Context; +import android.content.Intent; +import android.os.SystemProperties; +import android.os.UserHandle; +import android.util.Log; + +import com.android.internal.R; + + +/** @hide */ +public final class ZeroBalanceHelper { + + public static final String BACKGROUND_DATA_PROPERTY = "sys.background.data.disable"; + public static final String BACKGROUND_DATA_BROADCAST = "org.codeaurora.background.data"; + public static final String TAG = "ZeroBalance"; + + private static int sRedirectCount = 0; + private static int sRedirectMaxCount = 3; + + private Context mContext = null; + + public ZeroBalanceHelper() { + mContext = ActivityThread.currentApplication(); + } + + public void setBgDataProperty(String enabled) { + Intent intent = new Intent(); + intent.setAction(BACKGROUND_DATA_BROADCAST); + intent.putExtra("enabled", enabled); + mContext.sendBroadcast(intent); + } + + public String getBgDataProperty() { + String isBgDataPropertySet = SystemProperties.get(BACKGROUND_DATA_PROPERTY, "false"); + if(Boolean.valueOf(isBgDataPropertySet)) { + sRedirectCount = 0; + } + return isBgDataPropertySet; + } + + private String getConfiguredRedirectURL() { + String redirectURL = mContext.getResources().getString( + com.android.internal.R.string.operator_config_url); + Log.d(TAG, "Returning the configured redirect URL : " + + redirectURL); + return redirectURL; + } + + public synchronized void setHttpRedirectCount(String url) { + String redirectUrl = getConfiguredRedirectURL(); + if (redirectUrl != null && url.contains(redirectUrl)) { + sRedirectCount++; + Log.d(TAG, "http:sRedirectCount="+sRedirectCount); + if (sRedirectCount >= sRedirectMaxCount) { + Log.d(TAG,"http:Background Data will be disabled" ); + setBgDataProperty("true"); + sRedirectCount = 0; + } + } else { + Log.d(TAG,"http: resetting the counter "); + sRedirectCount = 0; + } + } + + public boolean getFeatureConfigValue() { + return mContext.getResources().getBoolean(R.bool.config_zero_balance_operator); + } +} diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl index f991efed07ebf66df10b1701a440ee4f48f5977a..8ea509c442057099e19e4a9c864a223a883bc93b 100644 --- a/core/java/android/nfc/INfcAdapter.aidl +++ b/core/java/android/nfc/INfcAdapter.aidl @@ -1,4 +1,7 @@ /* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -30,6 +33,7 @@ import android.nfc.INfcFCardEmulation; import android.nfc.INfcUnlockHandler; import android.nfc.ITagRemovedCallback; import android.os.Bundle; +import android.os.IBinder; /** * @hide @@ -40,6 +44,7 @@ interface INfcAdapter INfcCardEmulation getNfcCardEmulationInterface(); INfcFCardEmulation getNfcFCardEmulationInterface(); INfcAdapterExtras getNfcAdapterExtrasInterface(in String pkg); + IBinder getNfcAdapterVendorInterface(in String vendor); int getState(); boolean disable(boolean saveState); diff --git a/core/java/android/nfc/cardemulation/AidGroup.java b/core/java/android/nfc/cardemulation/AidGroup.java index 78a9401a2abd97eca9f730e1dbbcd8aaff1ccaf6..ce67061a084ea3470e4f94feb5ed02eea659f205 100644 --- a/core/java/android/nfc/cardemulation/AidGroup.java +++ b/core/java/android/nfc/cardemulation/AidGroup.java @@ -1,4 +1,7 @@ /* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -37,7 +40,7 @@ import android.util.Log; * * @hide */ -public final class AidGroup implements Parcelable { +public class AidGroup implements Parcelable { /** * The maximum number of AIDs that can be present in any one group. */ @@ -45,9 +48,9 @@ public final class AidGroup implements Parcelable { static final String TAG = "AidGroup"; - final List aids; - final String category; - final String description; + protected List aids; + protected String category; + protected String description; /** * Creates a new AidGroup object. diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java index 7678678f3513a0fc866038c724b0c75872e14ad7..fe3b594bfc3156a2244f3ffb990289c2c2d2b713 100644 --- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java +++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java @@ -1,4 +1,7 @@ /* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * * Copyright (C) 2013 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -48,53 +51,53 @@ import java.util.Map; /** * @hide */ -public final class ApduServiceInfo implements Parcelable { +public class ApduServiceInfo implements Parcelable { static final String TAG = "ApduServiceInfo"; /** * The service that implements this */ - final ResolveInfo mService; + protected ResolveInfo mService; /** * Description of the service */ - final String mDescription; + protected String mDescription; /** * Whether this service represents AIDs running on the host CPU */ - final boolean mOnHost; + protected boolean mOnHost; /** * Mapping from category to static AID group */ - final HashMap mStaticAidGroups; + protected HashMap mStaticAidGroups; /** * Mapping from category to dynamic AID group */ - final HashMap mDynamicAidGroups; + protected HashMap mDynamicAidGroups; /** * Whether this service should only be started when the device is unlocked. */ - final boolean mRequiresDeviceUnlock; + protected boolean mRequiresDeviceUnlock; /** * The id of the service banner specified in XML. */ - final int mBannerResourceId; + protected int mBannerResourceId; /** * The uid of the package the service belongs to */ - final int mUid; + protected int mUid; /** * Settings Activity for this service */ - final String mSettingsActivityName; + protected String mSettingsActivityName; /** * @hide diff --git a/core/java/android/nfc/tech/MifareClassic.java b/core/java/android/nfc/tech/MifareClassic.java index 8c92288d00479c2a5a1f62e3aa3ddae5d452d947..302c02daa638b2ed727138bfc6a3bca80c8aba13 100644 --- a/core/java/android/nfc/tech/MifareClassic.java +++ b/core/java/android/nfc/tech/MifareClassic.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2015 NXP Semiconductors + * The original Work has been changed by NXP Semiconductors. * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -173,6 +175,10 @@ public final class MifareClassic extends BasicTagTechnology { mType = TYPE_CLASSIC; mSize = SIZE_4K; break; + case 0x19: + mType = TYPE_CLASSIC; + mSize = SIZE_2K; + break; case 0x28: mType = TYPE_CLASSIC; mSize = SIZE_1K; diff --git a/core/java/android/nfc/tech/NfcA.java b/core/java/android/nfc/tech/NfcA.java index 88730f9af3dff0025f067913ea2f3a3492c29995..b7fa455e3880c7ae974f481fac4eb1b605250df9 100644 --- a/core/java/android/nfc/tech/NfcA.java +++ b/core/java/android/nfc/tech/NfcA.java @@ -1,4 +1,6 @@ /* + * Copyright (C) 2015 NXP Semiconductors + * The original Work has been changed by NXP Semiconductors. * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -66,8 +68,15 @@ public final class NfcA extends BasicTagTechnology { /** @hide */ public NfcA(Tag tag) throws RemoteException { super(tag, TagTechnology.NFC_A); - Bundle extras = tag.getTechExtras(TagTechnology.NFC_A); - mSak = extras.getShort(EXTRA_SAK); + Bundle extras; + mSak = 0; + if(tag.hasTech(TagTechnology.MIFARE_CLASSIC)) + { + extras = tag.getTechExtras(TagTechnology.MIFARE_CLASSIC); + mSak = extras.getShort(EXTRA_SAK); + } + extras = tag.getTechExtras(TagTechnology.NFC_A); + mSak |= extras.getShort(EXTRA_SAK); mAtqa = extras.getByteArray(EXTRA_ATQA); } diff --git a/core/java/android/os/IDeviceIdleController.aidl b/core/java/android/os/IDeviceIdleController.aidl index cc2af215c2c624dc537da6ba0e9e353d097bc416..9cd7dfa4cbef1115c189e81fb4f0dcd0f226d586 100644 --- a/core/java/android/os/IDeviceIdleController.aidl +++ b/core/java/android/os/IDeviceIdleController.aidl @@ -40,4 +40,6 @@ interface IDeviceIdleController { void exitIdle(String reason); boolean registerMaintenanceActivityListener(IMaintenanceActivityListener listener); void unregisterMaintenanceActivityListener(IMaintenanceActivityListener listener); + int getIdleStateDetailed(); + int getLightIdleStateDetailed(); } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 36ba6966effacc951617d19e7ea57505d0ddd37d..e1f2eaf0d9710c0efb2d98f1139157047c2fefe5 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -227,11 +227,21 @@ interface INetworkManagementService */ void startAccessPoint(in WifiConfiguration wifiConfig, String iface); + /** + * Start Wigig Access Point + */ + void startWigigAccessPoint(); + /** * Stop Wifi Access Point */ void stopAccessPoint(String iface); + /** + * Stop Wigig Access Point + */ + void stopWigigAccessPoint(); + /** * Set Access Point config */ @@ -438,4 +448,13 @@ interface INetworkManagementService void removeInterfaceFromLocalNetwork(String iface); void setAllowOnlyVpnForUids(boolean enable, in UidRange[] uidRanges); + /** + * Create SoftAp Interface + */ + void createSoftApInterface(String wlanIface); + + /** + * Delete SoftAp Interface + */ + void deleteSoftApInterface(String wlanIface); } diff --git a/core/java/android/os/IPowerManager.aidl b/core/java/android/os/IPowerManager.aidl index b80aa0569274ca683340cd0f690b395465964aea..5fcb6f6b4dd6d604736eb082ca1f2d04e82cfa45 100644 --- a/core/java/android/os/IPowerManager.aidl +++ b/core/java/android/os/IPowerManager.aidl @@ -72,4 +72,6 @@ interface IPowerManager void setKeyboardLight(boolean on, int key); + // update the uids being synchronized by network socket request manager + void updateBlockedUids(int uid, boolean isBlocked); } diff --git a/core/java/android/os/storage/IMountService.java b/core/java/android/os/storage/IMountService.java index b9bcd1c190a4a377afb2a1dfc4884810ee9e95e5..9f4b05cb4d423cba3452552d369f538ea90f3926 100644 --- a/core/java/android/os/storage/IMountService.java +++ b/core/java/android/os/storage/IMountService.java @@ -647,6 +647,24 @@ public interface IMountService extends IInterface { return _result; } + public int encryptWipeStorage(int type, String password) throws RemoteException { + Parcel _data = Parcel.obtain(); + Parcel _reply = Parcel.obtain(); + int _result; + try { + _data.writeInterfaceToken(DESCRIPTOR); + _data.writeInt(type); + _data.writeString(password); + mRemote.transact(Stub.TRANSACTION_encryptWipeStorage, _data, _reply, 0); + _reply.readException(); + _result = _reply.readInt(); + } finally { + _reply.recycle(); + _data.recycle(); + } + return _result; + } + public int changeEncryptionPassword(int type, String password) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); @@ -1507,6 +1525,8 @@ public interface IMountService extends IInterface { static final int TRANSACTION_fixateNewestUserKeyAuth = IBinder.FIRST_CALL_TRANSACTION + 71; + static final int TRANSACTION_encryptWipeStorage = IBinder.FIRST_CALL_TRANSACTION + 72; + /** * Cast an IBinder object into an IMountService interface, generating a * proxy if needed. @@ -1809,6 +1829,15 @@ public interface IMountService extends IInterface { reply.writeInt(result); return true; } + case TRANSACTION_encryptWipeStorage: { + data.enforceInterface(DESCRIPTOR); + int type = data.readInt(); + String password = data.readString(); + int result = encryptWipeStorage(type, password); + reply.writeNoException(); + reply.writeInt(result); + return true; + } case TRANSACTION_changeEncryptionPassword: { data.enforceInterface(DESCRIPTOR); int type = data.readInt(); @@ -2320,7 +2349,8 @@ public interface IMountService extends IInterface { * Returns whether or not the external storage is emulated. */ public boolean isExternalStorageEmulated() throws RemoteException; - + /** The volume has been encrypted succesfully and MDTP state is 'activated'. */ + static final int ENCRYPTION_STATE_OK_MDTP_ACTIVATED = 2; /** The volume is not encrypted. */ static final int ENCRYPTION_STATE_NONE = 1; /** The volume has been encrypted succesfully. */ @@ -2333,6 +2363,8 @@ public interface IMountService extends IInterface { static final int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3; /** Underlying data is corrupt */ static final int ENCRYPTION_STATE_ERROR_CORRUPT = -4; + /** The volume is in a bad state and MDTP state is 'activated'.*/ + static final int ENCRYPTION_STATE_ERROR_MDTP_ACTIVATED = -5; /** * Determines the encryption state of the volume. @@ -2355,6 +2387,11 @@ public interface IMountService extends IInterface { */ public int encryptStorage(int type, String password) throws RemoteException; + /** + * Encrypts and wipes storage. + */ + public int encryptWipeStorage(int type, String password) throws RemoteException; + /** * Changes the encryption password. */ diff --git a/core/java/android/provider/Browser.java b/core/java/android/provider/Browser.java index 7d05522cf5ce784cf9652fde9ff4e47aff70f37e..299a95c8e9e3edf067e680373a93c6b4433e25ee 100644 --- a/core/java/android/provider/Browser.java +++ b/core/java/android/provider/Browser.java @@ -244,6 +244,7 @@ public class Browser { */ public static final Cursor getAllBookmarks(ContentResolver cr) throws IllegalStateException { + android.util.SeempLog.record(32); return new MatrixCursor(new String[]{Bookmarks.URL}, 0); } @@ -256,6 +257,7 @@ public class Browser { */ public static final Cursor getAllVisitedUrls(ContentResolver cr) throws IllegalStateException { + android.util.SeempLog.record(33); return new MatrixCursor(new String[]{Combined.URL}, 0); } @@ -264,6 +266,7 @@ public class Browser { } private static final Cursor getVisitedLike(ContentResolver cr, String url) { + android.util.SeempLog.record(34); boolean secure = false; String compareString = url; if (compareString.startsWith("http://")) { @@ -324,6 +327,7 @@ public class Browser { */ @Deprecated public static final String[] getVisitedHistory(ContentResolver cr) { + android.util.SeempLog.record(35); return new String[0]; } @@ -359,6 +363,7 @@ public class Browser { * @removed */ public static final void clearHistory(ContentResolver cr) { + android.util.SeempLog.record(37); } @@ -420,6 +425,7 @@ public class Browser { */ public static final void requestAllIcons(ContentResolver cr, String where, WebIconDatabase.IconListener listener) { + android.util.SeempLog.record(36); // Do nothing: this is no longer used. } diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index aa22041d277750c6093eeea04a768412213c0b9e..2ede026b586ce16fbbf689f16288bf0ec30a479d 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -871,6 +871,7 @@ public final class CalendarContract { * @return A Cursor containing all attendees for the event */ public static final Cursor query(ContentResolver cr, long eventId, String[] projection) { + android.util.SeempLog.record(54); String[] attArgs = {Long.toString(eventId)}; return cr.query(CONTENT_URI, projection, ATTENDEES_WHERE, attArgs /* selection args */, null /* sort order */); @@ -1750,6 +1751,7 @@ public final class CalendarContract { */ public static final Cursor query(ContentResolver cr, String[] projection, long begin, long end) { + android.util.SeempLog.record(54); Uri.Builder builder = CONTENT_URI.buildUpon(); ContentUris.appendId(builder, begin); ContentUris.appendId(builder, end); @@ -1779,6 +1781,7 @@ public final class CalendarContract { */ public static final Cursor query(ContentResolver cr, String[] projection, long begin, long end, String searchQuery) { + android.util.SeempLog.record(54); Uri.Builder builder = CONTENT_SEARCH_URI.buildUpon(); ContentUris.appendId(builder, begin); ContentUris.appendId(builder, end); @@ -2029,6 +2032,7 @@ public final class CalendarContract { */ public static final Cursor query(ContentResolver cr, int startDay, int numDays, String[] projection) { + android.util.SeempLog.record(54); if (numDays < 1) { return null; } @@ -2112,6 +2116,7 @@ public final class CalendarContract { * @return A Cursor containing all reminders for the event */ public static final Cursor query(ContentResolver cr, long eventId, String[] projection) { + android.util.SeempLog.record(54); String[] remArgs = {Long.toString(eventId)}; return cr.query(CONTENT_URI, projection, REMINDERS_WHERE, remArgs /*selection args*/, null /* sort order */); @@ -2262,6 +2267,7 @@ public final class CalendarContract { */ public static final Uri insert(ContentResolver cr, long eventId, long begin, long end, long alarmTime, int minutes) { + android.util.SeempLog.record(51); ContentValues values = new ContentValues(); values.put(CalendarAlerts.EVENT_ID, eventId); values.put(CalendarAlerts.BEGIN, begin); @@ -2289,6 +2295,7 @@ public final class CalendarContract { * @hide */ public static final long findNextAlarmTime(ContentResolver cr, long millis) { + android.util.SeempLog.record(53); String selection = ALARM_TIME + ">=" + millis; // TODO: construct an explicit SQL query so that we can add // "LIMIT 1" to the end and get just one result. @@ -2412,6 +2419,7 @@ public final class CalendarContract { */ public static final boolean alarmExists(ContentResolver cr, long eventId, long begin, long alarmTime) { + android.util.SeempLog.record(52); // TODO: construct an explicit SQL query so that we can add // "LIMIT 1" to the end and get just one result. String[] projection = new String[] { ALARM_TIME }; diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index c70304e140cffd567fb336ac343390d6c2736446..52b00e91f9777230446173f38787fd5cefb7b594 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -1576,6 +1576,7 @@ public final class ContactsContract { * {@link #CONTENT_LOOKUP_URI} to attempt refreshing. */ public static Uri getLookupUri(ContentResolver resolver, Uri contactUri) { + android.util.SeempLog.record(86); final Cursor c = resolver.query(contactUri, new String[] { Contacts.LOOKUP_KEY, Contacts._ID }, null, null, null); @@ -1603,6 +1604,7 @@ public final class ContactsContract { * provided parameters. */ public static Uri getLookupUri(long contactId, String lookupKey) { + android.util.SeempLog.record(86); if (TextUtils.isEmpty(lookupKey)) { return null; } @@ -1616,6 +1618,7 @@ public final class ContactsContract { * Returns null if the contact cannot be found. */ public static Uri lookupContact(ContentResolver resolver, Uri lookupUri) { + android.util.SeempLog.record(87); if (lookupUri == null) { return null; } @@ -2086,6 +2089,7 @@ public final class ContactsContract { */ public static InputStream openContactPhotoInputStream(ContentResolver cr, Uri contactUri, boolean preferHighres) { + android.util.SeempLog.record(88); if (preferHighres) { final Uri displayPhotoUri = Uri.withAppendedPath(contactUri, Contacts.Photo.DISPLAY_PHOTO); @@ -2134,6 +2138,7 @@ public final class ContactsContract { * of the thumbnail the high-res picture is preferred */ public static InputStream openContactPhotoInputStream(ContentResolver cr, Uri contactUri) { + android.util.SeempLog.record(88); return openContactPhotoInputStream(cr, contactUri, false); } } @@ -2831,6 +2836,7 @@ public final class ContactsContract { * entry of the given {@link RawContacts} entry. */ public static Uri getContactLookupUri(ContentResolver resolver, Uri rawContactUri) { + android.util.SeempLog.record(89); // TODO: use a lighter query by joining rawcontacts with contacts in provider final Uri dataUri = Uri.withAppendedPath(rawContactUri, Data.CONTENT_DIRECTORY); final Cursor cursor = resolver.query(dataUri, new String[] { @@ -4777,6 +4783,7 @@ public final class ContactsContract { *

*/ public static Uri getContactLookupUri(ContentResolver resolver, Uri dataUri) { + android.util.SeempLog.record(89); final Cursor cursor = resolver.query(dataUri, new String[] { RawContacts.CONTACT_ID, Contacts.LOOKUP_KEY }, null, null, null); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java old mode 100755 new mode 100644 index b421ef62ba53d58149741485a8d2f00c25e0ca02..3d54132e02cb9fad509994b3ff6881f65ddfe8cb --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1944,6 +1944,7 @@ public final class Settings { /** @hide */ public static String getStringForUser(ContentResolver resolver, String name, int userHandle) { + android.util.SeempLog.record(android.util.SeempLog.getSeempGetApiIdFromValue(name)); if (MOVED_TO_SECURE.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Secure, returning read-only value."); @@ -1971,6 +1972,7 @@ public final class Settings { /** @hide */ public static boolean putStringForUser(ContentResolver resolver, String name, String value, int userHandle) { + android.util.SeempLog.record(android.util.SeempLog.getSeempPutApiIdFromValue(name)); if (MOVED_TO_SECURE.contains(name)) { Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System" + " to android.provider.Settings.Secure, value is unchanged."); @@ -4307,6 +4309,7 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.WIFI_ON); MOVED_TO_GLOBAL.add(Settings.Global.WIFI_P2P_DEVICE_NAME); MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SAVED_STATE); + MOVED_TO_GLOBAL.add(Settings.Global.WIFI_HOTSPOT2_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUPPLICANT_SCAN_INTERVAL_MS); MOVED_TO_GLOBAL.add(Settings.Global.WIFI_SUSPEND_OPTIMIZATIONS_ENABLED); MOVED_TO_GLOBAL.add(Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED); @@ -4355,6 +4358,7 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_DNS_SERVER); MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_NETWORK_MODE); MOVED_TO_GLOBAL.add(Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY); + MOVED_TO_GLOBAL.add(Settings.Global.WIFI_AUTO_CONNECT_TYPE); } /** @@ -4996,6 +5000,12 @@ public final class Settings { * Best-effort location computation allowed. */ public static final int LOCATION_MODE_HIGH_ACCURACY = 3; + /** + * Setting to configure Wifi disconnect delay duration in seconds. + * @hide + **/ + public static final String WIFI_DISCONNECT_DELAY_DURATION = + "wifi_disconnect_delay_duration"; /** * A flag containing settings used for biometric weak @@ -6507,7 +6517,8 @@ public final class Settings { ENHANCED_VOICE_PRIVACY_ENABLED, TTY_MODE_ENABLED, INCALL_POWER_BUTTON_BEHAVIOR, - CAMERA_GESTURE_DISABLED + CAMERA_GESTURE_DISABLED, + WIFI_DISCONNECT_DELAY_DURATION }; /** @@ -7580,6 +7591,7 @@ public final class Settings { */ public static final String WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON = "wifi_networks_available_notification_on"; + /** * {@hide} */ @@ -7651,6 +7663,14 @@ public final class Settings { */ public static final String WIFI_SAVED_STATE = "wifi_saved_state"; + /** + * Used to save the hotspot2 on/off state. + * This state will be used to open/close passpoint functions + * + * @hide + */ + public static final String WIFI_HOTSPOT2_ENABLED = "wifi_hotspot2_enabled"; + /** * The interval in milliseconds to scan as used by the wifi supplicant * @hide @@ -7700,6 +7720,14 @@ public final class Settings { public static final String WIFI_SUSPEND_OPTIMIZATIONS_ENABLED = "wifi_suspend_optimizations_enabled"; + /** + * Setting to turn on auto connect . Enabled by default and + * needs to be set to 1 to disable it. + * @hide + */ + public static final String WIFI_AUTO_CONNECT_TYPE = + "wifi_auto_connect_type"; + /** * Setting to enable verbose logging in Wi-Fi; disabled by default, and setting to 1 * will enable it. In the future, additional values may be supported. diff --git a/core/java/android/speech/SpeechRecognizer.java b/core/java/android/speech/SpeechRecognizer.java index 88e2edeee5521dad048c79364f6f4809c356ed8c..3eb24e499a9da6a1bd2a216d9da4e6ba8fb765df 100644 --- a/core/java/android/speech/SpeechRecognizer.java +++ b/core/java/android/speech/SpeechRecognizer.java @@ -260,6 +260,7 @@ public class SpeechRecognizer { * not set explicitly, default values will be used by the recognizer. */ public void startListening(final Intent recognizerIntent) { + android.util.SeempLog.record(72); if (recognizerIntent == null) { throw new IllegalArgumentException("intent must not be null"); } diff --git a/core/java/android/util/BoostFramework.java b/core/java/android/util/BoostFramework.java new file mode 100644 index 0000000000000000000000000000000000000000..856f42539b634cfb7c10ccefe0d424f9ec9e9e8f --- /dev/null +++ b/core/java/android/util/BoostFramework.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package android.util; + +import android.util.Log; +import dalvik.system.PathClassLoader; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.System; +import android.view.MotionEvent; +import android.util.DisplayMetrics; +import android.os.SystemProperties; +import android.content.Context; + +/** @hide */ +public class BoostFramework { + + private static final String TAG = "BoostFramework"; + private static final String PERFORMANCE_JAR = "/system/framework/QPerformance.jar"; + private static final String PERFORMANCE_CLASS = "com.qualcomm.qti.Performance"; + +/** @hide */ + private static boolean mIsLoaded = false; + private static Method mAcquireFunc = null; + private static Method mReleaseFunc = null; + private static Method mAcquireTouchFunc = null; + private static Method mIOPStart = null; + private static Method mIOPStop = null; + private static Constructor mConstructor = null; + private static int mLockDuration = -1; + private static int mParamVal[]; + private static String mBoostActivityList[]; + private static long mStartTime; + private static final int mDebugBoost = getDebugBoostProperty(); + +/** @hide */ + private Object mPerf = null; + +/** @hide */ + public BoostFramework() { + + if (mIsLoaded == false) { + try { + Class perfClass; + PathClassLoader perfClassLoader; + + perfClassLoader = new PathClassLoader(PERFORMANCE_JAR, + ClassLoader.getSystemClassLoader()); + perfClass = perfClassLoader.loadClass(PERFORMANCE_CLASS); + mConstructor = perfClass.getConstructor(); + + Class[] argClasses = new Class[] {int.class, int[].class}; + mAcquireFunc = perfClass.getDeclaredMethod("perfLockAcquire", argClasses); + Log.v(TAG,"mAcquireFunc method = " + mAcquireFunc); + + argClasses = new Class[] {}; + mReleaseFunc = perfClass.getDeclaredMethod("perfLockRelease", argClasses); + Log.v(TAG,"mReleaseFunc method = " + mReleaseFunc); + + argClasses = new Class[] {MotionEvent.class, DisplayMetrics.class, int.class, int[].class}; + mAcquireTouchFunc = perfClass.getDeclaredMethod("perfLockAcquireTouch", argClasses); + Log.v(TAG,"mAcquireTouchFunc method = " + mAcquireTouchFunc); + + argClasses = new Class[] {int.class, String.class}; + mIOPStart = perfClass.getDeclaredMethod("perfIOPrefetchStart", argClasses); + Log.v(TAG,"mIOPStart method = " + mIOPStart); + + argClasses = new Class[] {}; + mIOPStop = perfClass.getDeclaredMethod("perfIOPrefetchStop", argClasses); + Log.v(TAG,"mIOPStop method = " + mIOPStop); + + mIsLoaded = true; + } + catch(Exception e) { + Log.e(TAG,"BoostFramework() : Exception_1 = " + e); + } + } + + try { + if (mConstructor != null) { + mPerf = mConstructor.newInstance(); + } + } + catch(Exception e) { + Log.e(TAG,"BoostFramework() : Exception_2 = " + e); + } + + Log.v(TAG,"BoostFramework() : mPerf = " + mPerf); + } + +/** @hide */ +/* private static void loadNative() { + if(!isLoaded){ + //System.loadLibrary("perf_jni"); + System.loadLibrary("qti_performance"); + isLoaded=true; + } + return; + } +*/ + +/** @hide */ + public int perfLockAcquire(int duration, int... list) { + int ret = -1; + try { + Object retVal = mAcquireFunc.invoke(mPerf, duration, list); + ret = (int)retVal; + } catch(Exception e) { + Log.e(TAG,"Exception " + e); + } + return ret; + } + +/** @hide */ + public int perfLockRelease() { + int ret = -1; + try { + Object retVal = mReleaseFunc.invoke(mPerf); + ret = (int)retVal; + } catch(Exception e) { + Log.e(TAG,"Exception " + e); + } + return ret; + } + +/** @hide Reads system property + * @return 1 if property is set + */ + public static int getDebugBoostProperty() { + return SystemProperties.getInt("persist.debugboost.enable", 0); + } + +/** @hide Acquires debug boost perflock + * @param ev Touch Screen event + */ + public void enableDebugBoost(Context context, MotionEvent ev, DisplayMetrics metrics) { + + final int NANO_TO_MILLI = 1000000; + long elapsedMillis; + boolean mDebugBoostPossible = false; + + /* extract the XML params */ + if (mLockDuration == -1 || mParamVal == null || mBoostActivityList == null) { + mLockDuration = context.getResources().getInteger( + com.android.internal.R.integer.debugBoost_timeout); + mParamVal = context.getResources().getIntArray( + com.android.internal.R.array.debugBoost_param_value); + mBoostActivityList = context.getResources().getStringArray( + com.android.internal.R.array.debugBoost_activityList); + } + + String currentActivity = context.getPackageName(); + + /* search for the current activity in list */ + for (String match : mBoostActivityList) { + if (currentActivity.indexOf(match) != -1) { + /* break if found */ + mDebugBoostPossible = true; + break; + } + } + + elapsedMillis = (System.nanoTime() - mStartTime)/NANO_TO_MILLI; + + /* elapsed should be atleast greater than lock duration */ + if (mDebugBoostPossible == true && elapsedMillis > mLockDuration) { + perfLockAcquireTouch(ev, metrics, mLockDuration, mParamVal); + mStartTime = System.nanoTime(); + Log.i(TAG, "dBoost: activity = " + currentActivity + " " + "elapsed = " + elapsedMillis); + } + } + +/** @hide sets debug boost if property is set + */ + public boolean boostOverride(Context context, MotionEvent ev, DisplayMetrics metrics) { + /* Enable debug boost if property is set and + * current actiivity is present in list + */ + if (mDebugBoost == 1) { + enableDebugBoost(context, ev, metrics); + return true; + } + return false; + } + +/** @hide */ + public int perfLockAcquireTouch(MotionEvent ev, DisplayMetrics metrics, + int duration, int... list) { + int ret = -1; + try { + Object retVal = mAcquireTouchFunc.invoke(mPerf, ev, metrics, duration, list); + ret = (int)retVal; + } catch(Exception e) { + Log.e(TAG,"Exception " + e); + } + return ret; + } + +/** @hide */ + public int perfIOPrefetchStart(int pid, String pkg_name) + { + int ret = -1; + try { + Object retVal = mIOPStart.invoke(mPerf,pid,pkg_name); + ret = (int)retVal; + } catch(Exception e) { + Log.e(TAG,"Exception " + e); + } + return ret; + } + +/** @hide */ + public int perfIOPrefetchStop() + { + int ret = -1; + try { + Object retVal = mIOPStop.invoke(mPerf); + ret = (int)retVal; + } catch(Exception e) { + Log.e(TAG,"Exception " + e); + } + return ret; + } + +}; diff --git a/core/java/android/util/NativeTextHelper.java b/core/java/android/util/NativeTextHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..87b60a727a075cc4ea78f2e85fb2ba5e8b325617 --- /dev/null +++ b/core/java/android/util/NativeTextHelper.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package android.util; + +import android.content.Context; + +/** + *@hide + */ +public class NativeTextHelper { + + /** + * parse the string to current language. + * + * @param context base context of the application + * @param originalString original string + * @param defPackage the target package where the local language strings + * defined + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + private static final String getLocalString(Context context, String originalString, + String defPackage, int originNamesId, int localNamesId) { + String[] origNames = context.getResources().getStringArray(originNamesId); + String[] localNames = context.getResources().getStringArray(localNamesId); + for (int i = 0; i < origNames.length; i++) { + if (origNames[i].equalsIgnoreCase(originalString)) { + return context.getString(context.getResources().getIdentifier(localNames[i], + "string", defPackage)); + } + } + return originalString; + } + + /** + * parse the string to current language string in public resources. + * + * @param context base context of the application + * @param originalString original string + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + public static final String getLocalString(Context context, String originalString, + int originNamesId, int localNamesId) { + return getLocalString(context, originalString, "android", originNamesId, localNamesId); + } + + /** + * parse the string to current language string in current resources. + * + * @param context base context of the application + * @param originalString original string + * @param originNamesId the id of the original string array. + * @param localNamesId the id of the local string keys. + * @return local language string + */ + public static final String getInternalLocalString(Context context, String originalString, + int originNamesId, + int localNamesId) { + return getLocalString(context, originalString, context.getPackageName(), originNamesId, + localNamesId); + } + +} diff --git a/core/java/android/util/Patterns.java b/core/java/android/util/Patterns.java index 0a452dbc39a16a5f28a96a95e4dc8d143b096f9f..db0c8c56688d95a9815761d8ad5a01fac1240c07 100644 --- a/core/java/android/util/Patterns.java +++ b/core/java/android/util/Patterns.java @@ -305,6 +305,7 @@ public class Patterns { /* A word boundary or end of input. This is to stop foo.sure from matching as foo.su */ private static final String WORD_BOUNDARY = "(?:\\b|$|^)"; + private static final String WORD_BOUNDARY_WWW = "(?:\\b|$|^|www\\.)"; private static final String USER_INFO = "(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)" + "\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_" @@ -355,14 +356,18 @@ public class Patterns { private static final String RELAXED_DOMAIN_NAME = "(?:" + "(?:" + IRI_LABEL + "(?:\\.(?=\\S))" +"?)+" + "|" + IP_ADDRESS + ")"; + private static final String CJK_UNIFIED = "[" + + "\u4E00-\u9FFF" + + "]"; /** * Regular expression to match strings that do not start with a supported protocol. The TLDs * are expected to be one of the known TLDs. */ private static final String WEB_URL_WITHOUT_PROTOCOL = "(" - + WORD_BOUNDARY + + WORD_BOUNDARY_WWW + "(? 0 && resStr.lastIndexOf('x') == pos) { + try { + mOverrideXres = Integer.parseInt(resStr.substring(0, pos)); + mOverrideYres = Integer.parseInt(resStr.substring(pos + 1)); + } catch (NumberFormatException ex) { + Log.e(TAG, "Error in extracting the overriding xres and yres"); + } + } + + if(orientation == Configuration.ORIENTATION_LANDSCAPE) { + int tmp = mOverrideXres; + mOverrideXres = mOverrideYres; + mOverrideYres = tmp; + } + + if(mOverrideXres > 0 && mOverrideYres > 0) { + mIsEnabled = true; + if (DEBUG) Log.i(TAG, "Orientation: " + orientation + + " Overriding resolution to" + " xres: " + mOverrideXres + + " yres: " + mOverrideYres); + } + } + } + + /** @hide */ + public void setFixedSize(SurfaceView view) { + if(!mIsEnabled) { + return; + } + + view.getHolder().setFixedSize(mOverrideXres, mOverrideYres); + } + + /** @hide */ + public void handleTouch(SurfaceView view, MotionEvent ev) { + if(!mIsEnabled) { + return; + } + + Matrix matrix = new Matrix(); + //mOverride{Xres, Yres} are already swapped if orientation is landscape + float xscale = (mOverrideXres * 1.0f) / view.getWidth(); + float yscale = (mOverrideYres * 1.0f) / view.getHeight(); + + if (DEBUG) Log.i(TAG, "Before overriding the touch event x/y : " + ev); + matrix.postScale(xscale, yscale); + ev.transform(matrix); + if (DEBUG) Log.i(TAG, "After overriding the touch event x/y : " + ev); + } + + /** @hide */ + public void handleResize(final SurfaceView surfaceView) { + if(!mIsEnabled) { + return; + } + + /* Change the visibility to GONE and back to VISIBLE and post it + * on the main thread for the touch events to be effective on the + * changed SurfaceView with the new dimensions + */ + surfaceView.post(new Runnable() { + @Override + public void run() { + surfaceView.setVisibility(View.GONE); + } + }); + + surfaceView.postDelayed(new Runnable() { + @Override + public void run() { + surfaceView.setVisibility(View.VISIBLE); + } + }, 100); + } +}; diff --git a/core/java/android/util/SeempLog.java b/core/java/android/util/SeempLog.java new file mode 100644 index 0000000000000000000000000000000000000000..3764882644d8d9d62c066106f9833e784c7af426 --- /dev/null +++ b/core/java/android/util/SeempLog.java @@ -0,0 +1,754 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package android.util; + +import com.android.internal.os.RuntimeInit; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.UnknownHostException; +import java.util.Hashtable; +import java.util.Map; +import java.util.List; +import java.util.Iterator; +import android.util.Log; +import android.provider.Settings; + +/** + * SeempLog + * + * @hide + */ +public final class SeempLog { + private SeempLog() { + } + + /** + * Send a log message to the seemp log. + * @param api The api triggering this message. + */ + public static int record(int api) { + return seemp_println_native(api, ""); + } + + /** + * Send a log message to the seemp log. + * @param api The api triggering this message. + * @param msg The message you would like logged. + */ + public static int record_str(int api, String msg) { + if ( msg != null ) { + return seemp_println_native(api, msg); + } + else { + return seemp_println_native(api, ""); + } + } + + public static int record_sensor(int api, + android.hardware.Sensor sensor) { + if ( sensor != null ) { + return seemp_println_native(api, "sensor="+sensor.getType()); + } + else { + return seemp_println_native(api, "sensor=-1"); + } + } + + public static int record_sensor_rate(int api, + android.hardware.Sensor sensor, int rate) { + if ( sensor != null ) { + return seemp_println_native(api, + "sensor="+sensor.getType() + ",rate="+rate); + } + else { + return seemp_println_native(api, "sensor=-1,rate=" + rate); + } + } + + public static int record_uri(int api, android.net.Uri uri) { + if ( uri != null ) { + return seemp_println_native(api, "uri, " + uri.toString()); + } + else { + return seemp_println_native(api, "uri, null" ); + } + } + + public static int record_vg_layout(int api, + android.view.ViewGroup.LayoutParams params) { + try { + android.view.WindowManager.LayoutParams p = + (android.view.WindowManager.LayoutParams) params; + if ( p != null ) { + return seemp_println_native(api, + "window_type=" + p.type + ",window_flag=" + p.flags); + } + else { + return seemp_println_native(api, ""); + } + } catch (ClassCastException cce) { + return seemp_println_native(api, ""); + } + } + + /** @hide */ public static native int seemp_println_native(int api, String msg); + + public static final int SEEMP_API_android_provider_Settings__get_ANDROID_ID_ = 7; + public static final int SEEMP_API_android_provider_Settings__get_ACCELEROMETER_ROTATION_ = 96; + public static final int SEEMP_API_android_provider_Settings__get_USER_ROTATION_ = 97; + public static final int SEEMP_API_android_provider_Settings__get_ADB_ENABLED_ = 98; + public static final int SEEMP_API_android_provider_Settings__get_DEBUG_APP_ = 99; + public static final int SEEMP_API_android_provider_Settings__get_WAIT_FOR_DEBUGGER_ = 100; + public static final int SEEMP_API_android_provider_Settings__get_AIRPLANE_MODE_ON_ = 101; + public static final int SEEMP_API_android_provider_Settings__get_AIRPLANE_MODE_RADIOS_ = 102; + public static final int SEEMP_API_android_provider_Settings__get_ALARM_ALERT_ = 103; + public static final int SEEMP_API_android_provider_Settings__get_NEXT_ALARM_FORMATTED_ = 104; + public static final int SEEMP_API_android_provider_Settings__get_ALWAYS_FINISH_ACTIVITIES_ = 105; + public static final int SEEMP_API_android_provider_Settings__get_LOGGING_ID_ = 106; + public static final int SEEMP_API_android_provider_Settings__get_ANIMATOR_DURATION_SCALE_ = 107; + public static final int SEEMP_API_android_provider_Settings__get_WINDOW_ANIMATION_SCALE_ = 108; + public static final int SEEMP_API_android_provider_Settings__get_FONT_SCALE_ = 109; + public static final int SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_ = 110; + public static final int SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_MODE_ = 111; + public static final int SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_MODE_AUTOMATIC_ = 112; + public static final int SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_MODE_MANUAL_ = 113; + public static final int SEEMP_API_android_provider_Settings__get_SCREEN_OFF_TIMEOUT_ = 114; + public static final int SEEMP_API_android_provider_Settings__get_DIM_SCREEN_ = 115; + public static final int SEEMP_API_android_provider_Settings__get_TRANSITION_ANIMATION_SCALE_ = 116; + public static final int SEEMP_API_android_provider_Settings__get_STAY_ON_WHILE_PLUGGED_IN_ = 117; + public static final int SEEMP_API_android_provider_Settings__get_WALLPAPER_ACTIVITY_ = 118; + public static final int SEEMP_API_android_provider_Settings__get_SHOW_PROCESSES_ = 119; + public static final int SEEMP_API_android_provider_Settings__get_SHOW_WEB_SUGGESTIONS_ = 120; + public static final int SEEMP_API_android_provider_Settings__get_SHOW_GTALK_SERVICE_STATUS_ = 121; + public static final int SEEMP_API_android_provider_Settings__get_USE_GOOGLE_MAIL_ = 122; + public static final int SEEMP_API_android_provider_Settings__get_AUTO_TIME_ = 123; + public static final int SEEMP_API_android_provider_Settings__get_AUTO_TIME_ZONE_ = 124; + public static final int SEEMP_API_android_provider_Settings__get_DATE_FORMAT_ = 125; + public static final int SEEMP_API_android_provider_Settings__get_TIME_12_24_ = 126; + public static final int SEEMP_API_android_provider_Settings__get_BLUETOOTH_DISCOVERABILITY_ = 127; + public static final int SEEMP_API_android_provider_Settings__get_BLUETOOTH_DISCOVERABILITY_TIMEOUT_ = 128; + public static final int SEEMP_API_android_provider_Settings__get_BLUETOOTH_ON_ = 129; + public static final int SEEMP_API_android_provider_Settings__get_DEVICE_PROVISIONED_ = 130; + public static final int SEEMP_API_android_provider_Settings__get_SETUP_WIZARD_HAS_RUN_ = 131; + public static final int SEEMP_API_android_provider_Settings__get_DTMF_TONE_WHEN_DIALING_ = 132; + public static final int SEEMP_API_android_provider_Settings__get_END_BUTTON_BEHAVIOR_ = 133; + public static final int SEEMP_API_android_provider_Settings__get_RINGTONE_ = 134; + public static final int SEEMP_API_android_provider_Settings__get_MODE_RINGER_ = 135; + public static final int SEEMP_API_android_provider_Settings__get_INSTALL_NON_MARKET_APPS_ = 136; + public static final int SEEMP_API_android_provider_Settings__get_LOCATION_PROVIDERS_ALLOWED_ = 137; + public static final int SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_ENABLED_ = 138; + public static final int SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED_ = 139; + public static final int SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_VISIBLE_ = 140; + public static final int SEEMP_API_android_provider_Settings__get_NETWORK_PREFERENCE_ = 141; + public static final int SEEMP_API_android_provider_Settings__get_DATA_ROAMING_ = 142; + public static final int SEEMP_API_android_provider_Settings__get_HTTP_PROXY_ = 143; + public static final int SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_ENABLED_ = 144; + public static final int SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_LAST_UPDATE_ = 145; + public static final int SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_REDIRECT_URL_ = 146; + public static final int SEEMP_API_android_provider_Settings__get_RADIO_BLUETOOTH_ = 147; + public static final int SEEMP_API_android_provider_Settings__get_RADIO_CELL_ = 148; + public static final int SEEMP_API_android_provider_Settings__get_RADIO_NFC_ = 149; + public static final int SEEMP_API_android_provider_Settings__get_RADIO_WIFI_ = 150; + public static final int SEEMP_API_android_provider_Settings__get_SYS_PROP_SETTING_VERSION_ = 151; + public static final int SEEMP_API_android_provider_Settings__get_SETTINGS_CLASSNAME_ = 152; + public static final int SEEMP_API_android_provider_Settings__get_TEXT_AUTO_CAPS_ = 153; + public static final int SEEMP_API_android_provider_Settings__get_TEXT_AUTO_PUNCTUATE_ = 154; + public static final int SEEMP_API_android_provider_Settings__get_TEXT_AUTO_REPLACE_ = 155; + public static final int SEEMP_API_android_provider_Settings__get_TEXT_SHOW_PASSWORD_ = 156; + public static final int SEEMP_API_android_provider_Settings__get_USB_MASS_STORAGE_ENABLED_ = 157; + public static final int SEEMP_API_android_provider_Settings__get_VIBRATE_ON_ = 158; + public static final int SEEMP_API_android_provider_Settings__get_HAPTIC_FEEDBACK_ENABLED_ = 159; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_ALARM_ = 160; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_BLUETOOTH_SCO_ = 161; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_MUSIC_ = 162; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_NOTIFICATION_ = 163; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_RING_ = 164; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_SYSTEM_ = 165; + public static final int SEEMP_API_android_provider_Settings__get_VOLUME_VOICE_ = 166; + public static final int SEEMP_API_android_provider_Settings__get_SOUND_EFFECTS_ENABLED_ = 167; + public static final int SEEMP_API_android_provider_Settings__get_MODE_RINGER_STREAMS_AFFECTED_ = 168; + public static final int SEEMP_API_android_provider_Settings__get_MUTE_STREAMS_AFFECTED_ = 169; + public static final int SEEMP_API_android_provider_Settings__get_NOTIFICATION_SOUND_ = 170; + public static final int SEEMP_API_android_provider_Settings__get_APPEND_FOR_LAST_AUDIBLE_ = 171; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_MAX_DHCP_RETRY_COUNT_ = 172; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS_ = 173; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON_ = 174; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY_ = 175; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_NUM_OPEN_NETWORKS_KEPT_ = 176; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_ON_ = 177; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_SLEEP_POLICY_ = 178; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_SLEEP_POLICY_DEFAULT_ = 179; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_SLEEP_POLICY_NEVER_ = 180; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED_ = 181; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_STATIC_DNS1_ = 182; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_STATIC_DNS2_ = 183; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_STATIC_GATEWAY_ = 184; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_STATIC_IP_ = 185; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_STATIC_NETMASK_ = 186; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_USE_STATIC_IP_ = 187; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE_ = 188; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_AP_COUNT_ = 189; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS_ = 190; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED_ = 191; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS_ = 192; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT_ = 193; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_MAX_AP_CHECKS_ = 194; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_ON_ = 195; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_COUNT_ = 196; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_DELAY_MS_ = 197; + public static final int SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_TIMEOUT_MS_ = 198; + public static final int SEEMP_API_android_provider_Settings__put_ACCELEROMETER_ROTATION_ = 199; + public static final int SEEMP_API_android_provider_Settings__put_USER_ROTATION_ = 200; + public static final int SEEMP_API_android_provider_Settings__put_ADB_ENABLED_ = 201; + public static final int SEEMP_API_android_provider_Settings__put_DEBUG_APP_ = 202; + public static final int SEEMP_API_android_provider_Settings__put_WAIT_FOR_DEBUGGER_ = 203; + public static final int SEEMP_API_android_provider_Settings__put_AIRPLANE_MODE_ON_ = 204; + public static final int SEEMP_API_android_provider_Settings__put_AIRPLANE_MODE_RADIOS_ = 205; + public static final int SEEMP_API_android_provider_Settings__put_ALARM_ALERT_ = 206; + public static final int SEEMP_API_android_provider_Settings__put_NEXT_ALARM_FORMATTED_ = 207; + public static final int SEEMP_API_android_provider_Settings__put_ALWAYS_FINISH_ACTIVITIES_ = 208; + public static final int SEEMP_API_android_provider_Settings__put_ANDROID_ID_ = 209; + public static final int SEEMP_API_android_provider_Settings__put_LOGGING_ID_ = 210; + public static final int SEEMP_API_android_provider_Settings__put_ANIMATOR_DURATION_SCALE_ = 211; + public static final int SEEMP_API_android_provider_Settings__put_WINDOW_ANIMATION_SCALE_ = 212; + public static final int SEEMP_API_android_provider_Settings__put_FONT_SCALE_ = 213; + public static final int SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_ = 214; + public static final int SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_MODE_ = 215; + public static final int SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_MODE_AUTOMATIC_ = 216; + public static final int SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_MODE_MANUAL_ = 217; + public static final int SEEMP_API_android_provider_Settings__put_SCREEN_OFF_TIMEOUT_ = 218; + public static final int SEEMP_API_android_provider_Settings__put_DIM_SCREEN_ = 219; + public static final int SEEMP_API_android_provider_Settings__put_TRANSITION_ANIMATION_SCALE_ = 220; + public static final int SEEMP_API_android_provider_Settings__put_STAY_ON_WHILE_PLUGGED_IN_ = 221; + public static final int SEEMP_API_android_provider_Settings__put_WALLPAPER_ACTIVITY_ = 222; + public static final int SEEMP_API_android_provider_Settings__put_SHOW_PROCESSES_ = 223; + public static final int SEEMP_API_android_provider_Settings__put_SHOW_WEB_SUGGESTIONS_ = 224; + public static final int SEEMP_API_android_provider_Settings__put_SHOW_GTALK_SERVICE_STATUS_ = 225; + public static final int SEEMP_API_android_provider_Settings__put_USE_GOOGLE_MAIL_ = 226; + public static final int SEEMP_API_android_provider_Settings__put_AUTO_TIME_ = 227; + public static final int SEEMP_API_android_provider_Settings__put_AUTO_TIME_ZONE_ = 228; + public static final int SEEMP_API_android_provider_Settings__put_DATE_FORMAT_ = 229; + public static final int SEEMP_API_android_provider_Settings__put_TIME_12_24_ = 230; + public static final int SEEMP_API_android_provider_Settings__put_BLUETOOTH_DISCOVERABILITY_ = 231; + public static final int SEEMP_API_android_provider_Settings__put_BLUETOOTH_DISCOVERABILITY_TIMEOUT_ = 232; + public static final int SEEMP_API_android_provider_Settings__put_BLUETOOTH_ON_ = 233; + public static final int SEEMP_API_android_provider_Settings__put_DEVICE_PROVISIONED_ = 234; + public static final int SEEMP_API_android_provider_Settings__put_SETUP_WIZARD_HAS_RUN_ = 235; + public static final int SEEMP_API_android_provider_Settings__put_DTMF_TONE_WHEN_DIALING_ = 236; + public static final int SEEMP_API_android_provider_Settings__put_END_BUTTON_BEHAVIOR_ = 237; + public static final int SEEMP_API_android_provider_Settings__put_RINGTONE_ = 238; + public static final int SEEMP_API_android_provider_Settings__put_MODE_RINGER_ = 239; + public static final int SEEMP_API_android_provider_Settings__put_INSTALL_NON_MARKET_APPS_ = 240; + public static final int SEEMP_API_android_provider_Settings__put_LOCATION_PROVIDERS_ALLOWED_ = 241; + public static final int SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_ENABLED_ = 242; + public static final int SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED_ = 243; + public static final int SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_VISIBLE_ = 244; + public static final int SEEMP_API_android_provider_Settings__put_NETWORK_PREFERENCE_ = 245; + public static final int SEEMP_API_android_provider_Settings__put_DATA_ROAMING_ = 246; + public static final int SEEMP_API_android_provider_Settings__put_HTTP_PROXY_ = 247; + public static final int SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_ENABLED_ = 248; + public static final int SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_LAST_UPDATE_ = 249; + public static final int SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_REDIRECT_URL_ = 250; + public static final int SEEMP_API_android_provider_Settings__put_RADIO_BLUETOOTH_ = 251; + public static final int SEEMP_API_android_provider_Settings__put_RADIO_CELL_ = 252; + public static final int SEEMP_API_android_provider_Settings__put_RADIO_NFC_ = 253; + public static final int SEEMP_API_android_provider_Settings__put_RADIO_WIFI_ = 254; + public static final int SEEMP_API_android_provider_Settings__put_SYS_PROP_SETTING_VERSION_ = 255; + public static final int SEEMP_API_android_provider_Settings__put_SETTINGS_CLASSNAME_ = 256; + public static final int SEEMP_API_android_provider_Settings__put_TEXT_AUTO_CAPS_ = 257; + public static final int SEEMP_API_android_provider_Settings__put_TEXT_AUTO_PUNCTUATE_ = 258; + public static final int SEEMP_API_android_provider_Settings__put_TEXT_AUTO_REPLACE_ = 259; + public static final int SEEMP_API_android_provider_Settings__put_TEXT_SHOW_PASSWORD_ = 260; + public static final int SEEMP_API_android_provider_Settings__put_USB_MASS_STORAGE_ENABLED_ = 261; + public static final int SEEMP_API_android_provider_Settings__put_VIBRATE_ON_ = 262; + public static final int SEEMP_API_android_provider_Settings__put_HAPTIC_FEEDBACK_ENABLED_ = 263; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_ALARM_ = 264; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_BLUETOOTH_SCO_ = 265; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_MUSIC_ = 266; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_NOTIFICATION_ = 267; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_RING_ = 268; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_SYSTEM_ = 269; + public static final int SEEMP_API_android_provider_Settings__put_VOLUME_VOICE_ = 270; + public static final int SEEMP_API_android_provider_Settings__put_SOUND_EFFECTS_ENABLED_ = 271; + public static final int SEEMP_API_android_provider_Settings__put_MODE_RINGER_STREAMS_AFFECTED_ = 272; + public static final int SEEMP_API_android_provider_Settings__put_MUTE_STREAMS_AFFECTED_ = 273; + public static final int SEEMP_API_android_provider_Settings__put_NOTIFICATION_SOUND_ = 274; + public static final int SEEMP_API_android_provider_Settings__put_APPEND_FOR_LAST_AUDIBLE_ = 275; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_MAX_DHCP_RETRY_COUNT_ = 276; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS_ = 277; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON_ = 278; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY_ = 279; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_NUM_OPEN_NETWORKS_KEPT_ = 280; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_ON_ = 281; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_SLEEP_POLICY_ = 282; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_SLEEP_POLICY_DEFAULT_ = 283; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_SLEEP_POLICY_NEVER_ = 284; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_SLEEP_POLICY_NEVER_WHILE_PLUGGED_ = 285; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_STATIC_DNS1_ = 286; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_STATIC_DNS2_ = 287; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_STATIC_GATEWAY_ = 288; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_STATIC_IP_ = 289; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_STATIC_NETMASK_ = 290; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_USE_STATIC_IP_ = 291; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE_ = 292; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_AP_COUNT_ = 293; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS_ = 294; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED_ = 295; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS_ = 296; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT_ = 297; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_MAX_AP_CHECKS_ = 298; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_ON_ = 299; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_COUNT_ = 300; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_DELAY_MS_ = 301; + public static final int SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_TIMEOUT_MS_ = 302; + + private final static java.util.Map value_to_get_map; + static { + value_to_get_map = new java.util.HashMap( 198 ); + value_to_get_map.put(Settings.System.NOTIFICATION_SOUND, + SEEMP_API_android_provider_Settings__get_NOTIFICATION_SOUND_); + value_to_get_map.put(Settings.System.DTMF_TONE_WHEN_DIALING, + SEEMP_API_android_provider_Settings__get_DTMF_TONE_WHEN_DIALING_); + value_to_get_map.put(Settings.System.LOCK_PATTERN_ENABLED, + SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_ENABLED_); + value_to_get_map.put(Settings.System.WIFI_MAX_DHCP_RETRY_COUNT, + SEEMP_API_android_provider_Settings__get_WIFI_MAX_DHCP_RETRY_COUNT_); + value_to_get_map.put(Settings.System.AUTO_TIME, + SEEMP_API_android_provider_Settings__get_AUTO_TIME_); + value_to_get_map.put(Settings.System.SETUP_WIZARD_HAS_RUN, + SEEMP_API_android_provider_Settings__get_SETUP_WIZARD_HAS_RUN_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS_); + value_to_get_map.put(Settings.System.LOCATION_PROVIDERS_ALLOWED, + SEEMP_API_android_provider_Settings__get_LOCATION_PROVIDERS_ALLOWED_); + value_to_get_map.put(Settings.System.ALARM_ALERT, + SEEMP_API_android_provider_Settings__get_ALARM_ALERT_); + value_to_get_map.put(Settings.System.VIBRATE_ON, + SEEMP_API_android_provider_Settings__get_VIBRATE_ON_); + value_to_get_map.put(Settings.System.USB_MASS_STORAGE_ENABLED, + SEEMP_API_android_provider_Settings__get_USB_MASS_STORAGE_ENABLED_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_PING_DELAY_MS, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_DELAY_MS_); + value_to_get_map.put(Settings.System.FONT_SCALE, + SEEMP_API_android_provider_Settings__get_FONT_SCALE_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_AP_COUNT, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_AP_COUNT_); + value_to_get_map.put(Settings.System.ALWAYS_FINISH_ACTIVITIES, + SEEMP_API_android_provider_Settings__get_ALWAYS_FINISH_ACTIVITIES_); + value_to_get_map.put(Settings.System.ACCELEROMETER_ROTATION, + SEEMP_API_android_provider_Settings__get_ACCELEROMETER_ROTATION_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_PING_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_TIMEOUT_MS_); + value_to_get_map.put(Settings.System.VOLUME_NOTIFICATION, + SEEMP_API_android_provider_Settings__get_VOLUME_NOTIFICATION_); + value_to_get_map.put(Settings.System.AIRPLANE_MODE_ON, + SEEMP_API_android_provider_Settings__get_AIRPLANE_MODE_ON_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS_); + value_to_get_map.put(Settings.System.WIFI_STATIC_IP, + SEEMP_API_android_provider_Settings__get_WIFI_STATIC_IP_); + value_to_get_map.put(Settings.System.RADIO_BLUETOOTH, + SEEMP_API_android_provider_Settings__get_RADIO_BLUETOOTH_); + value_to_get_map.put(Settings.System.BLUETOOTH_DISCOVERABILITY_TIMEOUT, + SEEMP_API_android_provider_Settings__get_BLUETOOTH_DISCOVERABILITY_TIMEOUT_); + value_to_get_map.put(Settings.System.VOLUME_RING, + SEEMP_API_android_provider_Settings__get_VOLUME_RING_); + value_to_get_map.put(Settings.System.MODE_RINGER_STREAMS_AFFECTED, + SEEMP_API_android_provider_Settings__get_MODE_RINGER_STREAMS_AFFECTED_); + value_to_get_map.put(Settings.System.VOLUME_SYSTEM, + SEEMP_API_android_provider_Settings__get_VOLUME_SYSTEM_); + value_to_get_map.put(Settings.System.SCREEN_OFF_TIMEOUT, + SEEMP_API_android_provider_Settings__get_SCREEN_OFF_TIMEOUT_); + value_to_get_map.put(Settings.System.RADIO_WIFI, + SEEMP_API_android_provider_Settings__get_RADIO_WIFI_); + value_to_get_map.put(Settings.System.AUTO_TIME_ZONE, + SEEMP_API_android_provider_Settings__get_AUTO_TIME_ZONE_); + value_to_get_map.put(Settings.System.TEXT_AUTO_CAPS, + SEEMP_API_android_provider_Settings__get_TEXT_AUTO_CAPS_); + value_to_get_map.put(Settings.System.WALLPAPER_ACTIVITY, + SEEMP_API_android_provider_Settings__get_WALLPAPER_ACTIVITY_); + value_to_get_map.put(Settings.System.ANIMATOR_DURATION_SCALE, + SEEMP_API_android_provider_Settings__get_ANIMATOR_DURATION_SCALE_); + value_to_get_map.put(Settings.System.WIFI_NUM_OPEN_NETWORKS_KEPT, + SEEMP_API_android_provider_Settings__get_WIFI_NUM_OPEN_NETWORKS_KEPT_); + value_to_get_map.put(Settings.System.LOCK_PATTERN_VISIBLE, + SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_VISIBLE_); + value_to_get_map.put(Settings.System.VOLUME_VOICE, + SEEMP_API_android_provider_Settings__get_VOLUME_VOICE_); + value_to_get_map.put(Settings.System.DEBUG_APP, + SEEMP_API_android_provider_Settings__get_DEBUG_APP_); + value_to_get_map.put(Settings.System.WIFI_ON, + SEEMP_API_android_provider_Settings__get_WIFI_ON_); + value_to_get_map.put(Settings.System.TEXT_SHOW_PASSWORD, + SEEMP_API_android_provider_Settings__get_TEXT_SHOW_PASSWORD_); + value_to_get_map.put(Settings.System.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, + SEEMP_API_android_provider_Settings__get_WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY_); + value_to_get_map.put(Settings.System.WIFI_SLEEP_POLICY, + SEEMP_API_android_provider_Settings__get_WIFI_SLEEP_POLICY_); + value_to_get_map.put(Settings.System.VOLUME_MUSIC, + SEEMP_API_android_provider_Settings__get_VOLUME_MUSIC_); + value_to_get_map.put(Settings.System.PARENTAL_CONTROL_LAST_UPDATE, + SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_LAST_UPDATE_); + value_to_get_map.put(Settings.System.DEVICE_PROVISIONED, + SEEMP_API_android_provider_Settings__get_DEVICE_PROVISIONED_); + value_to_get_map.put(Settings.System.HTTP_PROXY, + SEEMP_API_android_provider_Settings__get_HTTP_PROXY_); + value_to_get_map.put(Settings.System.ANDROID_ID, + SEEMP_API_android_provider_Settings__get_ANDROID_ID_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_MAX_AP_CHECKS, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_MAX_AP_CHECKS_); + value_to_get_map.put(Settings.System.END_BUTTON_BEHAVIOR, + SEEMP_API_android_provider_Settings__get_END_BUTTON_BEHAVIOR_); + value_to_get_map.put(Settings.System.NEXT_ALARM_FORMATTED, + SEEMP_API_android_provider_Settings__get_NEXT_ALARM_FORMATTED_); + value_to_get_map.put(Settings.System.RADIO_CELL, + SEEMP_API_android_provider_Settings__get_RADIO_CELL_); + value_to_get_map.put(Settings.System.PARENTAL_CONTROL_ENABLED, + SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_ENABLED_); + value_to_get_map.put(Settings.System.BLUETOOTH_ON, + SEEMP_API_android_provider_Settings__get_BLUETOOTH_ON_); + value_to_get_map.put(Settings.System.WINDOW_ANIMATION_SCALE, + SEEMP_API_android_provider_Settings__get_WINDOW_ANIMATION_SCALE_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED_); + value_to_get_map.put(Settings.System.BLUETOOTH_DISCOVERABILITY, + SEEMP_API_android_provider_Settings__get_BLUETOOTH_DISCOVERABILITY_); + value_to_get_map.put(Settings.System.WIFI_STATIC_DNS1, + SEEMP_API_android_provider_Settings__get_WIFI_STATIC_DNS1_); + value_to_get_map.put(Settings.System.WIFI_STATIC_DNS2, + SEEMP_API_android_provider_Settings__get_WIFI_STATIC_DNS2_); + value_to_get_map.put(Settings.System.HAPTIC_FEEDBACK_ENABLED, + SEEMP_API_android_provider_Settings__get_HAPTIC_FEEDBACK_ENABLED_); + value_to_get_map.put(Settings.System.SHOW_WEB_SUGGESTIONS, + SEEMP_API_android_provider_Settings__get_SHOW_WEB_SUGGESTIONS_); + value_to_get_map.put(Settings.System.PARENTAL_CONTROL_REDIRECT_URL, + SEEMP_API_android_provider_Settings__get_PARENTAL_CONTROL_REDIRECT_URL_); + value_to_get_map.put(Settings.System.DATE_FORMAT, + SEEMP_API_android_provider_Settings__get_DATE_FORMAT_); + value_to_get_map.put(Settings.System.RADIO_NFC, + SEEMP_API_android_provider_Settings__get_RADIO_NFC_); + value_to_get_map.put(Settings.System.AIRPLANE_MODE_RADIOS, + SEEMP_API_android_provider_Settings__get_AIRPLANE_MODE_RADIOS_); + value_to_get_map.put(Settings.System.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, + SEEMP_API_android_provider_Settings__get_LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED_); + value_to_get_map.put(Settings.System.TIME_12_24, + SEEMP_API_android_provider_Settings__get_TIME_12_24_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT_); + value_to_get_map.put(Settings.System.VOLUME_BLUETOOTH_SCO, + SEEMP_API_android_provider_Settings__get_VOLUME_BLUETOOTH_SCO_); + value_to_get_map.put(Settings.System.USER_ROTATION, + SEEMP_API_android_provider_Settings__get_USER_ROTATION_); + value_to_get_map.put(Settings.System.WIFI_STATIC_GATEWAY, + SEEMP_API_android_provider_Settings__get_WIFI_STATIC_GATEWAY_); + value_to_get_map.put(Settings.System.STAY_ON_WHILE_PLUGGED_IN, + SEEMP_API_android_provider_Settings__get_STAY_ON_WHILE_PLUGGED_IN_); + value_to_get_map.put(Settings.System.SOUND_EFFECTS_ENABLED, + SEEMP_API_android_provider_Settings__get_SOUND_EFFECTS_ENABLED_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_PING_COUNT, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_PING_COUNT_); + value_to_get_map.put(Settings.System.DATA_ROAMING, + SEEMP_API_android_provider_Settings__get_DATA_ROAMING_); + value_to_get_map.put(Settings.System.SETTINGS_CLASSNAME, + SEEMP_API_android_provider_Settings__get_SETTINGS_CLASSNAME_); + value_to_get_map.put(Settings.System.TRANSITION_ANIMATION_SCALE, + SEEMP_API_android_provider_Settings__get_TRANSITION_ANIMATION_SCALE_); + value_to_get_map.put(Settings.System.WAIT_FOR_DEBUGGER, + SEEMP_API_android_provider_Settings__get_WAIT_FOR_DEBUGGER_); + value_to_get_map.put(Settings.System.INSTALL_NON_MARKET_APPS, + SEEMP_API_android_provider_Settings__get_INSTALL_NON_MARKET_APPS_); + value_to_get_map.put(Settings.System.ADB_ENABLED, + SEEMP_API_android_provider_Settings__get_ADB_ENABLED_); + value_to_get_map.put(Settings.System.WIFI_USE_STATIC_IP, + SEEMP_API_android_provider_Settings__get_WIFI_USE_STATIC_IP_); + value_to_get_map.put(Settings.System.DIM_SCREEN, + SEEMP_API_android_provider_Settings__get_DIM_SCREEN_); + value_to_get_map.put(Settings.System.VOLUME_ALARM, + SEEMP_API_android_provider_Settings__get_VOLUME_ALARM_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_ON, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_ON_); + value_to_get_map.put(Settings.System.WIFI_STATIC_NETMASK, + SEEMP_API_android_provider_Settings__get_WIFI_STATIC_NETMASK_); + value_to_get_map.put(Settings.System.NETWORK_PREFERENCE, + SEEMP_API_android_provider_Settings__get_NETWORK_PREFERENCE_); + value_to_get_map.put(Settings.System.SHOW_PROCESSES, + SEEMP_API_android_provider_Settings__get_SHOW_PROCESSES_); + value_to_get_map.put(Settings.System.TEXT_AUTO_REPLACE, + SEEMP_API_android_provider_Settings__get_TEXT_AUTO_REPLACE_); + value_to_get_map.put(Settings.System.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, + SEEMP_API_android_provider_Settings__get_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON_); + value_to_get_map.put(Settings.System.APPEND_FOR_LAST_AUDIBLE, + SEEMP_API_android_provider_Settings__get_APPEND_FOR_LAST_AUDIBLE_); + value_to_get_map.put(Settings.System.SHOW_GTALK_SERVICE_STATUS, + SEEMP_API_android_provider_Settings__get_SHOW_GTALK_SERVICE_STATUS_); + value_to_get_map.put(Settings.System.SCREEN_BRIGHTNESS, + SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_); + value_to_get_map.put(Settings.System.USE_GOOGLE_MAIL, + SEEMP_API_android_provider_Settings__get_USE_GOOGLE_MAIL_); + value_to_get_map.put(Settings.System.RINGTONE, + SEEMP_API_android_provider_Settings__get_RINGTONE_); + value_to_get_map.put(Settings.System.LOGGING_ID, + SEEMP_API_android_provider_Settings__get_LOGGING_ID_); + value_to_get_map.put(Settings.System.MODE_RINGER, + SEEMP_API_android_provider_Settings__get_MODE_RINGER_); + value_to_get_map.put(Settings.System.MUTE_STREAMS_AFFECTED, + SEEMP_API_android_provider_Settings__get_MUTE_STREAMS_AFFECTED_); + value_to_get_map.put(Settings.System.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE, + SEEMP_API_android_provider_Settings__get_WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE_); + value_to_get_map.put(Settings.System.TEXT_AUTO_PUNCTUATE, + SEEMP_API_android_provider_Settings__get_TEXT_AUTO_PUNCTUATE_); + value_to_get_map.put(Settings.System.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__get_WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS_); + value_to_get_map.put(Settings.System.SCREEN_BRIGHTNESS_MODE, + SEEMP_API_android_provider_Settings__get_SCREEN_BRIGHTNESS_MODE_); + } + + public static int getSeempGetApiIdFromValue( String v ) + { + Integer result = value_to_get_map.get( v ); + if (result == null) + { + result = -1; + } + return result; + } + + private final static java.util.Map value_to_put_map; + static { + value_to_put_map = new java.util.HashMap( 198 ); + value_to_put_map.put(Settings.System.NOTIFICATION_SOUND, + SEEMP_API_android_provider_Settings__put_NOTIFICATION_SOUND_); + value_to_put_map.put(Settings.System.DTMF_TONE_WHEN_DIALING, + SEEMP_API_android_provider_Settings__put_DTMF_TONE_WHEN_DIALING_); + value_to_put_map.put(Settings.System.LOCK_PATTERN_ENABLED, + SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_ENABLED_); + value_to_put_map.put(Settings.System.WIFI_MAX_DHCP_RETRY_COUNT, + SEEMP_API_android_provider_Settings__put_WIFI_MAX_DHCP_RETRY_COUNT_); + value_to_put_map.put(Settings.System.AUTO_TIME, + SEEMP_API_android_provider_Settings__put_AUTO_TIME_); + value_to_put_map.put(Settings.System.SETUP_WIZARD_HAS_RUN, + SEEMP_API_android_provider_Settings__put_SETUP_WIZARD_HAS_RUN_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_TIMEOUT_MS_); + value_to_put_map.put(Settings.System.LOCATION_PROVIDERS_ALLOWED, + SEEMP_API_android_provider_Settings__put_LOCATION_PROVIDERS_ALLOWED_); + value_to_put_map.put(Settings.System.ALARM_ALERT, + SEEMP_API_android_provider_Settings__put_ALARM_ALERT_); + value_to_put_map.put(Settings.System.VIBRATE_ON, + SEEMP_API_android_provider_Settings__put_VIBRATE_ON_); + value_to_put_map.put(Settings.System.USB_MASS_STORAGE_ENABLED, + SEEMP_API_android_provider_Settings__put_USB_MASS_STORAGE_ENABLED_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_PING_DELAY_MS, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_DELAY_MS_); + value_to_put_map.put(Settings.System.FONT_SCALE, + SEEMP_API_android_provider_Settings__put_FONT_SCALE_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_AP_COUNT, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_AP_COUNT_); + value_to_put_map.put(Settings.System.ALWAYS_FINISH_ACTIVITIES, + SEEMP_API_android_provider_Settings__put_ALWAYS_FINISH_ACTIVITIES_); + value_to_put_map.put(Settings.System.ACCELEROMETER_ROTATION, + SEEMP_API_android_provider_Settings__put_ACCELEROMETER_ROTATION_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_PING_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_TIMEOUT_MS_); + value_to_put_map.put(Settings.System.VOLUME_NOTIFICATION, + SEEMP_API_android_provider_Settings__put_VOLUME_NOTIFICATION_); + value_to_put_map.put(Settings.System.AIRPLANE_MODE_ON, + SEEMP_API_android_provider_Settings__put_AIRPLANE_MODE_ON_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_DELAY_MS_); + value_to_put_map.put(Settings.System.WIFI_STATIC_IP, + SEEMP_API_android_provider_Settings__put_WIFI_STATIC_IP_); + value_to_put_map.put(Settings.System.RADIO_BLUETOOTH, + SEEMP_API_android_provider_Settings__put_RADIO_BLUETOOTH_); + value_to_put_map.put(Settings.System.BLUETOOTH_DISCOVERABILITY_TIMEOUT, + SEEMP_API_android_provider_Settings__put_BLUETOOTH_DISCOVERABILITY_TIMEOUT_); + value_to_put_map.put(Settings.System.VOLUME_RING, + SEEMP_API_android_provider_Settings__put_VOLUME_RING_); + value_to_put_map.put(Settings.System.MODE_RINGER_STREAMS_AFFECTED, + SEEMP_API_android_provider_Settings__put_MODE_RINGER_STREAMS_AFFECTED_); + value_to_put_map.put(Settings.System.VOLUME_SYSTEM, + SEEMP_API_android_provider_Settings__put_VOLUME_SYSTEM_); + value_to_put_map.put(Settings.System.SCREEN_OFF_TIMEOUT, + SEEMP_API_android_provider_Settings__put_SCREEN_OFF_TIMEOUT_); + value_to_put_map.put(Settings.System.RADIO_WIFI, + SEEMP_API_android_provider_Settings__put_RADIO_WIFI_); + value_to_put_map.put(Settings.System.AUTO_TIME_ZONE, + SEEMP_API_android_provider_Settings__put_AUTO_TIME_ZONE_); + value_to_put_map.put(Settings.System.TEXT_AUTO_CAPS, + SEEMP_API_android_provider_Settings__put_TEXT_AUTO_CAPS_); + value_to_put_map.put(Settings.System.WALLPAPER_ACTIVITY, + SEEMP_API_android_provider_Settings__put_WALLPAPER_ACTIVITY_); + value_to_put_map.put(Settings.System.ANIMATOR_DURATION_SCALE, + SEEMP_API_android_provider_Settings__put_ANIMATOR_DURATION_SCALE_); + value_to_put_map.put(Settings.System.WIFI_NUM_OPEN_NETWORKS_KEPT, + SEEMP_API_android_provider_Settings__put_WIFI_NUM_OPEN_NETWORKS_KEPT_); + value_to_put_map.put(Settings.System.LOCK_PATTERN_VISIBLE, + SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_VISIBLE_); + value_to_put_map.put(Settings.System.VOLUME_VOICE, + SEEMP_API_android_provider_Settings__put_VOLUME_VOICE_); + value_to_put_map.put(Settings.System.DEBUG_APP, + SEEMP_API_android_provider_Settings__put_DEBUG_APP_); + value_to_put_map.put(Settings.System.WIFI_ON, + SEEMP_API_android_provider_Settings__put_WIFI_ON_); + value_to_put_map.put(Settings.System.TEXT_SHOW_PASSWORD, + SEEMP_API_android_provider_Settings__put_TEXT_SHOW_PASSWORD_); + value_to_put_map.put(Settings.System.WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY, + SEEMP_API_android_provider_Settings__put_WIFI_NETWORKS_AVAILABLE_REPEAT_DELAY_); + value_to_put_map.put(Settings.System.WIFI_SLEEP_POLICY, + SEEMP_API_android_provider_Settings__put_WIFI_SLEEP_POLICY_); + value_to_put_map.put(Settings.System.VOLUME_MUSIC, + SEEMP_API_android_provider_Settings__put_VOLUME_MUSIC_); + value_to_put_map.put(Settings.System.PARENTAL_CONTROL_LAST_UPDATE, + SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_LAST_UPDATE_); + value_to_put_map.put(Settings.System.DEVICE_PROVISIONED, + SEEMP_API_android_provider_Settings__put_DEVICE_PROVISIONED_); + value_to_put_map.put(Settings.System.HTTP_PROXY, + SEEMP_API_android_provider_Settings__put_HTTP_PROXY_); + value_to_put_map.put(Settings.System.ANDROID_ID, + SEEMP_API_android_provider_Settings__put_ANDROID_ID_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_MAX_AP_CHECKS, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_MAX_AP_CHECKS_); + value_to_put_map.put(Settings.System.END_BUTTON_BEHAVIOR, + SEEMP_API_android_provider_Settings__put_END_BUTTON_BEHAVIOR_); + value_to_put_map.put(Settings.System.NEXT_ALARM_FORMATTED, + SEEMP_API_android_provider_Settings__put_NEXT_ALARM_FORMATTED_); + value_to_put_map.put(Settings.System.RADIO_CELL, + SEEMP_API_android_provider_Settings__put_RADIO_CELL_); + value_to_put_map.put(Settings.System.PARENTAL_CONTROL_ENABLED, + SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_ENABLED_); + value_to_put_map.put(Settings.System.BLUETOOTH_ON, + SEEMP_API_android_provider_Settings__put_BLUETOOTH_ON_); + value_to_put_map.put(Settings.System.WINDOW_ANIMATION_SCALE, + SEEMP_API_android_provider_Settings__put_WINDOW_ANIMATION_SCALE_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_BACKGROUND_CHECK_ENABLED_); + value_to_put_map.put(Settings.System.BLUETOOTH_DISCOVERABILITY, + SEEMP_API_android_provider_Settings__put_BLUETOOTH_DISCOVERABILITY_); + value_to_put_map.put(Settings.System.WIFI_STATIC_DNS1, + SEEMP_API_android_provider_Settings__put_WIFI_STATIC_DNS1_); + value_to_put_map.put(Settings.System.WIFI_STATIC_DNS2, + SEEMP_API_android_provider_Settings__put_WIFI_STATIC_DNS2_); + value_to_put_map.put(Settings.System.HAPTIC_FEEDBACK_ENABLED, + SEEMP_API_android_provider_Settings__put_HAPTIC_FEEDBACK_ENABLED_); + value_to_put_map.put(Settings.System.SHOW_WEB_SUGGESTIONS, + SEEMP_API_android_provider_Settings__put_SHOW_WEB_SUGGESTIONS_); + value_to_put_map.put(Settings.System.PARENTAL_CONTROL_REDIRECT_URL, + SEEMP_API_android_provider_Settings__put_PARENTAL_CONTROL_REDIRECT_URL_); + value_to_put_map.put(Settings.System.DATE_FORMAT, + SEEMP_API_android_provider_Settings__put_DATE_FORMAT_); + value_to_put_map.put(Settings.System.RADIO_NFC, + SEEMP_API_android_provider_Settings__put_RADIO_NFC_); + value_to_put_map.put(Settings.System.AIRPLANE_MODE_RADIOS, + SEEMP_API_android_provider_Settings__put_AIRPLANE_MODE_RADIOS_); + value_to_put_map.put(Settings.System.LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED, + SEEMP_API_android_provider_Settings__put_LOCK_PATTERN_TACTILE_FEEDBACK_ENABLED_); + value_to_put_map.put(Settings.System.TIME_12_24, + SEEMP_API_android_provider_Settings__put_TIME_12_24_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_INITIAL_IGNORED_PING_COUNT_); + value_to_put_map.put(Settings.System.VOLUME_BLUETOOTH_SCO, + SEEMP_API_android_provider_Settings__put_VOLUME_BLUETOOTH_SCO_); + value_to_put_map.put(Settings.System.USER_ROTATION, + SEEMP_API_android_provider_Settings__put_USER_ROTATION_); + value_to_put_map.put(Settings.System.WIFI_STATIC_GATEWAY, + SEEMP_API_android_provider_Settings__put_WIFI_STATIC_GATEWAY_); + value_to_put_map.put(Settings.System.STAY_ON_WHILE_PLUGGED_IN, + SEEMP_API_android_provider_Settings__put_STAY_ON_WHILE_PLUGGED_IN_); + value_to_put_map.put(Settings.System.SOUND_EFFECTS_ENABLED, + SEEMP_API_android_provider_Settings__put_SOUND_EFFECTS_ENABLED_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_PING_COUNT, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_PING_COUNT_); + value_to_put_map.put(Settings.System.DATA_ROAMING, + SEEMP_API_android_provider_Settings__put_DATA_ROAMING_); + value_to_put_map.put(Settings.System.SETTINGS_CLASSNAME, + SEEMP_API_android_provider_Settings__put_SETTINGS_CLASSNAME_); + value_to_put_map.put(Settings.System.TRANSITION_ANIMATION_SCALE, + SEEMP_API_android_provider_Settings__put_TRANSITION_ANIMATION_SCALE_); + value_to_put_map.put(Settings.System.WAIT_FOR_DEBUGGER, + SEEMP_API_android_provider_Settings__put_WAIT_FOR_DEBUGGER_); + value_to_put_map.put(Settings.System.INSTALL_NON_MARKET_APPS, + SEEMP_API_android_provider_Settings__put_INSTALL_NON_MARKET_APPS_); + value_to_put_map.put(Settings.System.ADB_ENABLED, + SEEMP_API_android_provider_Settings__put_ADB_ENABLED_); + value_to_put_map.put(Settings.System.WIFI_USE_STATIC_IP, + SEEMP_API_android_provider_Settings__put_WIFI_USE_STATIC_IP_); + value_to_put_map.put(Settings.System.DIM_SCREEN, + SEEMP_API_android_provider_Settings__put_DIM_SCREEN_); + value_to_put_map.put(Settings.System.VOLUME_ALARM, + SEEMP_API_android_provider_Settings__put_VOLUME_ALARM_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_ON, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_ON_); + value_to_put_map.put(Settings.System.WIFI_STATIC_NETMASK, + SEEMP_API_android_provider_Settings__put_WIFI_STATIC_NETMASK_); + value_to_put_map.put(Settings.System.NETWORK_PREFERENCE, + SEEMP_API_android_provider_Settings__put_NETWORK_PREFERENCE_); + value_to_put_map.put(Settings.System.SHOW_PROCESSES, + SEEMP_API_android_provider_Settings__put_SHOW_PROCESSES_); + value_to_put_map.put(Settings.System.TEXT_AUTO_REPLACE, + SEEMP_API_android_provider_Settings__put_TEXT_AUTO_REPLACE_); + value_to_put_map.put(Settings.System.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, + SEEMP_API_android_provider_Settings__put_WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON_); + value_to_put_map.put(Settings.System.APPEND_FOR_LAST_AUDIBLE, + SEEMP_API_android_provider_Settings__put_APPEND_FOR_LAST_AUDIBLE_); + value_to_put_map.put(Settings.System.SHOW_GTALK_SERVICE_STATUS, + SEEMP_API_android_provider_Settings__put_SHOW_GTALK_SERVICE_STATUS_); + value_to_put_map.put(Settings.System.SCREEN_BRIGHTNESS, + SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_); + value_to_put_map.put(Settings.System.USE_GOOGLE_MAIL, + SEEMP_API_android_provider_Settings__put_USE_GOOGLE_MAIL_); + value_to_put_map.put(Settings.System.RINGTONE, + SEEMP_API_android_provider_Settings__put_RINGTONE_); + value_to_put_map.put(Settings.System.LOGGING_ID, + SEEMP_API_android_provider_Settings__put_LOGGING_ID_); + value_to_put_map.put(Settings.System.MODE_RINGER, + SEEMP_API_android_provider_Settings__put_MODE_RINGER_); + value_to_put_map.put(Settings.System.MUTE_STREAMS_AFFECTED, + SEEMP_API_android_provider_Settings__put_MUTE_STREAMS_AFFECTED_); + value_to_put_map.put(Settings.System.WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE, + SEEMP_API_android_provider_Settings__put_WIFI_WATCHDOG_ACCEPTABLE_PACKET_LOSS_PERCENTAGE_); + value_to_put_map.put(Settings.System.TEXT_AUTO_PUNCTUATE, + SEEMP_API_android_provider_Settings__put_TEXT_AUTO_PUNCTUATE_); + value_to_put_map.put(Settings.System.WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS, + SEEMP_API_android_provider_Settings__put_WIFI_MOBILE_DATA_TRANSITION_WAKELOCK_TIMEOUT_MS_); + value_to_put_map.put(Settings.System.SCREEN_BRIGHTNESS_MODE, + SEEMP_API_android_provider_Settings__put_SCREEN_BRIGHTNESS_MODE_); + } + + public static int getSeempPutApiIdFromValue( String v ) + { + Integer result = value_to_put_map.get( v ); + if (result == null) + { + result = -1; + } + return result; + } +} diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index 415e70ca03fdfb82015f63e47578857cc2057e52..26d9135fee6c53fb2dec6b8dd1f5dd391d8242d7 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -224,6 +224,12 @@ public class SurfaceControl { */ public static final int BUILT_IN_DISPLAY_ID_HDMI = 1; + /** + * Built-in physical display id: Attached HDMI display. + * Use only with {@link SurfaceControl#getBuiltInDisplay(int)}. + */ + public static final int BUILT_IN_DISPLAY_ID_TERTIARY = 2; + /* Display power modes * / /** diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 203b82563ef86d3d308cf769e195763a57bc2be1..b12fceb4313b68e536aae5ff610c9167acbf8bbc 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -33,6 +33,7 @@ import android.os.SystemClock; import android.os.ParcelFileDescriptor; import android.util.AttributeSet; import android.util.Log; +import android.util.ResolutionOverride; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -189,6 +190,7 @@ public class SurfaceView extends View { private Translator mTranslator; private int mWindowInsetLeft; private int mWindowInsetTop; + ResolutionOverride mResolutionOverride = null; private boolean mGlobalListenersAdded; @@ -214,6 +216,8 @@ public class SurfaceView extends View { private void init() { setWillNotDraw(true); + mResolutionOverride = new ResolutionOverride(this); + mResolutionOverride.setFixedSize(this); } /** @@ -306,6 +310,16 @@ public class SurfaceView extends View { setMeasuredDimension(width, height); } + /** + * Transforms the touch events to the new resolution coordinate system + * if the resolution has changed + */ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + mResolutionOverride.handleTouch(this, ev); + return super.dispatchTouchEvent(ev); + } + /** @hide */ @Override protected boolean setFrame(int left, int top, int right, int bottom) { @@ -809,10 +823,13 @@ public class SurfaceView extends View { Rect visibleInsets, Rect stableInsets, Rect outsets, boolean reportDraw, Configuration newConfig, Rect backDropRect, boolean forceLayout, boolean alwaysConsumeNavBar) { - SurfaceView surfaceView = mSurfaceView.get(); + final SurfaceView surfaceView = mSurfaceView.get(); if (surfaceView != null) { if (DEBUG) Log.v(TAG, surfaceView + " got resized: w=" + frame.width() + " h=" + frame.height() + ", cur w=" + mCurWidth + " h=" + mCurHeight); + + surfaceView.mResolutionOverride.handleResize(surfaceView); + surfaceView.mSurfaceLock.lock(); try { if (reportDraw) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index d4ac30076eaa010618041334f22844590cac56bd..f0b42abec4570189f38956571b8efe1878057bcb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9920,6 +9920,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final int actionMasked = event.getActionMasked(); if (actionMasked == MotionEvent.ACTION_DOWN) { + android.util.SeempLog.record(3); // Defensive cleanup for new gesture stopNestedScroll(); } @@ -10516,6 +10517,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param event the KeyEvent object that defines the button action */ public boolean onKeyDown(int keyCode, KeyEvent event) { + android.util.SeempLog.record(4); if (KeyEvent.isConfirmKey(keyCode)) { if ((mViewFlags & ENABLED_MASK) == DISABLED) { return true; @@ -10564,6 +10566,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param event The KeyEvent object that defines the button action. */ public boolean onKeyUp(int keyCode, KeyEvent event) { + android.util.SeempLog.record(5); if (KeyEvent.isConfirmKey(keyCode)) { if ((mViewFlags & ENABLED_MASK) == DISABLED) { return true; @@ -11073,6 +11076,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @return True if the event was handled, false otherwise. */ public boolean onTouchEvent(MotionEvent event) { + android.util.SeempLog.record(3); final float x = event.getX(); final float y = event.getY(); final int viewFlags = mViewFlags; @@ -16819,7 +16823,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Bitmap cache = null; int layerType = getLayerType(); // TODO: signify cache state with just 'cache' local if (layerType == LAYER_TYPE_SOFTWARE || !drawingWithRenderNode) { - if (layerType != LAYER_TYPE_NONE) { + if (layerType != LAYER_TYPE_NONE && layerType != LAYER_TYPE_SOFTWARE) { // If not drawing with RenderNode, treat HW layers as SW layerType = LAYER_TYPE_SOFTWARE; buildDrawingCache(true); diff --git a/core/java/android/view/WindowManagerImpl.java b/core/java/android/view/WindowManagerImpl.java index dd4e09685362e71b2ae92c66c0f55d260640f54a..c07c87cea7fc89d5eccca0d2b85de8d07e53273a 100644 --- a/core/java/android/view/WindowManagerImpl.java +++ b/core/java/android/view/WindowManagerImpl.java @@ -89,12 +89,14 @@ public final class WindowManagerImpl implements WindowManager { @Override public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { + android.util.SeempLog.record_vg_layout(383,params); applyDefaultToken(params); mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow); } @Override public void updateViewLayout(@NonNull View view, @NonNull ViewGroup.LayoutParams params) { + android.util.SeempLog.record_vg_layout(384,params); applyDefaultToken(params); mGlobal.updateViewLayout(view, params); } diff --git a/core/java/android/webkit/WebChromeClient.java b/core/java/android/webkit/WebChromeClient.java index 2d3b6abbd08a017fb081112fe16ac4945ef98f0e..1849dac2d7ab87dd9cf122642b2168358e8df394 100644 --- a/core/java/android/webkit/WebChromeClient.java +++ b/core/java/android/webkit/WebChromeClient.java @@ -297,7 +297,9 @@ public class WebChromeClient { * origin. */ public void onGeolocationPermissionsShowPrompt(String origin, - GeolocationPermissions.Callback callback) {} + GeolocationPermissions.Callback callback) { + android.util.SeempLog.record(54); + } /** * Notify the host application that a request for Geolocation permissions, diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java index 50569d7e8f72061a443774283ed56ae53285f0f3..ba5d39e722eb48e7256d9c7fba3f07089ea2e7ed 100644 --- a/core/java/android/widget/OverScroller.java +++ b/core/java/android/widget/OverScroller.java @@ -22,6 +22,7 @@ import android.util.Log; import android.view.ViewConfiguration; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import android.util.BoostFramework; /** * This class encapsulates scrolling with the ability to overshoot the bounds @@ -599,6 +600,18 @@ public class OverScroller { private static final int CUBIC = 1; private static final int BALLISTIC = 2; + /* + * Perf boost related variables + * Enabled/Disabled using config_enableCpuBoostForOverScrollerFling + * true value turns it on, by default will be turned off + */ + private BoostFramework mPerf = null; + private boolean mIsPerfLockAcquired = false; + private boolean mIsPerfBoostEnabled = false; + private int fBoostTimeOut = 0; + private int flingBoostTimeOut = 0; + private int fBoostParamVal[]; + static { float x_min = 0.0f; float y_min = 0.0f; @@ -643,6 +656,19 @@ public class OverScroller { * 39.37f // inch/meter * ppi * 0.84f; // look and feel tuning + + mIsPerfBoostEnabled = context.getResources().getBoolean( + com.android.internal.R.bool.config_enableCpuBoostForOverScrollerFling); + if (mIsPerfBoostEnabled) { + fBoostTimeOut = context.getResources().getInteger( + com.android.internal.R.integer.flingboost_timeout_param); + fBoostParamVal = context.getResources().getIntArray( + com.android.internal.R.array.flingboost_param_value); + } + + if (mPerf == null && mIsPerfBoostEnabled) { + mPerf = new BoostFramework(); + } } void updateScroll(float q) { @@ -690,6 +716,11 @@ public class OverScroller { } void finish() { + if (mIsPerfLockAcquired && mPerf != null) { + mPerf.perfLockRelease(); + mIsPerfLockAcquired = false; + } + mCurrentPosition = mFinal; // Not reset since WebView relies on this value for fast fling. // TODO: restore when WebView uses the fast fling implemented in this class. @@ -749,6 +780,11 @@ public class OverScroller { mStartTime = AnimationUtils.currentAnimationTimeMillis(); mCurrentPosition = mStart = start; + if (mIsPerfLockAcquired && mPerf != null) { + mPerf.perfLockRelease(); + mIsPerfLockAcquired = false; + } + if (start > max || start < min) { startAfterEdge(start, min, max, velocity); return; @@ -913,6 +949,18 @@ public class OverScroller { return false; } + if (mPerf != null && !mIsPerfLockAcquired) { + mIsPerfLockAcquired = true; + if (0 == fBoostTimeOut) { + //config value is not defined + flingBoostTimeOut = mDuration; + } else { + //config value is present + flingBoostTimeOut = fBoostTimeOut; + } + mPerf.perfLockAcquire(flingBoostTimeOut, fBoostParamVal); + } + double distance = 0.0; switch (mState) { case SPLINE: { diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java index 357c9c36936bdf99c674e71034ad47946738926f..d0ba9e68a63f7f89ac16195d86e92eee8463e130 100644 --- a/core/java/android/widget/Scroller.java +++ b/core/java/android/widget/Scroller.java @@ -22,6 +22,7 @@ import android.os.Build; import android.view.ViewConfiguration; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; +import android.util.BoostFramework; /** @@ -108,6 +109,17 @@ public class Scroller { private float mDeceleration; private final float mPpi; + /* + * Perf boost related variables + * Enabled/Disabled using config_enableCpuBoostForScroller + * true value turns it on, by default will be turned off + */ + private BoostFramework mPerf = null; + boolean bIsPerfBoostEnabled = false; + private int sBoostTimeOut = 0; + private int scrollBoostTimeOut = 0; + private int sBoostParamVal[]; + // A context-specific coefficient adjusted to physical values. private float mPhysicalCoeff; @@ -167,6 +179,7 @@ public class Scroller { * not to support progressive "flywheel" behavior in flinging. */ public Scroller(Context context, Interpolator interpolator, boolean flywheel) { + boolean bIsPerfBoostEnabled = false; mFinished = true; if (interpolator == null) { mInterpolator = new ViscousFluidInterpolator(); @@ -178,6 +191,18 @@ public class Scroller { mFlywheel = flywheel; mPhysicalCoeff = computeDeceleration(0.84f); // look and feel tuning + bIsPerfBoostEnabled = context.getResources().getBoolean( + com.android.internal.R.bool.config_enableCpuBoostForScroller); + if (bIsPerfBoostEnabled) { + sBoostTimeOut = context.getResources().getInteger( + com.android.internal.R.integer.scrollboost_timeout_param); + sBoostParamVal = context.getResources().getIntArray( + com.android.internal.R.array.scrollboost_param_value); + } + if (mPerf == null && bIsPerfBoostEnabled) { + mPerf = new BoostFramework(); + } + } /** @@ -395,6 +420,17 @@ public class Scroller { mDeltaX = dx; mDeltaY = dy; mDurationReciprocal = 1.0f / (float) mDuration; + + if ((mPerf != null) && (duration != 0)) { + if (0 == sBoostTimeOut) { + //config value is not defined + scrollBoostTimeOut = mDuration; + } else { + //config value is present + scrollBoostTimeOut = sBoostTimeOut; + } + mPerf.perfLockAcquire(scrollBoostTimeOut, sBoostParamVal); + } } /** diff --git a/core/java/com/android/internal/app/ActivityTrigger.java b/core/java/com/android/internal/app/ActivityTrigger.java new file mode 100644 index 0000000000000000000000000000000000000000..8186701157ff8603903a8b7c93d76f816d262190 --- /dev/null +++ b/core/java/com/android/internal/app/ActivityTrigger.java @@ -0,0 +1,127 @@ +/* Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +package com.android.internal.app; + +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.util.Log; + +public class ActivityTrigger +{ + private static final String TAG = "ActivityTrigger"; + + private static final int FLAG_OVERRIDE_RESOLUTION = 1; + private static final int FLAG_HARDWARE_ACCELERATED = + ActivityInfo.FLAG_HARDWARE_ACCELERATED; + + + /** &hide */ + public ActivityTrigger() { + //Log.d(TAG, "ActivityTrigger initialized"); + } + + /** &hide */ + protected void finalize() { + native_at_deinit(); + } + + /** &hide */ + public void activityStartProcessTrigger(String process, int pid) { + native_at_startProcessActivity(process, pid); + } + + /** &hide */ + public void activityStartTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) { + ComponentName cn = intent.getComponent(); + int overrideFlags = 0; + String activity = null; + + if(cn != null) + activity = cn.flattenToString() + "/" + appInfo.versionCode; + + overrideFlags = native_at_startActivity(activity, overrideFlags); + + if((overrideFlags & FLAG_HARDWARE_ACCELERATED) != 0) { + acInfo.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED; + } + if((overrideFlags & FLAG_OVERRIDE_RESOLUTION) != 0) { + appInfo.setOverrideRes(1); + } + } + + /** &hide */ + public void activityResumeTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) { + ComponentName cn = intent.getComponent(); + String activity = null; + + if (cn != null) + activity = cn.flattenToString() + "/" + appInfo.versionCode; + native_at_resumeActivity(activity); + } + + public void activityPauseTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) { + ComponentName cn = intent.getComponent(); + String activity = null; + Log.d(TAG, "ActivityTrigger activityPauseTrigger "); + if (null != cn && null != appInfo) + activity = cn.flattenToString() + "/" + appInfo.versionCode; + native_at_pauseActivity(activity); + } + + public void activityStopTrigger(Intent intent, ActivityInfo acInfo, ApplicationInfo appInfo) { + ComponentName cn = intent.getComponent(); + String activity = null; + Log.d(TAG, "ActivityTrigger activityStopTrigger "); + if (null != cn && null != appInfo) + activity = cn.flattenToString() + "/" + appInfo.versionCode; + native_at_stopActivity(activity); + } + + /** &hide */ + public float animationScalesCheck(String activity, int scaleType) { + return native_at_animationScalesCheck(activity, scaleType); + } + + /** &hide */ + public void networkOptsCheck (int flag, int netType, String packageName) { + native_at_networkOptsCheck(flag, netType, packageName); + } + + private native int native_at_startActivity(String activity, int flags); + private native void native_at_resumeActivity(String activity); + private native void native_at_pauseActivity(String activity); + private native void native_at_stopActivity(String activity); + private native void native_at_deinit(); + private native void native_at_startProcessActivity(String process, int pid); + private native float native_at_animationScalesCheck(String activity, int scaleType); + private native void native_at_networkOptsCheck(int flag, int netType, String packageName); +} \ No newline at end of file diff --git a/core/java/com/android/internal/app/LocalePicker.java b/core/java/com/android/internal/app/LocalePicker.java index 472f583fa0755ab709f7340b9981d485c13653b2..b42bdb9bf17273ccf843063f67558632ee4860a9 100644 --- a/core/java/com/android/internal/app/LocalePicker.java +++ b/core/java/com/android/internal/app/LocalePicker.java @@ -29,6 +29,7 @@ import android.os.Bundle; import android.os.LocaleList; import android.os.RemoteException; import android.provider.Settings; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -42,6 +43,7 @@ import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.ArrayList; +import java.util.Arrays; public class LocalePicker extends ListFragment { private static final String TAG = "LocalePicker"; @@ -97,13 +99,39 @@ public class LocalePicker extends ListFragment { return pseudoLocales; } + /* + * Get the customize locale codes and get the language list + */ + private static ArrayList getLocaleArray(String[] locales, Resources resources) { + String localeCodes = resources.getString(R.string.locale_codes); + String[] localeCodesArray = null; + if (localeCodes != null && !TextUtils.isEmpty(localeCodes.trim())) { + localeCodes = localeCodes.replace('_', '-'); + // ICU use "fil" instead of "tl" + localeCodes = localeCodes.replaceAll("tl-", "fil-"); + localeCodesArray = localeCodes.split(","); + } + ArrayList localeList = new ArrayList( + Arrays.asList((localeCodesArray == null || localeCodesArray.length == 0) ? locales + : localeCodesArray)); + return localeList; + } + public static List getAllAssetLocales(Context context, boolean isInDeveloperMode) { final Resources resources = context.getResources(); - final String[] locales = getSystemAssetLocales(); - List localeList = new ArrayList(locales.length); - Collections.addAll(localeList, locales); - + String[] locales = null; + ArrayList localeList = new ArrayList(); + if (resources.getString(R.string.locale_codes) != null){ + locales = Resources.getSystem().getAssets().getLocales(); + // Check the locale_codes if the locales list is customized in data package overlay. + // If locale_codes is customized, use the customized list instead of built-in locales. + localeList = getLocaleArray(locales, resources); + } else { + locales = getSystemAssetLocales(); + localeList = new ArrayList(locales.length); + Collections.addAll(localeList, locales); + } // Don't show the pseudolocales unless we're in developer mode. http://b/17190407. if (!isInDeveloperMode) { for (String locale : pseudoLocales) { diff --git a/core/java/com/android/internal/content/NativeLibraryHelper.java b/core/java/com/android/internal/content/NativeLibraryHelper.java index f479f4feca3539ce4868d65e41079a3e2ec0f03b..f5b948f42e00ebd029f7afb52c78f7f71d389086 100644 --- a/core/java/com/android/internal/content/NativeLibraryHelper.java +++ b/core/java/com/android/internal/content/NativeLibraryHelper.java @@ -62,6 +62,8 @@ public class NativeLibraryHelper { // that the cpuAbiOverride must be clear. public static final String CLEAR_ABI_OVERRIDE = "-"; + private static final Object mRestoreconSync = new Object(); + /** * A handle to an opened package, consisting of one or more APKs. Used as * input to the various NativeLibraryHelper methods. Allows us to scan and @@ -275,8 +277,12 @@ public class NativeLibraryHelper { throw new IOException("Cannot chmod native library directory " + path.getPath(), e); } - } else if (!SELinux.restorecon(path)) { - throw new IOException("Cannot set SELinux context for " + path.getPath()); + } else { + synchronized (mRestoreconSync) { + if (!SELinux.restorecon(path)) { + throw new IOException("Cannot set SELinux context for " + path.getPath()); + } + } } } diff --git a/core/java/com/android/internal/os/IRegionalizationService.aidl b/core/java/com/android/internal/os/IRegionalizationService.aidl new file mode 100644 index 0000000000000000000000000000000000000000..0e091ff342d0db4188e489e5f55a8de388500f58 --- /dev/null +++ b/core/java/com/android/internal/os/IRegionalizationService.aidl @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.internal.os; + +/** + * Direct interface to the RegionalizationService's functionality + * + * {@hide} + */ +interface IRegionalizationService { + + boolean checkFileExists(String filepath); + + List readFile(String filepath, String regularExpression); + + boolean writeFile(String filepath, String content, boolean append); + + void deleteFilesUnderDir(String dirPath, String ext, boolean delDir); +} diff --git a/core/java/com/android/internal/os/RegionalizationEnvironment.java b/core/java/com/android/internal/os/RegionalizationEnvironment.java new file mode 100644 index 0000000000000000000000000000000000000000..24b9120e253314b63a8e4f924df4d5d0de209477 --- /dev/null +++ b/core/java/com/android/internal/os/RegionalizationEnvironment.java @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.internal.os; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import android.os.IBinder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; +import android.text.TextUtils; +import android.util.Log; + +public class RegionalizationEnvironment { + private final static String TAG = "RegionalizationEnvironment"; + + private final static boolean SUPPORTED = SystemProperties.getBoolean( + "ro.regionalization.support", false); + private final static boolean DEBUG = true; + + private static IRegionalizationService mRegionalizationService = null; + + private final static String SPEC_FILE_PATH = "/persist/speccfg/spec"; + + private static ArrayList mPackages = new ArrayList(); + private static ArrayList mExcludedApps = new ArrayList(); + + private static boolean isLoaded = false; + private static void init() { + IBinder iBinder = ServiceManager.getService("regionalization"); + mRegionalizationService = IRegionalizationService.Stub.asInterface(iBinder); + if (mRegionalizationService != null) { + loadSwitchedPackages(); + loadExcludedApplist(); + isLoaded = true; + } + } + + /** + * {@hide} + */ + public static boolean isSupported() { + if (SUPPORTED && !isLoaded) { + init(); + } + return SUPPORTED; + } + + /** + * {@hide} + */ + public static int getPackagesCount() { + return mPackages.size(); + } + + /** + * {@hide} + */ + public static List getAllPackageNames() { + ArrayList packages = new ArrayList(); + for (Package p : mPackages) { + packages.add(p.getName()); + } + return packages; + } + + /** + * {@hide} + */ + public static List getAllPackageDirectories() { + ArrayList directories = new ArrayList(); + for (Package p : mPackages) { + if (DEBUG) + Log.v(TAG, "Package Directoriy(" + p.getPriority() + "):" + p.getDirectory()); + directories.add(p.getDirectory()); + } + return directories; + } + + /** + * {@hide} + */ + public static boolean isExcludedApp(String appName) { + if (getPackagesCount() == 0) { + return false; + } + + if (!appName.endsWith(".apk")) { + return mExcludedApps.contains(appName + ".apk"); + } else { + return mExcludedApps.contains(appName); + } + } + + /** + * {@hide} + */ + public static IRegionalizationService getRegionalizationService() { + return mRegionalizationService; + } + + /** + * {@hide} + */ + public static String getStoragePos() { + for (Package pack: mPackages) { + String pos = pack.getStoragePos(); + if (!TextUtils.isEmpty(pos)) + return pos; + } + try { + mPackages.clear(); + throw new IOException("Read wrong package for Carrier!"); + } catch (IOException e) { + Log.e(TAG, "Get storage pos error, caused by: " + e.getMessage()); + } + return ""; + } + + private static void loadSwitchedPackages() { + if (DEBUG) + Log.d(TAG, "load packages for Carrier!"); + + try { + ArrayList contents = null; + try { + contents = (ArrayList) + mRegionalizationService.readFile(SPEC_FILE_PATH, null); + } catch (RemoteException e) { + e.printStackTrace(); + } + + if (contents != null && contents.size() > 0) { + // Get storage pos of carrier pack + if (!contents.get(0).startsWith("packStorage=")) { + throw new IOException("Can't read storage pos for Carrier package!"); + } + String storagePos = contents.get(0).substring("packStorage=".length()); + if (TextUtils.isEmpty(storagePos)) { + throw new IOException("Storage pos for Carrier package is wrong!"); + } + + // Get carrier pack count + String packNumRegularExpresstion = "^packCount=[0-9]$"; + if (!contents.get(1).matches(packNumRegularExpresstion)) { + throw new IOException("Can't read package count of Carrier!"); + } + int packNum = Integer.parseInt(contents.get(1) + .substring("packCount=".length())); + if (packNum <= 0 || contents.size() <= packNum) { + throw new IOException("Package count of Carrier is wrong!"); + } + + for (int i = 2; i < packNum + 2; i++) { + String packRegularExpresstion = "^strSpec[0-9]=\\w+$"; + if (contents.get(i).matches(packRegularExpresstion)) { + String packName = contents.get(i).substring("strSpec".length() + 2); + if (!TextUtils.isEmpty(packName)) { + boolean exists = false; + try { + exists = mRegionalizationService.checkFileExists( + storagePos + "/" + packName); + } catch (RemoteException e) { + e.printStackTrace(); + } + + if (exists) { + mPackages.add(new Package(packName, i, storagePos)); + } else { + mPackages.clear(); + throw new IOException("Read wrong packages for Carrier!"); + } + } + } else { + mPackages.clear(); + throw new IOException("Read wrong packages for Carrier!"); + } + } + } + } catch (IOException e) { + Log.e(TAG, "Load package for carrier error, caused by: " + e.getMessage()); + } + } + + private static void loadExcludedApplist() { + if (DEBUG) + Log.d(TAG, "loadExcludedApps!"); + + if (getPackagesCount() == 0) return; + + for (Package pack : mPackages) { + Log.d(TAG, "load excluded apps for " + pack.getDirectory()); + String excListFilePath = pack.getExcludedListFilePath(); + ArrayList contents = null; + try { + contents = (ArrayList) + mRegionalizationService.readFile(excListFilePath, null); + } catch (RemoteException e) { + e.printStackTrace(); + } + if (contents != null && contents.size() > 0) { + for (String content : contents) { + if (!TextUtils.isEmpty(content)) { + int pos = content.lastIndexOf("/"); + if (pos != -1) { + String apkName = content.substring(pos + 1); + if (!TextUtils.isEmpty(apkName) && !mExcludedApps.contains(apkName)) { + mExcludedApps.add(apkName); + } + } + } + } + } + } + } + + private static class Package { + private final String mName; + private final int mPriority; + private final String mStorage; + + public Package(String name, int priority, String storage) { + mName = name; + mPriority = priority; + mStorage = storage; + } + + public String getName() { + return mName; + } + + public int getPriority() { + return mPriority; + } + + public String getStoragePos() { + return mStorage; + } + + public File getDirectory() { + return new File(mStorage, mName); + } + + public String getExcludedListFilePath() { + return getDirectory().getAbsolutePath() + "/exclude.list"; + } + } + +} diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 05b839df9fa4782cd4448fe49fe49fe3b1d118ed..e91f53d942efe8a0416290be684ebdf4ab779d27 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -46,4 +46,6 @@ interface ILockSettings { void systemReady(); void userPresent(int userId); int getStrongAuthForUser(int userId); + void sanitizePassword(); + String getPassword(); } diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index 3cac1dbc7b23c3e4b8a613a88c314757aac36c5d..d79e908582e7eb5ce0f523a74baab1e7a87b8886 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -639,6 +639,17 @@ public class LockPatternUtils { } } + /** + * clears stored password. + */ + public void sanitizePassword() { + try { + getLockSettings().sanitizePassword(); + } catch (RemoteException re) { + Log.e(TAG, "Couldn't sanitize password" + re); + } + } + private void updateCryptoUserInfo(int userId) { if (userId != UserHandle.USER_SYSTEM) { return; diff --git a/core/java/org/codeaurora/camera/Android.mk b/core/java/org/codeaurora/camera/Android.mk new file mode 100644 index 0000000000000000000000000000000000000000..2e005f79eef2ae295b2dc1e68e09859a9137bf73 --- /dev/null +++ b/core/java/org/codeaurora/camera/Android.mk @@ -0,0 +1,30 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_MODULE_TAGS := optional + +LOCAL_MODULE:= org.codeaurora.camera + +# This will install the file in /system/framework +LOCAL_MODULE_PATH := $(TARGET_OUT_JAVA_LIBRARIES) + +include $(BUILD_JAVA_LIBRARY) + +# ==== permissions ======================== +include $(CLEAR_VARS) + +LOCAL_MODULE := org.codeaurora.camera.xml + +LOCAL_MODULE_TAGS := optional + +LOCAL_MODULE_CLASS := ETC + +# This will install the file in /system/etc/permissions +LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions + +LOCAL_SRC_FILES := $(LOCAL_MODULE) + +include $(BUILD_PREBUILT) diff --git a/core/java/org/codeaurora/camera/ExtendedFace.java b/core/java/org/codeaurora/camera/ExtendedFace.java new file mode 100644 index 0000000000000000000000000000000000000000..afda0b64b14c73aa4f87b284646787ba08409890 --- /dev/null +++ b/core/java/org/codeaurora/camera/ExtendedFace.java @@ -0,0 +1,211 @@ +/* Copyright (c) 2015, The Linux Foundataion. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +package org.codeaurora.camera; + +import android.hardware.Camera; + +import java.util.ArrayList; + +import android.os.Bundle; + +import android.os.SystemProperties; + +/** + * {@hide} Information about a face identified through Extended camera face + * + *

+ * When face detection is used with a camera, the {@link FaceDetectionListener} + * returns a list of face objects for use in focusing and metering. + *

+ * + * @see FaceDetectionListener + */ +public class ExtendedFace extends android.hardware.Camera.Face { + public ExtendedFace() { + super(); + } + + private int smileDegree = 0; + private int smileScore = 0; + private int blinkDetected = 0; + private int faceRecognized = 0; + private int gazeAngle = 0; + private int updownDir = 0; + private int leftrightDir = 0; + private int rollDir = 0; + private int leyeBlink = 0; + private int reyeBlink = 0; + private int leftrightGaze = 0; + private int topbottomGaze = 0; + + private static final String STR_TRUE = "true"; + private static final String STR_FALSE = "false"; + + /** + * The smilie degree for the detection of the face. + * + * @see #startFaceDetection() + */ + public int getSmileDegree() { + return smileDegree; + } + + /** + * The smilie score for the detection of the face. + * + * @see #startFaceDetection() + */ + public int getSmileScore() { + return smileScore; + } + + /** + * The smilie degree for the detection of the face. + * + * @see #startFaceDetection() + */ + public int getBlinkDetected() { + return blinkDetected; + } + + /** + * If face is recognized. + * + * @see #startFaceDetection() + */ + public int getFaceRecognized() { + return faceRecognized; + } + + /** + * The gaze angle for the detected face. + * + * @see #startFaceDetection() + */ + public int getGazeAngle() { + return gazeAngle; + } + + /** + * The up down direction for the detected face. + * + * @see #startFaceDetection() + */ + public int getUpDownDirection() { + return updownDir; + } + + /** + * The left right direction for the detected face. + * + * @see #startFaceDetection() + */ + public int getLeftRightDirection() { + return leftrightDir; + } + + /** + * The roll direction for the detected face. + * + * @see #startFaceDetection() + */ + public int getRollDirection() { + return rollDir; + } + + /** + * The degree of left eye blink for the detected face. + * + * @see #startFaceDetection() + */ + public int getLeftEyeBlinkDegree() { + return leyeBlink; + } + + /** + * The degree of right eye blink for the detected face. + * + * @see #startFaceDetection() + */ + public int getRightEyeBlinkDegree() { + return reyeBlink; + } + + /** + * The gaze degree of left-right direction for the detected face. + * + * @see #startFaceDetection() + */ + public int getLeftRightGazeDegree() { + return leftrightGaze; + } + + /** + * The gaze degree of up-down direction for the detected face. + * + * @see #startFaceDetection() + */ + public int getTopBottomGazeDegree() { + return topbottomGaze; + } + + private static final String BUNDLE_KEY_SMILE_SCORE = "smileScore"; + private static final String BUNDLE_KEY_SMILE_VALUE = "smileValue"; + private static final String BUNDLE_KEY_BLINK_DETECTED = "blinkDetected"; + private static final String BUNDLE_KEY_LEFT_EYE_CLOSED_VALUE = "leftEyeClosedValue"; + private static final String BUNDLE_KEY_RIGHT_EYE_CLOSED_VALUE = "rightEyeClosedValue"; + private static final String BUNDLE_KEY_FACE_PITCH_DEGREE = "facePitchDegree"; + private static final String BUNDLE_KEY_FACE_YAW_DEGREE = "faceYawDegree"; + private static final String BUNDLE_KEY_FACE_ROLL_DEGREE = "faceRollDegree"; + private static final String BUNDLE_KEY_GAZE_UP_DOWN_DEGREE = "gazeUpDownDegree"; + private static final String BUNDLE_KEY_GAZE_LEFT_RIGHT_DEGREE = "gazeLeftRightDegree"; + private static final String BUNDLE_KEY_FACE_RECOGNIZED = "faceRecognized"; + + public Bundle getExtendedFaceInfo() { + Bundle faceInfo = new Bundle(); + faceInfo.putInt(BUNDLE_KEY_SMILE_VALUE, this.smileDegree); + + faceInfo.putInt(BUNDLE_KEY_LEFT_EYE_CLOSED_VALUE, this.leyeBlink); + faceInfo.putInt(BUNDLE_KEY_RIGHT_EYE_CLOSED_VALUE, this.reyeBlink); + + faceInfo.putInt(BUNDLE_KEY_FACE_PITCH_DEGREE, this.updownDir); + faceInfo.putInt(BUNDLE_KEY_FACE_YAW_DEGREE, this.leftrightDir); + faceInfo.putInt(BUNDLE_KEY_FACE_ROLL_DEGREE, this.rollDir); + faceInfo.putInt(BUNDLE_KEY_GAZE_UP_DOWN_DEGREE, this.topbottomGaze); + faceInfo.putInt(BUNDLE_KEY_GAZE_LEFT_RIGHT_DEGREE, this.leftrightGaze); + + faceInfo.putInt(BUNDLE_KEY_BLINK_DETECTED, this.blinkDetected); + faceInfo.putInt(BUNDLE_KEY_SMILE_SCORE, this.smileScore); + faceInfo.putInt(BUNDLE_KEY_FACE_RECOGNIZED, this.faceRecognized); + + return faceInfo; + } + +} diff --git a/core/java/org/codeaurora/camera/org.codeaurora.camera.xml b/core/java/org/codeaurora/camera/org.codeaurora.camera.xml new file mode 100644 index 0000000000000000000000000000000000000000..20b2aa05822f412b4baf05fb696f7380fe69395d --- /dev/null +++ b/core/java/org/codeaurora/camera/org.codeaurora.camera.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/core/jni/Android.mk b/core/jni/Android.mk index dd66b24a6b2f919fff96d7687eb15f776575444f..ee3d14c2607c576bdc8333b2c81e7718fa917067 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -29,6 +29,7 @@ LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES LOCAL_CFLAGS += -DU_USING_ICU_NAMESPACE=0 LOCAL_SRC_FILES:= \ + android_util_SeempLog.cpp \ AndroidRuntime.cpp \ com_android_internal_content_NativeLibraryHelper.cpp \ com_google_android_gles_jni_EGLImpl.cpp \ @@ -177,7 +178,8 @@ LOCAL_SRC_FILES:= \ com_android_internal_os_PathClassLoaderFactory.cpp \ com_android_internal_os_Zygote.cpp \ com_android_internal_util_VirtualRefBasePtr.cpp \ - com_android_internal_view_animation_NativeInterpolatorFactoryHelper.cpp + com_android_internal_view_animation_NativeInterpolatorFactoryHelper.cpp \ + com_android_internal_app_ActivityTrigger.cpp LOCAL_C_INCLUDES += \ $(JNI_H_INCLUDE) \ @@ -263,7 +265,8 @@ LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES += \ libhwui \ - libdl + libdl \ + libregionalization # we need to access the private Bionic header # in com_google_android_gles_jni_GLImpl.cpp diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 315887d954e510d09165f1dff9e0f86e2d0610c9..5eae338f4ed649eed274b3d6ba5aec3cad4444e0 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -104,6 +104,7 @@ extern int register_android_media_JetPlayer(JNIEnv *env); extern int register_android_media_ToneGenerator(JNIEnv *env); namespace android { +extern int register_android_util_SeempLog(JNIEnv* env); /* * JNI-based registration functions. Note these are properly contained in @@ -203,6 +204,7 @@ extern int register_com_android_internal_net_NetworkStatsFactory(JNIEnv *env); extern int register_com_android_internal_os_PathClassLoaderFactory(JNIEnv* env); extern int register_com_android_internal_os_Zygote(JNIEnv *env); extern int register_com_android_internal_util_VirtualRefBasePtr(JNIEnv *env); +extern int register_com_android_internal_app_ActivityTrigger(JNIEnv *env); static AndroidRuntime* gCurRuntime = NULL; @@ -1260,6 +1262,7 @@ static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env } static const RegJNIRec gRegJNI[] = { + REG_JNI(register_android_util_SeempLog), REG_JNI(register_com_android_internal_os_RuntimeInit), REG_JNI(register_android_os_SystemClock), REG_JNI(register_android_util_EventLog), @@ -1408,7 +1411,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_animation_PropertyValuesHolder), REG_JNI(register_com_android_internal_content_NativeLibraryHelper), REG_JNI(register_com_android_internal_net_NetworkStatsFactory), - + REG_JNI(register_com_android_internal_app_ActivityTrigger), }; /* diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 94592573e61ad0706f0dbdc6baa8735381bedeaa..c28a66ce9edd905b4857a4e54bafaa3cf79ec4a0 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -62,6 +62,18 @@ struct fields_t { jmethodID rect_constructor; jmethodID face_constructor; jmethodID point_constructor; + jfieldID face_sm_degree; + jfieldID face_sm_score; + jfieldID face_blink_detected; + jfieldID face_gaze_angle; + jfieldID face_updown_dir; + jfieldID face_leftright_dir; + jfieldID face_roll_dir; + jfieldID face_leye_blink; + jfieldID face_reye_blink; + jfieldID face_left_right_gaze; + jfieldID face_top_bottom_gaze; + jfieldID face_recognised; }; static fields_t fields; @@ -97,6 +109,7 @@ private: jclass mFaceClass; // strong reference to Face class jclass mRectClass; // strong reference to Rect class jclass mPointClass; // strong reference to Point class + bool mIsExtendedFace; Mutex mLock; /* @@ -148,8 +161,16 @@ JNICameraContext::JNICameraContext(JNIEnv* env, jobject weak_this, jclass clazz, mCameraJClass = (jclass)env->NewGlobalRef(clazz); mCamera = camera; - jclass faceClazz = env->FindClass("android/hardware/Camera$Face"); - mFaceClass = (jclass) env->NewGlobalRef(faceClazz); + jclass extendedfaceClazz = env->FindClass("org/codeaurora/camera/ExtendedFace"); + if (NULL != extendedfaceClazz) { + mFaceClass = (jclass) env->NewGlobalRef(extendedfaceClazz); + mIsExtendedFace = true; + } else { + env->ExceptionClear(); + jclass faceClazz = env->FindClass("android/hardware/Camera$Face"); + mFaceClass = (jclass) env->NewGlobalRef(faceClazz); + mIsExtendedFace = false; + } jclass rectClazz = env->FindClass("android/graphics/Rect"); mRectClass = (jclass) env->NewGlobalRef(rectClazz); @@ -350,9 +371,10 @@ void JNICameraContext::postDataTimestamp(nsecs_t timestamp, int32_t msgType, con postData(msgType, dataPtr, NULL); } -void JNICameraContext::postRecordingFrameHandleTimestamp(nsecs_t, native_handle_t*) { +void JNICameraContext::postRecordingFrameHandleTimestamp(nsecs_t, native_handle_t* handle) { // This is not needed at app layer. This should not be called because JNICameraContext cannot // start video recording. + mCamera->releaseRecordingFrameHandle(handle); } void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_metadata_t *metadata) @@ -374,7 +396,6 @@ void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_m env->SetIntField(rect, fields.rect_top, metadata->faces[i].rect[1]); env->SetIntField(rect, fields.rect_right, metadata->faces[i].rect[2]); env->SetIntField(rect, fields.rect_bottom, metadata->faces[i].rect[3]); - env->SetObjectField(face, fields.face_rect, rect); env->SetIntField(face, fields.face_score, metadata->faces[i].score); @@ -403,6 +424,21 @@ void JNICameraContext::postMetadata(JNIEnv *env, int32_t msgType, camera_frame_m env->SetIntField(mouth, fields.point_y, metadata->faces[i].mouth[1]); env->SetObjectField(face, fields.face_mouth, mouth); env->DeleteLocalRef(mouth); + + if (mIsExtendedFace) { + env->SetIntField(face, fields.face_sm_degree, metadata->faces[i].smile_degree); + env->SetIntField(face, fields.face_sm_score, metadata->faces[i].smile_score); + env->SetIntField(face, fields.face_blink_detected, metadata->faces[i].blink_detected); + env->SetIntField(face, fields.face_recognised, metadata->faces[i].face_recognised); + env->SetIntField(face, fields.face_gaze_angle, metadata->faces[i].gaze_angle); + env->SetIntField(face, fields.face_updown_dir, metadata->faces[i].updown_dir); + env->SetIntField(face, fields.face_leftright_dir, metadata->faces[i].leftright_dir); + env->SetIntField(face, fields.face_roll_dir, metadata->faces[i].roll_dir); + env->SetIntField(face, fields.face_leye_blink, metadata->faces[i].leye_blink); + env->SetIntField(face, fields.face_reye_blink, metadata->faces[i].reye_blink); + env->SetIntField(face, fields.face_left_right_gaze, metadata->faces[i].left_right_gaze); + env->SetIntField(face, fields.face_top_bottom_gaze, metadata->faces[i].top_bottom_gaze); + } } env->DeleteLocalRef(face); @@ -440,6 +476,56 @@ void JNICameraContext::setCallbackMode(JNIEnv *env, bool installed, bool manualM } } +static void android_hardware_Camera_setLongshot(JNIEnv *env, jobject thiz, jboolean enable) +{ + ALOGV("setLongshot"); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if ( enable ) { + rc = camera->sendCommand(CAMERA_CMD_LONGSHOT_ON, 0, 0); + } else { + rc = camera->sendCommand(CAMERA_CMD_LONGSHOT_OFF, 0, 0); + } + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "enabling longshot mode failed"); + } +} + +static void android_hardware_Camera_sendHistogramData(JNIEnv *env, jobject thiz) + { + ALOGV("sendHistogramData" ); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_SEND_DATA, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "send histogram data failed"); + } + } + static void android_hardware_Camera_setHistogramMode(JNIEnv *env, jobject thiz, jboolean mode) + { + ALOGV("setHistogramMode: mode:%d", (int)mode); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if(mode == true) + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_ON, 0, 0); + else + rc = camera->sendCommand(CAMERA_CMD_HISTOGRAM_OFF, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "set histogram mode failed"); + } + } void JNICameraContext::addCallbackBuffer( JNIEnv *env, jbyteArray cbb, int msgType) { @@ -762,7 +848,25 @@ static void android_hardware_Camera_setHasPreviewCallback(JNIEnv *env, jobject t context->setCallbackMode(env, installed, manualBuffer); } -static void android_hardware_Camera_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes, jint msgType) { +static void android_hardware_Camera_setMetadataCb(JNIEnv *env, jobject thiz, jboolean mode) +{ + ALOGV("setMetadataCb: mode:%d", (int)mode); + JNICameraContext* context; + status_t rc; + sp camera = get_native_camera(env, thiz, &context); + if (camera == 0) return; + + if(mode == true) + rc = camera->sendCommand(CAMERA_CMD_METADATA_ON, 0, 0); + else + rc = camera->sendCommand(CAMERA_CMD_METADATA_OFF, 0, 0); + + if (rc != NO_ERROR) { + jniThrowException(env, "java/lang/RuntimeException", "set metadata mode failed"); + } +} + +static void android_hardware_Camera_addCallbackBuffer(JNIEnv *env, jobject thiz, jbyteArray bytes, int msgType) { ALOGV("addCallbackBuffer: 0x%x", msgType); JNICameraContext* context = reinterpret_cast(env->GetLongField(thiz, fields.context)); @@ -1040,6 +1144,18 @@ static const JNINativeMethod camMethods[] = { { "native_takePicture", "(I)V", (void *)android_hardware_Camera_takePicture }, + { "native_setHistogramMode", + "(Z)V", + (void *)android_hardware_Camera_setHistogramMode }, + { "native_setMetadataCb", + "(Z)V", + (void *)android_hardware_Camera_setMetadataCb }, + { "native_sendHistogramData", + "()V", + (void *)android_hardware_Camera_sendHistogramData }, + { "native_setLongshot", + "(Z)V", + (void *)android_hardware_Camera_setLongshot }, { "native_setParameters", "(Ljava/lang/String;)V", (void *)android_hardware_Camera_setParameters }, @@ -1118,6 +1234,27 @@ int register_android_hardware_Camera(JNIEnv *env) { "android/graphics/Point", "y", "I", &fields.point_y}, }; + field extendedfacefields_to_find[] = { + { "org/codeaurora/camera/ExtendedFace", "rect", "Landroid/graphics/Rect;", &fields.face_rect }, + { "org/codeaurora/camera/ExtendedFace", "score", "I", &fields.face_score }, + { "org/codeaurora/camera/ExtendedFace", "id", "I", &fields.face_id }, + { "org/codeaurora/camera/ExtendedFace", "leftEye", "Landroid/graphics/Point;", &fields.face_left_eye }, + { "org/codeaurora/camera/ExtendedFace", "rightEye", "Landroid/graphics/Point;", &fields.face_right_eye }, + { "org/codeaurora/camera/ExtendedFace", "mouth", "Landroid/graphics/Point;", &fields.face_mouth }, + { "org/codeaurora/camera/ExtendedFace", "smileDegree", "I", &fields.face_sm_degree }, + { "org/codeaurora/camera/ExtendedFace", "smileScore", "I", &fields.face_sm_score }, + { "org/codeaurora/camera/ExtendedFace", "blinkDetected", "I", &fields.face_blink_detected }, + { "org/codeaurora/camera/ExtendedFace", "faceRecognized", "I", &fields.face_recognised }, + { "org/codeaurora/camera/ExtendedFace", "gazeAngle", "I", &fields.face_gaze_angle }, + { "org/codeaurora/camera/ExtendedFace", "updownDir", "I", &fields.face_updown_dir }, + { "org/codeaurora/camera/ExtendedFace", "leftrightDir", "I", &fields.face_leftright_dir }, + { "org/codeaurora/camera/ExtendedFace", "rollDir", "I", &fields.face_roll_dir }, + { "org/codeaurora/camera/ExtendedFace", "leyeBlink", "I", &fields.face_leye_blink }, + { "org/codeaurora/camera/ExtendedFace", "reyeBlink", "I", &fields.face_reye_blink }, + { "org/codeaurora/camera/ExtendedFace", "leftrightGaze", "I", &fields.face_left_right_gaze }, + { "org/codeaurora/camera/ExtendedFace", "topbottomGaze", "I", &fields.face_top_bottom_gaze }, + }; + find_fields(env, fields_to_find, NELEM(fields_to_find)); jclass clazz = FindClassOrDie(env, "android/hardware/Camera"); @@ -1137,6 +1274,12 @@ int register_android_hardware_Camera(JNIEnv *env) return -1; } + clazz = env->FindClass("org/codeaurora/camera/ExtendedFace"); + if (NULL != clazz) { + fields.face_constructor = env->GetMethodID(clazz, "", "()V"); + find_fields(env, extendedfacefields_to_find, NELEM(extendedfacefields_to_find)); + } + // Register native functions return RegisterMethodsOrDie(env, "android/hardware/Camera", camMethods, NELEM(camMethods)); } diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index f37fd78f6bdd55eca59887daa064b87cad31e16d..69288903bf2a5ed1f8cca4c91a12c698a1655411 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -923,9 +923,9 @@ static jint CameraMetadata_setupGlobalVendorTagDescriptor(JNIEnv *env, jobject t VendorTagDescriptor::clearGlobalVendorTagDescriptor(); return OK; } else if (!res.isOk()) { - VendorTagDescriptor::clearGlobalVendorTagDescriptor(); - ALOGE("%s: Failed to setup vendor tag descriptors: %s", - __FUNCTION__, res.toString8().string()); + ALOGE("%s: Failed to setup vendor tag descriptors: %d: %s", + __FUNCTION__, res.serviceSpecificErrorCode(), + res.toString8().string()); return res.serviceSpecificErrorCode(); } diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 3473d9dab732fc49189c4bb96a977be16158e976..1a7294f1424391b64a2b8063c2fe6dcb74859410 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -27,6 +27,7 @@ #include #include // for AID_SYSTEM +#include #include "androidfw/Asset.h" #include "androidfw/AssetManager.h" @@ -129,7 +130,7 @@ jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table, } // This is called by zygote (running as user root) as part of preloadResources. -static void verifySystemIdmaps() +static void verifySystemIdmaps(const char* overlay_dir) { pid_t pid; char system_id[10]; @@ -186,9 +187,10 @@ static void verifySystemIdmaps() // Directories to scan for overlays // /vendor/overlay - if (stat(AssetManager::OVERLAY_DIR, &st) == 0) { - argv[argc++] = AssetManager::OVERLAY_DIR; - } + + if (stat(overlay_dir, &st) == 0) { + argv[argc++] = overlay_dir; + } // Finally, invoke idmap (if any overlay directory exists) if (argc > 5) { @@ -2077,7 +2079,20 @@ static jintArray android_content_AssetManager_getStyleAttributes(JNIEnv* env, jo static void android_content_AssetManager_init(JNIEnv* env, jobject clazz, jboolean isSystem) { if (isSystem) { - verifySystemIdmaps(); + // Load frameworks-res.apk's overlay through regionalization environment + if (Environment::isSupported()) { + Environment* environment = new Environment(); + if (environment != NULL) { + const char* overlay_dir = environment->getOverlayDir(); + if (overlay_dir != NULL && strcmp(overlay_dir, "") != 0) { + ALOGD("Regionalization - getOverlayDir:%s", overlay_dir); + verifySystemIdmaps(overlay_dir); + } + delete environment; + } + } + + verifySystemIdmaps(AssetManager::OVERLAY_DIR); } AssetManager* am = new AssetManager(); if (am == NULL) { diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index 5559d48a58b655621e25296314951f0e9e643640..a00c16bacca00d988d7931a5dda4dc9aec1ed7a2 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -144,7 +144,7 @@ static volatile int32_t gNumDeathRefs = 0; static void incRefsCreated(JNIEnv* env) { int old = android_atomic_inc(&gNumRefsCreated); - if (old == 200) { + if (old == 2000) { android_atomic_and(0, &gNumRefsCreated); env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, gBinderInternalOffsets.mForceGc); diff --git a/core/jni/android_util_SeempLog.cpp b/core/jni/android_util_SeempLog.cpp new file mode 100644 index 0000000000000000000000000000000000000000..734490a03957e995a506a3034346e7de06969a5d --- /dev/null +++ b/core/jni/android_util_SeempLog.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Not a Contribution. + * + * Copyright (C) 2007-2014 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __BIONIC__ +#include +#endif +#include + +#include "jni.h" +#include "JNIHelp.h" +#include "utils/misc.h" +#include "android_runtime/AndroidRuntime.h" + +#define LOG_BUF_SIZE 1024 +#define SEEMP_SOCK_NAME "/dev/socket/seempdw" +#ifndef __unused +#define __unused __attribute__((__unused__)) +#endif + +static int __write_to_log_init(struct iovec *vec, size_t nr); +static int (*write_to_log)(struct iovec *vec, size_t nr) = __write_to_log_init; +static int logd_fd = -1; + +/* give up, resources too limited */ +static int __write_to_log_null(struct iovec *vec __unused, + size_t nr __unused) +{ + return -1; +} + +/* log_init_lock assumed */ +static int __write_to_log_initialize() +{ + int i, ret = 0; + if (logd_fd >= 0) { + i = logd_fd; + logd_fd = -1; + close(i); + } + + i = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); + if (i < 0) { + ret = -errno; + write_to_log = __write_to_log_null; + } else if (fcntl(i, F_SETFL, O_NONBLOCK) < 0) { + ret = -errno; + close(i); + i = -1; + write_to_log = __write_to_log_null; + } else { + struct sockaddr_un un; + memset(&un, 0, sizeof(struct sockaddr_un)); + un.sun_family = AF_UNIX; + strlcpy(un.sun_path, SEEMP_SOCK_NAME, sizeof(un.sun_path)); + if (connect(i, (struct sockaddr *)&un, sizeof(struct sockaddr_un)) < 0) { + ret = -errno; + close(i); + i = -1; + } + } + logd_fd = i; + return ret; +} + +static int __write_to_log_socket(struct iovec *vec, size_t nr) +{ + ssize_t ret; + if (logd_fd < 0) { + return -EBADF; + } + + /* + * The write below could be lost, but will never block. + * + * ENOTCONN occurs if logd dies. + * EAGAIN occurs if logd is overloaded. + */ + ret = writev(logd_fd, vec, nr); + if (ret < 0) { + ret = -errno; + if (ret == -ENOTCONN) { + ret = __write_to_log_initialize(); + if (ret < 0) { + return ret; + } + + ret = writev(logd_fd, vec, nr); + if (ret < 0) { + ret = -errno; + } + } + } + + return ret; +} + +static int __write_to_log_init(struct iovec *vec, size_t nr) +{ + if (write_to_log == __write_to_log_init) { + int ret; + + ret = __write_to_log_initialize(); + if (ret < 0) { + return ret; + } + + write_to_log = __write_to_log_socket; + } + return write_to_log(vec, nr); +} + +int __android_seemp_socket_write(int len, const char *msg) +{ + struct iovec vec; + vec.iov_base = (void *) msg; + vec.iov_len = len; + + return write_to_log(&vec, 1); +} + +namespace android { + +/* + * In class android.util.Log: + * public static native int println_native(int buffer, int priority, String tag, String msg) + */ +static jint android_util_SeempLog_println_native(JNIEnv* env, jobject clazz, + jint api, jstring msgObj) +{ + if (msgObj == NULL) { + jniThrowNullPointerException(env, "seemp_println needs a message"); + return -1; + } + + int apiId = (int)api; + int apiIdLen = sizeof(apiId); + int utf8MsgLen = env->GetStringUTFLength(msgObj); + int len = apiIdLen + 1 + utf8MsgLen + 1; + char *msg = (char*)malloc(len); + if ( NULL == msg ) + { + return -1; + } + char *params = msg + apiIdLen + 1; // api_id + encoding byte + params + + *((int*)msg) = apiId; // copy api id + // // skip encoding byte + env->GetStringUTFRegion(msgObj, 0, env->GetStringLength(msgObj), params); // copy message + msg[len - 1] = 0; // copy terminating zero + + int res = __android_seemp_socket_write(len, msg); // send message + + free(msg); + + return res; +} + +/* + * JNI registration. + */ +static JNINativeMethod gMethods[] = { + /* name, signature, funcPtr */ + { "seemp_println_native", "(ILjava/lang/String;)I", + (void*) android_util_SeempLog_println_native }, +}; + +int register_android_util_SeempLog(JNIEnv* env) +{ + jclass clazz = env->FindClass("android/util/SeempLog"); + if (clazz == NULL) { + return -1; + } + + return AndroidRuntime::registerNativeMethods(env, "android/util/SeempLog", gMethods, + NELEM(gMethods)); +} + +}; // namespace android diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp index d6f9db58c3612d0c6e702d938126e058b00ef478..71aee9031a40944b2691c68abd10e1aa67b9d4f9 100644 --- a/core/jni/android_view_DisplayListCanvas.cpp +++ b/core/jni/android_view_DisplayListCanvas.cpp @@ -204,6 +204,12 @@ static void android_view_DisplayListCanvas_drawLayer(JNIEnv* env, jobject clazz, static jboolean android_view_DisplayListCanvas_isAvailable(JNIEnv* env, jobject clazz) { char prop[PROPERTY_VALUE_MAX]; + + property_get("persist.sys.force_sw_gles", prop, "0"); + if (atoi(prop) == 1) { + return JNI_FALSE; + } + if (property_get("ro.kernel.qemu", prop, NULL) == 0) { // not in the emulator return JNI_TRUE; diff --git a/core/jni/com_android_internal_app_ActivityTrigger.cpp b/core/jni/com_android_internal_app_ActivityTrigger.cpp new file mode 100644 index 0000000000000000000000000000000000000000..26381e440a6a078d85e96a374f99ad3459654ad7 --- /dev/null +++ b/core/jni/com_android_internal_app_ActivityTrigger.cpp @@ -0,0 +1,334 @@ +/* Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#define LOG_TAG "ActTriggerJNI" + +#include "jni.h" +#include "JNIHelp.h" +#include + +#include +#include +#include + +#include +#include + +#define LIBRARY_PATH_PREFIX "/vendor/lib/" + +namespace android +{ + +// ---------------------------------------------------------------------------- +/* + * Stuct containing handle to dynamically loaded lib as well as function + * pointers to key interfaces. + */ +typedef struct dlLibHandler { + void *dlhandle; + void (*startActivity)(const char *, int *); + void (*resumeActivity)(const char *); + void (*pauseActivity)(const char *); + void (*stopActivity)(const char *); + void (*animationScalesCheck)(const char *, int, float *); + void (*networkOptsCheck)(int, int, const char *); + void (*init)(void); + void (*deinit)(void); + void (*startProcessActivity)(const char *, int); + const char *dlname; +}dlLibHandler; + +/* + * Array of dlhandlers + * library -both handlers for Start and Resume events. + */ +static dlLibHandler mDlLibHandlers[] = { + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "ro.vendor.at_library"}, + {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "ro.vendor.gt_library"}, +}; + +static size_t gTotalNumLibs = 0; +// ---------------------------------------------------------------------------- + +static void +com_android_internal_app_ActivityTrigger_native_at_init() +{ + const char *rc; + char buf[PROPERTY_VALUE_MAX]; + bool errored = false; + size_t numlibs = 0; + + gTotalNumLibs = numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + + for(size_t i = 0; i < numlibs; i++) { + errored = false; + + /* Retrieve name of vendor library */ + if (property_get(mDlLibHandlers[i].dlname, buf, NULL) <= 0) { + continue; + } + + /* Sanity check - ensure */ + buf[PROPERTY_VALUE_MAX-1] = '\0'; + if (strstr(buf, "/") != NULL) { + continue; + } + + mDlLibHandlers[i].dlhandle = dlopen(buf, RTLD_NOW | RTLD_LOCAL); + if (mDlLibHandlers[i].dlhandle == NULL) { + continue; + } + + dlerror(); + + *(void **) (&mDlLibHandlers[i].startActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_start"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + + if (!errored) { + *(void **) (&mDlLibHandlers[i].resumeActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_resume"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].pauseActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_pause"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].stopActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_stop"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].init) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_init"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].startProcessActivity) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_process_start"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].animationScalesCheck) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_animationScalesCheck"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (!errored) { + *(void **) (&mDlLibHandlers[i].networkOptsCheck) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_networkOptsCheck"); + if ((rc = dlerror()) != NULL) { + errored = true; + } + } + if (errored) { + mDlLibHandlers[i].startActivity = NULL; + mDlLibHandlers[i].resumeActivity = NULL; + mDlLibHandlers[i].pauseActivity = NULL; + mDlLibHandlers[i].stopActivity = NULL; + mDlLibHandlers[i].startProcessActivity = NULL; + mDlLibHandlers[i].animationScalesCheck = NULL; + mDlLibHandlers[i].networkOptsCheck = NULL; + if (mDlLibHandlers[i].dlhandle) { + dlclose(mDlLibHandlers[i].dlhandle); + mDlLibHandlers[i].dlhandle = NULL; + } + gTotalNumLibs = 0; + } else { + (*mDlLibHandlers[i].init)(); + } + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_deinit(JNIEnv *env, jobject clazz) +{ + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + + for(size_t i = 0; i < numlibs; i++) { + if (mDlLibHandlers[i].dlhandle) { + mDlLibHandlers[i].startActivity = NULL; + mDlLibHandlers[i].resumeActivity = NULL; + mDlLibHandlers[i].pauseActivity = NULL; + mDlLibHandlers[i].stopActivity = NULL; + mDlLibHandlers[i].startProcessActivity = NULL; + mDlLibHandlers[i].animationScalesCheck = NULL; + mDlLibHandlers[i].networkOptsCheck = NULL; + + *(void **) (&mDlLibHandlers[i].deinit) = dlsym(mDlLibHandlers[i].dlhandle, "activity_trigger_deinit"); + if (mDlLibHandlers[i].deinit) { + (*mDlLibHandlers[i].deinit)(); + } + + dlclose(mDlLibHandlers[i].dlhandle); + mDlLibHandlers[i].dlhandle = NULL; + } + } + gTotalNumLibs = 0; +} + +static void +com_android_internal_app_ActivityTrigger_native_at_startProcessActivity(JNIEnv *env, jobject clazz, jstring process, jint pid) +{ + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + const char *actStr = env->GetStringUTFChars(process, NULL); + for(size_t i = 0; i < numlibs; i++){ + if(mDlLibHandlers[i].startProcessActivity && process && actStr) { + (*mDlLibHandlers[i].startProcessActivity)(actStr, pid); + } + } + env->ReleaseStringUTFChars(process, actStr); +} + +static jint +com_android_internal_app_ActivityTrigger_native_at_startActivity(JNIEnv *env, jobject clazz, jstring activity, jint flags) +{ + int activiyFlags = flags; + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + for(size_t i = 0; i < numlibs; i++){ + if(mDlLibHandlers[i].startActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (actStr) { + (*mDlLibHandlers[i].startActivity)(actStr, &activiyFlags); + env->ReleaseStringUTFChars(activity, actStr); + } + } + } + return activiyFlags; +} + +static void +com_android_internal_app_ActivityTrigger_native_at_resumeActivity(JNIEnv *env, jobject clazz, jstring activity) +{ + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + + for(size_t i = 0; i < numlibs; i++){ + if(mDlLibHandlers[i].resumeActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (actStr) { + (*mDlLibHandlers[i].resumeActivity)(actStr); + env->ReleaseStringUTFChars(activity, actStr); + } + } + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_pauseActivity(JNIEnv *env, jobject clazz, jstring activity) +{ + for(size_t i = 0; i < gTotalNumLibs; i++){ + if(mDlLibHandlers[i].pauseActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if ( NULL != actStr) { + (*mDlLibHandlers[i].pauseActivity)(actStr); + env->ReleaseStringUTFChars(activity, actStr); + } + } + } +} + +static void +com_android_internal_app_ActivityTrigger_native_at_stopActivity(JNIEnv *env, jobject clazz, jstring activity) +{ + for(size_t i = 0; i < gTotalNumLibs; i++){ + if(mDlLibHandlers[i].stopActivity && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (NULL != actStr) { + (*mDlLibHandlers[i].stopActivity)(actStr); + env->ReleaseStringUTFChars(activity, actStr); + } + } + } +} + +static jfloat +com_android_internal_app_ActivityTrigger_native_at_animationScalesCheck(JNIEnv *env, jobject clazz, jstring activity, jint scaleType) +{ + int type = scaleType; + float scaleValue = -1.0f; + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + for (size_t i = 0; i < numlibs; i++) { + if (mDlLibHandlers[i].animationScalesCheck && activity) { + const char *actStr = env->GetStringUTFChars(activity, NULL); + if (actStr) { + (*mDlLibHandlers[i].animationScalesCheck)(actStr, type, &scaleValue); + env->ReleaseStringUTFChars(activity, actStr); + } + } + } + return scaleValue; +} + +static void +com_android_internal_app_ActivityTrigger_native_at_networkOptsCheck(JNIEnv *env, jobject clazz, jint flag, jint netType, jstring packageName) +{ + size_t numlibs = sizeof (mDlLibHandlers) / sizeof (*mDlLibHandlers); + + for (size_t i = 0; i < numlibs; i++) { + if (mDlLibHandlers[i].networkOptsCheck && packageName) { + const char *actStr = env->GetStringUTFChars(packageName, NULL); + if (actStr) { + (*mDlLibHandlers[i].networkOptsCheck)(flag, netType, actStr); + env->ReleaseStringUTFChars(packageName, actStr); + } + } + } +} +// ---------------------------------------------------------------------------- + +static JNINativeMethod gMethods[] = { + {"native_at_startActivity", "(Ljava/lang/String;I)I", (void *)com_android_internal_app_ActivityTrigger_native_at_startActivity}, + {"native_at_resumeActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_resumeActivity}, + {"native_at_pauseActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_pauseActivity}, + {"native_at_stopActivity", "(Ljava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_stopActivity}, + {"native_at_deinit", "()V", (void *)com_android_internal_app_ActivityTrigger_native_at_deinit}, + {"native_at_startProcessActivity", "(Ljava/lang/String;I)V", (void *)com_android_internal_app_ActivityTrigger_native_at_startProcessActivity}, + {"native_at_animationScalesCheck", "(Ljava/lang/String;I)F", (void *)com_android_internal_app_ActivityTrigger_native_at_animationScalesCheck}, + {"native_at_networkOptsCheck", "(IILjava/lang/String;)V", (void *)com_android_internal_app_ActivityTrigger_native_at_networkOptsCheck}, +}; + + +int register_com_android_internal_app_ActivityTrigger(JNIEnv *env) +{ + com_android_internal_app_ActivityTrigger_native_at_init(); + + return AndroidRuntime::registerNativeMethods(env, + "com/android/internal/app/ActivityTrigger", gMethods, NELEM(gMethods)); +} + +} // namespace android \ No newline at end of file diff --git a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp old mode 100644 new mode 100755 index 364ac44ee0f62ca4bfafb310e90c35b5116a78d9..59e192fc677696a0b1ae4bb9d0312fc6a6efb0da --- a/core/jni/com_android_internal_content_NativeLibraryHelper.cpp +++ b/core/jni/com_android_internal_content_NativeLibraryHelper.cpp @@ -36,7 +36,7 @@ #include #include #include - +#include #define APK_LIB "lib/" #define APK_LIB_LEN (sizeof(APK_LIB) - 1) @@ -55,6 +55,56 @@ #define TMP_FILE_PATTERN "/tmp.XXXXXX" #define TMP_FILE_PATTERN_LEN (sizeof(TMP_FILE_PATTERN) - 1) +typedef void* PFilterObject; + +typedef PFilterObject (*PRegistFilterObject)(int fd); + +typedef void (*PUnRegistFilterObject)(int fd); + +typedef PFilterObject (*PGetFilterObject)(int fd); + +typedef int (*PNameFilter)(char* name, int length, void* param); + +typedef int (*PFilterLibrary)(PFilterObject obj, PNameFilter filter, void* param); + +typedef int (*PHasRenderScript)(PFilterObject obj); + +#define LIB_UNINIT 0 +#define LIB_INITED_AND_FAIL -1 +#define LIB_INITED_AND_SUCCESS 1 +static int g_libInit = LIB_UNINIT; + +static PRegistFilterObject RegistFilterObjectFunc = NULL; +static PUnRegistFilterObject UnRegistFilterObjectFunc = NULL; +static PGetFilterObject GetFilterObjectFunc = NULL; +static PFilterLibrary FilterLibraryFunc = NULL; +static PHasRenderScript HasRenderScriptFunc = NULL; + +static int initApkScanLib() { + if (g_libInit!=LIB_UNINIT) + return g_libInit; + void* handle = dlopen("libapkscanner.so", RTLD_NOW); + if (handle != NULL) { + RegistFilterObjectFunc = (PRegistFilterObject)dlsym(handle, "RegistFilterObject"); + UnRegistFilterObjectFunc = (PUnRegistFilterObject)dlsym(handle, "UnRegistFilterObject"); + GetFilterObjectFunc = (PGetFilterObject)dlsym(handle, "GetFilterObject"); + FilterLibraryFunc = (PFilterLibrary)dlsym(handle, "FilterLibrary"); + HasRenderScriptFunc = (PHasRenderScript)dlsym(handle, "HasRenderScript"); + if (NULL != RegistFilterObjectFunc && + NULL != UnRegistFilterObjectFunc && + NULL != GetFilterObjectFunc && + NULL != FilterLibraryFunc && + NULL != HasRenderScriptFunc) { + g_libInit = LIB_INITED_AND_SUCCESS; + } else { + g_libInit = LIB_INITED_AND_FAIL; + } + } else { + g_libInit = LIB_INITED_AND_FAIL; + } + return g_libInit; +} + namespace android { // These match PackageManager.java install codes @@ -390,6 +440,77 @@ private: const char* mLastSlash; }; +typedef struct _LibFileDealer +{ + ZipFileRO* zipFile; + iterFunc callFunc; + JNIEnv *env; + void* callArg; + const ScopedUtfChars* cpuAbi; + install_status_t ret; +} LibFileDealer, *PLibFileDealer; + +typedef struct _LibFileAbiDealer +{ + int status; + int numAbis; + Vector* supportedAbis; +} LibFileAbiDealer, *PLibFileAbiDealer; + +static int dealLibFile(char* fileName, int fileNameLen, void* param) +{ + PLibFileDealer dealer = (PLibFileDealer)param; + char temp = fileName[fileNameLen]; + fileName[fileNameLen] = '\0'; + // Check to make sure the CPU ABI of this file is one we support. + const char* lastSlash = strrchr(fileName, '/'); + const char* cpuAbiOffset = fileName + APK_LIB_LEN; + const size_t cpuAbiRegionSize = lastSlash - cpuAbiOffset; + int ret = 0; + if (dealer->cpuAbi->size() == cpuAbiRegionSize + && !strncmp(cpuAbiOffset, dealer->cpuAbi->c_str(), cpuAbiRegionSize)) { + ZipEntryRO entry = dealer->zipFile->findEntryByName(fileName); + dealer->ret = dealer->callFunc(dealer->env, dealer->callArg, + dealer->zipFile, entry, lastSlash + 1); + if (dealer->ret != INSTALL_SUCCEEDED) { + ALOGV("Failure for entry %s", lastSlash + 1); + ret = 1; + } + } + fileName[fileNameLen] = temp; + return ret; +} + +static int dealLibAbiFile(char* fileName, int fileNameLen, void* param) +{ + PLibFileAbiDealer dealer = (PLibFileAbiDealer)param; + char temp = fileName[fileNameLen]; + fileName[fileNameLen] = '\0'; + int status = dealer->status; + if (status == NO_NATIVE_LIBRARIES) { + status = dealer->status = INSTALL_FAILED_NO_MATCHING_ABIS; + } + const char* abiOffset = fileName + APK_LIB_LEN; + const char* lastSlash = strrchr(fileName, '/'); + const size_t abiSize = lastSlash - abiOffset; + int ret = 0; + for (int i = 0; i < dealer->numAbis; i++) { + const ScopedUtfChars* abi = (*(dealer->supportedAbis))[i]; + if (abi != NULL && abi->size() == abiSize && !strncmp(abiOffset, abi->c_str(), abiSize)) { + // The entry that comes in first (i.e. with a lower index) has the higher priority. + if (((i < status) && (status >= 0)) || (status < 0) ) { + status = dealer->status = i; + if (0 == status) { + ret = 1; + break; + } + } + } + } + fileName[fileNameLen] = temp; + return ret; +} + static install_status_t iterateOverNativeFiles(JNIEnv *env, jlong apkHandle, jstring javaCpuAbi, iterFunc callFunc, void* callArg) { @@ -397,7 +518,27 @@ iterateOverNativeFiles(JNIEnv *env, jlong apkHandle, jstring javaCpuAbi, if (zipFile == NULL) { return INSTALL_FAILED_INVALID_APK; } - + if (initApkScanLib() == LIB_INITED_AND_SUCCESS) { + PFilterObject filter = GetFilterObjectFunc(zipFile->getFileDescriptor()); + if (filter != NULL) { + const ScopedUtfChars cpuAbi(env, javaCpuAbi); + if (cpuAbi.c_str() == NULL) { + // This would've thrown, so this return code isn't observable by + // Java. + return INSTALL_FAILED_INVALID_APK; + } + LibFileDealer param; + param.zipFile = zipFile; + param.callFunc = callFunc; + param.env = env; + param.callArg = callArg; + param.cpuAbi = &cpuAbi; + param.ret = INSTALL_SUCCEEDED; + if (0 == FilterLibraryFunc(filter, dealLibFile, ¶m)) { + return param.ret; + } + } + } UniquePtr it(NativeLibrariesIterator::create(zipFile)); if (it.get() == NULL) { return INSTALL_FAILED_INVALID_APK; @@ -445,6 +586,24 @@ static int findSupportedAbi(JNIEnv *env, jlong apkHandle, jobjectArray supported if (zipFile == NULL) { return INSTALL_FAILED_INVALID_APK; } + int status = NO_NATIVE_LIBRARIES; + if (initApkScanLib() == LIB_INITED_AND_SUCCESS) { + PFilterObject filter = GetFilterObjectFunc(zipFile->getFileDescriptor()); + if (filter != NULL) { + LibFileAbiDealer param; + param.status = status; + param.numAbis = numAbis; + param.supportedAbis = &supportedAbis; + int ret = FilterLibraryFunc(filter, dealLibAbiFile, ¶m); + if ((0 == ret) || (1 == ret)) { + status = param.status; + for (int i = 0; i < numAbis; ++i) { + delete supportedAbis[i]; + } + return status; + } + } + } UniquePtr it(NativeLibrariesIterator::create(zipFile)); if (it.get() == NULL) { @@ -452,7 +611,7 @@ static int findSupportedAbi(JNIEnv *env, jlong apkHandle, jobjectArray supported } ZipEntryRO entry = NULL; - int status = NO_NATIVE_LIBRARIES; + while ((entry = it->next()) != NULL) { // We're currently in the lib/ directory of the APK, so it does have some native // code. We should return INSTALL_FAILED_NO_MATCHING_ABIS if none of the @@ -523,6 +682,16 @@ static jint com_android_internal_content_NativeLibraryHelper_hasRenderscriptBitcode(JNIEnv *env, jclass clazz, jlong apkHandle) { ZipFileRO* zipFile = reinterpret_cast(apkHandle); + if (initApkScanLib() == LIB_INITED_AND_SUCCESS) { + PFilterObject filter = GetFilterObjectFunc(zipFile->getFileDescriptor()); + if (filter != NULL) { + int ret = HasRenderScriptFunc(filter); + if (1 == ret) + return BITCODE_PRESENT; + else if(0 == ret) + return NO_BITCODE_PRESENT; + } + } void* cookie = NULL; if (!zipFile->startIteration(&cookie, NULL /* prefix */, RS_BITCODE_SUFFIX)) { return APK_SCAN_ERROR; @@ -551,6 +720,9 @@ com_android_internal_content_NativeLibraryHelper_openApk(JNIEnv *env, jclass, js { ScopedUtfChars filePath(env, apkPath); ZipFileRO* zipFile = ZipFileRO::open(filePath.c_str()); + if (zipFile != NULL && initApkScanLib() == LIB_INITED_AND_SUCCESS) { + RegistFilterObjectFunc(zipFile->getFileDescriptor()); + } return reinterpret_cast(zipFile); } @@ -558,6 +730,13 @@ com_android_internal_content_NativeLibraryHelper_openApk(JNIEnv *env, jclass, js static void com_android_internal_content_NativeLibraryHelper_close(JNIEnv *env, jclass, jlong apkHandle) { + if (initApkScanLib() == LIB_INITED_AND_SUCCESS) { + ZipFileRO* zipFile = reinterpret_cast(apkHandle); + if (zipFile != NULL) { + UnRegistFilterObjectFunc(zipFile->getFileDescriptor()); + } + } + delete reinterpret_cast(apkHandle); } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 8f9259881308512914e3167d27971fca27778a16..2325d8786be24407e89a81ad93cc6cf0a5ad9f57 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -277,6 +277,23 @@ + + + + + + + + + + + + + + + + + @@ -484,6 +501,9 @@ + + + diff --git a/core/res/res/layout/permission_confirmation_dialog.xml b/core/res/res/layout/permission_confirmation_dialog.xml new file mode 100755 index 0000000000000000000000000000000000000000..472602b24bd6bcd235e5b8da2be38afc6901fa00 --- /dev/null +++ b/core/res/res/layout/permission_confirmation_dialog.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + diff --git a/core/res/res/values-zh-rCN/arrays.xml b/core/res/res/values-zh-rCN/arrays.xml new file mode 100755 index 0000000000000000000000000000000000000000..bb2cb2a99a1681259b61f27f5baea608b0d3a396 --- /dev/null +++ b/core/res/res/values-zh-rCN/arrays.xml @@ -0,0 +1,35 @@ + + + + + + 尝试打开WLAN + 尝试打开蓝牙 + + diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml old mode 100644 new mode 100755 index d7490c57f2e0db2d718fb0580150f7746d546f60..7383ffd4b86695efb5977177cd80e830dbd2d9fe --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -207,6 +207,9 @@ "您要关机吗?" "重新启动并进入安全模式" "您要重新启动并进入安全模式吗?这样会停用您已安装的所有第三方应用。再次重新启动将恢复这些应用。" + "重启" + "您的平板电脑将会重启。" + "您的手机将会重启。" "近期任务" "最近没有运行任何应用" "平板电脑选项" @@ -214,6 +217,7 @@ "手机选项" "屏幕锁定" "关机" + "重启" "错误报告" "提交错误报告" "这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。" @@ -245,11 +249,11 @@ "通讯录" "访问您的通讯录" "位置信息" - "获取此设备的位置信息" + "获得设备所在位置信息" "日历" "访问您的日历" "短信" - "发送和查看短信" + "短信" "存储空间" "访问您设备上的照片、媒体内容和文件" "麦克风" @@ -257,7 +261,7 @@ "相机" "拍摄照片和录制视频" "电话" - "拨打电话和管理通话" + "电话" "身体传感器" "访问与您的生命体征相关的传感器数据" "检索窗口内容" @@ -292,9 +296,9 @@ "允许应用读取您的设备收到的小区广播消息。小区广播消息是在某些地区发送的、用于发布紧急情况警告的提醒信息。恶意应用可能会在您收到小区紧急广播时干扰您设备的性能或操作。" "读取订阅的供稿" "允许应用获取有关当前同步的 Feed 的详情。" - "发送和查看短信" + "发送短信" "允许该应用发送短信。此权限可能会导致意外收费。恶意应用可能会未经您的确认而发送短信,由此产生相关费用。" - "读取您的讯息(短信或彩信)" + "读取您的讯息(短信/彩信)" "允许该应用读取您平板电脑或SIM卡上存储的短信。此权限可让该应用读取所有短信,而不考虑短信内容或机密性。" "允许应用读取您的电视或 SIM 卡上存储的短信。此权限会允许应用读取所有短信,而不论短信内容是什么或是否属于机密内容。" "允许该应用读取您手机或SIM卡上存储的短信。此权限可让该应用读取所有短信,而不考虑短信内容或机密性。" @@ -332,7 +336,7 @@ "允许该应用读取您平板电脑上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。" "允许应用读取您的电视上存储的联系人相关数据,包括您与特定联系人通话、发送电子邮件或通过其他方式进行通信的频率。此权限可让应用保存您的联系人数据,而且恶意应用可能会在您不知情的情况下分享联系人数据。" "允许该应用读取您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定个人通信的频率。此权限可让应用保存您的联系人数据,而恶意应用可能会在您不知情的情况下分享联系人数据。" - "修改您的通讯录" + "写入/删除您的通讯录" "允许该应用修改您平板电脑上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。" "允许应用修改您的电视上存储的联系人相关数据,包括您与特定联系人通话、发送电子邮件或通过其他方式进行通信的频率。此权限可让应用删除联系人数据。" "允许该应用修改您手机上存储的联系人的相关数据,包括您通过打电话、发送电子邮件或以其他方式与特定联系人通信的频率。此权限可让应用删除联系人数据。" @@ -340,7 +344,7 @@ "允许该应用读取平板电脑的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。" "允许应用读取您的电视的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。" "允许该应用读取手机的通话记录,包括有关来电和外拨电话的数据。此权限可让应用保存您的通话记录数据,而恶意应用可能会在您不知情的情况下分享通话记录数据。" - "写入通话记录" + "写入/删除通话记录" "允许该应用修改平板电脑的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。" "允许应用修改电视的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。" "允许该应用修改手机的通话记录,包括有关来电和外拨电话的数据。恶意应用可能会借此清除或修改您的通话记录。" @@ -356,7 +360,7 @@ "允许该应用添加、删除、更改您可在手机上修改的活动,包括朋友或同事的活动。此权限可让该应用冒充日历所有者发送消息,或在所有者不知情的情况下修改活动。" "获取额外的位置信息提供程序命令" "允许该应用使用其他的位置信息提供程序命令。此权限使该应用可以干扰GPS或其他位置信息源的运作。" - "访问确切位置信息(以 GPS 和网络为依据)" + "精确位置(基于GPS)" "允许该应用通过全球定位系统(GPS)或网络位置信息源(例如基站和WLAN)获取您的精确位置信息。您必须在设备上开启这些位置信息服务,应用才能获得位置信息。应用会使用此类服务确定您的位置,这可能会消耗更多电量。" "访问大致位置信息(以网络为依据)" "允许该应用获取您的大致位置信息。这类位置信息来自于使用网络位置信息源(例如基站和WLAN)的位置信息服务。您必须在设备上开启这些位置信息服务,应用才能获得位置信息。应用会使用此类服务确定您的大概位置。" @@ -370,7 +374,7 @@ "允许该应用使用相机拍摄照片和视频。此权限可让该应用随时使用相机,而无需您的确认。" "控制振动" "允许应用控制振动器。" - "直接拨打电话号码" + "拨打电话" "允许该应用在您未执行操作的情况下拨打电话号码。此权限可能会导致意外收费或呼叫。请注意,此权限不允许该应用拨打紧急电话号码。恶意应用可通过拨打电话产生相关费用,而无需您的确认。" "使用即时通讯通话服务" "允许应用自行使用即时通讯服务拨打电话。" @@ -408,13 +412,13 @@ "允许应用更改绑定网络连接的状态。" "查看WLAN连接" "允许该应用查看WLAN网络的相关信息,例如是否启用了WLAN以及连接的WLAN设备的名称。" - "连接WLAN网络和断开连接" + "打开WLAN" "允许该应用与WLAN接入点建立和断开连接,以及更改WLAN网络的设备配置。" "允许接收WLAN多播" "允许该应用使用多播地址接收发送到WLAN网络上所有设备(而不仅仅是您的平板电脑)的数据包。该操作的耗电量比非多播模式要大。" "允许应用使用多播地址接收发送到 WLAN 网络中所有设备(而不仅仅是您的电视)的数据包。该操作的耗电量比非多播模式要大。" "允许该应用使用多播地址接收发送到WLAN网络上所有设备(而不仅仅是您的手机)的数据包。该操作的耗电量比非多播模式要大。" - "访问蓝牙设置" + "打开蓝牙" "允许应用配置本地蓝牙平板电脑,并允许其查找远程设备且与之配对。" "允许应用配置本地蓝牙电视,并允许其查找远程设备且与之配对。" "允许应用配置本地蓝牙手机,并允许其查找远程设备且与之配对。" @@ -459,13 +463,13 @@ "允许该应用修改某个帐号的同步设置。例如,此权限可用于在“联系人”应用与某个帐号之间启用同步。" "读取同步统计信息" "允许该应用读取某个帐号的同步统计信息,包括同步活动历史记录和同步数据量。" - "读取您的USB存储设备中的内容" + "读取内部存储" "读取您的SD卡中的内容" - "允许应用读取您USB存储设备中的内容。" + "允许应用读取存储设备。" "允许应用读取您SD卡的内容。" - "修改或删除您的USB存储设备中的内容" - "修改或删除您的SD卡中的内容" - "允许应用写入USB存储设备。" + "写入/删除内部存储" + "写入/删除您的SD卡中的内容" + "允许应用写入存储设备。" "允许应用写入SD卡。" "拨打/接听SIP电话" "允许该应用拨打和接听SIP电话。" @@ -1625,6 +1629,7 @@ 已选择 %1$d 已选择 %1$d + "这些通知的重要程度由您来设置。" "这条通知涉及特定的人,因此被归为重要通知。" "允许%1$s使用 %2$s 创建新用户吗?" @@ -1654,4 +1659,14 @@ "恢复出厂设置即可正常使用此设备,不受任何限制" "触摸即可了解详情。" "已停用的%1$s" + + + 中国移动 + 中国联通 + 中国电信 + 其他权限 + 永远记住 + 权限 + 允许 + 拒绝 diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml old mode 100644 new mode 100755 index 6c896b2534ef2d2e68d0eee275d38fec287452ab..778a37fd506230883eae7975ba8c452eece48c51 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1625,6 +1625,7 @@ 已選取 %1$d 個項目 已選取 %1$d 個項目 + "您可以設定這些通知的重要性。" "列為重要的原因:涉及的人。" "要允許 %1$s 使用 %2$s 建立新使用者嗎?" @@ -1654,4 +1655,9 @@ "將此裝置回復至原廠設定後,使用將不受限制" "輕觸以瞭解詳情。" "「%1$s」已停用" + + + 中國移動 + 中國聯通 + 中國電信 diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml old mode 100644 new mode 100755 index e190bd13f5d24dd5b6136cd47e96b5321be77aaf..f1c0e4c211a82b8838d1eccc88d3734580737753 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -234,5 +234,22 @@ @string/unpin_target @string/app_info + + Trying to enable WLAN + Trying to enable BT + + + + android + com.android.location.fused + com.android.settings + com.android.defcontainer + com.android.poweronalert + com.android.shell + com.android.deskclock + com.android.providers.media + com.android.inputdevices + com.android.providers.settings + diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml old mode 100644 new mode 100755 index b236b82e74c1da398dceba6974263d6a3a835b51..5505d229b5fa8ff4a2b474ed475e74331541cd99 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -405,7 +405,7 @@ false - false + true @@ -416,6 +416,7 @@ scan and wake the host when a configured SSID is detected by the dongle. This chipset capability can provide power savings when wifi needs to be always kept on. --> false + true true @@ -1331,6 +1332,9 @@ --> + + com.qualcomm.location + true @@ -1869,6 +1873,9 @@ 524288,1048576,2097152,262144,524288,1048576 + + true + + false + 0 + + + + false + 0 + + + + false + 0 + + + + + false + 0 + + + + false + 0 + + + + false + 0 + + + + false + 0 + + + + + + + + 0 + + + + false + + 0 + + + + false + true + + true + + CHINA\u0020\u0020MOBILE + CMCC + CHN-UNICOM + China Mobile + China Unicom + China Telecom + 中国移动 + 中国联通 + 中国电信 + 中國移動 + 中國聯通 + 中國電信 + Searching for Service + + + + China_Mobile + China_Mobile + China_Unicom + China_Mobile + China_Unicom + China_Telecom + China_Mobile + China_Unicom + China_Telecom + China_Mobile + China_Unicom + China_Telecom + roamingTextSearching + + + + false + + + false + + + "" + 2G + 3G + 4G + + + + + + + false + + false + + + false + + false + + + false + + false + + + -140 + -113 + -103 + -97 + -89 + -44 + + + -140 + -120 + -115 + -110 + -100 + -44 + + + + false + false + false + false + false diff --git a/core/res/res/values/customize.xml b/core/res/res/values/customize.xml new file mode 100644 index 0000000000000000000000000000000000000000..b7c2ce08f2b458b20343bed41e7e3354f69d2150 --- /dev/null +++ b/core/res/res/values/customize.xml @@ -0,0 +1,46 @@ + + + + + + + + + + 4 + + + + + + diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml old mode 100644 new mode 100755 index b55a9b22118b3a97c8f82554462b48b15daaa9b1..597f5d63613b5ad44a1a6793305698bb33025fb9 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -590,7 +590,7 @@ SMS - send and view SMS messages + SMS Storage @@ -610,7 +610,7 @@ Phone - make and manage phone calls + Phone Body Sensors @@ -723,14 +723,14 @@ Allows the app to get details about the currently synced feeds. - send and view SMS messages + send SMS messages Allows the app to send SMS messages. This may result in unexpected charges. Malicious apps may cost you money by sending messages without your confirmation. - read your text messages (SMS or MMS) + read your text messages (SMS/MMS) Allows the app to read SMS messages stored on your tablet or SIM card. This allows the app to read all @@ -872,7 +872,7 @@ knowledge. - modify your contacts + modify/delete your contacts Allows the app to modify the data about your contacts stored on your tablet, including the @@ -911,7 +911,7 @@ may share call log data without your knowledge. - write call log + write/delete call log Allows the app to modify your tablet\'s call log, including data about incoming and outgoing calls. Malicious apps may use this to erase or modify your call log. @@ -977,8 +977,7 @@ with the operation of the GPS or other location sources.
- access precise location (GPS and - network-based) + access precise location (GPS) Allows the app to get your precise location using the Global Positioning System (GPS) or network @@ -1028,7 +1027,7 @@ Allows the app to control the vibrator. - directly call phone numbers + call phone Allows the app to call phone numbers without your intervention. This may result in unexpected charges or calls. @@ -1138,7 +1137,7 @@ connected Wi-Fi devices. - connect and disconnect from Wi-Fi + enable WLAN Allows the app to connect to and disconnect from Wi-Fi access points and to make changes to device @@ -1159,7 +1158,7 @@ not just your phone. It uses more power than the non-multicast mode. - access Bluetooth settings + enable Bluetooth Allows the app to configure the local Bluetooth tablet, and to discover and pair with remote @@ -1276,20 +1275,20 @@ Allows an app to read the sync stats for an account, including the history of sync events and how much data is synced. - read the contents of your USB storage + read the contents of your internal storage read the contents of your SD card - Allows the app to read the contents of your USB storage. + Allows the app to read the contents of your internal storage. Allows the app to read the contents of your SD card. - modify or delete the contents of your USB storage + write/delete internal storage modify or delete the contents of your SD card - Allows the app to write to the USB storage. + Allows the app to write to the internal storage. Allows the app to write to the SD card. @@ -4379,4 +4378,13 @@ Disabled %1$s + + China Mobile + China Unicom + China Telecom + other permissions + Remember + Permission + Allow + Deny diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 842ce4927381d4a440cd30bf9bb68a6c26d7d0a8..54890998489d588fea89797cddd2bd85bb515357 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -213,6 +213,10 @@ + + + + @@ -354,6 +358,7 @@ + @@ -1106,6 +1111,9 @@ + + + @@ -1375,6 +1383,7 @@ + @@ -1476,6 +1485,7 @@ + @@ -1686,6 +1696,7 @@ + @@ -1802,6 +1813,7 @@ + @@ -1908,6 +1920,8 @@ + + @@ -2412,6 +2426,8 @@ + + @@ -2647,4 +2663,100 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/sounds/AllAudio.mk b/data/sounds/AllAudio.mk index edfd3800600c4738f441a17ddb58e926c6f41b2f..bfb41d1c8d9e5d06b13b64af8417f644f475d145 100644 --- a/data/sounds/AllAudio.mk +++ b/data/sounds/AllAudio.mk @@ -24,19 +24,13 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/alarms/ogg/Argon.ogg:system/media/audio/alarms/Argon.ogg \ $(LOCAL_PATH)/alarms/ogg/Barium.ogg:system/media/audio/alarms/Barium.ogg \ $(LOCAL_PATH)/alarms/ogg/Carbon.ogg:system/media/audio/alarms/Carbon.ogg \ - $(LOCAL_PATH)/alarms/ogg/Cesium.ogg:system/media/audio/alarms/Cesium.ogg \ - $(LOCAL_PATH)/alarms/ogg/Fermium.ogg:system/media/audio/alarms/Fermium.ogg \ $(LOCAL_PATH)/alarms/ogg/Hassium.ogg:system/media/audio/alarms/Hassium.ogg \ - $(LOCAL_PATH)/alarms/ogg/Helium.ogg:system/media/audio/alarms/Helium.ogg \ $(LOCAL_PATH)/alarms/ogg/Krypton.ogg:system/media/audio/alarms/Krypton.ogg \ $(LOCAL_PATH)/alarms/ogg/Neon.ogg:system/media/audio/alarms/Neon.ogg \ $(LOCAL_PATH)/alarms/ogg/Neptunium.ogg:system/media/audio/alarms/Neptunium.ogg \ - $(LOCAL_PATH)/alarms/ogg/Nobelium.ogg:system/media/audio/alarms/Nobelium.ogg \ $(LOCAL_PATH)/alarms/ogg/Osmium.ogg:system/media/audio/alarms/Osmium.ogg \ - $(LOCAL_PATH)/alarms/ogg/Oxygen.ogg:system/media/audio/alarms/Oxygen.ogg \ $(LOCAL_PATH)/alarms/ogg/Platinum.ogg:system/media/audio/alarms/Platinum.ogg \ $(LOCAL_PATH)/alarms/ogg/Plutonium.ogg:system/media/audio/alarms/Plutonium.ogg \ - $(LOCAL_PATH)/alarms/ogg/Promethium.ogg:system/media/audio/alarms/Promethium.ogg \ $(LOCAL_PATH)/alarms/ogg/Scandium.ogg:system/media/audio/alarms/Scandium.ogg \ $(LOCAL_PATH)/notifications/ogg/Adara.ogg:system/media/audio/notifications/Adara.ogg \ $(LOCAL_PATH)/notifications/Aldebaran.ogg:system/media/audio/notifications/Aldebaran.ogg \ diff --git a/include/SeempLog.h b/include/SeempLog.h new file mode 100644 index 0000000000000000000000000000000000000000..30ae338b7e3c673797dbd2fe01e7c62e7ee9ce86 --- /dev/null +++ b/include/SeempLog.h @@ -0,0 +1,51 @@ +/* + +Copyright (c) 2015, The Linux Foundation. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of The Linux Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#include + +#define SEEMPLOG_RECORD(api, params) \ + static bool shouldTryLoad = true; \ + static void (*seemp_log_record_func)(int type, const char* msg) = NULL; \ + \ + if (shouldTryLoad) { \ + shouldTryLoad = false; \ + void* libhandle = dlopen("libSeemplog.so", RTLD_NOW); \ + if (libhandle != NULL) { \ + *(void**)(&seemp_log_record_func) = \ + dlsym(libhandle, "seemp_log_record"); \ + } \ + } \ + if (seemp_log_record_func) \ + seemp_log_record_func(api, params); + + + diff --git a/include/androidfw/ZipFileRO.h b/include/androidfw/ZipFileRO.h index 768034287afaf0eb0fa77ffeb0da2522c4d8e76b..83dcb417448f205f169d10575fd8d5ade239a5d3 100644 --- a/include/androidfw/ZipFileRO.h +++ b/include/androidfw/ZipFileRO.h @@ -154,6 +154,8 @@ public: ~ZipFileRO(); + int getFileDescriptor() const; + private: /* these are private and not defined */ ZipFileRO(const ZipFileRO& src); diff --git a/include/private/regionalization/Environment.h b/include/private/regionalization/Environment.h new file mode 100644 index 0000000000000000000000000000000000000000..d912383431a3b5992c4eda848e9a7acca40db235 --- /dev/null +++ b/include/private/regionalization/Environment.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef ANDROID_REGIONALIZATION_ENVIRONMENT_H +#define ANDROID_REGIONALIZATION_ENVIRONMENT_H + +namespace android { + + /** + * Class used by Regionalization Carrier switching in order to get + * the resource path of switched packages for Carrier. + */ +class Environment { +public: + /** For boot and shutdown animation and music + * The value which will get different type Animation and boot + * audio file path from BOOT_SHUTDOWN_FILE Array. + * (STATUS:TYPE) + * (0:0) Boot Animation,(0:1) Boot Audio + * (1:0) Shutdown Animation,(1,1) Shutdown Audio + */ + const static int BOOT_STATUS = 0; + const static int SHUTDOWN_STATUS = 1; + const static int ANIMATION_TYPE = 0; + const static int MUSIC_TYPE = 1; + + Environment(void); + + ~Environment(void); + + static bool isSupported(void); + + bool loadPackagesFromSpecFile(void); + + const char* getMediaFile(int type, int state); + + const char* getOverlayDir(void); + +private: + char* mStoragePos; + int mPackagesCount; + char** mPackages; + char* mMediaFile; + char* mOverlayDir; +}; + +}; // namespace android + +#endif // ANDROID_REGIONALIZATION_ENVIRONMENT_H diff --git a/include/storage/IMountService.h b/include/storage/IMountService.h index c3d34d84958be3f69901c28792cacdb20c5d45e0..b04be8aa2c28e3901a160290b7e306a4c737988d 100644 --- a/include/storage/IMountService.h +++ b/include/storage/IMountService.h @@ -71,6 +71,7 @@ public: virtual bool getMountedObbPath(const String16& filename, String16& path) = 0; virtual int32_t decryptStorage(const String16& password) = 0; virtual int32_t encryptStorage(const String16& password) = 0; + virtual int32_t encryptWipeStorage(const String16& password) = 0; }; // ---------------------------------------------------------------------------- diff --git a/libs/androidfw/ZipFileRO.cpp b/libs/androidfw/ZipFileRO.cpp index 49fe8a2611785bf8fb789b67266a62b9d2571fff..57282236dcb12f8f6cac771054fc4b3b803fa6f8 100644 --- a/libs/androidfw/ZipFileRO.cpp +++ b/libs/androidfw/ZipFileRO.cpp @@ -252,3 +252,8 @@ bool ZipFileRO::uncompressEntry(ZipEntryRO entry, int fd) const return true; } + +int ZipFileRO::getFileDescriptor() const +{ + return GetFileDescriptor(mHandle); +} diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp index b68240ac75195f4f150abc6ec6fa9bd5613bdf24..db5d22b6382e6e78bec470face9b419ece035ce3 100644 --- a/libs/hwui/OpenGLRenderer.cpp +++ b/libs/hwui/OpenGLRenderer.cpp @@ -172,15 +172,13 @@ void OpenGLRenderer::discardFramebuffer(float left, float top, float right, floa } void OpenGLRenderer::clear(float left, float top, float right, float bottom, bool opaque) { - if (!opaque) { - mRenderState.scissor().setEnabled(true); - mRenderState.scissor().set(left, getViewportHeight() - bottom, right - left, bottom - top); - glClear(GL_COLOR_BUFFER_BIT); - mDirty = true; - return; + mRenderState.scissor().setEnabled(true); + mRenderState.scissor().set(left, getViewportHeight() - bottom, right - left, bottom - top); + glClear(GL_COLOR_BUFFER_BIT); + if (opaque) { + mRenderState.scissor().reset(); } - - mRenderState.scissor().reset(); + mDirty = true; } bool OpenGLRenderer::finish() { diff --git a/libs/hwui/font/CacheTexture.cpp b/libs/hwui/font/CacheTexture.cpp index 8ba4761c1b2e0cb086c74084cbfb1c8afa35f812..fcdde45c49f2e378c3d7b36be27a23b708ab3452 100644 --- a/libs/hwui/font/CacheTexture.cpp +++ b/libs/hwui/font/CacheTexture.cpp @@ -188,15 +188,21 @@ void CacheTexture::allocatePixelBuffer() { bool CacheTexture::upload() { const Rect& dirtyRect = mDirtyRect; - uint32_t x = mHasUnpackRowLength ? dirtyRect.left : 0; - uint32_t y = dirtyRect.top; - uint32_t width = mHasUnpackRowLength ? dirtyRect.getWidth() : getWidth(); - uint32_t height = dirtyRect.getHeight(); + // align the x direction to 32 and y direction to 4 for better performance + uint32_t x = (((uint32_t)dirtyRect.left) & (~0x1F)); + uint32_t y = (((uint32_t)dirtyRect.top) & (~0x3)); + uint32_t r = ((((uint32_t)dirtyRect.right) + 0x1F) & (~0x1F)) - x; + uint32_t b = ((((uint32_t)dirtyRect.bottom) + 0x3) & (~0x3)) - y; + uint32_t width = (r > getWidth() ? getWidth() : r); + uint32_t height = (b > getHeight() ? getHeight() : b); // The unpack row length only needs to be specified when a new // texture is bound if (mHasUnpackRowLength) { glPixelStorei(GL_UNPACK_ROW_LENGTH, getWidth()); + } else { + x = 0; + width = getWidth(); } mPixelBuffer->upload(x, y, width, height); diff --git a/libs/regionalization/Android.mk b/libs/regionalization/Android.mk new file mode 100644 index 0000000000000000000000000000000000000000..4a33a3c6f8169c27c5db849b3b9139dee1d9b1de --- /dev/null +++ b/libs/regionalization/Android.mk @@ -0,0 +1,18 @@ +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) +LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk + +LOCAL_MODULE:= libregionalization +LOCAL_MODULE_TAGS := optional +LOCAL_SRC_FILES := \ + Environment.cpp +LOCAL_C_INCLUDES := \ + frameworks/base/include +LOCAL_SHARED_LIBRARIES := \ + liblog \ + libcutils \ + libutils + +LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code + +include $(BUILD_SHARED_LIBRARY) diff --git a/libs/regionalization/Environment.cpp b/libs/regionalization/Environment.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f16fa3786528fb40f9a2b46514b01f1bbffb922a --- /dev/null +++ b/libs/regionalization/Environment.cpp @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +using namespace android; + +static const char* ENVIRONMENT_PROP = "ro.regionalization.support"; +static const char* SPEC_FILE = "/persist/speccfg/spec"; +static const char* BOOT_SHUTDOWN_FILE[2][2] = { + {"/system/media/bootanimation.zip", "/system/media/shutdownanimation.zip"}, + {"/system/media/boot.wav", "/system/media/shutdown.wav"} }; +static const char* OVERLAY_DIR = "/system/vendor/overlay"; + +static const bool kIsDebug = true; + +Environment::Environment(void) + : mStoragePos(NULL), mPackagesCount(0), + mPackages(NULL), mMediaFile(NULL), + mOverlayDir(NULL) +{ + mStoragePos = new char[PATH_MAX]; + mMediaFile = new char[PATH_MAX]; + mOverlayDir = new char[PATH_MAX]; + if (mStoragePos == NULL || mMediaFile == NULL || mOverlayDir == NULL) { + if (kIsDebug) { + ALOGD("Regionalization Environment new memory error!"); + } + return; + } + + bool success = loadPackagesFromSpecFile(); + if (!success) { + if (kIsDebug) { + ALOGD("Regionalization Environment load packages for Carrier error!"); + } + } +} + +Environment::~Environment(void) +{ + if (mStoragePos != NULL) { + delete[] mStoragePos; + } + + if (mPackages != NULL) { + for (int i=0; i < mPackagesCount; i++) { + if (mPackages[i] != NULL) { + delete[] mPackages[i]; + } + } + delete[] mPackages; + } + + mPackagesCount = 0; + + if (mMediaFile != NULL) { + delete[] mMediaFile; + } + + if (mOverlayDir != NULL) { + delete[] mOverlayDir; + } +} + +bool Environment::isSupported(void) +{ + char value[PROPERTY_VALUE_MAX]; + memset(value, 0, PROPERTY_VALUE_MAX * sizeof(char)); + property_get(ENVIRONMENT_PROP, value, "false"); + if (!strcmp(value, "true")) { + return true; + } + + return false; +} + +bool Environment::loadPackagesFromSpecFile(void) { + FILE* fSpec = NULL; + if ((fSpec = fopen(SPEC_FILE, "r")) == NULL) { + return false; + } + + // Read first line to get storage position of packages + int res = fscanf(fSpec, "%*[^=]=%s", mStoragePos); + if (res < 1 || strcmp(mStoragePos, "") == 0) { + fclose(fSpec); + return false; + } + + // Read second line to get count of packages. + res = fscanf(fSpec, "%*[^=]=%d", &mPackagesCount); + if (res < 1 || mPackagesCount <= 0) { + fclose(fSpec); + return false; + } + + mPackages = new char*[mPackagesCount]; + if (mPackages == NULL) { + fclose(fSpec); + return false; + } + for (int i = 0; i < mPackagesCount; i++) { + mPackages[i] = new char[PATH_MAX]; + } + + for (int i = 0; i < mPackagesCount; i++) { + res = fscanf(fSpec, "%*[^=]=%s", mPackages[i]); + if (res < 1) { + fclose(fSpec); + return false; + } + } + + fclose(fSpec); + return true; +} + +// type: {0:Animation; 1:Audio} +// state: {0:boot; 1:shutdown} +const char* Environment::getMediaFile(int type, int state) +{ + if (mPackagesCount != 0 && mStoragePos != NULL && mPackages != NULL) { + for(int i = mPackagesCount-1; i >= 0; i--) { + memset(mMediaFile, 0, PATH_MAX); + strlcpy(mMediaFile, mStoragePos, PATH_MAX); + strlcat(mMediaFile, "/", PATH_MAX); + strlcat(mMediaFile, mPackages[i], PATH_MAX); + strlcat(mMediaFile, BOOT_SHUTDOWN_FILE[type][state], PATH_MAX); + if(access(mMediaFile, R_OK) == 0) { + if (kIsDebug) { + ALOGD("Environment::getMediaFile() = %s\n", mMediaFile); + } + return mMediaFile; + } + } + } + + return NULL; +} + +const char* Environment::getOverlayDir(void) +{ + if (mPackagesCount != 0 && mStoragePos != NULL && mPackages != NULL) { + for (int i = mPackagesCount-1; i >= 0; i--) { + memset(mMediaFile, 0, PATH_MAX); + strlcpy(mOverlayDir, mStoragePos, PATH_MAX); + strlcat(mOverlayDir, "/", PATH_MAX); + strlcat(mOverlayDir, mPackages[i], PATH_MAX); + strlcat(mOverlayDir, OVERLAY_DIR, PATH_MAX); + if (kIsDebug) { + ALOGD("Environment::getOverlayDir() = %s\n", mOverlayDir); + } + // Check if PackageFrameworksRes dir exists. + char overlayFile[PATH_MAX]; + memset(overlayFile, 0, PATH_MAX); + strlcpy(overlayFile, mOverlayDir, PATH_MAX); + strlcat(overlayFile, "/", PATH_MAX); + strlcat(overlayFile, mPackages[i], PATH_MAX); + strlcat(overlayFile, "FrameworksRes", PATH_MAX); + if (access(overlayFile, R_OK) == 0) { + if (kIsDebug) { + ALOGD("Environment::getOverlayDir() - overlayFile exists!\n"); + } + return mOverlayDir; + } + } + } + + return NULL; +} diff --git a/libs/storage/IMountService.cpp b/libs/storage/IMountService.cpp index c643ed008a3b312c30d3320ef478cee10196d18d..fc97886d89905e0281f53e6d7b3d3b1bb1c9a425 100644 --- a/libs/storage/IMountService.cpp +++ b/libs/storage/IMountService.cpp @@ -50,6 +50,7 @@ enum { TRANSACTION_isExternalStorageEmulated, TRANSACTION_decryptStorage, TRANSACTION_encryptStorage, + TRANSACTION_encryptWipeStorage = IBinder::FIRST_CALL_TRANSACTION + 72, }; class BpMountService: public BpInterface @@ -551,6 +552,23 @@ public: } return reply.readInt32(); } + + int32_t encryptWipeStorage(const String16& password) + { + Parcel data, reply; + data.writeInterfaceToken(IMountService::getInterfaceDescriptor()); + data.writeString16(password); + if (remote()->transact(TRANSACTION_encryptWipeStorage, data, &reply) != NO_ERROR) { + ALOGD("encryptWipeStorage could not contact remote\n"); + return -1; + } + int32_t err = reply.readExceptionCode(); + if (err < 0) { + ALOGD("encryptWipeStorage caught exception %d\n", err); + return err; + } + return reply.readInt32(); + } }; IMPLEMENT_META_INTERFACE(MountService, "IMountService") diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 2b3ed8748a20b5036a8c9efedbe0d979d6f0db12..eae966405deb34898c2b8865e0aa076075d9c236 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -463,6 +463,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) { + android.util.SeempLog.record(47); checkProvider(provider); checkListener(listener); @@ -495,6 +496,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper) { + android.util.SeempLog.record(47); checkProvider(provider); checkListener(listener); @@ -528,6 +530,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, LocationListener listener, Looper looper) { + android.util.SeempLog.record(47); checkCriteria(criteria); checkListener(listener); @@ -556,6 +559,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent) { + android.util.SeempLog.record(47); checkProvider(provider); checkPendingIntent(intent); @@ -658,6 +662,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent) { + android.util.SeempLog.record(47); checkCriteria(criteria); checkPendingIntent(intent); @@ -687,6 +692,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestSingleUpdate(String provider, LocationListener listener, Looper looper) { + android.util.SeempLog.record(64); checkProvider(provider); checkListener(listener); @@ -717,6 +723,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestSingleUpdate(Criteria criteria, LocationListener listener, Looper looper) { + android.util.SeempLog.record(64); checkCriteria(criteria); checkListener(listener); @@ -740,6 +747,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestSingleUpdate(String provider, PendingIntent intent) { + android.util.SeempLog.record(64); checkProvider(provider); checkPendingIntent(intent); @@ -764,6 +772,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestSingleUpdate(Criteria criteria, PendingIntent intent) { + android.util.SeempLog.record(64); checkCriteria(criteria); checkPendingIntent(intent); @@ -832,6 +841,7 @@ public class LocationManager { @SystemApi public void requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper) { + android.util.SeempLog.record(47); checkListener(listener); requestLocationUpdates(request, listener, looper, null); } @@ -859,6 +869,7 @@ public class LocationManager { */ @SystemApi public void requestLocationUpdates(LocationRequest request, PendingIntent intent) { + android.util.SeempLog.record(47); checkPendingIntent(intent); requestLocationUpdates(request, null, null, intent); } @@ -877,6 +888,7 @@ public class LocationManager { private void requestLocationUpdates(LocationRequest request, LocationListener listener, Looper looper, PendingIntent intent) { + android.util.SeempLog.record(47); String packageName = mContext.getPackageName(); @@ -985,6 +997,7 @@ public class LocationManager { @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent) { + android.util.SeempLog.record(45); checkPendingIntent(intent); if (expiration < 0) expiration = Long.MAX_VALUE; @@ -1196,6 +1209,7 @@ public class LocationManager { */ @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public Location getLastKnownLocation(String provider) { + android.util.SeempLog.record(46); checkProvider(provider); String packageName = mContext.getPackageName(); LocationRequest request = LocationRequest.createFromDeprecatedProvider( @@ -1665,6 +1679,7 @@ public class LocationManager { @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) public boolean addGpsStatusListener(GpsStatus.Listener listener) { + android.util.SeempLog.record(43); boolean result; if (mGpsStatusListeners.get(listener) != null) { @@ -1840,6 +1855,7 @@ public class LocationManager { @Deprecated @RequiresPermission(ACCESS_FINE_LOCATION) public boolean addNmeaListener(GpsStatus.NmeaListener listener) { + android.util.SeempLog.record(44); boolean result; if (mGpsNmeaListeners.get(listener) != null) { @@ -2222,6 +2238,7 @@ public class LocationManager { * @return true if the command succeeds. */ public boolean sendExtraCommand(String provider, String command, Bundle extras) { + android.util.SeempLog.record(48); try { return mService.sendExtraCommand(provider, command, extras); } catch (RemoteException e) { diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 4bdc70e376218283fa273ad037eada0e9f011a6b..835c452f4a74aa3696040042deab941690fb47a2 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -69,7 +69,6 @@ public class AudioManager { private final boolean mUseFixedVolume; private static String TAG = "AudioManager"; private static final AudioPortEventHandler sAudioPortEventHandler = new AudioPortEventHandler(); - /** * Broadcast intent, a hint for applications that audio is about to become * 'noisy' due to a change in audio outputs. For example, this intent may @@ -312,6 +311,32 @@ public class AudioManager { */ public static final String EXTRA_ENCODINGS = "android.media.extra.ENCODINGS"; + /** + * @hide Broadcast intent when RemoteControlClient list is updated. + */ + @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String RCC_CHANGED_ACTION = + "org.codeaurora.bluetooth.RCC_CHANGED_ACTION"; + + /** + * @hide Used for sharing the calling package name + */ + public static final String EXTRA_CALLING_PACKAGE_NAME = + "org.codeaurora.bluetooth.EXTRA_CALLING_PACKAGE_NAME"; + + /** + * @hide Used for sharing the focus changed value + */ + public static final String EXTRA_FOCUS_CHANGED_VALUE = + "org.codeaurora.bluetooth.EXTRA_FOCUS_CHANGED_VALUE"; + + /** + * @hide Used for sharing the availability changed value + */ + public static final String EXTRA_AVAILABLITY_CHANGED_VALUE = + "org.codeaurora.bluetooth.EXTRA_AVAILABLITY_CHANGED_VALUE"; + + /** The audio stream for phone calls */ public static final int STREAM_VOICE_CALL = AudioSystem.STREAM_VOICE_CALL; /** The audio stream for system sounds */ @@ -2504,6 +2529,7 @@ public class AudioManager { //==================================================================== // Remote Control + /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. * @param eventReceiver identifier of a {@link android.content.BroadcastReceiver} @@ -2522,6 +2548,7 @@ public class AudioManager { "receiver and context package names don't match"); return; } + // construct a PendingIntent for the media button and register it Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); // the associated intent will be handled by the component being registered @@ -2531,6 +2558,7 @@ public class AudioManager { registerMediaButtonIntent(pi, eventReceiver); } + /** * Register a component to be the sole receiver of MEDIA_BUTTON intents. This is like * {@link #registerMediaButtonEventReceiver(android.content.ComponentName)}, but allows @@ -2660,6 +2688,13 @@ public class AudioManager { return false; } rctlr.startListeningToSessions(); + IAudioService service = getService(); + try { + service.updateRemoteControllerOnExistingMediaPlayers(); + } catch (RemoteException e) { + Log.e(TAG, "Error in calling Audio service interface" + + "updateRemoteControllerOnExistingMediaPlayers() due to " + e); + } return true; } @@ -2681,6 +2716,24 @@ public class AudioManager { rctlr.stopListeningToSessions(); } + /** + * @hide + */ + public void updateMediaPlayerList(String packageName, boolean toAdd) { + IAudioService service = getService(); + try { + if (toAdd) { + Log.d(TAG, "updateMediaPlayerList: Add RCC " + packageName + " to List"); + service.addMediaPlayerAndUpdateRemoteController(packageName); + } else { + Log.d(TAG, "updateMediaPlayerList: Remove RCC " + packageName + " from List"); + service.removeMediaPlayerAndUpdateRemoteController(packageName); + } + } catch (RemoteException e) { + Log.e(TAG, "Exception while executing updateMediaPlayerList: " + e); + } + } + //==================================================================== // Audio policy @@ -2734,7 +2787,6 @@ public class AudioManager { } } - //==================================================================== // Recording configuration /** diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index a46fa8a75c7302d5c05ddb0040ba74197c3a6325..21172342289a2a212c32586b9dc32426b7ac795a 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -981,6 +981,7 @@ public class AudioRecord implements AudioRouting */ public void startRecording() throws IllegalStateException { + android.util.SeempLog.record(70); if (mState != STATE_INITIALIZED) { throw new IllegalStateException("startRecording() called on an " + "uninitialized AudioRecord."); @@ -1009,6 +1010,7 @@ public class AudioRecord implements AudioRouting */ public void startRecording(MediaSyncEvent syncEvent) throws IllegalStateException { + android.util.SeempLog.record(70); if (mState != STATE_INITIALIZED) { throw new IllegalStateException("startRecording() called on an " + "uninitialized AudioRecord."); diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 4ac4bcdf943bb5677084c4786d5fc2aff12b7e20..5745c8c142b7d0c3732f5186f00d9ecfbcad7d21 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -170,4 +170,9 @@ interface IAudioService { String getCurrentHotwordInputPackageName(); + void updateRemoteControllerOnExistingMediaPlayers(); + + void addMediaPlayerAndUpdateRemoteController(String packageName); + + void removeMediaPlayerAndUpdateRemoteController(String packageName); } diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 0bfeaed36282fa87661c89ee1554edf8ba46c7da..feb986c6d0335fb0726aaa074a7574e759659f7f 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -769,6 +769,13 @@ public final class MediaCodecInfo { return mDefaultFormat; } + /* Return the capabilities info, so the app can query custom settings + * like for VT. */ + /** @hide */ + public MediaFormat getCapabilitiesInfoFormat() { + return mCapabilitiesInfo; + } + /** * Returns the mime type for which this codec-capability object was created. */ diff --git a/media/java/android/media/MediaFile.java b/media/java/android/media/MediaFile.java index bd27a79b182a02f67dc12623e0c20ef689661431..f0b41892678052a88ffae4f08405ae7e12f34b3d 100644 --- a/media/java/android/media/MediaFile.java +++ b/media/java/android/media/MediaFile.java @@ -47,16 +47,17 @@ public class MediaFile { private static final int LAST_AUDIO_FILE_TYPE = FILE_TYPE_FLAC; // More audio file types - public static final int FILE_TYPE_DTS = 300; - public static final int FILE_TYPE_3GPA = 301; - public static final int FILE_TYPE_AC3 = 302; - public static final int FILE_TYPE_QCP = 303; - public static final int FILE_TYPE_PCM = 304; - public static final int FILE_TYPE_EC3 = 305; - public static final int FILE_TYPE_AIFF = 306; - public static final int FILE_TYPE_APE = 307; + public static final int FILE_TYPE_DTS = 210; + public static final int FILE_TYPE_3GPA = 211; + public static final int FILE_TYPE_AC3 = 212; + public static final int FILE_TYPE_QCP = 213; + public static final int FILE_TYPE_PCM = 214; + public static final int FILE_TYPE_EC3 = 215; + public static final int FILE_TYPE_AIFF = 216; + public static final int FILE_TYPE_APE = 217; + public static final int FILE_TYPE_DSD = 218; private static final int FIRST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_DTS; - private static final int LAST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_APE; + private static final int LAST_AUDIO_FILE_TYPE_EXT = FILE_TYPE_DSD; // MIDI file types public static final int FILE_TYPE_MID = 11; @@ -115,9 +116,10 @@ public class MediaFile { public static final int FILE_TYPE_PLS = 42; public static final int FILE_TYPE_WPL = 43; public static final int FILE_TYPE_HTTPLIVE = 44; + public static final int FILE_TYPE_DASH = 45; private static final int FIRST_PLAYLIST_FILE_TYPE = FILE_TYPE_M3U; - private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_HTTPLIVE; + private static final int LAST_PLAYLIST_FILE_TYPE = FILE_TYPE_DASH; // Drm file types public static final int FILE_TYPE_FL = 51; @@ -281,12 +283,16 @@ public class MediaFile { addFileType("MPEG", FILE_TYPE_MP2PS, "video/mp2p"); addFileType("DIVX", FILE_TYPE_DIVX, "video/divx"); addFileType("FLV", FILE_TYPE_FLV, "video/flv"); + addFileType("MPD", FILE_TYPE_DASH, "application/dash+xml"); addFileType("QCP", FILE_TYPE_QCP, "audio/qcelp"); addFileType("AC3", FILE_TYPE_AC3, "audio/ac3"); addFileType("EC3", FILE_TYPE_EC3, "audio/eac3"); addFileType("AIF", FILE_TYPE_AIFF, "audio/x-aiff"); addFileType("AIFF", FILE_TYPE_AIFF, "audio/x-aiff"); addFileType("APE", FILE_TYPE_APE, "audio/x-ape"); + addFileType("DSF", FILE_TYPE_DSD, "audio/x-dsf"); + addFileType("DFF", FILE_TYPE_DSD, "audio/x-dff"); + addFileType("DSD", FILE_TYPE_DSD, "audio/dsd"); } public static boolean isAudioFileType(int fileType) { diff --git a/media/java/android/media/MediaMetadataEditor.java b/media/java/android/media/MediaMetadataEditor.java index 877c8729543ee09f3b021182bc0234889680896f..648ff242dc1052db476a993581468f06cec19b6f 100644 --- a/media/java/android/media/MediaMetadataEditor.java +++ b/media/java/android/media/MediaMetadataEditor.java @@ -440,7 +440,7 @@ import android.util.SparseIntArray; protected static final SparseIntArray METADATA_KEYS_TYPE; static { - METADATA_KEYS_TYPE = new SparseIntArray(17); + METADATA_KEYS_TYPE = new SparseIntArray(18); // NOTE: if adding to the list below, make sure you increment the array initialization size // keys with long values METADATA_KEYS_TYPE.put( @@ -466,5 +466,7 @@ import android.util.SparseIntArray; // keys with Rating values METADATA_KEYS_TYPE.put(RATING_KEY_BY_OTHERS, METADATA_TYPE_RATING); METADATA_KEYS_TYPE.put(RATING_KEY_BY_USER, METADATA_TYPE_RATING); + // Meta data for total number of tracks in Album + METADATA_KEYS_TYPE.put(MediaMetadataRetriever.METADATA_KEY_NUM_TRACKS, METADATA_TYPE_LONG); } } diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java old mode 100644 new mode 100755 index 4ae2afa9466b853283c6474f7061061602014007..b96151114807d6dc655a7e3aead71dd5c025bc1c --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -499,8 +499,10 @@ public class MediaRecorder setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight); setVideoEncodingBitRate(profile.videoBitRate); setVideoEncoder(profile.videoCodec); - if (profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_LOW && - profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_QVGA) { + if ((profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_LOW && + profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_2160P) || + (profile.quality >= CamcorderProfile.QUALITY_TIME_LAPSE_VGA && + profile.quality <= CamcorderProfile.QUALITY_TIME_LAPSE_4KDCI)) { // Nothing needs to be done. Call to setCaptureRate() enables // time lapse video recording. } else { diff --git a/media/java/android/media/RemoteControlClient.java b/media/java/android/media/RemoteControlClient.java index 6d32eff9e8d0eae28b30ff5c77d40774ed3ddaa2..87b156f4a85a0111a46d36c6cb98a722d45557df 100644 --- a/media/java/android/media/RemoteControlClient.java +++ b/media/java/android/media/RemoteControlClient.java @@ -349,6 +349,16 @@ import java.lang.IllegalArgumentException; */ public RemoteControlClient(PendingIntent mediaButtonIntent) { mRcMediaIntent = mediaButtonIntent; + + Looper looper; + if ((looper = Looper.myLooper()) != null) { + mEventHandler = new EventHandler(this, looper); + } else if ((looper = Looper.getMainLooper()) != null) { + mEventHandler = new EventHandler(this, looper); + } else { + mEventHandler = null; + Log.e(TAG, "RemoteControlClient() couldn't find main application thread"); + } } /** @@ -368,6 +378,8 @@ import java.lang.IllegalArgumentException; */ public RemoteControlClient(PendingIntent mediaButtonIntent, Looper looper) { mRcMediaIntent = mediaButtonIntent; + + mEventHandler = new EventHandler(this, looper); } /** @@ -695,6 +707,79 @@ import java.lang.IllegalArgumentException; } } + /** + * @hide + */ + public void playItemResponse(boolean success) { + Log.e(TAG, "playItemResponse"); + playItemResponseInt(success); + } + + private void playItemResponseInt(boolean success) { + Log.d(TAG, "playItemResponseInt"); + Log.v(TAG, "success: " + success); + + // USE_SESSIONS + if (mSession != null) { + mSession.playItemResponse(success); + } + } + + /** + * @hide + */ + public void updateNowPlayingEntries(long[] playList) { + Log.e(TAG, "updateNowPlayingEntries: Item numbers: " + playList.length); + updateNowPlayingEntriesInt(playList); + } + + private void updateNowPlayingEntriesInt(long[] playList) { + Log.d(TAG, "updateNowPlayingEntriesInt"); + + // USE_SESSIONS + if (mSession != null) { + mSession.updateNowPlayingEntries(playList); + } + } + + /** + * @hide + */ + public void updateFolderInfoBrowsedPlayer(String stringUri) { + Log.e(TAG, "updateFolderInfoBrowsedPlayer"); + synchronized(mCacheLock) { + updateFolderInfoBrowsedPlayerInt(stringUri); + } + } + + private void updateFolderInfoBrowsedPlayerInt(String stringUri) { + Log.d(TAG, "updateFolderInfoBrowsedPlayerInt"); + + // USE_SESSIONS + if (mSession != null) { + mSession.updateFolderInfoBrowsedPlayer(stringUri); + } + } + + /** + * @hide + */ + public void updateNowPlayingContentChange() { + Log.e(TAG, "updateNowPlayingContentChange"); + synchronized(mCacheLock) { + updateNowPlayingContentChangeInt(); + } + } + + private void updateNowPlayingContentChangeInt() { + Log.d(TAG, "updateNowPlayingContentChangeInt"); + + // USE_SESSIONS + if (mSession != null) { + mSession.updateNowPlayingContentChange(); + } + } + /** * Sets the flags for the media transport control buttons that this client supports. * @param transportControlFlags A combination of the following flags: @@ -753,6 +838,56 @@ import java.lang.IllegalArgumentException; } } + /** + * @hide + */ + public interface OnGetNowPlayingEntriesListener { + public abstract void onGetNowPlayingEntries(); + } + + /** + * @hide + */ + public void setNowPlayingEntriesUpdateListener(OnGetNowPlayingEntriesListener l) { + Log.d(TAG, "setNowPlayingEntriesUpdateListener"); + synchronized(mCacheLock) { + mGetNowPlayingEntriesListener = l; + } + } + + /** + * @hide + */ + public interface OnSetBrowsedPlayerListener { + public abstract void onSetBrowsedPlayer(); + } + + /** + * @hide + */ + public void setBrowsedPlayerUpdateListener(OnSetBrowsedPlayerListener l) { + Log.d(TAG, "setBrowsedPlayerUpdateListener"); + synchronized(mCacheLock) { + mSetBrowsedPlayerListener = l; + } + } + + /** + * @hide + */ + public interface OnSetPlayItemListener { + public abstract void onSetPlayItem(int scope, long uid); + } + + /** + * @hide + */ + public void setPlayItemListener(OnSetPlayItemListener l) { + Log.d(TAG, "setPlayItemListener"); + synchronized(mCacheLock) { + mSetPlayItemListener = l; + } + } /** * Interface definition for a callback to be invoked when the media playback position is @@ -893,6 +1028,13 @@ import java.lang.IllegalArgumentException; /** * The current remote control client generation ID across the system, as known by this object */ + + private OnSetBrowsedPlayerListener mSetBrowsedPlayerListener; + + private OnSetPlayItemListener mSetPlayItemListener; + + private OnGetNowPlayingEntriesListener mGetNowPlayingEntriesListener; + private int mCurrentClientGenId = -1; /** @@ -946,8 +1088,67 @@ import java.lang.IllegalArgumentException; onUpdateMetadata(mCurrentClientGenId, MetadataEditor.RATING_KEY_BY_USER, rating); } } + + @Override + public void setPlayItem(int scope, long uid) { + // only post messages, we can't block here + if (mEventHandler != null) { + mEventHandler.removeMessages(MSG_SET_PLAY_ITEM); + mEventHandler.sendMessage(mEventHandler.obtainMessage( + MSG_SET_PLAY_ITEM, 0 /* arg1 */, scope /* arg2, ignored */, + new Long(uid))); + } + } + + @Override + public void getNowPlayingEntries() { + // only post messages, we can't block here + if (mEventHandler != null) { + mEventHandler.removeMessages(MSG_GET_NOW_PLAYING_ENTRIES); + mEventHandler.sendMessage(mEventHandler.obtainMessage( + MSG_GET_NOW_PLAYING_ENTRIES, 0, 0, null)); + } + } + + @Override + public void setBrowsedPlayer() { + Log.d(TAG, "setBrowsedPlayer in RemoteControlClient"); + if (mEventHandler != null) { + mEventHandler.sendMessage(mEventHandler.obtainMessage( + MSG_SET_BROWSED_PLAYER, 0 /* arg1 */, 0 /* arg2*/, null)); + } + } }; + private EventHandler mEventHandler; + private final static int MSG_SET_BROWSED_PLAYER = 12; + private final static int MSG_SET_PLAY_ITEM = 13; + private final static int MSG_GET_NOW_PLAYING_ENTRIES = 14; + + private class EventHandler extends Handler { + public EventHandler(RemoteControlClient rcc, Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + case MSG_SET_BROWSED_PLAYER: + Log.d(TAG, "MSG_SET_BROWSED_PLAYER in RemoteControlClient"); + onSetBrowsedPlayer(); + break; + case MSG_SET_PLAY_ITEM: + onSetPlayItem(msg.arg2, ((Long)msg.obj).longValue()); + break; + case MSG_GET_NOW_PLAYING_ENTRIES: + onGetNowPlayingEntries(); + break; + default: + Log.e(TAG, "Unknown event " + msg.what + " in RemoteControlClient handler"); + } + } + } + //=========================================================== // Message handlers @@ -967,6 +1168,36 @@ import java.lang.IllegalArgumentException; } } + private void onSetPlayItem(int scope, long uid) { + Log.d(TAG, "onSetPlayItem"); + synchronized (mCacheLock) { + if (mSetPlayItemListener != null) { + Log.d(TAG, "mSetPlayItemListener.onSetPlayItem"); + mSetPlayItemListener.onSetPlayItem(scope, uid); + } + } + } + + private void onSetBrowsedPlayer() { + Log.d(TAG, "onSetBrowsedPlayer"); + synchronized (mCacheLock) { + if (mSetBrowsedPlayerListener != null) { + Log.d(TAG, "mSetBrowsedPlayerListener.onSetBrowsedPlayer"); + mSetBrowsedPlayerListener.onSetBrowsedPlayer(); + } + } + } + + private void onGetNowPlayingEntries() { + Log.d(TAG, "onGetNowPlayingEntries"); + synchronized (mCacheLock) { + if (mGetNowPlayingEntriesListener != null) { + Log.d(TAG, "mGetNowPlayingEntriesListener.onGetNowPlayingEntries"); + mGetNowPlayingEntriesListener.onGetNowPlayingEntries(); + } + } + } + //=========================================================== // Internal utilities diff --git a/media/java/android/media/RemoteController.java b/media/java/android/media/RemoteController.java index 90f2163f1210bb8da0967460c5da9203a71c4daa..9f2d545dc96923b16087b51aa75804a22a2ba0d9 100644 --- a/media/java/android/media/RemoteController.java +++ b/media/java/android/media/RemoteController.java @@ -69,11 +69,13 @@ import java.util.List; private MediaSessionManager.OnActiveSessionsChangedListener mSessionListener; private MediaController.Callback mSessionCb = new MediaControllerCallback(); + private final AudioManager mAudioManager; /** * Synchronized on mInfoLock */ private boolean mIsRegistered = false; private OnClientUpdateListener mOnClientUpdateListener; + private OnClientAvrcpUpdateListener mOnClientAvrcpUpdateListener; private PlaybackInfo mLastPlaybackInfo; private int mArtworkWidth = -1; private int mArtworkHeight = -1; @@ -124,6 +126,7 @@ import java.util.List; mContext = context; mSessionManager = (MediaSessionManager) context .getSystemService(Context.MEDIA_SESSION_SERVICE); + mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); mSessionListener = new TopTransportSessionListener(); if (ActivityManager.isLowRamDeviceStatic()) { @@ -134,6 +137,25 @@ import java.util.List; } } + /** + * @hide + */ + public RemoteController(Context context, OnClientUpdateListener updateListener, Looper looper, + OnClientAvrcpUpdateListener avrcpUpdateListener) throws IllegalArgumentException { + this(context, updateListener, looper); + mOnClientAvrcpUpdateListener = avrcpUpdateListener; + } + + /** + * @hide + */ + public interface OnClientAvrcpUpdateListener { + public void onClientFolderInfoBrowsedPlayer(String stringUri); + public void onClientUpdateNowPlayingEntries(long[] playList); + public void onClientNowPlayingContentChange(); + public void onClientPlayItemResponse(boolean success); + }; + /** * Interface definition for the callbacks to be invoked whenever media events, metadata @@ -268,6 +290,7 @@ import java.util.List; * @throws IllegalArgumentException */ public boolean seekTo(long timeMs) throws IllegalArgumentException { + Log.e(TAG, "seekTo() in RemoteController"); if (!mEnabled) { Log.e(TAG, "Cannot use seekTo() from a disabled RemoteController"); return false; @@ -283,6 +306,69 @@ import java.util.List; return true; } + /** + * @hide + * Request the user of a RemoteControlClient to play the requested item. + * @param generationId the RemoteControlClient generation counter for which this request is + * issued. + * @param uid uid of the song to be played. + * @scope scope of the file system to use + */ + public void setRemoteControlClientPlayItem(long uid, int scope) { + Log.e(TAG, "setRemoteControlClientPlayItem()"); + if (!mEnabled) { + Log.e(TAG, "Cannot use setRemoteControlClientPlayItem()" + + " from a disabled RemoteController"); + return; + } + synchronized (mInfoLock) { + if (mCurrentSession != null) { + mCurrentSession.getTransportControls().setRemoteControlClientPlayItem(uid, scope); + } + } + return; + } + + /** + * @hide + * Request the user of a RemoteControlClient to provide with the now playing list entries. + * @param generationId the RemoteControlClient generation counter for which this request is + * issued. + */ + public void getRemoteControlClientNowPlayingEntries() { + Log.e(TAG, "getRemoteControlClientNowPlayingEntries()"); + if (!mEnabled) { + Log.e(TAG, "Cannot use getRemoteControlClientNowPlayingEntries()" + + " from a disabled RemoteController"); + return; + } + synchronized (mInfoLock) { + if (mCurrentSession != null) { + mCurrentSession.getTransportControls().getRemoteControlClientNowPlayingEntries(); + } + } + return; + } + + /** + * @hide + * Request the user of a RemoteControlClient to set the music player as current browsed player. + * @param packageName package name of the targeted media player. + */ + public void setRemoteControlClientBrowsedPlayer() { + Log.e(TAG, "setRemoteControlClientBrowsedPlayer()"); + if (!mEnabled) { + Log.e(TAG, "Cannot use setRemoteControlClientBrowsedPlayer()" + + " from a disabled RemoteController"); + return; + } + synchronized (mInfoLock) { + if (mCurrentSession != null) { + mCurrentSession.getTransportControls().setRemoteControlClientBrowsedPlayer(); + } + } + return; + } /** * @hide @@ -468,6 +554,30 @@ import java.util.List; public void onMetadataChanged(MediaMetadata metadata) { onNewMediaMetadata(metadata); } + + @Override + public void onUpdateFolderInfoBrowsedPlayer(String stringUri) { + Log.d(TAG, "MediaControllerCallback: onUpdateFolderInfoBrowsedPlayer"); + onFolderInfoBrowsedPlayer(stringUri); + } + + @Override + public void onUpdateNowPlayingEntries(long[] playList) { + Log.d(TAG, "MediaControllerCallback: onUpdateNowPlayingEntries"); + onNowPlayingEntriesUpdate(playList); + } + + @Override + public void onUpdateNowPlayingContentChange() { + Log.d(TAG, "MediaControllerCallback: onUpdateNowPlayingContentChange"); + onNowPlayingContentChange(); + } + + @Override + public void onPlayItemResponse(boolean success) { + Log.d(TAG, "MediaControllerCallback: onPlayItemResponse"); + onSetPlayItemResponse(success); + } } /** @@ -597,6 +707,8 @@ import java.util.List; synchronized (mInfoLock) { if (controller == null) { if (mCurrentSession != null) { + Log.v(TAG, "Updating current controller as null"); + mAudioManager.updateMediaPlayerList(mCurrentSession.getPackageName(), false); mCurrentSession.unregisterCallback(mSessionCb); mCurrentSession = null; sendMsg(mEventHandler, MSG_CLIENT_CHANGE, SENDMSG_REPLACE, @@ -606,13 +718,21 @@ import java.util.List; || !controller.getSessionToken() .equals(mCurrentSession.getSessionToken())) { if (mCurrentSession != null) { + Log.v(TAG, "Updating current controller package as " + + controller.getPackageName() + " from " + mCurrentSession.getPackageName()); mCurrentSession.unregisterCallback(mSessionCb); + } else { + Log.v(TAG, "Updating current controller package as " + + controller.getPackageName() + " from null"); } + sendMsg(mEventHandler, MSG_CLIENT_CHANGE, SENDMSG_REPLACE, 0 /* arg1 ignored */, 0 /* clearing */, null /* obj */, 0 /* delay */); mCurrentSession = controller; mCurrentSession.registerCallback(mSessionCb, mEventHandler); + mAudioManager.updateMediaPlayerList(mCurrentSession.getPackageName(), true); + PlaybackState state = controller.getPlaybackState(); sendMsg(mEventHandler, MSG_NEW_PLAYBACK_STATE, SENDMSG_REPLACE, 0 /* arg1 ignored */, 0 /* arg2 ignored */, state /* obj */, 0 /* delay */); @@ -669,6 +789,74 @@ import java.util.List; } } + private void onFolderInfoBrowsedPlayer(String stringUri) { + Log.d(TAG, "RemoteController: onFolderInfoBrowsedPlayer"); + final OnClientAvrcpUpdateListener l; + + synchronized(mInfoLock) { + l = mOnClientAvrcpUpdateListener; + } + + try { + if (l != null) { + l.onClientFolderInfoBrowsedPlayer(stringUri); + } + } catch (Exception e) { + Log.e(TAG, "Error Updating AVRCP on receiving Browsed player response", e); + } + } + + private void onNowPlayingEntriesUpdate(long[] playList) { + Log.d(TAG, "RemoteController: onUpdateNowPlayingEntries"); + final OnClientAvrcpUpdateListener l; + + synchronized(mInfoLock) { + l = mOnClientAvrcpUpdateListener; + } + + try { + if (l != null) { + l.onClientUpdateNowPlayingEntries(playList); + } + } catch (Exception e) { + Log.e(TAG, "Error Updating AVRCP on receiving Now Playing Entries", e); + } + } + + private void onNowPlayingContentChange() { + Log.d(TAG, "RemoteController: onNowPlayingContentChange"); + final OnClientAvrcpUpdateListener l; + + synchronized(mInfoLock) { + l = mOnClientAvrcpUpdateListener; + } + + try { + if (l != null) { + l.onClientNowPlayingContentChange(); + } + } catch (Exception e) { + Log.e(TAG, "Error Updating AVRCP on Now Playing Content Change", e); + } + } + + private void onSetPlayItemResponse(boolean success) { + Log.d(TAG, "RemoteController: onPlayItemResponse"); + final OnClientAvrcpUpdateListener l; + + synchronized(mInfoLock) { + l = mOnClientAvrcpUpdateListener; + } + + try { + if (l != null) { + l.onClientPlayItemResponse(success); + } + } catch (Exception e) { + Log.e(TAG, "Error Updating AVRCP on receiving Play Item response", e); + } + } + //================================================== private static class PlaybackInfo { int mState; diff --git a/media/java/android/media/ToneGenerator.java b/media/java/android/media/ToneGenerator.java index 4661226cdb5c2355b9a555360044b506aae2a35b..f2b2345335672db9e87b7ed4e79581f526c543e8 100644 --- a/media/java/android/media/ToneGenerator.java +++ b/media/java/android/media/ToneGenerator.java @@ -729,6 +729,13 @@ public class ToneGenerator */ public static final int TONE_CDMA_SIGNAL_OFF = 98; + /** + * HOLD_RECALL - 440Hz + * + * @hide #ToneGenerator(int, int) + */ + public static final int TONE_HOLD_RECALL = 99; + /** Maximum volume, for use with {@link #ToneGenerator(int,int)} */ public static final int MAX_VOLUME = 100; /** Minimum volume setting, for use with {@link #ToneGenerator(int,int)} */ diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index 3affee5c0aa797375f226a3e0f9e2bf33d08d8cc..477c778a0575d342ff1b06b37e3438ec161140de 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -45,6 +45,10 @@ interface ISession { void setQueueTitle(CharSequence title); void setExtras(in Bundle extras); void setRatingType(int type); + void playItemResponse(boolean success); + void updateNowPlayingEntries(in long[] playList); + void updateFolderInfoBrowsedPlayer(String stringUri); + void updateNowPlayingContentChange(); // These commands relate to volume handling void setPlaybackToLocal(in AudioAttributes attributes); diff --git a/media/java/android/media/session/ISessionCallback.aidl b/media/java/android/media/session/ISessionCallback.aidl index 893bd3c8cbb137482deef1e6bef93cc94ef9bd23..fabd71fea5d5ede8a35acef3ac8ad3b271b6a503 100644 --- a/media/java/android/media/session/ISessionCallback.aidl +++ b/media/java/android/media/session/ISessionCallback.aidl @@ -45,6 +45,9 @@ oneway interface ISessionCallback { void onFastForward(); void onRewind(); void onSeekTo(long pos); + void setRemoteControlClientBrowsedPlayer(); + void setRemoteControlClientPlayItem(long uid, int scope); + void getRemoteControlClientNowPlayingEntries(); void onRate(in Rating rating); void onCustomAction(String action, in Bundle args); diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index 249bcdc802cea9494e0ce4d74dce569602965f64..3d7c413c3b9964ad1f75aedd81d9937f7522c1cf 100644 --- a/media/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl @@ -66,6 +66,9 @@ interface ISessionController { void fastForward(); void rewind(); void seekTo(long pos); + void setRemoteControlClientBrowsedPlayer(); + void setRemoteControlClientPlayItem(long uid, int scope); + void getRemoteControlClientNowPlayingEntries(); void rate(in Rating rating); void sendCustomAction(String action, in Bundle args); MediaMetadata getMetadata(); diff --git a/media/java/android/media/session/ISessionControllerCallback.aidl b/media/java/android/media/session/ISessionControllerCallback.aidl index cf3176706d7ed364afab1be149b02215a90b57c7..a5ad9132bc3b74ad6f7f97950830da26033826a5 100644 --- a/media/java/android/media/session/ISessionControllerCallback.aidl +++ b/media/java/android/media/session/ISessionControllerCallback.aidl @@ -36,4 +36,8 @@ oneway interface ISessionControllerCallback { void onQueueTitleChanged(CharSequence title); void onExtrasChanged(in Bundle extras); void onVolumeInfoChanged(in ParcelableVolumeInfo info); + void onPlayItemResponse(boolean success); + void onUpdateNowPlayingEntries(in long[] playList); + void onUpdateFolderInfoBrowsedPlayer(String stringUri); + void onUpdateNowPlayingContentChange(); } diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index 622900f5c7f94363963f93d07e54b2e066300caa..670ff794344e0715200b8e9f112151b274628a38 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -64,6 +64,10 @@ public final class MediaController { private static final int MSG_UPDATE_QUEUE_TITLE = 6; private static final int MSG_UPDATE_EXTRAS = 7; private static final int MSG_DESTROYED = 8; + private static final int MSG_FOLDER_INFO_BROWSED_PLAYER = 9; + private static final int MSG_UPDATE_NOWPLAYING_ENTRIES = 10; + private static final int MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE = 11; + private static final int MSG_PLAY_ITEM_RESPONSE = 12; private final ISessionController mSessionBinder; @@ -579,6 +583,31 @@ public final class MediaController { */ public void onAudioInfoChanged(PlaybackInfo info) { } + + /** + * @hide + */ + public void onUpdateFolderInfoBrowsedPlayer(String stringUri) { + } + + /** + * @hide + */ + public void onUpdateNowPlayingEntries(long[] playList) { + } + + /** + * @hide + */ + public void onUpdateNowPlayingContentChange() { + } + + /** + * @hide + */ + public void onPlayItemResponse(boolean success) { + } + } /** @@ -793,6 +822,7 @@ public final class MediaController { * @param pos Position to move to, in milliseconds. */ public void seekTo(long pos) { + Log.d(TAG, "seekTo in TransportControls"); try { mSessionBinder.seekTo(pos); } catch (RemoteException e) { @@ -800,6 +830,42 @@ public final class MediaController { } } + /** + * @hide + */ + public void setRemoteControlClientBrowsedPlayer() { + Log.d(TAG, "setRemoteControlClientBrowsedPlayer in TransportControls"); + try { + mSessionBinder.setRemoteControlClientBrowsedPlayer(); + } catch (RemoteException e) { + Log.wtf(TAG, "Error calling setRemoteControlClientBrowsedPlayer.", e); + } + } + + /** + * @hide + */ + public void setRemoteControlClientPlayItem(long uid, int scope) { + Log.d(TAG, "setRemoteControlClientPlayItem in TransportControls"); + try { + mSessionBinder.setRemoteControlClientPlayItem(uid, scope); + } catch (RemoteException e) { + Log.wtf(TAG, "Error calling setRemoteControlClientPlayItem.", e); + } + } + + /** + * @hide + */ + public void getRemoteControlClientNowPlayingEntries() { + Log.d(TAG, "getRemoteControlClientNowPlayingEntries in TransportControls"); + try { + mSessionBinder.getRemoteControlClientNowPlayingEntries(); + } catch (RemoteException e) { + Log.wtf(TAG, "Error calling getRemoteControlClientNowPlayingEntries.", e); + } + } + /** * Start fast forwarding. If playback is already fast forwarding this * may increase the rate. @@ -1062,6 +1128,42 @@ public final class MediaController { } } + @Override + public void onUpdateFolderInfoBrowsedPlayer(String stringUri) { + Log.d(TAG, "CallBackStub: onUpdateFolderInfoBrowsedPlayer"); + MediaController controller = mController.get(); + if (controller != null) { + controller.postMessage(MSG_FOLDER_INFO_BROWSED_PLAYER, stringUri, null); + } + } + + @Override + public void onUpdateNowPlayingEntries(long[] playList) { + Log.d(TAG, "CallBackStub: onUpdateNowPlayingEntries"); + MediaController controller = mController.get(); + if (controller != null) { + controller.postMessage(MSG_UPDATE_NOWPLAYING_ENTRIES, playList, null); + } + } + + @Override + public void onUpdateNowPlayingContentChange() { + Log.d(TAG, "CallBackStub: onUpdateNowPlayingContentChange"); + MediaController controller = mController.get(); + if (controller != null) { + controller.postMessage(MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE, null, null); + } + } + + @Override + public void onPlayItemResponse(boolean success) { + Log.d(TAG, "CallBackStub: onPlayItemResponse"); + MediaController controller = mController.get(); + if (controller != null) { + controller.postMessage(MSG_PLAY_ITEM_RESPONSE, new Boolean(success), null); + } + } + } private final static class MessageHandler extends Handler { @@ -1103,6 +1205,18 @@ public final class MediaController { case MSG_DESTROYED: mCallback.onSessionDestroyed(); break; + case MSG_FOLDER_INFO_BROWSED_PLAYER: + mCallback.onUpdateFolderInfoBrowsedPlayer((String) msg.obj); + break; + case MSG_UPDATE_NOWPLAYING_ENTRIES: + mCallback.onUpdateNowPlayingEntries((long[]) msg.obj); + break; + case MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE: + mCallback.onUpdateNowPlayingContentChange(); + break; + case MSG_PLAY_ITEM_RESPONSE: + mCallback.onPlayItemResponse(((Boolean)(msg.obj)).booleanValue()); + break; } } diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index 7f9653d336dffe23bd2b8891bcd458aa292b4e00..59b2f6ff86a6b2412e67d973065624dfa9720c6e 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -492,6 +492,58 @@ public final class MediaSession { } } + /** + * @hide + */ + public void playItemResponse(boolean success) { + Log.d(TAG, "MediaSession: playItemResponse"); + + try { + mBinder.playItemResponse(success); + } catch (RemoteException e) { + Log.wtf(TAG, "Dead object in playItemResponse.", e); + } + } + + /** + * @hide + */ + public void updateNowPlayingEntries(long[] playList) { + Log.d(TAG, "MediaSession: updateNowPlayingEntries"); + + try { + mBinder.updateNowPlayingEntries(playList); + } catch (RemoteException e) { + Log.wtf(TAG, "Dead object in updateNowPlayingEntries.", e); + } + } + + /** + * @hide + */ + public void updateFolderInfoBrowsedPlayer(String stringUri) { + Log.d(TAG, "MediaSession: updateFolderInfoBrowsedPlayer"); + + try { + mBinder.updateFolderInfoBrowsedPlayer(stringUri); + } catch (RemoteException e) { + Log.wtf(TAG, "Dead object in updateFolderInfoBrowsedPlayer.", e); + } + } + + /** + * @hide + */ + public void updateNowPlayingContentChange() { + Log.d(TAG, "MediaSession: updateNowPlayingContentChange"); + + try { + mBinder.updateNowPlayingContentChange(); + } catch (RemoteException e) { + Log.wtf(TAG, "Dead object in updateNowPlayingContentChange.", e); + } + } + /** * Notify the system that the remote volume changed. * @@ -604,6 +656,34 @@ public final class MediaSession { postToCallback(CallbackMessageHandler.MSG_MEDIA_BUTTON, mediaButtonIntent); } + private void dispatchSetBrowsedPlayerCommand() { + postToCallback(CallbackMessageHandler.MSG_SET_BROWSED_PLAYER); + } + + private void dispatchSetPlayItemCommand(long uid, int scope) { + PlayItemToken playItemToken = new PlayItemToken(uid, scope); + postToCallback(CallbackMessageHandler.MSG_SET_PLAY_ITEM, playItemToken); + } + + private class PlayItemToken { + private long mUid; + private int mScope; + public PlayItemToken(long uid, int scope) { + mUid = uid; + mScope = scope; + } + public int getScope() { + return mScope; + } + public long getUid() { + return mUid; + } + } + + private void dispatchGetNowPlayingItemsCommand() { + postToCallback(CallbackMessageHandler.MSG_GET_NOW_PLAYING_ITEMS); + } + private void dispatchAdjustVolume(int direction) { postToCallback(CallbackMessageHandler.MSG_ADJUST_VOLUME, direction); } @@ -971,6 +1051,25 @@ public final class MediaSession { */ public void onCustomAction(@NonNull String action, @Nullable Bundle extras) { } + + /** + * @hide + */ + public void setBrowsedPlayer() { + } + + /** + * @hide + */ + public void setPlayItem(int scope, long uid) { + } + + /** + * @hide + */ + public void getNowPlayingEntries() { + } + } /** @@ -1142,6 +1241,33 @@ public final class MediaSession { } } + @Override + public void setRemoteControlClientBrowsedPlayer() throws RemoteException { + Log.d(TAG, "setRemoteControlClientBrowsedPlayer in CallbackStub"); + MediaSession session = mMediaSession.get(); + if (session != null) { + session.dispatchSetBrowsedPlayerCommand(); + } + } + + @Override + public void setRemoteControlClientPlayItem(long uid, int scope) throws RemoteException { + Log.d(TAG, "setRemoteControlClientPlayItem in CallbackStub"); + MediaSession session = mMediaSession.get(); + if (session != null) { + session.dispatchSetPlayItemCommand(uid, scope); + } + } + + @Override + public void getRemoteControlClientNowPlayingEntries() throws RemoteException { + Log.d(TAG, "getRemoteControlClientNowPlayingEntries in CallbackStub"); + MediaSession session = mMediaSession.get(); + if (session != null) { + session.dispatchGetNowPlayingItemsCommand(); + } + } + @Override public void onCustomAction(String action, Bundle args) { MediaSession session = mMediaSession.get(); @@ -1286,6 +1412,9 @@ public final class MediaSession { private static final int MSG_CUSTOM_ACTION = 20; private static final int MSG_ADJUST_VOLUME = 21; private static final int MSG_SET_VOLUME = 22; + private static final int MSG_SET_BROWSED_PLAYER = 23; + private static final int MSG_SET_PLAY_ITEM = 24; + private static final int MSG_GET_NOW_PLAYING_ITEMS = 25; private MediaSession.Callback mCallback; @@ -1392,6 +1521,18 @@ public final class MediaSession { if (vp != null) { vp.onSetVolumeTo((int) msg.obj); } + case MSG_SET_BROWSED_PLAYER: + Log.d(TAG, "MSG_SET_BROWSED_PLAYER received in CallbackMessageHandler"); + mCallback.setBrowsedPlayer(); + break; + case MSG_SET_PLAY_ITEM: + Log.d(TAG, "MSG_SET_PLAY_ITEM received in CallbackMessageHandler"); + PlayItemToken playItemToken = (PlayItemToken) msg.obj; + mCallback.setPlayItem(playItemToken.getScope(), playItemToken.getUid()); + break; + case MSG_GET_NOW_PLAYING_ITEMS: + Log.d(TAG, "MSG_GET_NOW_PLAYING_ITEMS received in CallbackMessageHandler"); + mCallback.getNowPlayingEntries(); break; } } diff --git a/media/java/android/media/session/MediaSessionLegacyHelper.java b/media/java/android/media/session/MediaSessionLegacyHelper.java index 95cb8aee6ac5c958c863af25bd42b92a92a7a2e4..d1e9454c04592498d5fddf31cda0e8a1ffff8564 100644 --- a/media/java/android/media/session/MediaSessionLegacyHelper.java +++ b/media/java/android/media/session/MediaSessionLegacyHelper.java @@ -549,6 +549,27 @@ public class MediaSessionLegacyHelper { mRccListener.onSetRating(rating); } } + + @Override + public void setBrowsedPlayer() { + if (mRccListener != null) { + mRccListener.setBrowsedPlayer(); + } + } + + @Override + public void setPlayItem(int scope, long uid) { + if (mRccListener != null) { + mRccListener.setPlayItem(scope, uid); + } + } + + @Override + public void getNowPlayingEntries() { + if (mRccListener != null) { + mRccListener.getNowPlayingEntries(); + } + } } } } diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 2fb1a3b9fbcf875bdf76bea1d34a81481038e0cf..5bc45ffb4b4b46aa7736b9dffbb2ff225b810052 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include "android_util_Binder.h" // ---------------------------------------------------------------------------- @@ -137,6 +138,153 @@ void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *o } } + +static const char *EXTMEDIAJNI_LIB_NAME = "libextmedia_jni.so"; +static const char *kCreateJNIExtMediaPlayerListener = "CreateJNIExtMediaPlayerListener"; +static const char *kCheckExtMedia = "checkExtMedia"; +static const char *kCreateNativeQCMediaPlayer = "CreateNativeQCMediaPlayer"; +typedef MediaPlayerListener* (*CreateJNIExtMediaPlayerListenerFn)(JNIEnv *, jobject, jobject, sp listener); +typedef bool (*CheckExtMediaFn)(JNIEnv *env, jobject); +typedef MediaPlayer* (*CreateNativeQCMediaPlayerFn)(); + + + +class JNIMediaPlayerFactory { + public: + JNIMediaPlayerFactory() {}; + static bool CheckAndCreateExtMediaPlayer(JNIEnv *env, jobject thiz, jobject weak_this, sp &listener, sp &mp); + private: + static void *mLibHandle; + static void loadLib(); + + static CreateJNIExtMediaPlayerListenerFn loadJNIExtMediaPlayerListener(); + static CreateJNIExtMediaPlayerListenerFn sExtDashListnerFnPtr; + + static CheckExtMediaFn sExtMediaFn; + static CheckExtMediaFn loadExtMedia(); + + static CreateNativeQCMediaPlayerFn sNativeQCMediaPlayerFn; + static CreateNativeQCMediaPlayerFn loadNativeQCMediaPlayer(); + + static sp createExtMediaPlayerListener(JNIEnv *env, jobject thiz, jobject weak_this, sp listener); + static bool checkExtMedia(JNIEnv *env, jobject thiz); + static void CreateNativeQCMediaPlayer(sp &mp); +}; + +void *JNIMediaPlayerFactory::mLibHandle = NULL; + +CreateJNIExtMediaPlayerListenerFn JNIMediaPlayerFactory::sExtDashListnerFnPtr = + JNIMediaPlayerFactory::loadJNIExtMediaPlayerListener(); + +CheckExtMediaFn JNIMediaPlayerFactory::sExtMediaFn = + JNIMediaPlayerFactory::loadExtMedia(); + +CreateNativeQCMediaPlayerFn JNIMediaPlayerFactory::sNativeQCMediaPlayerFn = + JNIMediaPlayerFactory::loadNativeQCMediaPlayer(); + + +void JNIMediaPlayerFactory::loadLib() +{ + if (!mLibHandle) { + mLibHandle = ::dlopen(EXTMEDIAJNI_LIB_NAME, RTLD_LAZY); + if (!mLibHandle) { + ALOGV("%s", dlerror()); + return; + } + ALOGV("Opened %s", EXTMEDIAJNI_LIB_NAME); + } +} + +CreateJNIExtMediaPlayerListenerFn JNIMediaPlayerFactory::loadJNIExtMediaPlayerListener() +{ + loadLib(); + CreateJNIExtMediaPlayerListenerFn pCreateExtDashListnerFnPtr = NULL; + if (mLibHandle != NULL) { + pCreateExtDashListnerFnPtr = (CreateJNIExtMediaPlayerListenerFn) + dlsym(mLibHandle, kCreateJNIExtMediaPlayerListener); + if (pCreateExtDashListnerFnPtr == NULL) { + ALOGW("Failed to load symbol %s : %s", kCreateJNIExtMediaPlayerListener, dlerror()); + } + } + return pCreateExtDashListnerFnPtr; +} + +CheckExtMediaFn JNIMediaPlayerFactory::loadExtMedia() +{ + loadLib(); + CheckExtMediaFn pCheckExtMediaFnPtr = NULL; + if (mLibHandle != NULL) { + pCheckExtMediaFnPtr = (CheckExtMediaFn)dlsym(mLibHandle, kCheckExtMedia); + if (pCheckExtMediaFnPtr == NULL) { + ALOGW("Failed to load symbol %s : %s", kCheckExtMedia, dlerror()); + } + } + return pCheckExtMediaFnPtr; +} + +CreateNativeQCMediaPlayerFn JNIMediaPlayerFactory::loadNativeQCMediaPlayer() +{ + loadLib(); + CreateNativeQCMediaPlayerFn pCreateNativeQCMediaPlayerFnPtr = NULL; + if (mLibHandle != NULL) { + pCreateNativeQCMediaPlayerFnPtr = (CreateNativeQCMediaPlayerFn) + dlsym(mLibHandle, kCreateNativeQCMediaPlayer); + if (pCreateNativeQCMediaPlayerFnPtr == NULL) { + ALOGW("Failed to load symbol %s : %s", kCreateNativeQCMediaPlayer, dlerror()); + } + } + return pCreateNativeQCMediaPlayerFnPtr; +} + + +sp JNIMediaPlayerFactory::createExtMediaPlayerListener(JNIEnv *env, jobject thiz, jobject weak_this, sp listener) +{ + if (checkExtMedia(env, thiz)) { + if (sExtDashListnerFnPtr ) { + listener = (*sExtDashListnerFnPtr)(env, thiz, weak_this, listener); + if (listener != NULL) { + ALOGE("JNIMediaPlayerFactory: createExtMediaPlayerListener : success"); + } + } + } + return listener; +} + +void JNIMediaPlayerFactory::CreateNativeQCMediaPlayer(sp &mp) +{ + if (sNativeQCMediaPlayerFn) { + mp = (*sNativeQCMediaPlayerFn)(); + if (mp != NULL) { + ALOGE("JNIMediaPlayerFactory: CreateNativeQCMediaPlayer : Success"); + } + } +} + + +bool JNIMediaPlayerFactory::checkExtMedia(JNIEnv *env, jobject thiz) +{ + bool bIsQCMediaPlayerPresent = false; + if (sExtMediaFn) { + bIsQCMediaPlayerPresent = (*sExtMediaFn)(env, thiz); + } + ALOGE("JNIMediaPlayerFactory: bIsQCMediaPlayerPresent %d", bIsQCMediaPlayerPresent); + return bIsQCMediaPlayerPresent; +} + +bool JNIMediaPlayerFactory::CheckAndCreateExtMediaPlayer( + JNIEnv *env, jobject thiz, jobject weak_this, sp &listener, sp &mp) +{ + bool bOk = false; + listener = createExtMediaPlayerListener(env, thiz, weak_this, listener); + if (listener != NULL && checkExtMedia(env,thiz)) { + CreateNativeQCMediaPlayer(mp); + if (mp != NULL) { + bOk = true; + } + } + return bOk; +} + // ---------------------------------------------------------------------------- static sp getMediaPlayer(JNIEnv* env, jobject thiz) @@ -868,14 +1016,26 @@ static void android_media_MediaPlayer_native_setup(JNIEnv *env, jobject thiz, jobject weak_this) { ALOGV("native_setup"); - sp mp = new MediaPlayer(); + + sp mp = NULL; + + bool bOk = false; + JNIMediaPlayerFactory *jniMediaPlayerFactory = new JNIMediaPlayerFactory(); + + sp listener = new JNIMediaPlayerListener(env, thiz, weak_this); + + if (jniMediaPlayerFactory) { + bOk = jniMediaPlayerFactory->CheckAndCreateExtMediaPlayer(env, thiz, weak_this, listener, mp); + delete(jniMediaPlayerFactory); + } + + if (!bOk){ + mp = new MediaPlayer(); + } if (mp == NULL) { jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } - - // create new listener and give it to MediaPlayer - sp listener = new JNIMediaPlayerListener(env, thiz, weak_this); mp->setListener(listener); // Stow our new C++ MediaPlayer in an opaque field in the Java object. diff --git a/obex/javax/obex/ApplicationParameter.java b/obex/javax/obex/ApplicationParameter.java index a62210fe4d16360385eaf82359122640d7d775d8..16770a1aef31fdfc87af83bcb734a97157c5935d 100644 --- a/obex/javax/obex/ApplicationParameter.java +++ b/obex/javax/obex/ApplicationParameter.java @@ -55,7 +55,7 @@ public final class ApplicationParameter { public static final byte LISTSTARTOFFSET_TAGID = 0x05; - public static final byte FILTER_TAGID = 0x06; + public static final byte PROPERTY_SELECTOR_TAGID = 0x06; public static final byte FORMAT_TAGID = 0x07; @@ -64,6 +64,20 @@ public final class ApplicationParameter { // only used in "mch" in response public static final byte NEWMISSEDCALLS_TAGID = 0x09; + + public static final byte SUPPORTEDFEATURE_TAGID = 0x10; + + public static final byte PRIMARYVERSIONCOUNTER_TAGID = 0x0A; + + public static final byte SECONDARYVERSIONCOUNTER_TAGID = 0x0B; + + public static final byte VCARDSELECTOR_TAGID = 0x0C; + + public static final byte DATABASEIDENTIFIER_TAGID = 0x0D; + + public static final byte VCARDSELECTOROPERATOR_TAGID = 0x0E; + + public static final byte RESET_NEW_MISSED_CALLS_TAGID = 0x0F; } public static class TRIPLET_VALUE { @@ -99,13 +113,27 @@ public final class ApplicationParameter { public static final byte LISTSTARTOFFSET_LENGTH = 2; - public static final byte FILTER_LENGTH = 8; + public static final byte PROPERTY_SELECTOR_LENGTH = 8; public static final byte FORMAT_LENGTH = 1; public static final byte PHONEBOOKSIZE_LENGTH = 2; public static final byte NEWMISSEDCALLS_LENGTH = 1; + + public static final byte SUPPORTEDFEATURE_LENGTH = 4; + + public static final byte PRIMARYVERSIONCOUNTER_LENGTH = 16; + + public static final byte SECONDARYVERSIONCOUNTER_LENGTH = 16; + + public static final byte VCARDSELECTOR_LENGTH = 8; + + public static final byte DATABASEIDENTIFIER_LENGTH = 16; + + public static final byte VCARDSELECTOROPERATOR_LENGTH = 1; + + public static final byte RESETNEWMISSEDCALLS_LENGTH = 1; } public ApplicationParameter() { diff --git a/obex/javax/obex/ClientOperation.java b/obex/javax/obex/ClientOperation.java old mode 100644 new mode 100755 index 883c8c6ed75d2829060d17fda8f863b8df5f02ce..cf8956f3fe56291aca5d3614b4331de93216bb78 --- a/obex/javax/obex/ClientOperation.java +++ b/obex/javax/obex/ClientOperation.java @@ -52,7 +52,7 @@ public final class ClientOperation implements Operation, BaseStream { private static final String TAG = "ClientOperation"; - private static final boolean V = ObexHelper.VDBG; + private static final boolean V = Log.isLoggable(ObexHelper.LOG_TAG, Log.VERBOSE); private ClientSession mParent; diff --git a/obex/javax/obex/ClientSession.java b/obex/javax/obex/ClientSession.java old mode 100644 new mode 100755 index 272a920754f5ac4c298ad03cc92868eeac4f9538..111ab7fe6c13ecdb89c0ec774ee28023a6edb05b --- a/obex/javax/obex/ClientSession.java +++ b/obex/javax/obex/ClientSession.java @@ -48,6 +48,7 @@ import android.util.Log; public final class ClientSession extends ObexSession { private static final String TAG = "ClientSession"; + private static final boolean V = Log.isLoggable(ObexHelper.LOG_TAG, Log.VERBOSE); private boolean mOpen; diff --git a/obex/javax/obex/ObexHelper.java b/obex/javax/obex/ObexHelper.java old mode 100644 new mode 100755 index fa50943343e92bf58c1354fd97ddd6d0407a85ec..431525edd23c8248a56eff57454b75338cffdbd8 --- a/obex/javax/obex/ObexHelper.java +++ b/obex/javax/obex/ObexHelper.java @@ -52,7 +52,8 @@ import android.util.Log; public final class ObexHelper { private static final String TAG = "ObexHelper"; - public static final boolean VDBG = false; + public static final String LOG_TAG = "BluetoothObex"; + public static final boolean VDBG = Log.isLoggable(LOG_TAG, Log.VERBOSE); /** * Defines the basic packet length used by OBEX. Every OBEX packet has the * same basic format:
@@ -190,6 +191,7 @@ public final class ObexHelper { try { while (index < headerArray.length) { headerID = 0xFF & headerArray[index]; + if (VDBG) Log.v(TAG,"updateHeaderSet headerID = " + headerID); switch (headerID & (0xC0)) { /* @@ -375,8 +377,9 @@ public final class ObexHelper { * Determine if there is a connection ID to send. If there is, * then it should be the first header in the packet. */ + if (VDBG) Log.v(TAG,"createHeader = " + head); if ((headImpl.mConnectionID != null) && (headImpl.getHeader(HeaderSet.TARGET) == null)) { - + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.CONNECTION_ID); out.write((byte)HeaderSet.CONNECTION_ID); out.write(headImpl.mConnectionID); } @@ -384,6 +387,7 @@ public final class ObexHelper { // Count Header intHeader = (Long)headImpl.getHeader(HeaderSet.COUNT); if (intHeader != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.COUNT); out.write((byte)HeaderSet.COUNT); value = ObexHelper.convertToByteArray(intHeader.longValue()); out.write(value); @@ -395,6 +399,7 @@ public final class ObexHelper { // Name Header stringHeader = (String)headImpl.getHeader(HeaderSet.NAME); if (stringHeader != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.NAME); out.write((byte)HeaderSet.NAME); value = ObexHelper.convertToUnicodeByteArray(stringHeader); length = value.length + 3; @@ -415,6 +420,7 @@ public final class ObexHelper { // Type Header stringHeader = (String)headImpl.getHeader(HeaderSet.TYPE); if (stringHeader != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.TYPE); out.write((byte)HeaderSet.TYPE); try { value = stringHeader.getBytes("ISO8859_1"); @@ -436,6 +442,7 @@ public final class ObexHelper { // Length Header intHeader = (Long)headImpl.getHeader(HeaderSet.LENGTH); if (intHeader != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.LENGTH); out.write((byte)HeaderSet.LENGTH); value = ObexHelper.convertToByteArray(intHeader.longValue()); out.write(value); @@ -447,7 +454,7 @@ public final class ObexHelper { // Time ISO Header dateHeader = (Calendar)headImpl.getHeader(HeaderSet.TIME_ISO_8601); if (dateHeader != null) { - + if (VDBG) Log.v(TAG," Add dateHeader = " + HeaderSet.TIME_ISO_8601); /* * The ISO Header should take the form YYYYMMDDTHHMMSSZ. The * 'Z' will only be included if it is a UTC time. @@ -509,6 +516,7 @@ public final class ObexHelper { // Time 4 Byte Header dateHeader = (Calendar)headImpl.getHeader(HeaderSet.TIME_4_BYTE); if (dateHeader != null) { + if (VDBG) Log.v(TAG," Add dateHeader = " + HeaderSet.TIME_4_BYTE); out.write(HeaderSet.TIME_4_BYTE); /* @@ -543,6 +551,7 @@ public final class ObexHelper { // Target Header value = (byte[])headImpl.getHeader(HeaderSet.TARGET); if (value != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.TARGET); out.write((byte)HeaderSet.TARGET); length = value.length + 3; lengthArray[0] = (byte)(255 & (length >> 8)); @@ -571,6 +580,7 @@ public final class ObexHelper { // Who Header value = (byte[])headImpl.getHeader(HeaderSet.WHO); if (value != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.WHO); out.write((byte)HeaderSet.WHO); length = value.length + 3; lengthArray[0] = (byte)(255 & (length >> 8)); @@ -582,9 +592,10 @@ public final class ObexHelper { } } - // Connection ID Header + // Application Parameter Header value = (byte[])headImpl.getHeader(HeaderSet.APPLICATION_PARAMETER); if (value != null) { + if (VDBG) Log.v(TAG," Add APP PARAM Header = " + HeaderSet.APPLICATION_PARAMETER); out.write((byte)HeaderSet.APPLICATION_PARAMETER); length = value.length + 3; lengthArray[0] = (byte)(255 & (length >> 8)); @@ -623,6 +634,7 @@ public final class ObexHelper { lengthArray[1] = (byte)(255 & length); out.write(lengthArray); out.write(value); + if (VDBG) Log.v(TAG," Add Unicode String value = " + value); if (nullOut) { headImpl.setHeader(i + 0x30, null); } @@ -637,6 +649,7 @@ public final class ObexHelper { lengthArray[1] = (byte)(255 & length); out.write(lengthArray); out.write(value); + if (VDBG) Log.v(TAG," Add ByteSeq value = " + value); if (nullOut) { headImpl.setHeader(i + 0x70, null); } @@ -647,6 +660,7 @@ public final class ObexHelper { if (byteHeader != null) { out.write((byte)i + 0xB0); out.write(byteHeader.byteValue()); + if (VDBG) Log.v(TAG," Add ByteHeader value = " + byteHeader.byteValue()); if (nullOut) { headImpl.setHeader(i + 0xB0, null); } @@ -657,6 +671,7 @@ public final class ObexHelper { if (intHeader != null) { out.write((byte)i + 0xF0); out.write(ObexHelper.convertToByteArray(intHeader.longValue())); + if (VDBG) Log.v(TAG," Add Int value = " + intHeader.longValue()); if (nullOut) { headImpl.setHeader(i + 0xF0, null); } @@ -671,6 +686,7 @@ public final class ObexHelper { lengthArray[1] = (byte)(255 & length); out.write(lengthArray); out.write(headImpl.mAuthChall); + if (VDBG) Log.v(TAG," Add mAuthChall value = " + headImpl.mAuthChall); if (nullOut) { headImpl.mAuthChall = null; } @@ -684,6 +700,7 @@ public final class ObexHelper { lengthArray[1] = (byte)(255 & length); out.write(lengthArray); out.write(headImpl.mAuthResp); + if (VDBG) Log.v(TAG," Add mAuthChall value = " + headImpl.mAuthResp); if (nullOut) { headImpl.mAuthResp = null; } @@ -699,8 +716,10 @@ public final class ObexHelper { // Add the SRM header byteHeader = (Byte)headImpl.getHeader(HeaderSet.SINGLE_RESPONSE_MODE); if (byteHeader != null) { + if (VDBG) Log.v(TAG," Add SRM Header = " + HeaderSet.SINGLE_RESPONSE_MODE); out.write((byte)HeaderSet.SINGLE_RESPONSE_MODE); out.write(byteHeader.byteValue()); + if (VDBG) Log.v(TAG," Add SRM value = " + byteHeader.byteValue()); if (nullOut) { headImpl.setHeader(HeaderSet.SINGLE_RESPONSE_MODE, null); } @@ -709,6 +728,7 @@ public final class ObexHelper { // Add the SRM parameter header byteHeader = (Byte)headImpl.getHeader(HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER); if (byteHeader != null) { + if (VDBG) Log.v(TAG," Add Header = " + HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER); out.write((byte)HeaderSet.SINGLE_RESPONSE_MODE_PARAMETER); out.write(byteHeader.byteValue()); if (nullOut) { diff --git a/obex/javax/obex/ObexSession.java b/obex/javax/obex/ObexSession.java old mode 100644 new mode 100755 index 542b9c8b24924b40c97d033e6726240e34c8beb3..f5e607cd14c4e3a4c8983a8aa2f169cdbbbe6d6d --- a/obex/javax/obex/ObexSession.java +++ b/obex/javax/obex/ObexSession.java @@ -50,7 +50,7 @@ import android.util.Log; public class ObexSession { private static final String TAG = "ObexSession"; - private static final boolean V = ObexHelper.VDBG; + private static final boolean V = Log.isLoggable(ObexHelper.LOG_TAG, Log.VERBOSE); protected Authenticator mAuthenticator; diff --git a/obex/javax/obex/ServerOperation.java b/obex/javax/obex/ServerOperation.java old mode 100644 new mode 100755 index 56a675acf0827253fb8516c3433cb08e483442b1..87943bfe494d958e603628cb5ed88d00d20dd5b2 --- a/obex/javax/obex/ServerOperation.java +++ b/obex/javax/obex/ServerOperation.java @@ -59,7 +59,7 @@ public final class ServerOperation implements Operation, BaseStream { private static final String TAG = "ServerOperation"; - private static final boolean V = ObexHelper.VDBG; // Verbose debugging + private static final boolean V = Log.isLoggable(ObexHelper.LOG_TAG, Log.VERBOSE); public boolean isAborted; @@ -124,6 +124,7 @@ public final class ServerOperation implements Operation, BaseStream { */ public ServerOperation(ServerSession p, InputStream in, int request, int maxSize, ServerRequestHandler listen) throws IOException { + if (V) Log.v(TAG, "ServerOperation"); isAborted = false; mParent = p; @@ -195,7 +196,12 @@ public final class ServerOperation implements Operation, BaseStream { if(!handleObexPacket(packet)) { return; } - if (!mHasBody) { + /* Don't Pre-Send continue when Remote requested for SRM + * Let the Application confirm. + */ + if(V) Log.v(TAG, "Get App confirmation if SRM ENABLED case: " + mSrmEnabled + + " not hasBody case: " + mHasBody); + if (!mHasBody && !mSrmEnabled) { while ((!mGetOperation) && (!finalBitSet)) { sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); if (mPrivateInput.available() > 0) { @@ -204,8 +210,13 @@ public final class ServerOperation implements Operation, BaseStream { } } } - - while ((!mGetOperation) && (!finalBitSet) && (mPrivateInput.available() == 0)) { + /* Don't Pre-Send continue when Remote requested for SRM + * Let the Application confirm. + */ + if(V) Log.v(TAG, "Get App confirmation if SRM ENABLED case: " + mSrmEnabled + + " not finalPacket: " + finalBitSet + " not GETOp Case: " + mGetOperation); + while ((!mSrmEnabled) && (!mGetOperation) && (!finalBitSet) + && (mPrivateInput.available() == 0)) { sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); if (mPrivateInput.available() > 0) { break; @@ -330,14 +341,17 @@ public final class ServerOperation implements Operation, BaseStream { */ public synchronized boolean continueOperation(boolean sendEmpty, boolean inStream) throws IOException { + if (V) Log.v(TAG, "continueOperation"); if (!mGetOperation) { if (!finalBitSet) { if (sendEmpty) { sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); + if (V) Log.v(TAG, "continueOperation:ServerSet SRM sendEmpty clause"); return true; } else { if ((mResponseSize > 3) || (mPrivateOutput.size() > 0)) { sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); + if (V) Log.v(TAG, "continueOperation: Server setting SRM"); return true; } else { return false; @@ -347,6 +361,7 @@ public final class ServerOperation implements Operation, BaseStream { return false; } } else { + if (V) Log.v(TAG, "Get continueOperation "); sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); return true; } @@ -395,6 +410,8 @@ public final class ServerOperation implements Operation, BaseStream { bodyLength = mPrivateOutput.size(); orginalBodyLength = bodyLength; } + if(V)Log.v(TAG, "mMaxPcKLen : " + mMaxPacketLength); + if(V)Log.v(TAG, "headerArryLen : " + headerArray.length); if ((ObexHelper.BASE_PACKET_LENGTH + headerArray.length) > mMaxPacketLength) { diff --git a/obex/javax/obex/ServerSession.java b/obex/javax/obex/ServerSession.java old mode 100644 new mode 100755 index acee5ddd5f8f904abb8d45ca1c976f6c87859610..33b0bde81423a68b294bc8a1e75ec6f1d0fcc161 --- a/obex/javax/obex/ServerSession.java +++ b/obex/javax/obex/ServerSession.java @@ -47,7 +47,7 @@ import java.io.OutputStream; public final class ServerSession extends ObexSession implements Runnable { private static final String TAG = "Obex ServerSession"; - private static final boolean V = ObexHelper.VDBG; + private static final boolean V = Log.isLoggable(ObexHelper.LOG_TAG, Log.VERBOSE); private ObexTransport mTransport; @@ -104,7 +104,6 @@ public final class ServerSession extends ObexSession implements Runnable { case ObexHelper.OBEX_OPCODE_DISCONNECT: handleDisconnectRequest(); - done = true; break; case ObexHelper.OBEX_OPCODE_GET: @@ -125,6 +124,7 @@ public final class ServerSession extends ObexSession implements Runnable { break; case -1: + Log.v(TAG, "Read request returned -1, exiting from loop"); done = true; break; @@ -175,7 +175,7 @@ public final class ServerSession extends ObexSession implements Runnable { mInput.read(); } code = mListener.onAbort(request, reply); - Log.v(TAG, "onAbort request handler return value- " + code); + Log.d(TAG, "onAbort request handler return value- " + code); code = validateResponseCode(code); } sendResponse(code, null); @@ -195,6 +195,7 @@ public final class ServerSession extends ObexSession implements Runnable { * @throws IOException if an error occurred at the transport layer */ private void handlePutRequest(int type) throws IOException { + if (V) Log.v(TAG, "handlePutRequest"); ServerOperation op = new ServerOperation(this, mInput, type, mMaxPacketLength, mListener); try { int response = -1; @@ -206,10 +207,12 @@ public final class ServerSession extends ObexSession implements Runnable { response = validateResponseCode(mListener.onPut(op)); } if (response != ResponseCodes.OBEX_HTTP_OK && !op.isAborted) { + if (V) Log.v(TAG, "handlePutRequest pre != HTTP_OK sendReply"); op.sendReply(response); } else if (!op.isAborted) { // wait for the final bit while (!op.finalBitSet) { + if (V) Log.v(TAG, "handlePutRequest pre looped sendReply"); op.sendReply(ResponseCodes.OBEX_HTTP_CONTINUE); } op.sendReply(response); @@ -220,7 +223,7 @@ public final class ServerSession extends ObexSession implements Runnable { *internal error should not be sent because server has already replied with *OK response in "sendReply") */ - if(V) Log.d(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e); + if(V) Log.w(TAG,"Exception occured - sending OBEX_HTTP_INTERNAL_ERROR reply",e); if (!op.isAborted) { sendResponse(ResponseCodes.OBEX_HTTP_INTERNAL_ERROR, null); } @@ -241,6 +244,7 @@ public final class ServerSession extends ObexSession implements Runnable { * @throws IOException if an error occurred at the transport layer */ private void handleGetRequest(int type) throws IOException { + if (V) Log.v(TAG, "handleGetRequest"); ServerOperation op = new ServerOperation(this, mInput, type, mMaxPacketLength, mListener); try { int response = validateResponseCode(mListener.onGet(op)); @@ -263,6 +267,7 @@ public final class ServerSession extends ObexSession implements Runnable { public void sendResponse(int code, byte[] header) throws IOException { int totalLength = 3; byte[] data = null; + if (V) Log.v(TAG,"sendResponse code " + code + " header : " + header); OutputStream op = mOutput; if (op == null) { return; @@ -270,6 +275,7 @@ public final class ServerSession extends ObexSession implements Runnable { if (header != null) { totalLength += header.length; + if (V) Log.v(TAG, "header != null totalLength = " + totalLength); data = new byte[totalLength]; data[0] = (byte)code; data[1] = (byte)(totalLength >> 8); @@ -658,6 +664,12 @@ public final class ServerSession extends ObexSession implements Runnable { */ byte[] sendData = new byte[totalLength]; int maxRxLength = ObexHelper.getMaxRxPacketSize(mTransport); + //PTS expects least of maxPacketLen + if(maxRxLength > mMaxPacketLength) { + if(V) Log.v(TAG,"Set maxRxLength to min of maxRxServrLen:" + maxRxLength + + " and MaxNegotiated from Client: " + mMaxPacketLength); + maxRxLength = mMaxPacketLength; + } sendData[0] = (byte)code; sendData[1] = length[2]; sendData[2] = length[3]; diff --git a/packages/BackupRestoreConfirmation/AndroidManifest.xml b/packages/BackupRestoreConfirmation/AndroidManifest.xml old mode 100644 new mode 100755 index 8141fa72e56f6fabb042d196d13b62efb0ad9ef5..db8ebc190beb89b8ed2e9b746d7cd44784829def --- a/packages/BackupRestoreConfirmation/AndroidManifest.xml +++ b/packages/BackupRestoreConfirmation/AndroidManifest.xml @@ -21,6 +21,7 @@ + SIM 卡 PUK 码不正确,您还可尝试 %d 次。如果仍不正确,SIM 卡将永远无法使用。 SIM 卡 PUK 码不正确,您还可尝试 %d 次。如果仍不正确,SIM 卡将永远无法使用。 + 剩余次数: %d + 您输入了%d次错误的PIN, 是否重启并恢复出厂设置? + 您输入了%d次错误的密码, 是否重启并恢复出厂设置? + 您输入了%d次错误图案, 是否重启并恢复出厂设置? + 将要清除您设备上的全部用户数据并且设备恢复成出厂设置。 + "SIM卡PIN码操作失败!" "SIM卡PUK码操作失败!" "代码正确!" @@ -134,4 +140,9 @@ 设备已保持锁定状态达 %d 小时。请确认密码。 "无法识别" + + + "输入 SIM%d PIN, 您还有 %d 次尝试机会。如果仍然失败,则必须联系运营商帮您解锁设备。" + "输入 SIM%d PIN, 您还有 %d 次尝试机会。" + diff --git a/packages/Keyguard/res/values/config.xml b/packages/Keyguard/res/values/config.xml index bde6ed53135381eb87c368a2083ca07f6e7d0467..44336d334b87e557510406e98c25e0a941d83999 100644 --- a/packages/Keyguard/res/values/config.xml +++ b/packages/Keyguard/res/values/config.xml @@ -28,4 +28,10 @@ 7500000 + + + 0 + + + true diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml old mode 100644 new mode 100755 index 09fec81e45ac3bc8401cf813529f47ce6a4033f5..782af379656e3f03642f6ea8f46ca9adcf1c8f42 --- a/packages/Keyguard/res/values/strings.xml +++ b/packages/Keyguard/res/values/strings.xml @@ -48,6 +48,9 @@ to unlock the keyguard. Displayed in one line in a large font. --> Incorrect PIN code. + + Invalid Card. + Charged @@ -275,8 +278,8 @@ - Incorrect SIM PIN code, you have %d remaining attempt before you must contact your carrier to unlock your device. - Incorrect SIM PIN code, you have %d remaining attempts. + Incorrect SIM%d PIN code, you have %d remaining attempt before you must contact your carrier to unlock your device. + Incorrect SIM%d PIN code, you have %d remaining attempts. No service. + Remaining attempts: %d + + You entered the wrong PIN %d times, + do you want to reset your phone to factory settings? + + + You entered the wrong Password %d times, + do you want to reset your phone to factory settings? + + + You entered the wrong Pattern %d times, + do you want to reset your phone to factory settings? + + + This will erase all data from your device\'s internal storage and your device will be back to factory settings. + + Switch input method @@ -363,4 +383,20 @@ Not recognized + + + Enter SIM%d PIN, you have %d remaining +attempt before you must contact your carrier to unlock your device. + Enter SIM%d PIN, you have %d remaining +attempts. + + + + + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempt before SIM becomes permanently unusable. Contact carrier for details. + SIM is now disabled. Enter PUK code to continue. You have %d remaining attempts before SIM becomes permanently unusable. Contact carrier for details. + + diff --git a/packages/Keyguard/src/com/android/keyguard/CarrierText.java b/packages/Keyguard/src/com/android/keyguard/CarrierText.java old mode 100644 new mode 100755 index 159ac4cc6cbd8bb78e3fecbeeb4061d146c65c2e..53953370fc16540143aebea817d296394928389b --- a/packages/Keyguard/src/com/android/keyguard/CarrierText.java +++ b/packages/Keyguard/src/com/android/keyguard/CarrierText.java @@ -28,6 +28,8 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.text.method.SingleLineTransformationMethod; import android.util.AttributeSet; @@ -39,6 +41,7 @@ import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.IccCardConstants.State; import com.android.internal.telephony.TelephonyIntents; import com.android.settingslib.WirelessUtils; +import android.telephony.TelephonyManager; public class CarrierText extends TextView { private static final boolean DEBUG = KeyguardConstants.DEBUG; @@ -52,6 +55,8 @@ public class CarrierText extends TextView { private WifiManager mWifiManager; + private boolean[] mSimErrorState = new boolean[TelephonyManager.getDefault().getPhoneCount()]; + private KeyguardUpdateMonitorCallback mCallback = new KeyguardUpdateMonitorCallback() { @Override public void onRefreshCarrierInfo() { @@ -65,6 +70,22 @@ public class CarrierText extends TextView { public void onStartedWakingUp() { setSelected(true); }; + + public void onSimStateChanged(int subId, int slotId, IccCardConstants.State simState) { + if (slotId < 0) { + Log.d(TAG, "onSimStateChanged() - slotId invalid: " + slotId); + return; + } + + Log.d(TAG,"onSimStateChanged: " + getStatusForIccState(simState)); + if (getStatusForIccState(simState) == StatusMode.SimIoError) { + mSimErrorState[slotId] = true; + updateCarrierText(); + } else if (mSimErrorState[slotId]) { + mSimErrorState[slotId] = false; + updateCarrierText(); + } + }; }; /** * The status of this lock screen. Primarily used for widgets on LockScreen. @@ -77,7 +98,8 @@ public class CarrierText extends TextView { SimPukLocked, // SIM card is PUK locked because SIM entered wrong too many times SimLocked, // SIM card is currently locked SimPermDisabled, // SIM card is permanently disabled due to PUK unlock failure - SimNotReady; // SIM is not ready yet. May never be on devices w/o a SIM. + SimNotReady, // SIM is not ready yet. May never be on devices w/o a SIM. + SimIoError; //The sim card is faulty } public CarrierText(Context context) { @@ -101,18 +123,91 @@ public class CarrierText extends TextView { mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); } + /** + * Checks if there are faulty cards. Adds the text depending on the slot of the card + * @param text: current carrier text based on the sim state + * @param noSims: whether a valid sim card is inserted + * @return text + */ + private CharSequence updateCarrierTextWithSimIoError(CharSequence text, boolean noSims) { + final CharSequence carrier = ""; + CharSequence carrierTextForSimState = getCarrierTextForSimState( + IccCardConstants.State.CARD_IO_ERROR, carrier); + for (int index = 0; index < mSimErrorState.length; index++) { + if (mSimErrorState[index]) { + // In the case when no sim cards are detected but a faulty card is inserted + // overwrite the text and only show "Invalid card" + if (noSims) { + return concatenate(carrierTextForSimState, + getContext().getText(com.android.internal.R.string.emergency_calls_only)); + } else if (index == 0) { + // prepend "Invalid card" when faulty card is inserted in slot 0 + text = concatenate(carrierTextForSimState, text); + } else { + // concatenate "Invalid card" when faulty card is inserted in slot 1 + text = concatenate(text, carrierTextForSimState); + } + } + } + return text; + } + protected void updateCarrierText() { boolean allSimsMissing = true; boolean anySimReadyAndInService = false; + boolean showLocale = getContext().getResources().getBoolean( + com.android.internal.R.bool.config_monitor_locale_change); CharSequence displayText = null; List subs = mKeyguardUpdateMonitor.getSubscriptionInfo(false); final int N = subs.size(); if (DEBUG) Log.d(TAG, "updateCarrierText(): " + N); for (int i = 0; i < N; i++) { + CharSequence networkClass = ""; int subId = subs.get(i).getSubscriptionId(); State simState = mKeyguardUpdateMonitor.getSimState(subId); + boolean showRat = SubscriptionManager.getResourcesForSubId(mContext, + subId).getBoolean(com.android.internal.R.bool.config_display_rat); + if (showRat) { + ServiceState ss = mKeyguardUpdateMonitor.mServiceStates.get(subId); + if (ss != null && (ss.getDataRegState() == ServiceState.STATE_IN_SERVICE + || ss.getVoiceRegState() == ServiceState.STATE_IN_SERVICE)) { + int networkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; + if (ss.getRilDataRadioTechnology() != + ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { + networkType = ss.getDataNetworkType(); + } else if (ss.getRilVoiceRadioTechnology() != + ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN) { + networkType = ss.getVoiceNetworkType(); + } + networkClass = networkClassToString(TelephonyManager + .getNetworkClass(networkType)); + } + } CharSequence carrierName = subs.get(i).getCarrierName(); + if (showLocale || showRat) { + String[] names = carrierName.toString().split(mSeparator.toString(), 2); + StringBuilder newCarrierName = new StringBuilder(); + for (int j = 0; j < names.length; j++) { + if (showLocale) { + names[j] = android.util.NativeTextHelper.getLocalString(getContext(), + names[j], com.android.internal.R.array.origin_carrier_names, + com.android.internal.R.array.locale_carrier_names); + } + if (!TextUtils.isEmpty(names[j])) { + if (!TextUtils.isEmpty(networkClass) && showRat) { + names[j] = new StringBuilder().append(names[j]).append(" ") + .append(networkClass).toString(); + } + if (j > 0 && names[j].equals(names[j-1])) { + continue; + } + if (j > 0) newCarrierName.append(mSeparator); + newCarrierName.append(names[j]); + } + } + carrierName = newCarrierName.toString(); + } CharSequence carrierTextForSimState = getCarrierTextForSimState(simState, carrierName); if (DEBUG) { Log.d(TAG, "Handling (subId=" + subId + "): " + simState + " " + carrierName); @@ -138,6 +233,25 @@ public class CarrierText extends TextView { } } } + /* + * In the case where there is only one sim inserted in a multisim device, if + * the voice registration service state is reported as 12 (no service with emergency) + * for at least one of the sim concatenate the sim state with Emergency calls only" + */ + if (N < TelephonyManager.getDefault().getPhoneCount() && + mKeyguardUpdateMonitor.isEmergencyOnly()) { + int presentSubId = mKeyguardUpdateMonitor.getPresentSubId(); + + if (DEBUG) { + Log.d(TAG, " Present sim - sub id: " + presentSubId); + } + if (presentSubId != -1) { + CharSequence emergencyOnlyText = + getContext().getText(com.android.internal.R.string.emergency_calls_only); + displayText = getCarrierTextForSimState( + mKeyguardUpdateMonitor.getSimState(presentSubId), emergencyOnlyText); + } + } if (allSimsMissing) { if (N != 0) { // Shows "No SIM card | Emergency calls only" on devices that are voice-capable. @@ -179,6 +293,7 @@ public class CarrierText extends TextView { } } + displayText = updateCarrierTextWithSimIoError(displayText, allSimsMissing); // APM (airplane mode) != no carrier state. There are carrier services // (e.g. WFC = Wi-Fi calling) which may operate in APM. if (!anySimReadyAndInService && WirelessUtils.isAirplaneModeOn(mContext)) { @@ -270,6 +385,11 @@ public class CarrierText extends TextView { getContext().getText(R.string.keyguard_sim_puk_locked_message), text); break; + case SimIoError: + carrierText = makeCarrierStringOnEmergencyCapable( + getContext().getText(R.string.lockscreen_sim_error_message_short), + text); + break; } return carrierText; @@ -319,6 +439,8 @@ public class CarrierText extends TextView { return StatusMode.SimPermDisabled; case UNKNOWN: return StatusMode.SimMissing; + case CARD_IO_ERROR: + return StatusMode.SimIoError; } return StatusMode.SimMissing; } @@ -387,4 +509,17 @@ public class CarrierText extends TextView { return source; } } + + private String networkClassToString (int networkClass) { + final int[] classIds = + {com.android.internal.R.string.config_rat_unknown, + com.android.internal.R.string.config_rat_2g, + com.android.internal.R.string.config_rat_3g, + com.android.internal.R.string.config_rat_4g }; + String classString = null; + if (networkClass < classIds.length) { + classString = getContext().getResources().getString(classIds[networkClass]); + } + return (classString == null) ? "" : classString; + } } diff --git a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java index 8d411453b5ae1d6a99b1b475b8e080a617b2e956..ff94d1e5ec031ddf91a8b1c15d7cf6f97b9dbdca 100644 --- a/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java +++ b/packages/Keyguard/src/com/android/keyguard/EmergencyButton.java @@ -24,6 +24,7 @@ import android.content.res.Configuration; import android.os.PowerManager; import android.os.RemoteException; import android.os.SystemClock; +import android.os.SystemProperties; import android.os.UserHandle; import android.telecom.TelecomManager; import android.util.AttributeSet; @@ -146,7 +147,7 @@ public class EmergencyButton extends Button { } } - private void updateEmergencyCallButton() { + public void updateEmergencyCallButton() { boolean visible = false; if (mIsVoiceCapable) { // Emergency calling requires voice capability. @@ -160,7 +161,8 @@ public class EmergencyButton extends Button { visible = mEnableEmergencyCallWhileSimLocked; } else { // Only show if there is a secure screen (pin/pattern/SIM pin/SIM puk); - visible = mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser()); + visible = mLockPatternUtils.isSecure(KeyguardUpdateMonitor.getCurrentUser()) || + SystemProperties.getBoolean("persist.radio.emgcy_btn_onswipe", false); } } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java index 60eaad2699eea3f84bf6ba2481b1d8e99e031cdc..4636312fbf68df7aadc77937791f5790d1fd1892 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardAbsKeyInputView.java @@ -41,6 +41,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout protected View mEcaView; protected boolean mEnableHaptics; private boolean mDismissing; + private int mMaxCountdownTimes = 0; // To avoid accidental lockout due to events while the device in in the pocket, ignore // any passwords with length less than or equal to this length. @@ -94,6 +95,9 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout mSecurityMessageDisplay = KeyguardMessageArea.findSecurityMessageDisplay(this); mEcaView = findViewById(R.id.keyguard_selector_fade_container); + mMaxCountdownTimes = mContext.getResources() + .getInteger(R.integer.config_max_unlock_countdown_times); + EmergencyButton button = (EmergencyButton) findViewById(R.id.emergency_call_button); if (button != null) { button.setCallback(this); @@ -151,6 +155,7 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout boolean isValidPassword) { boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId; if (matched) { + mLockPatternUtils.sanitizePassword(); mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mDismissing = true; @@ -159,14 +164,15 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout } else { if (isValidPassword) { mCallback.reportUnlockAttempt(userId, false, timeoutMs); - if (timeoutMs > 0) { + if (!(mMaxCountdownTimes > 0) && timeoutMs > 0) { long deadline = mLockPatternUtils.setLockoutAttemptDeadline( userId, timeoutMs); handleAttemptLockout(deadline); } } if (timeoutMs == 0) { - mSecurityMessageDisplay.setMessage(getWrongPasswordStringId(), true); + String msg = getMessageWithCount(getWrongPasswordStringId()); + mSecurityMessageDisplay.setMessage(msg, true); } } resetPasswordText(true /* animate */, !matched /* announce deletion if no match */); @@ -198,6 +204,18 @@ public abstract class KeyguardAbsKeyInputView extends LinearLayout }.start(); } + protected String getMessageWithCount(int msgId) { + String msg = getContext().getString(msgId); + int remaining = mMaxCountdownTimes + - KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts( + KeyguardUpdateMonitor.getCurrentUser()); + if (mMaxCountdownTimes > 0 && remaining > 0) { + msg += " - " + getContext().getResources().getString( + R.string.kg_remaining_attempts, remaining); + } + return msg; + } + protected void onUserInput() { if (mCallback != null) { mCallback.userActivity(); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java old mode 100644 new mode 100755 index 39271224d943e9f40897a8f7ed949c4b8505da58..8125afd6d46c4dcd9ac277f1f05c0bcd6e9b0478 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java @@ -25,7 +25,7 @@ public class KeyguardConstants { * 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 = false; - public static final boolean DEBUG_SIM_STATES = false; + public static final boolean DEBUG = true; + public static final boolean DEBUG_SIM_STATES = true; public static final boolean DEBUG_FP_WAKELOCK = true; } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java index 33b6748989f6d37b7f492af2ea1b3b0ca4358490..54ff7e35a73ec9473e2d7a3840bdb2bab2a81ecc 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPINView.java @@ -74,7 +74,7 @@ public class KeyguardPINView extends KeyguardPinBasedInputView { @Override protected void resetState() { super.resetState(); - mSecurityMessageDisplay.setMessage(R.string.kg_pin_instructions, false); + mSecurityMessageDisplay.setMessage(getMessageWithCount(R.string.kg_pin_instructions), false); } @Override diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java index b75f52987a928c5cc5fd910a94231c8a2e5ba2fa..d897c2b61e37d704b538273551ed9c81eacbf3a2 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java @@ -74,7 +74,7 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView @Override protected void resetState() { - mSecurityMessageDisplay.setMessage(R.string.kg_password_instructions, false); + mSecurityMessageDisplay.setMessage(getMessageWithCount(R.string.kg_password_instructions), false); final boolean wasDisabled = mPasswordEntry.isEnabled(); setPasswordEntryEnabled(true); setPasswordEntryInputEnabled(true); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java index e07049262c6ec0be0f1a65e9c354b0ccdf1d7dbb..857684aee2b869e8e1712ba989945336bf510eac 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java @@ -85,6 +85,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit private Rect mTempRect = new Rect(); private KeyguardMessageArea mSecurityMessageDisplay; private View mEcaView; + private int mMaxCountdownTimes; private ViewGroup mContainer; private int mDisappearYTranslation; @@ -126,6 +127,8 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit @Override protected void onFinishInflate() { super.onFinishInflate(); + mMaxCountdownTimes = mContext.getResources() + .getInteger(R.integer.config_max_unlock_countdown_times); mLockPatternUtils = mLockPatternUtils == null ? new LockPatternUtils(mContext) : mLockPatternUtils; @@ -189,7 +192,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit } private void displayDefaultSecurityMessage() { - mSecurityMessageDisplay.setMessage(R.string.kg_pattern_instructions, false); + mSecurityMessageDisplay.setMessage(getMessageWithCount(R.string.kg_pattern_instructions), false); } @Override @@ -255,6 +258,7 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit boolean isValidPattern) { boolean dismissKeyguard = KeyguardUpdateMonitor.getCurrentUser() == userId; if (matched) { + mLockPatternUtils.sanitizePassword(); mCallback.reportUnlockAttempt(userId, true, 0); if (dismissKeyguard) { mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Correct); @@ -264,20 +268,33 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit mLockPatternView.setDisplayMode(LockPatternView.DisplayMode.Wrong); if (isValidPattern) { mCallback.reportUnlockAttempt(userId, false, timeoutMs); - if (timeoutMs > 0) { + if (!(mMaxCountdownTimes > 0) && timeoutMs > 0) { long deadline = mLockPatternUtils.setLockoutAttemptDeadline( userId, timeoutMs); handleAttemptLockout(deadline); } } if (timeoutMs == 0) { - mSecurityMessageDisplay.setMessage(R.string.kg_wrong_pattern, true); + mSecurityMessageDisplay. + setMessage(getMessageWithCount(R.string.kg_wrong_pattern),true); mLockPatternView.postDelayed(mCancelPatternRunnable, PATTERN_CLEAR_TIMEOUT_MS); } } } } + private String getMessageWithCount(int msgId) { + String msg = getContext().getString(msgId); + int remaining = mMaxCountdownTimes + - KeyguardUpdateMonitor.getInstance(mContext).getFailedUnlockAttempts( + KeyguardUpdateMonitor.getCurrentUser()); + if (mMaxCountdownTimes > 0 && remaining > 0) { + msg += " - " + getContext().getResources().getString( + R.string.kg_remaining_attempts, remaining); + } + return msg; + } + private void handleAttemptLockout(long elapsedRealtimeDeadline) { mLockPatternView.clearPattern(); mLockPatternView.setEnabled(false); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java index a7e4e1272a6002b51544431bc93ac86487ca25cf..aaff26511eecd5276d76ef4e458a3bf5b2445019 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -17,8 +17,11 @@ package com.android.keyguard; import android.app.Activity; import android.app.AlertDialog; +import android.app.ActivityManager; import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; @@ -49,6 +52,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe private final KeyguardUpdateMonitor mUpdateMonitor; + private WipeConfirmListener mWipeConfirmListener = null; + // Used to notify the container when something interesting happens. public interface SecurityCallback { public boolean dismiss(boolean authenticated); @@ -250,12 +255,71 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe showDialog(null, message); } + private void showCountdownWipeDialog(int attempts) { + int msgId = R.string.kg_failed_attempts_now_wiping; + switch (mSecurityModel.getSecurityMode()) { + case PIN: + msgId = R.string.kg_failed_pin_attempts_now_wiping; + break; + case Password: + msgId = R.string.kg_failed_password_attempts_now_wiping; + break; + case Pattern: + msgId = R.string.kg_failed_pattern_attempts_now_wiping; + break; + } + if (mWipeConfirmListener == null) { + mWipeConfirmListener = new WipeConfirmListener(); + } + final AlertDialog dialog = new AlertDialog.Builder(mContext) + .setMessage(mContext.getString(msgId, attempts)) + .setNegativeButton(com.android.internal.R.string.gpsVerifYes,// reuse public Yes/No + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + showWipeConfirmDialog(); + } + }) + .setPositiveButton(com.android.internal.R.string.gpsVerifNo, mWipeConfirmListener) + .setCancelable(false) + .create(); + if (!(mContext instanceof Activity)) { + dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + } + dialog.show(); + } + + private void showWipeConfirmDialog() { + final AlertDialog dialog = new AlertDialog.Builder(mContext) + .setMessage(R.string.kg_failed_attempts_now_wiping_confirm) + .setNegativeButton(com.android.internal.R.string.gpsVerifYes, mWipeConfirmListener) + .setPositiveButton(com.android.internal.R.string.gpsVerifNo, mWipeConfirmListener) + .setCancelable(false) + .create(); + if (!(mContext instanceof Activity)) { + dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + } + dialog.show(); + } + + private class WipeConfirmListener implements DialogInterface.OnClickListener { + public void onClick(DialogInterface dialog, int which) { + if (DialogInterface.BUTTON_POSITIVE == which) { + KeyguardUpdateMonitor.getInstance(mContext).clearFailedUnlockAttempts(); + } else { + if (ActivityManager.isUserAMonkey()) return; + Intent wipeIntent = new Intent(Intent.ACTION_MASTER_CLEAR); + mContext.sendBroadcast(wipeIntent); + } + } + } + private void reportFailedUnlockAttempt(int userId, int timeoutMs) { final KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); final int failedAttempts = monitor.getFailedUnlockAttempts(userId) + 1; // +1 for this time if (DEBUG) Log.d(TAG, "reportFailedPatternAttempt: #" + failedAttempts); + SecurityMode mode = mSecurityModel.getSecurityMode(); final DevicePolicyManager dpm = mLockPatternUtils.getDevicePolicyManager(); final int failedAttemptsBeforeWipe = dpm.getMaximumFailedPasswordsForWipe(null, userId); @@ -263,7 +327,18 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe final int remainingBeforeWipe = failedAttemptsBeforeWipe > 0 ? (failedAttemptsBeforeWipe - failedAttempts) : Integer.MAX_VALUE; // because DPM returns 0 if no restriction - if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { + + final boolean usingPattern = mode == KeyguardSecurityModel.SecurityMode.Pattern; + final boolean usingPIN = mode == KeyguardSecurityModel.SecurityMode.PIN; + final boolean usingPassword = mode == KeyguardSecurityModel.SecurityMode.Password; + final int maxCountdownTimes = mContext.getResources() + .getInteger(R.integer.config_max_unlock_countdown_times); + final boolean enableTimesCounter = maxCountdownTimes > 0 && (usingPattern || usingPIN + || usingPassword); + + if (enableTimesCounter && (failedAttempts >= maxCountdownTimes)) { + showCountdownWipeDialog(failedAttempts); + } else if (remainingBeforeWipe < LockPatternUtils.FAILED_ATTEMPTS_BEFORE_WIPE_GRACE) { // The user has installed a DevicePolicyManager that requests a user/profile to be wiped // N attempts. Once we get below the grace period, we post this dialog every time as a // clear warning until the deletion fires. @@ -288,7 +363,7 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe } monitor.reportFailedStrongAuthUnlockAttempt(userId); mLockPatternUtils.reportFailedPasswordAttempt(userId); - if (timeoutMs > 0) { + if (!enableTimesCounter && (timeoutMs > 0)) { showTimeoutDialog(timeoutMs); } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java old mode 100644 new mode 100755 index cfaf7b622eb7e1a58583ab63a8360bbaf84e2080..96b36db97ff6050a23a228249a17733b483175d2 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPinView.java @@ -50,9 +50,12 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPin mCheckSimPinThread; - + private boolean mShowDefaultMessage = true; + private int mRemainingAttempts = -1; + private int mResult = PhoneConstants.PIN_PASSWORD_INCORRECT; private AlertDialog mRemainingAttemptsDialog; private int mSubId; + private int mSlotId; private ImageView mSimImageView; KeyguardUpdateMonitorCallback mUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() { @@ -75,25 +78,8 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public void resetState() { super.resetState(); if (DEBUG) Log.v(TAG, "Resetting state"); - KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); - mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); - if (SubscriptionManager.isValidSubscriptionId(mSubId)) { - int count = TelephonyManager.getDefault().getSimCount(); - Resources rez = getResources(); - final String msg; - int color = Color.WHITE; - if (count < 2) { - msg = rez.getString(R.string.kg_sim_pin_instructions); - } else { - SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); - CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash - msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); - if (info != null) { - color = info.getIconTint(); - } - } - mSecurityMessageDisplay.setMessage(msg, true); - mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + if (mShowDefaultMessage) { + showDefaultMessage(); } } @@ -109,17 +95,19 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { return 0; } - private String getPinPasswordErrorMessage(int attemptsRemaining) { + private String getPinPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; - + int msgId; if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_pin_code_pukked); } else if (attemptsRemaining > 0) { + msgId = isDefault ? R.plurals.kg_password_default_pin_message : + R.plurals.kg_password_wrong_pin_code; displayMessage = getContext().getResources() - .getQuantityString(R.plurals.kg_password_wrong_pin_code, attemptsRemaining, - attemptsRemaining); + .getQuantityString(msgId, attemptsRemaining, mSlotId, attemptsRemaining); } else { - displayMessage = getContext().getString(R.string.kg_password_pin_failed); + msgId = isDefault ? R.string.kg_sim_pin_instructions : R.string.kg_password_pin_failed; + displayMessage = getContext().getString(msgId); } if (DEBUG) Log.d(LOG_TAG, "getPinPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); @@ -151,6 +139,9 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + if (mShowDefaultMessage) { + showDefaultMessage(); + } KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); } @@ -231,7 +222,7 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } private Dialog getSimRemainingAttemptsDialog(int remaining) { - String msg = getPinPasswordErrorMessage(remaining); + String msg = getPinPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); @@ -267,6 +258,8 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { post(new Runnable() { @Override public void run() { + mRemainingAttempts = attemptsRemaining; + mResult = result; if (mSimUnlockProgressDialog != null) { mSimUnlockProgressDialog.hide(); } @@ -275,8 +268,14 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); - mCallback.dismiss(true); + mResult = PhoneConstants.PIN_PASSWORD_INCORRECT; + mRemainingAttempts = -1; + mShowDefaultMessage = true; + if (mCallback != null) { + mCallback.dismiss(true); + } } else { + mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { if (attemptsRemaining <= 2) { // this is getting critical - show dialog @@ -284,7 +283,8 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { } else { // show message mSecurityMessageDisplay.setMessage( - getPinPasswordErrorMessage(attemptsRemaining), true); + getPinPasswordErrorMessage( + attemptsRemaining, false), true); } } else { // "PIN operation failed!" - no idea what this was and no way to @@ -315,5 +315,51 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public boolean startDisappearAnimation(Runnable finishRunnable) { return false; } + + private void showDefaultMessage() { + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); + mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PIN_REQUIRED); + if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { + return; + } + if (mRemainingAttempts >= 0) { + if (mResult != PhoneConstants.PIN_RESULT_SUCCESS) + mSecurityMessageDisplay.setMessage( + getPinPasswordErrorMessage(mRemainingAttempts, true), + true); + return; + } + + mSlotId = SubscriptionManager.getSlotId(mSubId) + 1; + int count = TelephonyManager.getDefault().getSimCount(); + Resources rez = getResources(); + final String msg; + int color = Color.WHITE; + if (count < 2) { + msg = rez.getString(R.string.kg_sim_pin_instructions); + } else { + SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); + CharSequence displayName = info != null ? info.getDisplayName() : ""; // don't crash + msg = rez.getString(R.string.kg_sim_pin_instructions_multi, displayName); + if (info != null) { + color = info.getIconTint(); + } + } + mSecurityMessageDisplay.setMessage(msg, true); + mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + + new CheckSimPin("", mSubId) { + void onSimCheckResponse(final int result, final int attemptsRemaining) { + Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result + + " attemptsRemaining=" + attemptsRemaining); + if (attemptsRemaining >= 0) { + mRemainingAttempts = attemptsRemaining; + mResult = result; + mSecurityMessageDisplay.setMessage( + getPinPasswordErrorMessage(attemptsRemaining, true), true); + } + } + }.start(); + } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java index 59c01cf481c7e4bb6f7e3f312923ca533372e7d3..1063f3a8821f2112ec339b69d6174cddd96a6fec 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSimPukView.java @@ -50,6 +50,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { private ProgressDialog mSimUnlockProgressDialog = null; private CheckSimPuk mCheckSimPukThread; + private boolean mShowDefaultMessage = true; + private int mRemainingAttempts = -1; private String mPukText; private String mPinText; private StateMachine mStateMachine = new StateMachine(); @@ -116,25 +118,8 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { mPinText=""; mPukText=""; state = ENTER_PUK; - KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); - mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); - if (SubscriptionManager.isValidSubscriptionId(mSubId)) { - int count = TelephonyManager.getDefault().getSimCount(); - Resources rez = getResources(); - final String msg; - int color = Color.WHITE; - if (count < 2) { - msg = rez.getString(R.string.kg_puk_enter_puk_hint); - } else { - SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); - CharSequence displayName = info != null ? info.getDisplayName() : ""; - msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); - if (info != null) { - color = info.getIconTint(); - } - } - mSecurityMessageDisplay.setMessage(msg, true); - mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + if (mShowDefaultMessage) { + showDefaultMessage(); } mPasswordEntry.requestFocus(); } @@ -146,17 +131,20 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { return 0; } - private String getPukPasswordErrorMessage(int attemptsRemaining) { + private String getPukPasswordErrorMessage(int attemptsRemaining, boolean isDefault) { String displayMessage; if (attemptsRemaining == 0) { displayMessage = getContext().getString(R.string.kg_password_wrong_puk_code_dead); } else if (attemptsRemaining > 0) { + int msgId = isDefault ? R.plurals.kg_password_default_puk_message : + R.plurals.kg_password_wrong_puk_code; displayMessage = getContext().getResources() - .getQuantityString(R.plurals.kg_password_wrong_puk_code, attemptsRemaining, - attemptsRemaining); + .getQuantityString(msgId, attemptsRemaining, attemptsRemaining); } else { - displayMessage = getContext().getString(R.string.kg_password_puk_failed); + int msgId = isDefault ? R.string.kg_puk_enter_puk_hint : + R.string.kg_password_puk_failed; + displayMessage = getContext().getString(msgId); } if (DEBUG) Log.d(LOG_TAG, "getPukPasswordErrorMessage:" + " attemptsRemaining=" + attemptsRemaining + " displayMessage=" + displayMessage); @@ -194,6 +182,9 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); + if (mShowDefaultMessage) { + showDefaultMessage(); + } KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); } @@ -276,7 +267,7 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { } private Dialog getPukRemainingAttemptsDialog(int remaining) { - String msg = getPukPasswordErrorMessage(remaining); + String msg = getPukPasswordErrorMessage(remaining, false); if (mRemainingAttemptsDialog == null) { AlertDialog.Builder builder = new AlertDialog.Builder(mContext); builder.setMessage(msg); @@ -332,16 +323,25 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { if (result == PhoneConstants.PIN_RESULT_SUCCESS) { KeyguardUpdateMonitor.getInstance(getContext()) .reportSimUnlocked(mSubId); - mCallback.dismiss(true); + mRemainingAttempts = -1; + mShowDefaultMessage = true; + if (mCallback != null) { + mCallback.dismiss(true); + } } else { + mShowDefaultMessage = false; if (result == PhoneConstants.PIN_PASSWORD_INCORRECT) { + // show message + mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( + attemptsRemaining, false), true); if (attemptsRemaining <= 2) { // this is getting critical - show dialog getPukRemainingAttemptsDialog(attemptsRemaining).show(); } else { // show message mSecurityMessageDisplay.setMessage( - getPukPasswordErrorMessage(attemptsRemaining), true); + getPukPasswordErrorMessage( + attemptsRemaining, false), true); } } else { mSecurityMessageDisplay.setMessage(getContext().getString( @@ -375,6 +375,48 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { public boolean startDisappearAnimation(Runnable finishRunnable) { return false; } + + private void showDefaultMessage() { + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext); + mSubId = monitor.getNextSubIdForState(IccCardConstants.State.PUK_REQUIRED); + if (!SubscriptionManager.isValidSubscriptionId(mSubId)) { + return; + } + if (mRemainingAttempts >= 0) { + mSecurityMessageDisplay.setMessage(getPukPasswordErrorMessage( + mRemainingAttempts, true), true); + return; + } + + int count = TelephonyManager.getDefault().getSimCount(); + Resources rez = getResources(); + final String msg; + int color = Color.WHITE; + if (count < 2) { + msg = rez.getString(R.string.kg_puk_enter_puk_hint); + } else { + SubscriptionInfo info = monitor.getSubscriptionInfoForSubId(mSubId); + CharSequence displayName = info != null ? info.getDisplayName() : ""; + msg = rez.getString(R.string.kg_puk_enter_puk_hint_multi, displayName); + if (info != null) { + color = info.getIconTint(); + } + } + mSecurityMessageDisplay.setMessage(msg, true); + mSimImageView.setImageTintList(ColorStateList.valueOf(color)); + + new CheckSimPuk("", "", mSubId) { + void onSimLockChangedResponse(final int result, final int attemptsRemaining) { + Log.d(LOG_TAG, "onSimCheckResponse " + " dummy One result" + result + + " attemptsRemaining=" + attemptsRemaining); + if (attemptsRemaining >= 0) { + mRemainingAttempts = attemptsRemaining; + mSecurityMessageDisplay.setMessage( + getPukPasswordErrorMessage(attemptsRemaining, true), true); + } + } + }.start(); + } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java index 9d1df26514eeed08454f06859f2772ec4897b6b9..d427c4cb6153fbbcc96795623028b722d952d47b 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java @@ -240,10 +240,12 @@ public class KeyguardStatusView extends GridLayout { dateView = DateFormat.getBestDateTimePattern(locale, dateViewSkel); clockView12 = DateFormat.getBestDateTimePattern(locale, clockView12Skel); - // CLDR insists on adding an AM/PM indicator even though it wasn't in the skeleton - // format. The following code removes the AM/PM indicator if we didn't want it. - if (!clockView12Skel.contains("a")) { - clockView12 = clockView12.replaceAll("a", "").trim(); + if(!context.getResources().getBoolean(R.bool.config_showAmpm)){ + // CLDR insists on adding an AM/PM indicator even though it wasn't in the skeleton + // format. The following code removes the AM/PM indicator if we didn't want it. + if (!clockView12Skel.contains("a")) { + clockView12 = clockView12.replaceAll("a", "").trim(); + } } clockView24 = DateFormat.getBestDateTimePattern(locale, clockView24Skel); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java old mode 100644 new mode 100755 index a8419bf4cbdfb77f6dafc5a7f428e64036d8b136..681554521c3fe4ba82d08b309a4b7d81ea89690f --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -137,6 +137,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private static final int MSG_SERVICE_STATE_CHANGE = 330; private static final int MSG_SCREEN_TURNED_ON = 331; private static final int MSG_SCREEN_TURNED_OFF = 332; + private static final int MSG_LOCALE_CHANGED = 500; /** Fingerprint state: Not listening to fingerprint. */ private static final int FINGERPRINT_STATE_STOPPED = 0; @@ -276,6 +277,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { break; case MSG_SCREEN_TURNED_OFF: handleScreenTurnedOff(); + case MSG_LOCALE_CHANGED: + handleLocaleChanged(); break; } } @@ -384,6 +387,36 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { return mSubscriptionInfo; } + public boolean isEmergencyOnly() { + boolean isEmerg = false; + ServiceState state; + for (int slotId = 0; slotId < TelephonyManager.getDefault().getPhoneCount(); slotId++) { + state = null; + int[] subId = mSubscriptionManager.getSubId(slotId); + if (subId != null && subId.length > 0) { + state = mServiceStates.get(subId[0]); + } + if (state != null) { + if (state.getVoiceRegState() == ServiceState.STATE_IN_SERVICE) + return false; + else if (state.isEmergencyOnly()) { + isEmerg = true; + } + } + } + return isEmerg; + } + + public int getPresentSubId() { + for (int slotId = 0; slotId < TelephonyManager.getDefault().getPhoneCount(); slotId++) { + int[] subId = mSubscriptionManager.getSubId(slotId); + if (subId != null && subId.length > 0 && getSimState(subId[0]) != State.ABSENT) { + return subId[0]; + } + } + return -1; + } + @Override public void onTrustManagedChanged(boolean managed, int userId) { mUserTrustIsManaged.put(userId, managed); @@ -669,6 +702,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } mHandler.sendMessage( mHandler.obtainMessage(MSG_SERVICE_STATE_CHANGE, subId, 0, serviceState)); + } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { + mHandler.sendEmptyMessage(MSG_LOCALE_CHANGED); } } }; @@ -797,6 +832,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } else if (IccCardConstants.INTENT_VALUE_LOCKED_NETWORK.equals(stateExtra)) { state = IccCardConstants.State.NETWORK_LOCKED; + } else if (IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR.equals(stateExtra)) { + state = IccCardConstants.State.CARD_IO_ERROR; } else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(stateExtra) || IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(stateExtra)) { // This is required because telephony doesn't return to "READY" after @@ -1002,6 +1039,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { filter.addAction(Intent.ACTION_BATTERY_CHANGED); filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED); filter.addAction(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED); filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); @@ -1341,6 +1379,18 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } + /** + * Handle {@link #MSG_LOCALE_CHANGED} + */ + private void handleLocaleChanged() { + for (int j = 0; j < mCallbacks.size(); j++) { + KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get(); + if (cb != null) { + cb.onRefreshCarrierInfo(); + } + } + } + /** * Handle {@link #MSG_SERVICE_STATE_CHANGE} */ diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 89c46d74e71005e6297a597c9ecdc58a60538283..7fe78b692781dc59cb30ff6dd52dc42332715724 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -123,6 +123,8 @@ Message Access SIM Access + + Dial-up Network Access Connected to media audio @@ -142,6 +144,8 @@ Connected to device for Internet access Sharing local Internet connection with device + + Connected to Dun Server Use for input + + Use for Dial-up Network access Pair diff --git a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java index ff1c8665b3d2484e80770a59d1c36315a35462b8..b07311f1469ce08bfd7b96114313c8610882f0ff 100644 --- a/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/DeviceInfoUtils.java @@ -97,6 +97,32 @@ public class DeviceInfoUtils { m.group(4); // Thu Jun 28 11:02:39 PDT 2012 } + public static String customizeFormatKernelVersion(boolean hideVersionName){ + if (hideVersionName) { + try { + String strVersion = readLine(FILENAME_PROC_VERSION); + final String PROC_VERSION_REGEX = "Linux version (\\S+) " + "\\((\\S+?)\\) " + + "(?:\\(gcc.+? \\)) " + "(#\\d+) " + "(?:.*?)?" + + "((Sun|Mon|Tue|Wed|Thu|Fri|Sat).+)"; + Matcher m = Pattern.compile(PROC_VERSION_REGEX).matcher(strVersion); + if (!m.matches()) { + Log.e(TAG, "Regex did not match on /proc/version: " + strVersion); + return "Unavailable"; + } else if (m.groupCount() < 4) { + Log.e(TAG, "Regex match on /proc/version only returned " + + m.groupCount() + " groups"); + return "Unavailable"; + } + return m.group(1) + "\n" + m.group(4); + } catch (IOException e) { + Log.e(TAG, "IO Exception when getting kernel version for Device Info screen", e); + return "Unavailable"; + } + } else { + return getFormattedKernelVersion(); + } + } + /** * Returns " (ENGINEERING)" if the msv file has a zero value, else returns "". * @return a string to append to the model number description. diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java old mode 100755 new mode 100644 index 9608daad70e9362546d8517a846b29602fda95e0..873d39252339a0e891998cbcb5c9d7283e898c2f --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java @@ -116,7 +116,11 @@ public final class A2dpProfile implements LocalBluetoothProfile { List sinks = getConnectedDevices(); if (sinks != null) { for (BluetoothDevice sink : sinks) { - mService.disconnect(sink); + if (sink.equals(device)) { + // Connect to same device, Ignore it + Log.d(TAG,"Not disconnecting device = " + sink); + return true; + } } } return mService.connect(device); @@ -124,18 +128,36 @@ public final class A2dpProfile implements LocalBluetoothProfile { public boolean disconnect(BluetoothDevice device) { if (mService == null) return false; - // Downgrade priority as user is disconnecting the headset. - if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON){ - mService.setPriority(device, BluetoothProfile.PRIORITY_ON); + List deviceList = mService.getConnectedDevices(); + if (!deviceList.isEmpty()) { + for (BluetoothDevice dev : deviceList) { + if (dev.equals(device)) { + if (V) Log.d(TAG,"Downgrade priority as user" + + "is disconnecting the headset"); + // Downgrade priority as user is disconnecting the headset. + if (mService.getPriority(device) > BluetoothProfile.PRIORITY_ON) { + mService.setPriority(device, BluetoothProfile.PRIORITY_ON); + } + return mService.disconnect(device); + } + } } - return mService.disconnect(device); + return false; } public int getConnectionStatus(BluetoothDevice device) { if (mService == null) { return BluetoothProfile.STATE_DISCONNECTED; } - return mService.getConnectionState(device); + List deviceList = mService.getConnectedDevices(); + if (!deviceList.isEmpty()) { + for (BluetoothDevice dev : deviceList) { + if (dev.equals(device)) { + return mService.getConnectionState(device); + } + } + } + return BluetoothProfile.STATE_DISCONNECTED; } public boolean isPreferred(BluetoothDevice device) { diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index 4bcbea76f134c9e518059abcd22d862e986e65f2..8dc48b3394c76fdde1f9e3c5c7791b25a2bcf3cc 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -196,6 +196,8 @@ public final class BluetoothEventManager { cachedDevice = mDeviceManager.addDevice(mLocalAdapter, mProfileManager, device); Log.d(TAG, "DeviceFoundHandler created new CachedBluetoothDevice: " + cachedDevice); + // callback to UI to create Preference for new device + dispatchDeviceAdded(cachedDevice); } cachedDevice.setRssi(rssi); cachedDevice.setBtClass(btClass); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index c0757035ffb3d45e5f316def088879781752bf63..0709942d953951f179e66831ee378a2f2f4b5c91 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -135,6 +135,8 @@ public final class CachedBluetoothDevice implements Comparable mPrevProfiles = + new ArrayList(); + mPrevProfiles.clear(); + mPrevProfiles.addAll(mProfiles); updateProfiles(); + /* + * Check if new profiles are added + */ + if ((mPrevProfiles.containsAll(mProfiles)) && (!mPrevProfiles.isEmpty())) { + Log.d(TAG,"UUID not udpated, returning"); + mProfiles.clear(); + mProfiles.addAll(mPrevProfiles); + return; + } + for (int i = 0; i= 0; i--) { CachedBluetoothDevice cachedDevice = mCachedDevices.get(i); - if (cachedDevice.getBondState() != BluetoothDevice.BOND_BONDED) { + if (cachedDevice.getBondState() == BluetoothDevice.BOND_NONE) { mCachedDevices.remove(i); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/DunServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/DunServerProfile.java new file mode 100644 index 0000000000000000000000000000000000000000..3c7292708aa9bbeecfeb000d71fa0fb083153ece --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/DunServerProfile.java @@ -0,0 +1,162 @@ +/* +*Copyright (c) 2013, 2015, The Linux Foundation. All rights reserved. +* +*Redistribution and use in source and binary forms, with or without +*modification, are permitted provided that the following conditions are +*met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +*THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +*WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +*MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +*ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +*BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +*CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +*SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +*WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +*OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +*IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +package com.android.settingslib.bluetooth; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothDun; +import android.bluetooth.BluetoothProfile; +import android.content.Context; +import android.util.Log; +import java.util.HashMap; +import java.util.List; + +import com.android.settingslib.R; + +/** + * DunServerProfile handles Bluetooth DUN server profile. + */ +final class DunServerProfile implements LocalBluetoothProfile { + private static final String TAG = "DunServerProfile"; + private static boolean V = true; + + private BluetoothDun mService; + private boolean mIsProfileReady; + + static final String NAME = "DUN Server"; + + // Order of this profile in device profiles list + private static final int ORDINAL = 11; + + // These callbacks run on the main thread. + private final class DunServiceListener + implements BluetoothProfile.ServiceListener { + + public void onServiceConnected(int profile, BluetoothProfile proxy) { + if (V) Log.d(TAG,"Bluetooth service connected"); + mService = (BluetoothDun) proxy; + mIsProfileReady = true; + } + + public void onServiceDisconnected(int profile) { + if (V) Log.d(TAG,"Bluetooth service disconnected"); + mIsProfileReady = false; + } + } + + public boolean isProfileReady() { + return mIsProfileReady; + } + + DunServerProfile(Context context) { + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + adapter.getProfileProxy(context, new DunServiceListener(), + BluetoothProfile.DUN); + } + + public boolean isConnectable() { + return true; + } + + public boolean isAutoConnectable() { + return false; + } + + public boolean connect(BluetoothDevice device) { + return false; + } + + public boolean disconnect(BluetoothDevice device) { + if (mService == null) return false; + return mService.disconnect(device); + } + + public int getConnectionStatus(BluetoothDevice device) { + if (mService == null) { + return BluetoothProfile.STATE_DISCONNECTED; + } + return mService.getConnectionState(device); + } + + public boolean isPreferred(BluetoothDevice device) { + return true; + } + + public int getPreferred(BluetoothDevice device) { + return -1; + } + + public void setPreferred(BluetoothDevice device, boolean preferred) { + // ignore: isPreferred is always true for DUN + } + + public String toString() { + return NAME; + } + + public int getOrdinal() { + return ORDINAL; + } + + public int getNameResource(BluetoothDevice device) { + return R.string.bluetooth_profile_dun; + } + + public int getSummaryResourceForDevice(BluetoothDevice device) { + int state = getConnectionStatus(device); + switch (state) { + case BluetoothProfile.STATE_DISCONNECTED: + return R.string.bluetooth_dun_profile_summary_use_for; + + case BluetoothProfile.STATE_CONNECTED: + return R.string.bluetooth_dun_profile_summary_connected; + default: + return Utils.getConnectionStateSummary(state); + } + } + + public int getDrawableResource(BluetoothClass btClass) { + return R.drawable.ic_bt_network_pan; + } + + protected void finalize() { + if (V) Log.d(TAG, "finalize()"); + if (mService != null) { + try { + BluetoothAdapter.getDefaultAdapter().closeProfileProxy + (BluetoothProfile.DUN, mService); + mService = null; + } catch (Throwable t) { + Log.w(TAG, "Error cleaning up DUN proxy", t); + } + } + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java index 5529866c83a8f610708be2ebebd0ff0969ab2a16..6e1d4f0bea8d605654b6ef096d2f92a61a8839bd 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java @@ -115,7 +115,11 @@ public final class HeadsetProfile implements LocalBluetoothProfile { List sinks = mService.getConnectedDevices(); if (sinks != null) { for (BluetoothDevice sink : sinks) { - Log.d(TAG,"Not disconnecting device = " + sink); + if (sink.equals(device)) { + // Connect to same device, Ignore it + Log.d(TAG,"Not disconnecting device = " + sink); + return true; + } } } return mService.connect(device); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java old mode 100755 new mode 100644 index 7f0e27a96c0aa9aafc718f5acca827f7cc8dfc6a..fb74850b17ec164153d42576c3c79168fa3e3769 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfileManager.java @@ -25,6 +25,8 @@ import android.bluetooth.BluetoothMap; import android.bluetooth.BluetoothInputDevice; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothPbapClient; +import android.bluetooth.BluetoothDun; +import android.bluetooth.BluetoothPbap; import android.bluetooth.BluetoothProfile; import android.bluetooth.BluetoothUuid; import android.content.Context; @@ -36,6 +38,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import android.os.SystemProperties; /** * LocalBluetoothProfileManager provides access to the LocalBluetoothProfile @@ -85,6 +88,7 @@ public final class LocalBluetoothProfileManager { private OppProfile mOppProfile; private final PanProfile mPanProfile; private PbapClientProfile mPbapClientProfile; + private DunServerProfile mDunProfile; private final PbapServerProfile mPbapProfile; private final boolean mUsePbapPce; @@ -130,9 +134,17 @@ public final class LocalBluetoothProfileManager { addProfile(mMapProfile, MapProfile.NAME, BluetoothMap.ACTION_CONNECTION_STATE_CHANGED); - //Create PBAP server profile, but do not add it to list of profiles - // as we do not need to monitor the profile as part of profile list + // enable DUN only if the property is set + if (SystemProperties.getBoolean("ro.bluetooth.dun", false) == true) { + mDunProfile = new DunServerProfile(context); + addProfile(mDunProfile, DunServerProfile.NAME, + BluetoothDun.ACTION_CONNECTION_STATE_CHANGED); + } + + //Create PBAP server profile mPbapProfile = new PbapServerProfile(context); + addProfile(mPbapProfile, PbapServerProfile.NAME, + BluetoothPbap.PBAP_STATE_CHANGED_ACTION); if (DEBUG) Log.d(TAG, "LocalBluetoothProfileManager construction complete"); } @@ -472,6 +484,13 @@ public final class LocalBluetoothProfileManager { removedProfiles.add(mPbapProfile); } + if ((mPbapProfile != null) && + (mPbapProfile.getConnectionStatus(device) == BluetoothProfile.STATE_CONNECTED)) { + profiles.add(mPbapProfile); + removedProfiles.remove(mPbapProfile); + mPbapProfile.setPreferred(device, true); + } + if (DEBUG) { Log.d(TAG,"New Profiles" + profiles.toString()); } diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml index eb44f648419f365a5bf3cec2426b0fd6b9af32db..2e72738965bf866c7b291ebb6458d71af6379d4f 100644 --- a/packages/SettingsProvider/res/values/defaults.xml +++ b/packages/SettingsProvider/res/values/defaults.xml @@ -227,4 +227,78 @@ 0 + + false + + + 5 + + + 11 + + + 4 + + + 6 + + + 5 + + + 5 + + + 11 + + + 4 + + + 6 + + + 5 + + + 5 + + + 11 + + + 4 + + + 6 + + + 5 + + + 4 + + + + + + + + + 0 + + + + + + + diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java index 3ccd3fff72ea0efcd296d115f3594249ea8e1023..79ece77b20d0b8ab1201551fb4b203da414929fd 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java @@ -40,6 +40,7 @@ import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Global; import android.provider.Settings.Secure; +import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; @@ -2619,6 +2620,13 @@ class DatabaseHelper extends SQLiteOpenHelper { SystemProperties.get("ro.com.android.dataroaming", "false")) ? 1 : 0); + int phoneCount = TelephonyManager.getDefault().getPhoneCount(); + for (int phoneId = 0; phoneId < phoneCount; phoneId++) { + loadSetting(stmt, Settings.Global.DATA_ROAMING + phoneId, + "true".equalsIgnoreCase(SystemProperties.get( + "ro.com.android.dataroaming", "true")) ? 1 : 0); + } + loadBooleanSetting(stmt, Settings.Global.DEVICE_PROVISIONED, R.bool.def_device_provisioned); @@ -2642,6 +2650,14 @@ class DatabaseHelper extends SQLiteOpenHelper { SystemProperties.get("ro.com.android.mobiledata", "true")) ? 1 : 0); + // SUB specific flags for Multisim devices + for (int phoneId = 0; phoneId < phoneCount; phoneId++) { + // Mobile Data default, based on build + loadSetting(stmt, Settings.Global.MOBILE_DATA + phoneId, + "true".equalsIgnoreCase(SystemProperties.get( + "ro.com.android.mobiledata", "true")) ? 1 : 0); + } + loadBooleanSetting(stmt, Settings.Global.NETSTATS_ENABLED, R.bool.def_netstats_enabled); @@ -2691,13 +2707,24 @@ class DatabaseHelper extends SQLiteOpenHelper { loadSetting(stmt, Settings.Global.CALL_AUTO_RETRY, 0); // Set the preferred network mode to target desired value or Default - // value defined in RILConstants - int type; - type = RILConstants.PREFERRED_NETWORK_MODE; - loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, type); + // value defined in system property + String val = ""; + String mode = ""; + for (int phoneId = 0; phoneId < phoneCount; phoneId++) { + mode = TelephonyManager.getTelephonyProperty(phoneId, + "ro.telephony.default_network", + Integer.toString(RILConstants.NETWORK_MODE_GSM_ONLY)); + if (phoneId == 0) { + val = mode; + } else { + val = val + "," + mode; + } + } + loadSetting(stmt, Settings.Global.PREFERRED_NETWORK_MODE, val); // Set the preferred cdma subscription source to target desired value or default // value defined in CdmaSubscriptionSourceManager + int type; type = SystemProperties.getInt("ro.telephony.default_cdma_sub", CdmaSubscriptionSourceManager.PREFERRED_CDMA_SUBSCRIPTION); loadSetting(stmt, Settings.Global.CDMA_SUBSCRIPTION_MODE, type); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 774be60d082a1d7950243586019579227245c9c6..76b81ade1159855654fdb87d16f8dd62cdbded27 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -129,6 +129,11 @@ public class SettingsProvider extends ContentProvider { private static final String TABLE_BOOKMARKS = "bookmarks"; private static final String TABLE_ANDROID_METADATA = "android_metadata"; + private static final String HEADSET = "_headset"; + private static final String HEADPHONE = "_headphone"; + private static final String SPEAKER = "_speaker"; + private static final String EARPIECE = "_earpiece"; + // The set of removed legacy tables. private static final Set REMOVED_LEGACY_TABLES = new ArraySet<>(); static { @@ -2144,6 +2149,139 @@ public class SettingsProvider extends ContentProvider { return getSettingsLocked(SETTINGS_TYPE_SYSTEM, userId); } + private void loadCustomizedVolumeLevels(SettingsState systemSettings) { + + systemSettings.updateSettingLocked(Settings.System.VOLUME_MUSIC, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_music_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.updateSettingLocked(Settings.System.VOLUME_RING, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_ringtone_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.updateSettingLocked(Settings.System.VOLUME_VOICE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_voice_call_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.updateSettingLocked(Settings.System.VOLUME_ALARM, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_alarm_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.updateSettingLocked(Settings.System.VOLUME_NOTIFICATION, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_notification_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + // set headset default volume + systemSettings.insertSettingLocked(Settings.System.VOLUME_MUSIC + HEADSET, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_music_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_RING + HEADSET, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_ringtone_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_VOICE + HEADSET, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_voice_call_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_ALARM + HEADSET, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_alarm_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_NOTIFICATION + HEADSET, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_notification_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + // set headphone default volume + systemSettings.insertSettingLocked(Settings.System.VOLUME_MUSIC + HEADPHONE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_music_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_RING + HEADPHONE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_ringtone_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_VOICE + HEADPHONE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_voice_call_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_ALARM + HEADPHONE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_alarm_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_NOTIFICATION + HEADPHONE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_notification_headset_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + // set speaker default volume + systemSettings.insertSettingLocked(Settings.System.VOLUME_MUSIC + SPEAKER, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_music_speaker_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_RING + SPEAKER, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_ringtone_speaker_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_VOICE + SPEAKER, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_voice_call_speaker_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_ALARM + SPEAKER, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_alarm_speaker_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + systemSettings.insertSettingLocked(Settings.System.VOLUME_NOTIFICATION + SPEAKER, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_notification_speaker_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + + // set earpiece default volume + systemSettings.insertSettingLocked(Settings.System.VOLUME_VOICE + EARPIECE, + Integer.toString( + getContext().getResources().getInteger( + R.integer.def_voice_call_earpiece_volume)), + SettingsState.SYSTEM_PACKAGE_NAME); + } + /** * You must perform all necessary mutations to bring the settings * for this user from the old to the new version. When you add a new @@ -2224,6 +2362,60 @@ public class SettingsProvider extends ContentProvider { defaultComponent, SettingsState.SYSTEM_PACKAGE_NAME); } + + // Allow OEMs to set volumes in resources. + if (getContext().getResources().getBoolean(R.bool.def_custom_sys_volume)) { + final SettingsState systemSettings = getSystemSettingsLocked(userId); + loadCustomizedVolumeLevels(systemSettings); + } + // Allow OEMs to set date format, time format and enable/disable accessibility + // services in resource. + final SettingsState dateAndTimeSettings = getSystemSettingsLocked(userId); + String defaultStringComponent; + int defaultIntComponent; + defaultStringComponent = getContext().getResources().getString( + R.string.def_date_format); + if (!TextUtils.isEmpty(defaultStringComponent)) { + dateAndTimeSettings.insertSettingLocked(Settings.System.DATE_FORMAT, + defaultStringComponent,SettingsState.SYSTEM_PACKAGE_NAME); + } + defaultStringComponent = getContext().getResources().getString( + R.string.def_time_format); + if (!TextUtils.isEmpty(defaultStringComponent)) { + dateAndTimeSettings.insertSettingLocked(Settings.System.TIME_12_24, + defaultStringComponent,SettingsState.SYSTEM_PACKAGE_NAME); + } + defaultIntComponent = getContext().getResources().getInteger( + R.integer.def_enable_accessibility); + if (defaultIntComponent != 0) { + secureSettings.insertSettingLocked(Settings.Secure.ACCESSIBILITY_ENABLED, + String.valueOf(defaultIntComponent), SettingsState.SYSTEM_PACKAGE_NAME); + } + defaultStringComponent = getContext().getResources().getString( + R.string.def_enable_accessibility_services); + if (!TextUtils.isEmpty(defaultStringComponent)) { + secureSettings.insertSettingLocked(Settings.Secure. + ENABLED_ACCESSIBILITY_SERVICES,defaultStringComponent, + SettingsState.SYSTEM_PACKAGE_NAME); + } + // Allow openmarket OEMs to set default customized + defaultComponent + = getContext().getResources().getString(R.string.def_input_method); + if (!TextUtils.isEmpty(defaultComponent)) { + secureSettings.insertSettingLocked( + Settings.Secure.DEFAULT_INPUT_METHOD, + defaultComponent, + SettingsState.SYSTEM_PACKAGE_NAME); + } + + defaultComponent = getContext().getResources() + .getString(R.string.def_enable_input_methods); + if (!TextUtils.isEmpty(defaultComponent)) { + secureSettings.insertSettingLocked( + Settings.Secure.ENABLED_INPUT_METHODS, + defaultComponent, + SettingsState.SYSTEM_PACKAGE_NAME); + } currentVersion = 122; } diff --git a/packages/SharedStorageBackup/src/com/android/sharedstoragebackup/SharedStorageAgent.java b/packages/SharedStorageBackup/src/com/android/sharedstoragebackup/SharedStorageAgent.java old mode 100644 new mode 100755 index e453cf53a98b5ca0a48850dc334af7cc983bd9b9..2713e54404b966641ca858a7b703ad749adaae49 --- a/packages/SharedStorageBackup/src/com/android/sharedstoragebackup/SharedStorageAgent.java +++ b/packages/SharedStorageBackup/src/com/android/sharedstoragebackup/SharedStorageAgent.java @@ -13,6 +13,9 @@ import android.util.Slog; import java.io.File; import java.io.IOException; +import android.os.SystemProperties; +import android.content.Intent; +import android.net.Uri; public class SharedStorageAgent extends FullBackupAgent { static final String TAG = "SharedStorageAgent"; @@ -93,5 +96,13 @@ public class SharedStorageAgent extends FullBackupAgent { } FullBackup.restoreFile(data, size, type, -1, mtime, outFile); + if (isStrictOpEnable()) { + getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, + Uri.fromFile(outFile))); + } + } + + private boolean isStrictOpEnable() { + return SystemProperties.getBoolean("persist.sys.strict_op_enable", false); } } diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png new file mode 100755 index 0000000000000000000000000000000000000000..551c67258e3acf5c3a2718401f5440f8b0edabca Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..aee2cf25e9432c4f1cc4b10827a862dd1aa3a7e5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..28bdabb4191161c591b3ad4c3d76caab098c2ed9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png new file mode 100755 index 0000000000000000000000000000000000000000..a6d46728e2a0bc13357ec42778d944a30e0d6167 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png new file mode 100755 index 0000000000000000000000000000000000000000..c9a6c8e60edadf75ea3e616ed24687148bccc10f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png new file mode 100755 index 0000000000000000000000000000000000000000..83aa3c74317c8126f8ac8d724cd7627738230f08 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..7f86ac3d989de68900a09e7b42cfcf412932911e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..46dc18bbcc0618c3a2ea022a597ed79969bc502b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..818e29230fc3b5ede6e6a8bab18462cce7a0c062 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..95866b12e6114233419d7a767a7cb9a6e6082156 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1aea612799086c9eaa951b7fc46dd0bd9bceee0f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_e.png new file mode 100644 index 0000000000000000000000000000000000000000..016b30b079acc6fbbed7da2324bb87cc389f4078 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ec672eb118e554d831d3c4785d9670f4831e3d9c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_h.png new file mode 100644 index 0000000000000000000000000000000000000000..27bab73745ae80c1cec9e5be9370c0b5535f3720 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_idle_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..66fb60e90364dfec4e3dd567124a722d365ba9be Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..07ea499fb741cd9e72dc4e2f402305f688c27c32 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..879c703f7b1f931614cfd0998a7a0248f28ebe13 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png new file mode 100644 index 0000000000000000000000000000000000000000..e39767a6dad1ea5df1635066fadd6dd7bfbba68e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png new file mode 100644 index 0000000000000000000000000000000000000000..47c1fca332372074967abcd7b30d334d39f0adc4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ac80dceeca9f84bee619d3c3eaab3ef420fe8d60 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..c5edf2c19e3f6601e3652d2cf59587149fa3372d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef47018993e97e143e6d965e05556038381d51b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ed02984ef85c950a733aaabd4c070e58bf8dc28d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f88091b59ffa5b50fccb9b3dd191101b8529c429 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..95bb3cd92510176e8beb5ff0bb4d566ca4924f92 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_g.png new file mode 100644 index 0000000000000000000000000000000000000000..31b926bd2f04962eacb1aa729a88b7ea4bbf8982 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inout_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ee5b08ed66098342239e1ad7fff7de5b995c235 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..cac78027f5748a19e1eb635bb4c5884c237757d3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf88bedb964135e532186c00b1261a08e3180b1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png new file mode 100644 index 0000000000000000000000000000000000000000..df6e1952b1caeab5680b8b74368acdb85fb2adb5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2f867ece4f1034da24a8a3a7c157cb37a2a79d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png new file mode 100644 index 0000000000000000000000000000000000000000..2b4628fcf78b941b265b7c91aad8cb4119a9d018 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim1_new.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim1_new.png new file mode 100644 index 0000000000000000000000000000000000000000..16f8254aec38c7afde233c23c9bc5af36d25e821 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim1_new.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim2_new.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim2_new.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ddcd7225df35d91a0700453be74911a432cc5d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim2_new.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim_1.png new file mode 100644 index 0000000000000000000000000000000000000000..fbcf293f3a018f1ef0dfaeb26198f08c2f029dc8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim_1.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..453cffb3ea7e558901d3e29f1e1f6f412dc1c427 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1a23e4efa542e9277b153c67c7eaf772718de9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..a43d8830f3684f0e9c40e5677444d88c69e78440 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2c611e9da0dfa00a11f67b64aa79a235899a29 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..badc93d0241563800f8cfa76d7a1a465802cbdd1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..af716004b0b327c238a2d032f648c54a172b2d7e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..24be33636680b5ce45b9b0ed65c39373fed1796f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5bb799fdabbfa63e90db6a47248f5ac3a6863e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..a1102d66787d4f736c4f25bd14700522c375165b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..cee81b37c0bf722208ace1d9b872dbd23f697661 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..453cffb3ea7e558901d3e29f1e1f6f412dc1c427 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..76bf51c52e85392b23862db1caf3d4d59bf9f9b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..a43d8830f3684f0e9c40e5677444d88c69e78440 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2c611e9da0dfa00a11f67b64aa79a235899a29 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..8f536d9b81adf905f36f2a69f4833fed161863e3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..af716004b0b327c238a2d032f648c54a172b2d7e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..222a65ff1bdcfd9550c76d44e28295a8a4a0f98a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5bb799fdabbfa63e90db6a47248f5ac3a6863e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..a1102d66787d4f736c4f25bd14700522c375165b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..42c2b3c1fa2af6baa52c1e3158689fd780888d16 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..6a34d7c0d516938897c030732979cd4ecbafe550 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc30ee90cc92e89908cfdcee20b5b4f2f7d5073 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6ff777ab28ef1128521e33d834ac7e51396b7a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..477dd57aa48560c798a2a9a55c8904802dd44f0b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..94dfff0c827e51327cc25b2aadc68b71d519c055 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..d1bfb5e167e69e8575426b767209199268bb05a8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..40c09721319c8d57e4b68df0bc7f72cf27abc4da Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..52c01e00a08e7fab6adc63c08c0659f1b555da2c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..13e1dadf816e82070e8e0e9f733d5bc77814d665 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ab40c2f2d87d96cf31f249c38fa88f92b2c4079e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f9adf5e46790d5ed5bfb842171fcba2501ff134d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..74c614ccf5e0bcfefff162aa5b5d160ca36ce9de Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb8c27f4b88c4aa8fef907a53e2a6eba83d1ac5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d44dcd08e6ae7855e476b5ae0895f7aec7532 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..3130da3c994b6a1cd8c7b4f17fa591075d79b10b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..70b639a7fb091916aff3b40fdb046f15753f38fd Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..8a267f0112286108e98689460013a5b9c14c60f2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..5ed531067348eccf4558e9b7fc3661c0a4dc4e45 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..7f919e952c6cdc5e6c545141222790c2108b1002 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b3f07ba8725ee1be911731abd7a2e1a39eae5906 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_1_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..3de1d955c2a20ea66f8a02658aa462a6211e5888 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..046714bdd11d918c14cd6fdafb92e45418b1c9ca Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..83305772e3bcc924824947c1d03d7bd343d18fe8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..261644a5eb7e046f5d94cabb4ea81ad59c2247d3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..acf7cfe57ec80c4bd72ea452b2775bfb889750d2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f84cd0a40b03f40d6f5dfbf41e851bac6b175869 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..55f57d6fa88a726d3ee06cb87abdb90e625574a0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..0f67463aea94cc9e7433a9ffbb8011e9ffe111d6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab998bd2e3ed3cf947263f3d8e0eddd758676e3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..659efb4877213fcfa126b873baeaf573ded428ea Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f7bfe98fd045c7b9f94f77ce11a6d57dbe9b0b3b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..2135915a2d4fbb084d69fd66fa6f935521bb4db9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..69e649f3571694e65a7968872c3952988ab64e81 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..30fc05b20695a6cbed54e0adb322c1ab8077ca61 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..aed81791eee42765a6f83575b7ac62613b5eb197 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..617af25ae1a1cc6342b030cf6682798695532928 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..33c4abdc300f23cd2985a3a33b25b369bbc391ad Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..6eee46540da70ed863b49717364c3e85ef2d20d1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..4fea813b1b1ddff54909ba8e1204f7bcef4468a4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..e76c53f7a368abbaa916b761a297c5c4a80fad82 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..bb7bc97f16285781b38c391451465e456f667ac1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..97120a9efe77e22adb0f69756b0d10c1807ea425 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..7e1c0618d68dfe3b37a2bcc5885335e78905a358 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..2992e5c4156f52c6c6629a1fab221f18be16e5c4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ceb1c2c10184bac9c75c50296e666c601522be8c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..e98751c7527a5ca68b2e3a117d0216e9588a43ee Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..f3419fd7b89cb26d68b92278a54ce696f63fc7d4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..262eda94bb033581bb5608254eca21128f095d91 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..cda6d0a06818ce540daa98f6e5825f68ecc5cd9f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a0a601d2ba0ea9e0834b1efc122078b29f0cd9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..e9fd96af3c0a4ec3d7e5ed527a980cb5430a5f66 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ca418cae77e16b6c13081d59343c549329241df2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2152119d93875c1e8caecb5997be5cbd4bf91b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ad3f81c016454444e42fe934cc84f47ad3520a54 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a71911a32917b71b928206242c7598295986e3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..44284d83c0c2c82ac24b603b13e859cc1fd888ff Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c6c32031dc955f286218bb237d2d712cc12900 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..429253844f30e379f52b03a9df1f7bf9a9cb7943 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..65c0e2da46ec5a3d0df8d3f2f0ce016909022e7c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf6790e11c5652676ac08b56398021baeac8b14 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..7993fc24bcf7db4a43e665d7cba37730184fc19a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..849796a846dc24a3f1d2a466b2f398ffa8fbadb5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..0eae5efc86894a6860a0acf04bb50f2c6bbe4ed1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e7894dc632ade35cd179e0448fecb56a683bc836 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..0d55f93cbfc2cc89fdb75fd589713397d81569d0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..a21eb1d7b803da70ad6f6634f254ae284172a357 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..012eb8a363780b38225ec39a25a2973c6dc55fcf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..cd37c329283952536ad91da42ae7852aabd2c13f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..1d77c307aa651b71387790f6e8323ac83dca9f60 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..978c284c55943a28f60af4912d9d7c3d28b3906c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..aba3a69d2c63df823cce48ef24d494c1036bc5a9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee0c634990073d165d5e7c67be6662dbcc78dc2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ad17c6115e72cf506eecb5e9ce0fb7acfae17762 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9d710b1a94ef87e4535fc1415c3dd66adee8eaa1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..73c369ff46a463012130d66d2f718e247bfbfbf4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..06416c3a309eea9ca59790a206e2947fb1f91f35 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..247978347aeada8f28a8517eb81192babe6a33bf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..61f6a884628b16b4108dce5c2fcc98e4b955cedc Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e4441e38caad0e9bf8c5160297dcda7c4586a269 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..8503fbfa901c4e1ec3a8c4f3050acd0807553930 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..e75b98f3a1fc85965d60f9457f3307a71d980a79 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..e75b98f3a1fc85965d60f9457f3307a71d980a79 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5b074682bab83d16f384f037114d49c50afb7b22 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only.png new file mode 100644 index 0000000000000000000000000000000000000000..b93b0a02528efe7ab884af0ae696120399b07dbb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..b93b0a02528efe7ab884af0ae696120399b07dbb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5103f77214884dd3f2569b545c61917bf9b7badf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5103f77214884dd3f2569b545c61917bf9b7badf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_only_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5b074682bab83d16f384f037114d49c50afb7b22 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_1x_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..79aabb75cfa843de4fe3c96729b82e523fdd1a82 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..750b8db42c7af8ee27b088e8e9c5f21fd1d452b9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..e9236b050d57f7a7e47e380ce39e58e472083aec Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3cf236d8b463446c3e7368532fad48089e9921e3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..9550ab5ad4bd72d00c6624081f65738ec5c344f7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..6339bc37783fab966741930c0e91256d230897bb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_2g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..e11d0b1dc8f5e422c7876d484b280e2bd780e459 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..bb68877e28e52baa7881c8f556b67fad940a4f12 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..bb68877e28e52baa7881c8f556b67fad940a4f12 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..917f6cf9e8a8c27c6db5aca531c1283f258e3bfb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..917f6cf9e8a8c27c6db5aca531c1283f258e3bfb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..e11d0b1dc8f5e422c7876d484b280e2bd780e459 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..bd76da867e3d5b0110e7514f69387eaa759ffd8e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..bd76da867e3d5b0110e7514f69387eaa759ffd8e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_3g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..f5f74f925a2d880bf99fbfd822283fc91a449c13 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..a33ac2ee62810fef4aff5d1b4f7dfc0cf2d11b29 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..f572200aa565bdbf59809f34d17134c9c48e8755 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..44736da6935766649c4e5f5a31ed2df593625fa9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c09a1c023328f6b1046795b371a22824919e8b12 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..d5c25b3d551c03167d905aef44b92a4ac35e6948 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..fb6cd9d2fd6b62c4a20463daf772118c58442045 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..fb6cd9d2fd6b62c4a20463daf772118c58442045 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e.png new file mode 100755 index 0000000000000000000000000000000000000000..651b1ad07875b8257a070ab86dbfe9ca53850853 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..71059aa310e8161cb13da0bade4b31c82ddbd578 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ac814fdaea4e546217dd1668130677245e28e843 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..e8826aa61d53533160140870ac087b28c16c551c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..8276cc945ba7c9ef3812f634fbce340cf8583d4b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..68c871a8c0f75a2812bc113b4e4fa8f95a24739b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..189c78ab08b5d16081226ec339efc1d78726e4bf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f889b570ec6b4309d09150f967a93fd7034547 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..11e32c07f680de52976f509b5cbf5447bfc34e19 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..15edf6703425cde443e0707afd9f4568907a6910 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e17d4580a2ef2f1db990dea62bf1bb0b5439b644 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..36b847ea7362c182cf1f3c5b1b998cb6fc04f914 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..7e43f762194a913dc4b7ca879ab1aed0f58636bb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..63fe13d87f03ecbdbedcb8fb4884cc8f424aba35 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3145814c2b41864de1f8e2773b7511b7ee4f006a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..3145814c2b41864de1f8e2773b7511b7ee4f006a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..106e546b75f90ac037ce2c73ddfcdacceb3431e1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..106e546b75f90ac037ce2c73ddfcdacceb3431e1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..2a56bce6fd5d96bf324f749567107e65b7a8255f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..415658bdb5298320a1f3243e875ec2c80f921243 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..8276cc945ba7c9ef3812f634fbce340cf8583d4b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..80dcbe27916cc0a32f43779f2fb9839531da4c7e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..189c78ab08b5d16081226ec339efc1d78726e4bf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f889b570ec6b4309d09150f967a93fd7034547 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..abd7f922f1b5a802f1cdc0a732d0d2cf2ebeb97a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..15edf6703425cde443e0707afd9f4568907a6910 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..386a1aceddba49608eaa684ebe8100fda889397e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..36b847ea7362c182cf1f3c5b1b998cb6fc04f914 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..7e43f762194a913dc4b7ca879ab1aed0f58636bb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..c9daf031a153eb85d9c3350d06653c392afc4053 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png new file mode 100755 index 0000000000000000000000000000000000000000..fd8d2f28dc003e6f56a4dcc47c69b564cc309d60 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..cb12346aad4b4b7c845624b90176cc470b1e61a5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..5714b95864ef2113dc5e7c02ffcfba1807b15e77 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8271c556bba2e00031495aaf8505c13cc1957d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only.png new file mode 100644 index 0000000000000000000000000000000000000000..e40825e27293c78e63d3a0077b697c0d59efb07d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..a69eca45851d9f3c5670c9bc52aa1334cc44b2b8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..022ec4a60a17a247309c96e5ad9d3c9a6d8b0758 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbf43224f1287604854359870e6533fb91ff484 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_only_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4ce76e1ed3a79790adc7b91b142ecdffb864ca Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_1x_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..87844527441fe54b092fd4594f5b5aaf1ba049fb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..8bd678690122528e73325e2366bae20e502a203f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..38f5704395038092eccdef7652ac85a6e1366195 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..48f1af95c79532a8951394c54f8aff48cf2299b5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..d82154934f1d054d87c85d565559a3b7f25a7800 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..e201a00f7fbb22a6b9ecce3a1dc63e2ab6f1c795 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_2g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..368ada3b135d72313bd572e9d068cfab6856792d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd8efb16795c26a03064b9aa8b24b04ee92ef85 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..f36be76852489ba45ef2c55bcfcf43dbbf2eafb6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..55a7b405c474e47e62c27c837b6553e58bd6f72b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..daed7823bb8c5c79d1d89dea9f6048a44d4ab410 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..bf644deadb55167ffd7add5891604f0183f28daa Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..a0004f042b750811c8bbcb77c971756210ea6e4a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..eed77ab60a4ba03872da30086b7e22aa2d0f142f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_3g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..c7d855e15c6c53987509d073675e64d2352519f4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..42ba3f9b60469822038422ce3ee831aeecd3b858 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..009fd7d365e33916ed86b3b45a01e922c050d7c0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..d58b9a3601dd1669656c422e2128815315b45487 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3ae325b4330096a82e0831c7ae7977a3298c437e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..4ca959f74c3fb2cce58d79df974e57ec614a0ee4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..cce1bb4189468046068cc5856b04b8a861fe4b4e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..41791cb361da5d30e8da604ec8ac70f5f99f318c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e.png new file mode 100755 index 0000000000000000000000000000000000000000..660842f7d60890adf30ecf135d536e09b963d3c2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..da72330b2150c7ada94974cd25f8bb80a5024b97 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..be05ea644bb591e2752df66a5822ab06869812d9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..cb3ec07f5158d78d18c1599e04349ef55402bec0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4e72bd3c23f4f01381667ccc63056b6ec63f74 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..f4327b89dfdeaff99a521ca20d8f22da04db2499 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4e528bcdd4766c3c27ed69ac76459ef9aee516 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..939ae38a33518e6aba5949070cfc0cb80a5294df Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb531ea99777ccee2d9a8bcc2d6408b7eb4ffc1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee5d1ee39b9366e2e03b52ee29255cdf4188425 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4769a084f4713e049f51f9b1ca1cde65c45679 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc60e83dbd8383ac10d8abb96e5069522bd83a3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..1d4949dddefe57b62f18a3a5cb1a3b070e32ce10 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..950b936ebedcc58210d6b53b84325000ae6d1496 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..d05e974e681c6f7684928cabf758341326b7e83b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..f0656f397cb52078acc750b443b1772a3a78aab5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..49dee6d3953a553911e17d1373775de9a488ea75 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..dab2dc7f3b208f424f89201b334e63bdcbe44c23 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..16286326c39458b23c495b85d0a032cc2962a72a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..7526746b32c701ecfc19d2b520812f797c062675 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..8771fa083f9e648156c9797cbee09f48db2f7359 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..c8bdad77d8a4412e7675fbcc71a9f0607d975629 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..57038ec38a2fd834823d0a40106b00d4a2fab69e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6a51439045ea76a5c7e9ca5e7ca1e85ed66129 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..3e27781a359c3172eeb7fba5922a19eb3124fcda Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ce788e603aaa654e2abe7e1e4588a4c55cc9fc66 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e917bfda3b91415455e92442e057b6bdfde2dcf7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..99edb6a0fb8732a3094f8b03cc1540495302f0c0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9660faee2d935d8fca21d714022fecea90ba55a2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..6eaa344719bc2f686b7396819a994d2803d5ec4c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_in.png new file mode 100644 index 0000000000000000000000000000000000000000..6a16578f2bf72b91ca687d2c8d72a9177571488c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..172379308da5e2d3bee0ad8774d85073e6a682a1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_no.png new file mode 100644 index 0000000000000000000000000000000000000000..893033adea56923095f9afbb330f291fb725035a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_out.png new file mode 100644 index 0000000000000000000000000000000000000000..bef52117c65cb7542bac3dcdb1816f36a39dff0f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1x_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png new file mode 100755 index 0000000000000000000000000000000000000000..3b4aaa1c67ffd2a98e6082d5fb12a5213d7978c1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b898edfef86ccee6b72d69bb3addcf8c911e40 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..363a1a93ceb494f917656df28633d48f2bb162e2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..acd014d3e6159aca7021bb377e665f8d954337cd Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only.png new file mode 100644 index 0000000000000000000000000000000000000000..825eef48e8c2014f95dc431978ed91accf24c069 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..0696fea9e150b4f95312e89ce573b40fe0455185 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..887c6c6e757b995dcd8de0bbea5d173e213f6bbb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..892168722b730ffa2314b92f1da77b96f22114fc Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_only_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..ce372b73003f2e13067cfcbf652a4a84d62367b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_1x_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..7f18a2e1ff75115f931a4a4b9e9f2ed5c39027a7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..668425518b4200d58fc9031a9371e066a73722df Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..d9b7c808aabf1bb9d85b51f24bf19afd5f4def6f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..37d6b53951d0b28403b8029dff7a00f2a0e09978 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b971b3c5a9c5c11001799963ef8740ac1f891ce3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..5f41237698bfb1fa0ec9340b835a61b8485d4d5b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_2g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..e3271675e69f1fc4b2e0d55edeb141c0a4118b37 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..9cdff01612cbc389dce368845df201198beb14d8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b21d388013102b3898b797a133ec7abeefaaaa Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..05068b2938e2dabdd35c18fea3a933e7ac301e25 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..c352e4fcc28b48bb7423017d276082d01ae3848e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..4f22987e770f1d95042f1abcfe8fa2480fd31c9d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..b5760f04ca3d58f844666f6ce1b7730a331b23b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..ee1b26f5d266b5dd42dfcc9edff7377a8586b93f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_3g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..2d574bf3031796bbe9dcb53b24d065841f0a8a26 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..588b5a99871ca53da00acb9f52325c8b83782993 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..3cb4ee0965124c04b8c6cc8b8c31d1e674737d23 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..4ea7ff2e20f20302904b64027ad29f8ac078c3b3 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..e4e842c4e7f052614ff7842ec9fb3d92d4d89912 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..758fc22d512b87c947132687ea42aa5c4f55abf6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..a1f78ef27f6e9b18cc25076a3d432da798d7578e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..74d45b6bc0b32d2cabc76b67ab630c318f027026 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e.png new file mode 100755 index 0000000000000000000000000000000000000000..f314c1508f98e177e70ede55357db87b1663a941 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..b5cbd0939190d29e17173836372864a334e1ced8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..20c7362c41d5cb28e1acd2086a4535d0bc5bc6d8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..aee5871b60a2e8264de1e190cbcfb753cecdb586 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca7ff3b76d89fa45a5c2efa558ba64e41fdbf8b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..58be4c92698a1e471e550ad37fbe707505d48839 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..cf39dd5499d88b42286964f301424dbf5beb5f3e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e5a54613fa100d56f9ede591fbb205e3bd270c79 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..55949918caa9a13f30e3cee66a8eefa5e0fa302f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..d90ca3560dcb66f4f1abcfe995b96a397f658f51 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..deea9b42f652e377b816cfe8cf09c2115fc2f274 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5de5bf1b91b16f40dba74e3c6a5c81b10c1d53 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..f30da37b633015ab6f8b1fccb390ab42d4288990 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..7af7fe712c14cf6d805ddba3d8740e22e303aa7b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..54a55c61f6043b55744645d2184b90805f94395f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..91cbc6772ff3c7d6bb5bb7040d87fb40439d525e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..4820651befe12b6460702b7ceeaadfdad355eb18 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..736d41cd7b6915c1777a9d806ddabaab107bc88d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..2b82165b65cba8324f41db01112b80c90d21c954 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..91aba685b41efa82bb907ad631ed4cf81519231a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..6c20e8bc2a5f8ce5d714ad9e0be22bb378c414a2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fa22ed04121dabedeb7eef5ee0688f0c1298e6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0c5f5abae20deeb78a0993883650494454e7a4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0ee243be20cd8857f0375c2abc43826b267cc4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..5a90d1fcd38aea36bf174fc14860a55b18dc78ba Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..51074bee3bc58e7f0dde96feffb43fe41fa22653 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bf393a4e66c362b593676d43629f57f29d27b6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..31e08943df2320d2a3f67a29042cec352d8239ae Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..330aa082eaf4c6b6ceed7fffda35e8c9484c6287 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ed316f050a09ddea84f3dbb944f1e522e7142f4f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_in.png new file mode 100644 index 0000000000000000000000000000000000000000..bce78accc43ca46dd10198af24de117a58ba0860 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..3a90366fe4c9f42b4433480bcd4db90c176c46e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_no.png new file mode 100644 index 0000000000000000000000000000000000000000..49e4f0791f1b253e7984e2fa9141ef1ee58410bb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_out.png new file mode 100644 index 0000000000000000000000000000000000000000..9e45681b6fd1562232b1c2614b148b27c50fb3ce Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2g_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png new file mode 100755 index 0000000000000000000000000000000000000000..873a317c1631b993718b0bcd98bae6c625b15aa6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d7d75a7e0d25c144ce8e19a3e5ba25049d1758 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..7b34688067b456436435809de3e1b875469483e4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..08940ce6ee0acdf4103ec0ec766d1912cfc0a44f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only.png new file mode 100644 index 0000000000000000000000000000000000000000..ec12d28076906b01dd81d5d720b986f0e32e21dc Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..5235b7dc95a05cea1f9e1ce2d2d37dd52aa7b360 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5beb47c844ccecccdd021ef4c3cf05c3f4fc8a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c6f29914a287852e8b1b7e086f8c574e569fdd Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_only_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..1362fa3d33b0c1baaeaecb3ffb27c4178429da97 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_1x_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..53552e4e4da36b7af72053f2673402b2bc74a523 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..e3e8eb4cb02718bca1ad951467b9630d06f886c4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..42915954b8f2493a5afa97548abaf34f04037bff Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..19c9a3deca3515885d3bb136c4d80623885f3276 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..6119135f0755c42ff0ed96888b71a757fb9156c1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..6d08ace1312872138348f1ee285184ad755a4c57 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_2g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb640d8c50390922141ea44818ad02d12b8f4b5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..39102034e71b83287c30c73556373c4b1e857a8e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b440b202ea1106982b49f7c86c8bafc4976e12 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce09ddf38ad555c42f46a3db31a66c5c163ea85 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..9a0aabfa837e0ace705e625cf0bd72af4201129f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..fd571a06ecc578f75c5cab6b5f3d7cc1bc47e31e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..94c60c3c97472c2f430a1176c064c3295f05abf9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..9d18bf7d5ead6167542a8ab5bf8bcb772b9eff0d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_3g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..5090082386b290c5de156b22bf9c9752ba22c639 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..112011bc4cf930613ade18ec3f72a1ffe646f004 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..34d6635ada86fe79e0b9cc6763c994c85194973a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..7334cb6f067c55396cd6c0ef7d576ca9c7cf6b1e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c6e4917bc740476500d303694406dbe27fc1d745 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..5eaae02615746b9007dd8ab5c515c7d17a4426b2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ca4db23989ffbae112bf9905d3ab7aa236f0cb8a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..135a41287bc46fdbc93563eefd1c715433dbf621 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e.png new file mode 100755 index 0000000000000000000000000000000000000000..9ea742c22b7714c7ea6deed2bc648a6fa1f273f4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..d708edc2a9b19a78489cf0e3bed6cc69ac15a4eb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..6ffb0328010dc9a1d7026b904309d8eb87a80591 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..61c7e2aefa90c8a3d5c2b95a57434a1a2ca7eaa4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e83d4ed6615e8065f311830410495079f8dfa9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e49c37ca41baaec9d16fd9398b257637b0599855 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0fd9abe89e843b53e825b40ca0210764b5fa8c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..d77d3b653cb4bc4c180d6305d693fea105da965a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..52e9bb855a0d3d98a77926d094a9d4d62bd11cb9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab6e83577c56be76369776cf66c428e53255561 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ea116cd56f730522913775d4251e3ed0397a40 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..e9e8737e29357599150887f1a6a506021d875f31 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..550e4249a0d208f4e3d9e1b615d2c4a15577476b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..65d87bfb09376da9965d7850784dce05313b3f79 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g.png new file mode 100644 index 0000000000000000000000000000000000000000..05f62dc521a9916a6bb7d67bfe63e3451fcac1f7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3e1fe26e1316422be22ee0356716fff8203b6f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb62093db768538dfcdf631adf9dd7a62e8e115 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..02e605995094b83e325b2d1813a851b0dec7ffa1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..84ae508b22e680d3d93388cf6051489fdba43149 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..a141e80647603abea446031824f45107132d6a49 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..79964b37e713190996bf846bae17443e07112f80 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1efc1e64b07f9ce94cff9c839b8266fe35b81597 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..1238d36c40f11e04663928a1835dead58ec3d056 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..128e994d5b24f490d9646c0e2c1b28b180a403b9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d737b59d12f7a85e95e5651a83e306035babd2cf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..596d4c767d3353bd10cf2da1dcb70565bfa95181 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..10959856c7445bad8bc2a554992d88b94df3232e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..fb62ca99f6a8b52fdf705b87a8833ad97c91c8d7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..edc3d67d6f15bc518e27577be6d61928c68c0354 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..7da7832cde779d9e3ed45052ab4f852750f5112d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_in.png new file mode 100755 index 0000000000000000000000000000000000000000..fe25c2cc48c43a5d2a08dce581fba9c75be05d10 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_inout.png new file mode 100755 index 0000000000000000000000000000000000000000..316de0532e88fc94412fa76e04fc6173ce20624b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_no.png new file mode 100755 index 0000000000000000000000000000000000000000..5e6b81797af4ca4a5ff82368cfdd4b0cb513947e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_out.png new file mode 100755 index 0000000000000000000000000000000000000000..f001a1163f022fcfefcf4a3d7687833b6e145559 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3g_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png new file mode 100755 index 0000000000000000000000000000000000000000..d2381fcc5393d9862bf4911995cf431f42a70f2f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf9cbf7b5387d4c002d404a0323f58c30a754844 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d6f503168257e5f11997970ed153a5ccbd9408 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..3421cfa75e0fdf5affba4bb513fe50a2267566eb Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a950825e78ee1d19dd33d9e0dd7fb056822dac Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2752742d5034eb7280c448b1a51d6ecf1bedfd Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8fcfd9ae6b420444ff4994aeb9de764039183f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ab01b5998df30a445a431739d38b2c577a0eb0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_only_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..633e933d328fea44d70d5578bddd0821b464dee0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_1x_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..29d6f9d87807383333430401dc8309846f46d7d0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..761685de02e0555b8e30fb9efa70f62c0369e695 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..7f37ccfd2d1a7ae105fcd2387af2c5e5ddca780c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..dbde94f46b239457483e4dcbffa0d8684fb9f796 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..77bf21f65f329bf22ff1302d975c10597b3255f5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4076cb10529dd723684fcfa1c891dc6600fd72 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_2g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..df37519963f44271c6abd01b0bbb55bba0935e39 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default.png new file mode 100644 index 0000000000000000000000000000000000000000..a203298dd2773b00b8032ca8a2fc90e5f2610701 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..caa4a4dbabc5a68ba01c094a907b9789c0f66cf9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..d4c907ebe51200b82df698057504d475f4fd7e52 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..43fe7197fd622c43f272248e36aa77035ece7a64 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..12be96ae6d236baf752ea35fe032b07507cc80e5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..69bc10346f26378e3ffd7fc530323fdae3be9656 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5863d30513ba0aee42887cff688befd828a57a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_3g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..a3812250bd4747fe1e3730728579fddeb7a44d7f Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..b3df2c9787e3605243fdbc971b0b31f1797c6e14 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..468c0f768638df1d53cdd2fca3159d4d2b964f5b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..7332ddf73a64337466bcbce4975d704adad16a24 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..dcce91261c4a350e05684972d9a25d0251dae11a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..6d4f3578d4e1417155c8fab16cec815a4f4f9c72 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..76a1301f54ce6023faac1153448dfe88f90ca0d0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..03ff3b65e186ce808332fbd0f79075b25bd6a9cf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e.png new file mode 100755 index 0000000000000000000000000000000000000000..7d5bbfd8c5cde0772b0e357c49dcd97728279e14 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..c6657fb73fc06547bfdce34e2e7314a0576edcde Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c1e71a57cd5b045e79df8cd806eddde775d312d8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..64485e5519e6c020deb2e72f2377c7e88e41f8e8 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..76fd9895601bf646508e6b5b4f3e08c02532ce7b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd8a689347fa9a4fe7292fd4164220da1bddf22 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb5d5033db3388085dce97b09529197be2fbff9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..f1a36a323e159f74bc043a44460958aaefe5c6d6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..d33b99b1ccec7abf72b5c3292a5b32c571367673 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a662182c392e0fa96f5de74b193fc05ec1940c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..df1395d598235f35a40d0dae97ad07f2032ecadd Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..36f7b33758d31c4e2bca403fe9a0ad1726fe3a5e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..07d5e2eb110d8634002690ba44bfd1c4fdfbe809 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..51ed57e54f94e9cccf00345c5d2f61087009eaad Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce7eeb6fb4b7fc43e9438e587e794f0eb083b2e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully.png new file mode 100644 index 0000000000000000000000000000000000000000..abc5155fc94e626320c02a39f71919b7fcfb2898 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..4665f0155fe27f6562942521dc67fc217afd5153 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_roam.png new file mode 100644 index 0000000000000000000000000000000000000000..4c496a7e4b93c3b685c52864ca554ac85658e098 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..eaa6a534c26d45c511640c295440fceeed0fca19 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..c97f73828183a1a0323e98a0187e7260f6adf576 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a217ba278d38a40c87af2d2ecd85d5b0aa0df9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..2585797e40b998723c601fcd8bd62836ebaf202c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5f672d1c5c1bf9a9c6a6b062c956f3143e1f40 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..d166694dde250597fb67a3bdbc63742dd7958605 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..1ece3224249a48e576cb59deb07e03b1144f3bc9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..9d138912297d6fa89889b1478085cea9331ae390 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee5031891e5c75169522f20391a8b2120064069 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..d2058d20bf82b5f5ba3c3341f48112e1c11172f6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..b6695bf9e9982393d9593b1382ff392e6862dbd5 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_hp.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9ba0b4095d10d8bdfaa3adf0e88b07a620e5fa Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_in.png new file mode 100755 index 0000000000000000000000000000000000000000..7ccf35c00ffa2a9e0a3a6b6ec43979337ee585aa Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_inout.png new file mode 100755 index 0000000000000000000000000000000000000000..ad684092ee9aaf6c999b16a4acdf46831ecb8a26 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_no.png new file mode 100755 index 0000000000000000000000000000000000000000..854f9e35fa9d8f42afc6665d5f23f03622551f64 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_out.png new file mode 100755 index 0000000000000000000000000000000000000000..abe5ceff9c26ec684db2ebb1a541778b0bda03a9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4g_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_in.png new file mode 100644 index 0000000000000000000000000000000000000000..a037253c6290c027667532cec4c2bc1a20baa32b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..1c71f83b67b45854520fd829e23bfe257c8f3158 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_no.png new file mode 100644 index 0000000000000000000000000000000000000000..cd94520e2fefe0d6561547e825f1a62f9b5a44ed Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_out.png new file mode 100644 index 0000000000000000000000000000000000000000..0d73b0fe9a54b8713f30ae9621050e5a7d97242c Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_e_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_in.png new file mode 100644 index 0000000000000000000000000000000000000000..1a1342c100df6061f807f16f1a2e31feaf63f80a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..54f349d4a22d12dfab59ed4a11b7668358c44ee7 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_no.png new file mode 100644 index 0000000000000000000000000000000000000000..008f13c15d6c3428640c86350dd8e5f64b9b4461 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_out.png new file mode 100644 index 0000000000000000000000000000000000000000..d88733448c650a15831d6c1c656f8a8b15656706 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_g_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_in.png new file mode 100644 index 0000000000000000000000000000000000000000..59b33c1bc355c39c912a5f98b6704ce2331d49e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..31a27e9937df52e5592e4396cf9224619e326602 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_no.png new file mode 100644 index 0000000000000000000000000000000000000000..14443bb44676a7cb774542ebc727168356526c10 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_out.png new file mode 100644 index 0000000000000000000000000000000000000000..d0cda1878d4b861207aefe71598821f50270885a Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_h_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_in.png new file mode 100644 index 0000000000000000000000000000000000000000..2a484a7cdf7566c987b98531759898eb43188fa1 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..e1847b2353f3c06424231aaa513abc5b2675bcb2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_no.png new file mode 100644 index 0000000000000000000000000000000000000000..25d1042535a6d783f26eb00f1761010e47e97c4b Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_out.png new file mode 100644 index 0000000000000000000000000000000000000000..1deef41f74a854468d08d73ff60a17ed74ba39d0 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_hp_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png new file mode 100644 index 0000000000000000000000000000000000000000..6e845462f3963006c0dbf7c913a895a5af173190 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_1.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3e63074dd2b3d02d372ea2222cef3756d43a58 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_1.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim1.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba7fd284106e028816e2d35c7dc1950a2ea685e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim1.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim2.png new file mode 100644 index 0000000000000000000000000000000000000000..834c80a9b962c8d7cde6fb4849eb4f842654bb35 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null_sim2.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png new file mode 100644 index 0000000000000000000000000000000000000000..11ffbde017f59104ce1e1fca009cc5591e1059cf Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_in.png new file mode 100644 index 0000000000000000000000000000000000000000..cc59f7c6bd9a524f2bd8233c7f92ff29adf7ae1e Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba3dd2b8ff78489f7f8d19903aa407f79217bb6 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_no.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_no.png new file mode 100644 index 0000000000000000000000000000000000000000..29d4e60a58b55a01eb8f7fc16f348cec19e7264d Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_no.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_out.png new file mode 100644 index 0000000000000000000000000000000000000000..db3889be5e2e317bcbfabc3c98d3b8ac42f288c2 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_r_out.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb923e6dbd4ee883ddd283eb7c1398e5e1271d4 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..783ad175510002f77b13023032337a3190b73328 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png differ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png new file mode 100644 index 0000000000000000000000000000000000000000..e499f9d42847f87ba2546705c2d6687bd50a5146 Binary files /dev/null and b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..29ff6fe2af81cc12fe5caf33ff67cb28bff4be8b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2g.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbfa6f95eb5f7a4fd12c4c17f0256c932e67cf8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_hp.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..6e88bf9b5fe48952b29c4a1948cd3763f12f38ff Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_hp.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..59c0e9f7862ac0a55eec481c8564a12c845079ce Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png new file mode 100755 index 0000000000000000000000000000000000000000..5076cf95203bf0b062e39e020c18666e7792e297 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_1x.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..3ab84708d17066e4367bef16f761081ee1595702 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..83538d463d4fd984567e3ac8b45c7ba7137989cc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png new file mode 100755 index 0000000000000000000000000000000000000000..aa011ca08219d424d54c3256415bafb31b47f922 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png new file mode 100755 index 0000000000000000000000000000000000000000..4cebc4365e278c7e8a7f41ff25679c8be101484b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png new file mode 100755 index 0000000000000000000000000000000000000000..bd2b4ed6f1ca34c78b6dd8260cd2e44eb21c79ac Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..dd99d0321e09d5a17097e13752a2cc1bb1883842 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..eca60006f6ce4bbc90be9603b00f5aaa8851f08c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim1_new.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim1_new.png new file mode 100644 index 0000000000000000000000000000000000000000..f4d46856438ac183fc017defd019dbde95ff7a1d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim1_new.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim2_new.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim2_new.png new file mode 100644 index 0000000000000000000000000000000000000000..929c1f4a588d515df9667a725ea332374dced710 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim2_new.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc627c2f10ba0e2e81b83410e2e6c47a989a19a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim_1.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5c6af9b10d9d60eab9110d020d3191ac8d8411 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..68bfaa9c46df5ed353fb1d07f84aad4baefab4e6 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3af557fa16e605de4fa065bc92c2733187c9f3b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..162393fcb61228089cb2df201395cc3168fc4fec Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..f1163cb6f25c418fabf23722c4439f722de84b17 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2607f6954051b9e830d5ccd5d5b211875b8c59 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..42b98899d754e22b6be9cadafc769cb256e56e93 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..65c1f2972dd0a9b3d111246fb7cd22cd57bcc00d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e4485b93d41b30c273637c20b044b122080e4274 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..669a65d4aa6c3a1eb40255bd643264a8499d428e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ff5c6af9b10d9d60eab9110d020d3191ac8d8411 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..4dac80fcb675b68be20ba5c5d2726d2b90917d0b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3af557fa16e605de4fa065bc92c2733187c9f3b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..162393fcb61228089cb2df201395cc3168fc4fec Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9deb1e7d791b2ece98028b75f2a9025d04bbdf Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..fe2607f6954051b9e830d5ccd5d5b211875b8c59 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..d598aeaa6943ceeae3e356c37769dccbf1828da9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..65c1f2972dd0a9b3d111246fb7cd22cd57bcc00d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e4485b93d41b30c273637c20b044b122080e4274 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..3a449e599bf419033f0843e08e0656d55bb79435 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_0_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..5c730cbb7d99f7a6b2b8459349d2d794a5e0e10d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..61bc6cdb030e286e80180fef382458efa20b381b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..7c6f6dfebbf56e44de7f09209ffb6642afb29d3b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ba81c495b9961153ead3bbb1475b963fe549d988 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b82719c2f48fcc0a0b0fa66dcb721fb690a1efde Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..243737d4649385c1bb5ce55a41e66510309d9cc0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..36f76c4a403de205c7806d020d2d5cc29690a59c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..b1254cbbb59fda4e7133164bea0e32d81c3ebbd2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..bcdc84116b6914680b08aeab8f5b30588c72712d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..8128273a791785010f0b854c7cc6c66bcac2a2b1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..31bc62c93310ef21bc4b7a2a10c888ce2e957726 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..b34834c915d4a64ef10a8203c9c16da3589eedee Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..b988e00e55853845c6f0f346f1119ecee97dcd98 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..70243b168ea5b656a3a183e093776be19d048a9d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b951e162e90e4395fb4a0ff4570b4e7b66b7960b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1f04c82589df41608ad3f3053283c1575f367a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..601cdb1f40d08b5c258812da86374091ddde1ebb Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..61b14bb9db30088deb7401239bcc23b5f5de8159 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..063458f20d1a04225eccdbf6fe13cde050b433a5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7b1a16679068aa271ec5a4eb9e335d7be73cb2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_1_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..82d26a33452bf897985534006a7220c16fd33c2f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1a6ee0e6742e982f461750ddbcea9849fb84c8e1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..83aff3ddc3db694f655e24c2989444227b8d78bd Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..ac043125258e00ab066526443697875e11b22d31 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..cac2e1b96615aa3f6c5217b34f7a8218fdfae27c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..5faca75e4978225765267d44a98b9f787cfe7834 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..67b074fc6f5c6277a30e8280b12a410e7447f604 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..95c2e069371a5b31beb87a269bc16dbbde0ceebe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..891f9f4cee88d691e4cfa6c4ee5af8281dbaccfb Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..647006efc967fbc432a278e0232759e32c0be2f3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..db434811325276c7a040e046ed0da4f191352af5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..7a9dba2633db8a774b242686da0f3bff3e0cfff3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..8bf18d3ecf03fb14f8ac988b1c7179ab31891660 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e172e18b22e9981795aa4e2dbbe5e3a95ffa551b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..8347aa05766f26cbb82adab133e4a5fabe8144aa Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ab958ab8f06d42b4dcfd813bf36a5abb90ec84 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..097cfc4f26a3029e338569e8ec9928f54324bcee Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3546860670c3db283ac36d9cc4a94be6de79ad8d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..53b74b103771943749c1a8cd756d51ae5221d452 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b7aca12a6094005082a7d088f36d98277250b818 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_2_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..bea4818a5fd90b35a52932893fef5323759e5afd Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..5370205ccb33c6a76c55ef9e3832c71722921124 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..f9ec9192189ffb4ad8160897416b721b23decc21 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..28bb4c457e1eb08e84a2c4cbfb24de84bac77df5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb2ffb747f0dddfd58619ae362a426aa88ffd5e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..173188c6dbf1207d5ad99d8361f9d1a714d46985 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..221fae019f63773e16be05851d3f1b40e5b28ee8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3c6b388e461c6d6d03be084a8322e41638e80c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..65683166ab0c27e58c2f11b348a93a925d1158c5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b61f1277cb3e6e27cd16c5663339406f275a4113 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..57929b3511b7daf9f1bea9bd606b7bbe9edf3ff2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..f24da096fd31f99f2405d32a3e9f382848cf2ff4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..7f68ddaefce670cdaab885b50f00336e98521155 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..35b004d00196e07e54e59dfae150a2dbd582b4c8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f29bbfaa838356b27259fe0e9530e7f8cae197 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..9e14317c14fdbc8aaf0c1c76cd911f35271565e0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..aadbdb36474acda593438e089f27a35c69abb370 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..c8ad01076925a63ff61fc2ffd11c60e69e58195e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..79b145004c7d3193530dda83e630e1e00099fd41 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..48a57c8e6576a3e676a1697752d9bb561ab301a2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_3_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..1ab2b2ce9f4f08d747e81b2cd167b1e3876e4368 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..671914f5878689a36710df486773a5a594bd397e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..b8df5cec75cf48638962aba95e7e75c327e7d2a4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..69d8678ac34ad0f109e350e17df8042f7c78026a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..0b18b6dad535634911455a81f17fb93c18d9ac12 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..982a93ee5cbed6a11d87b271b1fbbf5c70194dfc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa66a2cfcc9aff9f5c68fdf7f480c4cfc15e728 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..64b3ecd883e1daf716cdbde7c889405fa87bbb7a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..02004e70e216a1b44694424ea966889571faf088 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe7e3a93c850493658c8b352aa2e8339646da80 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..71463be0507472460fff2e58c3ce5024e22506b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..d61ff7ea0fae8eebda8511cab55558c7d70d0ba3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ef30e4329c501631b16d4a1f36cd71df88582507 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..2504ed7fa3921e36130965c174de4178a67cd37c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..07bd8b167c28e9f2453c4a2f983f0e1e4e59487f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..1d813efbfa26675f38878a52c4ac68b78239e78d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..39309dff3741ac36702c868e95f1fe531e663928 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..c86df18c95f926ae6f42db0bd32ff8a0cf82068f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..1c492e1466d010e18cf1b2775c54cabdd755c45f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..95a3964c8d06e6ea4c27f48ff628d22689c34b92 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_r_signal_4_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..f11b84eb00684d41959624f03b96c999ad5f36fc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..005b3a434ad6e71adc21fdf3c4b05859f1d74272 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..6be21560b971cb6e1a41f554af780592fa6f4e45 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..738ddec8025ddb3066e436dbfbc85eb6da2affc8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..60450112a7e9942d029683efb943b74c180ab9ad Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..24cbdaeb565b056c1815d98825e28c25969f3c10 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..0a71f5986287a33b47a248b604511354c51ec99a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..3a4bd3ca186e895c9925f4d68f32120fe90a7edf Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..2608bc1fc22993bccc7f53bc15ea35f942105c22 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ae85f9363564d6543a7ce49010ecbafb40ac05fe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ea320f91b876a42094b60dd27b33224c4d9be316 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..7dbba7db40aef0a1c9c57d7945c2e1fe8d64fe1f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e.png new file mode 100755 index 0000000000000000000000000000000000000000..55521f581f34a82559751665cb8f51b2497ac1ec Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..b88661da7ee3b42d8ef71b7de79c6cf9899a8bbb Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ad8a117cc5218dc46a89fd8703e070ad92d6e81a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..7358b66b7d5877e9328351fcbc5510e0446845a4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..52263415d30a0c14aca01b82ad29b5491713ea44 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..b0b95813d12b2991a58219e725fc23d7b4316e37 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..429a149fa7dc7fb2410b2b62732d6bd45b767530 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..49b65546c3c1a5d67c9dd462589852b3ac7522fe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..4b61681adbfff9c52c9b23726285367e7c5d04ce Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..c7385f0c10df07d92cc08c95416ecba5ae907de9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..08f7b495d02cd28daea18ebb0827272eaccbc528 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..9296499ad1c7c54d345499d5efdc02b169d6664c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..8eeaca8d9ee17990d8da4f0bd7dee09842b129a5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..e29348a4c661d66ce28eb51b84f9d6e0dd04082c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g.png new file mode 100755 index 0000000000000000000000000000000000000000..4fca6a3cfdfd5711fca23daf9bf65774e434f095 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..e77a91aa369e633f8e6ab8f1a074fcbaf8ecf393 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..7d0d206e59830215c8cd5f8dd6ac44fa2ecc2470 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..e77a626ef6f2f0d6aaa8abeeca95b9bce4a17d0e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..b581f5d5ab37af67783f63b8ac15d55447577b64 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..370fa889b56b1aa9f9817521f059b61d7344a75e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..52263415d30a0c14aca01b82ad29b5491713ea44 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..85c241e7f53b664a7cf6804eeef3583beb95e853 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..429a149fa7dc7fb2410b2b62732d6bd45b767530 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..49b65546c3c1a5d67c9dd462589852b3ac7522fe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..6158001414a66610c4e77c0a6c1f38083ddf5364 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..c7385f0c10df07d92cc08c95416ecba5ae907de9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e3446dd3aecff24f9ed528d556c01c161dc5b9c2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..9296499ad1c7c54d345499d5efdc02b169d6664c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..8eeaca8d9ee17990d8da4f0bd7dee09842b129a5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..67ae5899fd017719e5200a83e3f2cc2d8e779226 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png new file mode 100755 index 0000000000000000000000000000000000000000..43053510881aded0128758ce8bfc8818f942b8d9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..c5dd2c50e38c75479b3611312db519667efce397 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..39218a01ae1f91dd5b89a675a60082596b6ef578 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..eebe87d39a4fcfb5627eb53cc259d7dbf6ef15cd Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..946e832fdeff35e0699790d14c62244a8df6a02c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..9c8d910e60edcb980a575d2f68f1f5b11ab8ae71 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..25d9d069491f79feeb4d111808c9341d47f51d5e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..7dbe663bab946d40b59597a0a7b3ee2d24aee7b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..16d093dea63ecb30aa98ac3f54bc5f4e6f96268c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..187e0af0ce478832f6faa08f0d772ae951c051b1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..652cdb087f007e7ceff8e0e12098fbda5dbe7787 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..eaf6a27f4f86ed7a54037bd5ffe0307c05ebf998 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..c591c856900d2769a8f9697753845baf0a1b6128 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e.png new file mode 100755 index 0000000000000000000000000000000000000000..d79900c3374c8f93ee3628deb0ed134458c95bf3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..7360d59afcb9d792489e614db34e59615fdc303a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..05af68eec1ecef390d7c5d07291c066e559a9bd0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..f085372b827a3f87fbe4d47f6b4232a42cf8683a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..a31472332d998e0ebd7d54667fdbdc40f973e4c9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..213194917084f6b708e281f37626ef1706103f16 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6ce88324f854afac8288d085cb0e50610e54d1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f00f7ff38fa7ea37fa5e82d3c12204b793012a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..41eaea06d362f116e357a0fcc8d469ce2ab78725 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..86ec69084c9302ab426c798d468acc9a4da56d44 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa6b71ab07b6b96581663a1a9c001c1c440a9c0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..77ee8e48e79c4665fc08fb32ac5d64a2c77fe04f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..bead621c91f4b11dd834f8b3dcca51f475c9813b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3434045fb7bf61c0351c274ab13deb174604b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g.png new file mode 100755 index 0000000000000000000000000000000000000000..7c6ef450180181b9efb3b392dff6c2a8b573b0d8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..795f722b5f42506d96e9fb72bb8195ed2dd89257 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b09dd9a1f0d7540fefe24a4fefba7a858a6c644a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..2bd02be4f520a0a3af54ff9ad0f8c78ef2844c98 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..9b068c1bf42d90e4f1f31699545b4971b0256c6d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..3a0f4f453ce8d24a21096d28ee22926f731e40e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab76e819cb01e5a0829029cee9c1373d5c66069 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..eadf88879093cff3d8cd9428cc48189a85b521c7 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..00b9a24f7f3b55cfc42a9a9cb685a3ebaa211529 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9620a0f81674fe58e13d1f63da11cd611a54530c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..487cd1ff5b7d0ac082935b39b628d6624831e0e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..dbfd0210d33f199770ddb28267a89c37b3cccc77 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..c9555030d89bf915cd1edea30145b5a3cb9448dd Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..ced6d85ea219f4a2cc24e623f432f7d81bd0baa1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ad7ca900d409fc0c10b78956808bff7887cb19 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..254211d4cb4e9288e1f5eaaa4878d2ed6101220d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png new file mode 100755 index 0000000000000000000000000000000000000000..beb641bf20be82823292824ce7f1c312714ef25f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..c715e53a9be693f231e6a8f3f29df731c5d7546b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..6a6a34dd90132b2a5613c5ea0fb3226b304d05dc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..2c2ee21e9e56dc8cdab8647271717df7693de151 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..e2cd61e27c441675df9f512174b59fc5bf93aa4e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..331e52f06e6cf8311973080a147e8e8240ac0e97 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..01b735868baa983af3d0609effb386c4ff447e6f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..a79913f98e9eb6b8bc46a0ae8053b5965e1e0bc1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..89a8720aa280007b7953b1d8911ec70497b0d6f6 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..de92e6d81139252797fc9331fd87be576cd75cee Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b95eb22f9d7f1e38fbcfc5ff3f3acde00685712c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..9ddf4291fd6843425c4b0532ed33a583ac94e91b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..06f5ec9d66006ec9a92a62f5c0cbe59cfcea9b9f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e.png new file mode 100755 index 0000000000000000000000000000000000000000..06638f33a307194e09ced926f18728c1d884eb2a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..6076075e094f7ef6da537fafb54889660c708356 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..d040a2b6d2202b062daf9d0049165f6e4fd301fe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..fe9f905e60931b859b3d4d8c53ae286b73f4ca56 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..e322672b6ed9d8568cdf44f270937e78be130129 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..946ae176caf363dbb6e6e46051a650abccbff2a8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..6756017716c08db84788e01de6032a33933edd2c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8f8a4a5fa583b25e750ca10267b0671e30ab2c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b9304e7a8965ae4ad05d566f464d79023e6cd121 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..dfde6cab7accda58261f43204ee38d7e5914db12 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..180eec96067265a22190dd2ccc1fa625af4d0d10 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..4316eff76b5383229a6129c87b79b71069872af1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..91c9a031c90821d9269d538934377368f91f04f3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6145e7d50df2963c2863e5bfde721a31e355d9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g.png new file mode 100755 index 0000000000000000000000000000000000000000..ba1ff45283b3c77493dc2b1515265b41a85cdc2e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..f7fa38c7e3b74a1f82efb9775d3014022ae91481 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..8355a4a9e593cc9ceda99630ec6bb40578dbb4a3 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..91769b93a4939109ec592ea83fa1680a32925809 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..2e6bc18c8507e0acb0bbe8ed4503280af28d2e1c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..68c68fcaf552762d53a2e5fb01200c2f390b8399 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..37633888f0f7aeb841153d75c7e6aa1f16ecf621 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..88645bc12df5ad9f9cf6836b846a2bdce9db3cfc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef1e120a6f0d6c622a3735f922dff3c10031aff Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..266fa295fe2d394791972eb362ff4e6726f41562 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..fec6ead52acf17cf983b532b1dd1b8017de51be0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f92c9c237bd8b3b6acec890068d30b3a7c0b85ea Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6645b792aa78e57e2364e5b1c6a14397c0a392 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..fe80330cf1237fbcb2a0d3efda6973955422342c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..019e3825d93b98544e0da4e1bc156afecb8f1aa2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..003737d95ef11f7c1ee32e06dcb5193eef3b369c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png new file mode 100755 index 0000000000000000000000000000000000000000..a4028cd2602aee1b7bd4bd880a35d607efb85e1d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..6875565fc04e3a026c61c89bb419d77bccf3aaf7 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..56f83dd77129be0cff8f4bf317e22a7d2f273bf2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..42935b6b8dcc2bed30656a5933f39b680c1c652e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b8742a027db1e6f5f2d3706d9d7b794b58002690 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..cf04633d1cfdd925fe08926cbddff4350db4d1fd Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..b0073c2dee67db4f75388f905eb9ab56e876c988 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..0d9358064e0a5560367e9dd0a90a728d3f36b78f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..bdbce47f9ab5faa1bf28ad25911b2d565b88cdd2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..347ea6b772221563fad67a909ed3305cc0add7e5 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..0ade75815f40b7b81f3b0ad06641a27f189fa8fe Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..69d763da2d844fa4dd91b33da54a2aea164547e4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..841da56a7d8c7cd920db309cb4495aa45926437e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e.png new file mode 100755 index 0000000000000000000000000000000000000000..c684a5a720082b477ba96ad71fa54ec9823fc244 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..d71f85f0aba7d0ec60b6f1b21fbcd334de19762d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..0e3d718715baccc5a8fddaa989de4cc6e929093e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..39fb603bef88ed06b7fe4ba9315430a43e9eca5f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..77c354a3fe54a897001a7304f7ab9b031d185525 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..14926a314e9c6c60b533e4cb1f85e3fcffe57112 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..4bcdc7bab1e57fde26ca9f8a7ae82fbac12bf07d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..1107844469a16972b0a8f679d47660dd0f5b6af0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..47ff33dd31754855e0c683b40d62d75c35734fe9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..04e45dc84cff14f574b07edfa8160dfafebd35a4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..d6078c6e1b99a524144ea1d07c3d19ea2c8d5ab9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3a6b3491fc4ad4a578bac0d9dbbc8c7a8eb712 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..9871304842f227b5f8a133fcbbd1a8f48b70d64c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..7272c32dde1891633a4f4b215b9d81fe79d781e1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g.png new file mode 100755 index 0000000000000000000000000000000000000000..d6e3cac5c96bcbf8f063b5148d5616d5bc431b66 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..949d58a6b05ad52b5e1d7e9eb6cd80fa5731f598 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..407e5c1ec19fd39bb0d045f2a7505083d99d3e7e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5f054488901cc1211fb0e8065044f154f4c17063 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..9284534bedb1b479f67ef61ab23b3754bb8ba40e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..f7e1a13760bb446b9a9c311aa354329d880762ec Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..4a894f14e63ed76485846731de874807d4936b60 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..51a0f3c1ef6830d7586a622506fe996be0b22c41 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa75b121d5b1a537c972ae2fefc77b374a8487c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..aed122271df917beb86948c26106e4976fbf86e4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..49c02b33b9bb1ffb2f1691704ae8d0c986ba54d7 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..358eab95c12536fc14cb941229ed8fa522c11514 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ba830e85dc6c629e6dd3d9f87721297596f979 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..923555858ee6e87b9163a8191d412ac859f47049 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..bc260dead41b42edd36c754741709b8554ea93fb Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad18f03654d4f54295e97e1269f2c16c7fe989a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png new file mode 100755 index 0000000000000000000000000000000000000000..b5ed22becc0e5ce1126f4a2720171773a226546e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..86fc340c3352d7e13e6173aa45d27f66ae8eb36a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..84c46996c1ab6b8c99561a1166b15c1d9ff05dc6 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..8e7ac74bf950c6c5939d94b9a38e13e733dc15b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..fe492fdc32fdbe56eeb708e8c98d4d96cbe64e4b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3ec684e994a020b21c3e9bfb32fde3474d685c21 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..96bbc46b6e161c82e6d485474338d9b5469bca6e Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..5c4a61eedb5e7e160aadda613dd20f40bfae9b7f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..86b9a8877adc6967e816a4c3c75eb3ee9006faec Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..adcd352780ee449acd46ffcd80943441abe783a2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..f545efe222b865095fa260c94baba0cb3e42b821 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c2d055a9a96207edb6977c06c96b26e57088e4ca Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..716581fcaa6e56ae865cf2832d2dc09a183e8e17 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e.png new file mode 100755 index 0000000000000000000000000000000000000000..de3917d63a3ee6c6cbad496ca85cb2298bddc83b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..f5e59582ea4b1f1ec20fad2b26408b08093f9e86 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..de44dea1e13613ecd22ae5d812c558cea5e9e8c0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..cb068da3473b71a6b8aa61729d822f16f49ced1f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..c9eb96fdaf7e125580dd0e50a7f18b0298aecbae Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..72eadc0a0cbc13e9661897d803e5ea94ce6a838b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..fb4d39ec5f5893aad09af2c4008bee1e70e87306 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e215e5cb01281959e66274a0b9497a01079ecc Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..b47d04f71726a8e61f5caee7228fb6fdfc7f6ac1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..f80b324a8a29782a39dbc1373fdfc48b0ed99d17 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..63ca13c8f2c25ffc7fe4a8f6a4bbb9d5d73e837b Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..421e8cbde356bcf877c163d2738967116b419c93 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..86748c3d06f6701ddb994d456e0a814cd1be3479 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbc885a8e5332ee8d68cf7fb27f88717ace57ca Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g.png new file mode 100755 index 0000000000000000000000000000000000000000..f54d21fbddb230d5a587b0d5306d69df17af9b6a Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..474f0756522118b85fc157f38db1dced28fb2961 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5c7eaaeeffe685294e24731fa26d64fe84541bb2 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c65123d84ea51868786e1b8195f6d75c5e2126e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..2a86141ebf22167204629314d0b19b0d0e2edd85 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..02f3b831c1c9a2038757a20a79717b3fc00e4d39 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd689d176cb35e31cc31676f1153c878f0d94e0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..b3eb6d9edc339a4d42bcab412b8eb146aebfc9b0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_g.png new file mode 100644 index 0000000000000000000000000000000000000000..1abe466d6e4367f3ecdb039c8db816885fa380b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_h.png new file mode 100644 index 0000000000000000000000000000000000000000..e36e6f23405c6658eba99c22a9b2421069fd3def Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..ef872fdc0e7b9c8a714e6afe10e0359b1822b212 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim1_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_3g.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbcfa0e40eb0e087829428a51a7d5f403d1569c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_3g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..02d8244e9a9ba586417014050b41e5fd137b9d4f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_g.png new file mode 100644 index 0000000000000000000000000000000000000000..83296a53a5387507cba6fc46aabc72d5da78aec1 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_g.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_h.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf107d424ed3a1537d7f4f58d45395e902fc460 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_h.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_hp.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_hp.png new file mode 100644 index 0000000000000000000000000000000000000000..6c34eabc74e9963fbf666fff5e0cee8d6b2a909d Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_sim2_hp.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png new file mode 100644 index 0000000000000000000000000000000000000000..31c09366236194ad98b9ee6d6411ffc58de14cf0 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9b752f7b9b30e976ff81d53cb0e620fcb39eb8 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ade182839043215eefc071732d591fe02838c165 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_1.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim1.png new file mode 100644 index 0000000000000000000000000000000000000000..782d5901a603e5319604a58f905463ee3f5a004f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim1.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim2.png new file mode 100644 index 0000000000000000000000000000000000000000..61317a6034fc4d03d8b09dd45e238ae383618c5f Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null_sim2.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png new file mode 100644 index 0000000000000000000000000000000000000000..3209234d94a082910292edc822291bbd92ed6043 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png new file mode 100644 index 0000000000000000000000000000000000000000..95c56ede38a556b681a95fb86d782ac39f620637 Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..11b9a93aaa0a78323cb3ad5b876e7ec58798a54c Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png differ diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png new file mode 100644 index 0000000000000000000000000000000000000000..0f85ca0d7380669d1c76e0ff8bc33b91846b3aeb Binary files /dev/null and b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png new file mode 100755 index 0000000000000000000000000000000000000000..bd31253073ce5fca48005914a54fcc43de366a5f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_1x.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..5ed365cb371dfd99dfeb4fe04065d708077fcd21 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..5b22d20ce8f01aea50877c4efa6c499069d38451 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png new file mode 100755 index 0000000000000000000000000000000000000000..b156b06e3730011344171d76d20623d317c4de9a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png new file mode 100755 index 0000000000000000000000000000000000000000..f85047725b6397ecf0839bae54931d86b53056bd Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png new file mode 100755 index 0000000000000000000000000000000000000000..b261c1e35ea00b34efa69b243e3433a11874cb97 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_h.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_hp.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..65773655c7dc4ad6faedf62bf3ad5dd5d0f2f137 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_hp.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_hp.png new file mode 100755 index 0000000000000000000000000000000000000000..4172082efebcf0e9ec802d1a6ac9cdb77267cece Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_hp.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..52569edd7e9ca1697e57b106547c16a5bd4d72b8 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..034a68220b9761b4829b0e54ed60d49d475a4ec7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed366e8b49ea2e3096472716a5363135ddc383b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..18fe2a2545ebdaf4906523feef0f4d42f0b7325c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..175020cb7a3837cf8747380b363598136e21e9db Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..10e733a90850f26f96a3271465f653da9656ea9f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..295e678c94a80b385b280c4446244f84b76c2fb2 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..d36720a0e5f048a3e8d13617010705bff99cbe49 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..8044a22f08740a4244b4d3437c62c6525f8ef38e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..256c8d322bf7fbd6e58a84701099101e0b275286 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..0b4d9cf010d10f9b9926e1e79d087b597673b6a8 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..d347e534a04766b71e7c3fe189fd46f69a3f754e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4e28ef149a13a7097b1505969494e0a818968f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..c04653525fa151c7059865fa0fbfdc2b87bb5281 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..976d87e8e0f5edfcb417d4e533a6c60f64bb1917 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2c1b0f78ad01b7c433f48674a13fedceb96dfb Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..a7b3408c10b891df1364e6da8b6149f3e0e376a5 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf9fcf1b10f36584632876a7695daeec4c5c943 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..92d6840bac66beff09ea6d6bd6da600494d8050a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..bca3ef687d9a3212e89ff27cbb39f5cee7cb80bd Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_r_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..ec1d1049881124791509c7af4554e3dd30c4108b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..9f1de41ca85b2c60acce0f1d58a5215c30322d54 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..b5222fcd516104c3332bdbec06f28d4fc394b2ee Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b12b0edd37b8c970c16cb888b6a84591aeb10a50 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..f333138a307ab32da69af5a529b4ab4fc0adda94 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..12f8875805fe443745761a7e30d4bce3e3565f24 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..9b03d1852051d3c1c5ca83c210e192597bcb76e7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..ffdc80f9d8545075e9152608b7e49f2a470b0153 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..ae3d75a7dfe0e5f8042a931f1d99caf1ef72df4b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c67bfe789f1c44a78428eee6bb8ca57f93569fd1 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..66019f809430909ad06617c8b539b0fa9007431c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..d14e6890499369ba9d5e43ba23d872c2139051db Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e.png new file mode 100755 index 0000000000000000000000000000000000000000..281afe08a4c1d9fb7dbcd2a46703a1f965ca7d7f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..083889e9ff691731e04c590bea6e157f7fac1e2e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c3efed13f571a445c8c909376983beedcbd2ed11 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3fab702985a28433c59ec104d70a4924be19265b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..1fc6d0e0ba9a270c3014a3d4176fcb6bc46cca35 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..e28b6f02960d064ead82afb05e33af4a2fa2bb1c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g.png new file mode 100755 index 0000000000000000000000000000000000000000..651ea7b8d45b97aa1ce7ff4e3f2f7032a1ac88d3 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..5942471029aaa02836a9f3d1c32ba33e942fd4ec Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..9699a3abcf97632a829468160c0148f0c3e50764 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..d976f3dc5611ce015c59c15a95a7b2690805f9e6 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..1422d93606a67c73559a9622c0f90681f80a753e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..0ef879b64ed26c0e67b93f3e5eba86533c261c9b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..dfc663d775bec91073358fcc467ec3d7edbb1b3f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..27be3f89459851c1a2b9779c223e1a33038d80c2 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png new file mode 100755 index 0000000000000000000000000000000000000000..9943613ab35be6659e45b42a863ad3e1582a8f3a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..8ff5ac893d90fc7c966ca2de3e1b2129854b2bd9 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..655edc3a4c592825dbe5de091e4898098b27e861 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..e151a7e2f7568039f0dd52ed1f7d241057c3e027 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..9dc081b0f5fa4a14f74ae30afc1c6a70593fc243 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..51761046ed1cb470c537868a377313d71874b789 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..1c929281ea0ea13bd1e79ce86ac44c624cf934a3 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..7ebf56c85f688ea1df70289b1e7d2d528e2b9272 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..d7819349b5ad2af11cb690148741dfae0ca75c76 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..71aa042a743c4a3aa33e65e9d0de5c9157e9ddde Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3091f56d6bd5501ed8bd6e2f2796758e07eac61f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..60344ddb025fa3267cc2050d965c26d7265b3264 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..b6689b5904b81b5e8cb876deb5fc4d27858a9f06 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e.png new file mode 100755 index 0000000000000000000000000000000000000000..79ca14f55e0119810cd82bd84b9df6cc987c47da Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..e049773ee3e76432ff7a6048c539b936ce857bae Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..3d5e5982b11097cef34abc025cd079460c798174 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5bec840085114cb99c49c99badbd70135e466df7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..3c33f6d592c6a791803b52fc8c7365b31af3cc94 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc774bef3e9a6705967ab2936f85e03e86e3632 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g.png new file mode 100755 index 0000000000000000000000000000000000000000..51187f998e5874e2ccf9a08f2913cb3bc4bdbc31 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..ea5baa13ef34728b6b83629301d1f0f8549d0355 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b3a322cab7edd194eedf605a47b69563987838e9 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5ac30c8e2572d9395f65bf573c265d9d4d3d7a0d Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..b5b3611d5a2597e06527365682de4c0fb596e907 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..7f3f307c944269cc2ad4b5fb4df074ab290477b7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..40096e83ab4ea6055a4bb17462818b685dc9baea Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..5a04863315b03977bc4f7bc60928a2acf0453c5e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png new file mode 100755 index 0000000000000000000000000000000000000000..1fc177529fd5bb72775cc3537c0c4e11c6711cf0 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..12a75c698b1e1777b677807b2bd50a60d8f57d12 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..078f837a4a146c7ad4ece3e526beb6a84e91cf96 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..f4a0cc24f03574eca06ca2dc699bb6767ba773cc Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..20581f703207bbd867ff73355c914a2381618112 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b03871f85e9de85d355424128c544b677d082b01 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..9583d93f29f250cde1ceee2ea4693cf445112533 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..e9313ecf65b6e72295128c778ef79be451148d30 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..5a2000b66c39eac7a2522f808df34028e20b0e74 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..91460b22d30ac576fd3d94d11f5a853ac5d07343 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..b9d52280b51f2f94e5bc9c7c043146f7b35a94c9 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..6f6e6f86fbe8781d15690bd38f2ac6b36483e7d5 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..50cd5b49e75e83b7d15bc21845b5226aa7f416ed Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e.png new file mode 100755 index 0000000000000000000000000000000000000000..8439cef1d08326c582559dfc5c52d3418a0d4f67 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..77931bce18ed2d741589bb410784e165fa01c886 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..2e662e62e371e09cc338e2518dc8554a956df1bb Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..31f52ace01edf159b969b9b7560198ae846eff64 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b3b1921690ebc987986b0088e2a121d4f9cb5c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..736c19192072c81dffe0be74c050d96410204268 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g.png new file mode 100755 index 0000000000000000000000000000000000000000..f3ffb3be17f44bb0429f09702adefe1e0af63094 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..636020289f58457b9a377732f4443ad7c2a54e02 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..609797132504d265d244f27fdb3b86f48bb7c5c8 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..64cdc95a5d93ca9a2f14a9d7592da07c1e926888 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..6486bbfb8d27f315c1fa5279e11a402e590cbf84 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..95eb1f25f2a0f3b267cea5aa8ba69cb57ccec8cd Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ed09e62d33de89319bf5febcb182050b73cb63aa Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..ca2472167a02b9e8c2616ed736c34d22bb3af4f0 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png new file mode 100755 index 0000000000000000000000000000000000000000..82b9741bfed4ddac6d3070422a7e53add672270e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..61d2d85abb8dec0d89926ed6ff40fa137f93c84a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..69fdc6218c14ad990e5f1fd661f6c077aa85f7d8 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..13e60904fec0dcf1ff51119e0bd1be93f362ab96 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..a3310a04b1465e8ad50287af02e09a41475ed7c7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..a26b0835e4cb4bd9dad86a599d5a78f999b03262 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..fd3dd306372ff2c839b4f35c6df64b084bcd6666 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..eb38bbcae09bb7da63c67c30abdbdbe4c383587e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..cb8fc4f5b9cc9d4e85e0d3a3339504990546cad4 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..fe055c75ad831854d306f9f086e4f87a02ea1411 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..dcfa90422140da0075a4e3a4fa7f5464f1d97768 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..e7ef1dffcadb2c85f6887263faaee61d0f1af69f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..e16de169df97245393ce6b1e0bb8f8a49c8e6049 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e.png new file mode 100755 index 0000000000000000000000000000000000000000..87e96cc848faf6ed152f186214d44b89e69f9b80 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..a2d0faa37eb360ffcc4cd6ea471c959cf70bc97a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..6b52c5f3e1946aa15eafea5a28dec26be86f921a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..477a5fe8df11fae3b34733856c61099b542be31f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..52726fef215f08459dcef1c59ca586710fffd9b2 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..47422b3803e58a5e83529d8d8016c57cf8edf57e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g.png new file mode 100755 index 0000000000000000000000000000000000000000..b29d75ef12cabb19fa23d2e1ebd78b4535b9c9e8 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..8920122e9e80af2eff7feca9c8e53fd4bc1b84b4 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5769b5865392573a64d485d7a962960c90960eb6 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..1487ca7613d2b3438a031893eeef93d738e9ecae Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..e0f48e1bc5c6f8ba0011ffafa81f8d3543ff1f3c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..11b6c41ec44659897bfa6c9a8cd2a4a9c9236a46 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..542884b084367c034dda65ca33f15bfaff93f7f2 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5f6087d7a71543b2a0108020053b81002f6b56 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png new file mode 100755 index 0000000000000000000000000000000000000000..9f4979ce2b93a3b54549b807038b831c297b6831 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g.png new file mode 100755 index 0000000000000000000000000000000000000000..76893c3806f1a6e730cf69a77c2daf062d094973 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..fe5ea012fcb4242c70ae36706cd588ff03b665f4 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..7576cddab88f3e6808390890e832f56694546eb9 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..7cdb571f9ee54c76080d0a737036e38ee9b1f83f Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..0799418a83bf5e57d8291579ed36c6cb187abd92 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..82577bedd6d1d02043ecb0e8ddab908ed1e22438 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_3g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g.png new file mode 100755 index 0000000000000000000000000000000000000000..4f3494cbab0becb18f203f190f6951a9bd6940f4 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default.png new file mode 100755 index 0000000000000000000000000000000000000000..39d3beee7100610a2cf375236fc1f110cec5738c Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..38c1a01e4002a18ed5b3fd3cf17e63f1a2184b52 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..c2452a91bf1457e6e2f52a70c1760b004b097d70 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..77770e493b89fe6b61436ecc275f07ff414745be Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_default_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..24c59105c5e376833753c69326dece912a4cf15b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_4g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e.png new file mode 100755 index 0000000000000000000000000000000000000000..cd10b05f69383ba927a689675903e270958568ce Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..d24e199e047278c106941bfdf4b2fade2b57944b Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..59da70a129c584dd634fbce95e8e9c8746c76109 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..ac30d5e56078fb63194c2be528fe05707a82ccf4 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_e_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..0338d28778ab6a2fcdd5ffea0e0402f236b5de18 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..231d3c51b9e5d59aa98f9871eadd0d7a823b5565 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g.png new file mode 100755 index 0000000000000000000000000000000000000000..5b03544481b4368da0b0b3f46a78fb7c0a9656c7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..3ad515cd63b62e0b8a87d9b550037d290e3fd708 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..21d7c389157847feb4b9e5e7aeefc25406b6d671 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_fully_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_roam.png new file mode 100755 index 0000000000000000000000000000000000000000..5f1dd070a7c07b96eb175d562e759c3a69f20cfa Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_g_roam.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm.png new file mode 100755 index 0000000000000000000000000000000000000000..2e929d88e200e3be945056ec8333e35aa6aa9fa7 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm_fully.png new file mode 100755 index 0000000000000000000000000000000000000000..c8aad28e7b70912a6b524334df7a59496ece3854 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_gsm_fully.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim1_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim1_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..185e47715fb5e2dd72bd9a40a555dcc2f38acd51 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim1_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim2_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim2_4g.png new file mode 100644 index 0000000000000000000000000000000000000000..6fac79fef148a000179a5708bb13059d9db98576 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_sim2_4g.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9c49f3ed540b8de07aae37c39eadbe84f2daaa Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..5a313c514889d13a8584b95c72fc91c23a3e756a Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png new file mode 100644 index 0000000000000000000000000000000000000000..373a4a4e01747e41b73bc25ded403645a42101f5 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png new file mode 100644 index 0000000000000000000000000000000000000000..d299daf0bad8bbb1f6a4bbc064657a5d38d594c1 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfdb7b41d91fd2616f275b969a69e0990488ce9 Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png differ diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8125ab785ffb9d5beaf8db50ca44dd48fa347e Binary files /dev/null and b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png differ diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml new file mode 100644 index 0000000000000000000000000000000000000000..cefb71402c693da54528c7e89562f8b57b6889a9 --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml @@ -0,0 +1,50 @@ + + + + + + + diff --git a/packages/SystemUI/res/drawable/lte_embms_services_all_brackets.xml b/packages/SystemUI/res/drawable/lte_embms_services_all_brackets.xml new file mode 100644 index 0000000000000000000000000000000000000000..6fed25b4f16f4440618f066680825847c0710b0e --- /dev/null +++ b/packages/SystemUI/res/drawable/lte_embms_services_all_brackets.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml new file mode 100644 index 0000000000000000000000000000000000000000..59e880bfa6ada91a369b84b6baa65b1ef3346b2a --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml @@ -0,0 +1,50 @@ + + + + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_networktype_in_roam.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_networktype_in_roam.xml new file mode 100644 index 0000000000000000000000000000000000000000..390fa13d379186605141f3c491ffc1b057d42d1c --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_networktype_in_roam.xml @@ -0,0 +1,47 @@ + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus_networktype_in_roam.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus_networktype_in_roam.xml new file mode 100644 index 0000000000000000000000000000000000000000..93ae7bb132c6a27a41109846c591e0af6c5940ea --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte_plus_networktype_in_roam.xml @@ -0,0 +1,49 @@ + + + + + + + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_in_auto_mirrored.xml b/packages/SystemUI/res/drawable/stat_sys_signal_in_auto_mirrored.xml new file mode 100644 index 0000000000000000000000000000000000000000..90ca7312a4470fbd7d22450fb50e06eac7a743b4 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_in_auto_mirrored.xml @@ -0,0 +1,32 @@ + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_inout_auto_mirrored.xml b/packages/SystemUI/res/drawable/stat_sys_signal_inout_auto_mirrored.xml new file mode 100644 index 0000000000000000000000000000000000000000..c42811462674738befa3bfb2befd52c0456d7946 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_inout_auto_mirrored.xml @@ -0,0 +1,32 @@ + + + + diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_out_auto_mirrored.xml b/packages/SystemUI/res/drawable/stat_sys_signal_out_auto_mirrored.xml new file mode 100644 index 0000000000000000000000000000000000000000..ce58d6c207e613f1f4d1359747948cd297c49327 --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_signal_out_auto_mirrored.xml @@ -0,0 +1,32 @@ + + + + diff --git a/packages/SystemUI/res/drawable/volte.xml b/packages/SystemUI/res/drawable/volte.xml new file mode 100644 index 0000000000000000000000000000000000000000..214b59b1068da01edb49d35d9a08746154189a65 --- /dev/null +++ b/packages/SystemUI/res/drawable/volte.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/packages/SystemUI/res/drawable/vowifi.xml b/packages/SystemUI/res/drawable/vowifi.xml new file mode 100644 index 0000000000000000000000000000000000000000..10dc5ce28beae2080a940aec3fbc821d11909266 --- /dev/null +++ b/packages/SystemUI/res/drawable/vowifi.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml index 444f0f016b85fa973a0315bb4158baf4a6b8f0f2..de7353813727c4d91c9f5f10fe8da1587a7b7337 100644 --- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml +++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml @@ -36,6 +36,15 @@ android:textAppearance="?android:attr/textAppearanceSmall" android:accessibilityLiveRegion="polite" /> + + - - - + - + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml old mode 100644 new mode 100755 index d17601c1c0540a3da7624a52534793a0a1a69cc1..c894ebcedf14b81c68a57c7da5955975821f37ed --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -52,6 +52,14 @@ android:alpha="0.0" /> + + + + "4G" "LTE" "CDMA" - "漫游中" + "数据漫游" "EDGE" "WLAN" "无 SIM 卡。" diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 7f03c5d8e19ef7b9f91bbcef89873e2081fa488f..77576e7b96073d5c7b1b1bde0cfa31554f3da907 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -145,7 +145,7 @@ "4G" "LTE" "CDMA" - "漫遊中" + "數據漫遊" "Edge" "Wi-Fi" "沒有 SIM 卡。" diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index bf0cba22ab0cc819bd54adbcf42b493635df9386..f4b14a308dd8857d4c3447028df3fe811756cb28 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -1,5 +1,8 @@ + + + + array/telephony_data_type_sim1 + array/telephony_data_type_sim1 + array/telephony_data_type_sim1 + + + + + 0 + + drawable/stat_sys_data_fully_connected_g + + drawable/stat_sys_data_fully_connected_e + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_1x + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_1x + + drawable/stat_sys_data_fully_connected_h + + drawable/stat_sys_data_fully_connected_h + + drawable/stat_sys_data_fully_connected_h + + 0 + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_g + + drawable/stat_sys_data_fully_connected_3g + + 0 + + + + + + + + + + + + + drawable/stat_sys_data_fully_connected_3g + + drawable/stat_sys_data_fully_connected_4g + + drawable/stat_sys_data_fully_connected_4g_plus + + + + + + 0 + + string/accessibility_data_connection_gprs + + string/accessibility_data_connection_edge + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_cdma + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_cdma + + string/accessibility_data_connection_3.5g + + string/accessibility_data_connection_3.5g + + string/accessibility_data_connection_3.5g + + 0 + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_lte + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_3.5g + + string/accessibility_data_connection_gprs + + string/accessibility_data_connection_3g + + 0 + + + + + string/accessibility_data_connection_3g + + string/accessibility_data_connection_4g + + + + + + array/data_activity_sim1 + array/data_activity_sim1 + array/data_activity_sim1 + + + + array/telephony_data_activity_unknown_sim1 + array/telephony_data_activity_g_sim1 + array/telephony_data_activity_e_sim1 + array/telephony_data_activity_2g_sim1 + array/telephony_data_activity_3g_sim1 + array/telephony_data_activity_4g_sim1 + array/telephony_data_activity_h_sim1 + array/telephony_data_activity_hp_sim1 + array/telephony_data_activity_1x_sim1 + array/telephony_data_activity_lte_sim1 + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + 0 + drawable/stat_sys_signal_in_auto_mirrored + drawable/stat_sys_signal_out_auto_mirrored + drawable/stat_sys_signal_inout_auto_mirrored + 0 + + + + + + + + + + + + + array/telephony_siganl_strength_sim1 + array/telephony_siganl_strength_sim1 + array/telephony_siganl_strength_sim1 + + + + + array/telephony_siganl_strength_roaming_sim1 + array/telephony_siganl_strength_roaming_sim1 + array/telephony_siganl_strength_roaming_sim1 + + + + array/telephony_signal_strength_g_sim1 + array/telephony_signal_strength_e_sim1 + array/telephony_signal_strength_3g_sim1 + array/telephony_signal_strength_4g_sim1 + array/telephony_signal_strength_h_sim1 + array/telephony_signal_strength_hp_sim1 + array/telephony_signal_strength_1x_sim1 + array/telephony_signal_strength_cdma_sim1 + array/telephony_signal_strength_umts_sim1 + + + + + + + + + + array/telephony_signal_strength_g_roaming_sim1 + array/telephony_signal_strength_e_roaming_sim1 + array/telephony_signal_strength_3g_roaming_sim1 + array/telephony_signal_strength_4g_roaming_sim1 + array/telephony_signal_strength_h_roaming_sim1 + array/telephony_signal_strength_hp_roaming_sim1 + array/telephony_signal_strength_1x_roaming_sim1 + array/telephony_signal_strength_cdma_roaming_sim1 + array/telephony_signal_strength_umts_roaming_sim1 + + + + + + + + + + array/signal_strength_g_normal_sim1 + array/signal_strength_g_fully_sim1 + + + + array/signal_strength_g_normal_roaming_sim1 + array/signal_strength_g_fully_roaming_sim1 + + + + array/signal_strength_e_normal_sim1 + array/signal_strength_e_fully_sim1 + + + + array/signal_strength_e_normal_roaming_sim1 + array/signal_strength_e_fully_roaming_sim1 + + + + array/signal_strength_3g_normal_sim1 + array/signal_strength_3g_fully_sim1 + + + + array/signal_strength_3g_normal_roaming_sim1 + array/signal_strength_3g_fully_roaming_sim1 + + + + array/signal_strength_4g_normal_sim1 + array/signal_strength_4g_fully_sim1 + + + + array/signal_strength_4g_normal_roaming_sim1 + array/signal_strength_4g_fully_roaming_sim1 + + + + array/signal_strength_h_normal_sim1 + array/signal_strength_h_fully_sim1 + + + + array/signal_strength_h_normal_roaming_sim1 + array/signal_strength_h_fully_roaming_sim1 + + + + array/signal_strength_hp_normal_sim1 + array/signal_strength_hp_fully_sim1 + + + + array/signal_strength_hp_normal_roaming_sim1 + array/signal_strength_hp_fully_roaming_sim1 + + + + array/signal_strength_1x_normal_sim1 + array/signal_strength_1x_fully_sim1 + + + + array/signal_strength_1x_normal_roaming_sim1 + array/signal_strength_1x_fully_roaming_sim1 + + + + array/signal_strength_cdma_normal_sim1 + array/signal_strength_cdma_fully_sim1 + + + + array/signal_strength_cdma_normal_roaming_sim1 + array/signal_strength_cdma_fully_roaming_sim1 + + + + array/signal_strength_umts_normal_sim1 + array/signal_strength_umts_fully_sim1 + + + + array/signal_strength_umts_normal_roaming_sim1 + array/signal_strength_umts_fully_roaming_sim1 + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + drawable/stat_sys_signal_0_fully + drawable/stat_sys_signal_1_fully + drawable/stat_sys_signal_2_fully + drawable/stat_sys_signal_3_fully + drawable/stat_sys_signal_4_fully + + + + + string/accessibility_no_phone + string/accessibility_phone_one_bar + string/accessibility_phone_two_bars + string/accessibility_phone_three_bars + string/accessibility_phone_signal_full + + + + + + drawable/stat_sys_signal_null + drawable/stat_sys_signal_null + drawable/stat_sys_signal_null + + + + + + drawable/stat_sys_no_sims + drawable/stat_sys_no_sims + drawable/stat_sys_no_sims + + + + + array/signal_strength_g_normal_sim2 + array/signal_strength_g_fully_sim2 + + + array/signal_strength_g_normal_roaming_sim2 + array/signal_strength_g_fully_roaming_sim2 + + + array/signal_strength_e_normal_sim2 + array/signal_strength_e_fully_sim2 + + + array/signal_strength_e_normal_roaming_sim2 + array/signal_strength_e_fully_roaming_sim2 + + + array/signal_strength_3g_normal_sim2 + array/signal_strength_3g_fully_sim2 + + + array/signal_strength_3g_normal_roaming_sim2 + array/signal_strength_3g_fully_roaming_sim2 + + + array/signal_strength_4g_normal_sim2 + array/signal_strength_4g_fully_sim2 + + + array/signal_strength_4g_normal_roaming_sim2 + array/signal_strength_4g_fully_roaming_sim2 + + + array/signal_strength_h_normal_sim2 + array/signal_strength_h_fully_sim2 + + + array/signal_strength_h_normal_roaming_sim2 + array/signal_strength_h_fully_roaming_sim2 + + + array/signal_strength_hp_normal_sim2 + array/signal_strength_hp_fully_sim2 + + + array/signal_strength_hp_normal_roaming_sim2 + array/signal_strength_hp_fully_roaming_sim2 + + + array/signal_strength_1x_normal_sim2 + array/signal_strength_1x_fully_sim2 + + + array/signal_strength_1x_normal_roaming_sim2 + array/signal_strength_1x_fully_roaming_sim2 + + + array/signal_strength_cdma_normal_sim2 + array/signal_strength_cdma_fully_sim2 + + + array/signal_strength_cdma_normal_roaming_sim2 + array/signal_strength_cdma_fully_roaming_sim2 + + + array/signal_strength_umts_normal_sim2 + array/signal_strength_umts_fully_sim2 + + + array/signal_strength_umts_normal_roaming_sim2 + array/signal_strength_umts_fully_roaming_sim2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + array/signal_strength_g_normal_sim3 + array/signal_strength_g_fully_sim3 + + + array/signal_strength_g_normal_roaming_sim3 + array/signal_strength_g_fully_roaming_sim3 + + + array/signal_strength_e_normal_sim3 + array/signal_strength_e_fully_sim3 + + + array/signal_strength_e_normal_roaming_sim3 + array/signal_strength_e_fully_roaming_sim3 + + + array/signal_strength_3g_normal_sim3 + array/signal_strength_3g_fully_sim3 + + + array/signal_strength_3g_normal_roaming_sim3 + array/signal_strength_3g_fully_roaming_sim3 + + + array/signal_strength_4g_normal_sim3 + array/signal_strength_4g_fully_sim3 + + + array/signal_strength_4g_normal_roaming_sim3 + array/signal_strength_4g_fully_roaming_sim3 + + + array/signal_strength_h_normal_sim3 + array/signal_strength_h_fully_sim3 + + + array/signal_strength_h_normal_roaming_sim3 + array/signal_strength_h_fully_roaming_sim3 + + + array/signal_strength_hp_normal_sim3 + array/signal_strength_hp_fully_sim3 + + + array/signal_strength_hp_normal_roaming_sim3 + array/signal_strength_hp_fully_roaming_sim3 + + + array/signal_strength_1x_normal_sim3 + array/signal_strength_1x_fully_sim3 + + + array/signal_strength_1x_normal_roaming_sim3 + array/signal_strength_1x_fully_roaming_sim3 + + + array/signal_strength_cdma_normal_sim3 + array/signal_strength_cdma_fully_sim3 + + + array/signal_strength_cdma_normal_roaming_sim3 + array/signal_strength_cdma_fully_roaming_sim3 + + + array/signal_strength_umts_normal_sim3 + array/signal_strength_umts_fully_sim3 + + + array/signal_strength_umts_normal_roaming_sim3 + array/signal_strength_umts_fully_roaming_sim3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @drawable/stat_sys_signal_0_3g + @drawable/stat_sys_signal_0_4g + @drawable/stat_sys_signal_1_3g + @drawable/stat_sys_signal_1_4g + @drawable/stat_sys_signal_2_3g + @drawable/stat_sys_signal_2_4g + @drawable/stat_sys_signal_3_3g + @drawable/stat_sys_signal_3_4g + @drawable/stat_sys_signal_4_3g + @drawable/stat_sys_signal_4_4g + @drawable/stat_sys_signal_0_3g_fully + @drawable/stat_sys_signal_0_4g_fully + @drawable/stat_sys_signal_1_3g_fully + @drawable/stat_sys_signal_1_4g_fully + @drawable/stat_sys_signal_2_3g_fully + @drawable/stat_sys_signal_2_4g_fully + @drawable/stat_sys_signal_3_3g_fully + @drawable/stat_sys_signal_3_4g_fully + @drawable/stat_sys_signal_4_3g_fully + @drawable/stat_sys_signal_4_4g_fully + + + + @drawable/stat_sys_signal_0_3g_default + @drawable/stat_sys_signal_0_4g_default + @drawable/stat_sys_signal_1_3g_default + @drawable/stat_sys_signal_1_4g_default + @drawable/stat_sys_signal_2_3g_default + @drawable/stat_sys_signal_2_4g_default + @drawable/stat_sys_signal_3_3g_default + @drawable/stat_sys_signal_3_4g_default + @drawable/stat_sys_signal_4_3g_default + @drawable/stat_sys_signal_4_4g_default + @drawable/stat_sys_signal_0_3g_default_fully + @drawable/stat_sys_signal_0_4g_default_fully + @drawable/stat_sys_signal_1_3g_default_fully + @drawable/stat_sys_signal_1_4g_default_fully + @drawable/stat_sys_signal_2_3g_default_fully + @drawable/stat_sys_signal_2_4g_default_fully + @drawable/stat_sys_signal_3_3g_default_fully + @drawable/stat_sys_signal_3_4g_default_fully + @drawable/stat_sys_signal_4_3g_default_fully + @drawable/stat_sys_signal_4_4g_default_fully + diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml old mode 100644 new mode 100755 index 02b1b50859cdd1151e9dc3c2bfd16417e13b3b95..5050819515e6c759181ceac5d29156df7dbb74d4 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -116,6 +116,38 @@ true + + false + + + false + + + false + + + false + + + 0 + + + false + 5000 @@ -264,5 +296,16 @@ false + + true + + + false + + false + false + + false + false diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 2a4752a6a086e4cd1aeea796d27534711121efd9..12b782cdac874a0c734e05b6dd96bf8059e8f0b6 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -434,7 +434,7 @@ 24dp 24dp - 65dp + 90dp 12sp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f7a169cb4d5b6d028e8c925b1173182af567fde7..8927a2c57e192aefc934b7389039f8157291eb14 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -348,6 +348,9 @@ 4G + + 4G+ + LTE diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java index 076b5bcd0861c6eb9dc674e3e4dae29cfdc6776f..702157ab2ecb6d51199ce9a7cbe48f073d716d30 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterDrawable.java @@ -100,6 +100,17 @@ public class BatteryMeterDrawable extends Drawable implements private int mLevel = -1; private boolean mPluggedIn; private boolean mListening; + private static final int ADD_LEVEL = 10; + private static final int ANIM_DURATION = 500; + private int mAnimOffset; + private boolean mCharging; + + private final Runnable mInvalidate = new Runnable() { + @Override + public void run() { + invalidateSelf(); + } + }; public BatteryMeterDrawable(Context context, Handler handler, int frameColor) { mContext = context; @@ -199,12 +210,7 @@ public class BatteryMeterDrawable extends Drawable implements } private void postInvalidate() { - mHandler.post(new Runnable() { - @Override - public void run() { - invalidateSelf(); - } - }); + mHandler.post(mInvalidate); } public void setBatteryController(BatteryController batteryController) { @@ -216,7 +222,7 @@ public class BatteryMeterDrawable extends Drawable implements public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) { mLevel = level; mPluggedIn = pluggedIn; - + mCharging = charging; postInvalidate(); } @@ -226,6 +232,26 @@ public class BatteryMeterDrawable extends Drawable implements invalidateSelf(); } + private int updateChargingAnimLevel() { + int curLevel = mLevel; + if (!mCharging) { + mAnimOffset = 0; + mHandler.removeCallbacks(mInvalidate); + } else { + curLevel += mAnimOffset; + if (curLevel >= FULL) { + curLevel = 100; + mAnimOffset = 0; + } else { + mAnimOffset += ADD_LEVEL; + } + + mHandler.removeCallbacks(mInvalidate); + mHandler.postDelayed(mInvalidate, ANIM_DURATION); + } + return curLevel; + } + private static float[] loadBoltPoints(Resources res) { final int[] pts = res.getIntArray(R.array.batterymeter_bolt_points); int maxX = 0, maxY = 0; @@ -323,7 +349,11 @@ public class BatteryMeterDrawable extends Drawable implements @Override public void draw(Canvas c) { - final int level = mLevel; + final boolean showChargingAnim + = mContext.getResources().getBoolean(R.bool.config_show_battery_charging_anim); + final int level = showChargingAnim + ? updateChargingAnimLevel() + : mLevel; if (level == -1) return; @@ -517,5 +547,4 @@ public class BatteryMeterDrawable extends Drawable implements postInvalidate(); } } - } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 0de5105485dc25dc36be48acdd97f47ef3a23dd5..88869d9e9919a0b5b51a8583f5b7dd51d96c3432 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -196,8 +196,9 @@ public class CellularTile extends QSTile { @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { + int qsType, boolean activityIn, boolean activityOut, int dataActivityId, + int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon, + String typeContentDescription, String description, boolean isWide, int subId) { if (qsIcon == null) { // Not data sim, don't display. return; diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java index d7894772454dd10eff05aed34b7a71e76b26929f..921459c37e9ad9e906270df0cec12bf4c9a5c9ce 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java @@ -385,7 +385,11 @@ class DeleteImageInBackgroundTask extends AsyncTask { Uri screenshotUri = params[0]; ContentResolver resolver = mContext.getContentResolver(); - resolver.delete(screenshotUri, null, null); + try{ + resolver.delete(screenshotUri, null, null); + } catch (UnsupportedOperationException e) { + e.printStackTrace(); + } return null; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index 599e575a0e24094932311922fe99286bd343ae10..67a41d50b800533ee1483d448cc562e1d099940e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -26,6 +26,8 @@ import android.graphics.drawable.Animatable; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.util.ArraySet; import android.util.AttributeSet; import android.util.Log; @@ -51,7 +53,7 @@ import java.util.List; // Intimately tied to the design of res/layout/signal_cluster_view.xml public class SignalClusterView extends LinearLayout - implements NetworkControllerImpl.SignalCallback, + implements NetworkControllerImpl.SignalCallbackExtended, SecurityController.SecurityControllerCallback, Tunable { static final String TAG = "SignalClusterView"; @@ -71,8 +73,9 @@ public class SignalClusterView private int mEthernetIconId = 0; private int mLastEthernetIconId = -1; private boolean mWifiVisible = false; - private int mWifiStrengthId = 0; - private int mLastWifiStrengthId = -1; + private boolean mImsOverWifi = false; + private int mWifiStrengthId = 0, mWifiActivityId = 0; + private int mLastWifiStrengthId = -1, mLastWifiActivityId = -1; private boolean mIsAirplaneMode = false; private int mAirplaneIconId = 0; private int mLastAirplaneIconId = -1; @@ -83,10 +86,13 @@ public class SignalClusterView private int mIconTint = Color.WHITE; private float mDarkIntensity; private final Rect mTintArea = new Rect(); + private int mNoSimsIcon; ViewGroup mEthernetGroup, mWifiGroup; View mNoSimsCombo; - ImageView mVpn, mEthernet, mWifi, mAirplane, mNoSims, mEthernetDark, mWifiDark, mNoSimsDark; + ImageView mVpn, mEthernet, mWifi, mAirplane, + mNoSims, mEthernetDark, mWifiDark, mNoSimsDark, mImsOverWifiImageView; + ImageView mWifiActivity; View mWifiAirplaneSpacer; View mWifiSignalSpacer; LinearLayout mMobileSignalGroup; @@ -177,9 +183,11 @@ public class SignalClusterView mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo); mWifi = (ImageView) findViewById(R.id.wifi_signal); mWifiDark = (ImageView) findViewById(R.id.wifi_signal_dark); + mWifiActivity = (ImageView) findViewById(R.id.wifi_inout); mAirplane = (ImageView) findViewById(R.id.airplane); mNoSims = (ImageView) findViewById(R.id.no_sims); mNoSimsDark = (ImageView) findViewById(R.id.no_sims_dark); + mImsOverWifiImageView = (ImageView) findViewById(R.id.ims_over_wifi); mNoSimsCombo = findViewById(R.id.no_sims_combo); mWifiAirplaneSpacer = findViewById(R.id.wifi_airplane_spacer); mWifiSignalSpacer = findViewById(R.id.wifi_signal_spacer); @@ -226,6 +234,14 @@ public class SignalClusterView @Override protected void onDetachedFromWindow() { + mVpn = null; + mEthernetGroup = null; + mEthernet = null; + mWifiGroup = null; + mWifi = null; + mWifiActivity = null; + mAirplane = null; + mImsOverWifiImageView = null; mMobileSignalGroup.removeAllViews(); TunerService.get(mContext).removeTunable(this); mSC.removeCallback(this); @@ -259,6 +275,7 @@ public class SignalClusterView boolean activityIn, boolean activityOut, String description) { mWifiVisible = statusIcon.visible && !mBlockWifi; mWifiStrengthId = statusIcon.icon; + mWifiActivityId = getWifiActivityId(activityIn, activityOut); mWifiDescription = statusIcon.contentDescription; apply(); @@ -266,8 +283,9 @@ public class SignalClusterView @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { + int qsType, boolean activityIn, boolean activityOut, int dataActivityId, + int mobileActivityId, int stackedDataId, int stackedVoiceId, + String typeContentDescription, String description, boolean isWide, int subId) { PhoneState state = getState(subId); if (state == null) { return; @@ -278,10 +296,33 @@ public class SignalClusterView state.mMobileDescription = statusIcon.contentDescription; state.mMobileTypeDescription = typeContentDescription; state.mIsMobileTypeIconWide = statusType != 0 && isWide; + state.mDataActivityId = dataActivityId; + state.mMobileActivityId = mobileActivityId; + state.mStackedDataId = stackedDataId; + state.mStackedVoiceId = stackedVoiceId; apply(); } + @Override + public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, + int qsType, boolean activityIn, boolean activityOut, int dataActivityId, + int mobileActivityId, int stackedDataId, int stackedVoiceId, + String typeContentDescription, String description, boolean isWide, int subId, + int dataNetworkTypeInRoamingId, int embmsIconId, int imsIconId, boolean isImsOverWifi) { + PhoneState state = getState(subId); + if (state == null) { + return; + } + state.mDataNetworkTypeInRoamingId = dataNetworkTypeInRoamingId; + state.mMobileEmbmsId = embmsIconId; + state.mMobileImsId = imsIconId; + mImsOverWifi = isImsOverWifi; + this.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, activityIn, + activityOut, dataActivityId, mobileActivityId, stackedDataId, + stackedVoiceId, typeContentDescription, description, isWide, subId); + } + @Override public void setEthernetIndicators(IconState state) { mEthernetVisible = state.visible && !mBlockEthernet; @@ -291,6 +332,17 @@ public class SignalClusterView apply(); } + private boolean getImsOverWifiStatus(int subId) { + TelephonyManager tm = + (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); + if (tm != null + && (tm.isVoWifiCallingAvailableForSubscriber(subId) + || tm.isVideoTelephonyWifiCallingAvailableForSubscriber(subId))) { + return true; + } + return false; + } + @Override public void setNoSims(boolean show) { mNoSimsVisible = show && !mBlockMobile; @@ -316,9 +368,12 @@ public class SignalClusterView mMobileSignalGroup.removeAllViews(); } final int n = subs.size(); + boolean imsOverWiFi = false; for (int i = 0; i < n; i++) { inflatePhoneState(subs.get(i).getSubscriptionId()); + imsOverWiFi |= getImsOverWifiStatus(subs.get(i).getSubscriptionId()); } + mImsOverWifi = imsOverWiFi; if (isAttachedToWindow()) { applyIconTint(); } @@ -347,6 +402,43 @@ public class SignalClusterView return null; } + + private int getWifiActivityId(boolean activityIn, boolean activityOut) { + if (!getContext().getResources().getBoolean(R.bool.config_showWifiActivity)) { + return 0; + } + int activityId = 0; + if (activityIn && activityOut) { + activityId = R.drawable.stat_sys_wifi_inout; + } else if (activityIn) { + activityId = R.drawable.stat_sys_wifi_in; + } else if (activityOut) { + activityId = R.drawable.stat_sys_wifi_out; + } + return activityId; + } + + private int getNoSimIcon() { + int resId = 0; + final String[] noSimArray; + Resources res = getContext().getResources(); + + if (!res.getBoolean(R.bool.config_read_icons_from_xml)) return resId; + + try { + noSimArray = res.getStringArray(R.array.multi_no_sim); + } catch (android.content.res.Resources.NotFoundException e) { + return resId; + } + + if (noSimArray == null) return resId; + + String resName = noSimArray[0]; + resId = res.getIdentifier(resName, null, getContext().getPackageName()); + if (DEBUG) Log.d(TAG, "getNoSimIcon resId = " + resId + " resName = " + resName); + return resId; + } + private PhoneState inflatePhoneState(int subId) { PhoneState state = new PhoneState(subId, mContext); if (mMobileSignalGroup != null) { @@ -401,6 +493,11 @@ public class SignalClusterView mLastWifiStrengthId = -1; } + if (mWifiActivity != null) { + mWifiActivity.setImageDrawable(null); + mLastWifiActivityId = -1; + } + for (PhoneState state : mPhoneStates) { if (state.mMobile != null) { state.maybeStopAnimatableDrawable(state.mMobile); @@ -460,6 +557,10 @@ public class SignalClusterView setIconForView(mWifiDark, mWifiStrengthId); mLastWifiStrengthId = mWifiStrengthId; } + if (mWifiActivityId != mLastWifiActivityId) { + mWifiActivity.setImageResource(mWifiActivityId); + mLastWifiActivityId = mWifiActivityId; + } mWifiGroup.setContentDescription(mWifiDescription); mWifiGroup.setVisibility(View.VISIBLE); } else { @@ -467,9 +568,9 @@ public class SignalClusterView } if (DEBUG) Log.d(TAG, - String.format("wifi: %s sig=%d", + String.format("wifi: %s sig=%d act=%d", (mWifiVisible ? "VISIBLE" : "GONE"), - mWifiStrengthId)); + mWifiStrengthId, mWifiActivityId)); boolean anyMobileVisible = false; int firstMobileTypeId = 0; @@ -493,6 +594,12 @@ public class SignalClusterView mAirplane.setVisibility(View.GONE); } + if (mImsOverWifi){ + mImsOverWifiImageView.setVisibility(View.VISIBLE); + } else { + mImsOverWifiImageView.setVisibility(View.GONE); + } + if (mIsAirplaneMode && mWifiVisible) { mWifiAirplaneSpacer.setVisibility(View.VISIBLE); } else { @@ -505,6 +612,13 @@ public class SignalClusterView mWifiSignalSpacer.setVisibility(View.GONE); } + if (mNoSimsVisible && mNoSims != null && mNoSimsDark != null) { + if (mNoSimsIcon == 0) mNoSimsIcon = getNoSimIcon(); + if (mNoSimsIcon != 0) { + mNoSims.setImageResource(mNoSimsIcon); + mNoSimsDark.setImageResource(mNoSimsIcon); + } + } mNoSimsCombo.setVisibility(mNoSimsVisible ? View.VISIBLE : View.GONE); boolean anythingVisible = mNoSimsVisible || mWifiVisible || mIsAirplaneMode @@ -574,7 +688,15 @@ public class SignalClusterView private String mMobileDescription, mMobileTypeDescription; private ViewGroup mMobileGroup; - private ImageView mMobile, mMobileDark, mMobileType; + private ImageView mMobile, mMobileDark, mMobileType, mRoaming, mDataNetworkTypeInRoaming, + mMobileEmbms, mMobileIms; + + private int mDataActivityId = 0, mMobileActivityId = 0, mDataNetworkTypeInRoamingId =0, + mMobileEmbmsId = 0, mMobileImsId = 0; + + private int mStackedDataId = 0, mStackedVoiceId = 0; + private ImageView mDataActivity, mMobileActivity, mStackedData, mStackedVoice; + private ViewGroup mMobileSingleGroup, mMobileStackedGroup; public PhoneState(int subId, Context context) { ViewGroup root = (ViewGroup) LayoutInflater.from(context) @@ -588,6 +710,18 @@ public class SignalClusterView mMobile = (ImageView) root.findViewById(R.id.mobile_signal); mMobileDark = (ImageView) root.findViewById(R.id.mobile_signal_dark); mMobileType = (ImageView) root.findViewById(R.id.mobile_type); + mMobileActivity = (ImageView) root.findViewById(R.id.mobile_inout); + mMobileIms = (ImageView) root.findViewById(R.id.volte_vowifi); + + mDataNetworkTypeInRoaming = (ImageView) root + .findViewById(R.id.dataNetwork_type_in_roaming); + mMobileEmbms = (ImageView) root.findViewById(R.id.embms); + mDataActivity = (ImageView) root.findViewById(R.id.data_inout); + mStackedData = (ImageView) root.findViewById(R.id.mobile_signal_data); + mStackedVoice = (ImageView) root.findViewById(R.id.mobile_signal_voice); + + mMobileSingleGroup = (ViewGroup) root.findViewById(R.id.mobile_signal_single); + mMobileStackedGroup = (ViewGroup) root.findViewById(R.id.mobile_signal_stacked); } public boolean apply(boolean isSecondaryIcon) { @@ -602,6 +736,42 @@ public class SignalClusterView mMobileType.setImageResource(mMobileTypeId); mLastMobileTypeId = mMobileTypeId; } + + mDataActivity.setImageResource(mDataActivityId); + Drawable dataActivityDrawable = mDataActivity.getDrawable(); + if (dataActivityDrawable instanceof Animatable) { + Animatable ad = (Animatable) dataActivityDrawable; + if (!ad.isRunning()) { + ad.start(); + } + } + + mMobileActivity.setImageResource(mMobileActivityId); + Drawable mobileActivityDrawable = mMobileActivity.getDrawable(); + if (mobileActivityDrawable instanceof Animatable) { + Animatable ad = (Animatable) mobileActivityDrawable; + if (!ad.isRunning()) { + ad.start(); + } + } + + mMobileEmbms.setImageResource(mMobileEmbmsId); + + mDataNetworkTypeInRoaming.setImageResource(mDataNetworkTypeInRoamingId); + mMobileIms.setImageResource(mMobileImsId); + + if (mStackedDataId != 0 && mStackedVoiceId != 0) { + mStackedData.setImageResource(mStackedDataId); + mStackedVoice.setImageResource(mStackedVoiceId); + mMobileSingleGroup.setVisibility(View.GONE); + mMobileStackedGroup.setVisibility(View.VISIBLE); + } else { + mStackedData.setImageResource(0); + mStackedVoice.setImageResource(0); + mMobileSingleGroup.setVisibility(View.VISIBLE); + mMobileStackedGroup.setVisibility(View.GONE); + } + mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription); mMobileGroup.setVisibility(View.VISIBLE); @@ -623,6 +793,12 @@ public class SignalClusterView (mMobileVisible ? "VISIBLE" : "GONE"), mMobileStrengthId, mMobileTypeId)); mMobileType.setVisibility(mMobileTypeId != 0 ? View.VISIBLE : View.GONE); + mDataActivity.setVisibility(mDataActivityId != 0 ? View.VISIBLE : View.GONE); + mMobileActivity.setVisibility(mMobileActivityId != 0 ? View.VISIBLE : View.GONE); + mDataNetworkTypeInRoaming.setVisibility(mDataNetworkTypeInRoamingId != 0 ? View.VISIBLE + : View.GONE); + mMobileEmbms.setVisibility(mMobileEmbmsId != 0 ? View.VISIBLE : View.GONE); + mMobileIms.setVisibility(mMobileImsId != 0 ? View.VISIBLE : View.GONE); return mMobileVisible; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 772c76642b9eb921683902dc4c9261766b77fe9e..e0290b0fbb12bfa2616d1f588f5dc6d0d94ceebd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -35,6 +35,7 @@ import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; +import android.os.SystemProperties; import android.os.UserHandle; import android.provider.MediaStore; import android.service.media.CameraPrewarmService; @@ -49,6 +50,7 @@ import android.widget.FrameLayout; import android.widget.TextView; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.EmergencyButton; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.EventLogConstants; @@ -92,6 +94,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL private static final int DOZE_ANIMATION_STAGGER_DELAY = 48; private static final int DOZE_ANIMATION_ELEMENT_DURATION = 250; + private EmergencyButton mEmergencyButton; private KeyguardAffordanceView mCameraImageView; private KeyguardAffordanceView mLeftAffordanceView; private LockIcon mLockIcon; @@ -189,6 +192,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL super.onFinishInflate(); mLockPatternUtils = new LockPatternUtils(mContext); mPreviewContainer = (ViewGroup) findViewById(R.id.preview_container); + mEmergencyButton = (EmergencyButton) findViewById(R.id.emergency_call_button); mCameraImageView = (KeyguardAffordanceView) findViewById(R.id.camera_button); mLeftAffordanceView = (KeyguardAffordanceView) findViewById(R.id.left_button); mLockIcon = (LockIcon) findViewById(R.id.lock_icon); @@ -198,6 +202,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL mUnlockMethodCache = UnlockMethodCache.getInstance(getContext()); mUnlockMethodCache.addListener(this); mLockIcon.update(); + updateEmergencyButton(); setClipChildren(false); setClipToPadding(false); mPreviewInflater = new PreviewInflater(mContext, new LockPatternUtils(mContext)); @@ -248,6 +253,7 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL lp.height = getResources().getDimensionPixelSize(R.dimen.keyguard_affordance_height); mLeftAffordanceView.setLayoutParams(lp); updateLeftAffordanceIcon(); + updateEmergencyButton(); } public void setActivityStarter(ActivityStarter activityStarter) { @@ -698,4 +704,12 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL updateLeftAffordanceIcon(); updateLeftPreview(); } + + private void updateEmergencyButton() { + if (SystemProperties.getBoolean("persist.radio.emgcy_btn_onswipe",false)) { + if (mEmergencyButton != null) { + mEmergencyButton.updateEmergencyCallButton(); + } + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 7db2870620a0202b1278311929e32686d1dfd08b..584fecd9c8f33420d09ca02571dc31db6f11778a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -149,7 +149,9 @@ public class KeyguardStatusBarView extends RelativeLayout } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) { removeView(mMultiUserSwitch); } - mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE); + boolean showBatteryLevel = getResources().getBoolean(R.bool.config_showBatteryPercentage); + mBatteryLevel.setVisibility( + mBatteryCharging || showBatteryLevel ? View.VISIBLE : View.GONE); } private void updateSystemIconsLayoutParams() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java old mode 100644 new mode 100755 index 056f142299b5f125f3a93b210ad39f0f861a78bd..ecdb9b532319a4975343d70e8d1da8c50fac3f7a --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -64,6 +64,7 @@ public class NavigationBarView extends LinearLayout { View mCurrentView = null; View[] mRotatedViews = new View[4]; + int mBarSize; boolean mVertical; boolean mScreenOn; boolean mLeftInLandscape; @@ -185,6 +186,7 @@ public class NavigationBarView extends LinearLayout { mDisplay = ((WindowManager) context.getSystemService( Context.WINDOW_SERVICE)).getDefaultDisplay(); + mBarSize = context.getResources().getDimensionPixelSize(R.dimen.navigation_bar_size); mVertical = false; mShowMenu = false; mGestureHelper = new NavigationBarGestureHelper(context); 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 e4aa10361e874c87377e5f60d087f614f6a03326..7a6a19f791f058a32d73925cc6abb8af7f5a2b24 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -41,6 +41,7 @@ import com.android.systemui.doze.DozeLog; import com.android.systemui.statusbar.FlingAnimationUtils; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.policy.HeadsUpManager; +import android.util.BoostFramework; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -88,6 +89,12 @@ public abstract class PanelView extends FrameLayout { private FlingAnimationUtils mFlingAnimationUtils; private FalsingManager mFalsingManager; + /** + * For PanelView fling perflock call + */ + private BoostFramework mPerf = null; + private int mBoostParamVal[]; + /** * Whether an instant expand request is currently pending and we are just waiting for layout. */ @@ -187,6 +194,14 @@ public abstract class PanelView extends FrameLayout { mFlingAnimationUtils = new FlingAnimationUtils(context, 0.6f); mBounceInterpolator = new BounceInterpolator(); mFalsingManager = FalsingManager.getInstance(context); + + boolean lIsPerfBoostEnabled = context.getResources().getBoolean( + com.android.internal.R.bool.config_enableCpuBoostForPanelViewFling); + if (lIsPerfBoostEnabled) { + mBoostParamVal = context.getResources().getIntArray( + com.android.internal.R.array.panelview_flingboost_param_value); + mPerf = new BoostFramework(); + } } protected void loadDimens() { @@ -667,16 +682,25 @@ public abstract class PanelView extends FrameLayout { / collapseSpeedUpFactor)); } } + if (mPerf != null) { + mPerf.perfLockAcquire(0, mBoostParamVal); + } animator.addListener(new AnimatorListenerAdapter() { private boolean mCancelled; @Override public void onAnimationCancel(Animator animation) { + if (mPerf != null) { + mPerf.perfLockRelease(); + } mCancelled = true; } @Override public void onAnimationEnd(Animator animation) { + if (mPerf != null) { + mPerf.perfLockRelease(); + } if (clearAllExpandHack && !mCancelled) { setExpandedHeightInternal(getMaxPanelHeight()); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java old mode 100644 new mode 100755 index 1b2ce1bac89d5f676f4fa8a03efe2d4d908f64a4..10ba8d49bb84b72437938db8c2a3bdd631da1d11 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -94,6 +94,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; +import android.view.ViewGroup.MarginLayoutParams; import android.view.ViewParent; import android.view.ViewStub; import android.view.ViewTreeObserver; @@ -379,6 +380,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, int mMaxAllowedKeyguardNotifications; + // carrier label + private TextView mCarrierLabel; + private boolean mShowCarrierInPanel = false; boolean mExpandedVisible; private int mNavigationBarWindowState = WINDOW_STATE_SHOWING; @@ -1016,6 +1020,23 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, initSignalCluster(mStatusBarView); initSignalCluster(mKeyguardStatusBar); + mCarrierLabel = (TextView)mStatusBarWindow.findViewById(R.id.carrier_label); + final boolean showCarrierLabel = mContext.getResources().getBoolean( + R.bool.config_showCarrierLabel); + mShowCarrierInPanel = showCarrierLabel && (mCarrierLabel != null); + if (DEBUG) Log.v(TAG, "carrierlabel=" + mCarrierLabel + " show=" + mShowCarrierInPanel); + if (mShowCarrierInPanel) { + mCarrierLabel.setVisibility(mShowCarrierInPanel ? View.VISIBLE : View.INVISIBLE); + } + + // make sure carrier label is not covered by navigation bar + if (mCarrierLabel != null && mNavigationBarView != null) { + MarginLayoutParams mlp = (MarginLayoutParams) mCarrierLabel.getLayoutParams(); + if (mlp != null && mlp.bottomMargin < mNavigationBarView.mBarSize) { + mlp.bottomMargin = mNavigationBarView.mBarSize; + mCarrierLabel.setLayoutParams(mlp); + } + } mFlashlightController = new FlashlightController(mContext); mKeyguardBottomArea.setFlashlightController(mFlashlightController); mKeyguardBottomArea.setPhoneStatusBar(this); @@ -2032,6 +2053,21 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateNotifications(); } + protected void updateCarrierLabelVisibility() { + if (!mShowCarrierInPanel) return; + + final boolean makeVisible = mStackScroller.getVisibility() == View.VISIBLE + && mState != StatusBarState.KEYGUARD; + + if ((mCarrierLabel.getVisibility() == View.VISIBLE) != makeVisible) { + if (DEBUG) { + Log.d(TAG, "making carrier label " + (makeVisible?"visible":"invisible")); + } + + mCarrierLabel.setVisibility(makeVisible ? View.VISIBLE : View.INVISIBLE); + } + } + @Override protected void setAreThereNotifications() { @@ -2741,8 +2777,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // Expand the window to encompass the full screen in anticipation of the drag. // This is only possible to do atomically because the status bar is at the top of the screen! mStatusBarWindowManager.setPanelVisible(true); - - visibilityChanged(true); + if(!force){ + visibilityChanged(true); + } mWaitingForKeyguardExit = false; disable(mDisabledUnmodified1, mDisabledUnmodified2, !force /* animate */); setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true); @@ -4409,6 +4446,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, updateStackScrollerState(goingToFullShade, fromShadeLocked); updateNotifications(); checkBarModes(); + updateCarrierLabelVisibility(); updateMediaMetaData(false, mState != StatusBarState.KEYGUARD); mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(), mStatusBarKeyguardViewManager.isSecure()); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java old mode 100644 new mode 100755 index 27683a039680cd5afca74197fa664c9d38fb03f1..f5a5a93c297cec1810ac09baf74f5b960c0f788d --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -452,6 +452,8 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro private final HotspotController.Callback mHotspotCallback = new HotspotController.Callback() { @Override public void onHotspotChanged(boolean enabled) { + mIconController.setIcon(mSlotHotspot, R.drawable.stat_sys_hotspot, + mContext.getString(R.string.accessibility_status_bar_hotspot)); mIconController.setIconVisibility(mSlotHotspot, enabled); } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java old mode 100644 new mode 100755 index fa5777570b5d40b9ac2d2a4a73b3277103ec4989..adf8cb7afa4a9d7433007f089647e2fe18a9154f --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java @@ -462,6 +462,13 @@ public class QSTileHost implements QSTile.Host, Tunable { tileList = res.getString(R.string.quick_settings_tiles); if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList); } else { + for (String tile : res.getString(R.string.quick_settings_tiles).split(",")) { + tile = tile.trim(); + if (tile.isEmpty()) continue; + if(tile.startsWith(IntentTile.PREFIX)){ + tileList = tileList.concat(",").concat(tile); + } + } if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList); } final ArrayList tiles = new ArrayList(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java old mode 100644 new mode 100755 index 97b31f248fa1646f0a29240fd60951f0f4b152c3..3619d475163315f3843d1a66388f1ee7f00683fb --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarIconList.java @@ -43,10 +43,10 @@ public class StatusBarIconList { return i; } } - // Auto insert new items at the beginning. - mSlots.add(0, slot); - mIcons.add(0, null); - return 0; + // Auto insert new items at the end. + mSlots.add(slot); + mIcons.add(null); + return N; } public int size() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java index 3142ddfe9fb71fe40112c76b7eb3fddfe1beb64b..66994f3641befb23fdb6b9cb2f5530158f855836 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/CallbackHandler.java @@ -23,6 +23,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallbackExtended; import java.util.ArrayList; import java.util.List; @@ -32,7 +33,7 @@ import java.util.List; * Implements network listeners and forwards the calls along onto other listeners but on * the current or specified Looper. */ -public class CallbackHandler extends Handler implements EmergencyListener, SignalCallback { +public class CallbackHandler extends Handler implements EmergencyListener, SignalCallbackExtended { private static final int MSG_EMERGENCE_CHANGED = 0; private static final int MSG_SUBS_CHANGED = 1; private static final int MSG_NO_SIM_VISIBLE_CHANGED = 2; @@ -123,16 +124,49 @@ public class CallbackHandler extends Handler implements EmergencyListener, Signa @Override public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, - final int statusType, final int qsType,final boolean activityIn, - final boolean activityOut, final String typeContentDescription, - final String description, final boolean isWide, final int subId) { + final int statusType, final int qsType, final boolean activityIn, + final boolean activityOut, final int dataActivityId, final int mobileActivityId, + final int stackedDataIcon, final int stackedVoiceIcon, + final String typeContentDescription, final String description, final boolean isWide, + final int subId) { post(new Runnable() { @Override public void run() { for (SignalCallback signalCluster : mSignalCallbacks) { signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, qsType, - activityIn, activityOut, typeContentDescription, description, isWide, - subId); + activityIn, activityOut, dataActivityId, mobileActivityId, + stackedDataIcon, stackedVoiceIcon, + typeContentDescription, description, isWide, subId); + } + } + }); + } + + @Override + public void setMobileDataIndicators(final IconState statusIcon, final IconState qsIcon, + final int statusType, final int qsType, final boolean activityIn, + final boolean activityOut, final int dataActivityId, final int mobileActivityId, + final int stackedDataIcon, final int stackedVoiceIcon, + final String typeContentDescription, final String description, final boolean isWide, + final int subId, final int dataNetworkTypeInRoamingId, final int embmsIconId, + final int imsIconId, final boolean isImsOverWifi) { + post(new Runnable() { + @Override + public void run() { + for (SignalCallback signalCluster : mSignalCallbacks) { + if (signalCluster instanceof SignalCallbackExtended) { + ((SignalCallbackExtended)signalCluster).setMobileDataIndicators( + statusIcon, qsIcon, statusType, qsType, activityIn, + activityOut, dataActivityId, mobileActivityId, + stackedDataIcon, stackedVoiceIcon, typeContentDescription, + description, isWide, subId, dataNetworkTypeInRoamingId, + embmsIconId, imsIconId, isImsOverWifi); + } else { + signalCluster.setMobileDataIndicators(statusIcon, qsIcon, statusType, + qsType, activityIn, activityOut, dataActivityId, + mobileActivityId, stackedDataIcon, stackedVoiceIcon, + typeContentDescription, description, isWide, subId); + } } } }); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 64230b6585121de189790deb19b69a4010ffb19e..7087a316d0de656361f46b8a9c4f6569ced58bf5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -88,7 +88,7 @@ public class Clock extends TextView implements DemoMode, Tunable { R.styleable.Clock, 0, 0); try { - mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_GONE); + mAmPmStyle = a.getInt(R.styleable.Clock_amPmStyle, AM_PM_STYLE_NORMAL); } finally { a.recycle(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index 83e25ebd7497f3d34afe98521735ba40df2b6d2c..6561ad8d55dbdbd224a855ead6243b9216cc9403 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -17,8 +17,10 @@ package com.android.systemui.statusbar.policy; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.net.NetworkCapabilities; import android.os.Looper; +import android.os.SystemProperties; import android.telephony.PhoneStateListener; import android.telephony.ServiceState; import android.telephony.SignalStrength; @@ -35,12 +37,14 @@ import com.android.internal.telephony.cdma.EriInfo; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; +import com.android.systemui.statusbar.policy.NetworkController.SignalCallbackExtended; import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config; import com.android.systemui.statusbar.policy.NetworkControllerImpl.SubscriptionDefaults; import java.io.PrintWriter; import java.util.BitSet; import java.util.Objects; +import java.util.List; public class MobileSignalController extends SignalController< @@ -57,6 +61,12 @@ public class MobileSignalController extends SignalController< // @VisibleForDemoMode final SparseArray mNetworkToIconLookup; + private boolean mLastShowSpn; + private String mLastSpn; + private String mLastDataSpn; + private boolean mLastShowPlmn; + private String mLastPlmn; + // Since some pieces of the phone state are interdependent we store it locally, // this could potentially become part of MobileState for simplification/complication // of code. @@ -67,6 +77,13 @@ public class MobileSignalController extends SignalController< private MobileIconGroup mDefaultIcons; private Config mConfig; + private final int STATUS_BAR_STYLE_ANDROID_DEFAULT = 0; + private final int STATUS_BAR_STYLE_CDMA_1X_COMBINED = 1; + private final int STATUS_BAR_STYLE_DEFAULT_DATA = 2; + private final int STATUS_BAR_STYLE_DATA_VOICE = 3; + private final int STATUS_BAR_STYLE_EXTENDED = 4; + private int mStyle = STATUS_BAR_STYLE_ANDROID_DEFAULT; + // TODO: Reduce number of vars passed in, if we have the NetworkController, probably don't // need listener lists anymore. public MobileSignalController(Context context, Config config, boolean hasMobileData, @@ -87,7 +104,18 @@ public class MobileSignalController extends SignalController< mNetworkNameDefault = getStringIfExists( com.android.internal.R.string.lockscreen_carrier_default); - mapIconSets(); + if (config.readIconsFromXml) { + TelephonyIcons.readIconsFromXml(context); + mDefaultIcons = !mConfig.showAtLeast3G ? TelephonyIcons.G : TelephonyIcons.THREE_G; + } else { + mapIconSets(); + } + + mStyle = context.getResources().getInteger(R.integer.status_bar_style); + //TODO - Remove this when status_bar_style is set to 4 for carrier one in carrier config + if (isCarrierOneSupported()) { + mStyle = STATUS_BAR_STYLE_EXTENDED; + } String networkName = info.getCarrierName() != null ? info.getCarrierName().toString() : mNetworkNameDefault; @@ -99,9 +127,17 @@ public class MobileSignalController extends SignalController< updateDataSim(); } + //TODO - Remove this when carrier pack is enabled for carrier one + public static boolean isCarrierOneSupported() { + String property = SystemProperties.get("persist.radio.atel.carrier"); + return "405854".equals(property); + } + public void setConfiguration(Config config) { mConfig = config; - mapIconSets(); + if (!config.readIconsFromXml) { + mapIconSets(); + } updateTelephony(); } @@ -165,6 +201,7 @@ public class MobileSignalController extends SignalController< mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EVDO_B, TelephonyIcons.THREE_G); mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_EHRPD, TelephonyIcons.THREE_G); mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UMTS, TelephonyIcons.THREE_G); + mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_TD_SCDMA, TelephonyIcons.THREE_G); if (!mConfig.showAtLeast3G) { mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_UNKNOWN, @@ -197,14 +234,20 @@ public class MobileSignalController extends SignalController< if (mConfig.show4gForLte) { mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.FOUR_G); + mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA, + TelephonyIcons.FOUR_G_PLUS); } else { mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE, TelephonyIcons.LTE); + mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_LTE_CA, TelephonyIcons.LTE); } mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_IWLAN, TelephonyIcons.WFC); } @Override public void notifyListeners(SignalCallback callback) { + if (mConfig.readIconsFromXml) { + generateIconGroup(); + } MobileIconGroup icons = getIcons(); String contentDescription = getStringIfExists(getContentDescription()); @@ -215,7 +258,7 @@ public class MobileSignalController extends SignalController< // Show icon in QS when we are connected or need to show roaming or data is disabled. boolean showDataIcon = mCurrentState.dataConnected || mCurrentState.iconGroup == TelephonyIcons.ROAMING - || dataDisabled; + || isRoaming() || dataDisabled; IconState statusIcon = new IconState(mCurrentState.enabled && !mCurrentState.airplaneMode, getCurrentIconId(), contentDescription); @@ -238,10 +281,88 @@ public class MobileSignalController extends SignalController< showDataIcon &= mCurrentState.isDefault || mCurrentState.iconGroup == TelephonyIcons.ROAMING || dataDisabled; + showDataIcon &= (mStyle == STATUS_BAR_STYLE_ANDROID_DEFAULT + || mStyle == STATUS_BAR_STYLE_EXTENDED); int typeIcon = showDataIcon ? icons.mDataType : 0; - callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, - activityIn, activityOut, dataContentDescription, description, icons.mIsWide, - mSubscriptionInfo.getSubscriptionId()); + int dataActivityId = showMobileActivity() ? 0 : icons.mActivityId; + int mobileActivityId = showMobileActivity() ? icons.mActivityId : 0; + if( callback instanceof SignalCallbackExtended ) { + ((SignalCallbackExtended)callback).setMobileDataIndicators(statusIcon, qsIcon, typeIcon, + qsTypeIcon, activityIn, activityOut, dataActivityId, mobileActivityId, + icons.mStackedDataIcon, icons.mStackedVoiceIcon, + dataContentDescription, description, icons.mIsWide, + mSubscriptionInfo.getSubscriptionId(), getdataNetworkTypeInRoamingId(), + getEmbmsIconId(), getImsIconId(), isImsRegisteredInWifi()); + } else { + callback.setMobileDataIndicators(statusIcon, qsIcon, typeIcon, qsTypeIcon, + activityIn, activityOut, dataActivityId, mobileActivityId, + icons.mStackedDataIcon, icons.mStackedVoiceIcon, + dataContentDescription, description, icons.mIsWide, + mSubscriptionInfo.getSubscriptionId()); + } + } + + private int getdataNetworkTypeInRoamingId() { + if ((mStyle == STATUS_BAR_STYLE_EXTENDED) && isRoaming() + && mCurrentState.dataConnected) { + int dataType = getDataNetworkType(); + if (dataType == TelephonyManager.NETWORK_TYPE_LTE) { + return R.drawable.stat_sys_data_fully_connected_lte_networktype_in_roam; + } else if (dataType == TelephonyManager.NETWORK_TYPE_LTE_CA) { + return R.drawable.stat_sys_data_fully_connected_lte_plus_networktype_in_roam; + } else { + return 0; + } + } else { + return 0; + } + } + + private int getEmbmsIconId() { + if (mStyle == STATUS_BAR_STYLE_EXTENDED + && isEmbmsActiveOnDataSim()) { + return R.drawable.lte_embms_services_all_brackets; + } else { + return 0; + } + } + + private boolean isEmbmsActiveOnDataSim() { + return mNetworkController.isEmbmsActive() + && mCurrentState.dataSim; + } + + private boolean isImsRegisteredInWifi() { + if (mStyle != STATUS_BAR_STYLE_EXTENDED) { + return false; + } + + List subInfos = SubscriptionManager.from(mContext) + .getActiveSubscriptionInfoList(); + if (subInfos != null) { + for (SubscriptionInfo subInfo: subInfos) { + int subId = subInfo.getSubscriptionId(); + if (mPhone != null + && (mPhone.isVoWifiCallingAvailableForSubscriber(subId) + || mPhone.isVideoTelephonyWifiCallingAvailableForSubscriber(subId))) { + return true; + } + } + } else { + Log.e(mTag, "Invalid SubscriptionInfo"); + } + return false; + } + + private int getImsIconId() { + if (mStyle != STATUS_BAR_STYLE_EXTENDED || mServiceState == null || + (mServiceState.getVoiceRegState() != ServiceState.STATE_IN_SERVICE)) { + return 0; + } + if (mCurrentState.imsRadioTechnology == ServiceState.RIL_RADIO_TECHNOLOGY_LTE) { + return R.drawable.volte; + } + return 0; } @Override @@ -249,6 +370,15 @@ public class MobileSignalController extends SignalController< return new MobileState(); } + @Override + public int getCurrentIconId() { + if (mConfig.readIconsFromXml && mCurrentState.connected) { + return getIcons().mSingleSignalIcon; + } else { + return super.getCurrentIconId(); + } + } + private boolean hasService() { if (mServiceState != null) { // Consider the device to be in service if either voice or data @@ -262,7 +392,14 @@ public class MobileSignalController extends SignalController< return false; case ServiceState.STATE_OUT_OF_SERVICE: case ServiceState.STATE_EMERGENCY_ONLY: - return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE; + if (mContext.getResources().getBoolean(R.bool.config_showSignalForIWlan)) { + return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE; + } else { + return ((mServiceState.getDataRegState() == + ServiceState.STATE_IN_SERVICE)&& + (mServiceState.getDataNetworkType() != + TelephonyManager.NETWORK_TYPE_IWLAN)); + } default: return true; } @@ -306,6 +443,11 @@ public class MobileSignalController extends SignalController< } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { updateDataSim(); notifyListenersIfNecessary(); + } else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) { + if (mConfig.showLocale) { + updateNetworkName(mLastShowSpn, mLastSpn, mLastDataSpn, mLastShowPlmn, mLastPlmn); + notifyListenersIfNecessary(); + } } } @@ -325,27 +467,94 @@ public class MobileSignalController extends SignalController< } } + private String getLocalString(String originalString) { + return android.util.NativeTextHelper.getLocalString(mContext, originalString, + com.android.internal.R.array.origin_carrier_names, + com.android.internal.R.array.locale_carrier_names); + } + + private String getNetworkClassString(ServiceState state) { + if (state != null && (state.getDataRegState() == ServiceState.STATE_IN_SERVICE || + state.getVoiceRegState() == ServiceState.STATE_IN_SERVICE)) { + int voiceNetType = state.getVoiceNetworkType(); + int dataNetType = state.getDataNetworkType(); + int chosenNetType = + ((dataNetType == TelephonyManager.NETWORK_TYPE_UNKNOWN) + ? voiceNetType : dataNetType); + return networkClassToString(TelephonyManager.getNetworkClass(chosenNetType)); + } else { + return ""; + } + } + + private String networkClassToString (int networkClass) { + final int[] classIds = + {com.android.internal.R.string.config_rat_unknown, // TelephonyManager.NETWORK_CLASS_UNKNOWN + com.android.internal.R.string.config_rat_2g, + com.android.internal.R.string.config_rat_3g, + com.android.internal.R.string.config_rat_4g }; + String classString = null; + if (networkClass < classIds.length) { + classString = mContext.getResources().getString(classIds[networkClass]); + } + return (classString == null) ? "" : classString; + } + /** * Updates the network's name based on incoming spn and plmn. */ void updateNetworkName(boolean showSpn, String spn, String dataSpn, boolean showPlmn, String plmn) { + mLastShowSpn = showSpn; + mLastSpn = spn; + mLastDataSpn = dataSpn; + mLastShowPlmn = showPlmn; + mLastPlmn = plmn; if (CHATTY) { Log.d("CarrierLabel", "updateNetworkName showSpn=" + showSpn + " spn=" + spn + " dataSpn=" + dataSpn + " showPlmn=" + showPlmn + " plmn=" + plmn); } + if (mConfig.showLocale) { + if (showSpn && !TextUtils.isEmpty(spn)) { + spn = getLocalString(spn); + } + if (showSpn && !TextUtils.isEmpty(dataSpn)) { + dataSpn = getLocalString(dataSpn); + } + if (showPlmn && !TextUtils.isEmpty(plmn)) { + plmn = getLocalString(plmn); + } + } + if (showPlmn && showSpn && !TextUtils.isEmpty(spn) && !TextUtils.isEmpty(plmn) + && plmn.equals(spn)) { + showSpn = false; + } + boolean showRat = mConfig.showRat; + int[] subId = SubscriptionManager.getSubId(getSimSlotIndex()); + if (subId != null && subId.length >= 1) { + showRat = SubscriptionManager.getResourcesForSubId(mContext, + subId[0]).getBoolean(com.android.internal.R.bool.config_display_rat); + } + String networkClass = getNetworkClassString(mServiceState); + Log.d(mTag, "networkClass=" + networkClass + " showRat=" + showRat + + " slot=" + getSimSlotIndex()); StringBuilder str = new StringBuilder(); StringBuilder strData = new StringBuilder(); if (showPlmn && plmn != null) { str.append(plmn); strData.append(plmn); + if (showRat) { + str.append(" ").append(networkClass); + strData.append(" ").append(networkClass); + } } if (showSpn && spn != null) { if (str.length() != 0) { str.append(mNetworkNameSeparator); } str.append(spn); + if (showRat) str.append(" ").append(networkClass); } if (str.length() != 0) { mCurrentState.networkName = str.toString(); @@ -357,6 +566,7 @@ public class MobileSignalController extends SignalController< strData.append(mNetworkNameSeparator); } strData.append(dataSpn); + if (showRat) strData.append(" ").append(networkClass); } if (strData.length() != 0) { mCurrentState.networkNameData = strData.toString(); @@ -372,7 +582,7 @@ public class MobileSignalController extends SignalController< */ private final void updateTelephony() { if (DEBUG) { - Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService() + Log.d(mTag, "updateTelephony: hasService=" + hasService() + " ss=" + mSignalStrength); } mCurrentState.connected = hasService() && mSignalStrength != null; @@ -381,6 +591,13 @@ public class MobileSignalController extends SignalController< mCurrentState.level = mSignalStrength.getCdmaLevel(); } else { mCurrentState.level = mSignalStrength.getLevel(); + if (mConfig.showRsrpSignalLevelforLTE) { + int dataType = mServiceState.getDataNetworkType(); + if (dataType == TelephonyManager.NETWORK_TYPE_LTE || + dataType == TelephonyManager.NETWORK_TYPE_LTE_CA) { + mCurrentState.level = getAlternateLteLevel(mSignalStrength); + } + } } } if (mNetworkToIconLookup.indexOfKey(mDataNetType) >= 0) { @@ -408,6 +625,20 @@ public class MobileSignalController extends SignalController< mCurrentState.networkName = mServiceState.getOperatorAlphaShort(); } + if (!showLongOperatorName()) { + mCurrentState.networkNameData = TextUtils.isEmpty(mServiceState. + getOperatorAlphaShort()) ? mCurrentState.networkNameData : mServiceState. + getOperatorAlphaShort() + " " + getNetworkClassString(mServiceState); + } + + if (mConfig.readIconsFromXml) { + mCurrentState.voiceLevel = getVoiceSignalLevel(); + } + + if (mStyle == STATUS_BAR_STYLE_EXTENDED) { + mCurrentState.imsRadioTechnology = getImsRadioTechnology(); + } + notifyListenersIfNecessary(); } @@ -415,12 +646,236 @@ public class MobileSignalController extends SignalController< return !mPhone.getDataEnabled(mSubscriptionInfo.getSubscriptionId()); } + private boolean showLongOperatorName() { + if (mContext.getResources().getBoolean(R.bool.config_show_long_operator_name) || (mContext. + getResources().getBoolean(R.bool.config_show_long_operator_name_when_roaming) && + isRoaming())) { + return true; + } + return false; + } + + private void generateIconGroup() { + final int level = mCurrentState.level; + final int voiceLevel = mCurrentState.voiceLevel; + final int inet = mCurrentState.inetCondition; + final boolean dataConnected = mCurrentState.dataConnected; + final boolean roaming = isRoaming(); + final int voiceType = getVoiceNetworkType(); + final int dataType = getDataNetworkType(); + int[][] sbIcons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH; + int[][] qsIcons = TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH; + int[] contentDesc = AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH; + int sbDiscState = TelephonyIcons.TELEPHONY_NO_NETWORK; + int qsDiscState = TelephonyIcons.QS_TELEPHONY_NO_NETWORK; + int discContentDesc = AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0]; + int dataContentDesc, dataTypeIcon, qsDataTypeIcon, dataActivityId; + int singleSignalIcon, stackedDataIcon = 0, stackedVoiceIcon = 0; + + final int slotId = getSimSlotIndex(); + if (slotId < 0 || slotId > mPhone.getPhoneCount()) { + Log.e(mTag, "generateIconGroup invalid slotId:" + slotId); + return; + } + + if (DEBUG) Log.d(mTag, "generateIconGroup slot:" + slotId + " style:" + mStyle + + " connected:" + mCurrentState.connected + " inetCondition:" + inet + + " roaming:" + roaming + " level:" + level + " voiceLevel:" + voiceLevel + + " dataConnected:" + dataConnected + + " dataActivity:" + mCurrentState.dataActivity + + " CS:" + voiceType + + "/" + TelephonyManager.getNetworkTypeName(voiceType) + + ", PS:" + dataType + + "/" + TelephonyManager.getNetworkTypeName(dataType)); + + // Update data icon set + int chosenNetworkType = ((dataType == TelephonyManager.NETWORK_TYPE_UNKNOWN) + ? voiceType : dataType); + TelephonyIcons.updateDataType(slotId, chosenNetworkType, mConfig.showAtLeast3G, + mConfig.show4gForLte, mConfig.hspaDataDistinguishable, inet); + + // Update signal strength icons + singleSignalIcon = TelephonyIcons.getSignalStrengthIcon(slotId, inet, level, roaming); + if (DEBUG) { + Log.d(mTag, "singleSignalIcon:" + getResourceName(singleSignalIcon)); + } + + dataActivityId = (mCurrentState.dataConnected && slotId >= 0) ? + TelephonyIcons.getDataActivity(slotId, mCurrentState.dataActivity) : 0; + + // Convert the icon to unstacked if necessary. + int unstackedSignalIcon = TelephonyIcons.convertMobileStrengthIcon(singleSignalIcon); + if (DEBUG) { + Log.d(mTag, "unstackedSignalIcon:" + getResourceName(unstackedSignalIcon)); + } + if (singleSignalIcon != unstackedSignalIcon) { + stackedDataIcon = singleSignalIcon; + singleSignalIcon = unstackedSignalIcon; + } + + if (mStyle == STATUS_BAR_STYLE_CDMA_1X_COMBINED) { + if (!roaming && showDataAndVoice()) { + stackedVoiceIcon = TelephonyIcons.getStackedVoiceIcon(voiceLevel); + } else if (roaming && dataActivityId != 0) { + // Remove data type indicator if already shown in data activity icon. + singleSignalIcon = TelephonyIcons.getRoamingSignalIconId(level, inet); + } + } + + // Clear satcked data icon if no satcked voice icon. + if (stackedVoiceIcon == 0) stackedDataIcon = 0; + + contentDesc = TelephonyIcons.getSignalStrengthDes(slotId); + sbDiscState = TelephonyIcons.getSignalNullIcon(slotId); + if (DEBUG) { + Log.d(mTag, "singleSignalIcon=" + getResourceName(singleSignalIcon) + + " dataActivityId=" + getResourceName(dataActivityId) + + " stackedDataIcon=" + getResourceName(stackedDataIcon) + + " stackedVoiceIcon=" + getResourceName(stackedVoiceIcon)); + } + + // Update data net type icons + if (dataType == TelephonyManager.NETWORK_TYPE_IWLAN && + mContext.getResources().getBoolean(R.bool.config_show4gForIWlan)) { + // wimax is a special 4g network not handled by telephony + dataTypeIcon = TelephonyIcons.ICON_4G; + qsDataTypeIcon = TelephonyIcons.QS_DATA_4G; + dataContentDesc = R.string.accessibility_data_connection_4g; + } else { + dataTypeIcon = TelephonyIcons.getDataTypeIcon(slotId); + dataContentDesc = TelephonyIcons.getDataTypeDesc(slotId); + qsDataTypeIcon = TelephonyIcons.getQSDataTypeIcon(slotId); + } + if (roaming) { + dataTypeIcon = TelephonyIcons.ROAMING_ICON; + qsDataTypeIcon = TelephonyIcons.QS_DATA_R; + } + if (DEBUG) { + Log.d(mTag, "updateDataNetType, dataTypeIcon=" + getResourceName(dataTypeIcon) + + " qsDataTypeIcon=" + getResourceName(qsDataTypeIcon) + + " dataContentDesc=" + dataContentDesc); + } + mCurrentState.iconGroup = new MobileIconGroup( + TelephonyManager.getNetworkTypeName(dataType), + sbIcons, qsIcons, contentDesc, 0, 0, sbDiscState, qsDiscState, discContentDesc, + dataContentDesc, dataTypeIcon, false, qsDataTypeIcon, + singleSignalIcon, stackedDataIcon, stackedVoiceIcon, dataActivityId); + } + + private int getSimSlotIndex() { + int slotId = -1; + if (mSubscriptionInfo != null) { + slotId = mSubscriptionInfo.getSimSlotIndex(); + } + if (DEBUG) Log.d(mTag, "getSimSlotIndex, slotId: " + slotId); + return slotId; + } + + private boolean showMobileActivity() { + return (mStyle == STATUS_BAR_STYLE_DEFAULT_DATA) + || (mStyle == STATUS_BAR_STYLE_ANDROID_DEFAULT) + || (mStyle == STATUS_BAR_STYLE_EXTENDED); + } + + private int getVoiceNetworkType() { + if (mServiceState == null) { + return TelephonyManager.NETWORK_TYPE_UNKNOWN; + } + return mServiceState.getVoiceNetworkType(); + } + + private int getDataNetworkType() { + if (mServiceState == null) { + return TelephonyManager.NETWORK_TYPE_UNKNOWN; + } + return mServiceState.getDataNetworkType(); + } + + private int getImsRadioTechnology() { + if (mServiceState == null || (mServiceState.getVoiceRegState() != + ServiceState.STATE_IN_SERVICE)) { + return ServiceState.RIL_RADIO_TECHNOLOGY_UNKNOWN; + } + return mServiceState.getRilImsRadioTechnology(); + } + + private int getVoiceSignalLevel() { + if (mSignalStrength == null) { + return SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + } + boolean isCdma = TelephonyManager.PHONE_TYPE_CDMA == TelephonyManager.getDefault() + .getCurrentPhoneType(mSubscriptionInfo.getSubscriptionId()); + return isCdma ? mSignalStrength.getCdmaLevel() : mSignalStrength.getGsmLevel(); + } + + private boolean showDataAndVoice() { + if (mStyle != STATUS_BAR_STYLE_CDMA_1X_COMBINED) { + return false; + } + int dataType = getDataNetworkType(); + int voiceType = getVoiceNetworkType(); + if ((dataType == TelephonyManager.NETWORK_TYPE_EVDO_0 + || dataType == TelephonyManager.NETWORK_TYPE_EVDO_0 + || dataType == TelephonyManager.NETWORK_TYPE_EVDO_A + || dataType == TelephonyManager.NETWORK_TYPE_EVDO_B + || dataType == TelephonyManager.NETWORK_TYPE_EHRPD + || dataType == TelephonyManager.NETWORK_TYPE_LTE + || dataType == TelephonyManager.NETWORK_TYPE_LTE_CA) + && (voiceType == TelephonyManager.NETWORK_TYPE_GSM + || voiceType == TelephonyManager.NETWORK_TYPE_1xRTT + || voiceType == TelephonyManager.NETWORK_TYPE_CDMA)) { + return true; + } + return false; + } + + private boolean show1xOnly() { + int dataType = getDataNetworkType(); + int voiceType = getVoiceNetworkType(); + if (dataType == TelephonyManager.NETWORK_TYPE_1xRTT + || dataType == TelephonyManager.NETWORK_TYPE_CDMA) { + return true; + } + return false; + } + + private int getAlternateLteLevel(SignalStrength signalStrength) { + int lteRsrp = signalStrength.getLteDbm(); + int rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (lteRsrp > -44) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (lteRsrp >= -97) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_GREAT; + else if (lteRsrp >= -105) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_GOOD; + else if (lteRsrp >= -113) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_MODERATE; + else if (lteRsrp >= -120) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_POOR; + else if (lteRsrp >= -140) rsrpLevel = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (DEBUG) { + Log.d(mTag, "getAlternateLteLevel lteRsrp:" + lteRsrp + " rsrpLevel = " + rsrpLevel); + } + return rsrpLevel; + } + + protected String getResourceName(int resId) { + if (resId != 0) { + final Resources res = mContext.getResources(); + try { + return res.getResourceName(resId); + } catch (android.content.res.Resources.NotFoundException ex) { + return "(unknown)"; + } + } else { + return "(null)"; + } + } + @VisibleForTesting void setActivity(int activity) { mCurrentState.activityIn = activity == TelephonyManager.DATA_ACTIVITY_INOUT || activity == TelephonyManager.DATA_ACTIVITY_IN; mCurrentState.activityOut = activity == TelephonyManager.DATA_ACTIVITY_INOUT || activity == TelephonyManager.DATA_ACTIVITY_OUT; + if (mConfig.readIconsFromXml) { + mCurrentState.dataActivity = activity; + } notifyListenersIfNecessary(); } @@ -457,6 +912,7 @@ public class MobileSignalController extends SignalController< } mServiceState = state; mDataNetType = state.getDataNetworkType(); + updateNetworkName(mLastShowSpn, mLastSpn, mLastDataSpn, mLastShowPlmn, mLastPlmn); updateTelephony(); } @@ -495,17 +951,35 @@ public class MobileSignalController extends SignalController< final int mDataType; final boolean mIsWide; final int mQsDataType; + final int mSingleSignalIcon; + final int mStackedDataIcon; + final int mStackedVoiceIcon; + final int mActivityId; public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, int discContentDesc, int dataContentDesc, int dataType, boolean isWide, int qsDataType) { + this(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, + qsDiscState, discContentDesc, dataContentDesc, dataType, isWide, + qsDataType, 0, 0, 0, 0); + } + + public MobileIconGroup(String name, int[][] sbIcons, int[][] qsIcons, int[] contentDesc, + int sbNullState, int qsNullState, int sbDiscState, int qsDiscState, + int discContentDesc, int dataContentDesc, int dataType, boolean isWide, + int qsDataType, int singleSignalIcon, int stackedDataIcon, + int stackedVoicelIcon, int activityId) { super(name, sbIcons, qsIcons, contentDesc, sbNullState, qsNullState, sbDiscState, qsDiscState, discContentDesc); mDataContentDescription = dataContentDesc; mDataType = dataType; mIsWide = isWide; mQsDataType = qsDataType; + mSingleSignalIcon = singleSignalIcon; + mStackedDataIcon = stackedDataIcon; + mStackedVoiceIcon = stackedVoicelIcon; + mActivityId = activityId; } } @@ -519,6 +993,9 @@ public class MobileSignalController extends SignalController< boolean carrierNetworkChangeMode; boolean isDefault; boolean userSetup; + int dataActivity; + int voiceLevel; + int imsRadioTechnology; @Override public void copyFrom(State s) { @@ -533,6 +1010,9 @@ public class MobileSignalController extends SignalController< airplaneMode = state.airplaneMode; carrierNetworkChangeMode = state.carrierNetworkChangeMode; userSetup = state.userSetup; + dataActivity = state.dataActivity; + voiceLevel = state.voiceLevel; + imsRadioTechnology = state.imsRadioTechnology; } @Override @@ -549,6 +1029,9 @@ public class MobileSignalController extends SignalController< builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode) .append(','); builder.append("userSetup=").append(userSetup); + builder.append("voiceLevel=").append(voiceLevel).append(','); + builder.append("carrierNetworkChangeMode=").append(carrierNetworkChangeMode); + builder.append("imsRadioTechnology=").append(imsRadioTechnology); } @Override @@ -562,7 +1045,9 @@ public class MobileSignalController extends SignalController< && ((MobileState) o).airplaneMode == airplaneMode && ((MobileState) o).carrierNetworkChangeMode == carrierNetworkChangeMode && ((MobileState) o).userSetup == userSetup - && ((MobileState) o).isDefault == isDefault; + && ((MobileState) o).voiceLevel == voiceLevel + && ((MobileState) o).isDefault == isDefault + && ((MobileState) o).imsRadioTechnology == imsRadioTechnology; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 348e0b003997b8cf5d73dec3b50b6159d671e6a7..1294aa0753405f5ce1b3c459cb73c72a9bafbac6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -45,8 +45,10 @@ public interface NetworkController { boolean activityIn, boolean activityOut, String description); void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId); + int qsType, boolean activityIn, boolean activityOut, int dataActivityId, + int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon, + String typeContentDescription, String description, + boolean isWide, int subId); void setSubs(List subs); void setNoSims(boolean show); @@ -57,6 +59,15 @@ public interface NetworkController { void setMobileDataEnabled(boolean enabled); } + public interface SignalCallbackExtended extends SignalCallback { + void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, + int qsType, boolean activityIn, boolean activityOut, int dataActivityId, + int mobileActivityId, int stackedDataIcon, int stackedVoiceIcon, + String typeContentDescription, String description, boolean isWide, + int subId, int dataNetworkTypeInRoamingId, int embmsIconId, + int imsIconId, boolean isImsOverWifi); + } + public interface EmergencyListener { void setEmergencyCallsOnly(boolean emergencyOnly); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index a63324134512491b1a14f78882b0df14a6c9bb6f..91274e69f6426bbaa1218d37397f766fccd1b883 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -71,6 +71,7 @@ public class NetworkControllerImpl extends BroadcastReceiver private static final int EMERGENCY_FIRST_CONTROLLER = 100; private static final int EMERGENCY_VOICE_CONTROLLER = 200; private static final int EMERGENCY_NO_SUB = 300; + private static final String ACTION_EMBMS_STATUS = "com.qualcomm.intent.EMBMS_STATUS"; private final Context mContext; private final TelephonyManager mPhone; @@ -131,6 +132,7 @@ public class NetworkControllerImpl extends BroadcastReceiver @VisibleForTesting ServiceState mLastServiceState; private boolean mUserSetup; + private boolean mIsEmbmsActive; /** * Construct this controller object and register for updates. @@ -218,7 +220,12 @@ public class NetworkControllerImpl extends BroadcastReceiver filter.addAction(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(ConnectivityManager.INET_CONDITION_ACTION); + filter.addAction(Intent.ACTION_LOCALE_CHANGED); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + //TODO:Replace this check when regional specific config is added + if (MobileSignalController.isCarrierOneSupported()) { + filter.addAction(ACTION_EMBMS_STATUS); + } mContext.registerReceiver(this, filter, null, mReceiverHandler); mListening = true; @@ -389,6 +396,10 @@ public class NetworkControllerImpl extends BroadcastReceiver } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { // Might have different subscriptions now. updateMobileControllers(); + } else if (action.equals(Intent.ACTION_LOCALE_CHANGED)) { + for (MobileSignalController controller : mMobileSignalControllers.values()) { + controller.handleBroadcast(intent); + } } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) { mLastServiceState = ServiceState.newFromBundle(intent.getExtras()); if (mMobileSignalControllers.size() == 0) { @@ -396,7 +407,13 @@ public class NetworkControllerImpl extends BroadcastReceiver // emergency state. recalculateEmergency(); } - } else { + } else if (action.equals(ACTION_EMBMS_STATUS)) { + mIsEmbmsActive = intent.getBooleanExtra("ACTIVE", false); + Log.d(TAG,"EMBMS_STATUS On Receive:isEmbmsactive=" + mIsEmbmsActive); + for (MobileSignalController controller : mMobileSignalControllers.values()) { + controller.notifyListeners(); + } + } else { int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, SubscriptionManager.INVALID_SUBSCRIPTION_ID); if (SubscriptionManager.isValidSubscriptionId(subId)) { @@ -431,6 +448,10 @@ public class NetworkControllerImpl extends BroadcastReceiver refreshLocale(); } + public boolean isEmbmsActive() { + return mIsEmbmsActive; + } + private void updateMobileControllers() { if (!mListening) { return; @@ -781,6 +802,7 @@ public class NetworkControllerImpl extends BroadcastReceiver datatype.equals("1x") ? TelephonyIcons.ONE_X : datatype.equals("3g") ? TelephonyIcons.THREE_G : datatype.equals("4g") ? TelephonyIcons.FOUR_G : + datatype.equals("4g+") ? TelephonyIcons.FOUR_G_PLUS : datatype.equals("e") ? TelephonyIcons.E : datatype.equals("g") ? TelephonyIcons.G : datatype.equals("h") ? TelephonyIcons.H : @@ -851,6 +873,10 @@ public class NetworkControllerImpl extends BroadcastReceiver boolean alwaysShowCdmaRssi = false; boolean show4gForLte = false; boolean hspaDataDistinguishable; + boolean readIconsFromXml; + boolean showRsrpSignalLevelforLTE; + boolean showLocale; + boolean showRat; static Config readConfig(Context context) { Config config = new Config(); @@ -862,6 +888,14 @@ public class NetworkControllerImpl extends BroadcastReceiver config.show4gForLte = res.getBoolean(R.bool.config_show4GForLTE); config.hspaDataDistinguishable = res.getBoolean(R.bool.config_hspa_data_distinguishable); + config.readIconsFromXml = res.getBoolean(R.bool.config_read_icons_from_xml); + config.showRsrpSignalLevelforLTE = + res.getBoolean(R.bool.config_showRsrpSignalLevelforLTE); + config.showLocale = + res.getBoolean(com.android.internal.R.bool.config_monitor_locale_change); + config.showRat = + res.getBoolean(com.android.internal.R.bool.config_display_rat); + return config; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java index dce889f831dab00ce4858f32b5e25eaac44748d1..511ad2bf6cb6268cabddada2d36936ee52ee6b20 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SignalCallbackAdapter.java @@ -36,8 +36,9 @@ public class SignalCallbackAdapter implements SignalCallback { @Override public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType, - int qsType, boolean activityIn, boolean activityOut, String typeContentDescription, - String description, boolean isWide, int subId) { + int qsType, boolean activityIn, boolean activityOut, int dataActivity, + int mobileActivity, int stackedDataIcon, int stackedVoiceIcon, + String typeContentDescription, String description, boolean isWide, int subId) { } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java index 6ff8f77bff4eefb19826c112379b8bef42e1d6f8..a3b5fe7263c0c1a3555862b26cc6f20e57b58013 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -1,4 +1,6 @@ /* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Not a Contribution. * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,6 +18,14 @@ package com.android.systemui.statusbar.policy; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.telephony.SignalStrength; +import android.telephony.TelephonyManager; +import android.util.Log; +import android.util.SparseArray; + import com.android.systemui.R; import com.android.systemui.statusbar.policy.MobileSignalController.MobileIconGroup; @@ -68,6 +78,20 @@ class TelephonyIcons { R.drawable.stat_sys_signal_4_fully } }; + //Default roaming icons with R indicator + static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING_R = { + { R.drawable.stat_sys_signal_0_default_roam, + R.drawable.stat_sys_signal_1_default_roam, + R.drawable.stat_sys_signal_2_default_roam, + R.drawable.stat_sys_signal_3_default_roam, + R.drawable.stat_sys_signal_4_default_roam }, + { R.drawable.stat_sys_signal_0_default_fully_roam, + R.drawable.stat_sys_signal_1_default_fully_roam, + R.drawable.stat_sys_signal_2_default_fully_roam, + R.drawable.stat_sys_signal_3_default_fully_roam, + R.drawable.stat_sys_signal_4_default_fully_roam } + }; + //CarrierNetworkChange static final int[][] TELEPHONY_CARRIER_NETWORK_CHANGE = { { R.drawable.stat_sys_signal_carrier_network_change_animation, @@ -182,6 +206,19 @@ class TelephonyIcons { static final int QS_DATA_4G = R.drawable.ic_qs_signal_4g; + static final int[][] DATA_4G_PLUS = { + { R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus }, + { R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus, + R.drawable.stat_sys_data_fully_connected_4g_plus } + }; + + static final int QS_DATA_4G_PLUS = R.drawable.ic_qs_signal_4g_plus; + // LTE branded "LTE" static final int[][] DATA_LTE = { { R.drawable.stat_sys_data_fully_connected_lte, @@ -204,6 +241,7 @@ class TelephonyIcons { static final int ICON_H = R.drawable.stat_sys_data_fully_connected_h; static final int ICON_3G = R.drawable.stat_sys_data_fully_connected_3g; static final int ICON_4G = R.drawable.stat_sys_data_fully_connected_4g; + static final int ICON_4G_PLUS = R.drawable.stat_sys_data_fully_connected_4g_plus; static final int ICON_1X = R.drawable.stat_sys_data_fully_connected_1x; static final int ICON_CARRIER_NETWORK_CHANGE = R.drawable.stat_sys_signal_carrier_network_change_animation; @@ -213,9 +251,407 @@ class TelephonyIcons { static final int QS_ICON_LTE = R.drawable.ic_qs_signal_lte; static final int QS_ICON_3G = R.drawable.ic_qs_signal_3g; static final int QS_ICON_4G = R.drawable.ic_qs_signal_4g; + static final int QS_ICON_4G_PLUS = R.drawable.ic_qs_signal_4g_plus; static final int QS_ICON_1X = R.drawable.ic_qs_signal_1x; static final int QS_ICON_CARRIER_NETWORK_CHANGE = R.drawable.ic_qs_signal_carrier_network_change_animation; + static final int DATA_TYPE_UNKNOWN = 0; + static final int DATA_TYPE_G = 1; + static final int DATA_TYPE_E = 2; + static final int DATA_TYPE_2G = 3; + static final int DATA_TYPE_3G = 4; + static final int DATA_TYPE_4G = 5; + static final int DATA_TYPE_H = 6; + static final int DATA_TYPE_HP = 7; + static final int DATA_TYPE_1X = 8; + static final int DATA_TYPE_LTE = 9; + + static final int SIGNAL_STRENGTH_TYPE_G = 0; + static final int SIGNAL_STRENGTH_TYPE_E = 1; + static final int SIGNAL_STRENGTH_TYPE_3G = 2; + static final int SIGNAL_STRENGTH_TYPE_4G = 3; + static final int SIGNAL_STRENGTH_TYPE_H = 4; + static final int SIGNAL_STRENGTH_TYPE_HP = 5; + static final int SIGNAL_STRENGTH_TYPE_1X = 6; + static final int SIGNAL_STRENGTH_TYPE_CDMA = 7; + static final int SIGNAL_STRENGTH_TYPE_UMTS = 8; + + static final boolean DEBUG = true; + static final int DEFAULT_SUB = 0; + static final int INET_TYPE_NUM = 2; + static final int SIGNAL_LEVEL_NUM = SignalStrength.NUM_SIGNAL_STRENGTH_BINS; + static final String TAG = "TelephonyIcons"; + static final String NS = "com.android.systemui"; + + static String[] mDataTypeArray, mDataTypeGenerationArray; + static String[] mDataTypeDescriptionArray, mDataTypeGenerationDescArray; + static String[] mDataActivityArray; + static String[] mSignalStrengthArray, mSignalStrengthRoamingArray; + static String[] mSignalNullArray; + static String[] mSignalStrengthDesc; + + static int[] mSelectedDataTypeIcon; + static int[] mSelectedQSDataTypeIcon; + static String[] mSelectedDataTypeDesc; + static int[] mSelectedDataActivityIndex; + static int[] mSelectedSignalStreagthIndex; + static SparseArray mStacked2SingleIconLookup; + + private static Resources mRes; + private static boolean isInitiated = false; + + static void readIconsFromXml(Context context) { + if (isInitiated) { + log(TAG, "readIconsFromXml, already read!"); + return; + } + + mRes = context.getResources(); + try { + mDataTypeArray = mRes.getStringArray(R.array.multi_data_type); + mDataTypeDescriptionArray = mRes.getStringArray( + R.array.telephony_data_type_description); + mDataTypeGenerationArray = mRes.getStringArray( + R.array.telephony_data_type_generation); + mDataTypeGenerationDescArray = mRes.getStringArray( + R.array.telephony_data_type_generation_description); + mDataActivityArray = mRes.getStringArray(R.array.multi_data_activity); + mSignalStrengthArray = mRes.getStringArray(R.array.multi_signal_strength); + mSignalStrengthRoamingArray = mRes.getStringArray( + R.array.multi_signal_strength_roaming); + mSignalNullArray = mRes.getStringArray(R.array.multi_signal_null); + mSignalStrengthDesc = mRes.getStringArray(R.array.signal_strength_description); + initStacked2SingleIconLookup(); + } catch (android.content.res.Resources.NotFoundException e) { + isInitiated = false; + log(TAG, "readIconsFromXml, exception happened: " + e); + return; + } + + if (mSelectedDataTypeIcon == null + && mDataTypeArray.length != 0) { + mSelectedDataTypeIcon = new int[mDataTypeArray.length]; + } + if (mSelectedQSDataTypeIcon == null + && mDataTypeArray.length != 0) { + mSelectedQSDataTypeIcon = new int[mDataTypeArray.length]; + } + if (mSelectedDataTypeDesc == null + && mDataTypeArray.length != 0) { + mSelectedDataTypeDesc = new String[mDataTypeArray.length]; + } + if (mSelectedDataActivityIndex == null + && mDataActivityArray.length != 0) { + mSelectedDataActivityIndex = new int[mDataActivityArray.length]; + } + if (mSelectedSignalStreagthIndex == null + && mSignalStrengthArray.length != 0) { + mSelectedSignalStreagthIndex = new int[mSignalStrengthArray.length]; + } + isInitiated = true; + } + + static void initStacked2SingleIconLookup() { + mStacked2SingleIconLookup = new SparseArray<>(); + TypedArray stackedIcons = mRes.obtainTypedArray(R.array.stacked_signal_icons); + TypedArray singleIcons = mRes.obtainTypedArray(R.array.single_signal_icons); + + mStacked2SingleIconLookup.clear(); + for (int i = 0; i < stackedIcons.length() && i < singleIcons.length(); i++) { + mStacked2SingleIconLookup.put(stackedIcons.getResourceId(i,0), + singleIcons.getResourceId(i,0)); + } + stackedIcons.recycle(); + singleIcons.recycle(); + log(TAG, "initStacked2SingleIconLookup: size=" + mStacked2SingleIconLookup.size()); + } + + static int getSignalNullIcon(int slot) { + if (mSignalNullArray == null) { + return 0; + } + String resName = mSignalNullArray[slot]; + log(TAG, "null signal icon name: " + resName); + int resId = mRes.getIdentifier(resName, null, NS); + return resId; + } + + static void updateDataType(int slot, int type, boolean showAtLeast3G, + boolean show4GforLte, boolean hspaDistinguishable, int inet) { + log(TAG, "updateDataType " + + String.format("slot=%d, type=%d, inetCondition=%d", + slot, type, inet) + + " showAtLeast3G=" + String.valueOf(showAtLeast3G) + + " show4GforLte=" + String.valueOf(show4GforLte) + + " hspaDistinguishable=" + String.valueOf(hspaDistinguishable)); + + String resName = mDataTypeArray[slot]; + int resId = mRes.getIdentifier(resName, null, NS); + String[] dataTypeArray = mRes.getStringArray(resId); + + log(TAG, "data type item name: " + resName + " id:" + resId); + + switch (type) { + case TelephonyManager.NETWORK_TYPE_UNKNOWN: + if (!showAtLeast3G) { + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = 0; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedDataActivityIndex[slot] = 0; + mSelectedSignalStreagthIndex[slot] = 0; + break; + } else { + // fall through + } + case TelephonyManager.NETWORK_TYPE_EDGE: + if (!showAtLeast3G) { + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_E; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedDataActivityIndex[slot] = DATA_TYPE_E; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_E; + break; + } else { + // fall through + } + case TelephonyManager.NETWORK_TYPE_UMTS: + case TelephonyManager.NETWORK_TYPE_TD_SCDMA: + mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_3G; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_UMTS; + break; + case TelephonyManager.NETWORK_TYPE_HSDPA: + case TelephonyManager.NETWORK_TYPE_HSUPA: + case TelephonyManager.NETWORK_TYPE_HSPA: + if (hspaDistinguishable) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_H; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_H; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_H; + } else { + mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + mDataTypeGenerationArray[0], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_3G; + mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; + + } + break; + case TelephonyManager.NETWORK_TYPE_HSPAP: + if (hspaDistinguishable) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_HP; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_H; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_HP; + } else { + mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + mDataTypeGenerationArray[0], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_3G; + mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; + } + break; + case TelephonyManager.NETWORK_TYPE_CDMA: + if (!showAtLeast3G) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_1X; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_1X; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_CDMA; + break; + } else { + // fall through + } + case TelephonyManager.NETWORK_TYPE_1xRTT: + if (!showAtLeast3G) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_1X; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_1X; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_1X; + break; + } else { + // fall through + } + case TelephonyManager.NETWORK_TYPE_EVDO_0: //fall through + case TelephonyManager.NETWORK_TYPE_EVDO_A: + case TelephonyManager.NETWORK_TYPE_EVDO_B: + case TelephonyManager.NETWORK_TYPE_EHRPD: + mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_3G; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; + break; + case TelephonyManager.NETWORK_TYPE_LTE: + case TelephonyManager.NETWORK_TYPE_LTE_CA: + if (show4GforLte) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_4G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + mDataTypeGenerationArray[1], null, NS); + if ( type == TelephonyManager.NETWORK_TYPE_LTE_CA) { + //Select 4G+ icon. + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + mDataTypeGenerationArray[2], null, NS); + } + mSelectedQSDataTypeIcon[slot] = QS_DATA_4G; + mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[1]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G; + } else { + mSelectedDataActivityIndex[slot] = DATA_TYPE_LTE; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_LTE; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_4G; + } + break; + case TelephonyManager.NETWORK_TYPE_GPRS: + case TelephonyManager.NETWORK_TYPE_GSM: + if (!showAtLeast3G) { + mSelectedDataActivityIndex[slot] = DATA_TYPE_G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + dataTypeArray[type], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_G; + mSelectedDataTypeDesc[slot] = mDataTypeDescriptionArray[type]; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G; + } else { + mSelectedDataActivityIndex[slot] = DATA_TYPE_3G; + mSelectedDataTypeIcon[slot] = mRes.getIdentifier( + mDataTypeGenerationArray[0], null, NS); + mSelectedQSDataTypeIcon[slot] = QS_DATA_3G; + mSelectedDataTypeDesc[slot] = mDataTypeGenerationDescArray[0];; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_3G; + } + break; + default: + mSelectedDataActivityIndex[slot] = DATA_TYPE_UNKNOWN; + mSelectedDataTypeIcon[slot] = 0; + mSelectedQSDataTypeIcon[slot] = 0; + mSelectedDataTypeDesc[slot] = ""; + mSelectedSignalStreagthIndex[slot] = SIGNAL_STRENGTH_TYPE_G; + break; + } + log(TAG, "updateDataType " + String.format( + "mSelectedDataTypeIcon[%d]=%d, mSelectedDataActivityIndex=%d", + slot, mSelectedDataTypeIcon[slot], mSelectedDataActivityIndex[slot])); + } + + + static int getQSDataTypeIcon(int slot) { + return mSelectedQSDataTypeIcon[slot]; + } + + static int getDataTypeIcon(int slot) { + log(TAG, "getDataTypeIcon " + String.format("sub=%d", slot)); + return mSelectedDataTypeIcon[slot]; + } + + static int getDataTypeDesc(int slot) { + return mRes.getIdentifier(mSelectedDataTypeDesc[slot], null, NS); + } + + static int getDataActivity(int slot, int activity) { + log(TAG, String.format("getDataActivity, slot=%d, activity=%d", + slot, activity)); + + String[] dataActivityArray = mRes.getStringArray( + mRes.getIdentifier(mDataActivityArray[slot], null, NS)); + String[] selectedTypeArray = mRes.getStringArray(mRes.getIdentifier( + dataActivityArray[mSelectedDataActivityIndex[slot]], null, NS)); + + return mRes.getIdentifier(selectedTypeArray[activity], null, NS); + } + + static int getSignalStrengthIcon(int slot, int inet, int level, boolean roaming) { + log(TAG, "getSignalStrengthIcon: " + String.format( + "slot=%d, inetCondition=%d, level=%d, roaming=%b", slot, inet, level, roaming)); + + String[] signalStrengthArray, selectedTypeArray; + + signalStrengthArray = mRes.getStringArray(mRes.getIdentifier(!roaming ? + mSignalStrengthArray[slot] : mSignalStrengthRoamingArray[slot], null, NS)); + log(TAG, String.format("signalStrengthArray.length=%d", signalStrengthArray.length)); + + selectedTypeArray = mRes.getStringArray(mRes.getIdentifier( + signalStrengthArray[mSelectedSignalStreagthIndex[slot]], null, NS)); + log(TAG, String.format("selectedTypeArray.length=%d", selectedTypeArray.length)); + + String[] inetArray = mRes.getStringArray( + mRes.getIdentifier(selectedTypeArray[inet], null, NS)); + log(TAG, String.format("inetArray.length=%d", inetArray.length)); + + return mRes.getIdentifier(inetArray[level], null, NS); + } + + + static int convertMobileStrengthIcon(int stackedIcon) { + if (mStacked2SingleIconLookup == null) { + return stackedIcon; + } + int index = mStacked2SingleIconLookup.indexOfKey(stackedIcon); + if (index >= 0) { + return mStacked2SingleIconLookup.get(stackedIcon); + } + return stackedIcon; + } + + static int getStackedVoiceIcon(int level) { + int retValue = 0; + switch(level){ + case SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN: + retValue = R.drawable.stat_sys_signal_0_2g; + break; + case SignalStrength.SIGNAL_STRENGTH_POOR: + retValue = R.drawable.stat_sys_signal_1_2g; + break; + case SignalStrength.SIGNAL_STRENGTH_MODERATE: + retValue = R.drawable.stat_sys_signal_2_2g; + break; + case SignalStrength.SIGNAL_STRENGTH_GOOD: + retValue = R.drawable.stat_sys_signal_3_2g; + break; + case SignalStrength.SIGNAL_STRENGTH_GREAT: + retValue = R.drawable.stat_sys_signal_4_2g; + break; + default: + break; + } + return retValue; + } + + static int getRoamingSignalIconId(int level, int inet){ + return TELEPHONY_SIGNAL_STRENGTH_ROAMING_R[inet][level]; + } + + static int[] getSignalStrengthDes(int slot) { + int[] resId = new int[SIGNAL_LEVEL_NUM]; + for (int i = 0; i < SIGNAL_LEVEL_NUM; i++) { + resId[i] = mRes.getIdentifier(mSignalStrengthDesc[i], null, NS); + } + return resId; + } + + private static void log(String tag, String str){ + if (DEBUG) { + Log.d(tag, str); + } + } + static final int QS_ICON_DATA_DISABLED = R.drawable.ic_qs_data_disabled; @@ -348,6 +784,21 @@ class TelephonyIcons { TelephonyIcons.QS_DATA_4G ); + static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup( + "4G+", + TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, + TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH, + 0,0, + TelephonyIcons.TELEPHONY_NO_NETWORK, + TelephonyIcons.QS_TELEPHONY_NO_NETWORK, + AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[0], + R.string.accessibility_data_connection_4g_plus, + TelephonyIcons.ICON_4G_PLUS, + true, + TelephonyIcons.QS_DATA_4G_PLUS + ); + static final MobileIconGroup LTE = new MobileIconGroup( "LTE", TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java index b890a3006e56901ee89a9abb4889bd97940f637d..bb5e74c4d68524f0704c779f4244e4c3618bdd26 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiSignalController.java @@ -27,6 +27,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.AsyncChannel; import com.android.settingslib.wifi.WifiStatusTracker; +import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -77,8 +78,10 @@ public class WifiSignalController extends @Override public void notifyListeners(SignalCallback callback) { // only show wifi in the cluster if connected or if wifi-only + boolean visibleWhenEnabled = mContext.getResources().getBoolean( + R.bool.config_showWifiIndicatorWhenEnabled); boolean wifiVisible = mCurrentState.enabled - && (mCurrentState.connected || !mHasMobileData); + && (mCurrentState.connected || !mHasMobileData || visibleWhenEnabled); String wifiDesc = wifiVisible ? mCurrentState.ssid : null; boolean ssidPresent = wifiVisible && mCurrentState.ssid != null; String contentDescription = getStringIfExists(getContentDescription()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java index 19cb24322095826e95d1645feae42e38edca9ae8..655a6daf8088925158d3c75673c9429da414f47e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java @@ -102,8 +102,8 @@ public class CallbackHandlerTest extends AndroidTestCase { int qsType = R.drawable.ic_qs_signal_1x; boolean wide = true; int subId = 5; - mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, typeDescription, - description, wide, subId); + mHandler.setMobileDataIndicators(status, qs, type, qsType, in, out, 0, 0, 0, 0, + typeDescription, description, wide, subId); waitForCallbacks(); ArgumentCaptor statusArg = ArgumentCaptor.forClass(IconState.class); @@ -118,7 +118,11 @@ public class CallbackHandlerTest extends AndroidTestCase { ArgumentCaptor subIdArg = ArgumentCaptor.forClass(Integer.class); Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(), qsArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(), inArg.capture(), - outArg.capture(), typeContentArg.capture(), descArg.capture(), wideArg.capture(), + outArg.capture(), ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + typeContentArg.capture(), descArg.capture(), wideArg.capture(), subIdArg.capture()); assertEquals(status, statusArg.getValue()); assertEquals(qs, qsArg.getValue()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index 38cac1e7403157c002308cfb08c88a9f321f43b5..d6c58012ec7f97302cf4b3f802e98e6d56021411 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -279,6 +279,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { iconArg.capture(), ArgumentCaptor.forClass(Integer.class).capture(), typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(Boolean.class).capture(), @@ -305,6 +309,10 @@ public class NetworkControllerBaseTest extends SysuiTestCase { ArgumentCaptor.forClass(Integer.class).capture(), ArgumentCaptor.forClass(Boolean.class).capture(), ArgumentCaptor.forClass(Boolean.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), + ArgumentCaptor.forClass(Integer.class).capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(String.class).capture(), ArgumentCaptor.forClass(Boolean.class).capture(), diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 312553a980b2a65c09b4fdb56e2118c22f19adbf..1a251bf545e55cf27e5693e85e26643a67026b12 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -28,6 +28,7 @@ import android.app.IAlarmManager; import android.app.IUidObserver; import android.app.PendingIntent; import android.content.BroadcastReceiver; +import android.content.ContentUris; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -80,6 +81,7 @@ import static android.app.AlarmManager.RTC_WAKEUP; import static android.app.AlarmManager.RTC; import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP; import static android.app.AlarmManager.ELAPSED_REALTIME; +import static android.app.AlarmManager.RTC_POWEROFF_WAKEUP; import com.android.internal.util.LocalLog; @@ -88,8 +90,10 @@ class AlarmManagerService extends SystemService { private static final int RTC_MASK = 1 << RTC; private static final int ELAPSED_REALTIME_WAKEUP_MASK = 1 << ELAPSED_REALTIME_WAKEUP; private static final int ELAPSED_REALTIME_MASK = 1 << ELAPSED_REALTIME; + private static final int RTC_POWEROFF_WAKEUP_MASK = 1 << RTC_POWEROFF_WAKEUP; static final int TIME_CHANGED_MASK = 1 << 16; - static final int IS_WAKEUP_MASK = RTC_WAKEUP_MASK|ELAPSED_REALTIME_WAKEUP_MASK; + static final int IS_WAKEUP_MASK = RTC_WAKEUP_MASK|ELAPSED_REALTIME_WAKEUP_MASK + |RTC_POWEROFF_WAKEUP_MASK; // Mask for testing whether a given alarm type is wakeup vs non-wakeup static final int TYPE_NONWAKEUP_MASK = 0x1; // low bit => non-wakeup @@ -117,6 +121,11 @@ class AlarmManagerService extends SystemService { final LocalLog mLog = new LocalLog(TAG); + private static final String DESKCLOCK_PACKAGE_NAME = "com.android.deskclock"; + + private static final String ENCRYPTING_STATE = "trigger_restart_min_framework"; + private static final String ENCRYPTED_STATE = "1"; + AppOpsManager mAppOps; DeviceIdleController.LocalService mLocalDeviceIdleController; @@ -124,11 +133,13 @@ class AlarmManagerService extends SystemService { long mNativeData; private long mNextWakeup; + private long mNextRtcWakeup; private long mNextNonWakeup; private long mLastWakeupSet; private long mLastWakeup; int mBroadcastRefCount = 0; PowerManager.WakeLock mWakeLock; + private QCNsrmAlarmExtension qcNsrmExt = new QCNsrmAlarmExtension(this); boolean mLastWakeLockUnimportantForLogging; ArrayList mPendingNonWakeupAlarms = new ArrayList<>(); ArrayList mInFlight = new ArrayList<>(); @@ -388,6 +399,16 @@ class AlarmManagerService extends SystemService { return alarms.get(index); } + Alarm getAlarmByElapsedTime(long whenElapsed) { + Alarm alarm = null; + for(int i=0;i< alarms.size();i++) { + if(alarms.get(i).whenElapsed == whenElapsed) { + alarm = alarms.get(i); + } + } + return alarm; + } + boolean canHold(long whenElapsed, long maxWhen) { return (end >= whenElapsed) && (start <= maxWhen); } @@ -586,6 +607,17 @@ class AlarmManagerService extends SystemService { return false; } + boolean isRtcPowerOffWakeup() { + final int N = alarms.size(); + for (int i = 0; i < N; i++) { + Alarm a = alarms.get(i); + if (a.type == RTC_POWEROFF_WAKEUP) { + return true; + } + } + return false; + } + @Override public String toString() { StringBuilder b = new StringBuilder(40); @@ -696,7 +728,8 @@ class AlarmManagerService extends SystemService { } static long convertToElapsed(long when, int type) { - final boolean isRtc = (type == RTC || type == RTC_WAKEUP); + final boolean isRtc = (type == RTC || type == RTC_WAKEUP + || type == RTC_POWEROFF_WAKEUP); if (isRtc) { when -= System.currentTimeMillis() - SystemClock.elapsedRealtime(); } @@ -903,7 +936,7 @@ class AlarmManagerService extends SystemService { @Override public void onStart() { mNativeData = init(); - mNextWakeup = mNextNonWakeup = 0; + mNextWakeup = mNextRtcWakeup = mNextNonWakeup = 0; // We have to set current TimeZone info to kernel // because kernel doesn't keep this after reboot @@ -1041,7 +1074,7 @@ class AlarmManagerService extends SystemService { interval = minInterval; } - if (type < RTC_WAKEUP || type > ELAPSED_REALTIME) { + if (type < RTC_WAKEUP || type > RTC_POWEROFF_WAKEUP) { throw new IllegalArgumentException("Invalid alarm type " + type); } @@ -1353,6 +1386,16 @@ class AlarmManagerService extends SystemService { dumpImpl(pw); } + + @Override + /* updates the blocked uids, so if a wake lock is acquired to only fire + * alarm for it, it can be released. + */ + public void updateBlockedUids(int uid, boolean isBlocked) { + synchronized(mLock) { + qcNsrmExt.processBlockedUids(uid, isBlocked, mWakeLock); + } + } }; public final class LocalService { @@ -1693,6 +1736,17 @@ class AlarmManagerService extends SystemService { return null; } + private Batch findFirstRtcWakeupBatchLocked() { + final int N = mAlarmBatches.size(); + for (int i = 0; i < N; i++) { + Batch b = mAlarmBatches.get(i); + if (b.isRtcPowerOffWakeup()) { + return b; + } + } + return null; + } + long getNextWakeFromIdleTimeImpl() { synchronized (mLock) { return mNextWakeFromIdle != null ? mNextWakeFromIdle.whenElapsed : Long.MAX_VALUE; @@ -1841,11 +1895,44 @@ class AlarmManagerService extends SystemService { if (mAlarmBatches.size() > 0) { final Batch firstWakeup = findFirstWakeupBatchLocked(); final Batch firstBatch = mAlarmBatches.get(0); + final Batch firstRtcWakeup = findFirstRtcWakeupBatchLocked(); if (firstWakeup != null && mNextWakeup != firstWakeup.start) { mNextWakeup = firstWakeup.start; mLastWakeupSet = SystemClock.elapsedRealtime(); setLocked(ELAPSED_REALTIME_WAKEUP, firstWakeup.start); } + + boolean isEncryptStatus = false; + String cryptState = SystemProperties.get("vold.decrypt"); + if (ENCRYPTING_STATE.equals(cryptState) || ENCRYPTED_STATE.equals(cryptState)) { + isEncryptStatus = true; + } + + // Set RTC_POWEROFF type alarm to kernel + if (firstRtcWakeup != null && mNextRtcWakeup != firstRtcWakeup.start) { + mNextRtcWakeup = firstRtcWakeup.start; + Alarm alarm = firstRtcWakeup.getAlarmByElapsedTime(mNextRtcWakeup); + if (alarm != null) { + // use packageName to check if the alarm is set from deskclock app + // (power off alarm) + String packageName = alarm.packageName; + if (DESKCLOCK_PACKAGE_NAME.equals(packageName)) { + AlarmManager.writePowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_SET_FILE, + AlarmManager.POWER_OFF_ALARM_SET); + if (!isEncryptStatus) { + AlarmManager.writePowerOffAlarmFile( + AlarmManager.POWER_OFF_ALARM_INSTANCE_FILE, "" + alarm.when); + } + } else { + AlarmManager.writePowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_SET_FILE, + AlarmManager.POWER_OFF_ALARM_NOT_SET); + } + setLocked(RTC_POWEROFF_WAKEUP, alarm.when); + } + } else if (firstRtcWakeup == null){ + AlarmManager.writePowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_SET_FILE, + AlarmManager.POWER_OFF_ALARM_NOT_SET); + } if (firstBatch != firstWakeup) { nextNonWakeup = firstBatch.start; } @@ -1865,6 +1952,18 @@ class AlarmManagerService extends SystemService { boolean didRemove = false; for (int i = mAlarmBatches.size() - 1; i >= 0; i--) { Batch b = mAlarmBatches.get(i); + ArrayList alarmList = b.alarms; + Alarm alarm = null; + for (int j = alarmList.size() - 1; j >= 0; j--) { + alarm = alarmList.get(j); + if (alarm.type == RTC_POWEROFF_WAKEUP && alarm.operation.equals(operation)) { + long alarmSeconds, alarmNanoseconds; + alarmSeconds = alarm.when / 1000; + alarmNanoseconds = (alarm.when % 1000) * 1000 * 1000; + clear(mNativeData, alarm.type, alarmSeconds, alarmNanoseconds); + mNextRtcWakeup = 0; + } + } didRemove |= b.remove(operation, directReceiver); if (b.size() == 0) { mAlarmBatches.remove(i); @@ -2068,6 +2167,7 @@ class AlarmManagerService extends SystemService { case RTC_WAKEUP : return "RTC_WAKEUP"; case ELAPSED_REALTIME : return "ELAPSED"; case ELAPSED_REALTIME_WAKEUP: return "ELAPSED_WAKEUP"; + case RTC_POWEROFF_WAKEUP : return "RTC_POWEROFF_WAKEUP"; default: break; } @@ -2088,6 +2188,7 @@ class AlarmManagerService extends SystemService { private native long init(); private native void close(long nativeData); private native void set(long nativeData, int type, long seconds, long nanoseconds); + private native void clear(long nativeData, int type, long seconds, long nanoseconds); private native int waitForAlarm(long nativeData); private native int setKernelTime(long nativeData, long millis); private native int setKernelTimezone(long nativeData, int minuteswest); @@ -2245,7 +2346,8 @@ class AlarmManagerService extends SystemService { type = _type; origWhen = _when; wakeup = _type == AlarmManager.ELAPSED_REALTIME_WAKEUP - || _type == AlarmManager.RTC_WAKEUP; + || _type == AlarmManager.RTC_WAKEUP + || _type == AlarmManager.RTC_POWEROFF_WAKEUP; when = _when; whenElapsed = _whenElapsed; windowLength = _windowLength; @@ -2266,7 +2368,7 @@ class AlarmManagerService extends SystemService { public static String makeTag(PendingIntent pi, String tag, int type) { final String alarmString = type == ELAPSED_REALTIME_WAKEUP || type == RTC_WAKEUP - ? "*walarm*:" : "*alarm*:"; + || type == RTC_POWEROFF_WAKEUP? "*walarm*:" : "*alarm*:"; return (pi != null) ? pi.getTag(alarmString) : (alarmString + tag); } @@ -2311,7 +2413,8 @@ class AlarmManagerService extends SystemService { public void dump(PrintWriter pw, String prefix, long nowRTC, long nowELAPSED, SimpleDateFormat sdf) { - final boolean isRtc = (type == RTC || type == RTC_WAKEUP); + final boolean isRtc = (type == RTC || type == RTC_WAKEUP + || type == RTC_POWEROFF_WAKEUP); pw.print(prefix); pw.print("tag="); pw.println(statsTag); pw.print(prefix); pw.print("type="); pw.print(type); pw.print(" whenElapsed="); TimeUtils.formatDuration(whenElapsed, @@ -2545,9 +2648,11 @@ class AlarmManagerService extends SystemService { } } else { - // Just in case -- even though no wakeup flag was set, make sure - // we have updated the kernel to the next alarm time. - rescheduleKernelAlarmsLocked(); + synchronized (mLock) { + // Just in case -- even though no wakeup flag was set, make sure + // we have updated the kernel to the next alarm time. + rescheduleKernelAlarmsLocked(); + } } } } @@ -2582,11 +2687,10 @@ class AlarmManagerService extends SystemService { mWakeLock.setWorkSource(new WorkSource(uid)); return; } + // Something went wrong; fall back to attributing the lock to the OS + mWakeLock.setWorkSource(null); } catch (Exception e) { } - - // Something went wrong; fall back to attributing the lock to the OS - mWakeLock.setWorkSource(null); } private class AlarmHandler extends Handler { @@ -2884,9 +2988,13 @@ class AlarmManagerService extends SystemService { updateStatsLocked(inflight); } mBroadcastRefCount--; + qcNsrmExt.removeTriggeredUid(inflight.mUid); + if (mBroadcastRefCount == 0) { mHandler.obtainMessage(AlarmHandler.REPORT_ALARMS_ACTIVE, 0).sendToTarget(); - mWakeLock.release(); + if (mWakeLock.isHeld()) { + mWakeLock.release(); + } if (mInFlight.size() > 0) { mLog.w("Finished all dispatches with " + mInFlight.size() + " remaining inflights"); @@ -3028,7 +3136,9 @@ class AlarmManagerService extends SystemService { setWakelockWorkSource(alarm.operation, alarm.workSource, alarm.type, alarm.statsTag, (alarm.operation == null) ? alarm.uid : -1, true); + if (!mWakeLock.isHeld()) { mWakeLock.acquire(); + } mHandler.obtainMessage(AlarmHandler.REPORT_ALARMS_ACTIVE, 1).sendToTarget(); } final InFlight inflight = new InFlight(AlarmManagerService.this, @@ -3036,6 +3146,9 @@ class AlarmManagerService extends SystemService { alarm.packageName, alarm.type, alarm.statsTag, nowELAPSED); mInFlight.add(inflight); mBroadcastRefCount++; + qcNsrmExt.addTriggeredUid((alarm.operation != null) ? + alarm.operation.getCreatorUid() : + alarm.uid); if (allowWhileIdle) { // Record the last time this uid handled an ALLOW_WHILE_IDLE alarm. @@ -3068,7 +3181,7 @@ class AlarmManagerService extends SystemService { fs.nesting++; } if (alarm.type == ELAPSED_REALTIME_WAKEUP - || alarm.type == RTC_WAKEUP) { + || alarm.type == RTC_WAKEUP || alarm.type == RTC_POWEROFF_WAKEUP) { bs.numWakeup++; fs.numWakeup++; if (alarm.workSource != null && alarm.workSource.size() > 0) { diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java old mode 100644 new mode 100755 index b5b0cd86f3972f73d29d2a5eef5d2f987cc72662..943e47f92e159fa7a680b18835051c14a1344040 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -37,6 +37,7 @@ import android.app.ActivityManager; import android.app.ActivityThread; import android.app.AppGlobals; import android.app.AppOpsManager; +import android.app.Dialog; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; @@ -47,6 +48,8 @@ import android.os.Binder; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.Message; +import android.os.Looper; import android.os.Process; import android.os.RemoteException; import android.os.ResultReceiver; @@ -71,11 +74,13 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; +import com.android.server.PermissionDialogReqQueue.PermissionDialogReq; import libcore.util.EmptyArray; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; +import android.os.SystemProperties; public class AppOpsService extends IAppOpsService.Stub { static final String TAG = "AppOps"; @@ -87,6 +92,7 @@ public class AppOpsService extends IAppOpsService.Stub { Context mContext; final AtomicFile mFile; final Handler mHandler; + final Looper mLooper; boolean mWriteScheduled; boolean mFastWriteScheduled; @@ -156,12 +162,16 @@ public class AppOpsService extends IAppOpsService.Stub { public long time; public long rejectTime; public int nesting; + public PermissionDialogReqQueue dialogReqQueue; + private boolean remember; public Op(int _uid, String _packageName, int _op) { uid = _uid; packageName = _packageName; op = _op; mode = AppOpsManager.opToDefaultMode(op); + dialogReqQueue = new PermissionDialogReqQueue(); + remember = false; } } @@ -239,6 +249,7 @@ public class AppOpsService extends IAppOpsService.Stub { public AppOpsService(File storagePath, Handler handler) { mFile = new AtomicFile(storagePath); mHandler = handler; + mLooper = Looper.myLooper(); readState(); } @@ -476,6 +487,10 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private boolean isStrictOpEnable() { + return SystemProperties.getBoolean("persist.sys.strict_op_enable", false); + } + @Override public void setUidMode(int code, int uid, int mode) { if (Binder.getCallingPid() != Process.myPid()) { @@ -487,7 +502,14 @@ public class AppOpsService extends IAppOpsService.Stub { synchronized (this) { final int defaultMode = AppOpsManager.opToDefaultMode(code); - + if(isStrictOpEnable()){ + if (mode == AppOpsManager.MODE_IGNORED) { + Op op; + String packageName = mContext.getPackageManager().getNameForUid(uid); + op = getOpLocked(code, uid, packageName, true); + op.remember = false; + } + } UidState uidState = getUidStateLocked(uid, false); if (uidState == null) { if (mode == defaultMode) { @@ -1016,8 +1038,10 @@ public class AppOpsService extends IAppOpsService.Stub { private int noteOperationUnchecked(int code, int uid, String packageName, int proxyUid, String proxyPackageName) { + PermissionDialogReq req = new PermissionDialogReq(); synchronized (this) { Ops ops = getOpsRawLocked(uid, packageName, true); + final int defaultMode = AppOpsManager.opToDefaultMode(code); if (ops == null) { if (DEBUG) Log.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + " package " + packageName); @@ -1034,35 +1058,56 @@ public class AppOpsService extends IAppOpsService.Stub { op.duration = 0; final int switchCode = AppOpsManager.opToSwitch(code); UidState uidState = ops.uidState; - // If there is a non-default per UID policy (we set UID op mode only if - // non-default) it takes over, otherwise use the per package policy. - if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { - final int uidMode = uidState.opModes.get(switchCode); - if (uidMode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " - + switchCode + " (" + code + ") uid " + uid + " package " - + packageName); - op.rejectTime = System.currentTimeMillis(); - return uidMode; + if (isStrictOpEnable() && (code == AppOpsManager.OP_CHANGE_WIFI_STATE + || code == AppOpsManager.OP_BLUETOOTH_ADMIN)) { + final Op switchOp = switchCode + != code ? getOpLocked(ops, switchCode, true) : op; + if (Looper.myLooper() == mLooper) { + return switchOp.mode; + } + if (op.remember == true) { + if (uidState.opModes == null) { + return defaultMode; + } else if(uidState.opModes.get(code) == AppOpsManager.MODE_ALLOWED){ + return uidState.opModes.get(code); + }else{ + req = askOperationLocked(code, uid, packageName, switchOp); + } + } else { + req = askOperationLocked(code, uid, packageName, switchOp); } } else { - final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; - if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { - if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " - + switchCode + " (" + code + ") uid " + uid + " package " - + packageName); - op.rejectTime = System.currentTimeMillis(); - return switchOp.mode; + // If there is a non-default per UID policy (we set UID op mode only if + // non-default) it takes over, otherwise use the per package policy. + if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) { + final int uidMode = uidState.opModes.get(switchCode); + if (uidMode != AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + + switchCode + " (" + code + ") uid " + uid + " package " + + packageName); + op.rejectTime = System.currentTimeMillis(); + return uidMode; + } + } else { + final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op; + if (switchOp.mode != AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code " + + switchCode + " (" + code + ") uid " + uid + " package " + + packageName); + op.rejectTime = System.currentTimeMillis(); + return switchOp.mode; + } } + if (DEBUG) Log.d(TAG, "noteOperation: allowing code " + code + " uid " + uid + + " package " + packageName); + op.time = System.currentTimeMillis(); + op.rejectTime = 0; + op.proxyUid = proxyUid; + op.proxyPackageName = proxyPackageName; + return AppOpsManager.MODE_ALLOWED; } - if (DEBUG) Log.d(TAG, "noteOperation: allowing code " + code + " uid " + uid - + " package " + packageName); - op.time = System.currentTimeMillis(); - op.rejectTime = 0; - op.proxyUid = proxyUid; - op.proxyPackageName = proxyPackageName; - return AppOpsManager.MODE_ALLOWED; } + return req.get(); //this method could not added to the synchronized } @Override @@ -1285,6 +1330,14 @@ public class AppOpsService extends IAppOpsService.Stub { } } + private void scheduleWriteNowLocked() { + if (!mWriteScheduled) { + mWriteScheduled = true; + } + mHandler.removeCallbacks(mWriteRunner); + mHandler.post(mWriteRunner); + } + private Op getOpLocked(int code, int uid, String packageName, boolean edit) { Ops ops = getOpsRawLocked(uid, packageName, edit); if (ops == null) { @@ -2288,6 +2341,162 @@ public class AppOpsService extends IAppOpsService.Stub { return packageName; } + final class AskRunnable implements Runnable { + final int code; + final int uid; + final String packageName; + final Op op; + final PermissionDialogReq request; + + public AskRunnable(int code, int uid, String packageName, Op op, + PermissionDialogReq request) { + super(); + this.code = code; + this.uid = uid; + this.packageName = packageName; + this.op = op; + this.request = request; + } + + @Override + public void run() { + PermissionDialog permDialog = null; + synchronized (AppOpsService.this) { + op.dialogReqQueue.register(request); + if (op.dialogReqQueue.getDialog() == null) { + permDialog = new PermissionDialog(mContext, + AppOpsService.this, code, uid, packageName); + op.dialogReqQueue.setDialog(permDialog); + } + } + if (permDialog != null) { + permDialog.show(); + } + } + } + + private PermissionDialogReq askOperationLocked(int code, int uid, String packageName, Op op) { + PermissionDialogReq request = new PermissionDialogReq(); + mHandler.post(new AskRunnable(code, uid, packageName, op, request)); + return request; + } + + private void printOperationLocked(Op op, int mode, String operation) { + if (op != null) { + int switchCode = AppOpsManager.opToSwitch(op.op); + if (mode == AppOpsManager.MODE_IGNORED) { + if (DEBUG) Log.d(TAG, operation + ": reject #" + mode + " for code " + + switchCode + " (" + op.op + ") uid " + op.uid + " package " + + op.packageName); + } else if (mode == AppOpsManager.MODE_ALLOWED) { + if (DEBUG) Log.d(TAG, operation + ": allowing code " + op.op + " uid " + + op.uid + + " package " + op.packageName); + } + } + } + + private void recordOperationLocked(int code, int uid, String packageName, + int mode) { + Op op = getOpLocked(code, uid, packageName, false); + if (op != null) { + printOperationLocked(op, mode, "noteOperartion"); + if (mode == AppOpsManager.MODE_IGNORED) { + op.rejectTime = System.currentTimeMillis(); + } else if (mode == AppOpsManager.MODE_ALLOWED) { + op.time = System.currentTimeMillis(); + op.rejectTime = 0; + } + } + } + + public void notifyOperation(int code, int uid, String packageName, + int mode, boolean remember) { + verifyIncomingUid(uid); + verifyIncomingOp(code); + ArrayList repCbs = null; + int switchCode = AppOpsManager.opToSwitch(code); + synchronized (this) { + recordOperationLocked(code, uid, packageName, mode); + Op op = getOpLocked(switchCode, uid, packageName, true); + if (op != null) { + // Send result to all waiting client + if (op.dialogReqQueue.getDialog() != null) { + op.dialogReqQueue.notifyAll(mode); + op.dialogReqQueue.setDialog(null); + } + + if (remember) { + op.remember = true; + writeUidStateMode(code, uid, mode); + ArrayList cbs = mOpModeWatchers.get(switchCode); + if (cbs != null) { + if (repCbs == null) { + repCbs = new ArrayList(); + } + repCbs.addAll(cbs); + } + cbs = mPackageModeWatchers.get(packageName); + if (cbs != null) { + if (repCbs == null) { + repCbs = new ArrayList(); + } + repCbs.addAll(cbs); + } + //if (mode == getDefaultMode(op.op, op.uid, op.packageName)) { + // If going into the default mode, prune this op + // if there is nothing else interesting in it. + //pruneOp(op, uid, packageName); + //} + scheduleWriteNowLocked(); + } + } + } + if (repCbs != null) { + for (int i = 0; i < repCbs.size(); i++) { + try { + repCbs.get(i).mCallback.opChanged(switchCode, uid, packageName); + } catch (RemoteException e) { + Log.w(TAG, "repCbs.get(i).mCallback.opChanged() error ", e); + } + } + } + } + + private void writeUidStateMode(int code, int uid, int mode) { + final int defaultMode = AppOpsManager.opToDefaultMode(code); + UidState uidState = getUidStateLocked(uid, false); + if (uidState == null) { + if (mode == defaultMode) { + return; + } + uidState = new UidState(uid); + uidState.opModes = new SparseIntArray(); + uidState.opModes.put(code, mode); + mUidStates.put(uid, uidState); + scheduleWriteLocked(); + } else if (uidState.opModes == null) { + if (mode != defaultMode) { + uidState.opModes = new SparseIntArray(); + uidState.opModes.put(code, mode); + scheduleWriteLocked(); + } + } else { + if (uidState.opModes.get(code) == mode) { + return; + } + if (mode == defaultMode) { + uidState.opModes.delete(code); + if (uidState.opModes.size() <= 0) { + uidState.opModes = null; + } + } else { + uidState.opModes.put(code, mode); + } + scheduleWriteLocked(); + } + } + private static String[] getPackagesForUid(int uid) { String[] packageNames = null; try { diff --git a/services/core/java/com/android/server/BasePermissionDialog.java b/services/core/java/com/android/server/BasePermissionDialog.java new file mode 100755 index 0000000000000000000000000000000000000000..bf442d6b942dc05c93c330ebeb04ac76d09cc34d --- /dev/null +++ b/services/core/java/com/android/server/BasePermissionDialog.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.android.server; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.view.KeyEvent; +import android.view.WindowManager; +import android.widget.Button; +import com.android.internal.R; + +public class BasePermissionDialog extends AlertDialog { + public BasePermissionDialog(Context dialogCon) { + super(dialogCon, com.android.internal.R.style.Theme_Dialog_AppError); + getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, + WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); + WindowManager.LayoutParams permInfo = getWindow().getAttributes(); + permInfo.setTitle("Permission Dialog"); + getWindow().setAttributes(permInfo); + setIconAttribute(R.attr.alertDialogIcon); + } + + public boolean dispatchKeyEvent(KeyEvent event) { + if (mState) { + return true; + } + return super.dispatchKeyEvent(event); + } + + public void onStart() { + super.onStart(); + setEnabled(false); + mInfoHandler.sendMessage(mInfoHandler.obtainMessage(0)); + } + + private Handler mInfoHandler = new Handler() { + public void handleMessage(Message msg) { + if (msg.what == 0) { + mState = false; + setEnabled(true); + } + } + }; + + private void setEnabled(boolean setState) { + Button btn = (Button) findViewById(R.id.button1); + if (btn != null) { + btn.setEnabled(setState); + } + btn = (Button) findViewById(R.id.button2); + if (btn != null) { + btn.setEnabled(setState); + } + btn = (Button) findViewById(R.id.button3); + if (btn != null) { + btn.setEnabled(setState); + } + } + + private boolean mState = true; +} diff --git a/services/core/java/com/android/server/BatteryService.java b/services/core/java/com/android/server/BatteryService.java index c5a93ab7599254d08f5cbd0078183e73ea7c423c..e6604258d562d0b43874fc3d767a88cffde5d10d 100644 --- a/services/core/java/com/android/server/BatteryService.java +++ b/services/core/java/com/android/server/BatteryService.java @@ -18,6 +18,7 @@ package com.android.server; import android.database.ContentObserver; import android.os.BatteryStats; +import android.os.SystemProperties; import android.os.ResultReceiver; import android.os.ShellCommand; @@ -27,6 +28,7 @@ import com.android.server.lights.Light; import com.android.server.lights.LightsManager; import android.app.ActivityManagerNative; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; @@ -56,6 +58,11 @@ import cyanogenmod.providers.CMSettings; import java.io.File; import java.io.FileDescriptor; import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintWriter; @@ -168,6 +175,29 @@ public final class BatteryService extends SystemService { private boolean mSentLowBatteryBroadcast = false; + private final int mVbattSamplingIntervalMsec = 30000; /* sampling frequency - 30 seconds */ + private final int mWeakChgCutoffVoltageMv; + private static int mWeakChgSocCheckStarted = 0; + /* + * Default shutdown interval in case voltage_now file is not present: + * In case of weak charger shutdown feature is enabled and + * voltage_now file absent shutdown aftet 5 minutes if SOC continues + * to remain at 0 level. + */ + private final int mWeakChgMaxShutdownIntervalMsecs = 300000; + private boolean mInitiateShutdown = false; + private File mVoltageNowFile = null; + private Runnable runnable = new Runnable() { + public void run() { + synchronized (mLock) { + if(mVoltageNowFile.exists()) + shutdownIfWeakChargerVoltageCheckLocked(); + else + shutdownIfWeakChargerEmptySOCLocked(); + } + } + }; + public BatteryService(Context context) { super(context); @@ -176,6 +206,16 @@ public final class BatteryService extends SystemService { mLed = new Led(context, getLocalService(LightsManager.class)); mBatteryStats = BatteryStatsService.getService(); + /* + * Calculate cut-off voltage from 'ro.cutoff_voltage_mv' + * or default to 3200mV. + * if 'ro.cutoff_voltage_mv' <= 0, ignore shutdown logic. + */ + mWeakChgCutoffVoltageMv = SystemProperties.getInt("ro.cutoff_voltage_mv", 0); + /* 2700mV UVLO voltage */ + if (mWeakChgCutoffVoltageMv > 2700) + mVoltageNowFile = new File("/sys/class/power_supply/battery/voltage_now"); + mCriticalBatteryLevel = mContext.getResources().getInteger( com.android.internal.R.integer.config_criticalBatteryWarningLevel); mLowBatteryWarningLevel = mContext.getResources().getInteger( @@ -295,6 +335,67 @@ public final class BatteryService extends SystemService { && (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel); } + private void shutdownIfWeakChargerEmptySOCLocked() { + + if (mBatteryProps.batteryLevel == 0) { + if (mInitiateShutdown) { + if (ActivityManagerNative.isSystemReady()) { + Slog.e(TAG, "silent_reboot shutdownIfWeakChargerEmptySOCLocked"); + + Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); + intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + } + } else { + mInitiateShutdown = true; + mHandler.removeCallbacks(runnable); + mHandler.postDelayed(runnable, mWeakChgMaxShutdownIntervalMsecs); + } + } else { + mInitiateShutdown = false; + mWeakChgSocCheckStarted = 0; + } + } + + private void shutdownIfWeakChargerVoltageCheckLocked() { + int vbattNow = 0; + FileReader fileReader; + BufferedReader br; + + try { + fileReader = new FileReader(mVoltageNowFile); + br = new BufferedReader(fileReader); + vbattNow = Integer.parseInt(br.readLine()); + /* convert battery voltage from uV to mV */ + vbattNow = vbattNow / 1000; + br.close(); + fileReader.close(); + } catch (FileNotFoundException e) { + Slog.e(TAG, "Failure in reading battery voltage", e); + } catch (IOException e) { + Slog.e(TAG, "Failure in reading battery voltage", e); + } + + if (mBatteryProps.batteryLevel == 0) { + if (vbattNow <= mWeakChgCutoffVoltageMv) { + if (ActivityManagerNative.isSystemReady()) { + Slog.e(TAG, "silent_reboot shutdownIfWeakChargerVoltageCheckLocked"); + + Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN); + intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mContext.startActivityAsUser(intent, UserHandle.CURRENT); + } + } else { + mHandler.removeCallbacks(runnable); + mHandler.postDelayed(runnable, mVbattSamplingIntervalMsec); + } + } else { + mWeakChgSocCheckStarted = 0; + } + } + private void shutdownIfNoPowerLocked() { // shut down gracefully if our battery is critically low and we are not powered. // wait until the system has booted before attempting to display the shutdown dialog. @@ -387,6 +488,20 @@ public final class BatteryService extends SystemService { // Should never happen. } + /* + * Schedule Weak Charger shutdown thread if: + * Battery level = 0, Charger is pluggedin and cutoff voltage is valid. + */ + if ((mBatteryProps.batteryLevel == 0) + && (mWeakChgSocCheckStarted == 0) + && (mWeakChgCutoffVoltageMv > 0) + && (mPlugType != BATTERY_PLUGGED_NONE)) { + + mWeakChgSocCheckStarted = 1; + mHandler.removeCallbacks(runnable); + mHandler.postDelayed(runnable, mVbattSamplingIntervalMsec); + } + shutdownIfNoPowerLocked(); shutdownIfOverTempLocked(); @@ -854,6 +969,34 @@ public final class BatteryService extends SystemService { org.cyanogenmod.platform.internal.R.bool.config_useSegmentedBatteryLed); } + private boolean isHvdcpPresent() { + File mChargerTypeFile = new File("/sys/class/power_supply/usb/type"); + FileReader fileReader; + BufferedReader br; + String type; + boolean ret; + + try { + fileReader = new FileReader(mChargerTypeFile); + br = new BufferedReader(fileReader); + type = br.readLine(); + if (type.regionMatches(true, 0, "USB_HVDCP", 0, 9)) + ret = true; + else + ret = false; + br.close(); + fileReader.close(); + } catch (FileNotFoundException e) { + ret = false; + Slog.e(TAG, "Failure in reading charger type", e); + } catch (IOException e) { + ret = false; + Slog.e(TAG, "Failure in reading charger type", e); + } + + return ret; + } + /** * Synchronize on BatteryService. */ @@ -894,8 +1037,14 @@ public final class BatteryService extends SystemService { // Battery is full or charging and nearly full mBatteryLight.setColor(mBatteryFullARGB); } else { - // Battery is charging and halfway full - mBatteryLight.setColor(mBatteryMediumARGB); + if (isHvdcpPresent()) { + // Blinking orange if HVDCP charger + mBatteryLight.setFlashing(mBatteryMediumARGB, Light.LIGHT_FLASH_TIMED, + mBatteryLedOn, mBatteryLedOn); + } else { + // Battery is charging and halfway full + mBatteryLight.setColor(mBatteryMediumARGB); + } } } else { // No lights if not charging and not low diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java old mode 100644 new mode 100755 index 172025b383375e863e9a364b819e93c357ef6374..a5fcdd40eedc92879f5b043183ecdcefd7bc485a --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -19,14 +19,12 @@ package com.android.server; import android.Manifest; import android.app.ActivityManager; import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothProfile; +import android.bluetooth.BluetoothDevice; import android.bluetooth.IBluetooth; import android.bluetooth.IBluetoothCallback; import android.bluetooth.IBluetoothGatt; -import android.bluetooth.IBluetoothHeadset; import android.bluetooth.IBluetoothManager; import android.bluetooth.IBluetoothManagerCallback; -import android.bluetooth.IBluetoothProfileServiceConnection; import android.bluetooth.IBluetoothStateChangeCallback; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -37,6 +35,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.content.pm.PackageManager.NameNotFoundException; import android.database.ContentObserver; import android.os.Binder; import android.os.Handler; @@ -58,6 +57,8 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; +import android.app.AppOpsManager; +import android.os.SystemProperties; class BluetoothManagerService extends IBluetoothManager.Stub { private static final String TAG = "BluetoothManagerService"; @@ -78,8 +79,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int ERROR_RESTART_TIME_MS = 3000; //Maximum msec to delay MESSAGE_USER_SWITCHED private static final int USER_SWITCHED_TIME_MS = 200; - // Delay for the addProxy function in msec - private static final int ADD_PROXY_DELAY_MS = 100; private static final int MESSAGE_ENABLE = 1; private static final int MESSAGE_DISABLE = 2; @@ -96,8 +95,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private static final int MESSAGE_GET_NAME_AND_ADDRESS = 200; private static final int MESSAGE_USER_SWITCHED = 300; private static final int MESSAGE_USER_UNLOCKED = 301; - private static final int MESSAGE_ADD_PROXY_DELAYED = 400; - private static final int MESSAGE_BIND_PROFILE_SERVICE = 401; private static final int MAX_SAVE_RETRIES = 3; private static final int MAX_ERROR_RESTART_RETRIES = 6; @@ -145,11 +142,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private final BluetoothHandler mHandler; private int mErrorRecoveryRetryCounter; private final int mSystemUiUid; - - // Save a ProfileServiceConnections object for each of the bound - // bluetooth profile services - private final Map mProfileServices = - new HashMap (); + private boolean mIntentPending = false; + private int mIBluetoothConnectedMsgQueued = 0; private void registerForAirplaneMode(IntentFilter filter) { final ContentResolver resolver = mContext.getContentResolver(); @@ -626,6 +620,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { return true; } + private boolean isStrictOpEnable() { + return SystemProperties.getBoolean("persist.sys.strict_op_enable", false); + } + public boolean enable() { if ((Binder.getCallingUid() != Process.SYSTEM_UID) && (!checkIfCallerIsForegroundUser())) { @@ -635,6 +633,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission"); + if(isStrictOpEnable()){ + AppOpsManager mAppOpsManager = mContext.getSystemService(AppOpsManager.class); + String packageName = mContext.getPackageManager().getNameForUid(Binder.getCallingUid()); + + if ((Binder.getCallingUid() > 10000) + && (packageName.indexOf("android.uid.systemui") != 0) + && (packageName.indexOf("android.uid.system") != 0)) { + int result = mAppOpsManager.noteOp(AppOpsManager.OP_BLUETOOTH_ADMIN, + Binder.getCallingUid(), packageName); + if (result == AppOpsManager.MODE_IGNORED) { + return false; + } + } + } if (DBG) { Slog.d(TAG,"enable(): mBluetooth =" + mBluetooth + " mBinding = " + mBinding + " mState = " + mState); @@ -718,69 +730,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { return mBluetoothGatt; } - @Override - public boolean bindBluetoothProfileService(int bluetoothProfile, - IBluetoothProfileServiceConnection proxy) { - if (!mEnable) { - if (DBG) { - Slog.d(TAG, "Trying to bind to profile: " + bluetoothProfile + - ", while Bluetooth was disabled"); - } - return false; - } - synchronized (mProfileServices) { - ProfileServiceConnections psc = mProfileServices.get(new Integer(bluetoothProfile)); - if (psc == null) { - if (DBG) { - Slog.d(TAG, "Creating new ProfileServiceConnections object for" - + " profile: " + bluetoothProfile); - } - - if (bluetoothProfile != BluetoothProfile.HEADSET) return false; - - Intent intent = new Intent(IBluetoothHeadset.class.getName()); - psc = new ProfileServiceConnections(intent); - if (!psc.bindService()) return false; - - mProfileServices.put(new Integer(bluetoothProfile), psc); - } - } - - // Introducing a delay to give the client app time to prepare - Message addProxyMsg = mHandler.obtainMessage(MESSAGE_ADD_PROXY_DELAYED); - addProxyMsg.arg1 = bluetoothProfile; - addProxyMsg.obj = proxy; - mHandler.sendMessageDelayed(addProxyMsg, ADD_PROXY_DELAY_MS); - return true; - } - - @Override - public void unbindBluetoothProfileService(int bluetoothProfile, - IBluetoothProfileServiceConnection proxy) { - synchronized (mProfileServices) { - ProfileServiceConnections psc = mProfileServices.get(new Integer(bluetoothProfile)); - if (psc == null) { - return; - } - psc.removeProxy(proxy); - } - } - - private void unbindAllBluetoothProfileServices() { - synchronized (mProfileServices) { - for (Integer i : mProfileServices.keySet()) { - ProfileServiceConnections psc = mProfileServices.get(i); - try { - mContext.unbindService(psc); - } catch (IllegalArgumentException e) { - Slog.e(TAG, "Unable to unbind service with intent: " + psc.mIntent, e); - } - psc.removeAllProxies(); - } - mProfileServices.clear(); - } - } - /** * Send enable message and set adapter name and address. Called when the boot phase becomes * PHASE_SYSTEM_SERVICES_READY. @@ -813,148 +762,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.obtainMessage(MESSAGE_USER_UNLOCKED, userHandle, 0).sendToTarget(); } - /** - * This class manages the clients connected to a given ProfileService - * and maintains the connection with that service. - */ - final private class ProfileServiceConnections implements ServiceConnection, - IBinder.DeathRecipient { - final RemoteCallbackList mProxies = - new RemoteCallbackList (); - IBinder mService; - ComponentName mClassName; - Intent mIntent; - boolean mInvokingProxyCallbacks = false; - - ProfileServiceConnections(Intent intent) { - mService = null; - mClassName = null; - mIntent = intent; - } - - private boolean bindService() { - if (mIntent != null && mService == null && - doBind(mIntent, this, 0, UserHandle.CURRENT_OR_SELF)) { - Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE); - msg.obj = this; - mHandler.sendMessageDelayed(msg, TIMEOUT_BIND_MS); - return true; - } - Slog.w(TAG, "Unable to bind with intent: " + mIntent); - return false; - } - - private void addProxy(IBluetoothProfileServiceConnection proxy) { - mProxies.register(proxy); - if (mService != null) { - try{ - proxy.onServiceConnected(mClassName, mService); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to connect to proxy", e); - } - } else { - if (!mHandler.hasMessages(MESSAGE_BIND_PROFILE_SERVICE, this)) { - Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE); - msg.obj = this; - mHandler.sendMessage(msg); - } - } - } - - private void removeProxy(IBluetoothProfileServiceConnection proxy) { - if (proxy != null) { - if (mProxies.unregister(proxy)) { - try { - proxy.onServiceDisconnected(mClassName); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to disconnect proxy", e); - } - } - } else { - Slog.w(TAG, "Trying to remove a null proxy"); - } - } - - private void removeAllProxies() { - onServiceDisconnected(mClassName); - mProxies.kill(); - } - - @Override - public void onServiceConnected(ComponentName className, IBinder service) { - // remove timeout message - mHandler.removeMessages(MESSAGE_BIND_PROFILE_SERVICE, this); - mService = service; - mClassName = className; - try { - mService.linkToDeath(this, 0); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to linkToDeath", e); - } - - if (mInvokingProxyCallbacks) { - Slog.e(TAG, "Proxy callbacks already in progress."); - return; - } - mInvokingProxyCallbacks = true; - - final int n = mProxies.beginBroadcast(); - try { - for (int i = 0; i < n; i++) { - try { - mProxies.getBroadcastItem(i).onServiceConnected(className, service); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to connect to proxy", e); - } - } - } finally { - mProxies.finishBroadcast(); - mInvokingProxyCallbacks = false; - } - } - - @Override - public void onServiceDisconnected(ComponentName className) { - if (mService == null) return; - mService.unlinkToDeath(this, 0); - mService = null; - mClassName = null; - - if (mInvokingProxyCallbacks) { - Slog.e(TAG, "Proxy callbacks already in progress."); - return; - } - mInvokingProxyCallbacks = true; - - final int n = mProxies.beginBroadcast(); - try { - for (int i = 0; i < n; i++) { - try { - mProxies.getBroadcastItem(i).onServiceDisconnected(className); - } catch (RemoteException e) { - Slog.e(TAG, "Unable to disconnect from proxy", e); - } - } - } finally { - mProxies.finishBroadcast(); - mInvokingProxyCallbacks = false; - } - } - - @Override - public void binderDied() { - if (DBG) { - Slog.w(TAG, "Profile service for profile: " + mClassName - + " died."); - } - onServiceDisconnected(mClassName); - // Trigger rebind - Message msg = mHandler.obtainMessage(MESSAGE_BIND_PROFILE_SERVICE); - msg.obj = this; - mHandler.sendMessageDelayed(msg, TIMEOUT_BIND_MS); - } - } - private void sendBluetoothStateCallback(boolean isUp) { try { int n = mStateChangeCallbacks.beginBroadcast(); @@ -1080,7 +887,9 @@ class BluetoothManagerService extends IBluetoothManager.Stub { return; } msg.obj = service; - mHandler.sendMessage(msg); + boolean sent = mHandler.sendMessage(msg); + if (sent && (msg.arg1 == SERVICE_IBLUETOOTH)) + mIBluetoothConnectedMsgQueued++; } public void onServiceDisconnected(ComponentName className) { @@ -1241,28 +1050,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { } break; } - case MESSAGE_ADD_PROXY_DELAYED: - { - ProfileServiceConnections psc = mProfileServices.get( - new Integer(msg.arg1)); - if (psc == null) { - break; - } - IBluetoothProfileServiceConnection proxy = - (IBluetoothProfileServiceConnection) msg.obj; - psc.addProxy(proxy); - break; - } - case MESSAGE_BIND_PROFILE_SERVICE: - { - ProfileServiceConnections psc = (ProfileServiceConnections) msg.obj; - removeMessages(MESSAGE_BIND_PROFILE_SERVICE, msg.obj); - if (psc == null) { - break; - } - psc.bindService(); - break; - } case MESSAGE_BLUETOOTH_SERVICE_CONNECTED: { if (DBG) Slog.d(TAG,"MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1); @@ -1276,6 +1063,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { break; } // else must be SERVICE_IBLUETOOTH + mIBluetoothConnectedMsgQueued--; + //Remove timeout mHandler.removeMessages(MESSAGE_TIMEOUT_BIND); @@ -1358,8 +1147,13 @@ class BluetoothManagerService extends IBluetoothManager.Stub { recoverBluetoothServiceFromError(); } if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && - (newState == BluetoothAdapter.STATE_BLE_ON) && + (newState == BluetoothAdapter.STATE_OFF) && (mBluetooth != null) && mEnable) { + persistBluetoothSetting(BLUETOOTH_OFF); + } + if ((prevState == BluetoothAdapter.STATE_TURNING_ON) && + (newState == BluetoothAdapter.STATE_BLE_ON) && + (mBluetooth != null) && mEnable) { recoverBluetoothServiceFromError(); } // If we tried to enable BT while BT was in the process of shutting down, @@ -1405,7 +1199,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mBluetoothLock.writeLock().unlock(); } - if (mEnable) { + if (mEnable && (mIBluetoothConnectedMsgQueued == 0)) { mEnable = false; // Send a Bluetooth Restart message Message restartMsg = mHandler.obtainMessage( @@ -1487,7 +1281,6 @@ class BluetoothManagerService extends IBluetoothManager.Stub { bluetoothStateChangeHandler(mState, BluetoothAdapter.STATE_ON); } - unbindAllBluetoothProfileServices(); // disable handleDisable(); // Pbap service need receive STATE_TURNING_OFF intent to close @@ -1673,7 +1466,10 @@ class BluetoothManagerService extends IBluetoothManager.Stub { unbindAndFinish(); sendBleStateChanged(prevState, newState); // Don't broadcast as it has already been broadcast before - isStandardBroadcast = false; + if(!mIntentPending) + isStandardBroadcast = false; + else + mIntentPending = false; } else if (!intermediate_off) { // connect to GattService @@ -1701,6 +1497,13 @@ class BluetoothManagerService extends IBluetoothManager.Stub { // Broadcast as STATE_OFF newState = BluetoothAdapter.STATE_OFF; sendBrEdrDownCallback(); + if(!isBleAppPresent()){ + isStandardBroadcast = false; + mIntentPending = true; + } else { + mIntentPending = false; + isStandardBroadcast = true; + } } } else if (newState == BluetoothAdapter.STATE_ON) { boolean isUp = (newState==BluetoothAdapter.STATE_ON); @@ -1726,6 +1529,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState); intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM); } } @@ -1796,6 +1600,20 @@ class BluetoothManagerService extends IBluetoothManager.Stub { waitForOnOff(false, true); + // If there is a MESSAGE_BLUETOOTH_SERVICE_CONNECTED in mHandler queue, we should not + // unbindService as below. Otherwise, after unbind, com.android.bluetooth will die, but + // later mBluetooth will be assigned to adapterService in handleMessage of + // MESSAGE_BLUETOOTH_SERVICE_CONNECTED. From then on, mBluetooth is not null, + // and com.android.bluetooth is dead, but doBind will not be triggered again. + if (mIBluetoothConnectedMsgQueued > 0) { + Slog.e(TAG, "recoverBluetoothServiceFromError: " + + "MESSAGE_BLUETOOTH_SERVICE_CONNECTED exists in mHandler queue, " + + "should not unbindService, return directly."); + mHandler.removeMessages(MESSAGE_BLUETOOTH_STATE_CHANGE); + mState = BluetoothAdapter.STATE_OFF; + return; + } + sendBluetoothServiceDownCallback(); try { diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 4e619cc41a1350433291dae778c9a7d300055e76..588ff1f6b65ccbb1a871704356e3ae2cad7ffefe 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -99,6 +99,7 @@ import android.os.UserManager; import android.provider.Settings; import android.security.Credentials; import android.security.KeyStore; +import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.ArraySet; @@ -3515,7 +3516,8 @@ public class ConnectivityService extends IConnectivityManager.Stub title = r.getString(R.string.network_available_sign_in, 0); // TODO: Change this to pull from NetworkInfo once a printable // name has been added to it - details = mTelephonyManager.getNetworkOperatorName(); + details = mTelephonyManager.getNetworkOperatorName( + SubscriptionManager.getDefaultDataSubscriptionId()); icon = R.drawable.stat_notify_rssi_in_range; break; default: diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index afed5ef066ff1b927af32423c1f869d45d04b93c..ded736921d07f59e70c42f3319cad7e11f9b7686 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -1189,6 +1189,18 @@ public class DeviceIdleController extends SystemService return isPowerSaveWhitelistAppInternal(name); } + @Override public int getIdleStateDetailed() { + getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, + null); + return mState; + } + + @Override public int getLightIdleStateDetailed() { + getContext().enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, + null); + return mLightState; + } + @Override public void addPowerSaveTempWhitelistApp(String packageName, long duration, int userId, String reason) throws RemoteException { addPowerSaveTempWhitelistAppChecked(packageName, duration, userId, reason); diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 36ec2eb9a192f446f78da467dd74aa57e7410f36..bcbad3d4de3051f039c9ec54a2ec2b327c8aa666 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -154,6 +154,9 @@ public class LocationManagerService extends ILocationManager.Stub { private LocationFudger mLocationFudger; private GeofenceManager mGeofenceManager; private PackageManager mPackageManager; + private String mComboNlpPackageName; + private String mComboNlpReadyMarker; + private String mComboNlpScreenMarker; private PowerManager mPowerManager; private UserManager mUserManager; private GeocoderProxy mGeocodeProvider; @@ -584,6 +587,13 @@ public class LocationManagerService extends ILocationManager.Stub { Slog.d(TAG, "Unable to bind ActivityRecognitionProxy."); } + mComboNlpPackageName = resources.getString( + com.android.internal.R.string.config_comboNetworkLocationProvider); + if (mComboNlpPackageName != null) { + mComboNlpReadyMarker = mComboNlpPackageName + ".nlp:ready"; + mComboNlpScreenMarker = mComboNlpPackageName + ".nlp:screen"; + } + String[] testProviderStrings = resources.getStringArray( com.android.internal.R.array.config_testLocationProviders); for (String testProviderString : testProviderStrings) { @@ -2374,6 +2384,70 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { return mMockProviders.containsKey(provider); } + + } + + private Location screenLocationLocked(Location location, String provider) { + if (isMockProvider(LocationManager.NETWORK_PROVIDER)) { + return location; + } + LocationProviderProxy providerProxy = + (LocationProviderProxy)mProvidersByName.get(LocationManager.NETWORK_PROVIDER); + if (mComboNlpPackageName == null || providerProxy == null || + false == provider.equals(LocationManager.NETWORK_PROVIDER) || + isMockProvider(LocationManager.NETWORK_PROVIDER)) { + return location; + } + + String connectedNlpPackage = providerProxy.getConnectedPackageName(); + if (connectedNlpPackage == null || !connectedNlpPackage.equals(mComboNlpPackageName)) { + return location; + } + + Bundle extras = location.getExtras(); + boolean isBeingScreened = false; + if (extras == null) { + extras = new Bundle(); + } + + if (!extras.containsKey(mComboNlpReadyMarker)) { + // see if Combo Nlp is a passive listener + ArrayList records = + mRecordsByProvider.get(LocationManager.PASSIVE_PROVIDER); + if (records != null) { + for (UpdateRecord r : records) { + if (r.mReceiver.mPackageName.equals(mComboNlpPackageName)) { + if (!isBeingScreened) { + isBeingScreened = true; + extras.putBoolean(mComboNlpScreenMarker, true); + } + // send location to Combo Nlp for screening + if (!r.mReceiver.callLocationChangedLocked(location)) { + Slog.w(TAG, "RemoteException calling onLocationChanged on " + + r.mReceiver); + } else { + if (D) { + Log.d(TAG, "Sending location for screening"); + } + } + } + } + } + if (isBeingScreened) { + return null; + } + if (D) { + Log.d(TAG, "Not screening locations"); + } + } else { + if (D) { + Log.d(TAG, "This location is marked as ready for broadcast"); + } + // clear the ready marker + extras.remove(mComboNlpReadyMarker); + } + + return location; } private void handleLocationChanged(Location location, boolean passive) { @@ -2392,6 +2466,10 @@ public class LocationManagerService extends ILocationManager.Stub { synchronized (mLock) { if (isAllowedByCurrentUserSettingsLocked(provider)) { if (!passive) { + location = screenLocationLocked(location, provider); + if (location == null) { + return; + } // notify passive provider of the new location mPassiveProvider.updateLocation(myLocation); } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index d64fe32cca55517569738e5827082cf4ad5d6da2..e267872eb2369b15eb7b614d5d1f31ab664e2f3f 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -117,6 +117,7 @@ public class LockSettingsService extends ILockSettings.Stub { private static final int PROFILE_KEY_IV_SIZE = 12; private static final String SEPARATE_PROFILE_CHALLENGE_KEY = "lockscreen.profilechallenge"; private final Object mSeparateChallengeLock = new Object(); + private static final String DEFAULT_PASSWORD = "default_password"; private final Context mContext; private final Handler mHandler; @@ -129,6 +130,7 @@ public class LockSettingsService extends ILockSettings.Stub { private IGateKeeperService mGateKeeperService; private NotificationManager mNotificationManager; private UserManager mUserManager; + private static String mSavePassword = DEFAULT_PASSWORD; private final KeyStore mKeyStore = KeyStore.getInstance(); @@ -716,6 +718,45 @@ public class LockSettingsService extends ILockSettings.Stub { return mStorage.hasPattern(userId); } + public void retainPassword(String password) { + if (LockPatternUtils.isDeviceEncryptionEnabled()) { + if (password != null) + mSavePassword = password; + else + mSavePassword = DEFAULT_PASSWORD; + } + } + + public void sanitizePassword() { + if (LockPatternUtils.isDeviceEncryptionEnabled()) { + mSavePassword = DEFAULT_PASSWORD; + } + } + + private boolean checkCryptKeeperPermissions() { + boolean permission_err = false; + try { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.CRYPT_KEEPER, + "no permission to get the password"); + } catch (SecurityException e) { + permission_err = true; + } + return permission_err; + } + + public String getPassword() { + /** if calling process does't have crypt keeper or admin permissions, + * throw the exception. + */ + if (checkCryptKeeperPermissions()) + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.MANAGE_DEVICE_ADMINS, + "no crypt_keeper or admin permission to get the password"); + + return mSavePassword; + } + private void setKeystorePassword(String password, int userHandle) { final KeyStore ks = KeyStore.getInstance(); ks.onUserPasswordChanged(userHandle, password); @@ -1203,7 +1244,10 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public VerifyCredentialResponse checkPattern(String pattern, int userId) throws RemoteException { - return doVerifyPattern(pattern, false, 0, userId); + VerifyCredentialResponse response = doVerifyPattern(pattern, false, 0, userId); + if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) + retainPassword(pattern); + return response; } @Override @@ -1263,7 +1307,10 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public VerifyCredentialResponse checkPassword(String password, int userId) throws RemoteException { - return doVerifyPassword(password, false, 0, userId); + VerifyCredentialResponse response = doVerifyPassword(password, false, 0, userId); + if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) + retainPassword(password); + return response; } @Override diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index cdd977be29edcea1098411bbbebbc11a7ca005c3..8b19123624ed3eada27c3cf0faf7f9db14955ce8 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -103,6 +103,7 @@ import com.android.internal.widget.LockPatternUtils; import com.android.server.NativeDaemonConnector.Command; import com.android.server.NativeDaemonConnector.SensitiveArg; import com.android.server.pm.PackageManagerService; +import com.android.internal.widget.ILockSettings; import libcore.io.IoUtils; import libcore.util.EmptyArray; @@ -1255,7 +1256,10 @@ class MountService extends IMountService.Stub } private void onVolumeCreatedLocked(VolumeInfo vol) { - if (mPms.isOnlyCoreApps()) { + // power off alarm need the access to external storage for audio files. + // So in power off alarm mode, primary storage need to be mounted. + boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false); + if (mPms.isOnlyCoreApps() && !isAlarmBoot) { Slog.d(TAG, "System booted in core-only mode; ignoring volume " + vol.getId()); return; } @@ -2566,7 +2570,7 @@ class MountService extends IMountService.Stub } } - public int encryptStorage(int type, String password) { + private int encryptStorageExtended(int type, String password, boolean wipe) { if (TextUtils.isEmpty(password) && type != StorageManager.CRYPT_TYPE_DEFAULT) { throw new IllegalArgumentException("password cannot be empty"); } @@ -2582,10 +2586,10 @@ class MountService extends IMountService.Stub try { if (type == StorageManager.CRYPT_TYPE_DEFAULT) { - mCryptConnector.execute("cryptfs", "enablecrypto", "inplace", + mCryptConnector.execute("cryptfs", "enablecrypto", wipe ? "wipe" : "inplace", CRYPTO_TYPES[type]); } else { - mCryptConnector.execute("cryptfs", "enablecrypto", "inplace", + mCryptConnector.execute("cryptfs", "enablecrypto", wipe ? "wipe" : "inplace", CRYPTO_TYPES[type], new SensitiveArg(password)); } } catch (NativeDaemonConnectorException e) { @@ -2596,6 +2600,22 @@ class MountService extends IMountService.Stub return 0; } + /** Encrypt Storage given a password. + * @param type The password type. + * @param password The password to be used in encryption. + */ + public int encryptStorage(int type, String password) { + return encryptStorageExtended(type, password, false); + } + + /** Encrypt Storage given a password after wiping it. + * @param type The password type. + * @param password The password to be used in encryption. + */ + public int encryptWipeStorage(int type, String password) { + return encryptStorageExtended(type, password, true); + } + /** Set the password for encrypting the master key. * @param type One of the CRYPTO_TYPE_XXX consts defined in StorageManager. * @param password The password to set. @@ -2610,9 +2630,24 @@ class MountService extends IMountService.Stub Slog.i(TAG, "changing encryption password..."); } + ILockSettings lockSettings = ILockSettings.Stub.asInterface( + ServiceManager.getService("lock_settings")); + String currentPassword="default_password"; + try { + currentPassword = lockSettings.getPassword(); + } catch (RemoteException e) { + Slog.e(TAG, "Couldn't get password" + e); + } + try { NativeDaemonEvent event = mCryptConnector.execute("cryptfs", "changepw", CRYPTO_TYPES[type], - new SensitiveArg(password)); + new SensitiveArg(currentPassword), new SensitiveArg(password)); + try { + lockSettings.sanitizePassword(); + } catch (RemoteException e) { + Slog.e(TAG, "Couldn't sanitize password" + e); + } + return Integer.parseInt(event.getMessage()); } catch (NativeDaemonConnectorException e) { // Encryption failed diff --git a/services/core/java/com/android/server/NetPluginDelegate.java b/services/core/java/com/android/server/NetPluginDelegate.java new file mode 100644 index 0000000000000000000000000000000000000000..3aeb5bb9d1ef20062aecb321b6c0bcc5bf8ba9cd --- /dev/null +++ b/services/core/java/com/android/server/NetPluginDelegate.java @@ -0,0 +1,162 @@ +/* + *Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server; + +import dalvik.system.PathClassLoader; + +import java.io.File; +import java.lang.reflect.Constructor; + +import android.util.Slog; +import android.net.Network; +import android.net.NetworkStats; +import android.util.Log; + +public class NetPluginDelegate { + + private static final String TAG = "ConnectivityExtension"; + private static final boolean LOGV = false; + + private static Class tetherExtensionClass = null; + private static Object tetherExtensionObj = null; + + public static void getTetherStats(NetworkStats uidStats, NetworkStats devStats, + NetworkStats xtStats) { + if (LOGV) Slog.v(TAG, "getTetherStats() E"); + if(!loadTetherExtJar()) return; + try { + tetherExtensionClass.getMethod("getTetherStats", NetworkStats.class, + NetworkStats.class, NetworkStats.class).invoke(tetherExtensionObj, uidStats, + devStats, xtStats); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "error in invoke method"); + } + if (LOGV) Slog.v(TAG, "getTetherStats() X"); + } + + public static NetworkStats peekTetherStats() { + if (LOGV) Slog.v(TAG, "peekTetherStats() E"); + NetworkStats ret_val = null; + if(!loadTetherExtJar()) return ret_val; + try { + ret_val = (NetworkStats) tetherExtensionClass.getMethod("peekTetherStats") + .invoke(tetherExtensionObj); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "error in invoke method"); + } + if (LOGV) Slog.v(TAG, "peekTetherStats() X"); + return ret_val; + } + + public static void natStarted(String intIface, String extIface) { + if (LOGV) Slog.v(TAG, "natStarted() E"); + if(!loadTetherExtJar()) return; + try { + tetherExtensionClass.getMethod("natStarted", String.class, String.class).invoke( + tetherExtensionObj, intIface, extIface); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "Error calling natStarted Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "natStarted() X"); + } + + public static void natStopped(String intIface, String extIface) { + if (LOGV) Slog.v(TAG, "natStopped() E"); + if(!loadTetherExtJar()) return; + try { + tetherExtensionClass.getMethod("natStopped", String.class, String.class).invoke( + tetherExtensionObj, intIface, extIface); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "Error calling natStopped Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "natStopped() X"); + } + + public static void setQuota(String iface, long quota) { + if (LOGV) Slog.v(TAG, "setQuota(" + iface + ", " + quota + ") E"); + if(!loadTetherExtJar()) return; + try { + tetherExtensionClass.getMethod("setQuota", String.class, long.class).invoke( + tetherExtensionObj, iface, quota); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "Error calling setQuota Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "setQuota(" + iface + ", " + quota + ") X"); + } + + public static void setUpstream(Network net) { + if (LOGV) Slog.v(TAG, "setUpstream(" + net + ") E"); + if(!loadTetherExtJar()) return; + try { + tetherExtensionClass.getMethod("setUpstream", Network.class).invoke( + tetherExtensionObj, net); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "Error calling setUpstream Method on extension jar"); + } + if (LOGV) Slog.v(TAG, "setUpstream(" + net + ") X"); + } + + + private static boolean loadTetherExtJar() { + final String realProvider = "com.qualcomm.qti.tetherstatsextension.TetherStatsReporting"; + final String realProviderPath = "/system/framework/ConnectivityExt.jar"; + if (tetherExtensionClass != null && tetherExtensionObj != null) { + return true; + } + boolean pathExists = new File(realProviderPath).exists(); + if (!pathExists) { + Log.w(TAG, "ConnectivityExt jar file not present"); + return false; + } + + if (tetherExtensionClass == null && tetherExtensionObj == null) { + if (LOGV) Slog.v(TAG, "loading ConnectivityExt jar"); + try { + PathClassLoader classLoader = new PathClassLoader(realProviderPath, + ClassLoader.getSystemClassLoader()); + + tetherExtensionClass = classLoader.loadClass(realProvider); + tetherExtensionObj = tetherExtensionClass.newInstance(); + if (LOGV) Slog.v(TAG, "ConnectivityExt jar loaded"); + } catch (Exception e) { + e.printStackTrace(); + Log.w(TAG, "unable to load ConnectivityExt jar"); + return false; + } + } + return true; + } +} diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index f2368779336d1a44d5e6a94348acdc7176c7cc39..4a66c9cfef149f9acac4e170005bfd96c7874d55 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -47,8 +47,11 @@ import static com.android.server.NetworkManagementService.NetdResponseCode.TtyLi import static com.android.server.NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED; import android.annotation.NonNull; import android.app.ActivityManagerNative; +import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.net.ConnectivityManager; import android.net.INetd; import android.net.INetworkManagementEventObserver; @@ -90,10 +93,12 @@ import android.util.SparseIntArray; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IBatteryStats; import com.android.internal.net.NetworkStatsFactory; +import com.android.internal.R; import com.android.internal.util.HexDump; import com.android.internal.util.Preconditions; import com.android.server.NativeDaemonConnector.Command; import com.android.server.NativeDaemonConnector.SensitiveArg; +import com.android.server.NetPluginDelegate; import com.android.server.net.LockdownVpnTracker; import com.google.android.collect.Maps; @@ -348,6 +353,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub } else { prepareNativeDaemon(); } + //Registering the receiver for Zerobalance blocking/unblocking + if (mContext.getResources().getBoolean(R.bool.config_zero_balance_operator)) { + final IntentFilter restrictFilter = new IntentFilter(); + restrictFilter.addAction("org.codeaurora.restrictData"); + mContext.registerReceiver(mZeroBalanceReceiver, restrictFilter); + } + if (DBG) Slog.d(TAG, "ZeroBalance registering receiver"); } private IBatteryStats getBatteryStats() { @@ -1233,6 +1245,26 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + @Override + public void createSoftApInterface(String wlanIface) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + try { + mConnector.execute("softap", "create", wlanIface); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + + @Override + public void deleteSoftApInterface(String wlanIface) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + try { + mConnector.execute("softap", "remove", wlanIface); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + @Override public void startTethering(String[] dhcpRange) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); @@ -1410,6 +1442,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub } catch (SocketException e) { throw new IllegalStateException(e); } + NetPluginDelegate.natStarted(internalInterface,externalInterface); } @Override @@ -1420,6 +1453,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub } catch (SocketException e) { throw new IllegalStateException(e); } + NetPluginDelegate.natStopped(internalInterface,externalInterface); } @Override @@ -1489,9 +1523,28 @@ public class NetworkManagementService extends INetworkManagementService.Stub if (wifiConfig == null) { args = new Object[] {"set", wlanIface}; } else { - args = new Object[] {"set", wlanIface, wifiConfig.SSID, - "broadcast", Integer.toString(wifiConfig.apChannel), - getSecurityType(wifiConfig), new SensitiveArg(wifiConfig.preSharedKey)}; + String ssid_mode = "broadcast"; + if (mContext.getResources().getBoolean( + com.android.internal.R.bool + .config_regional_hotspot_show_broadcast_ssid_checkbox) + && wifiConfig.hiddenSSID) { + ssid_mode = "hidden"; + } + if (mContext.getResources().getBoolean( + com.android.internal.R.bool + .config_regional_hotspot_show_maximum_connection_enable)) { + int clientNum = Settings.System.getInt(mContext.getContentResolver(), + "WIFI_HOTSPOT_MAX_CLIENT_NUM", 8); + if (DBG) Slog.d(TAG, "clientNum: " + clientNum); + args = new Object[] {"set", wlanIface, wifiConfig.SSID, + ssid_mode, Integer.toString(wifiConfig.apChannel), + getSecurityType(wifiConfig), + new SensitiveArg(wifiConfig.preSharedKey), clientNum}; + } else { + args = new Object[] {"set", wlanIface, wifiConfig.SSID, + ssid_mode, Integer.toString(wifiConfig.apChannel), + getSecurityType(wifiConfig), new SensitiveArg(wifiConfig.preSharedKey)}; + } } executeOrLogWithMessage(SOFT_AP_COMMAND, args, NetdResponseCode.SoftapStatusResult, SOFT_AP_COMMAND_SUCCESS, logMsg); @@ -1505,6 +1558,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + @Override + public void startWigigAccessPoint() { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + try { + mConnector.execute("softap", "qccmd", "set", "enable_wigig_softap=1"); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + private static String getSecurityType(WifiConfiguration wifiConfig) { switch (wifiConfig.getAuthType()) { case KeyMgmt.WPA_PSK: @@ -1551,6 +1614,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } + @Override + public void stopWigigAccessPoint() { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + try { + mConnector.execute("softap", "qccmd", "set", "enable_wigig_softap=0"); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + @Override public void setAccessPoint(WifiConfiguration wifiConfig, String wlanIface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); @@ -2763,4 +2836,29 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void removeInterfaceFromLocalNetwork(String iface) { modifyInterfaceInNetwork("remove", "local", iface); } + + private BroadcastReceiver mZeroBalanceReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + boolean isBlockAllData = false; + if(intent != null + && intent.getAction().equals("org.codeaurora.restrictData")) { + isBlockAllData = intent.getBooleanExtra("Restrict",false); + Log.wtf("ZeroBalance", "Intent value to block unblock data"+isBlockAllData); + } + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + // silently discard when control disabled + // TODO: eventually migrate to be always enabled + if (!mBandwidthControlEnabled) return; + try { + Log.wtf("ZeroBalance", "before calling connector Intent" + +"value to block unblock data"+isBlockAllData); + mConnector.execute("bandwidth", + isBlockAllData ? "blockAllData" : "unblockAllData"); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + }; } diff --git a/services/core/java/com/android/server/PermissionDialog.java b/services/core/java/com/android/server/PermissionDialog.java new file mode 100755 index 0000000000000000000000000000000000000000..fba5bdcc17ca348ec89ad7147ad78e5eb408d304 --- /dev/null +++ b/services/core/java/com/android/server/PermissionDialog.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.android.server; + +import android.os.Message; +import android.os.Handler; +import android.widget.TextView; +import android.widget.CheckBox; +import android.view.WindowManager; +import android.view.View; +import android.content.res.Resources; +import android.content.pm.PackageManager; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.Context; +import android.content.DialogInterface; +import android.app.AppOpsManager; + +public class PermissionDialog extends BasePermissionDialog { + private final int mDef; + private final String inputPackage; + private final AppOpsService opsServ; + private final static String TAG = "PermInfo"; + private View viewId; + private int inputId; + private CheckBox checkSta; + private Context contId; + final CharSequence[] mOpLabels; + static final int IGNORED_REQ = 0x4; + static final int IGNORED_REQ_TIMEOUT = 0x8; + static final long TIMEOUT_WAIT = 15 * 1000; + static final int ALLOWED_REQ = 0x2; + + public PermissionDialog(Context contextId, AppOpsService opsService, + int defInf, int idInfo, String packageName) { + super(contextId); + opsServ = opsService; + inputPackage = packageName; + contId = contextId; + mDef = defInf; + Resources rId = contextId.getResources(); + inputId = idInfo; + mOpLabels = rId.getTextArray( + com.android.internal.R.array.app_ops_labels); + setCancelable(false); + setButton(DialogInterface.BUTTON_POSITIVE, + rId.getString(com.android.internal.R.string.allow_button), + myHandle.obtainMessage(ALLOWED_REQ)); + setButton(DialogInterface.BUTTON_NEGATIVE, + rId.getString(com.android.internal.R.string.deny_button), + myHandle.obtainMessage(IGNORED_REQ)); + setTitle(rId.getString(com.android.internal.R.string.permission_title)); + WindowManager.LayoutParams paraDef = getWindow().getAttributes(); + paraDef.setTitle("Permission: " + getAppName(inputPackage)); + paraDef.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR + | WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS; + getWindow().setAttributes(paraDef); + viewId = getLayoutInflater().inflate( + com.android.internal.R.layout.permission_confirmation_dialog, null); + TextView textId = (TextView) viewId.findViewById( + com.android.internal.R.id.permission_text); + checkSta = (CheckBox) viewId.findViewById( + com.android.internal.R.id.permission_remember_choice_checkbox); + TextView textRem = (TextView) viewId.findViewById( + com.android.internal.R.id.permission_remember_choice_text); + checkSta.setVisibility(View.INVISIBLE); + textRem.setVisibility(View.INVISIBLE); + + String appName = getAppName(inputPackage); + if (appName == null) + appName = inputPackage; + textId.setText(appName + ": " + mOpLabels[mDef-64]); + setView(viewId); + myHandle.sendMessageDelayed(myHandle.obtainMessage(IGNORED_REQ_TIMEOUT), TIMEOUT_WAIT); + } + + private final Handler myHandle = new Handler() { + public void handleMessage(Message mess) { + int runSet; + boolean keepIt = checkSta.isChecked(); + switch (mess.what) { + case ALLOWED_REQ: + runSet = AppOpsManager.MODE_ALLOWED; + break; + case IGNORED_REQ: + runSet = AppOpsManager.MODE_IGNORED; + break; + default: + runSet = AppOpsManager.MODE_IGNORED; + keepIt = false; + } + opsServ.notifyOperation(mDef, inputId, inputPackage, runSet, keepIt); + dismiss(); + } + }; + + private String getAppName(String inputName) { + PackageManager packMan = contId.getPackageManager(); + ApplicationInfo runInfo = null; + try { + runInfo = packMan.getApplicationInfo(inputName, PackageManager.GET_DISABLED_COMPONENTS + | PackageManager.GET_UNINSTALLED_PACKAGES); + } catch (final NameNotFoundException e) { + return null; + } + if (runInfo != null) { + return (String) packMan.getApplicationLabel(runInfo); + } + return null; + } +} diff --git a/services/core/java/com/android/server/PermissionDialogReqQueue.java b/services/core/java/com/android/server/PermissionDialogReqQueue.java new file mode 100755 index 0000000000000000000000000000000000000000..64a7885e5eddfeecc4f3f705dc70cc1cace848f3 --- /dev/null +++ b/services/core/java/com/android/server/PermissionDialogReqQueue.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2015-2016, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.android.server; + +import java.util.ArrayList; +import java.util.List; + +public class PermissionDialogReqQueue { + public PermissionDialog getDialog() { + return mDialog; + } + + public void setDialog(PermissionDialog mDialog) { + this.mDialog = mDialog; + } + + public final static class PermissionDialogReq { + public void set(int res) { + synchronized (this) { + mHasResult = true; + mResult = res; + notifyAll(); + } + } + + public int get() { + synchronized (this) { + while (!mHasResult) { + try { + wait(); + } catch (InterruptedException e) { + } + } + } + return mResult; + } + + boolean mHasResult = false; + int mResult; + } + + private PermissionDialog mDialog; + private List mResultList; + + public PermissionDialogReqQueue() { + mDialog = null; + mResultList = new ArrayList(); + } + + public void register(PermissionDialogReq res) { + synchronized (this) { + mResultList.add(res); + } + } + + public void notifyAll(int mode) { + synchronized (this) { + while (mResultList.size() != 0) { + PermissionDialogReq res = mResultList.get(0); + res.set(mode); + mResultList.remove(0); + } + } + } +} diff --git a/services/core/java/com/android/server/QCNsrmAlarmExtension.java b/services/core/java/com/android/server/QCNsrmAlarmExtension.java new file mode 100644 index 0000000000000000000000000000000000000000..a042f720ef86dc7a681c1d7d06217b136e853468 --- /dev/null +++ b/services/core/java/com/android/server/QCNsrmAlarmExtension.java @@ -0,0 +1,120 @@ +/* + *Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server; + +import android.os.Binder; +import android.os.PowerManager; +import android.os.Process; +import android.util.Slog; + +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public final class QCNsrmAlarmExtension { + static final String TAG = "QCNsrmAlarmExtn"; + static final boolean localLOGV = false; + private AlarmManagerService almHandle; + + //track the blocked and triggered uids in AlarmManagerService + private static final ArrayList mTriggeredUids = new ArrayList(); + private static final ArrayList mBlockedUids = new ArrayList(); + private static final int BLOCKED_UID_CHECK_INTERVAL = 1000; // 1 sec. + + public QCNsrmAlarmExtension(AlarmManagerService handle) { + almHandle = handle; + } + + //AlarmManagerService extension Methods + protected void processBlockedUids(int uid, boolean isBlocked, PowerManager.WakeLock mWakeLock ){ + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids: uid = " + uid + + " isBlocked = " + isBlocked); + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids is not allowed"); + return; + } + + if(isBlocked) { + if (localLOGV) Slog.v(TAG, "updating alarmMgr mBlockedUids "+ + "with uid " + uid); + mBlockedUids.add(new Integer(uid)); + Timer checkBlockedUidTimer = new Timer(); + checkBlockedUidTimer.schedule( new CheckBlockedUidTimerTask( + uid, + mWakeLock), + BLOCKED_UID_CHECK_INTERVAL); + } else { + if (localLOGV) Slog.v(TAG, "clearing alarmMgr mBlockedUids "); + mBlockedUids.clear(); + } + } + + protected void addTriggeredUid (int uid){ + if (localLOGV) Slog.v(TAG, "adding uid to mTriggeredUids uid=" + uid); + mTriggeredUids.add(new Integer(uid)); + + } + + protected void removeTriggeredUid (int uid) { + if (localLOGV) Slog.v(TAG, "removing uid from mTriggeredUids uid= " + uid); + mTriggeredUids.remove(new Integer(uid)); + } + + protected boolean hasBlockedUid (int uid) { + + return mBlockedUids.contains(uid); + + } + + class CheckBlockedUidTimerTask extends TimerTask { + private int mUid; + PowerManager.WakeLock mWakeLock; + + CheckBlockedUidTimerTask(int uid, PowerManager.WakeLock lWakeLock) { + mUid = uid; + mWakeLock = lWakeLock; + } + + @Override + public void run(){ + if (mBlockedUids.contains(mUid) && mTriggeredUids.contains(mUid)) { + synchronized(almHandle.mLock) { + if (mWakeLock.isHeld()) { + mWakeLock.release(); + if (localLOGV) + Slog.v(TAG, "CheckBlockedUidTimerTask: AM "+ + "WakeLock Released Internally!!"); + } + } + return; + } + } + } +} diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 9602bf672cca3478cdb0b6093672a56a5e701fd3..752887e5b28e88585424ded8ac48c5425e9558f2 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -158,7 +158,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { private String[] mDataConnectionApn; - private ArrayList mConnectedApns; + private ArrayList[] mConnectedApns; private LinkProperties[] mDataConnectionLinkProperties; @@ -290,11 +290,11 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mContext = context; mBatteryStats = BatteryStatsService.getService(); - mConnectedApns = new ArrayList(); int numPhones = TelephonyManager.getDefault().getPhoneCount(); if (DBG) log("TelephonyRegistor: ctor numPhones=" + numPhones); mNumPhones = numPhones; + mConnectedApns = new ArrayList[numPhones]; mCallState = new int[numPhones]; mDataActivity = new int[numPhones]; mDataConnectionState = new int[numPhones]; @@ -312,6 +312,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { mDataConnectionNetworkCapabilities = new NetworkCapabilities[numPhones]; mCellInfo = new ArrayList>(); for (int i = 0; i < numPhones; i++) { + mConnectedApns[i] = new ArrayList(); mCallState[i] = TelephonyManager.CALL_STATE_IDLE; mDataActivity[i] = TelephonyManager.DATA_ACTIVITY_NONE; mDataConnectionState[i] = TelephonyManager.DATA_UNKNOWN; @@ -334,7 +335,6 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { location.fillInNotifierBundle(mCellLocation[i]); } } - mConnectedApns = new ArrayList(); mAppOps = mContext.getSystemService(AppOpsManager.class); } @@ -1023,18 +1023,21 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { synchronized (mRecords) { int phoneId = SubscriptionManager.getPhoneId(subId); if (validatePhoneId(phoneId)) { + if (VDBG) { + log(" mConnectedApns[" + phoneId + "]=" + mConnectedApns[phoneId].toString()); + } boolean modified = false; if (state == TelephonyManager.DATA_CONNECTED) { - if (!mConnectedApns.contains(apnType)) { - mConnectedApns.add(apnType); + if (!mConnectedApns[phoneId].contains(apnType)) { + mConnectedApns[phoneId].add(apnType); if (mDataConnectionState[phoneId] != state) { mDataConnectionState[phoneId] = state; modified = true; } } } else { - if (mConnectedApns.remove(apnType)) { - if (mConnectedApns.isEmpty()) { + if (mConnectedApns[phoneId].remove(apnType)) { + if (mConnectedApns[phoneId].isEmpty()) { mDataConnectionState[phoneId] = state; modified = true; } else { diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index be021ea48ab8025c73b04ea90b4bf2e80e0eda1d..6e4cf48e1a48917529086af969420fc6face45c3 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -42,6 +42,8 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; +import java.util.Date; +import java.text.SimpleDateFormat; /** This class calls its monitor every minute. Killing this process if they don't return **/ public class Watchdog extends Thread { @@ -87,6 +89,7 @@ public class Watchdog extends Thread { int mPhonePid; IActivityController mController; boolean mAllowRestart = true; + SimpleDateFormat mTraceDateFormat = new SimpleDateFormat("dd_MMM_HH_mm_ss.SSS"); /** * Used for checking status of handle threads and scheduling monitor callbacks. @@ -435,9 +438,22 @@ public class Watchdog extends Thread { dumpKernelStackTraces(); } - // Trigger the kernel to dump all blocked threads, and backtraces on all CPUs to the kernel log - doSysRq('w'); - doSysRq('l'); + String tracesPath = SystemProperties.get("dalvik.vm.stack-trace-file", null); + String traceFileNameAmendment = "_SystemServer_WDT" + mTraceDateFormat.format(new Date()); + + if (tracesPath != null && tracesPath.length() != 0) { + File traceRenameFile = new File(tracesPath); + String newTracesPath; + int lpos = tracesPath.lastIndexOf ("."); + if (-1 != lpos) + newTracesPath = tracesPath.substring (0, lpos) + traceFileNameAmendment + tracesPath.substring (lpos); + else + newTracesPath = tracesPath + traceFileNameAmendment; + traceRenameFile.renameTo(new File(newTracesPath)); + tracesPath = newTracesPath; + } + + final File newFd = new File(tracesPath); // Try to add the error to the dropbox, but assuming that the ActivityManager // itself may be deadlocked. (which has happened, causing this statement to @@ -446,7 +462,7 @@ public class Watchdog extends Thread { public void run() { mActivity.addErrorToDropBox( "watchdog", null, "system_server", null, null, - subject, null, stack, null); + subject, null, newFd, null); } }; dropboxThread.start(); @@ -454,6 +470,26 @@ public class Watchdog extends Thread { dropboxThread.join(2000); // wait up to 2 seconds for it to return. } catch (InterruptedException ignored) {} + + // At times, when user space watchdog traces don't give an indication on + // which component held a lock, because of which other threads are blocked, + // (thereby causing Watchdog), crash the device to analyze RAM dumps + boolean crashOnWatchdog = SystemProperties + .getBoolean("persist.sys.crashOnWatchdog", false); + if (crashOnWatchdog) { + // Trigger the kernel to dump all blocked threads, and backtraces + // on all CPUs to the kernel log + Slog.e(TAG, "Triggering SysRq for system_server watchdog"); + doSysRq('w'); + doSysRq('l'); + + // wait until the above blocked threads be dumped into kernel log + SystemClock.sleep(3000); + + // now try to crash the target + doSysRq('c'); + } + IActivityController controller; synchronized (this) { controller = mController; diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index f7bd04b08ede24fac08450647473368e178fba59..5dfbf8f0900bd7265070e353f087aeab65d7f575 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -775,6 +775,7 @@ public class AccountManagerService @Override public String getPassword(Account account) { + android.util.SeempLog.record(14); int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "getPassword: " + account @@ -869,6 +870,7 @@ public class AccountManagerService @Override public String getUserData(Account account, String key) { + android.util.SeempLog.record(15); final int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { String msg = String.format("getUserData( account: %s, key: %s, callerUid: %s, pid: %s", @@ -1485,6 +1487,7 @@ public class AccountManagerService @Override public void removeAccount(IAccountManagerResponse response, Account account, boolean expectActivityLaunch) { + android.util.SeempLog.record(17); removeAccountAsUser( response, account, @@ -1893,6 +1896,7 @@ public class AccountManagerService @Override public void setPassword(Account account, String password) { + android.util.SeempLog.record(18); final int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "setAuthToken: " + account @@ -1957,6 +1961,7 @@ public class AccountManagerService @Override public void clearPassword(Account account) { + android.util.SeempLog.record(19); final int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "clearPassword: " + account @@ -1983,6 +1988,7 @@ public class AccountManagerService @Override public void setUserData(Account account, String key, String value) { + android.util.SeempLog.record(20); final int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "setUserData: " + account @@ -2452,6 +2458,7 @@ public class AccountManagerService public void addAccount(final IAccountManagerResponse response, final String accountType, final String authTokenType, final String[] requiredFeatures, final boolean expectActivityLaunch, final Bundle optionsIn) { + android.util.SeempLog.record(16); Bundle.setDefusable(optionsIn, true); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "addAccount: accountType " + accountType @@ -3221,6 +3228,7 @@ public class AccountManagerService @Override public void editProperties(IAccountManagerResponse response, final String accountType, final boolean expectActivityLaunch) { + android.util.SeempLog.record(21); final int callingUid = Binder.getCallingUid(); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "editProperties: accountType " + accountType diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index ee2fa51c86668f1af7f128c6a7c66571f5f500a4..107939ae09e5230afe0ab6b0bd653af751d1c375 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -125,6 +125,10 @@ public final class ActiveServices { // at the same time. final int mMaxStartingBackground; + // Flag to reschedule the services during app launch. Disable by default. + private static final boolean SERVICE_RESCHEDULE + = SystemProperties.getBoolean("ro.am.reschedule_service", false); + final SparseArray mServiceMap = new SparseArray<>(); /** @@ -1492,6 +1496,14 @@ public final class ActiveServices { r.pendingStarts.add(0, si); long dur = SystemClock.uptimeMillis() - si.deliveredTime; dur *= 2; + if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) { + Slog.w(TAG,"Can add more delay !!!" + +" si.deliveredTime "+si.deliveredTime + +" dur "+dur + +" si.deliveryCount "+si.deliveryCount + +" si.doneExecutingCount "+si.doneExecutingCount + +" allowCancel "+allowCancel); + } if (minDuration < dur) minDuration = dur; if (resetTime < dur) resetTime = dur; } else { @@ -1504,6 +1516,13 @@ public final class ActiveServices { } r.totalRestartCount++; + if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) { + Slog.w(TAG,"r.name "+r.name+" N "+N+" minDuration "+minDuration + +" resetTime "+resetTime+" now "+now + +" r.restartDelay "+r.restartDelay + +" r.restartTime+resetTime "+(r.restartTime+resetTime) + +" allowCancel "+allowCancel); + } if (r.restartDelay == 0) { r.restartCount++; r.restartDelay = minDuration; @@ -1525,6 +1544,14 @@ public final class ActiveServices { } r.nextRestartTime = now + r.restartDelay; + if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) { + Slog.w(TAG,"r.name "+r.name+" N "+N+" minDuration "+minDuration + +" resetTime "+resetTime+" now "+now + +" r.restartDelay "+r.restartDelay + +" r.restartTime+resetTime "+(r.restartTime+resetTime) + +" r.nextRestartTime "+r.nextRestartTime + +" allowCancel "+allowCancel); + } // Make sure that we don't end up restarting a bunch of services // all at the same time. @@ -1567,6 +1594,15 @@ public final class ActiveServices { r.nextRestartTime = SystemClock.uptimeMillis() + r.restartDelay; Slog.w(TAG, "Scheduling restart of crashed service " + r.shortName + " in " + r.restartDelay + "ms"); + + if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) { + for (int i=mRestartingServices.size()-1; i>=0; i--) { + ServiceRecord r2 = mRestartingServices.get(i); + Slog.w(TAG,"Restarting list - i "+i+" r2.nextRestartTime " + +r2.nextRestartTime+" r2.name "+r2.name); + } + } + EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART, r.userId, r.shortName, r.restartDelay); @@ -1587,7 +1623,31 @@ public final class ActiveServices { return; } try { - bringUpServiceLocked(r, r.intent.getIntent().getFlags(), r.createdFromFg, true, false); + if(SERVICE_RESCHEDULE == true) { + boolean shouldDelay = false; + ActivityRecord top_rc = null; + ActivityStack stack = mAm.getFocusedStack(); + if(stack != null) { + top_rc = stack.topRunningActivityLocked(); + } + if(top_rc != null) { + if(!top_rc.nowVisible && !r.shortName.contains(top_rc.packageName)) { + shouldDelay = true; + } + } + if(!shouldDelay) { + bringUpServiceLocked(r, r.intent.getIntent().getFlags(), r.createdFromFg, true, false); + } else { + if (DEBUG_DELAYED_SERVICE) { + Slog.v(TAG, "Reschedule service restart due to app launch" + +" r.shortName "+r.shortName+" r.app = "+r.app); + } + r.resetRestartCounter(); + scheduleServiceRestartLocked(r, true); + } + } else { + bringUpServiceLocked(r, r.intent.getIntent().getFlags(), r.createdFromFg, true, false); + } } catch (TransactionTooLargeException e) { // Ignore, it's been logged and nothing upstack cares. } @@ -1812,6 +1872,11 @@ public final class ActiveServices { if (newService) { app.services.remove(r); r.app = null; + if (SERVICE_RESCHEDULE && DEBUG_DELAYED_SERVICE) { + Slog.w(TAG, " Failed to create Service !!!! ." + +"This will introduce huge delay... " + +r.shortName + " in " + r.restartDelay + "ms"); + } } // Retry. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c124e5d9a9bc2a97f68377f6ba18d1d0e662b8f6..86806b9aa3f14ff843721fc4ec4eafaedabaf788 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -29,6 +29,7 @@ import com.android.internal.app.IVoiceInteractor; import com.android.internal.app.ProcessMap; import com.android.internal.app.SystemUserHomeActivity; import com.android.internal.app.procstats.ProcessStats; +import com.android.internal.app.ActivityTrigger; import com.android.internal.os.BackgroundThread; import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.IResultReceiver; @@ -149,6 +150,8 @@ import android.graphics.Bitmap; import android.graphics.Point; import android.graphics.Rect; import android.location.LocationManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; import android.net.Proxy; import android.net.ProxyInfo; import android.net.Uri; @@ -213,6 +216,7 @@ import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; import android.util.Xml; +import android.util.BoostFramework; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; @@ -521,10 +525,17 @@ public final class ActivityManagerService extends ActivityManagerNative private static final int PERSISTENT_MASK = ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT; + // Start home process as an empty app + private boolean mHomeKilled = false; + private String mHomeProcessName = null; + // Intent sent when remote bugreport collection has been completed private static final String INTENT_REMOTE_BUGREPORT_FINISHED = "android.intent.action.REMOTE_BUGREPORT_FINISHED"; + private static final String ACTION_POWER_OFF_ALARM = + "org.codeaurora.alarm.action.POWER_OFF_ALARM"; + // Delay to disable app launch boost static final int APP_BOOST_MESSAGE_DELAY = 3000; // Lower delay than APP_BOOST_MESSAGE_DELAY to disable the boost @@ -544,6 +555,22 @@ public final class ActivityManagerService extends ActivityManagerNative private boolean mIsBoosted = false; private long mBoostStartTime = 0; + /* Freq Aggr boost objects */ + public static BoostFramework sFreqAggr_init = null; + public static BoostFramework sFreqAggr = null; + public static boolean sIsFreqAggrBoostSet = false; + private boolean mIsFreqAggrEnabled = false; + private int lFreqAggr_TimeOut = 0; + private int lFreqAggr_Init_ParamVal[]; + private int lFreqAggr_ParamVal[]; + + /* Launch boost v2 objects */ + public static BoostFramework sPerfBoost_v2 = null; + public static boolean sIsLaunchBoostv2_set = false; + private boolean mIsLaunchBoostv2_enabled = false; + private int lBoost_v2_TimeOut = 0; + private int lBoost_v2_ParamVal[]; + /** All system services */ SystemServiceManager mSystemServiceManager; @@ -1529,11 +1556,25 @@ public final class ActivityManagerService extends ActivityManagerNative static ServiceThread sKillThread = null; static KillHandler sKillHandler = null; + static final ActivityTrigger mActivityTrigger = new ActivityTrigger(); CompatModeDialog mCompatModeDialog; UnsupportedDisplaySizeDialog mUnsupportedDisplaySizeDialog; long mLastMemUsageReportTime = 0; + // Min aging threshold in milliseconds to consider a B-service + int mMinBServiceAgingTime = + SystemProperties.getInt("ro.sys.fw.bservice_age", 5000); + // Threshold for B-services when in memory pressure + int mBServiceAppThreshold = + SystemProperties.getInt("ro.sys.fw.bservice_limit", 5); + // Enable B-service aging propagation on memory pressure. + boolean mEnableBServicePropagation = + SystemProperties.getBoolean("ro.sys.fw.bservice_enable", false); + + static final boolean mEnableNetOpts = + SystemProperties.getBoolean("persist.netopts.enable",false); + /** * Flag whether the current user is a "monkey", i.e. whether * the UI is driven by a UI automation tool. @@ -2688,6 +2729,28 @@ public final class ActivityManagerService extends ActivityManagerNative Watchdog.getInstance().addMonitor(this); Watchdog.getInstance().addThread(mHandler); + + mIsFreqAggrEnabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableFreqAggr); + + if(mIsFreqAggrEnabled) { + lFreqAggr_TimeOut = mContext.getResources().getInteger( + com.android.internal.R.integer.freqaggr_timeout_param); + lFreqAggr_Init_ParamVal = mContext.getResources().getIntArray( + com.android.internal.R.array.freqaggr_init_param_value); + lFreqAggr_ParamVal = mContext.getResources().getIntArray( + com.android.internal.R.array.freqaggr_param_value); + } + + mIsLaunchBoostv2_enabled = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableLaunchBoostv2); + + if(mIsLaunchBoostv2_enabled) { + lBoost_v2_TimeOut = mContext.getResources().getInteger( + com.android.internal.R.integer.lboostv2_timeout_param); + lBoost_v2_ParamVal = mContext.getResources().getIntArray( + com.android.internal.R.array.lboostv2_param_value); + } } public void setSystemServiceManager(SystemServiceManager mgr) { @@ -2913,6 +2976,25 @@ public final class ActivityManagerService extends ActivityManagerNative return mAppBindArgs; } + private final void networkOptsCheck(int flag, String packageName) { + ConnectivityManager connectivityManager = + (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivityManager != null) { + NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo(); + if (netInfo != null) { + /* netType: 0 for Mobile, 1 for WIFI*/ + int netType = netInfo.getType(); + if (mActivityTrigger != null) { + mActivityTrigger.networkOptsCheck(flag, netType, packageName); + } + } else { + if (mActivityTrigger != null) { + mActivityTrigger.networkOptsCheck(flag, ConnectivityManager.TYPE_NONE, packageName); + } + } + } + } + boolean setFocusedActivityLocked(ActivityRecord r, String reason) { if (r == null || mFocusedActivity == r) { return false; @@ -2932,6 +3014,10 @@ public final class ActivityManagerService extends ActivityManagerNative final ActivityRecord last = mFocusedActivity; mFocusedActivity = r; + if (mEnableNetOpts) { + networkOptsCheck(0, r.processName); + } + if (r.task.isApplicationTask()) { if (mCurAppTimeTracker != r.appTimeTracker) { // We are switching app tracking. Complete the current one. @@ -3790,6 +3876,45 @@ public final class ActivityManagerService extends ActivityManagerNative buf.append(hostingNameStr); } Slog.i(TAG, buf.toString()); + + if(hostingType.equals("activity")) { + BoostFramework perf = new BoostFramework(); + + if (perf != null) { + perf.perfIOPrefetchStart(startResult.pid,app.processName); + } + + // Start Freq Aggregation boost + if (mIsFreqAggrEnabled == true && sFreqAggr_init == null + && sFreqAggr == null) { + sFreqAggr_init = new BoostFramework(); + sFreqAggr = new BoostFramework(); + } + if (sFreqAggr_init != null && sFreqAggr != null) { + sFreqAggr_init.perfLockAcquire(lFreqAggr_TimeOut, lFreqAggr_Init_ParamVal); + sIsFreqAggrBoostSet = true; + // Frequency Aggr perflock can only be passed one opcode-pair + if (lFreqAggr_ParamVal.length == 2) { + lFreqAggr_ParamVal[1] = startResult.pid; + sFreqAggr.perfLockAcquire(lFreqAggr_TimeOut, lFreqAggr_ParamVal); + } else { + //Opcodes improperly defined. Disable Perflock FA support. + sFreqAggr = null; + sFreqAggr_init.perfLockRelease(); + sIsFreqAggrBoostSet = false; + } + } + + // Start launch boost v2 + if (mIsLaunchBoostv2_enabled == true && sPerfBoost_v2 == null) { + sPerfBoost_v2 = new BoostFramework(); + } + if (sPerfBoost_v2 != null) { + sPerfBoost_v2.perfLockAcquire(lBoost_v2_TimeOut, lBoost_v2_ParamVal); + sIsLaunchBoostv2_set = true; + } + } + app.setPid(startResult.pid); app.usingWrapper = startResult.usingWrapper; app.removed = false; @@ -3806,6 +3931,9 @@ public final class ActivityManagerService extends ActivityManagerNative } } checkTime(startTime, "startProcess: done updating pids map"); + if ("activity".equals(hostingType) || "service".equals(hostingType)) { + mActivityTrigger.activityStartProcessTrigger(app.processName, startResult.pid); + } } catch (RuntimeException e) { Slog.e(TAG, "Failure starting process " + app.processName, e); @@ -3853,6 +3981,15 @@ public final class ActivityManagerService extends ActivityManagerNative return intent; } + /** + * If system is power off alarm boot mode, we need to start alarm UI. + */ + void sendAlarmBroadcast() { + Intent intent = new Intent(ACTION_POWER_OFF_ALARM); + intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); + mContext.sendBroadcastAsUser(intent, UserHandle.CURRENT); + } + boolean startHomeActivityLocked(int userId, String reason) { if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) { @@ -5161,10 +5298,18 @@ public final class ActivityManagerService extends ActivityManagerNative app.thread.asBinder() == thread.asBinder()) { boolean doLowMem = app.instrumentationClass == null; boolean doOomAdj = doLowMem; + boolean homeRestart = false; if (!app.killedByAm) { + if (mHomeProcessName != null && app.processName.equals(mHomeProcessName)) { + mHomeKilled = true; + homeRestart = true; + } Slog.i(TAG, "Process " + app.processName + " (pid " + pid + ") has died"); mAllowLowerMemLevel = true; + if (mEnableNetOpts) { + networkOptsCheck(1, app.processName); + } } else { // Note that we always want to do oom adj to update our state with the // new number of procs. @@ -5182,6 +5327,13 @@ public final class ActivityManagerService extends ActivityManagerNative if (doLowMem) { doLowMemReportIfNeededLocked(app); } + if (mHomeKilled && homeRestart) { + Intent intent = getHomeIntent(); + ActivityInfo aInfo = mStackSupervisor.resolveActivity(intent, null, 0, null, 0); + startProcessLocked(aInfo.processName, aInfo.applicationInfo, true, 0, + "activity", null, false, false, true); + homeRestart = false; + } } else if (app.pid != pid) { // A new process has already been started. Slog.i(TAG, "Process " + app.processName + " (pid " + pid @@ -6750,6 +6902,27 @@ public final class ActivityManagerService extends ActivityManagerNative } }, dumpheapFilter); + if (mEnableNetOpts) { + IntentFilter netInfoFilter = new IntentFilter(); + netInfoFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); + netInfoFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + ActivityStack stack = mStackSupervisor.getLastStack(); + if (stack != null) { + ActivityRecord r = stack.topRunningActivityLocked(); + if (r != null) { + PowerManager powerManager = + (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); + if (powerManager != null && powerManager.isInteractive()) + networkOptsCheck(0, r.processName); + } + } + } + }, netInfoFilter); + } + // Let system services know. mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETED); @@ -13135,6 +13308,12 @@ public final class ActivityManagerService extends ActivityManagerNative } startHomeActivityLocked(currentUserId, "systemReady"); + // start the power off alarm by boot mode + boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false); + if (isAlarmBoot) { + sendAlarmBroadcast(); + } + try { if (AppGlobals.getPackageManager().hasSystemUidErrors()) { Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your" @@ -16805,6 +16984,7 @@ public final class ActivityManagerService extends ActivityManagerNative mProcessesOnHold.remove(app); if (app == mHomeProcess) { + mHomeProcessName = mHomeProcess.processName; mHomeProcess = null; } if (app == mPreviousProcess) { @@ -19089,6 +19269,10 @@ public final class ActivityManagerService extends ActivityManagerNative app.adjType = "top-activity"; foregroundActivities = true; procState = PROCESS_STATE_CUR_TOP; + if(app == mHomeProcess) { + mHomeKilled = false; + mHomeProcessName = mHomeProcess.processName; + } } else if (app.instrumentationClass != null) { // Don't want to kill running instrumentation. adj = ProcessList.FOREGROUND_APP_ADJ; @@ -19124,6 +19308,14 @@ public final class ActivityManagerService extends ActivityManagerNative app.cached = true; app.empty = true; app.adjType = "cch-empty"; + + if (mHomeKilled && app.processName.equals(mHomeProcessName)) { + adj = ProcessList.PERSISTENT_PROC_ADJ; + schedGroup = Process.THREAD_GROUP_DEFAULT; + app.cached = false; + app.empty = false; + app.adjType = "top-activity"; + } } // Examine all activities if not already foreground. @@ -20092,6 +20284,18 @@ public final class ActivityManagerService extends ActivityManagerNative boolean success = true; if (app.curRawAdj != app.setRawAdj) { + String seempStr = "app_uid=" + app.uid + + ",app_pid=" + app.pid + ",oom_adj=" + app.curAdj + + ",setAdj=" + app.setAdj + ",hasShownUi=" + (app.hasShownUi ? 1 : 0) + + ",cached=" + (app.cached ? 1 : 0) + + ",fA=" + (app.foregroundActivities ? 1 : 0) + + ",fS=" + (app.foregroundServices ? 1 : 0) + + ",systemNoUi=" + (app.systemNoUi ? 1 : 0) + + ",curSchedGroup=" + app.curSchedGroup + + ",curProcState=" + app.curProcState + ",setProcState=" + app.setProcState + + ",killed=" + (app.killed ? 1 : 0) + ",killedByAm=" + (app.killedByAm ? 1 : 0) + + ",debugging=" + (app.debugging ? 1 : 0); + android.util.SeempLog.record_str(385, seempStr); app.setRawAdj = app.curRawAdj; } @@ -20572,8 +20776,39 @@ public final class ActivityManagerService extends ActivityManagerNative int nextCachedAdj = curCachedAdj+1; int curEmptyAdj = ProcessList.CACHED_APP_MIN_ADJ; int nextEmptyAdj = curEmptyAdj+2; + ProcessRecord selectedAppRecord = null; + long serviceLastActivity = 0; + int numBServices = 0; for (int i=N-1; i>=0; i--) { ProcessRecord app = mLruProcesses.get(i); + if (mEnableBServicePropagation && app.serviceb + && (app.curAdj == ProcessList.SERVICE_B_ADJ)) { + numBServices++; + for (int s = app.services.size() - 1; s >= 0; s--) { + ServiceRecord sr = app.services.valueAt(s); + if (DEBUG_OOM_ADJ) Slog.d(TAG,"app.processName = " + app.processName + + " serviceb = " + app.serviceb + " s = " + s + " sr.lastActivity = " + + sr.lastActivity + " packageName = " + sr.packageName + + " processName = " + sr.processName); + if (SystemClock.uptimeMillis() - sr.lastActivity + < mMinBServiceAgingTime) { + if (DEBUG_OOM_ADJ) { + Slog.d(TAG,"Not aged enough!!!"); + } + continue; + } + if (serviceLastActivity == 0) { + serviceLastActivity = sr.lastActivity; + selectedAppRecord = app; + } else if (sr.lastActivity < serviceLastActivity) { + serviceLastActivity = sr.lastActivity; + selectedAppRecord = app; + } + } + } + if (DEBUG_OOM_ADJ && selectedAppRecord != null) Slog.d(TAG, + "Identified app.processName = " + selectedAppRecord.processName + + " app.pid = " + selectedAppRecord.pid); if (!app.killedByAm && app.thread != null) { app.procStateChanged = false; computeOomAdjLocked(app, ProcessList.UNKNOWN_ADJ, TOP_APP, true, now); @@ -20682,6 +20917,14 @@ public final class ActivityManagerService extends ActivityManagerNative } } } + if ((numBServices > mBServiceAppThreshold) && (true == mAllowLowerMemLevel) + && (selectedAppRecord != null)) { + ProcessList.setOomAdj(selectedAppRecord.pid, selectedAppRecord.info.uid, + ProcessList.CACHED_APP_MAX_ADJ); + selectedAppRecord.setAdj = selectedAppRecord.curAdj; + if (DEBUG_OOM_ADJ) Slog.d(TAG,"app.processName = " + selectedAppRecord.processName + + " app.pid = " + selectedAppRecord.pid + " is moved to higher adj"); + } mNumServiceProcs = mNewNumServiceProcs; @@ -21540,6 +21783,15 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (ActivityManagerService.this) { SleepTokenImpl token = new SleepTokenImpl(tag); mSleepTokens.add(token); + if (mEnableNetOpts) { + ActivityStack stack = mStackSupervisor.getLastStack(); + if (stack != null) { + ActivityRecord r = stack.topRunningActivityLocked(); + if (r != null) { + networkOptsCheck(1, r.processName); + } + } + } updateSleepIfNeededLocked(); return token; } @@ -21664,6 +21916,15 @@ public final class ActivityManagerService extends ActivityManagerNative public void release() { synchronized (ActivityManagerService.this) { if (mSleepTokens.remove(this)) { + if (mEnableNetOpts) { + ActivityStack stack = mStackSupervisor.getLastStack(); + if (stack != null) { + ActivityRecord r = stack.topRunningActivityLocked(); + if (r != null) { + networkOptsCheck(0, r.processName); + } + } + } updateSleepIfNeededLocked(); } } diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 4ead64b6915bcca7c2be00af7c42cc9a7735101b..58290e705cefcb1bce2f1b7e8313eede35b2873f 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -119,6 +119,8 @@ import android.util.EventLog; import android.util.Log; import android.util.Slog; import android.view.Display; +import com.android.internal.app.ActivityTrigger; +import android.util.BoostFramework; import com.android.internal.app.IVoiceInteractor; import com.android.internal.content.ReferrerIntent; @@ -235,6 +237,10 @@ final class ActivityStack { final WindowManagerService mWindowManager; private final RecentTasks mRecentTasks; + public BoostFramework mPerf = null; + public boolean mIsAnimationBoostEnabled = false; + public int aBoostTimeOut = 0; + public int aBoostParamVal[]; /** * The back history of all previous (and possibly still * running) activities. It contains #TaskRecord objects. @@ -354,6 +360,8 @@ final class ActivityStack { final Handler mHandler; + static final ActivityTrigger mActivityTrigger = new ActivityTrigger(); + final class ActivityStackHandler extends Handler { ActivityStackHandler(Looper looper) { @@ -447,6 +455,14 @@ final class ActivityStack { mRecentTasks = recentTasks; mTaskPositioner = mStackId == FREEFORM_WORKSPACE_STACK_ID ? new LaunchingTaskPositioner() : null; + mIsAnimationBoostEnabled = mService.mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enablePerfBoostForAnimation); + if (mIsAnimationBoostEnabled) { + aBoostTimeOut = mService.mContext.getResources().getInteger( + com.android.internal.R.integer.animationboost_timeout_param); + aBoostParamVal = mService.mContext.getResources().getIntArray( + com.android.internal.R.array.animationboost_param_value); + } } void attachDisplay(ActivityStackSupervisor.ActivityDisplay activityDisplay, boolean onTop) { @@ -1101,6 +1117,9 @@ final class ActivityStack { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSING: " + prev); else if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Start pausing: " + prev); + + mActivityTrigger.activityPauseTrigger(prev.intent, prev.info, prev.appInfo); + mResumedActivity = null; mPausingActivity = prev; mLastPausedActivity = prev; @@ -2233,7 +2252,10 @@ final class ActivityStack { if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Resuming " + next); - // If we are currently pausing an activity, then don't do anything until that is done. + mActivityTrigger.activityResumeTrigger(next.intent, next.info, next.appInfo); + + // If we are currently pausing an activity, then don't do anything + // until that is done. if (!mStackSupervisor.allPausedActivitiesComplete()) { if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE, "resumeTopActivityLocked: Skip resume: some activity pausing."); @@ -2337,6 +2359,9 @@ final class ActivityStack { // that the previous one will be hidden soon. This way it can know // to ignore it when computing the desired screen orientation. boolean anim = true; + if (mIsAnimationBoostEnabled == true && mPerf == null) { + mPerf = new BoostFramework(); + } if (prev != null) { if (prev.finishing) { if (DEBUG_TRANSITION) Slog.v(TAG_TRANSITION, @@ -2348,6 +2373,9 @@ final class ActivityStack { mWindowManager.prepareAppTransition(prev.task == next.task ? TRANSIT_ACTIVITY_CLOSE : TRANSIT_TASK_CLOSE, false); + if(prev.task != next.task && mPerf != null) { + mPerf.perfLockAcquire(aBoostTimeOut, aBoostParamVal); + } } mWindowManager.setAppVisibility(prev.appToken, false); } else { @@ -2362,6 +2390,9 @@ final class ActivityStack { : next.mLaunchTaskBehind ? TRANSIT_TASK_OPEN_BEHIND : TRANSIT_TASK_OPEN, false); + if(prev.task != next.task && mPerf != null) { + mPerf.perfLockAcquire(aBoostTimeOut, aBoostParamVal); + } } } } else { @@ -2699,6 +2730,7 @@ final class ActivityStack { task.setFrontOfTask(); r.putInHistory(); + mActivityTrigger.activityStartTrigger(r.intent, r.info, r.appInfo); if (!isHomeStack() || numActivities() > 0) { // We want to show the starting preview window if we are // switching to a new task, or the next activity's process is @@ -3238,11 +3270,15 @@ final class ActivityStack { r.resumeKeyDispatchingLocked(); try { r.stopped = false; + if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to STOPPING: " + r + " (stop requested)"); r.state = ActivityState.STOPPING; if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Stopping visible=" + r.visible + " for " + r); + + mActivityTrigger.activityStopTrigger(r.intent, r.info, r.appInfo); + if (!r.visible) { mWindowManager.setAppVisibility(r.appToken, false); } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 36207c48794f8243f6ad5a298a96531fe1a846cd..30ea8df5bd2123e5c78faf88ce0cc2d7d7a1d44f 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -84,6 +84,7 @@ import android.view.Display; import android.view.DisplayInfo; import android.view.InputEvent; import android.view.Surface; +import android.util.BoostFramework; import com.android.internal.content.ReferrerIntent; import com.android.internal.os.TransferPipe; @@ -205,6 +206,17 @@ public final class ActivityStackSupervisor implements DisplayListener { static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; + + public BoostFramework mPerfBoost = null; + public BoostFramework mPerfPack = null; + public BoostFramework mPerfIop = null; + public boolean mIsPerfBoostEnabled = false; + public boolean mIsperfDisablepackingEnable = false; + public int lBoostTimeOut = 0; + public int lDisPackTimeOut = 0; + public int lBoostCpuParamVal[]; + public int lBoostPackParamVal[]; + static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; @@ -487,6 +499,25 @@ public final class ActivityStackSupervisor implements DisplayListener { mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext); mResizeDockedStackTimeout = new ResizeDockedStackTimeout(service, this, mHandler); + /* Is perf lock for cpu-boost enabled during App 1st launch */ + mIsPerfBoostEnabled = mService.mContext.getResources().getBoolean( + com.android.internal.R.bool.config_enableCpuBoostForAppLaunch); + mIsperfDisablepackingEnable = mService.mContext.getResources().getBoolean( + com.android.internal.R.bool.config_disablePacking); + + if(mIsPerfBoostEnabled) { + lBoostTimeOut = mService.mContext.getResources().getInteger( + com.android.internal.R.integer.launchboost_timeout_param); + lBoostCpuParamVal = mService.mContext.getResources().getIntArray( + com.android.internal.R.array.launchboost_param_value); + } + + if(mIsperfDisablepackingEnable) { + lDisPackTimeOut = mService.mContext.getResources().getInteger( + com.android.internal.R.integer.disablepacking_timeout_param); + lBoostPackParamVal = mService.mContext.getResources().getIntArray( + com.android.internal.R.array.launchboost_packing_param_value); + } } void setRecentTasks(RecentTasks recentTasks) { @@ -1840,6 +1871,14 @@ public final class ActivityStackSupervisor implements DisplayListener { void findTaskToMoveToFrontLocked(TaskRecord task, int flags, ActivityOptions options, String reason, boolean forceNonResizeable) { + + ActivityRecord top_activity; + top_activity = task.stack.topRunningActivityLocked(); + /* App is launching from recent apps and it's a new process */ + if(top_activity != null && top_activity.state == ActivityState.DESTROYED) { + acquireAppLaunchPerfLock(top_activity.packageName); + } + if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { mUserLeaving = true; } @@ -2608,6 +2647,31 @@ public final class ActivityStackSupervisor implements DisplayListener { resumeFocusedStackTopActivityLocked(); } + void acquireAppLaunchPerfLock(String packageName) { + /* Acquire perf lock during new app launch */ + if (mIsperfDisablepackingEnable == true && mPerfPack == null) { + mPerfPack = new BoostFramework(); + } + if (mPerfPack != null) { + mPerfPack.perfLockAcquire(lDisPackTimeOut, lBoostPackParamVal); + } + + if (mIsPerfBoostEnabled == true && mPerfBoost == null) { + mPerfBoost = new BoostFramework(); + } + if (mPerfBoost != null) { + mPerfBoost.perfLockAcquire(lBoostTimeOut, lBoostCpuParamVal); + } + + // Start IOP + if (mPerfIop == null) { + mPerfIop = new BoostFramework(); + } + if (mPerfIop != null) { + mPerfIop.perfIOPrefetchStart(-1,packageName); + } + } + ActivityRecord findTaskLocked(ActivityRecord r) { mTmpFindTaskResult.r = null; mTmpFindTaskResult.matchedByRootAffinity = false; @@ -2631,10 +2695,20 @@ public final class ActivityStackSupervisor implements DisplayListener { // there is a better match in another stack. We eventually return the match based // on root affinity if we don't find a better match. if (mTmpFindTaskResult.r != null && !mTmpFindTaskResult.matchedByRootAffinity) { + if(mTmpFindTaskResult.r.state == ActivityState.DESTROYED ) { + /*It's a new app launch */ + acquireAppLaunchPerfLock(r.packageName); + } return mTmpFindTaskResult.r; } } } + + /* Acquire perf lock *only* during new app launch */ + if (mTmpFindTaskResult.r == null || mTmpFindTaskResult.r.state == ActivityState.DESTROYED) { + acquireAppLaunchPerfLock(r.packageName); + } + if (DEBUG_TASKS && mTmpFindTaskResult.r == null) Slog.d(TAG_TASKS, "No task found"); return mTmpFindTaskResult.r; } diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index f073e5cd4fda1109dbf13d0083fad2d8159084b9..fd1898e63594a7c90a8e1cabd8a612d706db64ba 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -32,6 +32,7 @@ import com.android.server.wm.WindowManagerService; import android.content.res.Resources; import android.graphics.Point; import android.os.SystemProperties; +import android.os.Process; import android.net.LocalSocketAddress; import android.net.LocalSocket; import android.util.Slog; @@ -144,7 +145,18 @@ final class ProcessList { // we have no limit on the number of service, visible, foreground, or other such // processes and the number of those processes does not count against the cached // process limit. - static final int MAX_CACHED_APPS = 32; + static final int MAX_CACHED_APPS = SystemProperties.getInt("ro.sys.fw.bg_apps_limit",32); + + static final boolean USE_TRIM_SETTINGS = + SystemProperties.getBoolean("ro.sys.fw.use_trim_settings",true); + static final int EMPTY_APP_PERCENT = SystemProperties.getInt("ro.sys.fw.empty_app_percent",50); + static final int TRIM_EMPTY_PERCENT = + SystemProperties.getInt("ro.sys.fw.trim_empty_percent",100); + static final int TRIM_CACHE_PERCENT = + SystemProperties.getInt("ro.sys.fw.trim_cache_percent",100); + static final long TRIM_ENABLE_MEMORY = + SystemProperties.getLong("ro.sys.fw.trim_enable_memory",1073741824); + public static boolean allowTrim() { return Process.getTotalMemory() < TRIM_ENABLE_MEMORY ; } // We allow empty processes to stick around for at most 30 minutes. static final long MAX_EMPTY_TIME = 30*60*1000; @@ -154,11 +166,25 @@ final class ProcessList { // The number of empty apps at which we don't consider it necessary to do // memory trimming. - static final int TRIM_EMPTY_APPS = MAX_EMPTY_APPS/2; + public static int computeTrimEmptyApps() { + if (USE_TRIM_SETTINGS && allowTrim()) { + return MAX_EMPTY_APPS*TRIM_EMPTY_PERCENT/100; + } else { + return MAX_EMPTY_APPS/2; + } + } + static final int TRIM_EMPTY_APPS = computeTrimEmptyApps(); // The number of cached at which we don't consider it necessary to do // memory trimming. - static final int TRIM_CACHED_APPS = (MAX_CACHED_APPS-MAX_EMPTY_APPS)/3; + public static int computeTrimCachedApps() { + if (USE_TRIM_SETTINGS && allowTrim()) { + return MAX_CACHED_APPS*TRIM_CACHE_PERCENT/100; + } else { + return (MAX_CACHED_APPS-MAX_EMPTY_APPS)/3; + } + } + static final int TRIM_CACHED_APPS = computeTrimCachedApps(); // Threshold of number of cached+empty where we consider memory critical. static final int TRIM_CRITICAL_THRESHOLD = 3; @@ -319,7 +345,11 @@ final class ProcessList { } public static int computeEmptyProcessLimit(int totalProcessLimit) { - return totalProcessLimit/2; + if(USE_TRIM_SETTINGS && allowTrim()) { + return totalProcessLimit*EMPTY_APP_PERCENT/100; + } else { + return totalProcessLimit/2; + } } private static String buildOomTag(String prefix, String space, int val, int base) { diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 8911a3e949792a9913a9815968ba3ecb48d9dc21..c70bf021bc01a0c4bb9ccf547659c3cebd4a7abf 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -457,6 +457,18 @@ final class ProcessRecord { } public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) { + String seempStr = "app_uid=" + uid + + ",app_pid=" + pid + ",oom_adj=" + curAdj + + ",setAdj=" + setAdj + ",hasShownUi=" + (hasShownUi ? 1 : 0) + + ",cached=" + (cached ? 1 : 0) + + ",fA=" + (foregroundActivities ? 1 : 0) + + ",fS=" + (foregroundServices ? 1 : 0) + + ",systemNoUi=" + (systemNoUi ? 1 : 0) + + ",curSchedGroup=" + curSchedGroup + + ",curProcState=" + curProcState + ",setProcState=" + setProcState + + ",killed=" + (killed ? 1 : 0) + ",killedByAm=" + (killedByAm ? 1 : 0) + + ",debugging=" + (debugging ? 1 : 0); + android.util.SeempLog.record_str(386, seempStr); if (thread == null) { final ProcessState origBase = baseProcessTracker; if (origBase != null) { @@ -483,6 +495,18 @@ final class ProcessRecord { } public void makeInactive(ProcessStatsService tracker) { + String seempStr = "app_uid=" + uid + + ",app_pid=" + pid + ",oom_adj=" + curAdj + + ",setAdj=" + setAdj + ",hasShownUi=" + (hasShownUi ? 1 : 0) + + ",cached=" + (cached ? 1 : 0) + + ",fA=" + (foregroundActivities ? 1 : 0) + + ",fS=" + (foregroundServices ? 1 : 0) + + ",systemNoUi=" + (systemNoUi ? 1 : 0) + + ",curSchedGroup=" + curSchedGroup + + ",curProcState=" + curProcState + ",setProcState=" + setProcState + + ",killed=" + (killed ? 1 : 0) + ",killedByAm=" + (killedByAm ? 1 : 0) + + ",debugging=" + (debugging ? 1 : 0); + android.util.SeempLog.record_str(387, seempStr); thread = null; final ProcessState origBase = baseProcessTracker; if (origBase != null) { diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index cbe57d156711175fadb8e8672490cb03e1f9a554..a81c81b97f8c6eb1abb6c8e384e11691768356f4 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -179,6 +179,27 @@ public class AudioService extends IAudioService.Stub { // the platform type affects volume and silent mode behavior private final int mPlatformType; + private static final ArrayList mMediaPlayers = + new ArrayList(); + + private class MediaPlayerInfo { + private String mPackageName; + private boolean mIsfocussed; + public MediaPlayerInfo(String packageName, boolean isfocussed) { + mPackageName = packageName; + mIsfocussed = isfocussed; + } + public boolean isFocussed() { + return mIsfocussed; + } + public void setFocus(boolean focus) { + mIsfocussed = focus; + } + public String getPackageName() { + return mPackageName; + } + } + private boolean isPlatformVoice() { return mPlatformType == AudioSystem.PLATFORM_VOICE; } @@ -445,6 +466,11 @@ public class AudioService extends IAudioService.Stub { private final ArrayMap mConnectedDevices = new ArrayMap<>(); + private String mA2dpConnectedDevice = ""; //Used for BT a2dp connection + //Add connected A2dp devices in this list + private ArrayList mConnectedBTDevicesList = + new ArrayList(); + // Forced device usage for communications private int mForcedUseForComm; @@ -704,6 +730,7 @@ public class AudioService extends IAudioService.Stub { intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); + intentFilter.addAction(Intent.ACTION_SHUTDOWN); // TODO merge orientation and rotation mMonitorOrientation = SystemProperties.getBoolean("ro.audio.monitorOrientation", false); if (mMonitorOrientation) { @@ -905,6 +932,106 @@ public class AudioService extends IAudioService.Stub { } } + /** + * @hide + */ + public void addMediaPlayerAndUpdateRemoteController (String packageName) { + synchronized(mMediaPlayers) { + Log.v(TAG, "addMediaPlayerAndUpdateRemoteController: size of existing list: " + + mMediaPlayers.size()); + boolean playerToAdd = true; + if (mMediaPlayers.size() > 0) { + final Iterator rccIterator = mMediaPlayers.iterator(); + while (rccIterator.hasNext()) { + final MediaPlayerInfo player = rccIterator.next(); + if (packageName.equals(player.getPackageName())) { + Log.e(TAG, "Player entry present, no need to add"); + playerToAdd = false; + player.setFocus(true); + } else { + Log.e(TAG, "Player: " + player.getPackageName()+ "Lost Focus"); + player.setFocus(false); + } + } + } + if (playerToAdd) { + Log.e(TAG, "Adding Player: " + packageName + " to available player list"); + mMediaPlayers.add(new MediaPlayerInfo(packageName, true)); + } + Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, packageName); + intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, true); + intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); + sendBroadcastToAll(intent); + Log.v(TAG, "updating focussed RCC change to RCD: CallingPackageName:" + + packageName); + } + } + + /** + * @hide + */ + public void updateRemoteControllerOnExistingMediaPlayers() { + synchronized(mMediaPlayers) { + Log.v(TAG, "updateRemoteControllerOnExistingMediaPlayers: size of Player list: " + + mMediaPlayers.size()); + if (mMediaPlayers.size() > 0) { + Log.v(TAG, "Inform RemoteController regarding existing RCC entry"); + final Iterator rccIterator = mMediaPlayers.iterator(); + while (rccIterator.hasNext()) { + final MediaPlayerInfo player = rccIterator.next(); + Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, + player.getPackageName()); + intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, + player.isFocussed()); + intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, true); + sendBroadcastToAll(intent); + Log.v(TAG, "updating RCC change: CallingPackageName:" + + player.getPackageName()); + } + } else { + Log.e(TAG, "No RCC entry present to update"); + } + } + } + + /** + * @hide + */ + public void removeMediaPlayerAndUpdateRemoteController (String packageName) { + synchronized(mMediaPlayers) { + Log.v(TAG, "removeMediaPlayerAndUpdateRemoteController: size of existing list: " + + mMediaPlayers.size()); + boolean playerToRemove = false; + int index = -1; + if (mMediaPlayers.size() > 0) { + final Iterator rccIterator = mMediaPlayers.iterator(); + while (rccIterator.hasNext()) { + index++; + final MediaPlayerInfo player = rccIterator.next(); + if (packageName.equals(player.getPackageName())) { + Log.v(TAG, "Player entry present remove and update RemoteController"); + playerToRemove = true; + break; + } else { + Log.v(TAG, "Player entry for " + player.getPackageName()+ " is not present"); + } + } + } + if (playerToRemove) { + Log.e(TAG, "Removing Player: " + packageName + " from index" + index); + mMediaPlayers.remove(index); + } + Intent intent = new Intent(AudioManager.RCC_CHANGED_ACTION); + intent.putExtra(AudioManager.EXTRA_CALLING_PACKAGE_NAME, packageName); + intent.putExtra(AudioManager.EXTRA_FOCUS_CHANGED_VALUE, false); + intent.putExtra(AudioManager.EXTRA_AVAILABLITY_CHANGED_VALUE, false); + sendBroadcastToAll(intent); + Log.v(TAG, "Updated List size: " + mMediaPlayers.size()); + } + } + private void checkAllAliasStreamVolumes() { synchronized (VolumeStreamState.class) { int numStreamTypes = AudioSystem.getNumStreamTypes(); @@ -3155,6 +3282,18 @@ public class AudioService extends IAudioService.Stub { boolean success = handleDeviceConnection(connected, outDevice, address, btDeviceName) && handleDeviceConnection(connected, inDevice, address, btDeviceName); + + /* When one BT headset is disconnected while there is SCO with another BT + * headset, ignore the BT headset disconncting/disconnected intents. + */ + if ((state == BluetoothProfile.STATE_DISCONNECTED || + state == BluetoothProfile.STATE_DISCONNECTING) && + mBluetoothHeadset != null && + mBluetoothHeadset.getAudioState(btDevice) == BluetoothHeadset.STATE_AUDIO_CONNECTED) { + Log.w(TAG, "SCO is there with another device, returning"); + return; + } + if (success) { synchronized (mScoClients) { if (connected) { @@ -3177,9 +3316,18 @@ public class AudioService extends IAudioService.Stub { synchronized (mConnectedDevices) { synchronized (mA2dpAvrcpLock) { mA2dp = (BluetoothA2dp) proxy; + if (mConnectedBTDevicesList.size() > 0) { + Log.d(TAG,"A2dp connection list not empty, purge it, size " + + mConnectedBTDevicesList.size()); + mConnectedBTDevicesList.clear(); + } + //In Dual A2dp, we can have two devices connected deviceList = mA2dp.getConnectedDevices(); - if (deviceList.size() > 0) { - btDevice = deviceList.get(0); + Log.d(TAG, "onServiceConnected: A2dp Service connected: " + + deviceList.size()); + for (int i = 0; i < deviceList.size(); i++) { + //Add the device in Connected list + btDevice = deviceList.get(i); int state = mA2dp.getConnectionState(btDevice); int delay = checkSendBecomingNoisyIntent( AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, @@ -3302,6 +3450,10 @@ public class AudioService extends IAudioService.Stub { synchronized (mConnectedDevices) { synchronized (mA2dpAvrcpLock) { ArraySet toRemove = null; + Log.d(TAG,"mConnectedBTDevicesList size " + mConnectedBTDevicesList.size()); + if (mConnectedBTDevicesList.size() > 0) { + mConnectedBTDevicesList.clear(); + } // Disconnect ALL DEVICE_OUT_BLUETOOTH_A2DP devices for (int i = 0; i < mConnectedDevices.size(); i++) { DeviceListSpec deviceSpec = mConnectedDevices.valueAt(i); @@ -3859,10 +4011,41 @@ public class AudioService extends IAudioService.Stub { public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile) { - int delay; + int delay = 0; if (profile != BluetoothProfile.A2DP && profile != BluetoothProfile.A2DP_SINK) { throw new IllegalArgumentException("invalid profile " + profile); } + /*check the state of the currnt device*/ + if (state == BluetoothA2dp.STATE_CONNECTING) { + Log.d(TAG, "Device is still connecting "); + return delay; + } + if ((mConnectedBTDevicesList.contains(device) && + (state == BluetoothA2dp.STATE_CONNECTED))) { + Log.d(TAG, "Device conn is updated again, ignore "); + return delay; + } + if (!mConnectedBTDevicesList.contains(device) && + (state == BluetoothA2dp.STATE_CONNECTED)) { + /*add the device in the list*/ + Log.d(TAG, "Add new connected device in the list: " + device); + mConnectedBTDevicesList.add(device); + if (mConnectedBTDevicesList.size() > 1) { + Log.d(TAG, "Second device connected, add new device "); + return delay; + } + } else if ((state == BluetoothA2dp.STATE_DISCONNECTED) || + (state == BluetoothA2dp.STATE_DISCONNECTING)) { + Log.d(TAG, "Device is getting disconnected: " + device); + if (mConnectedBTDevicesList.contains(device)) { + Log.d(TAG, "Remove the BT device "); + mConnectedBTDevicesList.remove(device); + } + if (mConnectedBTDevicesList.size() > 0) { + Log.d(TAG, "Not all are disconnected "); + return delay; + } + } synchronized (mConnectedDevices) { if (profile == BluetoothProfile.A2DP) { delay = checkSendBecomingNoisyIntent(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, @@ -4923,17 +5106,20 @@ public class AudioService extends IAudioService.Stub { DeviceListSpec deviceSpec = mConnectedDevices.get(key); boolean isConnected = deviceSpec != null; - if (isConnected && state != BluetoothProfile.STATE_CONNECTED) { + if ((isConnected && state != BluetoothProfile.STATE_CONNECTED) || + ((mConnectedBTDevicesList.size() == 0) && + (state == BluetoothProfile.STATE_DISCONNECTED))) { if (btDevice.isBluetoothDock()) { if (state == BluetoothProfile.STATE_DISCONNECTED) { // introduction of a delay for transient disconnections of docks when // power is rapidly turned off/on, this message will be canceled if // we reconnect the dock under a preset delay - makeA2dpDeviceUnavailableLater(address, BTA2DP_DOCK_TIMEOUT_MILLIS); + makeA2dpDeviceUnavailableLater(btDevice.getAddress(), BTA2DP_DOCK_TIMEOUT_MILLIS); // the next time isConnected is evaluated, it will be false for the dock } } else { - makeA2dpDeviceUnavailableNow(address); + Log.d(TAG, "All devices are disconneted, update Policymanager "); + makeA2dpDeviceUnavailableNow(btDevice.getAddress()); } synchronized (mCurAudioRoutes) { if (mCurAudioRoutes.bluetoothName != null) { @@ -4943,21 +5129,24 @@ public class AudioService extends IAudioService.Stub { } } } else if (!isConnected && state == BluetoothProfile.STATE_CONNECTED) { + //This function is not implemented + mA2dpConnectedDevice = "BluetoothA2dp"; // Add this String if (btDevice.isBluetoothDock()) { // this could be a reconnection after a transient disconnection cancelA2dpDeviceTimeout(); - mDockAddress = address; + mDockAddress = mA2dpConnectedDevice; } else { // this could be a connection of another A2DP device before the timeout of // a dock: cancel the dock timeout, and make the dock unavailable now if(hasScheduledA2dpDockTimeout()) { cancelA2dpDeviceTimeout(); - makeA2dpDeviceUnavailableNow(mDockAddress); + makeA2dpDeviceUnavailableNow(btDevice.getAddress()); } } - makeA2dpDeviceAvailable(address, btDevice.getName()); + makeA2dpDeviceAvailable(btDevice.getAddress(), btDevice.getName()); + //Updated the Router for a2dp device synchronized (mCurAudioRoutes) { - String name = btDevice.getAliasName(); + String name = mA2dpConnectedDevice; if (!TextUtils.equals(mCurAudioRoutes.bluetoothName, name)) { mCurAudioRoutes.bluetoothName = name; sendMsg(mAudioHandler, MSG_REPORT_NEW_ROUTES, @@ -4974,6 +5163,7 @@ public class AudioService extends IAudioService.Stub { Log.d(TAG, "onSetA2dpSourceConnectionState btDevice="+btDevice+" state="+state); } if (btDevice == null) { + Log.d(TAG, "onSetA2dpSourceConnectionState device is null"); //gasati return; } String address = btDevice.getAddress(); @@ -5057,8 +5247,14 @@ public class AudioService extends IAudioService.Stub { // Called synchronized on mConnectedDevices private int checkSendBecomingNoisyIntent(int device, int state) { int delay = 0; + if (mConnectedBTDevicesList.size() > 1) { + Log.d(TAG, "checkSendBecomingNoisyIntent on state: " + state); + return delay; + } + if ((state == 0) && ((device & mBecomingNoisyIntentDevices) != 0)) { int devices = 0; + Log.d(TAG, "checkSendBecomingNoisyIntent update the noise"); for (int i = 0; i < mConnectedDevices.size(); i++) { int dev = mConnectedDevices.valueAt(i).mDeviceType; if (((dev & AudioSystem.DEVICE_BIT_IN) == 0) @@ -5074,7 +5270,7 @@ public class AudioService extends IAudioService.Stub { 0, null, 0); - delay = 1000; + delay = 700; } } @@ -5308,7 +5504,7 @@ public class AudioService extends IAudioService.Stub { state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_DISCONNECTED); BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - + Log.d(TAG, "Bt device " + btDevice.getAddress() + "disconnection intent received"); setBtScoDeviceConnectionState(btDevice, state); } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) { boolean broadcast = false; @@ -5415,6 +5611,8 @@ public class AudioService extends IAudioService.Stub { state == BluetoothAdapter.STATE_TURNING_OFF) { disconnectAllBluetoothProfiles(); } + } else if (action.equals(Intent.ACTION_SHUTDOWN)) { + AudioSystem.setParameters("dev_shutdown=true"); } } } // end class AudioServiceBroadcastReceiver @@ -5492,7 +5690,6 @@ public class AudioService extends IAudioService.Stub { } } - //========================================================================================== // Audio Focus //========================================================================================== diff --git a/services/core/java/com/android/server/connectivity/Nat464Xlat.java b/services/core/java/com/android/server/connectivity/Nat464Xlat.java index b3908847137a5765255953318b44be849fd4e1e4..0dc9d35f38884f9d3f2a5521aeee81d7744a9bdb 100644 --- a/services/core/java/com/android/server/connectivity/Nat464Xlat.java +++ b/services/core/java/com/android/server/connectivity/Nat464Xlat.java @@ -29,6 +29,7 @@ import android.os.Handler; import android.os.Message; import android.os.INetworkManagementService; import android.os.RemoteException; +import android.os.SystemProperties; import android.util.Slog; import com.android.server.net.BaseNetworkObserver; @@ -96,7 +97,12 @@ public class Nat464Xlat extends BaseNetworkObserver { (nai.linkProperties != null) ? nai.linkProperties.hasIPv4Address() : false; // Only support clat on mobile and wifi for now, because these are the only IPv6-only // networks we can connect to. - return connected && !hasIPv4Address && ArrayUtils.contains(NETWORK_TYPES, netType); + boolean doXlat = SystemProperties.getBoolean("persist.net.doxlat",true); + if(!doXlat) { + Slog.i(TAG, "Android Xlat is disabled"); + } + return connected && !hasIPv4Address && ArrayUtils.contains(NETWORK_TYPES, netType) + && ((netType == ConnectivityManager.TYPE_MOBILE) ? doXlat : true); } /** diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 1012f9aa031f13b2681200915855473bb268689e..94b779d187f49dfa33e27b7015c0eaf4d1edc74f 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -70,6 +70,7 @@ import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.server.IoThread; +import com.android.server.NetPluginDelegate; import com.android.server.net.BaseNetworkObserver; import java.io.FileDescriptor; @@ -220,11 +221,17 @@ public class Tethering extends BaseNetworkObserver { void updateConfiguration() { String[] tetherableUsbRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_usb_regexs); - String[] tetherableWifiRegexs = mContext.getResources().getStringArray( - com.android.internal.R.array.config_tether_wifi_regexs); + String[] tetherableWifiRegexs; String[] tetherableBluetoothRegexs = mContext.getResources().getStringArray( com.android.internal.R.array.config_tether_bluetooth_regexs); + if (SystemProperties.getInt("persist.fst.rate.upgrade.en", 0) == 1) { + tetherableWifiRegexs = new String[] {"bond0"}; + } else { + tetherableWifiRegexs = mContext.getResources().getStringArray( + com.android.internal.R.array.config_tether_wifi_regexs); + } + int ifaceTypes[] = mContext.getResources().getIntArray( com.android.internal.R.array.config_tether_upstream_types); Collection upstreamIfaceTypes = new ArrayList(); @@ -250,6 +257,8 @@ public class Tethering extends BaseNetworkObserver { if (VDBG) Log.d(TAG, "interfaceStatusChanged " + iface + ", " + up); boolean found = false; boolean usb = false; + WifiManager mWifiManager = + (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); synchronized (mPublicSync) { if (isWifi(iface)) { found = true; @@ -273,6 +282,25 @@ public class Tethering extends BaseNetworkObserver { // ignore usb0 down after enabling RNDIS // we will handle disconnect in interfaceRemoved instead if (VDBG) Log.d(TAG, "ignore interface down for " + iface); + } else if (isWifi(iface) && (mWifiManager != null) && + mWifiManager.getWifiStaSapConcurrency()) { + int wifiApState = 0; + wifiApState = mWifiManager.getWifiApState(); + + // Ignore AP interface down after enabling STA connection. + // If STA connects to same band the SAP is enabled, the + // driver stops SAP before it proceeds for STA connection + // hence ignore interface down. After STA connection, + // driver starts SAP on STA channel. + + if ((wifiApState == WifiManager.WIFI_AP_STATE_DISABLING) || + (wifiApState == WifiManager.WIFI_AP_STATE_DISABLED)) { + if (VDBG) Log.d(TAG, "Got interface down for " + iface); + sm.sendMessage(TetherInterfaceSM.CMD_INTERFACE_DOWN); + mIfaces.remove(iface); + } else { + if (VDBG) Log.d(TAG, "ignore interface down for " + iface); + } } else if (sm != null) { sm.sendMessage(TetherInterfaceSM.CMD_INTERFACE_DOWN); mIfaces.remove(iface); @@ -694,6 +722,11 @@ public class Tethering extends BaseNetworkObserver { } else { /* We now have a status bar icon for WifiTethering, so drop the notification */ clearTetheredNotification(); + if (mContext.getResources().getBoolean( + com.android.internal.R.bool + .config_regional_hotspot_show_notification_when_turn_on)) { + showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_wifi); + } } } else if (bluetoothTethered) { showTetheredNotification(com.android.internal.R.drawable.stat_sys_tether_bluetooth); @@ -1724,6 +1757,8 @@ public class Tethering extends BaseNetworkObserver { } if (upType != ConnectivityManager.TYPE_NONE) { + Network network = getConnectivityManager().getNetworkForType(upType); + NetPluginDelegate.setUpstream(network); LinkProperties linkProperties = getConnectivityManager().getLinkProperties(upType); if (linkProperties != null) { @@ -1742,7 +1777,6 @@ public class Tethering extends BaseNetworkObserver { } if (iface != null) { - Network network = getConnectivityManager().getNetworkForType(upType); if (network == null) { Log.e(TAG, "No Network for upstream type " + upType + "!"); } diff --git a/services/core/java/com/android/server/display/ExtendedRemoteDisplayHelper.java b/services/core/java/com/android/server/display/ExtendedRemoteDisplayHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..1be474b09ef2a08a4416add88ecbea0fe550f2a6 --- /dev/null +++ b/services/core/java/com/android/server/display/ExtendedRemoteDisplayHelper.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package com.android.server.display; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import android.media.RemoteDisplay; +import android.os.Handler; +import android.util.Slog; +import android.content.Context; + +class ExtendedRemoteDisplayHelper { + private static final String TAG = "ExtendedRemoteDisplayHelper"; + + // ExtendedRemoteDisplay class + // ExtendedRemoteDisplay is an enhanced RemoteDisplay. It has + // similar interface as RemoteDisplay class + private static Class sExtRemoteDisplayClass; + + // Method object for the API ExtendedRemoteDisplay.Listen + // ExtendedRemoteDisplay.Listen has the same API signature as + // RemoteDisplay.Listen except for an additional argument to pass the + // Context + private static Method sExtRemoteDisplayListen; + + // Method Object for the API ExtendedRemoteDisplay.Dispose + // ExtendedRemoteDisplay.Dispose follows the same API signature as + // RemoteDisplay.Dispose + private static Method sExtRemoteDisplayDispose; + + static { + //Check availability of ExtendedRemoteDisplay runtime + try { + sExtRemoteDisplayClass = Class.forName("com.qualcomm.wfd.ExtendedRemoteDisplay"); + } catch (Throwable t) { + Slog.i(TAG, "ExtendedRemoteDisplay Not available."); + } + + if(sExtRemoteDisplayClass != null) { + // If ExtendedRemoteDisplay is available find the methods + Slog.i(TAG, "ExtendedRemoteDisplay Is available. Find Methods"); + try { + Class args[] = { + String.class, + RemoteDisplay.Listener.class, + Handler.class, Context.class + }; + sExtRemoteDisplayListen = sExtRemoteDisplayClass.getDeclaredMethod("listen", args); + } catch (Throwable t) { + Slog.i(TAG, "ExtendedRemoteDisplay.listen Not available."); + } + + try { + Class args[] = {}; + sExtRemoteDisplayDispose = sExtRemoteDisplayClass.getDeclaredMethod("dispose", args); + } catch (Throwable t) { + Slog.i(TAG, "ExtendedRemoteDisplay.dispose Not available."); + } + } + } + + /** + * Starts listening for displays to be connected on the specified interface. + * + * @param iface The interface address and port in the form "x.x.x.x:y". + * @param listener The listener to invoke + * when displays are connected or disconnected. + * @param handler The handler on which to invoke the listener. + * @param context The current service context + * */ + public static Object listen(String iface, RemoteDisplay.Listener listener, + Handler handler, Context context) + { + Object extRemoteDisplay = null; + Slog.i(TAG, "ExtendedRemoteDisplay.listen"); + + if(sExtRemoteDisplayListen != null && sExtRemoteDisplayDispose != null){ + try { + extRemoteDisplay = sExtRemoteDisplayListen.invoke(null, + iface, listener, handler, context); + } catch (InvocationTargetException e) { + Slog.i(TAG, "ExtendedRemoteDisplay.listen - InvocationTargetException"); + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } else if (cause instanceof Error) { + throw (Error) cause; + } else { + throw new RuntimeException(e); + } + } catch (IllegalAccessException e) { + Slog.i(TAG, "ExtendedRemoteDisplay.listen -IllegalAccessException"); + e.printStackTrace(); + } + } + return extRemoteDisplay; + } + + /** + * Disconnects the remote display and stops listening for new connections. + */ + public static void dispose(Object extRemoteDisplay) { + Slog.i(TAG, "ExtendedRemoteDisplay.dispose"); + try{ + sExtRemoteDisplayDispose.invoke(extRemoteDisplay); + } catch (InvocationTargetException e) { + Slog.i(TAG, "ExtendedRemoteDisplay.dispose - InvocationTargetException"); + Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } else if (cause instanceof Error) { + throw (Error) cause; + } else { + throw new RuntimeException(e); + } + } catch (IllegalAccessException e) { + Slog.i(TAG, "ExtendedRemoteDisplay.dispose-IllegalAccessException"); + e.printStackTrace(); + } + } + + /** + * Checks if ExtendedRemoteDisplay is available + */ + public static boolean isAvailable() + { + if(sExtRemoteDisplayClass != null && + sExtRemoteDisplayDispose != null && + sExtRemoteDisplayListen != null) { + Slog.i(TAG, "ExtendedRemoteDisplay isAvailable() : Available."); + return true; + } + Slog.i(TAG, "ExtendedRemoteDisplay isAvailable() : Not Available."); + return false; + } +} diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index 7b16ea61eb74577452bb9eb3f24a6d6ff6987e98..99b65f77e1fe5d7e543c7c44806eddd8fb08b2c7 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -57,6 +57,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { private static final int[] BUILT_IN_DISPLAY_IDS_TO_SCAN = new int[] { SurfaceControl.BUILT_IN_DISPLAY_ID_MAIN, SurfaceControl.BUILT_IN_DISPLAY_ID_HDMI, + SurfaceControl.BUILT_IN_DISPLAY_ID_TERTIARY, }; private final SparseArray mDevices = @@ -192,6 +193,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { for (int j = 0; j < colorTransforms.size(); j++) { if (colorTransforms.get(j).getColorTransform() == info.colorTransform) { existingMode = true; + if (i == activeDisplayInfo) { + activeColorTransform = colorTransforms.get(j); + } break; } } diff --git a/services/core/java/com/android/server/display/WifiDisplayController.java b/services/core/java/com/android/server/display/WifiDisplayController.java index 8932ca0cf85b21a142bbe06dc642d699a14262a7..26e0ed231586459d99c3a8dee1e4651db1b97f24 100644 --- a/services/core/java/com/android/server/display/WifiDisplayController.java +++ b/services/core/java/com/android/server/display/WifiDisplayController.java @@ -42,11 +42,14 @@ import android.net.wifi.p2p.WifiP2pManager.Channel; import android.net.wifi.p2p.WifiP2pManager.GroupInfoListener; import android.net.wifi.p2p.WifiP2pManager.PeerListListener; import android.os.Handler; +import android.os.SystemProperties; import android.provider.Settings; import android.util.Slog; import android.view.Surface; import java.io.PrintWriter; +import java.lang.StackTraceElement; +import java.lang.Thread; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; @@ -70,8 +73,10 @@ import libcore.util.Objects; */ final class WifiDisplayController implements DumpUtils.Dump { private static final String TAG = "WifiDisplayController"; - private static final boolean DEBUG = false; - + private static final boolean DEBUG = + SystemProperties.getBoolean("persist.debug.wfdcdbg",false); + private static final boolean DEBUGV = + SystemProperties.getBoolean("persist.debug.wfdcdbgv",false); private static final int DEFAULT_CONTROL_PORT = 7236; private static final int MAX_THROUGHPUT = 50; private static final int CONNECTION_TIMEOUT_SECONDS = 30; @@ -137,6 +142,10 @@ final class WifiDisplayController implements DumpUtils.Dump { // Number of connection retries remaining. private int mConnectionRetriesLeft; + // The Extended remote display that is listening on the connection. + // Created after the Wifi P2P network is connected. + private Object mExtRemoteDisplay; + // The remote display that is listening on the connection. // Created after the Wifi P2P network is connected. private RemoteDisplay mRemoteDisplay; @@ -238,6 +247,35 @@ final class WifiDisplayController implements DumpUtils.Dump { } } + private void dump() { + Slog.d(TAG,"mWifiDisplayOnSetting=" + mWifiDisplayOnSetting); + Slog.d(TAG,"mWifiP2pEnabled=" + mWifiP2pEnabled); + Slog.d(TAG,"mWfdEnabled=" + mWfdEnabled); + Slog.d(TAG,"mWfdEnabling=" + mWfdEnabling); + Slog.d(TAG,"mNetworkInfo=" + mNetworkInfo); + Slog.d(TAG,"mScanRequested=" + mScanRequested); + Slog.d(TAG,"mDiscoverPeersInProgress=" + mDiscoverPeersInProgress); + Slog.d(TAG,"mDesiredDevice=" + describeWifiP2pDevice(mDesiredDevice)); + Slog.d(TAG,"mConnectingDisplay=" + describeWifiP2pDevice(mConnectingDevice)); + Slog.d(TAG,"mDisconnectingDisplay=" + describeWifiP2pDevice(mDisconnectingDevice)); + Slog.d(TAG,"mCancelingDisplay=" + describeWifiP2pDevice(mCancelingDevice)); + Slog.d(TAG,"mConnectedDevice=" + describeWifiP2pDevice(mConnectedDevice)); + Slog.d(TAG,"mConnectionRetriesLeft=" + mConnectionRetriesLeft); + Slog.d(TAG,"mRemoteDisplay=" + mRemoteDisplay); + Slog.d(TAG,"mRemoteDisplayInterface=" + mRemoteDisplayInterface); + Slog.d(TAG,"mRemoteDisplayConnected=" + mRemoteDisplayConnected); + Slog.d(TAG,"mAdvertisedDisplay=" + mAdvertisedDisplay); + Slog.d(TAG,"mAdvertisedDisplaySurface=" + mAdvertisedDisplaySurface); + Slog.d(TAG,"mAdvertisedDisplayWidth=" + mAdvertisedDisplayWidth); + Slog.d(TAG,"mAdvertisedDisplayHeight=" + mAdvertisedDisplayHeight); + Slog.d(TAG,"mAdvertisedDisplayFlags=" + mAdvertisedDisplayFlags); + + Slog.d(TAG,"mAvailableWifiDisplayPeers: size=" + mAvailableWifiDisplayPeers.size()); + for (WifiP2pDevice device : mAvailableWifiDisplayPeers) { + Slog.d(TAG," " + describeWifiP2pDevice(device)); + } + } + public void requestStartScan() { if (!mScanRequested) { mScanRequested = true; @@ -359,7 +397,9 @@ final class WifiDisplayController implements DumpUtils.Dump { } private void updateScanState() { - if (mScanRequested && mWfdEnabled && mDesiredDevice == null) { + if (mScanRequested && mWfdEnabled && + (mDesiredDevice == null) && (mConnectedDevice == null) + && (mDisconnectingDevice == null)) { if (!mDiscoverPeersInProgress) { Slog.i(TAG, "Starting Wifi display scan."); mDiscoverPeersInProgress = true; @@ -559,20 +599,35 @@ final class WifiDisplayController implements DumpUtils.Dump { * connection is established (or not). */ private void updateConnection() { + if(DEBUGV) { + //new Throwable("WFD_DBG").printStackTrace(); + StackTraceElement[] st = Thread.currentThread().getStackTrace(); + for(int i = 2 ; i < st.length && i < 5; i++) { + Slog.i(TAG,st[i].toString()); + } + dump(); + } // Step 0. Stop scans if necessary to prevent interference while connected. // Resume scans later when no longer attempting to connect. updateScanState(); // Step 1. Before we try to connect to a new device, tell the system we // have disconnected from the old one. - if (mRemoteDisplay != null && mConnectedDevice != mDesiredDevice) { - Slog.i(TAG, "Stopped listening for RTSP connection on " + mRemoteDisplayInterface - + " from Wifi display: " + mConnectedDevice.deviceName); + if ((mRemoteDisplay != null || mExtRemoteDisplay != null) && + (mConnectedDevice != mDesiredDevice)|| + (mRemoteDisplayInterface != null && mConnectedDevice == null)) { + Slog.i(TAG, "Stopped listening for RTSP connection on " + + mRemoteDisplayInterface); + + if(mRemoteDisplay != null) { + mRemoteDisplay.dispose(); + } else if(mExtRemoteDisplay != null) { + ExtendedRemoteDisplayHelper.dispose(mExtRemoteDisplay); + } - mRemoteDisplay.dispose(); + mExtRemoteDisplay = null; mRemoteDisplay = null; mRemoteDisplayInterface = null; - mRemoteDisplayConnected = false; mHandler.removeCallbacks(mRtspTimeout); mWifiP2pManager.setMiracastMode(WifiP2pManager.MIRACAST_DISABLED); @@ -582,7 +637,7 @@ final class WifiDisplayController implements DumpUtils.Dump { } // Step 2. Before we try to connect to a new device, disconnect from the old one. - if (mDisconnectingDevice != null) { + if (mRemoteDisplayConnected || mDisconnectingDevice != null) { return; // wait for asynchronous callback } if (mConnectedDevice != null && mConnectedDevice != mDesiredDevice) { @@ -666,6 +721,51 @@ final class WifiDisplayController implements DumpUtils.Dump { return; // done } + //Before we connect, we need to set the oldDevice to the desiredDevice to check + //the device on receiving callbacks from the Remote display modules + final WifiP2pDevice oldDevice = mDesiredDevice; + RemoteDisplay.Listener listener = new RemoteDisplay.Listener() { + @Override + public void onDisplayConnected(Surface surface, + int width, int height, int flags, int session) { + if (mConnectedDevice == oldDevice && !mRemoteDisplayConnected) { + Slog.i(TAG, "Opened RTSP connection with Wifi display: " + + mConnectedDevice.deviceName); + mRemoteDisplayConnected = true; + mHandler.removeCallbacks(mRtspTimeout); + + if (mWifiDisplayCertMode) { + mListener.onDisplaySessionInfo( + getSessionInfo(mConnectedDeviceGroupInfo, session)); + } + + final WifiDisplay display = createWifiDisplay(mConnectedDevice); + advertiseDisplay(display, surface, width, height, flags); + } + } + + @Override + public void onDisplayDisconnected() { + if (mConnectedDevice == oldDevice) { + Slog.i(TAG, "Closed RTSP connection with Wifi display: " + + mConnectedDevice.deviceName); + mHandler.removeCallbacks(mRtspTimeout); + mRemoteDisplayConnected = false; + disconnect(); + } + } + + @Override + public void onDisplayError(int error) { + if (mConnectedDevice == oldDevice) { + Slog.i(TAG, "Lost RTSP connection with Wifi display due to error " + + error + ": " + mConnectedDevice.deviceName); + mHandler.removeCallbacks(mRtspTimeout); + handleConnectionFailure(false); + } + } + }; + // Step 5. Try to connect. if (mConnectedDevice == null && mConnectingDevice == null) { Slog.i(TAG, "Connecting to Wifi display: " + mDesiredDevice.deviceName); @@ -691,6 +791,19 @@ final class WifiDisplayController implements DumpUtils.Dump { WifiDisplay display = createWifiDisplay(mConnectingDevice); advertiseDisplay(display, null, 0, 0, 0); + if(ExtendedRemoteDisplayHelper.isAvailable()&& + mExtRemoteDisplay == null){ + final int port = getPortNumber(mDesiredDevice); + //IP is superfluous for WFD source, and we don't have one at this stage anyway since + //P2P connection hasn't been established yet + final String iface = "255.255.255.255:" + port; + mRemoteDisplayInterface = iface; + Slog.i(TAG, "Listening for RTSP connection on " + iface + + " from Wifi display: " + mDesiredDevice.deviceName); + mExtRemoteDisplay = ExtendedRemoteDisplayHelper.listen(iface, + listener, mHandler, mContext); + } + final WifiP2pDevice newDevice = mDesiredDevice; mWifiP2pManager.connect(mWifiP2pChannel, config, new ActionListener() { @Override @@ -728,54 +841,16 @@ final class WifiDisplayController implements DumpUtils.Dump { mWifiP2pManager.setMiracastMode(WifiP2pManager.MIRACAST_SOURCE); - final WifiP2pDevice oldDevice = mConnectedDevice; final int port = getPortNumber(mConnectedDevice); final String iface = addr.getHostAddress() + ":" + port; mRemoteDisplayInterface = iface; - Slog.i(TAG, "Listening for RTSP connection on " + iface - + " from Wifi display: " + mConnectedDevice.deviceName); - - mRemoteDisplay = RemoteDisplay.listen(iface, new RemoteDisplay.Listener() { - @Override - public void onDisplayConnected(Surface surface, - int width, int height, int flags, int session) { - if (mConnectedDevice == oldDevice && !mRemoteDisplayConnected) { - Slog.i(TAG, "Opened RTSP connection with Wifi display: " - + mConnectedDevice.deviceName); - mRemoteDisplayConnected = true; - mHandler.removeCallbacks(mRtspTimeout); - - if (mWifiDisplayCertMode) { - mListener.onDisplaySessionInfo( - getSessionInfo(mConnectedDeviceGroupInfo, session)); - } - - final WifiDisplay display = createWifiDisplay(mConnectedDevice); - advertiseDisplay(display, surface, width, height, flags); - } - } - - @Override - public void onDisplayDisconnected() { - if (mConnectedDevice == oldDevice) { - Slog.i(TAG, "Closed RTSP connection with Wifi display: " - + mConnectedDevice.deviceName); - mHandler.removeCallbacks(mRtspTimeout); - disconnect(); - } - } - - @Override - public void onDisplayError(int error) { - if (mConnectedDevice == oldDevice) { - Slog.i(TAG, "Lost RTSP connection with Wifi display due to error " - + error + ": " + mConnectedDevice.deviceName); - mHandler.removeCallbacks(mRtspTimeout); - handleConnectionFailure(false); - } - } - }, mHandler, mContext.getOpPackageName()); + if(!ExtendedRemoteDisplayHelper.isAvailable()){ + Slog.i(TAG, "Listening for RTSP connection on " + iface + + " from Wifi display: " + mConnectedDevice.deviceName); + mRemoteDisplay = RemoteDisplay.listen(iface, listener, + mHandler, mContext.getOpPackageName()); + } // Use extended timeout value for certification, as some tests require user inputs int rtspTimeout = mWifiDisplayCertMode ? @@ -786,7 +861,7 @@ final class WifiDisplayController implements DumpUtils.Dump { } private WifiDisplaySessionInfo getSessionInfo(WifiP2pGroup info, int session) { - if (info == null) { + if (info == null || info.getOwner() == null) { return null; } Inet4Address addr = getInterfaceAddress(info); @@ -820,6 +895,10 @@ final class WifiDisplayController implements DumpUtils.Dump { mWifiP2pManager.requestGroupInfo(mWifiP2pChannel, new GroupInfoListener() { @Override public void onGroupInfoAvailable(WifiP2pGroup info) { + if(info == null) { + return; + } + if (DEBUG) { Slog.d(TAG, "Received group info: " + describeWifiP2pGroup(info)); } @@ -839,8 +918,9 @@ final class WifiDisplayController implements DumpUtils.Dump { } if (mWifiDisplayCertMode) { - boolean owner = info.getOwner().deviceAddress - .equals(mThisDevice.deviceAddress); + boolean owner = (info.getOwner() != null)? + info.getOwner().deviceAddress + .equals(mThisDevice.deviceAddress):false; if (owner && info.getClientList().isEmpty()) { // this is the case when we started Autonomous GO, // and no client has connected, save group info @@ -910,7 +990,8 @@ final class WifiDisplayController implements DumpUtils.Dump { @Override public void run() { if (mConnectedDevice != null - && mRemoteDisplay != null && !mRemoteDisplayConnected) { + && (mRemoteDisplay != null || mExtRemoteDisplay != null) + && !mRemoteDisplayConnected) { Slog.i(TAG, "Timed out waiting for Wifi display RTSP connection after " + RTSP_TIMEOUT_SECONDS + " seconds: " + mConnectedDevice.deviceName); diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 29c54e9bf78ce54de9059c401cc2e2d915ab5824..11d2cfdbf3aba2dd09389ad3417bb2787ae60a9e 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -108,6 +108,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private CharSequence mQueueTitle; private int mRatingType; private long mLastActiveTime; + private String mBrowsedPlayerURI; + private boolean mPlayItemStatus; + private long[] mNowPlayingList; // End TransportPerformer fields // Volume handling fields @@ -525,6 +528,86 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } + private void pushBrowsePlayerInfo() { + synchronized (mLock) { + if (mDestroyed) { + return; + } + for (int i = mControllerCallbacks.size() - 1; i >= 0; i--) { + ISessionControllerCallback cb = mControllerCallbacks.get(i); + try { + Log.d(TAG, "pushBrowsePlayerInfo"); + cb.onUpdateFolderInfoBrowsedPlayer(mBrowsedPlayerURI); + } catch (DeadObjectException e) { + Log.w(TAG, "Removing dead callback in pushBrowsePlayerInfo. ", e); + mControllerCallbacks.remove(i); + } catch (RemoteException e) { + Log.w(TAG, "unexpected exception in pushBrowsePlayerInfo. ", e); + } + } + } + } + + private void pushNowPlayingEntries() { + synchronized (mLock) { + if (mDestroyed) { + return; + } + for (int i = mControllerCallbacks.size() - 1; i >= 0; i--) { + ISessionControllerCallback cb = mControllerCallbacks.get(i); + try { + Log.d(TAG, "pushNowPlayingEntries"); + cb.onUpdateNowPlayingEntries(mNowPlayingList); + } catch (DeadObjectException e) { + Log.w(TAG, "Removing dead callback in pushNowPlayingEntries. ", e); + mControllerCallbacks.remove(i); + } catch (RemoteException e) { + Log.w(TAG, "unexpected exception in pushNowPlayingEntries. ", e); + } + } + } + } + + private void pushNowPlayingContentChange() { + synchronized (mLock) { + if (mDestroyed) { + return; + } + for (int i = mControllerCallbacks.size() - 1; i >= 0; i--) { + ISessionControllerCallback cb = mControllerCallbacks.get(i); + try { + Log.d(TAG, "pushNowPlayingContentChange"); + cb.onUpdateNowPlayingContentChange(); + } catch (DeadObjectException e) { + Log.w(TAG, "Removing dead callback in pushNowPlayingContentChange. ", e); + mControllerCallbacks.remove(i); + } catch (RemoteException e) { + Log.w(TAG, "unexpected exception in pushNowPlayingContentChange. ", e); + } + } + } + } + + private void pushPlayItemResponse() { + synchronized (mLock) { + if (mDestroyed) { + return; + } + for (int i = mControllerCallbacks.size() - 1; i >= 0; i--) { + ISessionControllerCallback cb = mControllerCallbacks.get(i); + try { + Log.d(TAG, "pushPlayItemResponse"); + cb.onPlayItemResponse(mPlayItemStatus); + } catch (DeadObjectException e) { + Log.w(TAG, "Removing dead callback in pushPlayItemResponse. ", e); + mControllerCallbacks.remove(i); + } catch (RemoteException e) { + Log.w(TAG, "unexpected exception in pushPlayItemResponse. ", e); + } + } + } + } + private void pushQueueUpdate() { synchronized (mLock) { if (mDestroyed) { @@ -808,6 +891,33 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { mHandler.post(MessageHandler.MSG_UPDATE_QUEUE); } + @Override + public void updateFolderInfoBrowsedPlayer(String stringUri) { + Log.d(TAG, "SessionStub: updateFolderInfoBrowsedPlayer"); + mBrowsedPlayerURI = stringUri; + mHandler.post(MessageHandler.MSG_FOLDER_INFO_BROWSED_PLAYER); + } + + @Override + public void updateNowPlayingEntries(long[] playList) { + Log.d(TAG, "SessionStub: updateNowPlayingEntries"); + mNowPlayingList = playList; + mHandler.post(MessageHandler.MSG_UPDATE_NOWPLAYING_ENTRIES); + } + + @Override + public void updateNowPlayingContentChange() { + Log.d(TAG, "SessionStub: updateNowPlayingContentChange"); + mHandler.post(MessageHandler.MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE); + } + + @Override + public void playItemResponse(boolean success) { + Log.d(TAG, "SessionStub: playItemResponse"); + mPlayItemStatus = success; + mHandler.post(MessageHandler.MSG_PLAY_ITEM_RESPONSE); + } + @Override public void setQueueTitle(CharSequence title) { mQueueTitle = title; @@ -1028,6 +1138,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } public void seekTo(long pos) { + Slog.d(TAG, "seekTo in SessionCb"); try { mCb.onSeekTo(pos); } catch (RemoteException e) { @@ -1035,6 +1146,42 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } } + /** + * @hide + */ + public void setRemoteControlClientBrowsedPlayer() { + Slog.d(TAG, "setRemoteControlClientBrowsedPlayer in SessionCb"); + try { + mCb.setRemoteControlClientBrowsedPlayer(); + } catch (RemoteException e) { + Slog.e(TAG, "Remote failure in setRemoteControlClientBrowsedPlayer.", e); + } + } + + /** + * @hide + */ + public void setRemoteControlClientPlayItem(long uid, int scope) throws RemoteException { + Slog.d(TAG, "setRemoteControlClientPlayItem in SessionCb"); + try { + mCb.setRemoteControlClientPlayItem(uid, scope); + } catch (RemoteException e) { + Slog.e(TAG, "Remote failure in setRemoteControlClientPlayItem.", e); + } + } + + /** + * @hide + */ + public void getRemoteControlClientNowPlayingEntries() throws RemoteException { + Slog.d(TAG, "getRemoteControlClientNowPlayingEntries in SessionCb"); + try { + mCb.getRemoteControlClientNowPlayingEntries(); + } catch (RemoteException e) { + Slog.e(TAG, "Remote failure in getRemoteControlClientNowPlayingEntries.", e); + } + } + public void rate(Rating rating) { try { mCb.onRate(rating); @@ -1267,10 +1414,32 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { @Override public void seekTo(long pos) throws RemoteException { + Log.d(TAG, "seekTo in ControllerStub"); updateCallingPackage(); mSessionCb.seekTo(pos); } + @Override + public void setRemoteControlClientBrowsedPlayer() throws RemoteException { + Log.d(TAG, "setRemoteControlClientBrowsedPlayer in ControllerStub"); + updateCallingPackage(); + mSessionCb.setRemoteControlClientBrowsedPlayer(); + } + + @Override + public void setRemoteControlClientPlayItem(long uid, int scope) throws RemoteException { + Log.d(TAG, "setRemoteControlClientPlayItem in ControllerStub"); + updateCallingPackage(); + mSessionCb.setRemoteControlClientPlayItem(uid, scope); + } + + @Override + public void getRemoteControlClientNowPlayingEntries() throws RemoteException { + Log.d(TAG, "getRemoteControlClientNowPlayingEntries in ControllerStub"); + updateCallingPackage(); + mSessionCb.getRemoteControlClientNowPlayingEntries(); + } + @Override public void rate(Rating rating) throws RemoteException { updateCallingPackage(); @@ -1337,6 +1506,10 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { private static final int MSG_UPDATE_SESSION_STATE = 7; private static final int MSG_UPDATE_VOLUME = 8; private static final int MSG_DESTROYED = 9; + private static final int MSG_FOLDER_INFO_BROWSED_PLAYER = 10; + private static final int MSG_UPDATE_NOWPLAYING_ENTRIES = 11; + private static final int MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE = 12; + private static final int MSG_PLAY_ITEM_RESPONSE = 13; public MessageHandler(Looper looper) { super(looper); @@ -1370,6 +1543,18 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { break; case MSG_DESTROYED: pushSessionDestroyed(); + case MSG_FOLDER_INFO_BROWSED_PLAYER: + pushBrowsePlayerInfo(); + break; + case MSG_UPDATE_NOWPLAYING_ENTRIES: + pushNowPlayingEntries(); + break; + case MSG_UPDATE_NOWPLAYING_CONTENT_CHANGE: + pushNowPlayingContentChange(); + break; + case MSG_PLAY_ITEM_RESPONSE: + pushPlayItemResponse(); + break; } } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 228c015b30e875499262ca29ad86400015642e4f..e24a33a8142c609d6a3700b39c08b74987b85932 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -116,6 +116,7 @@ import android.net.INetworkPolicyListener; import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.LinkProperties; +import android.net.NetworkCapabilities; import android.net.NetworkIdentity; import android.net.NetworkInfo; import android.net.NetworkPolicy; @@ -171,6 +172,7 @@ import com.android.server.DeviceIdleController; import com.android.server.EventLogTags; import com.android.server.LocalServices; import com.android.server.SystemConfig; +import com.android.server.NetPluginDelegate; import libcore.io.IoUtils; @@ -1214,7 +1216,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final ArrayList> connIdents = new ArrayList<>(states.length); final ArraySet connIfaces = new ArraySet(states.length); for (NetworkState state : states) { - if (state.networkInfo != null && state.networkInfo.isConnected()) { + if (state.networkInfo != null && state.networkInfo.isConnected() + && (state.networkCapabilities == null + || !state.networkCapabilities.hasTransport( + NetworkCapabilities.TRANSPORT_CELLULAR) + || state.networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_INTERNET))) { final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state); final String baseIface = state.linkProperties.getInterfaceName(); @@ -3270,6 +3277,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private void setInterfaceQuota(String iface, long quotaBytes) { try { mNetworkManager.setInterfaceQuota(iface, quotaBytes); + NetPluginDelegate.setQuota(iface, quotaBytes); } catch (IllegalStateException e) { Log.wtf(TAG, "problem setting interface quota", e); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 23c111e56cde9e926082d639bbb4633e56600bc8..6f4ce158cb9ab9cd6b06d6bc606c733459b48e42 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -79,6 +79,7 @@ import android.net.INetworkManagementEventObserver; import android.net.INetworkStatsService; import android.net.INetworkStatsSession; import android.net.LinkProperties; +import android.net.NetworkCapabilities; import android.net.NetworkIdentity; import android.net.NetworkInfo; import android.net.NetworkState; @@ -120,6 +121,7 @@ import com.android.internal.util.ArrayUtils; import com.android.internal.util.FileRotator; import com.android.internal.util.IndentingPrintWriter; import com.android.server.EventLogTags; +import com.android.server.NetPluginDelegate; import com.android.server.connectivity.Tethering; import java.io.File; @@ -957,7 +959,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final ArraySet mobileIfaces = new ArraySet<>(); for (NetworkState state : states) { - if (state.networkInfo.isConnected()) { + if (state.networkInfo.isConnected() && (state.networkCapabilities == null + || !state.networkCapabilities.hasTransport( + NetworkCapabilities.TRANSPORT_CELLULAR) + || state.networkCapabilities.hasCapability( + NetworkCapabilities.NET_CAPABILITY_INTERNET))) { final boolean isMobile = isNetworkTypeMobile(state.networkInfo.getType()); final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state); @@ -1009,6 +1015,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final NetworkStats xtSnapshot = mNetworkManager.getNetworkStatsSummaryXt(); final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev(); + NetPluginDelegate.getTetherStats(uidSnapshot, xtSnapshot, devSnapshot); // For xt/dev, we pass a null VPN array because usage is aggregated by UID, so VPN traffic // can't be reattributed to responsible apps. diff --git a/services/core/java/com/android/server/os/RegionalizationService.java b/services/core/java/com/android/server/os/RegionalizationService.java new file mode 100644 index 0000000000000000000000000000000000000000..bced2eaa3cd33677a7d5d0704bf8099424a2405e --- /dev/null +++ b/services/core/java/com/android/server/os/RegionalizationService.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server.os; + +import android.text.TextUtils; +import android.util.Log; + +import com.android.internal.os.IRegionalizationService; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; + +/** + * The implementation of the regionalization service interface. + * + * @hide + */ +public class RegionalizationService extends IRegionalizationService.Stub { + + private static final String TAG = "RegionalizationService"; + + public RegionalizationService() { + } + + @Override + public boolean checkFileExists(String filepath) { + File file = new File(filepath); + if (file == null || !file.exists()) + return false; + + return true; + } + + @Override + public ArrayList readFile(String filepath, String regularExpression) { + File file = new File(filepath); + if (file == null || !file.exists() || !file.canRead()) return null; + + + ArrayList contents = new ArrayList(); + + FileReader fr = null; + BufferedReader br = null; + try { + fr = new FileReader(file); + br = new BufferedReader(fr); + String line = null; + while ((line = br.readLine()) != null && (line = line.trim()) != null) { + if (!TextUtils.isEmpty(regularExpression)) { + if (line.matches(regularExpression)) { + contents.add(line); + } + } else { + contents.add(line); + } + } + } catch (IOException e) { + Log.e(TAG, "Read File error, caused by: " + e.getMessage()); + } finally { + try { + if (br != null) br.close(); + if (fr != null) fr.close(); + } catch (IOException e) { + Log.e(TAG, "Close the reader error, caused by: " + e.getMessage()); + } + } + + return contents; + } + + @Override + public boolean writeFile(String filepath, String content, boolean append) { + File file = new File(filepath); + if (file == null || !file.exists() || !file.canWrite()) return false; + + if (TextUtils.isEmpty(content)) return false; + + // Write the file with the content. + FileWriter fw = null; + try { + fw = new FileWriter(file, append); + fw.write(content); + } catch (IOException e) { + e.printStackTrace(); + return false; + } finally { + if (fw != null) try { + fw.close(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + return true; + } + + @Override + public void deleteFilesUnderDir(String dirPath, String ext, boolean delDir) { + File file = new File(dirPath); + if (file == null || !file.exists()) return; + + deleteFiles(file, ext, delDir); + } + + // Delete all files under this folder and its subfolders + private void deleteFiles(File dir, String ext, boolean delDir) { + if (dir.isDirectory()) { + String[] children = dir.list(); + if (children == null) return; + + for (int i = 0; i < children.length; i++) { + deleteFiles(new File(dir, children[i]), ext, delDir); + } + if (delDir) { + dir.delete(); + } + } else { + if (dir.isFile() && (ext.isEmpty() || dir.getName().endsWith(ext))) { + dir.delete(); + } + } + } +} diff --git a/services/core/java/com/android/server/pm/MultiTaskDealer.java b/services/core/java/com/android/server/pm/MultiTaskDealer.java new file mode 100644 index 0000000000000000000000000000000000000000..9b8d46ecc556dbf449f1a47a655b6f9625af1aee --- /dev/null +++ b/services/core/java/com/android/server/pm/MultiTaskDealer.java @@ -0,0 +1,141 @@ +/* +* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +package com.android.server.pm; + +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; + +import android.util.Log; + +public class MultiTaskDealer { + + public static final String TAG = "MultiTaskDealer"; + public static final String PACKAGEMANAGER_SCANER = "packagescan"; + private static final boolean DEBUG_TASK = false; + + private static HashMap> map = new HashMap>(); + + public static MultiTaskDealer getDealer(String name) { + WeakReference ref = map.get(name); + MultiTaskDealer dealer = ref!=null?ref.get():null; + return dealer; + } + + public static MultiTaskDealer startDealer(String name,int taskCount) { + MultiTaskDealer dealer = getDealer(name); + if(dealer==null) { + dealer = new MultiTaskDealer(name,taskCount); + WeakReference ref = new WeakReference(dealer); + map.put(name,ref); + } + return dealer; + } + + public void startLock() { + mLock.lock(); + } + + public void endLock() { + mLock.unlock(); + } + + private ThreadPoolExecutor mExecutor; + private int mTaskCount = 0; + private boolean mNeedNotifyEnd = false; + private Object mObjWaitAll = new Object(); + private ReentrantLock mLock = new ReentrantLock(); + + public MultiTaskDealer(String name,int taskCount) { + final String taskName = name; + ThreadFactory factory = new ThreadFactory() + { + private final AtomicInteger mCount = new AtomicInteger(1); + + public Thread newThread(final Runnable r) { + if (DEBUG_TASK) Log.d(TAG, "create a new thread:" + taskName); + return new Thread(r, taskName + "-" + mCount.getAndIncrement()); + } + }; + mExecutor = new ThreadPoolExecutor(taskCount, taskCount, 5, TimeUnit.SECONDS, + new LinkedBlockingQueue(), factory){ + protected void afterExecute(Runnable r, Throwable t) { + if(t!=null) { + t.printStackTrace(); + } + MultiTaskDealer.this.TaskCompleteNotify(r); + if (DEBUG_TASK) Log.d(TAG, "end task"); + super.afterExecute(r,t); + } + protected void beforeExecute(Thread t, Runnable r) { + if (DEBUG_TASK) Log.d(TAG, "start task"); + super.beforeExecute(t,r); + } + }; + } + + public void addTask(Runnable task) { + synchronized (mObjWaitAll) { + mTaskCount+=1; + } + mExecutor.execute(task); + if (DEBUG_TASK) Log.d(TAG, "addTask"); + } + + private void TaskCompleteNotify(Runnable task) { + synchronized (mObjWaitAll) { + mTaskCount-=1; + if(mTaskCount<=0 && mNeedNotifyEnd) { + if (DEBUG_TASK) Log.d(TAG, "complete notify"); + mObjWaitAll.notify(); + } + } + } + + public void waitAll() { + if (DEBUG_TASK) Log.d(TAG, "start wait all"); + synchronized (mObjWaitAll) { + if(mTaskCount>0) { + mNeedNotifyEnd = true; + try { + mObjWaitAll.wait(); + } catch (Exception e) { + } + mNeedNotifyEnd = false; + } + if (DEBUG_TASK) Log.d(TAG, "wait finish"); + return; + } + } +} diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java old mode 100644 new mode 100755 index 6ea7629c60d22f4a496083990b611b585a95fb02..7ef8910baec83af220082d0f9214045f72812643 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1,4 +1,7 @@ /* + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Not a Contribution. + * * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -105,6 +108,7 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerNative; +import android.app.AlarmManager; import android.app.IActivityManager; import android.app.ResourcesManager; import android.app.admin.IDevicePolicyManager; @@ -230,6 +234,7 @@ import com.android.internal.content.PackageHelper; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.IParcelFileDescriptorFactory; import com.android.internal.os.InstallerConnection.InstallerException; +import com.android.internal.os.RegionalizationEnvironment; import com.android.internal.os.SomeArgs; import com.android.internal.os.Zygote; import com.android.internal.telephony.CarrierAppUtils; @@ -304,6 +309,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; +import android.os.SystemProperties; /** * Keep track of all those APKs everywhere. @@ -527,6 +533,7 @@ public class PackageManagerService extends IPackageManager.Stub { final Context mContext; final boolean mFactoryTest; final boolean mOnlyCore; + private boolean mOnlyPowerOffAlarm = false; final DisplayMetrics mMetrics; final int mDefParseFlags; final String[] mSeparateProcesses; @@ -555,6 +562,9 @@ public class PackageManagerService extends IPackageManager.Stub { // apps. final File mDrmAppPrivateInstallDir; + // Directory containing the regionalization 3rd apps. + final File mRegionalizationAppInstallDir; + // ---------------------------------------------------------------- // Lock for state used when installing and doing other long running @@ -1958,6 +1968,14 @@ public class PackageManagerService extends IPackageManager.Stub { res.removedInfo.args.doPostDeleteLI(true); } } + //Show permission control menu after installation + if(isStrictOpEnable()){ + Intent intent = new Intent(Intent.ACTION_MANAGE_APP_PERMISSIONS); + intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); + intent.putExtra("hideInfoButton", true);// used by the start activity + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //outside of Activity context need :FLAG_ACTIVITY_NEW_TASK . + mContext.startActivity(intent); + } } // If someone is watching installs - notify them @@ -1972,6 +1990,10 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private boolean isStrictOpEnable() { + return SystemProperties.getBoolean("persist.sys.strict_op_enable", false); + } + private void grantRuntimePermissionsGrantedToDisabledPrivSysPackageParentLPw( PackageParser.Package pkg) { if (pkg.parentPackage == null) { @@ -2244,6 +2266,28 @@ public class PackageManagerService extends IPackageManager.Stub { mSettings.addSharedUserLPw("android.uid.shell", SHELL_UID, ApplicationInfo.FLAG_SYSTEM, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED); + File setFile = new File(AlarmManager.POWER_OFF_ALARM_SET_FILE); + File handleFile = new File(AlarmManager.POWER_OFF_ALARM_HANDLE_FILE); + boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false); + if (isAlarmBoot) { + mOnlyPowerOffAlarm = true; + } else if (setFile.exists() && handleFile.exists()) { + // if it is normal boot, check if power off alarm is handled. And set + // alarm properties for others to check. + if (!mOnlyCore && AlarmManager + .readPowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_HANDLE_FILE) + .equals(AlarmManager.POWER_OFF_ALARM_HANDLED)) { + SystemProperties.set("ro.alarm_handled", "true"); + File instanceFile = new File(AlarmManager.POWER_OFF_ALARM_INSTANCE_FILE); + String instanceValue = AlarmManager + .readPowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_INSTANCE_FILE); + SystemProperties.set("ro.alarm_instance", instanceValue); + + AlarmManager.writePowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_HANDLE_FILE, + AlarmManager.POWER_OFF_ALARM_NOT_HANDLED); + } + } + String separateProcesses = SystemProperties.get("debug.separate_processes"); if (separateProcesses != null && separateProcesses.length() > 0) { if ("*".equals(separateProcesses)) { @@ -2277,9 +2321,9 @@ public class PackageManagerService extends IPackageManager.Stub { mAvailableFeatures = systemConfig.getAvailableFeatures(); mSignatureAllowances = systemConfig.getSignatureAllowances(); - synchronized (mInstallLock) { +// synchronized (mInstallLock) { // writer - synchronized (mPackages) { +// synchronized (mPackages) { mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/); mHandlerThread.start(); @@ -2293,6 +2337,7 @@ public class PackageManagerService extends IPackageManager.Stub { mEphemeralInstallDir = new File(dataDir, "app-ephemeral"); mAsecInternalPath = new File(dataDir, "app-asec").getPath(); mDrmAppPrivateInstallDir = new File(dataDir, "app-private"); + mRegionalizationAppInstallDir = new File(dataDir, "app-regional"); sUserManager = new UserManagerService(context, this, mPackages); @@ -2466,6 +2511,28 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, scanFlags, 0); + // Collect all Regionalization packages form Carrier's res packages. + if (RegionalizationEnvironment.isSupported()) { + Log.d(TAG, "Load Regionalization vendor apks"); + final List RegionalizationDirs = + RegionalizationEnvironment.getAllPackageDirectories(); + for (File f : RegionalizationDirs) { + File RegionalizationSystemDir = new File(f, "system"); + // Collect packages in /system/priv-app + scanDirLI(new File(RegionalizationSystemDir, "priv-app"), + PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR + | PackageParser.PARSE_IS_PRIVILEGED, scanFlags, 0); + // Collect packages in /system/app + scanDirLI(new File(RegionalizationSystemDir, "app"), + PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags, 0); + // Collect overlay in /system/vendor + scanDirLI(new File(RegionalizationSystemDir, "vendor/overlay"), + PackageParser.PARSE_IS_SYSTEM | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags | SCAN_TRUSTED_OVERLAY, 0); + } + } + // Prune any system packages that no longer exist. final List possiblyDeletedUpdatedSystemApps = new ArrayList(); if (!mOnlyCore) { @@ -2552,6 +2619,17 @@ public class PackageManagerService extends IPackageManager.Stub { | PackageParser.PARSE_IS_EPHEMERAL, scanFlags | SCAN_REQUIRE_KNOWN, 0); + // Collect all Regionalization 3rd packages. + if (RegionalizationEnvironment.isSupported()) { + Log.d(TAG, "Load Regionalization 3rd apks from res packages."); + final List packages = RegionalizationEnvironment.getAllPackageNames(); + for (String pack : packages) { + File appFolder = new File(mRegionalizationAppInstallDir, pack); + Log.d(TAG, "Load Regionalization 3rd apks of path " + appFolder.getPath()); + scanDirLI(appFolder, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0); + } + } + /** * Remove disable package settings for any updated system * apps that were removed via an OTA. If they're not a @@ -2835,8 +2913,8 @@ public class PackageManagerService extends IPackageManager.Stub { } mEphemeralApplicationRegistry = new EphemeralApplicationRegistry(this); - } // synchronized (mPackages) - } // synchronized (mInstallLock) + //} // synchronized (mPackages) + //} // synchronized (mInstallLock) // Now after opening every single application zip, make sure they // are all flushed. Not really needed, but keeps things nice and @@ -6714,6 +6792,13 @@ public class PackageManagerService extends IPackageManager.Stub { + " flags=0x" + Integer.toHexString(parseFlags)); } + Log.d(TAG, "start scanDirLI:"+dir); + // use multi thread to speed up scanning + int iMultitaskNum = SystemProperties.getInt("persist.pm.multitask", 6); + Log.d(TAG, "max thread:" + iMultitaskNum); + final MultiTaskDealer dealer = (iMultitaskNum > 1) ? MultiTaskDealer.startDealer( + MultiTaskDealer.PACKAGEMANAGER_SCANER, iMultitaskNum) : null; + for (File file : files) { final boolean isPackage = (isApkFile(file) || file.isDirectory()) && !PackageInstallerService.isStageName(file.getName()); @@ -6721,20 +6806,44 @@ public class PackageManagerService extends IPackageManager.Stub { // Ignore entries which are not packages continue; } - try { - scanPackageTracedLI(file, parseFlags | PackageParser.PARSE_MUST_BE_APK, - scanFlags, currentTime, null); - } catch (PackageManagerException e) { - Slog.w(TAG, "Failed to parse " + file + ": " + e.getMessage()); + if (RegionalizationEnvironment.isSupported()) { + if (RegionalizationEnvironment.isExcludedApp(file.getName())) { + Slog.d(TAG, "Regionalization Excluded:" + file.getName()); + continue; + } + } - // Delete invalid userdata apps - if ((parseFlags & PackageParser.PARSE_IS_SYSTEM) == 0 && - e.error == PackageManager.INSTALL_FAILED_INVALID_APK) { - logCriticalInfo(Log.WARN, "Deleting invalid package at " + file); - removeCodePathLI(file); + final File ref_file = file; + final int ref_parseFlags = parseFlags; + final int ref_scanFlags = scanFlags; + final long ref_currentTime = currentTime; + Runnable scanTask = new Runnable() { + public void run() { + try { + scanPackageTracedLI(ref_file, ref_parseFlags | PackageParser.PARSE_MUST_BE_APK, + ref_scanFlags, ref_currentTime, null); + } catch (PackageManagerException e) { + Slog.w(TAG, "Failed to parse " + ref_file + ": " + e.getMessage()); + + // Delete invalid userdata apps + if ((ref_parseFlags & PackageParser.PARSE_IS_SYSTEM) == 0 && + e.error == PackageManager.INSTALL_FAILED_INVALID_APK) { + logCriticalInfo(Log.WARN, "Deleting invalid package at " + ref_file); + removeCodePathLI(ref_file); + } + } } - } + }; + + if (dealer != null) + dealer.addTask(scanTask); + else + scanTask.run(); } + + if (dealer != null) + dealer.waitAll(); + Log.d(TAG, "end scanDirLI:"+dir); } private static File getSettingsProblemFile() { @@ -6748,7 +6857,7 @@ public class PackageManagerService extends IPackageManager.Stub { logCriticalInfo(priority, msg); } - static void logCriticalInfo(int priority, String msg) { + static synchronized void logCriticalInfo(int priority, String msg) { Slog.println(priority, TAG, msg); EventLogTags.writePmCriticalInfo(msg); try { @@ -6824,9 +6933,10 @@ public class PackageManagerService extends IPackageManager.Stub { private PackageParser.Package scanPackageLI(File scanFile, int parseFlags, int scanFlags, long currentTime, UserHandle user) throws PackageManagerException { if (DEBUG_INSTALL) Slog.d(TAG, "Parsing: " + scanFile); - PackageParser pp = new PackageParser(); + PackageParser pp = new PackageParser(mContext); pp.setSeparateProcesses(mSeparateProcesses); pp.setOnlyCoreApps(mOnlyCore); + pp.setOnlyPowerOffAlarmApps(mOnlyPowerOffAlarm); pp.setDisplayMetrics(mMetrics); if ((scanFlags & SCAN_TRUSTED_OVERLAY) != 0) { @@ -9286,12 +9396,14 @@ public class PackageManagerService extends IPackageManager.Stub { if (ps.pkg != null && ps.pkg.applicationInfo != null && !TextUtils.equals(adjustedAbi, ps.pkg.applicationInfo.primaryCpuAbi)) { ps.pkg.applicationInfo.primaryCpuAbi = adjustedAbi; + Slog.i(TAG, "Adjusting ABI for " + ps.name + " to " + adjustedAbi + " (requirer=" - + (requirer == null ? "null" : requirer.pkg.packageName) + + (requirer == null ? "null" : (requirer.pkg == null ? "null" : requirer.pkg.packageName)) + ", scannedPackage=" + (scannedPackage != null ? scannedPackage.packageName : "null") + ")"); + try { mInstaller.rmdex(ps.codePathString, getDexCodeInstructionSet(getPreferredInstructionSet())); @@ -11499,6 +11611,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer, int installFlags, String installerPackageName, int userId) { + android.util.SeempLog.record(90); mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null); final int callingUid = Binder.getCallingUid(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 40415bd10d0a70c40ec63fdcb17e6617c4f0a5d3..652f2a25f477433e740821636c67b2d278a13277 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -289,6 +289,19 @@ public class PhoneWindowManager implements WindowManagerPolicy { .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) .build(); + /** + * Broadcast Action: WiFi Display video is enabled or disabled + * + *

The intent will have the following extra values:

+ *
    + *
  • state - 0 for disabled, 1 for enabled.
  • + *
+ */ + + private static final String ACTION_WIFI_DISPLAY_VIDEO = + "org.codeaurora.intent.action.WIFI_DISPLAY_VIDEO"; + + // The panic gesture may become active only after the keyguard is dismissed and the immersive // app shows again. If that doesn't happen for 30s we drop the gesture. private static final long PANIC_GESTURE_EXPIRATION = 30000; @@ -800,6 +813,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0; private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1; + boolean mWifiDisplayConnected = false; + int mWifiDisplayCustomRotation = -1; private class PolicyHandler extends Handler { @Override @@ -1979,6 +1994,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerFuncs.registerPointerEventListener(mSystemGestures); mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE); + + /* Register for WIFI Display Intents */ + IntentFilter wifiDisplayFilter = new IntentFilter(ACTION_WIFI_DISPLAY_VIDEO); + Intent wifidisplayIntent = context.registerReceiver( + mWifiDisplayReceiver, wifiDisplayFilter); mLongPressVibePattern = getLongIntArray(mContext.getResources(), com.android.internal.R.array.config_longPressVibePattern); mVirtualKeyVibePattern = getLongIntArray(mContext.getResources(), @@ -3349,6 +3369,16 @@ public class PhoneWindowManager implements WindowManagerPolicy { + " canceled=" + canceled); } + // If the boot mode is power off alarm, we should not dispatch the several physical keys + // in power off alarm UI to avoid pausing power off alarm UI. + boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false); + if (isAlarmBoot && (keyCode == KeyEvent.KEYCODE_HOME + || keyCode == KeyEvent.KEYCODE_SEARCH + || keyCode == KeyEvent.KEYCODE_MENU + || keyCode == KeyEvent.KEYCODE_APP_SWITCH)) { + return -1; + } + // If we think we might have a volume down & power key chord on the way // but we're not sure, then tell the dispatcher to wait a little while and // try again later before dispatching. @@ -6763,6 +6793,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + + BroadcastReceiver mWifiDisplayReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (action.equals(ACTION_WIFI_DISPLAY_VIDEO)) { + int state = intent.getIntExtra("state", 0); + if(state == 1) { + mWifiDisplayConnected = true; + } else { + mWifiDisplayConnected = false; + } + mWifiDisplayCustomRotation = + intent.getIntExtra("wfd_UIBC_rot", -1); + updateRotation(true); + } + } + }; + // Called on the PowerManager's Notifier thread. @Override public void startedGoingToSleep(int why) { @@ -7184,10 +7232,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { // enable 180 degree rotation while docked. preferredRotation = mDeskDockEnablesAccelerometer ? sensorRotation : mDeskDockRotation; - } else if (mHdmiPlugged && mDemoHdmiRotationLock) { + } else if ((mHdmiPlugged || mWifiDisplayConnected) && mDemoHdmiRotationLock) { // Ignore sensor when plugged into HDMI when demo HDMI rotation lock enabled. // Note that the dock orientation overrides the HDMI orientation. preferredRotation = mDemoHdmiRotation; + } else if (mWifiDisplayConnected && (mWifiDisplayCustomRotation > -1)) { + // Ignore sensor when WFD is active and UIBC rotation is enabled + preferredRotation = mWifiDisplayCustomRotation; } else if (mHdmiPlugged && mDockMode == Intent.EXTRA_DOCK_STATE_UNDOCKED && mUndockedHdmiRotation >= 0) { // Ignore sensor when plugged into HDMI and an undocked orientation has diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 27b69c5edd26978a8ca0877932921544e375f323..24378a894df72e03af3cc10c267e1ce1326fd6bf 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -115,7 +115,7 @@ public final class PowerManagerService extends SystemService private static final int MSG_SCREEN_BRIGHTNESS_BOOST_TIMEOUT = 3; // Dirty bit: mWakeLocks changed - private static final int DIRTY_WAKE_LOCKS = 1 << 0; + protected static final int DIRTY_WAKE_LOCKS = 1 << 0; // Dirty bit: mWakefulness changed private static final int DIRTY_WAKEFULNESS = 1 << 1; // Dirty bit: user activity was poked or may have timed out @@ -216,7 +216,7 @@ public final class PowerManagerService extends SystemService // A bitfield that indicates what parts of the power state have // changed and need to be recalculated. - private int mDirty; + protected int mDirty; // Indicates whether the device is awake or asleep or somewhere in between. // This is distinct from the screen power state, which is managed separately. @@ -235,7 +235,7 @@ public final class PowerManagerService extends SystemService private final ArrayList mSuspendBlockers = new ArrayList(); // Table of all wake locks acquired by applications. - private final ArrayList mWakeLocks = new ArrayList(); + protected final ArrayList mWakeLocks = new ArrayList(); // A bitfield that summarizes the state of all active wakelocks. private int mWakeLockSummary; @@ -498,6 +498,8 @@ public final class PowerManagerService extends SystemService // Set of app ids that are temporarily allowed to acquire wakelocks due to high-pri message int[] mDeviceIdleTempWhitelist = new int[0]; + private QCNsrmPowerExtension qcNsrmPowExt; + private final SparseIntArray mUidState = new SparseIntArray(); // True if theater mode is enabled @@ -533,7 +535,7 @@ public final class PowerManagerService extends SystemService Process.THREAD_PRIORITY_DISPLAY, false /*allowIo*/); mHandlerThread.start(); mHandler = new PowerManagerHandler(mHandlerThread.getLooper()); - + qcNsrmPowExt = new QCNsrmPowerExtension(this); synchronized (mLock) { mWakeLockSuspendBlocker = createSuspendBlockerLocked("PowerManagerService.WakeLocks"); mDisplaySuspendBlocker = createSuspendBlockerLocked("PowerManagerService.Display"); @@ -932,6 +934,7 @@ public final class PowerManagerService extends SystemService } mWakeLocks.add(wakeLock); setWakeLockDisabledStateLocked(wakeLock); + qcNsrmPowExt.checkPmsBlockedWakelocks(uid, pid, flags, tag, wakeLock); notifyAcquire = true; } @@ -1078,7 +1081,7 @@ public final class PowerManagerService extends SystemService return -1; } - private void notifyWakeLockAcquiredLocked(WakeLock wakeLock) { + protected void notifyWakeLockAcquiredLocked(WakeLock wakeLock) { if (mSystemReady && !wakeLock.mDisabled) { wakeLock.mNotifiedAcquired = true; mNotifier.onWakeLockAcquired(wakeLock.mFlags, wakeLock.mTag, wakeLock.mPackageName, @@ -1096,7 +1099,7 @@ public final class PowerManagerService extends SystemService } } - private void notifyWakeLockReleasedLocked(WakeLock wakeLock) { + protected void notifyWakeLockReleasedLocked(WakeLock wakeLock) { if (mSystemReady && wakeLock.mNotifiedAcquired) { wakeLock.mNotifiedAcquired = false; mNotifier.onWakeLockReleased(wakeLock.mFlags, wakeLock.mTag, @@ -1415,7 +1418,7 @@ public final class PowerManagerService extends SystemService * each time something important changes, and ensure that we do it the same * way each time. The point is to gather all of the transition logic here. */ - private void updatePowerStateLocked() { + protected void updatePowerStateLocked() { if (!mSystemReady || mDirty == 0) { return; } @@ -3076,7 +3079,7 @@ public final class PowerManagerService extends SystemService /** * Represents a wake lock that has been acquired by an application. */ - private final class WakeLock implements IBinder.DeathRecipient { + protected final class WakeLock implements IBinder.DeathRecipient { public final IBinder mLock; public int mFlags; public String mTag; @@ -3769,6 +3772,17 @@ public final class PowerManagerService extends SystemService Binder.restoreCallingIdentity(ident); } } + + @Override + /* updates the blocked uids, so if a wake lock is acquired for it + * can be released. + */ + public void updateBlockedUids(int uid, boolean isBlocked) { + synchronized(mLock) { + qcNsrmPowExt.processPmsBlockedUid(uid, isBlocked, + mWakeLocks); + } + } } private void setButtonBrightnessOverrideFromWindowManagerInternal(int brightness) { diff --git a/services/core/java/com/android/server/power/QCNsrmPowerExtension.java b/services/core/java/com/android/server/power/QCNsrmPowerExtension.java new file mode 100644 index 0000000000000000000000000000000000000000..632d5c1182c7078ddfb8230efad574595cf173c8 --- /dev/null +++ b/services/core/java/com/android/server/power/QCNsrmPowerExtension.java @@ -0,0 +1,160 @@ +/* + *Copyright (c) 2016, The Linux Foundation. All rights reserved. + * + *Redistribution and use in source and binary forms, with or without + *modification, are permitted provided that the following conditions are + *met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + *THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + *WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + *MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + *ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + *BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + *CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + *SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + *WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + *OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + *IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package com.android.server.power; + +import java.util.ArrayList; + +import android.os.Binder; +import android.os.PowerManager; +import android.os.Process; +import android.util.Slog; + +public final class QCNsrmPowerExtension { + static final String TAG = "QCNsrmPowerExtn"; + static final boolean localLOGV = false; + private PowerManagerService pmHandle; + + //track the blocked uids in PowerManagerService. + private final ArrayList mPmsBlockedUids = new ArrayList(); + + public QCNsrmPowerExtension (PowerManagerService handle) { + pmHandle = handle ; + } + + protected void checkPmsBlockedWakelocks ( + int uid, int pid, int flags, + String tag, PowerManagerService.WakeLock pMwakeLock + ) { + if(mPmsBlockedUids.contains(new Integer(uid)) && uid != Process.myUid()) { + // wakelock acquisition for blocked uid, disable it. + if (localLOGV) { + Slog.d(TAG, "uid is blocked disabling wakeLock flags=0x" + + Integer.toHexString(flags) + " tag=" + tag + " uid=" + + uid + " pid =" + pid); + } + updatePmsBlockedWakelock(pMwakeLock, true); + } + } + + private boolean checkWorkSourceObjectId ( + int uid, PowerManagerService.WakeLock wl + ) { + try { + for (int index = 0; index < wl.mWorkSource.size(); index++) { + if (uid == wl.mWorkSource.get(index)) { + if (localLOGV) Slog.v(TAG, "WS uid matched"); + return true; + } + } + } + catch (Exception e) { + return false; + } + return false; + } + + protected boolean processPmsBlockedUid ( + int uid, boolean isBlocked, + ArrayList mWakeLocks + ) { + boolean changed = false; + if (updatePmsBlockedUidAllowed(uid, isBlocked)) + return changed; + + for (int index = 0; index < mWakeLocks.size(); index++) { + PowerManagerService.WakeLock wl = mWakeLocks.get(index); + if(wl != null) { + // update the wakelock for the blocked uid + if ((wl.mOwnerUid == uid || checkWorkSourceObjectId(uid, wl)) + || (wl.mTag.startsWith("*sync*") && wl.mOwnerUid == + Process.SYSTEM_UID)) { + if(updatePmsBlockedWakelock(wl, isBlocked)) { + changed = true; + } + } + } + } + if(changed) { + pmHandle.mDirty |= pmHandle.DIRTY_WAKE_LOCKS; + pmHandle.updatePowerStateLocked(); + } + return changed; + } + + protected boolean updatePmsBlockedUidAllowed ( + int uid, boolean isBlocked + ) { + if (localLOGV) Slog.v(TAG, "updateBlockedUids: uid = " + uid + + "isBlocked = " + isBlocked); + if (Binder.getCallingUid() != Process.SYSTEM_UID) { + if (localLOGV) Slog.v(TAG, "UpdateBlockedUids is not allowed"); + return true; + } + updatePmsBlockedUids(uid, isBlocked); + return false; + } + + private void updatePmsBlockedUids (int uid, boolean isBlocked) { + if(isBlocked) { + if (localLOGV) Slog.v(TAG, "adding powerMgr mPmBlockedUids "+ + "with uid "+ uid); + mPmsBlockedUids.add(new Integer(uid)); + } + else { + if (localLOGV) Slog.v(TAG, "clearing powerMgr mPmBlockedUids "); + mPmsBlockedUids.clear(); + } + } + + private boolean updatePmsBlockedWakelock ( + PowerManagerService.WakeLock wakeLock, boolean update + ) { + if (wakeLock != null && ((wakeLock.mFlags & + PowerManager.WAKE_LOCK_LEVEL_MASK + ) == PowerManager.PARTIAL_WAKE_LOCK )) { + if (wakeLock.mDisabled != update && pmHandle != null) { + wakeLock.mDisabled = update; + if (localLOGV) Slog.v(TAG, "updatePmsBlockWakelock pmHandle "+pmHandle); + if (wakeLock.mDisabled) { + // This wake lock is no longer being respected. + pmHandle.notifyWakeLockReleasedLocked(wakeLock); + } else { + pmHandle.notifyWakeLockAcquiredLocked(wakeLock); + } + return true; + } + else { + if (localLOGV) Slog.v(TAG, "updatePmsBlockWakelock pmHandle "+pmHandle ); + } + } + return false; + } +} + diff --git a/services/core/java/com/android/server/power/ShutdownThread.java b/services/core/java/com/android/server/power/ShutdownThread.java index a6a98127dd133ca93a0abbe811880ad0f9e3abba..0c5b479654d7542d5060271a862d6889eea84edd 100644 --- a/services/core/java/com/android/server/power/ShutdownThread.java +++ b/services/core/java/com/android/server/power/ShutdownThread.java @@ -19,6 +19,7 @@ package com.android.server.power; import android.app.ActivityManagerNative; +import android.app.AlarmManager; import android.app.AlertDialog; import android.app.Dialog; import android.app.IActivityManager; @@ -588,6 +589,19 @@ public final class ShutdownThread extends Thread { uncrypt(); } + + // If it is alarm boot and encryption status, power off alarm status will + // be set to handled when device go to shutdown or reboot. + boolean isAlarmBoot = SystemProperties.getBoolean("ro.alarm_boot", false); + String cryptState = SystemProperties.get("vold.decrypt"); + + if (isAlarmBoot && + ("trigger_restart_min_framework".equals(cryptState) || + "1".equals(cryptState))) { + AlarmManager.writePowerOffAlarmFile(AlarmManager.POWER_OFF_ALARM_HANDLE_FILE, + AlarmManager.POWER_OFF_ALARM_HANDLED); + } + rebootOrShutdown(mContext, mReboot, mReason); } diff --git a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java index fb556d23cdd3dba378fb66122bb3d4e15a1ccb53..532891e82256db27aa57b8ada5f1defb75dc7a77 100644 --- a/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java +++ b/services/core/java/com/android/server/wm/TaskTapPointerEventListener.java @@ -25,6 +25,7 @@ import android.view.MotionEvent; import android.view.WindowManagerPolicy.PointerEventListener; import com.android.server.wm.WindowManagerService.H; +import com.android.server.am.ActivityManagerService; import static android.view.PointerIcon.TYPE_NOT_SPECIFIED; import static android.view.PointerIcon.TYPE_DEFAULT; @@ -63,6 +64,17 @@ public class TaskTapPointerEventListener implements PointerEventListener { public void onPointerEvent(MotionEvent motionEvent) { doGestureDetection(motionEvent); + if (ActivityManagerService.sIsFreqAggrBoostSet) { + ActivityManagerService.sFreqAggr_init.perfLockRelease(); + ActivityManagerService.sFreqAggr.perfLockRelease(); + ActivityManagerService.sIsFreqAggrBoostSet = false; + } + + if (ActivityManagerService.sIsLaunchBoostv2_set) { + ActivityManagerService.sPerfBoost_v2.perfLockRelease(); + ActivityManagerService.sIsLaunchBoostv2_set = false; + } + final int action = motionEvent.getAction(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 85c6e4a7eadb179aea3c2b4af314b3e7b85c36cb..91c7b4890c91dc3b2a5ddc4e4219543a44bcf225 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -122,6 +122,7 @@ import android.view.animation.Animation; import android.view.inputmethod.InputMethodManagerInternal; import com.android.internal.R; +import com.android.internal.app.ActivityTrigger; import com.android.internal.app.IAssistScreenshotReceiver; import com.android.internal.os.IResultReceiver; import com.android.internal.policy.IShortcutService; @@ -258,7 +259,10 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean PROFILE_ORIENTATION = false; static final boolean localLOGV = DEBUG; - + static final boolean mEnableAnimCheck = SystemProperties.getBoolean("persist.animcheck.enable", false); + static ActivityTrigger mActivityTrigger = new ActivityTrigger(); + static WindowState mFocusingWindow; + String mFocusingActivity; /** How much to multiply the policy's type layer, to reserve room * for multiple windows of the same type and Z-ordering adjustment * with TYPE_LAYER_OFFSET. */ @@ -1862,6 +1866,7 @@ public class WindowManagerService extends IWindowManager.Stub WindowState attachedWindow = null; long origId; final int type = attrs.type; + mFocusingActivity = attrs.getTitle().toString(); synchronized(mWindowMap) { if (!mDisplayReady) { @@ -5551,12 +5556,38 @@ public class WindowManagerService extends IWindowManager.Stub ValueAnimator.setDurationScale(scale); } + private float animationScalesCheck (int which) { + float value = -1.0f; + if (!mAnimationsDisabled) { + if (mEnableAnimCheck) { + if (mFocusingActivity != null) { + if (mActivityTrigger == null) { + mActivityTrigger = new ActivityTrigger(); + } + if (mActivityTrigger != null) { + value = mActivityTrigger.animationScalesCheck(mFocusingActivity, which); + } + } + } + if (value == -1.0f) { + switch (which) { + case WINDOW_ANIMATION_SCALE: value = mWindowAnimationScaleSetting; break; + case TRANSITION_ANIMATION_SCALE: value = mTransitionAnimationScaleSetting; break; + case ANIMATION_DURATION_SCALE: value = mAnimatorDurationScaleSetting; break; + } + } + } else { + value = 0; + } + return value; + } + public float getWindowAnimationScaleLocked() { - return mAnimationsDisabled ? 0 : mWindowAnimationScaleSetting; + return animationScalesCheck(WINDOW_ANIMATION_SCALE); } public float getTransitionAnimationScaleLocked() { - return mAnimationsDisabled ? 0 : mTransitionAnimationScaleSetting; + return animationScalesCheck(TRANSITION_ANIMATION_SCALE); } @Override @@ -5578,7 +5609,7 @@ public class WindowManagerService extends IWindowManager.Stub @Override public float getCurrentAnimatorScale() { synchronized(mWindowMap) { - return mAnimationsDisabled ? 0 : mAnimatorDurationScaleSetting; + return animationScalesCheck(ANIMATION_DURATION_SCALE); } } @@ -9706,6 +9737,12 @@ public class WindowManagerService extends IWindowManager.Stub // No focus for you!!! if (localLOGV || DEBUG_FOCUS_LIGHT) Slog.v(TAG_WM, "findFocusedWindow: Reached focused app=" + mFocusedApp); + if (mFocusedApp.hasWindowsAlive()) { + mFocusingWindow = mFocusedApp.findMainWindow(); + if (mFocusingWindow != null) { + mFocusingActivity = mFocusingWindow.mAttrs.getTitle().toString(); + } + } return null; } } diff --git a/services/core/jni/com_android_server_AlarmManagerService.cpp b/services/core/jni/com_android_server_AlarmManagerService.cpp index 246ab0d259f4e64027eb83b4be8805802bcdc226..2138458d3a080c480704c542236635addf0e1613 100644 --- a/services/core/jni/com_android_server_AlarmManagerService.cpp +++ b/services/core/jni/com_android_server_AlarmManagerService.cpp @@ -51,6 +51,7 @@ static const clockid_t android_alarm_to_clockid[N_ANDROID_TIMERFDS] = { CLOCK_BOOTTIME_ALARM, CLOCK_BOOTTIME, CLOCK_MONOTONIC, + CLOCK_POWEROFF_ALARM, CLOCK_REALTIME, }; /* to match the legacy alarm driver implementation, we need an extra @@ -63,6 +64,7 @@ public: virtual ~AlarmImpl(); virtual int set(int type, struct timespec *ts) = 0; + virtual int clear(int type, struct timespec *ts) = 0; virtual int setTime(struct timeval *tv) = 0; virtual int waitForAlarm() = 0; @@ -77,6 +79,7 @@ public: AlarmImplAlarmDriver(int fd) : AlarmImpl(&fd, 1) { } int set(int type, struct timespec *ts); + int clear(int type, struct timespec *ts); int setTime(struct timeval *tv); int waitForAlarm(); }; @@ -89,6 +92,7 @@ public: ~AlarmImplTimerFd(); int set(int type, struct timespec *ts); + int clear(int type, struct timespec *ts); int setTime(struct timeval *tv); int waitForAlarm(); @@ -116,6 +120,11 @@ int AlarmImplAlarmDriver::set(int type, struct timespec *ts) return ioctl(fds[0], ANDROID_ALARM_SET(type), ts); } +int AlarmImplAlarmDriver::clear(int type, struct timespec *ts) +{ + return ioctl(fds[0], ANDROID_ALARM_CLEAR(type), ts); +} + int AlarmImplAlarmDriver::setTime(struct timeval *tv) { struct timespec ts; @@ -162,6 +171,23 @@ int AlarmImplTimerFd::set(int type, struct timespec *ts) return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL); } +int AlarmImplTimerFd::clear(int type, struct timespec *ts) +{ + if (type > ANDROID_ALARM_TYPE_COUNT) { + errno = EINVAL; + return -1; + } + + ts->tv_sec = 0; + ts->tv_nsec = 0; + + struct itimerspec spec; + memset(&spec, 0, sizeof(spec)); + memcpy(&spec.it_value, ts, sizeof(spec.it_value)); + + return timerfd_settime(fds[type], TFD_TIMER_ABSTIME, &spec, NULL); +} + int AlarmImplTimerFd::setTime(struct timeval *tv) { struct rtc_time rtc; @@ -443,6 +469,24 @@ static void android_server_AlarmManagerService_set(JNIEnv*, jobject, jlong nativ } } +static void android_server_AlarmManagerService_clear(JNIEnv*, jobject, jlong nativeData, jint type, jlong seconds, + jlong nanoseconds) +{ + AlarmImpl *impl = reinterpret_cast(nativeData); + struct timespec ts; + ts.tv_sec = seconds; + ts.tv_nsec = nanoseconds; + + int result = impl->clear(type, &ts); + if (result < 0) + { + ALOGE("Unable to clear alarm %lld.%09lld: %s\n", + static_cast(seconds), + static_cast(nanoseconds), strerror(errno)); + } +} + + static jint android_server_AlarmManagerService_waitForAlarm(JNIEnv*, jobject, jlong nativeData) { AlarmImpl *impl = reinterpret_cast(nativeData); @@ -467,6 +511,7 @@ static const JNINativeMethod sMethods[] = { {"init", "()J", (void*)android_server_AlarmManagerService_init}, {"close", "(J)V", (void*)android_server_AlarmManagerService_close}, {"set", "(JIJJ)V", (void*)android_server_AlarmManagerService_set}, + {"clear", "(JIJJ)V", (void*)android_server_AlarmManagerService_clear}, {"waitForAlarm", "(J)I", (void*)android_server_AlarmManagerService_waitForAlarm}, {"setKernelTime", "(JJ)I", (void*)android_server_AlarmManagerService_setKernelTime}, {"setKernelTimezone", "(JI)I", (void*)android_server_AlarmManagerService_setKernelTimezone}, diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 74cdf5e0aa8a0797de560e4146f5ab56a3a277bd..b95a99478fec429c0920109f0c54e0adef159773 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -32,6 +32,7 @@ import android.os.Build; import android.os.Environment; import android.os.FactoryTest; import android.os.FileUtils; +import android.os.IBinder; import android.os.IPowerManager; import android.os.Looper; import android.os.PowerManager; @@ -50,6 +51,7 @@ import android.view.WindowManager; import com.android.internal.R; import com.android.internal.os.BinderInternal; +import com.android.internal.os.RegionalizationEnvironment; import com.android.internal.os.SamplingProfilerIntegration; import com.android.internal.os.ZygoteInit; import com.android.internal.widget.ILockSettings; @@ -75,6 +77,7 @@ import com.android.server.media.projection.MediaProjectionManagerService; import com.android.server.net.NetworkPolicyManagerService; import com.android.server.net.NetworkStatsService; import com.android.server.notification.NotificationManagerService; +import com.android.server.os.RegionalizationService; import com.android.server.os.SchedulingPolicyService; import com.android.server.pm.BackgroundDexOptService; import com.android.server.pm.Installer; @@ -101,6 +104,9 @@ import com.android.server.wm.WindowManagerService; import cyanogenmod.providers.CMSettings; import dalvik.system.VMRuntime; +import dalvik.system.PathClassLoader; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; import java.io.File; import java.io.IOException; @@ -446,6 +452,18 @@ public final class SystemServer { } else if (ENCRYPTED_STATE.equals(cryptState)) { Slog.w(TAG, "Device encrypted - only parsing core apps"); mOnlyCore = true; + } else if (SystemProperties.getBoolean("ro.alarm_boot", false)) { + // power off alarm mode is similar to encryption mode. Only power off alarm + // applications will be parsed by packageParser. Some services or settings are + // not necessary to power off alarm mode. So reuse mOnlyCore for power off alarm + // mode. + mOnlyCore = true; + } + + if (RegionalizationEnvironment.isSupported()) { + Slog.i(TAG, "Regionalization Service"); + RegionalizationService regionalizationService = new RegionalizationService(); + ServiceManager.addService("regionalization", regionalizationService); } // Start the package manager. @@ -528,6 +546,8 @@ public final class SystemServer { ConsumerIrService consumerIr = null; MmsServiceBroker mmsService = null; HardwarePropertiesManagerService hardwarePropertiesService = null; + Object wigigP2pService = null; + Object wigigService = null; boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false); boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false); @@ -548,6 +568,7 @@ public final class SystemServer { boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof", false); boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1"); + boolean enableWigig = SystemProperties.getBoolean("persist.wigig.enable", false); String externalServer = context.getResources().getString( org.cyanogenmod.platform.internal.R.string.config_externalSystemServer); @@ -841,6 +862,31 @@ public final class SystemServer { mSystemServiceManager.startService("com.android.server.wifi.RttService"); } + if (enableWigig) { + try { + Slog.i(TAG, "Wigig Service"); + PathClassLoader wigigClassLoader = + new PathClassLoader("/system/framework/wigig-service.jar", + "/system/lib64:/system/vendor/lib64", + getClass().getClassLoader()); + Class wigigP2pClass = wigigClassLoader.loadClass( + "com.qualcomm.qti.server.wigig.p2p.WigigP2pServiceImpl"); + Constructor ctor = wigigP2pClass.getConstructor(Context.class); + wigigP2pService = ctor.newInstance(context); + Slog.i(TAG, "Successfully loaded WigigP2pServiceImpl class"); + ServiceManager.addService("wigigp2p", (IBinder) wigigP2pService); + + Class wigigClass = wigigClassLoader.loadClass( + "com.qualcomm.qti.server.wigig.WigigService"); + ctor = wigigClass.getConstructor(Context.class); + wigigService = ctor.newInstance(context); + Slog.i(TAG, "Successfully loaded WigigService class"); + ServiceManager.addService("wigig", (IBinder) wigigService); + } catch (Throwable e) { + reportWtf("starting WigigService", e); + } + } + if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) || mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) { mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS); @@ -951,8 +997,8 @@ public final class SystemServer { if (!disableNonCoreServices) { mSystemServiceManager.startService(DockObserver.class); - if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { - mSystemServiceManager.startService(THERMAL_OBSERVER_CLASS); + if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { + //#Fixme:mSystemServiceManager.startService(THERMAL_OBSERVER_CLASS); } } @@ -1179,7 +1225,7 @@ public final class SystemServer { } if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) { - mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS); + //#Fixme:mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS); } // Before things start rolling, be sure we have decided whether @@ -1241,6 +1287,26 @@ public final class SystemServer { mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "MakeWindowManagerServiceReady"); + + // Wigig services are not registered as system services because of class loader + // limitations, send boot phase notification separately + if (enableWigig) { + try { + Slog.i(TAG, "calling onBootPhase for Wigig Services"); + Class wigigP2pClass = wigigP2pService.getClass(); + Method m = wigigP2pClass.getMethod("onBootPhase", int.class); + m.invoke(wigigP2pService, new Integer( + SystemService.PHASE_SYSTEM_SERVICES_READY)); + + Class wigigClass = wigigService.getClass(); + m = wigigClass.getMethod("onBootPhase", int.class); + m.invoke(wigigService, new Integer( + SystemService.PHASE_SYSTEM_SERVICES_READY)); + } catch (Throwable e) { + reportWtf("Wigig services ready", e); + } + } + try { wm.systemReady(); } catch (Throwable e) { diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java old mode 100644 new mode 100755 index 02aa85b8553c5888616413b62f6b2f47cf677b02..dbf0285b59d360e31931fbcc6c0dca579d836d68 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -540,7 +540,9 @@ public class UsbDeviceManager { } private String applyAdbFunction(String functions) { - if (mAdbEnabled) { + //Not enable adb when it s charging mode + if (mAdbEnabled && + !UsbManager.containsFunction(functions, UsbManager.USB_FUNCTION_CHARGING)) { functions = UsbManager.addFunction(functions, UsbManager.USB_FUNCTION_ADB); } else { functions = UsbManager.removeFunction(functions, UsbManager.USB_FUNCTION_ADB); diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java old mode 100644 new mode 100755 index d6dbe90584f51a46d2176c589a9081a50e9ce795..d6f6b82dc97a474110b26e80e3e1ee791d268f51 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -313,6 +313,7 @@ public class UsbService extends IUsbManager.Stub { case UsbManager.USB_FUNCTION_MTP: case UsbManager.USB_FUNCTION_PTP: case UsbManager.USB_FUNCTION_RNDIS: + case UsbManager.USB_FUNCTION_CHARGING: return true; } diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 7d7e1eb29e80b3a62a1fc70fefdd305f316c4d1c..6a66023f8804a6b6ec18fd9421280ad20c4dc6fc 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -256,8 +256,20 @@ public final class Call { */ public static final int CAPABILITY_CAN_PULL_CALL = 0x00800000; + /** + * Call has voice privacy capability. + * @hide + */ + public static final int CAPABILITY_VOICE_PRIVACY = 0x01000000; + + /** + * Add participant in an active or conference call option + * @hide + */ + public static final int CAPABILITY_ADD_PARTICIPANT = 0x02000000; + //****************************************************************************************** - // Next CAPABILITY value: 0x01000000 + // Next CAPABILITY value: 0x04000000 //****************************************************************************************** /** @@ -413,6 +425,12 @@ public final class Call { if (can(capabilities, CAPABILITY_CAN_PULL_CALL)) { builder.append(" CAPABILITY_CAN_PULL_CALL"); } + if (can(capabilities, CAPABILITY_VOICE_PRIVACY)) { + builder.append(" CAPABILITY_VOICE_PRIVACY"); + } + if (can(capabilities, CAPABILITY_ADD_PARTICIPANT)) { + builder.append(" CAPABILITY_ADD_PARTICIPANT"); + } builder.append("]"); return builder.toString(); } diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index 0227d27180b5a25eea5836725f7f38bc836ac797..a4a06b2d053424ca985171ec9ec0e7207d244f0a 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -267,6 +267,14 @@ public abstract class Conference extends Conferenceable { */ public void onSeparate(Connection connection) {} + /** + * Invoked when the conference adds a participant to the conference call. + * + * @param participant The participant to be added with conference call. + * @hide + */ + public void onAddParticipant(String participant) {} + /** * Invoked when the specified {@link Connection} should merged with the conference call. * diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index ff220f3a4c3045e70d97b249b145d0cbb30d5266..3e2433d53147b5cda720285d00b977b4e75a889e 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -288,8 +288,22 @@ public abstract class Connection extends Conferenceable { */ public static final int CAPABILITY_CAN_PULL_CALL = 0x01000000; + /** + * Call has voice privacy capability. + * @hide + */ + public static final int CAPABILITY_VOICE_PRIVACY = 0x02000000; + + /** + * Add participant in an active or conference call option + * + * @hide + */ + public static final int CAPABILITY_ADD_PARTICIPANT = 0x04000000; + + //********************************************************************************************** - // Next CAPABILITY value: 0x02000000 + // Next CAPABILITY value: 0x08000000 //********************************************************************************************** /** diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java index aba38fe8a376e7521025f84ae3c255126152f022..c6811209e25518cea39b38794ce6a72639ff09fb 100644 --- a/telecomm/java/android/telecom/ConnectionRequest.java +++ b/telecomm/java/android/telecom/ConnectionRequest.java @@ -28,7 +28,7 @@ import android.os.Parcelable; public final class ConnectionRequest implements Parcelable { // TODO: Token to limit recursive invocations - private final PhoneAccountHandle mAccountHandle; + private PhoneAccountHandle mAccountHandle; private final Uri mAddress; private final Bundle mExtras; private final int mVideoState; @@ -94,6 +94,9 @@ public final class ConnectionRequest implements Parcelable { */ public PhoneAccountHandle getAccountHandle() { return mAccountHandle; } + /** {@hide} */ + public void setAccountHandle(PhoneAccountHandle acc) { mAccountHandle = acc; } + /** * The handle (e.g., phone number) to which the {@link Connection} is to connect. */ diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index fc7d7412d8b5747fdd842dca5fadd7066fc74cef..053124b60229953d6e0e39fe88eb43a7cb9af742 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -106,6 +106,8 @@ public abstract class ConnectionService extends Service { private static final int MSG_PULL_EXTERNAL_CALL = 22; private static final int MSG_SEND_CALL_EVENT = 23; private static final int MSG_ON_EXTRAS_CHANGED = 24; + //Proprietary values starts after this. + private static final int MSG_ADD_PARTICIPANT_WITH_CONFERENCE = 30; private static Connection sNullConnection; @@ -231,6 +233,14 @@ public abstract class ConnectionService extends Service { mHandler.obtainMessage(MSG_SPLIT_FROM_CONFERENCE, callId).sendToTarget(); } + @Override + public void addParticipantWithConference(String callId, String participant) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = callId; + args.arg2 = participant; + mHandler.obtainMessage(MSG_ADD_PARTICIPANT_WITH_CONFERENCE, args).sendToTarget(); + } + @Override public void mergeConference(String callId) { mHandler.obtainMessage(MSG_MERGE_CONFERENCE, callId).sendToTarget(); @@ -390,6 +400,17 @@ public abstract class ConnectionService extends Service { case MSG_SPLIT_FROM_CONFERENCE: splitFromConference((String) msg.obj); break; + case MSG_ADD_PARTICIPANT_WITH_CONFERENCE: { + SomeArgs args = (SomeArgs) msg.obj; + try { + String callId = (String) args.arg1; + String participant = (String) args.arg2; + addParticipantWithConference(callId, participant); + } finally { + args.recycle(); + } + break; + } case MSG_MERGE_CONFERENCE: mergeConference((String) msg.obj); break; @@ -940,6 +961,17 @@ public abstract class ConnectionService extends Service { } } + private void addParticipantWithConference(String callId, String participant) { + Log.d(this, "ConnectionService addParticipantWithConference(%s, %s)", participant, callId); + Conference conference = findConferenceForAction(callId, "addParticipantWithConference"); + Connection connection = findConnectionForAction(callId, "addParticipantWithConnection"); + if (connection != getNullConnection()) { + onAddParticipant(connection, participant); + } else if (conference != getNullConference()) { + conference.onAddParticipant(participant); + } + } + private void mergeConference(String callId) { Log.d(this, "mergeConference(%s)", callId); Conference conference = findConferenceForAction(callId, "mergeConference"); @@ -1292,6 +1324,19 @@ public abstract class ConnectionService extends Service { */ public void onConference(Connection connection1, Connection connection2) {} + /** + * Add participant with connection. Invoked when user has made a request to add + * participant with specified connection. In response, the participant should add with + * the connection. + * + * @param connection A connection where participant need to add. + * @param participant Address of participant which will be added. + * @return + * + * @hide + */ + public void onAddParticipant(Connection connection, String participant) {} + /** * Indicates that a remote conference has been created for existing {@link RemoteConnection}s. * When this method is invoked, this {@link ConnectionService} should create its own diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index da0d048795c2d9cc4d008603bc38e7e60bab28b5..91ed57c6d1e3bbeacc45151aaad4e38ccfcc8c44 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -152,6 +152,17 @@ public class TelecomManager { public static final String ACTION_DEFAULT_DIALER_CHANGED = "android.telecom.action.DEFAULT_DIALER_CHANGED"; + /** + *@hide Broadcast intent action indicating the call type(CS call or Non-CS call). + * The string extra {@link #EXTRA_CALL_TYPE_CS} will contain the + * boolean value true if call is CS call else false. + * + * @see #EXTRA_CALL_TYPE_CS + */ + public static final String ACTION_CALL_TYPE = + "codeaurora.telecom.action.CALL_TYPE"; + + /** * Extra value used to provide the package name for {@link #ACTION_CHANGE_DEFAULT_DIALER}. */ @@ -279,6 +290,13 @@ public class TelecomManager { public static final String EXTRA_CALL_TECHNOLOGY_TYPE = "android.telecom.extra.CALL_TECHNOLOGY_TYPE"; + /** + *@hide Extra value used to provide the call type for {@link #ACTION_CALL_TYPE}. + */ + public static final String EXTRA_CALL_TYPE_CS = + "codeaurora.telecom.extra.CALL_TYPE_CS"; + + /** * An optional {@link android.content.Intent#ACTION_CALL} intent extra denoting the * package name of the app specifying an alternative gateway for the call. diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl index a4c179820331e158b20ba64b9e0005e8b180c9d9..e85dfb90a691d6c28a17b524d34e490f453a421a 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl @@ -81,4 +81,6 @@ oneway interface IConnectionService { void sendCallEvent(String callId, String event, in Bundle extras); void onExtrasChanged(String callId, in Bundle extras); + + void addParticipantWithConference(String callId, String recipients); } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index ff7ca6201b55e6a26115f6949c77dd4b5d346ae4..737a501edc32c397d125b3065fabdad723dfef07 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -615,6 +615,12 @@ public class CarrierConfigManager { public static final String KEY_BROADCAST_EMERGENCY_CALL_STATE_CHANGES_BOOL = "broadcast_emergency_call_state_changes_bool"; + /** + * Flag specifying whether CDMA call waiting and call forwarding are enabled + * @hide + */ + public static final String KEY_CDMA_CW_CF_ENABLED_BOOL = "cdma_cw_cf_enabled_bool"; + // These variables are used by the MMS service and exposed through another API, {@link // SmsManager}. The variable names and string values are copied from there. public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled"; @@ -718,6 +724,25 @@ public class CarrierConfigManager { /** @hide */ public static final int CDMA_ROAMING_MODE_ANY = 2; + /** + * Key that determines if ACTIVATE_REJECT_GGSN is to be treated as a permanent error. + * @hide + */ + public static final String KEY_REJECT_GGSN_PERM_FAILURE = "reject_ggsn_perm_failure"; + + /** + * Key that determines if PROTOCOL_ERRORS is treated as permanent error. + * @hide + */ + public static final String KEY_PROTOCOL_ERRORS_PERM_FAILURE = "protocol_errors_perm_failure"; + + /** + * Key that determines if anonymous users to be mapped to presentation restricted + * @hide + */ + public static final String KEY_MAP_ANONYMOUS_TO_RESTRICTED_BOOL = + "carrier_map_anonymous_to_restricted"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -756,8 +781,8 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_IGNORE_SIM_NETWORK_LOCKED_EVENTS_BOOL, false); sDefaults.putBoolean(KEY_OPERATOR_SELECTION_EXPAND_BOOL, true); sDefaults.putBoolean(KEY_PREFER_2G_BOOL, true); - sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, false); - sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, false); + sDefaults.putBoolean(KEY_SHOW_APN_SETTING_CDMA_BOOL, true); + sDefaults.putBoolean(KEY_SHOW_CDMA_CHOICES_BOOL, true); sDefaults.putBoolean(KEY_SHOW_ONSCREEN_DIAL_BUTTON_BOOL, true); sDefaults.putBoolean(KEY_SIM_NETWORK_UNLOCK_ALLOW_DISMISS_BOOL, true); sDefaults.putBoolean(KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL, false); @@ -766,7 +791,7 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_USE_OTASP_FOR_PROVISIONING_BOOL, false); sDefaults.putBoolean(KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL, false); sDefaults.putBoolean(KEY_VOICE_PRIVACY_DISABLE_UI_BOOL, false); - sDefaults.putBoolean(KEY_WORLD_PHONE_BOOL, false); + sDefaults.putBoolean(KEY_WORLD_PHONE_BOOL, true); sDefaults.putBoolean(KEY_REQUIRE_ENTITLEMENT_CHECKS_BOOL, true); sDefaults.putInt(KEY_VOLTE_REPLACEMENT_RAT_INT, 0); sDefaults.putString(KEY_DEFAULT_SIM_CALL_MANAGER_STRING, ""); @@ -798,6 +823,7 @@ public class CarrierConfigManager { new String[]{"default", "mms", "dun", "supl"}); sDefaults.putStringArray(KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS, new String[]{"default", "mms", "dun", "supl"}); + sDefaults.putBoolean(KEY_CDMA_CW_CF_ENABLED_BOOL, false); sDefaults.putStringArray(KEY_GSM_ROAMING_NETWORKS_STRING_ARRAY, null); sDefaults.putStringArray(KEY_GSM_NONROAMING_NETWORKS_STRING_ARRAY, null); @@ -819,6 +845,8 @@ public class CarrierConfigManager { sDefaults.putBoolean(KEY_CONFIG_WIFI_DISABLE_IN_ECBM, false); sDefaults.putBoolean(KEY_CARRIER_NAME_OVERRIDE_BOOL, false); sDefaults.putString(KEY_CARRIER_NAME_STRING, ""); + sDefaults.putBoolean(KEY_REJECT_GGSN_PERM_FAILURE,true); + sDefaults.putBoolean(KEY_PROTOCOL_ERRORS_PERM_FAILURE,true); // MMS defaults sDefaults.putBoolean(KEY_MMS_ALIAS_ENABLED_BOOL, false); @@ -859,6 +887,7 @@ public class CarrierConfigManager { // Used for Sim card State detection app sDefaults.putStringArray(KEY_SIM_PROVISIONING_STATUS_DETECTION_CARRIER_APP_STRING_ARRAY, null); + sDefaults.putBoolean(KEY_MAP_ANONYMOUS_TO_RESTRICTED_BOOL, true); } /** diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index f7bf9bd476bac8b57cfcc18724be97c321f5d0ec..23c73f96fa4c42c6618065cb4a1e5850281dd3b0 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -194,6 +194,62 @@ public class DisconnectCause { */ public static final int VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED = 50; + public static final int NO_CIRCUIT_AVAIL = 51; + public static final int NO_ROUTE_TO_DESTINAON = 52; + public static final int OPERATOR_DETERMINED_BARRING = 53; + public static final int CALL_FAIL_NO_USER_RESPONDING = 54; + public static final int CALL_FAIL_NO_ANSWER_FROM_USER = 55; + public static final int CALL_FAIL_DESTINATION_OUT_OF_ORDER = 56; + public static final int BEARER_CAPABILITY_NOT_AUTHORIZED = 57; + public static final int CHANNEL_UNACCEPTABLE = 58; + public static final int CALL_REJECTED = 59; + public static final int NUMBER_CHANGED = 60; + public static final int PREEMPTION = 61; + public static final int FACILITY_REJECTED = 62; + public static final int RESP_TO_STATUS_ENQUIRY = 63; + public static final int NORMAL_UNSPECIFIED = 64; + public static final int NETWORK_OUT_OF_ORDER = 65; + public static final int TEMPORARY_FAILURE = 66; + public static final int SWITCHING_EQUIPMENT_CONGESTION = 67; + public static final int ACCESS_INFORMATION_DISCARDED = 68; + public static final int REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE = 69; + public static final int RESOURCES_UNAVAILABLE_OR_UNSPECIFIED = 70; + public static final int QOS_UNAVAILABLE = 71; + public static final int REQUESTED_FACILITY_NOT_SUBSCRIBED = 72; + public static final int INCOMING_CALLS_BARRED_WITHIN_CUG = 73; + public static final int BEARER_CAPABILITY_UNAVAILABLE = 74; + public static final int SERVICE_OPTION_NOT_AVAILABLE = 75; + public static final int BEARER_SERVICE_NOT_IMPLEMENTED = 76; + public static final int REQUESTED_FACILITY_NOT_IMPLEMENTED = 77; + public static final int ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE = 78; + public static final int SERVICE_OR_OPTION_NOT_IMPLEMENTED = 79; + public static final int INVALID_TRANSACTION_IDENTIFIER = 80; + public static final int USER_NOT_MEMBER_OF_CUG = 81; + public static final int INCOMPATIBLE_DESTINATION = 82; + public static final int INVALID_TRANSIT_NW_SELECTION = 83; + public static final int SEMANTICALLY_INCORRECT_MESSAGE = 84; + public static final int INVALID_MANDATORY_INFORMATION = 85; + public static final int MESSAGE_TYPE_NON_IMPLEMENTED = 86; + public static final int MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 87; + public static final int INFORMATION_ELEMENT_NON_EXISTENT = 88; + public static final int CONDITIONAL_IE_ERROR = 89; + public static final int MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE = 90; + public static final int RECOVERY_ON_TIMER_EXPIRED = 91; + public static final int PROTOCOL_ERROR_UNSPECIFIED = 92; + public static final int INTERWORKING_UNSPECIFIED = 93; + public static final int LOCAL_LOW_BATTERY = 94; + public static final int LOW_BATTERY = 95; + + /** EMERGENCY call failed with temporary fail cause */ + public static final int EMERGENCY_TEMP_FAILURE = 96; + /** EMERGENCY call failed with permanent fail cause */ + public static final int EMERGENCY_PERM_FAILURE = 97; + + /** call failed due to LTE to 3G/2G handover not feasible */ + public static final int HO_NOT_FEASIBLE = 98; + + public static final int NON_SELECTED_USER_CLEARING = 99; + /** * Call was rejected due to number being blacklisted by user. * {@@hide} @@ -208,14 +264,14 @@ public class DisconnectCause { // 4) Update toString() with the newly added disconnect type. // 5) Update android.telecom.DisconnectCauseUtil with any mappings to a telecom.DisconnectCause. // - // NextId: 50 + // NextId: 100 //********************************************************************************************* /** Smallest valid value for call disconnect codes. */ public static final int MINIMUM_VALID_VALUE = NOT_DISCONNECTED; /** Largest valid value for call disconnect codes. */ - public static final int MAXIMUM_VALID_VALUE = VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED; + public static final int MAXIMUM_VALID_VALUE = NON_SELECTED_USER_CLEARING; /** Private constructor to avoid class instantiation. */ private DisconnectCause() { @@ -327,6 +383,104 @@ public class DisconnectCause { return "VIDEO_CALL_NOT_ALLOWED_WHILE_TTY_ENABLED"; case CALL_BLACKLISTED: return "CALL_BLACKLISTED"; + case NO_CIRCUIT_AVAIL: + return "NO_CIRCUIT_AVAIL"; + case NO_ROUTE_TO_DESTINAON: + return "NO_ROUTE_TO_DESTINAON"; + case OPERATOR_DETERMINED_BARRING: + return "OPERATOR_DETERMINED_BARRING"; + case CALL_FAIL_NO_USER_RESPONDING: + return "CALL_FAIL_NO_USER_RESPONDING"; + case CALL_FAIL_NO_ANSWER_FROM_USER: + return "CALL_FAIL_NO_ANSWER_FROM_USER"; + case CALL_FAIL_DESTINATION_OUT_OF_ORDER: + return "CALL_FAIL_DESTINATION_OUT_OF_ORDER"; + case BEARER_CAPABILITY_NOT_AUTHORIZED: + return "BEARER_CAPABILITY_NOT_AUTHORIZED"; + case CHANNEL_UNACCEPTABLE: + return "CHANNEL_UNACCEPTABLE"; + case CALL_REJECTED: + return "CALL_REJECTED"; + case NUMBER_CHANGED: + return "NUMBER_CHANGED"; + case PREEMPTION: + return "PREEMPTION"; + case FACILITY_REJECTED: + return "FACILITY_REJECTED"; + case RESP_TO_STATUS_ENQUIRY: + return "RESP_TO_STATUS_ENQUIRY"; + case NORMAL_UNSPECIFIED: + return "NORMAL_UNSPECIFIED"; + case NETWORK_OUT_OF_ORDER: + return "NETWORK_OUT_OF_ORDER"; + case TEMPORARY_FAILURE: + return "TEMPORARY_FAILURE"; + case SWITCHING_EQUIPMENT_CONGESTION: + return "SWITCHING_EQUIPMENT_CONGESTION"; + case ACCESS_INFORMATION_DISCARDED: + return "ACCESS_INFORMATION_DISCARDED"; + case REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE: + return "REQUESTED_CIRCUIT_OR_CHANNEL_NOT_AVAILABLE"; + case RESOURCES_UNAVAILABLE_OR_UNSPECIFIED: + return "RESOURCES_UNAVAILABLE_OR_UNSPECIFIED"; + case QOS_UNAVAILABLE: + return "QOS_UNAVAILABLE"; + case REQUESTED_FACILITY_NOT_SUBSCRIBED: + return "REQUESTED_FACILITY_NOT_SUBSCRIBED"; + case INCOMING_CALLS_BARRED_WITHIN_CUG: + return "INCOMING_CALLS_BARRED_WITHIN_CUG"; + case BEARER_CAPABILITY_UNAVAILABLE: + return "BEARER_CAPABILITY_UNAVAILABLE"; + case SERVICE_OPTION_NOT_AVAILABLE: + return "SERVICE_OPTION_NOT_AVAILABLE"; + case BEARER_SERVICE_NOT_IMPLEMENTED: + return "BEARER_SERVICE_NOT_IMPLEMENTED"; + case REQUESTED_FACILITY_NOT_IMPLEMENTED: + return "REQUESTED_FACILITY_NOT_IMPLEMENTED"; + case ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE: + return "ONLY_DIGITAL_INFORMATION_BEARER_AVAILABLE"; + case SERVICE_OR_OPTION_NOT_IMPLEMENTED: + return "SERVICE_OR_OPTION_NOT_IMPLEMENTED"; + case INVALID_TRANSACTION_IDENTIFIER: + return "INVALID_TRANSACTION_IDENTIFIER"; + case USER_NOT_MEMBER_OF_CUG: + return "USER_NOT_MEMBER_OF_CUG"; + case INCOMPATIBLE_DESTINATION: + return "INCOMPATIBLE_DESTINATION"; + case INVALID_TRANSIT_NW_SELECTION: + return "INVALID_TRANSIT_NW_SELECTION"; + case SEMANTICALLY_INCORRECT_MESSAGE: + return "SEMANTICALLY_INCORRECT_MESSAGE"; + case INVALID_MANDATORY_INFORMATION: + return "INVALID_MANDATORY_INFORMATION"; + case MESSAGE_TYPE_NON_IMPLEMENTED: + return "MESSAGE_TYPE_NON_IMPLEMENTED"; + case MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE: + return "MESSAGE_TYPE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE"; + case INFORMATION_ELEMENT_NON_EXISTENT: + return "INFORMATION_ELEMENT_NON_EXISTENT"; + case CONDITIONAL_IE_ERROR: + return "CONDITIONAL_IE_ERROR"; + case MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE: + return "MESSAGE_NOT_COMPATIBLE_WITH_PROTOCOL_STATE"; + case RECOVERY_ON_TIMER_EXPIRED: + return "RECOVERY_ON_TIMER_EXPIRED"; + case PROTOCOL_ERROR_UNSPECIFIED: + return "PROTOCOL_ERROR_UNSPECIFIED"; + case INTERWORKING_UNSPECIFIED: + return "INTERWORKING_UNSPECIFIED"; + case LOCAL_LOW_BATTERY: + return "LOCAL_LOW_BATTERY"; + case LOW_BATTERY: + return "LOW_BATTERY"; + case EMERGENCY_TEMP_FAILURE: + return "EMERGENCY_TEMP_FAILURE"; + case EMERGENCY_PERM_FAILURE: + return "EMERGENCY_PERM_FAILURE"; + case HO_NOT_FEASIBLE: + return "HO_NOT_FEASIBLE"; + case NON_SELECTED_USER_CLEARING: + return "NON_SELECTED_USER_CLEARING"; default: return "INVALID: " + cause; } diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index 962a600360b892ac2d6ff209ff47a8df2bb6b655..781e5c43884b3741bb28308ca7422b00d7fc4512 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -25,6 +25,7 @@ import com.android.i18n.phonenumbers.ShortNumberUtil; import android.content.Context; import android.content.Intent; import android.database.Cursor; +import android.location.Country; import android.location.CountryDetector; import android.net.Uri; import android.os.SystemProperties; @@ -77,6 +78,7 @@ public class PhoneNumberUtils static final String LOG_TAG = "PhoneNumberUtils"; private static final boolean DBG = false; + private static Country sCountryDetector = null; /* * global-phone-number = ["+"] 1*( DIGIT / written-sep ) * written-sep = ("-"/".") @@ -2055,12 +2057,9 @@ public class PhoneNumberUtils private static boolean isLocalEmergencyNumberInternal(int subId, String number, Context context, boolean useExactMatch) { - String countryIso; - CountryDetector detector = (CountryDetector) context.getSystemService( - Context.COUNTRY_DETECTOR); - if (detector != null && detector.detectCountry() != null) { - countryIso = detector.detectCountry().getCountryIso(); - } else { + String countryIso = getCountryIso(context); + Rlog.w(LOG_TAG, "isLocalEmergencyNumberInternal" + countryIso); + if (countryIso == null) { Locale locale = context.getResources().getConfiguration().locale; countryIso = locale.getCountry(); Rlog.w(LOG_TAG, "No CountryDetector; falling back to countryIso based on locale: " @@ -2069,6 +2068,28 @@ public class PhoneNumberUtils return isEmergencyNumberInternal(subId, number, countryIso, useExactMatch); } + private static String getCountryIso(Context context) { + Rlog.w(LOG_TAG, "getCountryIso " + sCountryDetector); + if (sCountryDetector == null) { + CountryDetector detector = (CountryDetector) context.getSystemService( + Context.COUNTRY_DETECTOR); + if (detector != null) { + sCountryDetector = detector.detectCountry(); + } + } + + if (sCountryDetector == null) { + return null; + } else { + return sCountryDetector.getCountryIso(); + } + } + + /** @hide */ + public static void resetCountryDetectorInfo() { + sCountryDetector = null; + } + /** * isVoiceMailNumber: checks a given number against the voicemail * number provided by the RIL and SIM card. The caller must have diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java index 2bfaf1bfd86daf3a3d361e92d5f827c1e4c09d25..af07c9724c6dd0339a25441815199563bf18cfe5 100644 --- a/telephony/java/android/telephony/RadioAccessFamily.java +++ b/telephony/java/android/telephony/RadioAccessFamily.java @@ -47,6 +47,7 @@ public class RadioAccessFamily implements Parcelable { public static final int RAF_HSPAP = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP); public static final int RAF_GSM = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_GSM); public static final int RAF_TD_SCDMA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_TD_SCDMA); + public static final int RAF_LTE_CA = (1 << ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA); // Grouping of RAFs private static final int GSM = RAF_GSM | RAF_GPRS | RAF_EDGE; @@ -54,6 +55,7 @@ public class RadioAccessFamily implements Parcelable { private static final int CDMA = RAF_IS95A | RAF_IS95B | RAF_1xRTT; private static final int EVDO = RAF_EVDO_0 | RAF_EVDO_A | RAF_EVDO_B | RAF_EHRPD; private static final int WCDMA = HS | RAF_UMTS; + private static final int LTE = RAF_LTE | RAF_LTE_CA; /* Phone ID of phone */ private int mPhoneId; @@ -162,19 +164,19 @@ public class RadioAccessFamily implements Parcelable { raf = CDMA | EVDO; break; case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: - raf = RAF_LTE | CDMA | EVDO; + raf = LTE | CDMA | EVDO; break; case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: - raf = RAF_LTE | GSM | WCDMA; + raf = LTE | GSM | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA: - raf = RAF_LTE | CDMA | EVDO | GSM | WCDMA; + raf = LTE | CDMA | EVDO | GSM | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_ONLY: - raf = RAF_LTE; + raf = LTE; break; case RILConstants.NETWORK_MODE_LTE_WCDMA: - raf = RAF_LTE | WCDMA; + raf = LTE | WCDMA; break; case RILConstants.NETWORK_MODE_CDMA_NO_EVDO: raf = CDMA; @@ -192,28 +194,28 @@ public class RadioAccessFamily implements Parcelable { raf = RAF_TD_SCDMA | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_TDSCDMA: - raf = RAF_LTE | RAF_TD_SCDMA; + raf = LTE | RAF_TD_SCDMA; break; case RILConstants.NETWORK_MODE_TDSCDMA_GSM: raf = RAF_TD_SCDMA | GSM; break; case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM: - raf = RAF_LTE | RAF_TD_SCDMA | GSM; + raf = LTE | RAF_TD_SCDMA | GSM; break; case RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA: raf = RAF_TD_SCDMA | GSM | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA: - raf = RAF_LTE | RAF_TD_SCDMA | WCDMA; + raf = LTE | RAF_TD_SCDMA | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA: - raf = RAF_LTE | RAF_TD_SCDMA | GSM | WCDMA; + raf = LTE | RAF_TD_SCDMA | GSM | WCDMA; break; case RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: raf = RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA; break; case RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA: - raf = RAF_LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA; + raf = LTE | RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA; break; default: raf = RAF_UNKNOWN; @@ -232,6 +234,7 @@ public class RadioAccessFamily implements Parcelable { raf = ((WCDMA & raf) > 0) ? (WCDMA | raf) : raf; raf = ((CDMA & raf) > 0) ? (CDMA | raf) : raf; raf = ((EVDO & raf) > 0) ? (EVDO | raf) : raf; + raf = ((LTE & raf) > 0) ? (LTE | raf) : raf; return raf; } @@ -254,19 +257,19 @@ public class RadioAccessFamily implements Parcelable { case (CDMA | EVDO): type = RILConstants.NETWORK_MODE_CDMA; break; - case (RAF_LTE | CDMA | EVDO): + case (LTE | CDMA | EVDO): type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO; break; - case (RAF_LTE | GSM | WCDMA): + case (LTE | GSM | WCDMA): type = RILConstants.NETWORK_MODE_LTE_GSM_WCDMA; break; - case (RAF_LTE | CDMA | EVDO | GSM | WCDMA): + case (LTE | CDMA | EVDO | GSM | WCDMA): type = RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA; break; - case RAF_LTE: + case LTE: type = RILConstants.NETWORK_MODE_LTE_ONLY; break; - case (RAF_LTE | WCDMA): + case (LTE | WCDMA): type = RILConstants.NETWORK_MODE_LTE_WCDMA; break; case CDMA: @@ -284,28 +287,28 @@ public class RadioAccessFamily implements Parcelable { case (RAF_TD_SCDMA | WCDMA): type = RILConstants.NETWORK_MODE_TDSCDMA_WCDMA; break; - case (RAF_LTE | RAF_TD_SCDMA): + case (LTE | RAF_TD_SCDMA): type = RILConstants.NETWORK_MODE_LTE_TDSCDMA; break; case (RAF_TD_SCDMA | GSM): type = RILConstants.NETWORK_MODE_TDSCDMA_GSM; break; - case (RAF_LTE | RAF_TD_SCDMA | GSM): + case (LTE | RAF_TD_SCDMA | GSM): type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM; break; case (RAF_TD_SCDMA | GSM | WCDMA): type = RILConstants.NETWORK_MODE_TDSCDMA_GSM_WCDMA; break; - case (RAF_LTE | RAF_TD_SCDMA | WCDMA): + case (LTE | RAF_TD_SCDMA | WCDMA): type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_WCDMA; break; - case (RAF_LTE | RAF_TD_SCDMA | GSM | WCDMA): + case (LTE | RAF_TD_SCDMA | GSM | WCDMA): type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA; break; case (RAF_TD_SCDMA | CDMA | EVDO | GSM | WCDMA): type = RILConstants.NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; break; - case (RAF_LTE | RAF_TD_SCDMA | RAF_LTE | CDMA | EVDO | GSM | WCDMA): + case (LTE | RAF_TD_SCDMA | RAF_LTE | CDMA | EVDO | GSM | WCDMA): type = RILConstants.NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA; break; default: @@ -339,6 +342,7 @@ public class RadioAccessFamily implements Parcelable { case "CDMA": return CDMA; case "EVDO": return EVDO; case "WCDMA": return WCDMA; + case "LTE_CA": return RAF_LTE_CA; default: return RAF_UNKNOWN; } } diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 39a9295ed8b67e2eb60ce0fa4a8a08ee4a82072a..4741981ebabe7d2c15f5836c855c76ef3f7119ff 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -165,6 +165,12 @@ public class ServiceState implements Parcelable { | (1 << (RIL_RADIO_TECHNOLOGY_EVDO_B - 1)) | (1 << (RIL_RADIO_TECHNOLOGY_EHRPD - 1)); + /** + * LTE_CA + * @hide + */ + public static final int RIL_RADIO_TECHNOLOGY_LTE_CA = 19; + /** * Available registration states for GSM, UMTS and CDMA. */ @@ -223,6 +229,7 @@ public class ServiceState implements Parcelable { private int mRilVoiceRadioTechnology; private int mRilDataRadioTechnology; + private int mRilImsRadioTechnology = RIL_RADIO_TECHNOLOGY_UNKNOWN; private boolean mCssIndicator; private int mNetworkId; @@ -312,6 +319,7 @@ public class ServiceState implements Parcelable { mCdmaEriIconMode = s.mCdmaEriIconMode; mIsEmergencyOnly = s.mIsEmergencyOnly; mIsDataRoamingFromRegistration = s.mIsDataRoamingFromRegistration; + mRilImsRadioTechnology = s.mRilImsRadioTechnology; } /** @@ -340,6 +348,7 @@ public class ServiceState implements Parcelable { mCdmaEriIconMode = in.readInt(); mIsEmergencyOnly = in.readInt() != 0; mIsDataRoamingFromRegistration = in.readInt() != 0; + mRilImsRadioTechnology = in.readInt(); } public void writeToParcel(Parcel out, int flags) { @@ -365,6 +374,7 @@ public class ServiceState implements Parcelable { out.writeInt(mCdmaEriIconMode); out.writeInt(mIsEmergencyOnly ? 1 : 0); out.writeInt(mIsDataRoamingFromRegistration ? 1 : 0); + out.writeInt(mRilImsRadioTechnology); } public int describeContents() { @@ -674,7 +684,8 @@ public class ServiceState implements Parcelable { && equalsHandlesNulls(mCdmaDefaultRoamingIndicator, s.mCdmaDefaultRoamingIndicator) && mIsEmergencyOnly == s.mIsEmergencyOnly - && mIsDataRoamingFromRegistration == s.mIsDataRoamingFromRegistration); + && mIsDataRoamingFromRegistration == s.mIsDataRoamingFromRegistration + && mRilImsRadioTechnology == s.mRilImsRadioTechnology); } /** @@ -746,6 +757,9 @@ public class ServiceState implements Parcelable { case RIL_RADIO_TECHNOLOGY_TD_SCDMA: rtString = "TD-SCDMA"; break; + case RIL_RADIO_TECHNOLOGY_LTE_CA: + rtString = "LTE_CA"; + break; default: rtString = "Unexpected"; Rlog.w(LOG_TAG, "Unexpected radioTechnology=" + rt); @@ -779,7 +793,8 @@ public class ServiceState implements Parcelable { + " RoamInd=" + mCdmaRoamingIndicator + " DefRoamInd=" + mCdmaDefaultRoamingIndicator + " EmergOnly=" + mIsEmergencyOnly - + " IsDataRoamingFromRegistration=" + mIsDataRoamingFromRegistration); + + " IsDataRoamingFromRegistration=" + mIsDataRoamingFromRegistration + + " mRilImsRadioTechnology=" + mRilImsRadioTechnology); } private void setNullState(int state) { @@ -806,6 +821,7 @@ public class ServiceState implements Parcelable { mCdmaEriIconMode = -1; mIsEmergencyOnly = false; mIsDataRoamingFromRegistration = false; + mRilImsRadioTechnology = RIL_RADIO_TECHNOLOGY_UNKNOWN; } public void setStateOutOfService() { @@ -1008,6 +1024,7 @@ public class ServiceState implements Parcelable { m.putInt("cdmaDefaultRoamingIndicator", mCdmaDefaultRoamingIndicator); m.putBoolean("emergencyOnly", Boolean.valueOf(mIsEmergencyOnly)); m.putBoolean("isDataRoamingFromRegistration", Boolean.valueOf(mIsDataRoamingFromRegistration)); + m.putInt("imsRadioTechnology", mRilImsRadioTechnology); } /** @hide */ @@ -1088,6 +1105,8 @@ public class ServiceState implements Parcelable { return TelephonyManager.NETWORK_TYPE_TD_SCDMA; case ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN: return TelephonyManager.NETWORK_TYPE_IWLAN; + case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: + return TelephonyManager.NETWORK_TYPE_LTE_CA; default: return TelephonyManager.NETWORK_TYPE_UNKNOWN; } @@ -1139,7 +1158,9 @@ public class ServiceState implements Parcelable { || radioTechnology == RIL_RADIO_TECHNOLOGY_HSPAP || radioTechnology == RIL_RADIO_TECHNOLOGY_GSM || radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA - || radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN; + || radioTechnology == RIL_RADIO_TECHNOLOGY_IWLAN + || radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA; + } /** @hide */ @@ -1215,4 +1236,14 @@ public class ServiceState implements Parcelable { return newSs; } + + /** @hide */ + public int getRilImsRadioTechnology() { + return mRilImsRadioTechnology; + } + + /** @hide */ + public void setRilImsRadioTechnology(int imsRadioTechnology) { + mRilImsRadioTechnology = imsRadioTechnology; + } } diff --git a/telephony/java/android/telephony/SignalStrength.java b/telephony/java/android/telephony/SignalStrength.java index fced6670f6a3eb8f991e4a45e982fcda055b485e..3501ab7757b82861adabaa9f8abb8bd87c261f64 100644 --- a/telephony/java/android/telephony/SignalStrength.java +++ b/telephony/java/android/telephony/SignalStrength.java @@ -619,19 +619,37 @@ public class SignalStrength implements Parcelable { * @hide */ public int getGsmLevel() { - int level; + int level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_regional_umts_singnal_threshold)) { + int dbm = getGsmDbm(); + int[] threshGsm; + threshGsm = Resources.getSystem().getIntArray( + com.android.internal.R.array.umts_signal_strength_threshold);; + if (threshGsm.length < 6) + return level; + if (dbm > threshGsm[5]) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (dbm >= threshGsm[4]) level = SIGNAL_STRENGTH_GREAT; + else if (dbm >= threshGsm[3]) level = SIGNAL_STRENGTH_GOOD; + else if (dbm >= threshGsm[2]) level = SIGNAL_STRENGTH_MODERATE; + else if (dbm >= threshGsm[1]) level = SIGNAL_STRENGTH_POOR; + else if (dbm >= threshGsm[0]) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (DBG) log("getCustomizedGsmDbmLevel - dbm:" + dbm + " gsmLevel:" + + level); + } else { + // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 + // asu = 0 (-113dB or less) is very weak + // signal, its better to show 0 bars to the user in such cases. + // asu = 99 is a special case, where the signal strength is unknown. + int asu = getGsmSignalStrength(); + if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT; + else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD; + else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE; + else level = SIGNAL_STRENGTH_POOR; + if (DBG) log("getGsmLevel=" + level); + } - // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5 - // asu = 0 (-113dB or less) is very weak - // signal, its better to show 0 bars to the user in such cases. - // asu = 99 is a special case, where the signal strength is unknown. - int asu = getGsmSignalStrength(); - if (asu <= 2 || asu == 99) level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; - else if (asu >= 12) level = SIGNAL_STRENGTH_GREAT; - else if (asu >= 8) level = SIGNAL_STRENGTH_GOOD; - else if (asu >= 5) level = SIGNAL_STRENGTH_MODERATE; - else level = SIGNAL_STRENGTH_POOR; - if (DBG) log("getGsmLevel=" + level); return level; } @@ -799,6 +817,11 @@ public class SignalStrength implements Parcelable { } else { threshRsrp = RSRP_THRESH_LENIENT; } + if (Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_regional_lte_singnal_threshold)){ + threshRsrp = Resources.getSystem().getIntArray( + com.android.internal.R.array.lte_signal_strength_threshold); + } if (mLteRsrp > threshRsrp[5]) rsrpIconLevel = -1; else if (mLteRsrp >= threshRsrp[4]) rsrpIconLevel = SIGNAL_STRENGTH_GREAT; @@ -807,6 +830,12 @@ public class SignalStrength implements Parcelable { else if (mLteRsrp >= threshRsrp[1]) rsrpIconLevel = SIGNAL_STRENGTH_POOR; else if (mLteRsrp >= threshRsrp[0]) rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; + if (Resources.getSystem().getBoolean( + com.android.internal.R.bool.config_regional_lte_singnal_threshold)){ + log("getLTELevel - rsrp = " + rsrpIconLevel); + if (rsrpIconLevel != -1) return rsrpIconLevel; + } + /* * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5 * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 5a9b82b7e927e9413c184ef95d6ced47780503a3..7140abf653a69af278affa4d0475ccd6fe111f11 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -744,6 +744,9 @@ public class TelephonyManager { */ public static final String VVM_TYPE_CVVM = "vvm_type_cvvm"; + /** {@hide} */ + public static final String EMR_DIAL_ACCOUNT = "emr_dial_account"; + // // // Device Info @@ -816,6 +819,7 @@ public class TelephonyManager { * @param slotId of which deviceID is returned */ public String getDeviceId(int slotId) { + android.util.SeempLog.record_str(8, ""+slotId); // FIXME this assumes phoneId == slotId try { IPhoneSubInfo info = getSubscriberInfo(); @@ -911,6 +915,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#ACCESS_COARSE_LOCATION ACCESS_FINE_LOCATION}. */ public CellLocation getCellLocation() { + android.util.SeempLog.record(49); try { ITelephony telephony = getITelephony(); if (telephony == null) { @@ -1008,6 +1013,7 @@ public class TelephonyManager { */ @Deprecated public List getNeighboringCellInfo() { + android.util.SeempLog.record(50); try { ITelephony telephony = getITelephony(); if (telephony == null) @@ -1457,7 +1463,8 @@ public class TelephonyManager { public static final int NETWORK_TYPE_TD_SCDMA = 17; /** Current network is IWLAN {@hide} */ public static final int NETWORK_TYPE_IWLAN = 18; - + /** Current network is LTE_CA {@hide} */ + public static final int NETWORK_TYPE_LTE_CA = 19; /** * @return the NETWORK_TYPE_xxxx for current data connection. */ @@ -1553,7 +1560,7 @@ public class TelephonyManager { * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} */ public int getDataNetworkType() { - return getDataNetworkType(getSubId()); + return getDataNetworkType(getDefaultDataSubscriptionId()); } /** @@ -1660,6 +1667,7 @@ public class TelephonyManager { return NETWORK_CLASS_3_G; case NETWORK_TYPE_LTE: case NETWORK_TYPE_IWLAN: + case NETWORK_TYPE_LTE_CA: return NETWORK_CLASS_4_G; default: return NETWORK_CLASS_UNKNOWN; @@ -1723,6 +1731,8 @@ public class TelephonyManager { return "TD_SCDMA"; case NETWORK_TYPE_IWLAN: return "IWLAN"; + case NETWORK_TYPE_LTE_CA: + return "LTE_CA"; default: return "UNKNOWN"; } @@ -2016,6 +2026,7 @@ public class TelephonyManager { * @hide */ public String getSimSerialNumber(int subId) { + android.util.SeempLog.record_str(388, ""+subId); try { IPhoneSubInfo info = getSubscriberInfo(); if (info == null) @@ -2120,6 +2131,7 @@ public class TelephonyManager { * @hide */ public String getSubscriberId(int subId) { + android.util.SeempLog.record_str(389, ""+subId); try { IPhoneSubInfo info = getSubscriberInfo(); if (info == null) @@ -2208,6 +2220,7 @@ public class TelephonyManager { * @hide */ public String getLine1Number(int subId) { + android.util.SeempLog.record_str(9, ""+subId); String number = null; try { ITelephony telephony = getITelephony(); @@ -3087,6 +3100,28 @@ public class TelephonyManager { return null; } + /** + * Opens a logical channel to the ICC card for the given subId + * + * @param subId subid to send the command to + * @param AID applcation id. See ETSI 102.221 and 101.220. + * @param p2 byte P2 parameter + * @return an IccOpenLogicalChannelResponse object + * @hide + */ + public IccOpenLogicalChannelResponse iccOpenLogicalChannel(int subId, + String AID, byte p2) { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.iccOpenLogicalChannelWithP2(subId, AID, p2); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + } + return null; + } + /** * Closes a previously opened logical channel to the ICC card. * @@ -3472,6 +3507,13 @@ public class TelephonyManager { return SubscriptionManager.getDefaultSubscriptionId(); } + /** + * Returns Default Data subscription. + */ + private static int getDefaultDataSubscriptionId() { + return SubscriptionManager.getDefaultDataSubscriptionId(); + } + /** * Returns Default phone. */ @@ -4552,7 +4594,7 @@ public class TelephonyManager { /** @hide */ @SystemApi public void setDataEnabled(boolean enable) { - setDataEnabled(SubscriptionManager.getDefaultDataSubscriptionId(), enable); + setDataEnabled(getDefaultDataSubscriptionId(), enable); } /** @hide */ @@ -4571,7 +4613,7 @@ public class TelephonyManager { /** @hide */ @SystemApi public boolean getDataEnabled() { - return getDataEnabled(SubscriptionManager.getDefaultDataSubscriptionId()); + return getDataEnabled(getDefaultDataSubscriptionId()); } /** @hide */ @@ -4780,7 +4822,7 @@ public class TelephonyManager { } catch (NullPointerException ex) { return false; } - } + } /** * Returns the Status of video telephony (VT) @@ -4810,6 +4852,37 @@ public class TelephonyManager { } } + /** + * Returns the Status of VOWIFI calling + * using subId + * @hide + */ + public boolean isVoWifiCallingAvailableForSubscriber(int subId) { + try { + return getITelephony().isVoWifiCallingAvailableForSubscriber(subId); + } catch (RemoteException ex) { + return false; + } catch (NullPointerException ex) { + return false; + } + } + + /** + * Returns the Status of Video telephony wifi calling + * using subId + * @hide + */ + public boolean isVideoTelephonyWifiCallingAvailableForSubscriber(int subId) { + try { + return getITelephony() + .isVideoTelephonyWifiCallingAvailableForSubscriber(subId); + } catch (RemoteException ex) { + return false; + } catch (NullPointerException ex) { + return false; + } + } + /** * Set TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC for the default phone. * diff --git a/telephony/java/com/android/ims/internal/IImsUt.aidl b/telephony/java/com/android/ims/internal/IImsUt.aidl index 4ab5ee3c4f8c703627eb5de9d3bf3da011f281b1..e259938121a22ec1432a7375f04258eb93a0a22d 100644 --- a/telephony/java/com/android/ims/internal/IImsUt.aidl +++ b/telephony/java/com/android/ims/internal/IImsUt.aidl @@ -111,4 +111,9 @@ interface IImsUt { * Sets the listener. */ void setListener(in IImsUtListener listener); + + /** + * Retrieves the configuration of the call forward for specified service class. + */ + int queryCFForServiceClass(int condition, String number, int serviceClass); } diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java index 5f3f773b062cc03c13bbfe608513eee9dfe6b289..73140073bbb2f9fbf2939b9973728cdebbc22436 100644 --- a/telephony/java/com/android/internal/telephony/CallerInfo.java +++ b/telephony/java/com/android/internal/telephony/CallerInfo.java @@ -171,6 +171,7 @@ public class CallerInfo { * number. The returned CallerInfo is null if no number is supplied. */ public static CallerInfo getCallerInfo(Context context, Uri contactRef, Cursor cursor) { + android.util.SeempLog.record_uri(12, contactRef); CallerInfo info = new CallerInfo(); info.photoResource = 0; info.phoneLabel = null; @@ -343,6 +344,7 @@ public class CallerInfo { * with all relevant fields empty or null. */ public static CallerInfo getCallerInfo(Context context, String number, int subId) { + android.util.SeempLog.record_str(12, "number="+number+",subId="+subId); if (TextUtils.isEmpty(number)) { return null; diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index 70a8653135c822cc665699dd4ed5da87ec30e770..13777348a09404414b04874b9bee69718fcca81e 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -186,6 +186,53 @@ interface ISms { in String destAddr, in String scAddr, in String text, in PendingIntent sentIntent, in PendingIntent deliveryIntent); + /** + * Send an SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destAddr the address to send the message to + * @param scAddr the SMSC to send the message through, or NULL for the + * default SMSC + * @param text the body of the message to send + * @param sentIntent if not NULL this PendingIntent is + * broadcast when the message is sucessfully sent, or failed. + * The result code will be Activity.RESULT_OK for success, + * or one of these errors:
+ * RESULT_ERROR_GENERIC_FAILURE
+ * RESULT_ERROR_RADIO_OFF
+ * RESULT_ERROR_NULL_PDU
+ * For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.
+ * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntent if not NULL this PendingIntent is + * broadcast when the message is delivered to the recipient. The + * raw pdu of the status report is in the extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param isExpectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendTextForSubscriberWithOptions(in int subId, String callingPkg, in String destAddr, + in String scAddr, in String text, in PendingIntent sentIntent, + in PendingIntent deliveryIntent, in int priority, in boolean isExpectMore, + in int validityPeriod); + /** * Inject an SMS PDU into the android platform. * @@ -233,6 +280,51 @@ interface ISms { in List parts, in List sentIntents, in List deliveryIntents, in boolean persistMessageForNonDefaultSmsApp); + /** + * Send a multi-part text based SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param parts an ArrayList of strings that, in order, + * comprise the original message + * @param sentIntents if not null, an ArrayList of + * PendingIntents (one for each message part) that is + * broadcast when the corresponding message part has been sent. + * The result code will be Activity.RESULT_OK for success, + * or one of these errors: + * RESULT_ERROR_GENERIC_FAILURE + * RESULT_ERROR_RADIO_OFF + * RESULT_ERROR_NULL_PDU. + * @param deliveryIntents if not null, an ArrayList of + * PendingIntents (one for each message part) that is + * broadcast when the corresponding message part has been delivered + * to the recipient. The raw pdu of the status report is in the + * extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param isExpectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendMultipartTextForSubscriberWithOptions(in int subId, String callingPkg, + in String destinationAddress, in String scAddress, in List parts, + in List sentIntents, in List deliveryIntents, + in int priority, in boolean isExpectMore, in int validityPeriod); + /** * Enable reception of cell broadcast (SMS-CB) messages with the given * message identifier and RAN type. The RAN type specify this message ID @@ -447,4 +539,12 @@ interface ISms { void sendStoredMultipartText(int subId, String callingPkg, in Uri messageUri, String scAddress, in List sentIntents, in List deliveryIntents); + + /** + * Get the capacity count of sms on Icc card. + * + * @param subId for subId which getSmsCapacityOnIcc is queried. + * @return capacity of ICC + */ + int getSmsCapacityOnIccForSubscriber(int subId); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 99dc8aaeb58e5eb44744f05f62a81fdf7dc2f725..f305422bc4df0b7a428a4500ecb806e1de59a8aa 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -551,6 +551,16 @@ interface ITelephony { */ IccOpenLogicalChannelResponse iccOpenLogicalChannel(int subId, String AID); + /** + * Opens a logical channel to the ICC card for a particular subID + * + * @param subId user preferred subId. + * @param p2 P2 parameter + * @param AID Application id. See ETSI 102.221 and 101.220 + */ + IccOpenLogicalChannelResponse iccOpenLogicalChannelWithP2(int subId, + String AID, byte p2); + /** * Closes a previously opened logical channel to the ICC card. * @@ -978,6 +988,12 @@ interface ITelephony { */ boolean isWifiCallingAvailable(); + /* + * Returns the Status of VOWIFI calling + * using subId + */ + boolean isVoWifiCallingAvailableForSubscriber(int subId); + /** * Returns the Status of Volte */ @@ -988,6 +1004,12 @@ interface ITelephony { */ boolean isVideoTelephonyAvailable(); + /** + * Returns the Status of Video telephony wifi calling + * using subId + */ + boolean isVideoTelephonyWifiCallingAvailableForSubscriber(int subId); + /** * Returns the unique device ID of phone, for example, the IMEI for * GSM and the MEID for CDMA phones. Return null if device ID is not available. @@ -1073,4 +1095,10 @@ interface ITelephony { * Returns a list of packages that have carrier privileges. */ List getPackagesWithCarrierPrivileges(); + + /** + * Get ATR (Answer To Reset; as per ISO/IEC 7816-4) from SIM card + * for a particular subId. + */ + byte[] getAtr(int subId); } diff --git a/telephony/java/com/android/internal/telephony/OperatorInfo.java b/telephony/java/com/android/internal/telephony/OperatorInfo.java index a29d7c161990f9bfe8f4761b0499fc51e2cec146..f9f939c7e615ca42f0c3d959968d41e73f364689 100644 --- a/telephony/java/com/android/internal/telephony/OperatorInfo.java +++ b/telephony/java/com/android/internal/telephony/OperatorInfo.java @@ -33,6 +33,7 @@ public class OperatorInfo implements Parcelable { private String mOperatorAlphaLong; private String mOperatorAlphaShort; private String mOperatorNumeric; + private String mRadioTech; private State mState = State.UNKNOWN; @@ -57,6 +58,11 @@ public class OperatorInfo implements Parcelable { return mState; } + public String + getRadioTech() { + return mRadioTech; + } + OperatorInfo(String operatorAlphaLong, String operatorAlphaShort, String operatorNumeric, @@ -65,6 +71,14 @@ public class OperatorInfo implements Parcelable { mOperatorAlphaLong = operatorAlphaLong; mOperatorAlphaShort = operatorAlphaShort; mOperatorNumeric = operatorNumeric; + mRadioTech = ""; + /* operatorNumeric format: PLMN+RAT or PLMN */ + if (null != operatorNumeric) { + String values[] = operatorNumeric.split("\\+"); + mOperatorNumeric = values[0]; + if (values.length > 1) + mRadioTech = values[1]; + } mState = state; } @@ -108,6 +122,7 @@ public class OperatorInfo implements Parcelable { return "OperatorInfo " + mOperatorAlphaLong + "/" + mOperatorAlphaShort + "/" + mOperatorNumeric + + "/" + mRadioTech + "/" + mState; } @@ -132,7 +147,10 @@ public class OperatorInfo implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeString(mOperatorAlphaLong); dest.writeString(mOperatorAlphaShort); - dest.writeString(mOperatorNumeric); + if (mRadioTech.equals("")) + dest.writeString(mOperatorNumeric); + else + dest.writeString(mOperatorNumeric + "+" + mRadioTech); dest.writeSerializable(mState); } diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index cfc5305c01dceb249ce83ef87cee7cc44e728a8b..d06df49754b60eee5ec171ffa4f43f6611df5267 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -25,6 +25,7 @@ package com.android.internal.telephony; */ import android.os.SystemProperties; +import android.telephony.TelephonyManager; /** * {@hide} @@ -105,6 +106,7 @@ public interface RILConstants { int DEVICE_IN_USE = 64; /* Operation cannot be performed because the device is currently in use */ int ABORTED = 65; /* Operation aborted */ + int INVALID_PARAMETER = 66; // Below is list of OEM specific error codes which can by used by OEMs in case they don't want to // reveal particular replacement for Generic failure int OEM_ERROR_1 = 501; @@ -160,8 +162,10 @@ public interface RILConstants { int NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA = 20; /* TD-SCDMA, GSM/WCDMA and LTE */ int NETWORK_MODE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 21; /*TD-SCDMA,EvDo,CDMA,GSM/WCDMA*/ int NETWORK_MODE_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA = 22; /* TD-SCDMA/LTE/GSM/WCDMA, CDMA, and EvDo */ - int PREFERRED_NETWORK_MODE = SystemProperties.getInt("ro.telephony.default_network", - NETWORK_MODE_WCDMA_PREF); + + int PREFERRED_NETWORK_MODE = Integer.parseInt(TelephonyManager.getTelephonyProperty(0, + "ro.telephony.default_network", + Integer.toString(NETWORK_MODE_WCDMA_PREF))); int BAND_MODE_UNSPECIFIED = 0; //"unspecified" (selected by baseband automatically) int BAND_MODE_EURO = 1; //"EURO band" (GSM-900 / DCS-1800 / WCDMA-IMT-2000) @@ -409,6 +413,10 @@ cat include/telephony/ril.h | \ int RIL_REQUEST_STOP_LCE = 133; int RIL_REQUEST_PULL_LCEDATA = 134; int RIL_REQUEST_GET_ACTIVITY_INFO = 135; + int RIL_REQUEST_SIM_GET_ATR = 136; + int RIL_REQUEST_CAF_SIM_OPEN_CHANNEL_WITH_P2 = 137; + int RIL_REQUEST_GET_ADN_RECORD = 138; + int RIL_REQUEST_UPDATE_ADN_RECORD = 139; int RIL_RESPONSE_ACKNOWLEDGEMENT = 800; @@ -459,4 +467,6 @@ cat include/telephony/ril.h | \ int RIL_UNSOL_ON_SS = 1043; int RIL_UNSOL_STK_CC_ALPHA_NOTIFY = 1044; int RIL_UNSOL_LCEDATA_RECV = 1045; + int RIL_UNSOL_RESPONSE_ADN_INIT_DONE = 1046; + int RIL_UNSOL_RESPONSE_ADN_RECORDS = 1047; } diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java index 0a6fc9982d990f53fd2ed1b754e1c68dd9f1c159..1d8ad82174fbd983bc23ebcd402e4604cf4e626c 100644 --- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java +++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java @@ -223,4 +223,43 @@ public interface TelephonyProperties */ static final String PROPERTY_VIDEOCALL_AUDIO_OUTPUT = "persist.radio.call.audio.output"; + /** + * Used when Presence app sends Dial intent with specific schema + * If true: skip schema parsing and use Tel schema + * If false: parse schema + */ + static final String EXTRA_SKIP_SCHEMA_PARSING = + "org.codeaurora.extra.SKIP_SCHEMA_PARSING"; + + /** + * For Group Conference Calling + * If true: isConferenceUri in Dial is set to true, + * which indicates that Dial is for Conference Calling + * If false: above is set to false + */ + static final String EXTRAS_IS_CONFERENCE_URI = "isConferenceUri"; + + /** + * For Group Conference Dialing Feature + * If true: Dial intent triggered from Group Conference Calling screen + * if false: normal dial + */ + static final String EXTRA_DIAL_CONFERENCE_URI = + "org.codeaurora.extra.DIAL_CONFERENCE_URI"; + + /** + * For Add Participant Feature + * If true: Dial intent triggered from Dialpad is for AddParticipant + * if false: normal dial + */ + static final String ADD_PARTICIPANT_KEY = "add_participant"; + + /* + * For VICE Feature + * If true: Dial intent is for call pull functionality + * if false: normal dial + */ + static final String EXTRA_IS_CALL_PULL = + "org.codeaurora.extra.IS_CALL_PULL"; + } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java index 30317012fb527cec7369ea40acf98a880d54589d..82c45ad65ba73f5870918b587b36a9f677c20862 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/view/WindowManagerImpl.java @@ -45,6 +45,7 @@ public class WindowManagerImpl implements WindowManager { @Override public void addView(View arg0, android.view.ViewGroup.LayoutParams arg1) { + android.util.SeempLog.record_vg(383, arg1); // pass } @@ -55,6 +56,7 @@ public class WindowManagerImpl implements WindowManager { @Override public void updateViewLayout(View arg0, android.view.ViewGroup.LayoutParams arg1) { + android.util.SeempLog.record_vg(384, arg1); // pass } diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index 9268a2b7cbe210f81d81994fdb9e33ebd6fd1215..eb2530287f4ebb44e3dd2d381c97e71d5ba5fc57 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -169,5 +169,7 @@ interface IWifiManager void factoryReset(); Network getCurrentNetwork(); + + boolean getWifiStaSapConcurrency(); } diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 9d0c20ce4c5d1453b76e9582b9a8e9628ef99c63..6f20267d237b300fd9b68c987e8abcaf08ee8593 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -69,6 +69,8 @@ public class WifiConfiguration implements Parcelable { /** {@hide} */ private String mPasspointManagementObjectTree; + /** {@hide} */ + public static final String SIMNumVarName = "sim_num"; /** * Recognized key management schemes. @@ -446,6 +448,12 @@ public class WifiConfiguration implements Parcelable { @SystemApi public String lastUpdateName; + /** + * @hide + * sim number selected + */ + public int SIMNum; + /** * @hide * Status of user approval for connection @@ -1350,6 +1358,7 @@ public class WifiConfiguration implements Parcelable { creatorUid = -1; shared = true; dtimInterval = 0; + SIMNum = 0; } /** @@ -1511,6 +1520,10 @@ public class WifiConfiguration implements Parcelable { if (this.preSharedKey != null) { sbuf.append('*'); } + sbuf.append('\n').append(" sim_num "); + if (this.SIMNum > 0 ) { + sbuf.append('*'); + } sbuf.append("\nEnterprise config:\n"); sbuf.append(enterpriseConfig); @@ -1907,6 +1920,7 @@ public class WifiConfiguration implements Parcelable { creationTime = source.creationTime; updateTime = source.updateTime; shared = source.shared; + SIMNum = source.SIMNum; } } @@ -1977,6 +1991,7 @@ public class WifiConfiguration implements Parcelable { dest.writeInt(noInternetAccessExpected ? 1 : 0); dest.writeInt(shared ? 1 : 0); dest.writeString(mPasspointManagementObjectTree); + dest.writeInt(SIMNum); } /** Implement the Parcelable interface {@hide} */ @@ -2048,6 +2063,7 @@ public class WifiConfiguration implements Parcelable { config.noInternetAccessExpected = in.readInt() != 0; config.shared = in.readInt() != 0; config.mPasspointManagementObjectTree = in.readString(); + config.SIMNum = in.readInt(); return config; } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index 1cd32b6bff0fe6a843534e2b0a26e33eed0b9485..800b958f87e281021f007faa53e0225261f2de46 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -321,6 +321,12 @@ public class WifiManager { @SystemApi public static final int WIFI_AP_STATE_FAILED = 14; + /** + * Wi-Fi AP is in restarting state + * @hide + */ + public static final int WIFI_AP_STATE_RESTART = 15; + /** * If WIFI AP start failed, this reason code means there is no legal channel exists on * user selected band by regulatory @@ -515,6 +521,14 @@ public class WifiManager { public static final String LINK_CONFIGURATION_CHANGED_ACTION = "android.net.wifi.LINK_CONFIGURATION_CHANGED"; + /** + * Broadcast intent action indicating that the user initiated Wifi OFF + * or APM ON and Wifi disconnection is in progress + * Actual Wifi disconnection happens after mDisconnectDelayDuration seconds. + * @hide + */ + public static final String ACTION_WIFI_DISCONNECT_IN_PROGRESS = "wifi_disconnect_in_progress"; + /** * The lookup key for a {@link android.net.LinkProperties} object associated with the * Wi-Fi network. Retrieve with @@ -1299,6 +1313,7 @@ public class WifiManager { * returned. */ public List getScanResults() { + android.util.SeempLog.record(55); try { return mService.getScanResults(mContext.getOpPackageName()); } catch (RemoteException e) { @@ -2668,6 +2683,21 @@ public class WifiManager { } } + /** + * get concurrency support + * + * @return true if concurrency is allowed. + * + * @hide no intent to publish + */ + public boolean getWifiStaSapConcurrency() { + try { + return mService.getWifiStaSapConcurrency(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * Resets all wifi manager settings back to factory defaults. *