| /* |
| * Copyright (C) 2018 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 androidx.textclassifier; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.graphics.Color; |
| import android.graphics.drawable.BitmapDrawable; |
| import android.graphics.drawable.ColorDrawable; |
| import android.os.Parcel; |
| import android.support.test.filters.SmallTest; |
| import android.support.test.runner.AndroidJUnit4; |
| |
| import androidx.core.os.LocaleListCompat; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import java.util.Calendar; |
| import java.util.Locale; |
| import java.util.TimeZone; |
| |
| /** Instrumentation unit tests for {@link TextClassification}. */ |
| @SmallTest |
| @RunWith(AndroidJUnit4.class) |
| public final class TextClassificationTest { |
| public BitmapDrawable generateTestDrawable(int width, int height, int colorValue) { |
| final int numPixels = width * height; |
| final int[] colors = new int[numPixels]; |
| for (int i = 0; i < numPixels; ++i) { |
| colors[i] = colorValue; |
| } |
| final Bitmap bitmap = Bitmap.createBitmap(colors, width, height, Bitmap.Config.ARGB_8888); |
| final BitmapDrawable drawable = new BitmapDrawable(null, bitmap); |
| drawable.setTargetDensity(bitmap.getDensity()); |
| return drawable; |
| } |
| |
| @Test |
| public void testParcel() { |
| final String text = "text"; |
| final BitmapDrawable primaryIcon = generateTestDrawable(16, 16, Color.RED); |
| final String primaryLabel = "primarylabel"; |
| final Intent primaryIntent = new Intent("primaryintentaction"); |
| final BitmapDrawable secondaryIcon0 = generateTestDrawable(32, 288, Color.GREEN); |
| final String secondaryLabel0 = "secondarylabel0"; |
| final Intent secondaryIntent0 = new Intent("secondaryintentaction0"); |
| final BitmapDrawable secondaryIcon1 = generateTestDrawable(576, 288, Color.BLUE); |
| final String secondaryLabel1 = "secondaryLabel1"; |
| final Intent secondaryIntent1 = null; |
| final BitmapDrawable secondaryIcon2 = null; |
| final String secondaryLabel2 = null; |
| final Intent secondaryIntent2 = new Intent("secondaryintentaction2"); |
| final ColorDrawable secondaryIcon3 = new ColorDrawable(Color.CYAN); |
| final String secondaryLabel3 = null; |
| final Intent secondaryIntent3 = null; |
| final String signature = "signature"; |
| final TextClassification reference = new TextClassification.Builder() |
| .setText(text) |
| .setPrimaryAction(primaryIntent, primaryLabel, primaryIcon) |
| .addSecondaryAction(null, null, null) // ignored |
| .addSecondaryAction(secondaryIntent0, secondaryLabel0, secondaryIcon0) |
| .addSecondaryAction(secondaryIntent1, secondaryLabel1, secondaryIcon1) |
| .addSecondaryAction(secondaryIntent2, secondaryLabel2, secondaryIcon2) |
| .addSecondaryAction(secondaryIntent3, secondaryLabel3, secondaryIcon3) |
| .setEntityType(TextClassifier.TYPE_ADDRESS, 0.3f) |
| .setEntityType(TextClassifier.TYPE_PHONE, 0.7f) |
| .setSignature(signature) |
| .build(); |
| |
| final Parcel parcel = Parcel.obtain(); |
| reference.writeToParcel(parcel, reference.describeContents()); |
| parcel.setDataPosition(0); |
| final TextClassification result = TextClassification.CREATOR.createFromParcel( |
| parcel); |
| |
| assertEquals(text, result.getText()); |
| assertEquals(signature, result.getSignature()); |
| assertEquals(4, result.getSecondaryActionsCount()); |
| |
| // Primary action (re-use existing icon). |
| final Bitmap resPrimaryIcon = ((BitmapDrawable) result.getIcon()).getBitmap(); |
| assertEquals(primaryIcon.getBitmap().getPixel(0, 0), resPrimaryIcon.getPixel(0, 0)); |
| assertEquals(16, resPrimaryIcon.getWidth()); |
| assertEquals(16, resPrimaryIcon.getHeight()); |
| assertEquals(primaryLabel, result.getLabel()); |
| assertEquals(primaryIntent.getAction(), result.getIntent().getAction()); |
| |
| // Secondary action 0 (scale with height limit). |
| final Bitmap resSecondaryIcon0 = ((BitmapDrawable) result.getSecondaryIcon(0)).getBitmap(); |
| assertEquals(secondaryIcon0.getBitmap().getPixel(0, 0), resSecondaryIcon0.getPixel(0, 0)); |
| assertEquals(16, resSecondaryIcon0.getWidth()); |
| assertEquals(144, resSecondaryIcon0.getHeight()); |
| assertEquals(secondaryLabel0, result.getSecondaryLabel(0)); |
| assertEquals(secondaryIntent0.getAction(), result.getSecondaryIntent(0).getAction()); |
| |
| // Secondary action 1 (scale with width limit). |
| final Bitmap resSecondaryIcon1 = ((BitmapDrawable) result.getSecondaryIcon(1)).getBitmap(); |
| assertEquals(secondaryIcon1.getBitmap().getPixel(0, 0), resSecondaryIcon1.getPixel(0, 0)); |
| assertEquals(144, resSecondaryIcon1.getWidth()); |
| assertEquals(72, resSecondaryIcon1.getHeight()); |
| assertEquals(secondaryLabel1, result.getSecondaryLabel(1)); |
| assertEquals(null, result.getSecondaryIntent(1)); |
| |
| // Secondary action 2 (no icon). |
| assertEquals(null, result.getSecondaryIcon(2)); |
| assertEquals(null, result.getSecondaryLabel(2)); |
| assertEquals(secondaryIntent2.getAction(), result.getSecondaryIntent(2).getAction()); |
| |
| // Secondary action 3 (convert non-bitmap drawable with negative size). |
| final Bitmap resSecondaryIcon3 = ((BitmapDrawable) result.getSecondaryIcon(3)).getBitmap(); |
| assertEquals(secondaryIcon3.getColor(), resSecondaryIcon3.getPixel(0, 0)); |
| assertEquals(1, resSecondaryIcon3.getWidth()); |
| assertEquals(1, resSecondaryIcon3.getHeight()); |
| assertEquals(null, result.getSecondaryLabel(3)); |
| assertEquals(null, result.getSecondaryIntent(3)); |
| |
| // Entities. |
| assertEquals(2, result.getEntityCount()); |
| assertEquals(TextClassifier.TYPE_PHONE, result.getEntity(0)); |
| assertEquals(TextClassifier.TYPE_ADDRESS, result.getEntity(1)); |
| assertEquals(0.7f, result.getConfidenceScore(TextClassifier.TYPE_PHONE), 1e-7f); |
| assertEquals(0.3f, result.getConfidenceScore(TextClassifier.TYPE_ADDRESS), 1e-7f); |
| } |
| |
| @Test |
| public void testParcelOptions() { |
| final String callingPackageName = "packageName"; |
| Calendar referenceTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); |
| referenceTime.setTimeInMillis(946684800000L); // 2000-01-01 00:00:00 |
| TextClassification.Options reference = new TextClassification.Options() |
| .setDefaultLocales(LocaleListCompat.forLanguageTags("en-US,de-DE")) |
| .setReferenceTime(referenceTime) |
| .setCallingPackageName(callingPackageName); |
| |
| // Parcel and unparcel. |
| final Parcel parcel = Parcel.obtain(); |
| reference.writeToParcel(parcel, reference.describeContents()); |
| parcel.setDataPosition(0); |
| TextClassification.Options result = |
| TextClassification.Options.CREATOR.createFromParcel(parcel); |
| |
| assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags()); |
| assertEquals(referenceTime, result.getReferenceTime()); |
| assertEquals(callingPackageName, result.getCallingPackageName()); |
| } |
| } |