diff options
57 files changed, 537 insertions, 288 deletions
diff --git a/api/current.txt b/api/current.txt index 8477bb53e11a..ba251b019da3 100644 --- a/api/current.txt +++ b/api/current.txt @@ -397,6 +397,7 @@ package android { field public static final int colorPressedHighlight = 16843661; // 0x101038d field public static final int colorPrimary = 16843827; // 0x1010433 field public static final int colorPrimaryDark = 16843828; // 0x1010434 + field public static final int colorSecondary = 16844080; // 0x1010530 field public static final int columnCount = 16843639; // 0x1010377 field public static final int columnDelay = 16843215; // 0x10101cf field public static final int columnOrderPreserved = 16843640; // 0x1010378 @@ -36315,6 +36316,7 @@ package android.telecom { field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 field public static final java.lang.String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED"; field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; + field public static final java.lang.String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -36800,6 +36802,7 @@ package android.telephony { field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; field public static final java.lang.String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool"; @@ -36857,6 +36860,7 @@ package android.telephony { field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool"; field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool"; field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool"; + field public static final java.lang.String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool"; field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool"; field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool"; field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool"; diff --git a/api/system-current.txt b/api/system-current.txt index 1095ac3b1c30..4350641ddb13 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -504,6 +504,7 @@ package android { field public static final int colorPressedHighlight = 16843661; // 0x101038d field public static final int colorPrimary = 16843827; // 0x1010433 field public static final int colorPrimaryDark = 16843828; // 0x1010434 + field public static final int colorSecondary = 16844080; // 0x1010530 field public static final int columnCount = 16843639; // 0x1010377 field public static final int columnDelay = 16843215; // 0x10101cf field public static final int columnOrderPreserved = 16843640; // 0x1010378 @@ -39164,6 +39165,7 @@ package android.telecom { field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 field public static final java.lang.String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED"; field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; + field public static final java.lang.String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -39839,6 +39841,7 @@ package android.telephony { field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; field public static final java.lang.String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool"; @@ -39896,6 +39899,7 @@ package android.telephony { field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool"; field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool"; field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool"; + field public static final java.lang.String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool"; field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool"; field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool"; field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool"; diff --git a/api/test-current.txt b/api/test-current.txt index 9e775a54fc6c..b46813570d70 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -397,6 +397,7 @@ package android { field public static final int colorPressedHighlight = 16843661; // 0x101038d field public static final int colorPrimary = 16843827; // 0x1010433 field public static final int colorPrimaryDark = 16843828; // 0x1010434 + field public static final int colorSecondary = 16844080; // 0x1010530 field public static final int columnCount = 16843639; // 0x1010377 field public static final int columnDelay = 16843215; // 0x10101cf field public static final int columnOrderPreserved = 16843640; // 0x1010378 @@ -36393,6 +36394,7 @@ package android.telecom { field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 field public static final java.lang.String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED"; field public static final java.lang.String EVENT_CALL_PULL_FAILED = "android.telecom.event.CALL_PULL_FAILED"; + field public static final java.lang.String EXTRA_ANSWERING_DROPS_FG_CALL = "android.telecom.extra.ANSWERING_DROPS_FG_CALL"; field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; @@ -36878,6 +36880,7 @@ package android.telephony { field public static final java.lang.String KEY_CSP_ENABLED_BOOL = "csp_enabled_bool"; field public static final java.lang.String KEY_DEFAULT_SIM_CALL_MANAGER_STRING = "default_sim_call_manager_string"; field public static final java.lang.String KEY_DISABLE_CDMA_ACTIVATION_CODE_BOOL = "disable_cdma_activation_code_bool"; + field public static final java.lang.String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = "drop_video_call_when_answering_audio_call_bool"; field public static final java.lang.String KEY_DTMF_TYPE_ENABLED_BOOL = "dtmf_type_enabled_bool"; field public static final java.lang.String KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT = "duration_blocking_disabled_after_emergency_int"; field public static final java.lang.String KEY_EDITABLE_ENHANCED_4G_LTE_BOOL = "editable_enhanced_4g_lte_bool"; @@ -36935,6 +36938,7 @@ package android.telephony { field public static final java.lang.String KEY_SUPPORT_CONFERENCE_CALL_BOOL = "support_conference_call_bool"; field public static final java.lang.String KEY_SUPPORT_PAUSE_IMS_VIDEO_CALLS_BOOL = "support_pause_ims_video_calls_bool"; field public static final java.lang.String KEY_SUPPORT_SWAP_AFTER_MERGE_BOOL = "support_swap_after_merge_bool"; + field public static final java.lang.String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool"; field public static final java.lang.String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool"; field public static final java.lang.String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool"; field public static final java.lang.String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool"; diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ec8b2882682b..06a01fc59807 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -306,7 +306,7 @@ import java.util.List; * </thead> * * <tbody> - * <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</th> + * <tr><td colspan="3" align="left" border="0">{@link android.app.Activity#onCreate onCreate()}</td> * <td>Called when the activity is first created. * This is where you should do all of your normal static set up: * create views, bind data to lists, etc. This method also @@ -318,7 +318,7 @@ import java.util.List; * </tr> * * <tr><td rowspan="5" style="border-left: none; border-right: none;"> </td> - * <th colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</th> + * <td colspan="2" align="left" border="0">{@link android.app.Activity#onRestart onRestart()}</td> * <td>Called after your activity has been stopped, prior to it being * started again. * <p>Always followed by <code>onStart()</code></td> @@ -326,7 +326,7 @@ import java.util.List; * <td align="center"><code>onStart()</code></td> * </tr> * - * <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</th> + * <tr><td colspan="2" align="left" border="0">{@link android.app.Activity#onStart onStart()}</td> * <td>Called when the activity is becoming visible to the user. * <p>Followed by <code>onResume()</code> if the activity comes * to the foreground, or <code>onStop()</code> if it becomes hidden.</td> @@ -335,7 +335,7 @@ import java.util.List; * </tr> * * <tr><td rowspan="2" style="border-left: none;"> </td> - * <th align="left" border="0">{@link android.app.Activity#onResume onResume()}</th> + * <td align="left" border="0">{@link android.app.Activity#onResume onResume()}</td> * <td>Called when the activity will start * interacting with the user. At this point your activity is at * the top of the activity stack, with user input going to it. @@ -344,7 +344,7 @@ import java.util.List; * <td align="center"><code>onPause()</code></td> * </tr> * - * <tr><th align="left" border="0">{@link android.app.Activity#onPause onPause()}</th> + * <tr><td align="left" border="0">{@link android.app.Activity#onPause onPause()}</td> * <td>Called when the system is about to start resuming a previous * activity. This is typically used to commit unsaved changes to * persistent data, stop animations and other things that may be consuming @@ -358,7 +358,7 @@ import java.util.List; * <code>onStop()</code></td> * </tr> * - * <tr><th colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</th> + * <tr><td colspan="2" align="left" border="0">{@link android.app.Activity#onStop onStop()}</td> * <td>Called when the activity is no longer visible to the user, because * another activity has been resumed and is covering this one. This * may happen either because a new activity is being started, an existing @@ -372,7 +372,7 @@ import java.util.List; * <code>onDestroy()</code></td> * </tr> * - * <tr><th colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</th> + * <tr><td colspan="3" align="left" border="0">{@link android.app.Activity#onDestroy onDestroy()}</td> * <td>The final call you receive before your * activity is destroyed. This can happen either because the * activity is finishing (someone called {@link Activity#finish} on diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 3c7eef5eee64..cee5646a73b3 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -1813,12 +1813,13 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } - case KILL_APPLICATION_WITH_APPID_TRANSACTION: { + case KILL_APPLICATION_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); String pkg = data.readString(); - int appid = data.readInt(); + int appId = data.readInt(); + int userId = data.readInt(); String reason = data.readString(); - killApplicationWithAppId(pkg, appid, reason); + killApplication(pkg, appId, userId, reason); reply.writeNoException(); return true; } @@ -2370,7 +2371,8 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM data.enforceInterface(IActivityManager.descriptor); IUserSwitchObserver observer = IUserSwitchObserver.Stub.asInterface( data.readStrongBinder()); - registerUserSwitchObserver(observer); + String name = data.readString(); + registerUserSwitchObserver(observer, name); reply.writeNoException(); return true; } @@ -5291,15 +5293,16 @@ class ActivityManagerProxy implements IActivityManager reply.recycle(); } - public void killApplicationWithAppId(String pkg, int appid, String reason) + public void killApplication(String pkg, int appId, int userId, String reason) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(pkg); - data.writeInt(appid); + data.writeInt(appId); + data.writeInt(userId); data.writeString(reason); - mRemote.transact(KILL_APPLICATION_WITH_APPID_TRANSACTION, data, reply, 0); + mRemote.transact(KILL_APPLICATION_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); reply.recycle(); @@ -6058,11 +6061,13 @@ class ActivityManagerProxy implements IActivityManager return result; } - public void registerUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException { + public void registerUserSwitchObserver(IUserSwitchObserver observer, + String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(observer != null ? observer.asBinder() : null); + data.writeString(name); mRemote.transact(REGISTER_USER_SWITCH_OBSERVER_TRANSACTION, data, reply, 0); reply.readException(); data.recycle(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 0728bdfc4016..3f15a755bd79 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -236,6 +236,7 @@ public final class ActivityThread { boolean mSystemThread = false; boolean mJitEnabled = false; boolean mSomeActivitiesChanged = false; + boolean mUpdatingSystemConfig = false; // These can be accessed by multiple threads; mPackages is the lock. // XXX For now we keep around information about all packages we have @@ -1574,7 +1575,9 @@ public final class ActivityThread { case CONFIGURATION_CHANGED: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged"); mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi; + mUpdatingSystemConfig = true; handleConfigurationChanged((Configuration)msg.obj, null); + mUpdatingSystemConfig = false; Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case CLEAN_UP_CONTEXT: @@ -4629,7 +4632,14 @@ public final class ActivityThread { // onConfigurationChanged int diff = activity.mCurrentConfig.diff(newConfig); if (diff != 0) { - shouldChangeConfig = true; + // Always send the task-level config changes. For system-level configuration, if + // this activity doesn't handle any of the config changes, then don't bother + // calling onConfigurationChanged as we're going to destroy it. + if (!mUpdatingSystemConfig + || (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0 + || !reportToActivity) { + shouldChangeConfig = true; + } } } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index ac213461f578..3f7ff0bede57 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -398,7 +398,7 @@ public interface IActivityManager extends IInterface { public void addPackageDependency(String packageName) throws RemoteException; - public void killApplicationWithAppId(String pkg, int appid, String reason) + public void killApplication(String pkg, int appId, int userId, String reason) throws RemoteException; public void closeSystemDialogs(String reason) throws RemoteException; @@ -512,7 +512,8 @@ public interface IActivityManager extends IInterface { public int getLaunchedFromUid(IBinder activityToken) throws RemoteException; public String getLaunchedFromPackage(IBinder activityToken) throws RemoteException; - public void registerUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException; + public void registerUserSwitchObserver(IUserSwitchObserver observer, + String name) throws RemoteException; public void unregisterUserSwitchObserver(IUserSwitchObserver observer) throws RemoteException; public void requestBugReport(int bugreportType) throws RemoteException; @@ -852,7 +853,7 @@ public interface IActivityManager extends IInterface { int GET_UID_FOR_INTENT_SENDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+92; int HANDLE_INCOMING_USER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+93; int ADD_PACKAGE_DEPENDENCY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+94; - int KILL_APPLICATION_WITH_APPID_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95; + int KILL_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+95; int CLOSE_SYSTEM_DIALOGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+96; int GET_PROCESS_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+97; int KILL_APPLICATION_PROCESS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+98; diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index ca45e62acf58..c531954b23a0 100755 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9074,6 +9074,12 @@ public final class Settings { */ public static final String SYSTEM_NAVIGATION_KEYS_ENABLED = "system_navigation_keys_enabled"; + + /** + * Whether cell is enabled/disabled + * @hide + */ + public static final String CELL_ON = "cell_on"; } /** diff --git a/core/java/android/service/quicksettings/TileService.java b/core/java/android/service/quicksettings/TileService.java index 55cfb49fe14e..50411ab7d15e 100644 --- a/core/java/android/service/quicksettings/TileService.java +++ b/core/java/android/service/quicksettings/TileService.java @@ -312,7 +312,8 @@ public class TileService extends Service { public IBinder onBind(Intent intent) { mService = IQSService.Stub.asInterface(intent.getIBinderExtra(EXTRA_SERVICE)); try { - mTile = mService.getTile(new ComponentName(getPackageName(), getClass().getName())); + ComponentName component = intent.getParcelableExtra(EXTRA_COMPONENT); + mTile = mService.getTile(component); } catch (RemoteException e) { throw new RuntimeException("Unable to reach IQSService", e); } diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index a865307b12bb..d3db74d1ea24 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -232,6 +232,19 @@ public final class Choreographer { return sThreadInstance.get(); } + /** Destroys the calling thread's choreographer + * @hide + */ + public static void releaseInstance() { + Choreographer old = sThreadInstance.get(); + sThreadInstance.remove(); + old.dispose(); + } + + private void dispose() { + mDisplayEventReceiver.dispose(); + } + /** * The amount of time, in milliseconds, between each frame of the animation. * <p> diff --git a/core/java/com/android/internal/app/LocaleStore.java b/core/java/com/android/internal/app/LocaleStore.java index e3fce5197dca..e782c3c9fa40 100644 --- a/core/java/com/android/internal/app/LocaleStore.java +++ b/core/java/com/android/internal/app/LocaleStore.java @@ -307,6 +307,9 @@ public class LocaleStore { localizedLocales.add(li.getLangScriptKey()); } + // Serbian in Latin script is only partially localized in N. + localizedLocales.remove("sr-Latn"); + for (LocaleInfo li : sLocaleCache.values()) { li.setTranslated(localizedLocales.contains(li.getLangScriptKey())); } diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 8addffb0ef41..0ab3a41f1469 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -217,6 +217,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame synchronized (this) { // Make sure no more messages are being sent. mChoreographer = null; + Choreographer.releaseInstance(); } } diff --git a/core/jni/android_view_DisplayEventReceiver.cpp b/core/jni/android_view_DisplayEventReceiver.cpp index f9936aedaa5a..a0d5904157eb 100644 --- a/core/jni/android_view_DisplayEventReceiver.cpp +++ b/core/jni/android_view_DisplayEventReceiver.cpp @@ -81,14 +81,12 @@ NativeDisplayEventReceiver::NativeDisplayEventReceiver(JNIEnv* env, NativeDisplayEventReceiver::~NativeDisplayEventReceiver() { JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteGlobalRef(mReceiverWeakGlobal); + ALOGV("receiver %p ~ dtor display event receiver.", this); } void NativeDisplayEventReceiver::dispose() { ALOGV("receiver %p ~ Disposing display event receiver.", this); - - if (!mReceiver.initCheck()) { - mMessageQueue->getLooper()->removeFd(mReceiver.getFd()); - } + DisplayEventDispatcher::dispose(); } void NativeDisplayEventReceiver::dispatchVsync(nsecs_t timestamp, int32_t id, uint32_t count) { @@ -143,7 +141,7 @@ static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } static void nativeDispose(JNIEnv* env, jclass clazz, jlong receiverPtr) { - sp<NativeDisplayEventReceiver> receiver = + NativeDisplayEventReceiver* receiver = reinterpret_cast<NativeDisplayEventReceiver*>(receiverPtr); receiver->dispose(); receiver->decStrong(gDisplayEventReceiverClassInfo.clazz); // drop reference held by the object diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 7ee1cadb3729..1c2c590cc5a1 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1048,6 +1048,9 @@ i the status bar (via statusBarColor) and navigation bar (via navigationBarColor). --> <attr name="colorPrimaryDark" format="color" /> + <!-- The secondary branding color for the app. --> + <attr name="colorSecondary" format="color" /> + <!-- Bright complement to the primary branding color. By default, this is the color applied to framework controls (via colorControlActivated). --> <attr name="colorAccent" format="color" /> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index c187d2ca7d88..9ccd39fa893e 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2741,5 +2741,6 @@ <public type="attr" name="contextUri" /> <public type="attr" name="contextDescription" /> <public type="attr" name="showMetadataInPreview" /> + <public type="attr" name="colorSecondary" /> </resources> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 998eea5ac9ab..92f049d6e16c 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -57,6 +57,7 @@ please see themes_device_defaults.xml. <item name="colorPrimaryDark">@color/legacy_primary_dark</item> <item name="colorPrimary">@color/legacy_primary</item> + <item name="colorSecondary">?attr/colorPrimary</item> <item name="colorControlActivated">@color/legacy_control_activated</item> <item name="colorControlNormal">@color/legacy_control_normal</item> <item name="colorControlHighlight">@color/legacy_button_pressed</item> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 9369456bc5c2..5c9402fd1267 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -730,13 +730,26 @@ easier. <!-- Color palette --> <item name="colorPrimary">@color/primary_device_default_settings</item> <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item> + <item name="colorSecondary">@color/secondary_device_default_settings</item> <item name="colorAccent">@color/accent_device_default_light</item> </style> + <!-- DeviceDefault theme for a window that should use Settings theme colors but has + a full dark palette (instead of Light with dark action bar like + Theme.DeviceDefault.Settings. --> + <style name="Theme.DeviceDefault.Settings.Dark" parent="Theme.Material"> + <!-- Color palette --> + <item name="colorPrimary">@color/primary_device_default_settings</item> + <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item> + <item name="colorSecondary">@color/secondary_device_default_settings</item> + <item name="colorAccent">@color/accent_device_default_dark</item> + </style> + <style name="Theme.DeviceDefault.Settings.DialogWhenLarge" parent="Theme.Material.Settings.DialogWhenLarge"> <!-- Color palette --> <item name="colorPrimary">@color/primary_device_default_settings</item> <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item> + <item name="colorSecondary">@color/secondary_device_default_settings</item> <item name="colorAccent">@color/accent_device_default_light</item> </style> @@ -744,6 +757,7 @@ easier. <!-- Color palette --> <item name="colorPrimary">@color/primary_device_default_settings</item> <item name="colorPrimaryDark">@color/primary_dark_device_default_settings</item> + <item name="colorSecondary">@color/secondary_device_default_settings</item> <item name="colorAccent">@color/accent_device_default_light</item> </style> diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml index d437032b0405..35ce9b049854 100644 --- a/core/res/res/values/themes_material.xml +++ b/core/res/res/values/themes_material.xml @@ -1305,6 +1305,7 @@ please see themes_device_defaults.xml. <style name="Theme.Material.Settings" parent="Theme.Material.Light.DarkActionBar"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> <item name="presentationTheme">@style/Theme.Material.Settings.Dialog.Presentation</item> <item name="searchDialogTheme">@style/Theme.Material.Settings.SearchBar</item> @@ -1315,6 +1316,7 @@ please see themes_device_defaults.xml. <style name="Theme.Material.Settings.NoActionBar" parent="Theme.Material.Light.NoActionBar"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> <item name="presentationTheme">@style/Theme.Material.Settings.Dialog.Presentation</item> <item name="searchDialogTheme">@style/Theme.Material.Settings.SearchBar</item> @@ -1324,6 +1326,7 @@ please see themes_device_defaults.xml. <style name="Theme.Material.Settings.BaseDialog" parent="Theme.Material.Light.BaseDialog"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.Dialog" parent="Theme.Material.Settings.BaseDialog" /> @@ -1331,6 +1334,7 @@ please see themes_device_defaults.xml. <style name="Theme.Material.Settings.Dialog.BaseAlert" parent="Theme.Material.Light.Dialog.BaseAlert"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.Dialog.Alert" parent="Theme.Material.Settings.Dialog.BaseAlert" /> @@ -1338,25 +1342,30 @@ please see themes_device_defaults.xml. <style name="Theme.Material.Settings.DialogWhenLarge" parent="Theme.Material.Light.DialogWhenLarge.DarkActionBar"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.DialogWhenLarge.NoActionBar" parent="Theme.Material.Light.DialogWhenLarge.NoActionBar"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.Dialog.Presentation" parent="Theme.Material.Light.Dialog.Presentation"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.SearchBar" parent="Theme.Material.Light.SearchBar"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> <style name="Theme.Material.Settings.CompactMenu" parent="Theme.Material.Light.CompactMenu"> <item name="colorPrimary">@color/primary_material_settings</item> <item name="colorPrimaryDark">@color/primary_dark_material_settings</item> + <item name="colorSecondary">@color/secondary_material_settings</item> </style> </resources> diff --git a/docs/html/wear/preview/api-overview.jd b/docs/html/wear/preview/api-overview.jd index 543313af1a39..11331a777d62 100644 --- a/docs/html/wear/preview/api-overview.jd +++ b/docs/html/wear/preview/api-overview.jd @@ -4,9 +4,6 @@ page.tags="wear" page.image=images/cards/card-n-apis_2x.png @jd:body - - - <div id="qv-wrapper"> <div id="qv"> <h2>Key developer features</h2> @@ -298,36 +295,35 @@ Multiple Network Connections</a> authentication capabilities will be more powerful; apps will have new ways to authenticate.</p> - <h4> Authentication tokens can be passed over the Wearable Data Layer </h4> - -<p>For Android-paired watches (only), the phone will securely transfer authentication - data to a watch app via the - <a href="{@docRoot}training/wearables/data-layer/index.html"> - Wearable Data Layer API</a>. The data can be transferred as - Messages or Data Items. </p> - -<p>If your watch app needs to determine if your phone app is installed, you can -advertise a capability on the phone app and retrieve the capability on the watch. - For more information, see following sections of - <a href="{@docRoot}training/wearables/data-layer/messages.html"> - Sending and Receiving Messages</a>: - <ul> - <li>Advertise Capabilities</li> - <li>Retrieve the Nodes with the Required Capabilities</li> - </ul> <h4>Users can enter a username and password on a watch</h4> -<p>Google Keyboard will be standard on Android Wear, allowing for direct text entry. - This feature will work as expected with standard - <a href="{@docRoot}reference/android/widget/EditText.html"> - EditText widgets</a>. For passwords, the {@code textPassword} attribute will be - used. +<p>Google Keyboard will be standard on Android Wear, allowing for direct text +entry. This feature will work as expected with standard +<a href="{@docRoot}reference/android/widget/EditText.html">EditText widgets</a>. +For passwords, the {@code textPassword} attribute will be used.</p> <h4>Utilizing Account Manager</h4> -Android Wear will include the <a href="{@docRoot}reference/android/accounts/AccountManager.html"> + +<p>Android Wear will include the +<a href="{@docRoot}reference/android/accounts/AccountManager.html"> AccountManager</a>, which will be accessible for syncing and storing account - data, as it is on an Android phone. -</p> +data, as it is on an Android phone.</p> +<h4>Authentication tokens can be passed over the Wearable Data Layer</h4> +<p>For Android-paired watches (only), a phone securely +transfers authentication credentials to a watch app via the +<a href="{@docRoot}training/wearables/data-layer/index.html"> +Wearable Data Layer API</a>. The credentials can be transferred as +messages or data items.</p> +<p>If your watch app needs to determine if your phone app is installed, you can +advertise a capability on the phone app and retrieve the capability on the +watch. For more information, see the following sections of +<a href="{@docRoot}training/wearables/data-layer/messages.html"> +Sending and Receiving Messages</a>:</p> + +<ul> + <li>Advertise Capabilities</li> + <li>Retrieve the Nodes with the Required Capabilities</li> +</ul> diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 45d0cc025a16..07d1f7542b26 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -1372,16 +1372,33 @@ public final class MediaCodecInfo { * May return {@code null}, if the codec did not publish any measurement * data. * <p> - * This is a performance estimate provided by the device manufacturer - * based on full-speed decoding and encoding measurements in various configurations + * This is a performance estimate provided by the device manufacturer based on statistical + * sampling of full-speed decoding and encoding measurements in various configurations * of common video sizes supported by the codec. As such it should only be used to * compare individual codecs on the device. The value is not suitable for comparing * different devices or even different android releases for the same device. * <p> - * The returned range corresponds to the fastest frame rates achieved in the tested - * configurations. It is interpolated from the nearest frame size(s) tested. Codec - * performance is severely impacted by other activity on the device, and can vary - * significantly. + * <em>On {@link android.os.Build.VERSION_CODES#M} release</em> the returned range + * corresponds to the fastest frame rates achieved in the tested configurations. As + * such, it should not be used to gauge guaranteed or even average codec performance + * on the device. + * <p> + * <em>On {@link android.os.Build.VERSION_CODES#N} release</em> the returned range + * corresponds closer to sustained performance <em>in tested configurations</em>. + * One can expect to achieve sustained performance higher than the lower limit more than + * 50% of the time, and higher than half of the lower limit at least 90% of the time + * <em>in tested configurations</em>. + * Conversely, one can expect performance lower than twice the upper limit at least + * 90% of the time. + * <p class=note> + * Tested configurations use a single active codec. For use cases where multiple + * codecs are active, applications can expect lower and in most cases significantly lower + * performance. + * <p class=note> + * The returned range value is interpolated from the nearest frame size(s) tested. + * Codec performance is severely impacted by other activity on the device as well + * as environmental factors (such as battery level, temperature or power source), and can + * vary significantly even in a steady environment. * <p class=note> * Use this method in cases where only codec performance matters, e.g. to evaluate if * a codec has any chance of meeting a performance target. Codecs are listed diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index a8419bf4cbdf..94d9550f77e4 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1040,10 +1040,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + e.rethrowAsRuntimeException(); } IntentFilter strongAuthTimeoutFilter = new IntentFilter(); 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 000000000000..258bd0f7902e --- /dev/null +++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml @@ -0,0 +1,37 @@ +<!-- + Copyright (C) 2016 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="18.0dp" + android:height="24dp" + android:viewportWidth="36.0" + android:viewportHeight="36.0"> + + <path + android:fillColor="#FFFFFF" + android:pathData="M6.797,13.334h1.231v1.522H6.797v2.509h-1.62v-2.509H1.101l-0.039-1.157l4.069-7.643h1.666V13.334z +M2.648,13.334h2.53V8.721L5.137,8.713L4.984,9.148L2.648,13.334z" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M16.155,15.836c-0.269,0.439-0.695,0.832-1.282,1.177c-0.587,0.344-1.344,0.517-2.271,0.517 +c-1.151,0-2.098-0.432-2.841-1.294c-0.744-0.862-1.115-1.978-1.115-3.345v-2.36c0-1.367,0.359-2.481,1.077-3.343 +c0.719-0.863,1.643-1.293,2.772-1.293c1.132,0,2.017,0.331,2.649,0.994c0.633,0.663,0.941,1.528,0.924,2.594l-0.021,0.047h-1.545 +c0-0.638-0.171-1.15-0.513-1.538c-0.341-0.389-0.831-0.583-1.469-0.583c-0.674,0-1.217,0.292-1.63,0.877 +c-0.413,0.585-0.619,1.328-0.619,2.229v2.375c0,0.912,0.215,1.662,0.645,2.25c0.431,0.587,0.992,0.881,1.684,0.881 +c0.522,0,0.935-0.068,1.238-0.205c0.304-0.138,0.533-0.305,0.688-0.502v-2.338h-2.041v-1.413h3.668V15.836z" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M19.366,14.701v-2.232h-2.25v-1.541h2.25V8.695h1.5v2.232h2.256v1.541h-2.256v2.232H19.366z" /> +</vector> diff --git a/packages/SystemUI/res/drawable/notification_header_bg.xml b/packages/SystemUI/res/drawable/notification_header_bg.xml deleted file mode 100644 index 1f46502591ce..000000000000 --- a/packages/SystemUI/res/drawable/notification_header_bg.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ 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 - --> - -<ripple xmlns:android="http://schemas.android.com/apk/res/android" - android:color="?android:attr/colorControlHighlight" > - <item android:drawable="@color/system_secondary_color"/> -</ripple>
\ No newline at end of file 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 000000000000..17a4394ce6df --- /dev/null +++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g_plus.xml @@ -0,0 +1,37 @@ +<!-- + Copyright (C) 2016 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. +--> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="15dp" + android:height="20dp" + android:viewportWidth="36" + android:viewportHeight="36"> + + <path + android:fillColor="#FFFFFF" + android:pathData="M6.797,13.334h1.231v1.522H6.797v2.509h-1.62v-2.509H1.101l-0.039-1.157l4.069-7.643h1.666V13.334z +M2.648,13.334h2.53V8.721L5.137,8.713L4.984,9.148L2.648,13.334z" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M16.155,15.836c-0.269,0.439-0.695,0.832-1.282,1.177c-0.587,0.344-1.344,0.517-2.271,0.517 +c-1.151,0-2.098-0.432-2.841-1.294c-0.744-0.862-1.115-1.978-1.115-3.345v-2.36c0-1.367,0.359-2.481,1.077-3.343 +c0.719-0.863,1.643-1.293,2.772-1.293c1.132,0,2.017,0.331,2.649,0.994c0.633,0.663,0.941,1.528,0.924,2.594l-0.021,0.047h-1.545 +c0-0.638-0.171-1.15-0.513-1.538c-0.341-0.389-0.831-0.583-1.469-0.583c-0.674,0-1.217,0.292-1.63,0.877 +c-0.413,0.585-0.619,1.328-0.619,2.229v2.375c0,0.912,0.215,1.662,0.645,2.25c0.431,0.587,0.992,0.881,1.684,0.881 +c0.522,0,0.935-0.068,1.238-0.205c0.304-0.138,0.533-0.305,0.688-0.502v-2.338h-2.041v-1.413h3.668V15.836z" /> + <path + android:fillColor="#FFFFFF" + android:pathData="M19.366,14.701v-2.232h-2.25v-1.541h2.25V8.695h1.5v2.232h2.256v1.541h-2.256v2.232H19.366z" /> +</vector> diff --git a/packages/SystemUI/res/drawable/switchbar_background.xml b/packages/SystemUI/res/drawable/switchbar_background.xml index fdb6c770bd26..fb59633f3ec3 100644 --- a/packages/SystemUI/res/drawable/switchbar_background.xml +++ b/packages/SystemUI/res/drawable/switchbar_background.xml @@ -16,6 +16,6 @@ <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:attr/colorControlHighlight"> - <item android:drawable="@color/system_secondary_color" /> + <item android:drawable="?android:attr/colorSecondary" /> </ripple> diff --git a/packages/SystemUI/res/layout/tile_listing.xml b/packages/SystemUI/res/layout/tile_listing.xml deleted file mode 100644 index 9ab62cafe40b..000000000000 --- a/packages/SystemUI/res/layout/tile_listing.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ** Copyright 2015, The Android Open Source Project - ** - ** Licensed under the Apache License, Version 2.0 (the "License"); - ** you may not use this file except in compliance with the License. - ** You may obtain a copy of the License at - ** - ** http://www.apache.org/licenses/LICENSE-2.0 - ** - ** Unless required by applicable law or agreed to in writing, software - ** distributed under the License is distributed on an "AS IS" BASIS, - ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ** See the License for the specific language governing permissions and - ** limitations under the License. - --> - - <LinearLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/qs_background_primary" - android:paddingBottom="20dp" - android:orientation="vertical"> - - <LinearLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/notification_header_bg" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:paddingTop="10dp" - android:paddingBottom="10dp" - android:orientation="horizontal"> - <ImageView - android:id="@android:id/icon" - android:layout_width="36dp" - android:layout_height="36dp" /> - <TextView - android:id="@android:id/title" - android:paddingStart="10dp" - android:textColor="@android:color/white" - android:textAppearance="?android:attr/textAppearanceSmall" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" /> - </LinearLayout> - - <GridLayout - android:id="@+id/tile_grid" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:columnCount="4" /> - - </LinearLayout> diff --git a/packages/SystemUI/res/layout/tuner_qs.xml b/packages/SystemUI/res/layout/tuner_qs.xml deleted file mode 100644 index 9a51e0cbfd32..000000000000 --- a/packages/SystemUI/res/layout/tuner_qs.xml +++ /dev/null @@ -1,47 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2015 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<com.android.systemui.tuner.AutoScrollView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:background="@color/system_secondary_color" > - <LinearLayout - android:id="@+id/all_details" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:gravity="center" - android:orientation="vertical"> - - <View - android:background="@color/qs_tile_divider" - android:layout_width="match_parent" - android:layout_height="2dp" /> - - <FrameLayout - android:id="@+id/remove_target" - android:layout_width="105dp" - android:layout_height="@dimen/qs_tile_height" /> - - <FrameLayout - android:id="@+id/add_target" - android:layout_width="105dp" - android:layout_height="@dimen/qs_tile_height" /> - </LinearLayout> -</com.android.systemui.tuner.AutoScrollView> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index f7fd368dcb62..d12ef42590dc 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -30,10 +30,6 @@ <color name="batterymeter_charge_color">#FFFFFFFF</color> <color name="batterymeter_bolt_color">#FFFFFFFF</color> <color name="qs_batterymeter_frame_color">#FF404040</color> - - <!-- TODO: use a theme color for this and delete it --> - <color name="system_secondary_color">#ff37474F</color><!-- blue grey 800 --> - <color name="system_warning_color">#fff4511e</color><!-- deep orange 600 --> <color name="qs_text">#FFFFFFFF</color> <color name="qs_tile_divider">#29ffffff</color><!-- 16% white --> @@ -156,14 +152,10 @@ <color name="qs_tile_tint_inactive">#4dffffff</color> <color name="qs_tile_tint_active">#ffffffff</color> - <color name="switch_bar_background">#ff37474f</color> - <!-- Keyboard shortcuts colors --> <color name="ksh_application_group_color">#fff44336</color> <color name="ksh_keyword_color">#d9000000</color> <color name="ksh_key_item_color">@color/material_grey_600</color> <color name="ksh_key_item_background">@color/material_grey_100</color> - <!-- Background color of edit overflow --> - <color name="qs_edit_overflow_bg">#455A64</color> </resources> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index f7a169cb4d5b..8927a2c57e19 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -348,6 +348,9 @@ <!-- Content description of the data connection type 4G for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_data_connection_4g">4G</string> + <!-- Content description of the data connection type 4G for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> + <string name="accessibility_data_connection_4g_plus">4G+</string> + <!-- Content description of the data connection type LTE for accessibility (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_data_connection_lte">LTE</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index caada1baacd7..e5681ce517f9 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -355,8 +355,8 @@ <item name="android:textColor">?android:attr/colorAccent</item> </style> - <style name="edit_theme" parent="@android:style/Theme.Material"> - <item name="android:colorBackground">@color/qs_edit_overflow_bg</item> + <style name="edit_theme" parent="@*android:style/Theme.DeviceDefault.Settings.Dark"> + <item name="android:colorBackground">?android:attr/colorSecondary</item> </style> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 8e4ed91837a9..3a693cff7cc9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -19,6 +19,7 @@ import android.app.AlertDialog.Builder; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; +import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.drawable.ColorDrawable; import android.os.Handler; @@ -71,6 +72,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta private final Handler mHandler = new Handler(); private final List<TileInfo> mTiles = new ArrayList<>(); private final ItemTouchHelper mItemTouchHelper; + private final ItemDecoration mDecoration; private final AccessibilityManager mAccessibilityManager; private int mEditIndex; private int mTileDividerIndex; @@ -88,6 +90,7 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta mContext = context; mAccessibilityManager = context.getSystemService(AccessibilityManager.class); mItemTouchHelper = new ItemTouchHelper(mCallbacks); + mDecoration = new TileItemDecoration(context); } public void setHost(QSTileHost host) { @@ -459,9 +462,16 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta } }; - private final ItemDecoration mDecoration = new ItemDecoration() { - // TODO: Move this to resource. - private final ColorDrawable mDrawable = new ColorDrawable(0xff384248); + private class TileItemDecoration extends ItemDecoration { + private final ColorDrawable mDrawable; + + private TileItemDecoration(Context context) { + TypedArray ta = + context.obtainStyledAttributes(new int[]{android.R.attr.colorSecondary}); + mDrawable = new ColorDrawable(ta.getColor(0, 0)); + ta.recycle(); + } + @Override public void onDraw(Canvas c, RecyclerView parent, State state) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java index d68502ee956e..79f9de6b4bf7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java +++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java @@ -88,6 +88,7 @@ public class TileLifecycleManager extends BroadcastReceiver implements mHandler = handler; mIntent = intent; mIntent.putExtra(TileService.EXTRA_SERVICE, service.asBinder()); + mIntent.putExtra(TileService.EXTRA_COMPONENT, intent.getComponent()); mUser = user; if (DEBUG) Log.d(TAG, "Creating " + mIntent + " " + mUser); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java index e0049b569ade..a63eabc8ad85 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataUsageDetailView.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import android.annotation.ColorInt; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -65,7 +66,7 @@ public class DataUsageDetailView extends LinearLayout { final Resources res = mContext.getResources(); final int titleId; final long bytes; - int usageColor = 0; + @ColorInt int usageColor = 0; final String top; String bottom = null; if (info.usageLevel < info.warningLevel || info.limitLevel <= 0) { @@ -90,7 +91,7 @@ public class DataUsageDetailView extends LinearLayout { formatBytes(info.usageLevel)); bottom = res.getString(R.string.quick_settings_cellular_detail_data_limit, formatBytes(info.limitLevel)); - usageColor = R.color.system_warning_color; + usageColor = mContext.getColor(R.color.system_warning_color); } if (usageColor == 0) { @@ -101,7 +102,7 @@ public class DataUsageDetailView extends LinearLayout { title.setText(titleId); final TextView usage = (TextView) findViewById(R.id.usage_text); usage.setText(formatBytes(bytes)); - usage.setTextColor(mContext.getColor(usageColor)); + usage.setTextColor(usageColor); final DataUsageGraph graph = (DataUsageGraph) findViewById(R.id.usage_graph); graph.setLevels(info.limitLevel, info.warningLevel, info.usageLevel); final TextView carrier = (TextView) findViewById(R.id.usage_carrier_text); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index d3434e5aa812..016c4b70f485 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -85,6 +85,7 @@ public class HotspotTile extends QSTile<QSTile.AirplaneBooleanState> { mController.addCallback(mCallback); final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + refreshState(); } else { mController.removeCallback(mCallback); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index eb69f55f0cf5..b50555d81751 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1083,8 +1083,8 @@ public abstract class BaseStatusBar extends SystemUI implements pkgicon = pmUser.getDefaultActivityIcon(); } - ((ImageView) row.findViewById(R.id.app_icon)).setImageDrawable(pkgicon); - ((TextView) row.findViewById(R.id.pkgname)).setText(appname); + ((ImageView) guts.findViewById(R.id.app_icon)).setImageDrawable(pkgicon); + ((TextView) guts.findViewById(R.id.pkgname)).setText(appname); final View settingsButton = guts.findViewById(R.id.more_settings); if (appUid >= 0) { @@ -1100,8 +1100,9 @@ public abstract class BaseStatusBar extends SystemUI implements settingsButton.setVisibility(View.GONE); } - guts.bindImportance(pmUser, sbn, row, mNotificationData.getImportance(sbn.getKey())); - row.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { + guts.bindImportance(pmUser, sbn, mNotificationData.getImportance(sbn.getKey())); + + guts.findViewById(R.id.done).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // If the user has security enabled, show challenge if the setting is changed. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java index f0195d44d296..37c7ef2ed8a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGuts.java @@ -173,7 +173,7 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab } void bindImportance(final PackageManager pm, final StatusBarNotification sbn, - final ExpandableNotificationRow row, final int importance) { + final int importance) { mINotificationManager = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); mStartingUserImportance = NotificationListenerService.Ranking.IMPORTANCE_UNSPECIFIED; @@ -191,8 +191,8 @@ public class NotificationGuts extends LinearLayout implements TunerService.Tunab // unlikely. } - final View importanceSlider = row.findViewById(R.id.importance_slider); - final View importanceButtons = row.findViewById(R.id.importance_buttons); + final View importanceSlider = findViewById(R.id.importance_slider); + final View importanceButtons = findViewById(R.id.importance_buttons); if (mShowSlider) { bindSlider(importanceSlider, systemApp); importanceSlider.setVisibility(View.VISIBLE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java index 5fea674f47b1..6cbaceaa00ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/RemoteInputController.java @@ -130,6 +130,28 @@ public class RemoteInputController { } } + public void closeRemoteInputs() { + if (mOpen.size() == 0) { + return; + } + + // Make a copy because closing the remote inputs will modify mOpen. + ArrayList<NotificationData.Entry> list = new ArrayList<>(mOpen.size()); + for (int i = mOpen.size() - 1; i >= 0; i--) { + NotificationData.Entry item = mOpen.get(i).get(); + if (item != null && item.row != null) { + list.add(item); + } + } + + for (int i = list.size() - 1; i >= 0; i--) { + NotificationData.Entry item = list.get(i); + if (item.row != null) { + item.row.closeRemoteInput(); + } + } + } + public interface Callback { default void onRemoteInputActive(boolean active) {} 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 7db2870620a0..d5ff0b356d6d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -56,6 +56,7 @@ public class KeyguardStatusBarView extends RelativeLayout private BatteryController mBatteryController; private KeyguardUserSwitcher mKeyguardUserSwitcher; + private UserSwitcherController mUserSwitcherController; private int mSystemIconsSwitcherHiddenExpandedMargin; private View mSystemIconsContainer; @@ -149,6 +150,15 @@ public class KeyguardStatusBarView extends RelativeLayout } else if (mMultiUserSwitch.getParent() == this && mKeyguardUserSwitcherShowing) { removeView(mMultiUserSwitch); } + if (mKeyguardUserSwitcher == null) { + // If we have no keyguard switcher, the screen width is under 600dp. In this case, + // we don't show the multi-user avatar unless there is more than 1 user on the device. + if (mUserSwitcherController.getSwitchableUserCount() > 1) { + mMultiUserSwitch.setVisibility(View.VISIBLE); + } else { + mMultiUserSwitch.setVisibility(View.GONE); + } + } mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE); } @@ -187,6 +197,7 @@ public class KeyguardStatusBarView extends RelativeLayout } public void setUserSwitcherController(UserSwitcherController controller) { + mUserSwitcherController = controller; mMultiUserSwitch.setUserSwitcherController(controller); } @@ -287,6 +298,8 @@ public class KeyguardStatusBarView extends RelativeLayout mSystemIconsSuperContainer.animate().cancel(); mMultiUserSwitch.animate().cancel(); mMultiUserSwitch.setAlpha(1f); + } else { + updateVisibilities(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 2692f77d3a18..12a79b8650dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -3391,6 +3391,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { KeyboardShortcuts.dismiss(); + if (mRemoteInputController != null) { + mRemoteInputController.closeRemoteInputs(); + } if (isCurrentProfile(getSendingUserId())) { int flags = CommandQueue.FLAG_EXCLUDE_NONE; String reason = intent.getStringExtra("reason"); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 81c0d812997a..a13138d4e6f6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -144,7 +144,7 @@ public class PhoneStatusBarPolicy implements Callback, RotationLockController.Ro // listen for user / profile change. try { - ActivityManagerNative.getDefault().registerUserSwitchObserver(mUserSwitchListener); + ActivityManagerNative.getDefault().registerUserSwitchObserver(mUserSwitchListener, TAG); } catch (RemoteException e) { // Ignore } 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 83e25ebd7497..ac3246d5ff6b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -197,8 +197,11 @@ 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); } 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 b27bfcb311cf..7a042af7f42e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -781,6 +781,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 : 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 6ff8f77bff4e..d91b3329d1ac 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java @@ -182,6 +182,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 +217,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,6 +227,7 @@ 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; @@ -348,6 +363,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/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 89d2712db0d0..379ad53c6dba 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -381,6 +381,18 @@ public class UserSwitcherController { Log.e(TAG, "Couldn't switch to user, id=" + userId); } + public int getSwitchableUserCount() { + int count = 0; + final int N = mUsers.size(); + for (int i = 0; i < N; ++i) { + UserRecord record = mUsers.get(i); + if (record.info != null && record.info.supportsSwitchTo()) { + count++; + } + } + return count; + } + private void switchToUserId(int id) { try { pauseRefreshUsers(); diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 55464e4cb7c8..cdd977be29ed 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -827,8 +827,9 @@ class MountService extends IMountService.Stub if (provider != null) { final IActivityManager am = ActivityManagerNative.getDefault(); try { - am.killApplicationWithAppId(provider.applicationInfo.packageName, - UserHandle.getAppId(provider.applicationInfo.uid), "vold reset"); + am.killApplication(provider.applicationInfo.packageName, + UserHandle.getAppId(provider.applicationInfo.uid), + UserHandle.USER_ALL, "vold reset"); // We only need to run this once. It will kill all users' media processes. break; } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f84448742975..89715f8952ba 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1849,13 +1849,13 @@ public final class ActivityManagerService extends ActivityManagerNative } break; case KILL_APPLICATION_MSG: { synchronized (ActivityManagerService.this) { - int appid = msg.arg1; - boolean restart = (msg.arg2 == 1); + final int appId = msg.arg1; + final int userId = msg.arg2; Bundle bundle = (Bundle)msg.obj; String pkg = bundle.getString("pkg"); String reason = bundle.getString("reason"); - forceStopPackageLocked(pkg, appid, restart, false, true, false, - false, UserHandle.USER_ALL, reason); + forceStopPackageLocked(pkg, appId, false, false, true, false, + false, userId, reason); } } break; case FINALIZE_PENDING_INTENT_MSG: { @@ -5717,12 +5717,12 @@ public final class ActivityManagerService extends ActivityManagerNative * The pkg name and app id have to be specified. */ @Override - public void killApplicationWithAppId(String pkg, int appid, String reason) { + public void killApplication(String pkg, int appId, int userId, String reason) { if (pkg == null) { return; } // Make sure the uid is valid. - if (appid < 0) { + if (appId < 0) { Slog.w(TAG, "Invalid appid specified for pkg : " + pkg); return; } @@ -5731,8 +5731,8 @@ public final class ActivityManagerService extends ActivityManagerNative if (UserHandle.getAppId(callerUid) == Process.SYSTEM_UID) { // Post an aysnc message to kill the application Message msg = mHandler.obtainMessage(KILL_APPLICATION_MSG); - msg.arg1 = appid; - msg.arg2 = 0; + msg.arg1 = appId; + msg.arg2 = userId; Bundle bundle = new Bundle(); bundle.putString("pkg", pkg); bundle.putString("reason", reason); @@ -21374,8 +21374,8 @@ public final class ActivityManagerService extends ActivityManagerNative } @Override - public void registerUserSwitchObserver(IUserSwitchObserver observer) { - mUserController.registerUserSwitchObserver(observer); + public void registerUserSwitchObserver(IUserSwitchObserver observer, String name) { + mUserController.registerUserSwitchObserver(observer, name); } @Override diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 597b49924d7d..152d34d10525 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -76,6 +76,7 @@ import android.os.UserManager; import android.os.UserManagerInternal; import android.os.storage.IMountService; import android.os.storage.StorageManager; +import android.util.ArraySet; import android.util.IntArray; import android.util.Pair; import android.util.Slog; @@ -86,6 +87,7 @@ import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.Preconditions; import com.android.internal.widget.LockPatternUtils; import com.android.server.LocalServices; import com.android.server.pm.UserManagerService; @@ -151,9 +153,9 @@ final class UserController { = new RemoteCallbackList<>(); /** - * Currently active user switch. + * Currently active user switch callbacks. */ - Object mCurUserSwitchCallback; + private volatile ArraySet<String> mCurWaitingUserSwitchCallbacks; private volatile UserManagerService mUserManager; @@ -1040,7 +1042,8 @@ final class UserController { void timeoutUserSwitch(UserState uss, int oldUserId, int newUserId) { synchronized (mService) { - Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId); + Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId + + ". Observers that didn't send results: " + mCurWaitingUserSwitchCallbacks); sendContinueUserSwitchLocked(uss, oldUserId, newUserId); } } @@ -1049,28 +1052,34 @@ final class UserController { Slog.d(TAG, "Dispatch onUserSwitching oldUser #" + oldUserId + " newUser #" + newUserId); final int observerCount = mUserSwitchObservers.beginBroadcast(); if (observerCount > 0) { - final IRemoteCallback callback = new IRemoteCallback.Stub() { - int mCount = 0; - @Override - public void sendResult(Bundle data) throws RemoteException { - synchronized (mService) { - if (mCurUserSwitchCallback == this) { - mCount++; - if (mCount == observerCount) { - sendContinueUserSwitchLocked(uss, oldUserId, newUserId); - } - } - } - } - }; + final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>(); synchronized (mService) { uss.switching = true; - mCurUserSwitchCallback = callback; + mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks; } for (int i = 0; i < observerCount; i++) { try { - mUserSwitchObservers.getBroadcastItem(i).onUserSwitching( - newUserId, callback); + // Prepend with unique prefix to guarantee that keys are unique + final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i); + mCurWaitingUserSwitchCallbacks.add(name); + final IRemoteCallback callback = new IRemoteCallback.Stub() { + @Override + public void sendResult(Bundle data) throws RemoteException { + synchronized (mService) { + // Early return if this session is no longer valid + if (curWaitingUserSwitchCallbacks + != mCurWaitingUserSwitchCallbacks) { + return; + } + curWaitingUserSwitchCallbacks.remove(name); + // Continue switching if all callbacks have been notified + if (curWaitingUserSwitchCallbacks.isEmpty()) { + sendContinueUserSwitchLocked(uss, oldUserId, newUserId); + } + } + } + }; + mUserSwitchObservers.getBroadcastItem(i).onUserSwitching(newUserId, callback); } catch (RemoteException e) { } } @@ -1083,7 +1092,7 @@ final class UserController { } void sendContinueUserSwitchLocked(UserState uss, int oldUserId, int newUserId) { - mCurUserSwitchCallback = null; + mCurWaitingUserSwitchCallbacks = null; mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG); mHandler.sendMessage(mHandler.obtainMessage(ActivityManagerService.CONTINUE_USER_SWITCH_MSG, oldUserId, newUserId, uss)); @@ -1248,7 +1257,8 @@ final class UserController { ? getCurrentUserIdLocked(): userId; } - void registerUserSwitchObserver(IUserSwitchObserver observer) { + void registerUserSwitchObserver(IUserSwitchObserver observer, String name) { + Preconditions.checkNotNull(name, "Observer name cannot be null"); if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL) != PackageManager.PERMISSION_GRANTED) { final String msg = "Permission Denial: registerUserSwitchObserver() from pid=" @@ -1258,8 +1268,7 @@ final class UserController { Slog.w(TAG, msg); throw new SecurityException(msg); } - - mUserSwitchObservers.register(observer); + mUserSwitchObservers.register(observer, name); } void unregisterUserSwitchObserver(IUserSwitchObserver observer) { diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index cc556c7e45b3..14e4bc66199d 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -1013,7 +1013,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { Slog.w(TAG, "Failed to listen for user switching event" ,e); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d11461b846dd..62cdefa17251 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9557,6 +9557,10 @@ public class PackageManagerService extends IPackageManager.Stub { } private void killApplication(String pkgName, int appId, String reason) { + killApplication(pkgName, appId, UserHandle.USER_ALL, reason); + } + + private void killApplication(String pkgName, int appId, int userId, String reason) { // Request the ActivityManager to kill the process(only for existing packages) // so that we do not end up in a confused state while the user is still using the older // version of the application while the new one gets installed. @@ -9565,7 +9569,7 @@ public class PackageManagerService extends IPackageManager.Stub { IActivityManager am = ActivityManagerNative.getDefault(); if (am != null) { try { - am.killApplicationWithAppId(pkgName, appId, reason); + am.killApplication(pkgName, appId, userId, reason); } catch (RemoteException e) { } } @@ -15578,10 +15582,10 @@ public class PackageManagerService extends IPackageManager.Stub { final PackageRemovedInfo info = new PackageRemovedInfo(); final boolean res; - final UserHandle removeForUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 - ? UserHandle.ALL : new UserHandle(userId); + final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 + ? UserHandle.USER_ALL : userId; - if (isPackageDeviceAdmin(packageName, removeForUser.getIdentifier())) { + if (isPackageDeviceAdmin(packageName, removeUser)) { Slog.w(TAG, "Not removing package " + packageName + ": has active device admin"); return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER; } @@ -15601,11 +15605,21 @@ public class PackageManagerService extends IPackageManager.Stub { info.origUsers = uninstalledPs.queryInstalledUsers(allUsers, true); } + final int freezeUser; + if (isUpdatedSystemApp(uninstalledPs) + && ((deleteFlags & PackageManager.DELETE_SYSTEM_APP) == 0)) { + // We're downgrading a system app, which will apply to all users, so + // freeze them all during the downgrade + freezeUser = UserHandle.USER_ALL; + } else { + freezeUser = removeUser; + } + synchronized (mInstallLock) { if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageX: pkg=" + packageName + " user=" + userId); - try (PackageFreezer freezer = freezePackageForDelete(packageName, deleteFlags, - "deletePackageX")) { - res = deletePackageLIF(packageName, removeForUser, true, allUsers, + try (PackageFreezer freezer = freezePackageForDelete(packageName, freezeUser, + deleteFlags, "deletePackageX")) { + res = deletePackageLIF(packageName, UserHandle.of(removeUser), true, allUsers, deleteFlags | REMOVE_CHATTY, info, true, null); } synchronized (mPackages) { @@ -19860,24 +19874,38 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } public PackageFreezer freezePackage(String packageName, String killReason) { - return new PackageFreezer(packageName, killReason); + return freezePackage(packageName, UserHandle.USER_ALL, killReason); + } + + public PackageFreezer freezePackage(String packageName, int userId, String killReason) { + return new PackageFreezer(packageName, userId, killReason); } public PackageFreezer freezePackageForInstall(String packageName, int installFlags, String killReason) { + return freezePackageForInstall(packageName, UserHandle.USER_ALL, installFlags, killReason); + } + + public PackageFreezer freezePackageForInstall(String packageName, int userId, int installFlags, + String killReason) { if ((installFlags & PackageManager.INSTALL_DONT_KILL_APP) != 0) { return new PackageFreezer(); } else { - return freezePackage(packageName, killReason); + return freezePackage(packageName, userId, killReason); } } public PackageFreezer freezePackageForDelete(String packageName, int deleteFlags, String killReason) { + return freezePackageForDelete(packageName, UserHandle.USER_ALL, deleteFlags, killReason); + } + + public PackageFreezer freezePackageForDelete(String packageName, int userId, int deleteFlags, + String killReason) { if ((deleteFlags & PackageManager.DELETE_DONT_KILL_APP) != 0) { return new PackageFreezer(); } else { - return freezePackage(packageName, killReason); + return freezePackage(packageName, userId, killReason); } } @@ -19908,14 +19936,14 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); mCloseGuard.open("close"); } - public PackageFreezer(String packageName, String killReason) { + public PackageFreezer(String packageName, int userId, String killReason) { synchronized (mPackages) { mPackageName = packageName; mWeFroze = mFrozenPackages.add(mPackageName); final PackageSetting ps = mSettings.mPackages.get(mPackageName); if (ps != null) { - killApplication(ps.name, ps.appId, killReason); + killApplication(ps.name, ps.appId, userId, killReason); } final PackageParser.Package p = mPackages.get(packageName); @@ -19924,7 +19952,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); mChildren = new PackageFreezer[N]; for (int i = 0; i < N; i++) { mChildren[i] = new PackageFreezer(p.childPackages.get(i).packageName, - killReason); + userId, killReason); } } else { mChildren = null; @@ -20063,7 +20091,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); seinfo = pkg.applicationInfo.seinfo; label = String.valueOf(pm.getApplicationLabel(pkg.applicationInfo)); targetSdkVersion = pkg.applicationInfo.targetSdkVersion; - freezer = new PackageFreezer(packageName, "movePackageInternal"); + freezer = freezePackage(packageName, "movePackageInternal"); installedUserIds = ps.queryInstalledUsers(sUserManager.getUserIds(), true); } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index efd238201e7a..7c2ba1eaaac1 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -906,10 +906,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { public void onForegroundProfileSwitch(int newProfileId) { // Ignore. } - }); + }, TAG); } catch (RemoteException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + e.rethrowAsRuntimeException(); } } diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 5843fbbe7532..39302081b79a 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -367,6 +367,14 @@ public abstract class Connection extends Conferenceable { public static final String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; /** + * Boolean connection extra key set on a {@link Connection} in + * {@link Connection#STATE_RINGING} state to indicate that answering the call will cause the + * current active foreground call to be dropped. + */ + public static final String EXTRA_ANSWERING_DROPS_FG_CALL = + "android.telecom.extra.ANSWERING_DROPS_FG_CALL"; + + /** * Connection event used to inform Telecom that it should play the on hold tone. This is used * to play a tone when the peer puts the current call on hold. Sent to Telecom via * {@link #sendConnectionEvent(String)}. diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index e0de2611cf2d..2458cc8c85ae 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -787,6 +787,27 @@ public class CarrierConfigManager { public static final String KEY_RATCHET_RAT_FAMILIES = "ratchet_rat_families"; + /** + * Flag indicating whether some telephony logic will treat a call which was formerly a video + * call as if it is still a video call. When {@code true}: + * <p> + * Logic which will automatically drop a video call which takes place over WIFI when a + * voice call is answered (see {@link #KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL}. + * <p> + * Logic which determines whether the user can use TTY calling. + */ + public static final String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = + "treat_downgraded_video_calls_as_video_calls_bool"; + + /** + * When {@code true}, if the user is in an ongoing video call over WIFI and answers an incoming + * audio call, the video call will be disconnected before the audio call is answered. This is + * in contrast to the usual expected behavior where a foreground video call would be put into + * the background and held when an incoming audio call is answered. + */ + public static final String KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL = + "drop_video_call_when_answering_audio_call_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -933,10 +954,13 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_SIGNAL_PCO_RECEIVER_STRING_ARRAY, null); sDefaults.putString(KEY_CARRIER_SETUP_APP_STRING, ""); - // Rat families: {GPRS, EDGE}, {EVDO, EVDO_A, EVDO_B}, {UMTS, HSPA, HSDPA, HSUPA, HSPAP} + // Rat families: {GPRS, EDGE}, {EVDO, EVDO_A, EVDO_B}, {UMTS, HSPA, HSDPA, HSUPA, HSPAP}, + // {LTE, LTE_CA} // Order is important - lowest precidence first sDefaults.putStringArray(KEY_RATCHET_RAT_FAMILIES, - new String[]{"1,2","7,8,12","3,11,9,10,15"}); + new String[]{"1,2","7,8,12","3,11,9,10,15","14,19"}); + sDefaults.putBoolean(KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL, true); + sDefaults.putBoolean(KEY_DROP_VIDEO_CALL_WHEN_ANSWERING_AUDIO_CALL_BOOL, true); } /** diff --git a/telephony/java/android/telephony/RadioAccessFamily.java b/telephony/java/android/telephony/RadioAccessFamily.java index 2bfaf1bfd86d..b530a6405a62 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 | 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 39a9295ed8b6..8446dd04326c 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -155,6 +155,12 @@ public class ServiceState implements Parcelable { */ public static final int RIL_RADIO_TECHNOLOGY_IWLAN = 18; + /** + * LTE_CA + * @hide + */ + public static final int RIL_RADIO_TECHNOLOGY_LTE_CA = 19; + /** @hide */ public static final int RIL_RADIO_CDMA_TECHNOLOGY_BITMASK = (1 << (RIL_RADIO_TECHNOLOGY_IS95A - 1)) @@ -746,6 +752,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); @@ -1088,6 +1097,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 +1150,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 */ @@ -1154,6 +1167,12 @@ public class ServiceState implements Parcelable { } /** @hide */ + public static boolean isLte(int radioTechnology) { + return radioTechnology == RIL_RADIO_TECHNOLOGY_LTE || + radioTechnology == RIL_RADIO_TECHNOLOGY_LTE_CA; + } + + /** @hide */ public static boolean bearerBitmapHasCdma(int radioTechnologyBitmap) { return (RIL_RADIO_CDMA_TECHNOLOGY_BITMASK & radioTechnologyBitmap) != 0; } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 8810cd9d5727..8e36f48f9fca 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1451,7 +1451,8 @@ public class TelephonyManager { public static final int NETWORK_TYPE_TD_SCDMA = 17; /** Current network is IWLAN */ 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. */ @@ -1654,6 +1655,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; @@ -1717,6 +1719,8 @@ public class TelephonyManager { return "TD_SCDMA"; case NETWORK_TYPE_IWLAN: return "IWLAN"; + case NETWORK_TYPE_LTE_CA: + return "LTE_CA"; default: return "UNKNOWN"; } diff --git a/telephony/java/com/android/ims/ImsCallProfile.java b/telephony/java/com/android/ims/ImsCallProfile.java index 92b70e86cb06..65254d8abc88 100644 --- a/telephony/java/com/android/ims/ImsCallProfile.java +++ b/telephony/java/com/android/ims/ImsCallProfile.java @@ -448,6 +448,15 @@ public class ImsCallProfile implements Parcelable { } /** + * Determines if the {@link ImsCallProfile} represents a video call. + * + * @return {@code true} if the profile is for a video call, {@code false} otherwise. + */ + public boolean isVideoCall() { + return VideoProfile.isVideo(getVideoStateFromCallType(mCallType)); + } + + /** * Determines if a video state is set in a video state bit-mask. * * @param videoState The video state bit mask. diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java index 1680fe33ead7..b417a1c9e206 100644 --- a/telephony/java/com/android/internal/telephony/PhoneConstants.java +++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java @@ -208,4 +208,14 @@ public class PhoneConstants { public static final int AUTH_CONTEXT_EAP_SIM = 128; public static final int AUTH_CONTEXT_EAP_AKA = 129; public static final int AUTH_CONTEXT_UNDEFINED = -1; + + /** + * Value for the global property CELL_ON + * 0: Cell radio is off + * 1: Cell radio is on + * 2: Cell radio is off because airplane mode is enabled + */ + public static final int CELL_OFF_FLAG = 0; + public static final int CELL_ON_FLAG = 1; + public static final int CELL_OFF_DUE_TO_AIRPLANE_MODE_FLAG = 2; } |