diff options
Diffstat (limited to 'core/java/android')
4 files changed, 90 insertions, 11 deletions
diff --git a/core/java/android/hardware/camera2/DngCreator.java b/core/java/android/hardware/camera2/DngCreator.java index 54568ed..e64deeb 100644 --- a/core/java/android/hardware/camera2/DngCreator.java +++ b/core/java/android/hardware/camera2/DngCreator.java @@ -22,12 +22,16 @@ import android.hardware.camera2.impl.CameraMetadataNative; import android.location.Location; import android.media.ExifInterface; import android.media.Image; +import android.os.SystemClock; import android.util.Size; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.TimeZone; /** * The {@link DngCreator} class provides functions to write raw pixel data as a DNG file. @@ -55,6 +59,7 @@ import java.nio.ByteBuffer; */ public final class DngCreator implements AutoCloseable { + private static final String TAG = "DngCreator"; /** * Create a new DNG object. * @@ -75,7 +80,25 @@ public final class DngCreator implements AutoCloseable { if (characteristics == null || metadata == null) { throw new NullPointerException("Null argument to DngCreator constructor"); } - nativeInit(characteristics.getNativeCopy(), metadata.getNativeCopy()); + + // Find current time + long currentTime = System.currentTimeMillis(); + + // Find boot time + long bootTimeMillis = currentTime - SystemClock.elapsedRealtime(); + + // Find capture time (nanos since boot) + Long timestamp = metadata.get(CaptureResult.SENSOR_TIMESTAMP); + long captureTime = currentTime; + if (timestamp != null) { + captureTime = timestamp / 1000000 + bootTimeMillis; + } + + // Format for metadata + String formattedCaptureTime = sDateTimeStampFormat.format(captureTime); + + nativeInit(characteristics.getNativeCopy(), metadata.getNativeCopy(), + formattedCaptureTime); } /** @@ -329,6 +352,13 @@ public final class DngCreator implements AutoCloseable { } } + private static final String TIFF_DATETIME_FORMAT = "yyyy:MM:dd kk:mm:ss"; + private static final DateFormat sDateTimeStampFormat = + new SimpleDateFormat(TIFF_DATETIME_FORMAT); + + static { + sDateTimeStampFormat.setTimeZone(TimeZone.getDefault()); + } /** * This field is used by native code, do not access or modify. */ @@ -337,7 +367,8 @@ public final class DngCreator implements AutoCloseable { private static native void nativeClassInit(); private synchronized native void nativeInit(CameraMetadataNative nativeCharacteristics, - CameraMetadataNative nativeResult); + CameraMetadataNative nativeResult, + String captureTime); private synchronized native void nativeDestroy(); diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index d02fc7b..68a3d30 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -21,6 +21,7 @@ import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.Slog; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -37,6 +38,7 @@ import java.util.Objects; * @hide */ public class ZenModeConfig implements Parcelable { + private static String TAG = "ZenModeConfig"; public static final String SLEEP_MODE_NIGHTS = "nights"; public static final String SLEEP_MODE_WEEKNIGHTS = "weeknights"; @@ -65,6 +67,9 @@ public class ZenModeConfig implements Parcelable { private static final String CONDITION_ATT_COMPONENT = "component"; private static final String CONDITION_ATT_ID = "id"; + private static final String EXIT_CONDITION_TAG = "exitCondition"; + private static final String EXIT_CONDITION_ATT_ID = "id"; + public boolean allowCalls; public boolean allowMessages; public int allowFrom = SOURCE_ANYONE; @@ -76,6 +81,7 @@ public class ZenModeConfig implements Parcelable { public int sleepEndMinute; public ComponentName[] conditionComponents; public Uri[] conditionIds; + public Uri exitConditionId; public ZenModeConfig() { } @@ -100,6 +106,7 @@ public class ZenModeConfig implements Parcelable { source.readTypedArray(conditionIds, Uri.CREATOR); } allowFrom = source.readInt(); + exitConditionId = source.readParcelable(null); } @Override @@ -129,6 +136,7 @@ public class ZenModeConfig implements Parcelable { dest.writeInt(0); } dest.writeInt(allowFrom); + dest.writeParcelable(exitConditionId, 0); } @Override @@ -144,6 +152,7 @@ public class ZenModeConfig implements Parcelable { .append(conditionComponents == null ? null : TextUtils.join(",", conditionComponents)) .append(",conditionIds=") .append(conditionIds == null ? null : TextUtils.join(",", conditionIds)) + .append(",exitConditionId=").append(exitConditionId) .append(']').toString(); } @@ -174,14 +183,16 @@ public class ZenModeConfig implements Parcelable { && other.sleepEndHour == sleepEndHour && other.sleepEndMinute == sleepEndMinute && Objects.deepEquals(other.conditionComponents, conditionComponents) - && Objects.deepEquals(other.conditionIds, conditionIds); + && Objects.deepEquals(other.conditionIds, conditionIds) + && Objects.equals(other.exitConditionId, exitConditionId); } @Override public int hashCode() { return Objects.hash(allowCalls, allowMessages, allowFrom, sleepMode, sleepStartHour, sleepStartMinute, sleepEndHour, sleepEndMinute, - Arrays.hashCode(conditionComponents), Arrays.hashCode(conditionIds)); + Arrays.hashCode(conditionComponents), Arrays.hashCode(conditionIds), + exitConditionId); } public boolean isValid() { @@ -239,6 +250,8 @@ public class ZenModeConfig implements Parcelable { conditionComponents.add(component); conditionIds.add(conditionId); } + } else if (EXIT_CONDITION_TAG.equals(tag)) { + rt.exitConditionId = safeUri(parser, EXIT_CONDITION_ATT_ID); } } } @@ -275,6 +288,11 @@ public class ZenModeConfig implements Parcelable { out.endTag(null, CONDITION_TAG); } } + if (exitConditionId != null) { + out.startTag(null, EXIT_CONDITION_TAG); + out.attribute(null, EXIT_CONDITION_ATT_ID, exitConditionId.toString()); + out.endTag(null, EXIT_CONDITION_TAG); + } out.endTag(null, ZEN_TAG); } @@ -338,4 +356,33 @@ public class ZenModeConfig implements Parcelable { return new ZenModeConfig[size]; } }; + + // Built-in countdown conditions, e.g. condition://android/countdown/1399917958951 + + private static final String COUNTDOWN_AUTHORITY = "android"; + private static final String COUNTDOWN_PATH = "countdown"; + + public static Uri toCountdownConditionId(long time) { + return new Uri.Builder().scheme(Condition.SCHEME) + .authority(COUNTDOWN_AUTHORITY) + .appendPath(COUNTDOWN_PATH) + .appendPath(Long.toString(time)) + .build(); + } + + public static long tryParseCountdownConditionId(Uri conditionId) { + if (!Condition.isValidId(conditionId, COUNTDOWN_AUTHORITY)) return 0; + if (conditionId.getPathSegments().size() != 2 + || !COUNTDOWN_PATH.equals(conditionId.getPathSegments().get(0))) return 0; + try { + return Long.parseLong(conditionId.getPathSegments().get(1)); + } catch (RuntimeException e) { + Slog.w(TAG, "Error parsing countdown condition: " + conditionId, e); + return 0; + } + } + + public static boolean isValidCountdownConditionId(Uri conditionId) { + return tryParseCountdownConditionId(conditionId) != 0; + } } diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index af16185..a52ccdf 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -216,12 +216,6 @@ interface IWindowManager oneway void statusBarVisibilityChanged(int visibility); /** - * Block until the given window has been drawn to the screen. - * Returns true if really waiting, false if the window does not exist. - */ - boolean waitForWindowDrawn(IBinder token, in IRemoteCallback callback); - - /** * Device has a software navigation bar (separate from the status bar). */ boolean hasNavigationBar(); diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java index 14dc356..a92bf59 100644 --- a/core/java/android/view/WindowManagerInternal.java +++ b/core/java/android/view/WindowManagerInternal.java @@ -20,6 +20,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.hardware.display.DisplayManagerInternal; import android.os.IBinder; +import android.os.IRemoteCallback; import java.util.List; @@ -105,7 +106,7 @@ public abstract class WindowManagerInternal { * Set by the accessibility layer to specify the magnification and panning to * be applied to all windows that should be magnified. * - * @param callbacks The callbacks to invoke. + * @param spec The MagnficationSpec to set. * * @see #setMagnificationCallbacks(MagnificationCallbacks) */ @@ -161,4 +162,10 @@ public abstract class WindowManagerInternal { * @param outBounds The frame to populate. */ public abstract void getWindowFrame(IBinder token, Rect outBounds); + + /** + * Invalidate all visible windows. Then report back on the callback once all windows have + * redrawn. + */ + public abstract void waitForAllWindowsDrawn(IRemoteCallback callback, long timeout); } |
