summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/hardware/camera2/DngCreator.java35
-rw-r--r--core/java/android/service/notification/ZenModeConfig.java51
-rw-r--r--core/java/android/view/IWindowManager.aidl6
-rw-r--r--core/java/android/view/WindowManagerInternal.java9
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);
}