diff --git a/api/current.txt b/api/current.txt index b61917dc55a3a..52de9d3282b75 100644 --- a/api/current.txt +++ b/api/current.txt @@ -54814,6 +54814,7 @@ package android.view.textclassifier { method public int describeContents(); method @NonNull public android.os.Bundle getExtras(); method @NonNull public java.util.Collection getLinks(); + method @NonNull public String getText(); method public void writeToParcel(android.os.Parcel, int); field public static final int APPLY_STRATEGY_IGNORE = 0; // 0x0 field public static final int APPLY_STRATEGY_REPLACE = 1; // 0x1 @@ -54840,6 +54841,7 @@ package android.view.textclassifier { method @Nullable public android.os.LocaleList getDefaultLocales(); method @Nullable public android.view.textclassifier.TextClassifier.EntityConfig getEntityConfig(); method @NonNull public android.os.Bundle getExtras(); + method @Nullable public java.time.ZonedDateTime getReferenceTime(); method @NonNull public CharSequence getText(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; @@ -54851,6 +54853,7 @@ package android.view.textclassifier { method @NonNull public android.view.textclassifier.TextLinks.Request.Builder setDefaultLocales(@Nullable android.os.LocaleList); method @NonNull public android.view.textclassifier.TextLinks.Request.Builder setEntityConfig(@Nullable android.view.textclassifier.TextClassifier.EntityConfig); method public android.view.textclassifier.TextLinks.Request.Builder setExtras(@Nullable android.os.Bundle); + method @NonNull public android.view.textclassifier.TextLinks.Request.Builder setReferenceTime(@Nullable java.time.ZonedDateTime); } public static final class TextLinks.TextLink implements android.os.Parcelable { diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java index bbb7f07e0fdc8..9cf53eb80e41f 100644 --- a/core/java/android/view/textclassifier/TextLinks.java +++ b/core/java/android/view/textclassifier/TextLinks.java @@ -42,6 +42,7 @@ import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -109,7 +110,6 @@ public final class TextLinks implements Parcelable { /** * Returns the text that was used to generate these links. - * @hide */ @NonNull public String getText() { @@ -341,6 +341,7 @@ public final class TextLinks implements Parcelable { private final boolean mLegacyFallback; @Nullable private String mCallingPackageName; private final Bundle mExtras; + @Nullable private final ZonedDateTime mReferenceTime; @UserIdInt private int mUserId = UserHandle.USER_NULL; @@ -349,11 +350,13 @@ public final class TextLinks implements Parcelable { LocaleList defaultLocales, EntityConfig entityConfig, boolean legacyFallback, + ZonedDateTime referenceTime, Bundle extras) { mText = text; mDefaultLocales = defaultLocales; mEntityConfig = entityConfig; mLegacyFallback = legacyFallback; + mReferenceTime = referenceTime; mExtras = extras; } @@ -393,6 +396,15 @@ public final class TextLinks implements Parcelable { return mLegacyFallback; } + /** + * @return reference time based on which relative dates (e.g. "tomorrow") should be + * interpreted. + */ + @Nullable + public ZonedDateTime getReferenceTime() { + return mReferenceTime; + } + /** * Sets the name of the package that is sending this request. *

@@ -453,6 +465,7 @@ public final class TextLinks implements Parcelable { @Nullable private EntityConfig mEntityConfig; private boolean mLegacyFallback = true; // Use legacy fall back by default. @Nullable private Bundle mExtras; + @Nullable private ZonedDateTime mReferenceTime; public Builder(@NonNull CharSequence text) { mText = Preconditions.checkNotNull(text); @@ -509,6 +522,19 @@ public final class TextLinks implements Parcelable { return this; } + /** + * @param referenceTime reference time based on which relative dates (e.g. "tomorrow" + * should be interpreted. This should usually be the time when the text was + * originally composed. + * + * @return this builder + */ + @NonNull + public Builder setReferenceTime(@Nullable ZonedDateTime referenceTime) { + mReferenceTime = referenceTime; + return this; + } + /** * Builds and returns the request object. */ @@ -516,7 +542,7 @@ public final class TextLinks implements Parcelable { public Request build() { return new Request( mText, mDefaultLocales, mEntityConfig, - mLegacyFallback, + mLegacyFallback, mReferenceTime, mExtras == null ? Bundle.EMPTY : mExtras); } } @@ -534,6 +560,7 @@ public final class TextLinks implements Parcelable { dest.writeString(mCallingPackageName); dest.writeInt(mUserId); dest.writeBundle(mExtras); + dest.writeString(mReferenceTime == null ? null : mReferenceTime.toString()); } private static Request readFromParcel(Parcel in) { @@ -543,9 +570,12 @@ public final class TextLinks implements Parcelable { final String callingPackageName = in.readString(); final int userId = in.readInt(); final Bundle extras = in.readBundle(); + final String referenceTimeString = in.readString(); + final ZonedDateTime referenceTime = referenceTimeString == null + ? null : ZonedDateTime.parse(referenceTimeString); final Request request = new Request(text, defaultLocales, entityConfig, - /* legacyFallback= */ true, extras); + /* legacyFallback= */ true, referenceTime, extras); request.setCallingPackageName(callingPackageName); request.setUserId(userId); return request; diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java index b9cc8f4ba4a08..ec5813fd4123e 100644 --- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java +++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java @@ -29,6 +29,9 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -77,6 +80,7 @@ public class TextLinksTest { final TextLinks result = TextLinks.CREATOR.createFromParcel(parcel); final List resultList = new ArrayList<>(result.getLinks()); + assertEquals(fullText, result.getText()); assertEquals(2, resultList.size()); assertEquals(0, resultList.get(0).getStart()); assertEquals(4, resultList.get(0).getEnd()); @@ -103,10 +107,13 @@ public class TextLinksTest { Arrays.asList(TextClassifier.HINT_TEXT_IS_EDITABLE), Arrays.asList("a", "b", "c"), Arrays.asList("b")); + final ZonedDateTime referenceTime = ZonedDateTime.ofInstant(Instant.ofEpochMilli(1000L), + ZoneId.of("UTC")); final TextLinks.Request reference = new TextLinks.Request.Builder("text") .setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY)) .setEntityConfig(entityConfig) .setExtras(BUNDLE) + .setReferenceTime(referenceTime) .build(); reference.setCallingPackageName(packageName); @@ -124,5 +131,6 @@ public class TextLinksTest { result.getEntityConfig().resolveEntityListModifications(Collections.emptyList())); assertEquals(BUNDLE_VALUE, result.getExtras().getString(BUNDLE_KEY)); assertEquals(packageName, result.getCallingPackageName()); + assertEquals(referenceTime, result.getReferenceTime()); } }