summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/app/BackStackRecord.java102
-rw-r--r--core/java/android/content/Context.java8
-rw-r--r--core/java/android/hardware/camera2/CameraCharacteristics.java6
-rw-r--r--core/java/android/hardware/camera2/CaptureResult.java6
-rw-r--r--core/java/android/hardware/camera2/impl/CameraDeviceImpl.java17
-rw-r--r--core/java/android/os/PowerManager.java21
-rw-r--r--core/java/android/provider/Settings.java9
-rw-r--r--core/java/android/text/style/TtsSpan.java2
-rw-r--r--core/java/android/transition/Explode.java4
-rw-r--r--core/java/android/transition/Slide.java4
-rw-r--r--core/java/android/transition/TranslationAnimationCreator.java32
-rw-r--r--core/java/android/view/View.java29
-rw-r--r--core/java/android/view/ViewPropertyAnimator.java15
-rw-r--r--core/java/com/android/internal/app/AssistUtils.java129
-rw-r--r--core/res/AndroidManifest.xml2
15 files changed, 329 insertions, 57 deletions
diff --git a/core/java/android/app/BackStackRecord.java b/core/java/android/app/BackStackRecord.java
index 02e26a5..903411e 100644
--- a/core/java/android/app/BackStackRecord.java
+++ b/core/java/android/app/BackStackRecord.java
@@ -28,7 +28,6 @@ import android.transition.TransitionSet;
import android.util.ArrayMap;
import android.util.Log;
import android.util.LogWriter;
-import android.util.Pair;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
@@ -1005,13 +1004,20 @@ final class BackStackRecord extends FragmentTransaction implements
outFragment.getExitTransition());
}
- private static Transition getSharedElementTransition(Fragment inFragment, Fragment outFragment,
- boolean isBack) {
+ private static TransitionSet getSharedElementTransition(Fragment inFragment,
+ Fragment outFragment, boolean isBack) {
if (inFragment == null || outFragment == null) {
return null;
}
- return cloneTransition(isBack ? outFragment.getSharedElementReturnTransition() :
- inFragment.getSharedElementEnterTransition());
+ Transition transition = cloneTransition(isBack
+ ? outFragment.getSharedElementReturnTransition()
+ : inFragment.getSharedElementEnterTransition());
+ if (transition == null) {
+ return null;
+ }
+ TransitionSet transitionSet = new TransitionSet();
+ transitionSet.addTransition(transition);
+ return transitionSet;
}
private static ArrayList<View> captureExitingViews(Transition exitTransition,
@@ -1070,7 +1076,7 @@ final class BackStackRecord extends FragmentTransaction implements
* capturing the final state of the Transition.</p>
*/
private ArrayList<View> addTransitionTargets(final TransitionState state,
- final Transition enterTransition, final Transition sharedElementTransition,
+ final Transition enterTransition, final TransitionSet sharedElementTransition,
final Transition overallTransition, final View container,
final Fragment inFragment, final Fragment outFragment,
final ArrayList<View> hiddenFragmentViews, final boolean isBack,
@@ -1094,11 +1100,8 @@ final class BackStackRecord extends FragmentTransaction implements
if (sharedElementTransition != null) {
namedViews = mapSharedElementsIn(state, isBack, inFragment);
removeTargets(sharedElementTransition, sharedElementTargets);
- sharedElementTargets.clear();
- sharedElementTargets.add(state.nonExistentView);
- sharedElementTargets.addAll(namedViews.values());
-
- addTargets(sharedElementTransition, sharedElementTargets);
+ setSharedElementTargets(sharedElementTransition,
+ state.nonExistentView, namedViews, sharedElementTargets);
setEpicenterIn(namedViews, state);
@@ -1241,8 +1244,8 @@ final class BackStackRecord extends FragmentTransaction implements
Fragment outFragment = firstOutFragments.get(containerId);
Transition enterTransition = getEnterTransition(inFragment, isBack);
- Transition sharedElementTransition = getSharedElementTransition(inFragment, outFragment,
- isBack);
+ TransitionSet sharedElementTransition =
+ getSharedElementTransition(inFragment, outFragment, isBack);
Transition exitTransition = getExitTransition(outFragment, isBack);
if (enterTransition == null && sharedElementTransition == null &&
@@ -1256,9 +1259,8 @@ final class BackStackRecord extends FragmentTransaction implements
ArrayList<View> sharedElementTargets = new ArrayList<View>();
if (sharedElementTransition != null) {
namedViews = remapSharedElements(state, outFragment, isBack);
- sharedElementTargets.add(state.nonExistentView);
- sharedElementTargets.addAll(namedViews.values());
- addTargets(sharedElementTransition, sharedElementTargets);
+ setSharedElementTargets(sharedElementTransition,
+ state.nonExistentView, namedViews, sharedElementTargets);
// Notify the start of the transition.
SharedElementCallback callback = isBack ?
@@ -1294,8 +1296,8 @@ final class BackStackRecord extends FragmentTransaction implements
if (transition != null) {
ArrayList<View> hiddenFragments = new ArrayList<View>();
ArrayList<View> enteringViews = addTransitionTargets(state, enterTransition,
- sharedElementTransition, transition, sceneRoot, inFragment, outFragment,
- hiddenFragments, isBack, sharedElementTargets);
+ sharedElementTransition, transition, sceneRoot, inFragment,
+ outFragment, hiddenFragments, isBack, sharedElementTargets);
transition.setNameOverrides(state.nameOverrides);
// We want to exclude hidden views later, so we need a non-null list in the
@@ -1307,9 +1309,71 @@ final class BackStackRecord extends FragmentTransaction implements
// Remove the view targeting after the transition starts
removeTargetedViewsFromTransitions(sceneRoot, state.nonExistentView,
enterTransition, enteringViews, exitTransition, exitingViews,
- sharedElementTransition, sharedElementTargets, transition, hiddenFragments);
+ sharedElementTransition, sharedElementTargets, transition,
+ hiddenFragments);
+ }
+ }
+ }
+
+ /**
+ * Finds all children of the shared elements and sets the wrapping TransitionSet
+ * targets to point to those. It also limits transitions that have no targets to the
+ * specific shared elements. This allows developers to target child views of the
+ * shared elements specifically, but this doesn't happen by default.
+ */
+ private static void setSharedElementTargets(TransitionSet transition,
+ View nonExistentView, ArrayMap<String, View> namedViews,
+ ArrayList<View> sharedElementTargets) {
+ sharedElementTargets.clear();
+ sharedElementTargets.addAll(namedViews.values());
+
+ final List<View> views = transition.getTargets();
+ views.clear();
+ final int count = sharedElementTargets.size();
+ for (int i = 0; i < count; i++) {
+ final View view = sharedElementTargets.get(i);
+ bfsAddViewChildren(views, view);
+ }
+ sharedElementTargets.add(nonExistentView);
+ addTargets(transition, sharedElementTargets);
+ }
+
+ /**
+ * Uses a breadth-first scheme to add startView and all of its children to views.
+ * It won't add a child if it is already in views.
+ */
+ private static void bfsAddViewChildren(final List<View> views, final View startView) {
+ final int startIndex = views.size();
+ if (containedBeforeIndex(views, startView, startIndex)) {
+ return; // This child is already in the list, so all its children are also.
+ }
+ views.add(startView);
+ for (int index = startIndex; index < views.size(); index++) {
+ final View view = views.get(index);
+ if (view instanceof ViewGroup) {
+ ViewGroup viewGroup = (ViewGroup) view;
+ final int childCount = viewGroup.getChildCount();
+ for (int childIndex = 0; childIndex < childCount; childIndex++) {
+ final View child = viewGroup.getChildAt(childIndex);
+ if (!containedBeforeIndex(views, child, startIndex)) {
+ views.add(child);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Does a linear search through views for view, limited to maxIndex.
+ */
+ private static boolean containedBeforeIndex(final List<View> views, final View view,
+ final int maxIndex) {
+ for (int i = 0; i < maxIndex; i++) {
+ if (views.get(i) == view) {
+ return true;
}
}
+ return false;
}
/**
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 970623a..83ce087 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -2248,6 +2248,7 @@ public abstract class Context {
//@hide: VOICE_INTERACTION_MANAGER_SERVICE,
//@hide: BACKUP_SERVICE,
DROPBOX_SERVICE,
+ //@hide: DEVICE_IDLE_CONTROLLER,
DEVICE_POLICY_SERVICE,
UI_MODE_SERVICE,
DOWNLOAD_SERVICE,
@@ -2874,6 +2875,13 @@ public abstract class Context {
public static final String DROPBOX_SERVICE = "dropbox";
/**
+ * System service name for the DeviceIdleController. There is no Java API for this.
+ * @see #getSystemService
+ * @hide
+ */
+ public static final String DEVICE_IDLE_CONTROLLER = "deviceidle";
+
+ /**
* Use with {@link #getSystemService} to retrieve a
* {@link android.app.admin.DevicePolicyManager} for working with global
* device policy management.
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index b69ca88..921e9f1 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -1109,13 +1109,13 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri
/**
* <p>The correction coefficients to correct for this camera device's
* radial and tangential lens distortion.</p>
- * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2,
+ * <p>Four radial distortion coefficients <code>[kappa_0, kappa_1, kappa_2,
* kappa_3]</code> and two tangential distortion coefficients
* <code>[kappa_4, kappa_5]</code> that can be used to correct the
* lens's geometric distortion with the mapping equations:</p>
- * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * <pre><code> x_c = x_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
* kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 )
- * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * y_c = y_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
* kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 )
* </code></pre>
* <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index 3bb2fdb..479583c 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -2671,13 +2671,13 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> {
/**
* <p>The correction coefficients to correct for this camera device's
* radial and tangential lens distortion.</p>
- * <p>Three radial distortion coefficients <code>[kappa_1, kappa_2,
+ * <p>Four radial distortion coefficients <code>[kappa_0, kappa_1, kappa_2,
* kappa_3]</code> and two tangential distortion coefficients
* <code>[kappa_4, kappa_5]</code> that can be used to correct the
* lens's geometric distortion with the mapping equations:</p>
- * <pre><code> x_c = x_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * <pre><code> x_c = x_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
* kappa_4 * (2 * x_i * y_i) + kappa_5 * ( r^2 + 2 * x_i^2 )
- * y_c = y_i * ( 1 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
+ * y_c = y_i * ( kappa_0 + kappa_1 * r^2 + kappa_2 * r^4 + kappa_3 * r^6 ) +
* kappa_5 * (2 * x_i * y_i) + kappa_4 * ( r^2 + 2 * y_i^2 )
* </code></pre>
* <p>Here, <code>[x_c, y_c]</code> are the coordinates to sample in the
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index 8512b23..a1ebe6a 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -2053,8 +2053,10 @@ public class CameraDeviceImpl extends CameraDevice {
requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
// Overwrite the capture intent to make sure a good value is set.
- Surface[] surfaces = (Surface[])outputSurfaces.toArray();
- if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(surfaces[0])) {
+ Iterator<Surface> iterator = outputSurfaces.iterator();
+ Surface firstSurface = iterator.next();
+ Surface secondSurface = null;
+ if (outputSurfaces.size() == 1 && SurfaceUtils.isSurfaceForHwVideoEncoder(firstSurface)) {
singleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_PREVIEW);
} else {
@@ -2071,19 +2073,20 @@ public class CameraDeviceImpl extends CameraDevice {
requestMetadata, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE);
doubleTargetRequestBuilder.set(CaptureRequest.CONTROL_CAPTURE_INTENT,
CaptureRequest.CONTROL_CAPTURE_INTENT_VIDEO_RECORD);
- doubleTargetRequestBuilder.addTarget(surfaces[0]);
- doubleTargetRequestBuilder.addTarget(surfaces[1]);
+ doubleTargetRequestBuilder.addTarget(firstSurface);
+ secondSurface = iterator.next();
+ doubleTargetRequestBuilder.addTarget(secondSurface);
doubleTargetRequestBuilder.setPartOfCHSRequestList(/*partOfCHSList*/true);
// Make sure singleTargetRequestBuilder contains only recording surface for
// preview + recording case.
- Surface recordingSurface = surfaces[0];
+ Surface recordingSurface = firstSurface;
if (!SurfaceUtils.isSurfaceForHwVideoEncoder(recordingSurface)) {
- recordingSurface = surfaces[1];
+ recordingSurface = secondSurface;
}
singleTargetRequestBuilder.addTarget(recordingSurface);
} else {
// Single output case: either recording or preview.
- singleTargetRequestBuilder.addTarget(surfaces[0]);
+ singleTargetRequestBuilder.addTarget(firstSurface);
}
// Generate the final request list.
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 7a1aa1e..6ef1cd0 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -392,6 +392,8 @@ public final class PowerManager {
final IPowerManager mService;
final Handler mHandler;
+ IDeviceIdleController mIDeviceIdleController;
+
/**
* {@hide}
*/
@@ -892,6 +894,25 @@ public final class PowerManager {
}
/**
+ * Return whether the given application package name is on the device's power whitelist.
+ * Apps can be placed on the whitelist through the settings UI invoked by
+ * {@link android.provider.Settings#ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS}.
+ */
+ public boolean isIgnoringBatteryOptimizations(String packageName) {
+ synchronized (this) {
+ if (mIDeviceIdleController == null) {
+ mIDeviceIdleController = IDeviceIdleController.Stub.asInterface(
+ ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER));
+ }
+ }
+ try {
+ return mIDeviceIdleController.isPowerSaveWhitelistApp(packageName);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ /**
* Turn off the device.
*
* @param confirm If true, shows a shutdown confirmation dialog.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index e335f6d..dfd72c2 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -579,13 +579,14 @@ public final class Settings {
/**
* Activity Action: Show screen for controlling which apps can ignore battery optimizations.
* <p>
- * In some cases, a matching Activity may not exist, so ensure you
- * safeguard against this.
- * <p>
- * Input: The Intent's data URI specifies the application package name
+ * Input: Optionally, the Intent's data URI specifies the application package name
* to be shown, with the "package" scheme. That is "package:com.my.app".
* <p>
* Output: Nothing.
+ * <p>
+ * You can use {@link android.os.PowerManager#isIgnoringBatteryOptimizations
+ * PowerManager.isIgnoringBatteryOptimizations()} to determine if an application is
+ * already ignoring optimizations.
*/
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS =
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index c40f11f..93a156b 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -165,7 +165,7 @@ public class TtsSpan implements ParcelableSpan {
/**
* The text associated with this span is a series of characters that have to
- * be read verbatim. The engine will attempt to ready out any character like
+ * be read verbatim. The engine will attempt to read out any character like
* punctuation but excluding whitespace. {@link #ARG_VERBATIM} is required.
* Also accepts the arguments {@link #ARG_GENDER},
* {@link #ARG_ANIMACY}, {@link #ARG_MULTIPLICITY} and {@link #ARG_CASE}.
diff --git a/core/java/android/transition/Explode.java b/core/java/android/transition/Explode.java
index 788676a..3445ef2 100644
--- a/core/java/android/transition/Explode.java
+++ b/core/java/android/transition/Explode.java
@@ -90,7 +90,7 @@ public class Explode extends Visibility {
float startY = endY + mTempLoc[1];
return TranslationAnimationCreator.createAnimation(view, endValues, bounds.left, bounds.top,
- startX, startY, endX, endY, sDecelerate);
+ startX, startY, endX, endY, sDecelerate, this);
}
@Override
@@ -119,7 +119,7 @@ public class Explode extends Visibility {
endY += mTempLoc[1];
return TranslationAnimationCreator.createAnimation(view, startValues,
- viewPosX, viewPosY, startX, startY, endX, endY, sAccelerate);
+ viewPosX, viewPosY, startX, startY, endX, endY, sAccelerate, this);
}
private void calculateOut(View sceneRoot, Rect bounds, int[] outVector) {
diff --git a/core/java/android/transition/Slide.java b/core/java/android/transition/Slide.java
index be1d907..9063b43 100644
--- a/core/java/android/transition/Slide.java
+++ b/core/java/android/transition/Slide.java
@@ -231,7 +231,7 @@ public class Slide extends Visibility {
float startY = mSlideCalculator.getGoneY(sceneRoot, view);
return TranslationAnimationCreator
.createAnimation(view, endValues, position[0], position[1],
- startX, startY, endX, endY, sDecelerate);
+ startX, startY, endX, endY, sDecelerate, this);
}
@Override
@@ -247,6 +247,6 @@ public class Slide extends Visibility {
float endY = mSlideCalculator.getGoneY(sceneRoot, view);
return TranslationAnimationCreator
.createAnimation(view, startValues, position[0], position[1],
- startX, startY, endX, endY, sAccelerate);
+ startX, startY, endX, endY, sAccelerate, this);
}
}
diff --git a/core/java/android/transition/TranslationAnimationCreator.java b/core/java/android/transition/TranslationAnimationCreator.java
index de71fd7..1554975 100644
--- a/core/java/android/transition/TranslationAnimationCreator.java
+++ b/core/java/android/transition/TranslationAnimationCreator.java
@@ -22,6 +22,7 @@ import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.graphics.Path;
+import android.transition.Transition.TransitionListener;
import android.view.View;
/**
@@ -48,7 +49,8 @@ class TranslationAnimationCreator {
* a previous interruption, in which case it moves from the current position to (endX, endY).
*/
static Animator createAnimation(View view, TransitionValues values, int viewPosX, int viewPosY,
- float startX, float startY, float endX, float endY, TimeInterpolator interpolator) {
+ float startX, float startY, float endX, float endY, TimeInterpolator interpolator,
+ Transition transition) {
float terminalX = view.getTranslationX();
float terminalY = view.getTranslationY();
int[] startPosition = (int[]) values.view.getTag(R.id.transitionPosition);
@@ -73,13 +75,15 @@ class TranslationAnimationCreator {
TransitionPositionListener listener = new TransitionPositionListener(view, values.view,
startPosX, startPosY, terminalX, terminalY);
+ transition.addListener(listener);
anim.addListener(listener);
anim.addPauseListener(listener);
anim.setInterpolator(interpolator);
return anim;
}
- private static class TransitionPositionListener extends AnimatorListenerAdapter {
+ private static class TransitionPositionListener extends AnimatorListenerAdapter implements
+ TransitionListener {
private final View mViewInHierarchy;
private final View mMovingView;
@@ -117,8 +121,6 @@ class TranslationAnimationCreator {
@Override
public void onAnimationEnd(Animator animator) {
- mMovingView.setTranslationX(mTerminalX);
- mMovingView.setTranslationY(mTerminalY);
}
@Override
@@ -134,6 +136,28 @@ class TranslationAnimationCreator {
mMovingView.setTranslationX(mPausedX);
mMovingView.setTranslationY(mPausedY);
}
+
+ @Override
+ public void onTransitionStart(Transition transition) {
+ }
+
+ @Override
+ public void onTransitionEnd(Transition transition) {
+ mMovingView.setTranslationX(mTerminalX);
+ mMovingView.setTranslationY(mTerminalY);
+ }
+
+ @Override
+ public void onTransitionCancel(Transition transition) {
+ }
+
+ @Override
+ public void onTransitionPause(Transition transition) {
+ }
+
+ @Override
+ public void onTransitionResume(Transition transition) {
+ }
}
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 0df8ea9..fd3ee4f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -56,6 +56,8 @@ import android.graphics.Shader;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManagerGlobal;
+import android.os.Build;
+import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -95,6 +97,7 @@ import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.widget.Checkable;
+import android.widget.FrameLayout;
import android.widget.ScrollBarDrawable;
import static android.os.Build.VERSION_CODES.*;
@@ -4274,23 +4277,33 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
PROVIDER_BACKGROUND));
break;
case R.styleable.View_foreground:
- setForeground(a.getDrawable(attr));
+ if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) {
+ setForeground(a.getDrawable(attr));
+ }
break;
case R.styleable.View_foregroundGravity:
- setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY));
+ if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) {
+ setForegroundGravity(a.getInt(attr, Gravity.NO_GRAVITY));
+ }
break;
case R.styleable.View_foregroundTintMode:
- setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null));
+ if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) {
+ setForegroundTintMode(Drawable.parseTintMode(a.getInt(attr, -1), null));
+ }
break;
case R.styleable.View_foregroundTint:
- setForegroundTintList(a.getColorStateList(attr));
+ if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) {
+ setForegroundTintList(a.getColorStateList(attr));
+ }
break;
case R.styleable.View_foregroundInsidePadding:
- if (mForegroundInfo == null) {
- mForegroundInfo = new ForegroundInfo();
+ if (targetSdkVersion >= VERSION_CODES.MNC || this instanceof FrameLayout) {
+ if (mForegroundInfo == null) {
+ mForegroundInfo = new ForegroundInfo();
+ }
+ mForegroundInfo.mInsidePadding = a.getBoolean(attr,
+ mForegroundInfo.mInsidePadding);
}
- mForegroundInfo.mInsidePadding = a.getBoolean(attr,
- mForegroundInfo.mInsidePadding);
break;
case R.styleable.View_scrollIndicators:
final int scrollIndicators =
diff --git a/core/java/android/view/ViewPropertyAnimator.java b/core/java/android/view/ViewPropertyAnimator.java
index bd45007..f18b7ac 100644
--- a/core/java/android/view/ViewPropertyAnimator.java
+++ b/core/java/android/view/ViewPropertyAnimator.java
@@ -80,12 +80,18 @@ public class ViewPropertyAnimator {
/**
* The interpolator of the underlying Animator object. By default, we don't set the interpolator
- * on the Animator and just use its default interpolator. If the interpolator is set to a
- * non-null value on this Animator, then we use the interpolator that it was set to.
+ * on the Animator and just use its default interpolator. If the interpolator is ever set on
+ * this Animator, then we use the interpolator that it was set to.
*/
private TimeInterpolator mInterpolator;
/**
+ * A flag indicating whether the interpolator has been set on this object. If not, we don't set
+ * the interpolator on the underlying Animator, but instead just use its default interpolator.
+ */
+ private boolean mInterpolatorSet = false;
+
+ /**
* Listener for the lifecycle events of the underlying ValueAnimator object.
*/
private Animator.AnimatorListener mListener = null;
@@ -332,6 +338,7 @@ public class ViewPropertyAnimator {
* @return This object, allowing calls to methods in this class to be chained.
*/
public ViewPropertyAnimator setInterpolator(TimeInterpolator interpolator) {
+ mInterpolatorSet = true;
mInterpolator = interpolator;
return this;
}
@@ -342,7 +349,7 @@ public class ViewPropertyAnimator {
* @return The timing interpolator for this animation.
*/
public TimeInterpolator getInterpolator() {
- if (mInterpolator != null) {
+ if (mInterpolatorSet) {
return mInterpolator;
} else {
// Just return the default from ValueAnimator, since that's what we'd get if
@@ -890,7 +897,7 @@ public class ViewPropertyAnimator {
if (mDurationSet) {
animator.setDuration(mDuration);
}
- if (mInterpolator != null) {
+ if (mInterpolatorSet) {
animator.setInterpolator(mInterpolator);
}
animator.start();
diff --git a/core/java/com/android/internal/app/AssistUtils.java b/core/java/com/android/internal/app/AssistUtils.java
new file mode 100644
index 0000000..b520384
--- /dev/null
+++ b/core/java/com/android/internal/app/AssistUtils.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.internal.app;
+
+import android.app.SearchManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+import android.util.Log;
+
+/**
+ * Utility method for dealing with the assistant aspects of
+ * {@link com.android.internal.app.IVoiceInteractionManagerService IVoiceInteractionManagerService}.
+ */
+public class AssistUtils {
+
+ private static final String TAG = "AssistUtils";
+
+ private final Context mContext;
+ private final IVoiceInteractionManagerService mVoiceInteractionManagerService;
+
+ public AssistUtils(Context context) {
+ mContext = context;
+ mVoiceInteractionManagerService = IVoiceInteractionManagerService.Stub.asInterface(
+ ServiceManager.getService(Context.VOICE_INTERACTION_MANAGER_SERVICE));
+ }
+
+ public void showSessionForActiveService(IVoiceInteractionSessionShowCallback showCallback) {
+ try {
+ mVoiceInteractionManagerService.showSessionForActiveService(showCallback);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call showSessionForActiveService", e);
+ }
+ }
+
+ public void launchVoiceAssistFromKeyguard() {
+ try {
+ mVoiceInteractionManagerService.launchVoiceAssistFromKeyguard();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call launchVoiceAssistFromKeyguard", e);
+ }
+ }
+
+ public boolean activeServiceSupportsAssistGesture() {
+ try {
+ return mVoiceInteractionManagerService != null
+ && mVoiceInteractionManagerService.activeServiceSupportsAssist();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call activeServiceSupportsAssistGesture", e);
+ return false;
+ }
+ }
+
+ public boolean activeServiceSupportsLaunchFromKeyguard() {
+ try {
+ return mVoiceInteractionManagerService != null
+ && mVoiceInteractionManagerService.activeServiceSupportsLaunchFromKeyguard();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call activeServiceSupportsLaunchFromKeyguard", e);
+ return false;
+ }
+ }
+
+ public ComponentName getActiveServiceComponentName() {
+ try {
+ return mVoiceInteractionManagerService.getActiveServiceComponentName();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call getActiveServiceComponentName", e);
+ return null;
+ }
+ }
+
+ public boolean isSessionRunning() {
+ try {
+ return mVoiceInteractionManagerService != null
+ && mVoiceInteractionManagerService.isSessionRunning();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call isSessionRunning", e);
+ return false;
+ }
+ }
+
+ public void hideCurrentSession() {
+ try {
+ mVoiceInteractionManagerService.hideCurrentSession();
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to call hideCurrentSession", e);
+ }
+ }
+
+ public ComponentName getAssistComponentForUser(int userId) {
+ final String setting = Settings.Secure.getStringForUser(mContext.getContentResolver(),
+ Settings.Secure.ASSISTANT, userId);
+ if (setting != null) {
+ return ComponentName.unflattenFromString(setting);
+ }
+
+ // Fallback to keep backward compatible behavior when there is no user setting.
+ if (activeServiceSupportsAssistGesture()) {
+ return getActiveServiceComponentName();
+ }
+
+ Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE))
+ .getAssistIntent(mContext, false, userId);
+ if (intent != null) {
+ return intent.getComponent();
+ }
+
+ return null;
+ }
+
+}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index a434a13..65c064b 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -289,6 +289,8 @@
<protected-broadcast android:name="android.location.GPS_FIX_CHANGE" />
<protected-broadcast android:name="android.net.proxy.PAC_REFRESH" />
+ <protected-broadcast android:name="android.telecom.action.DEFAULT_DIALER_CHANGED" />
+
<protected-broadcast
android:name="com.android.server.connectivityservice.CONNECTED_TO_PROVISIONING_NETWORK_ACTION" />