/* * Copyright (C) 2013 Google Inc. * * 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.utils.labeling; /** * A model class for a custom view label that TalkBack can speak. */ public class Label { /** The ID of a label that has not yet been stored in the database. */ public static final long NO_ID = -1L; private static final String DEBUG_FORMAT_STRING = "%s[id=%d, packageName=%s, " + "packageSignature=%s, viewName=%s, text=%s, locale=%s, packageVersion=%d, " + "screenshotPath=%s, timestamp=%d]"; private long mId; private String mPackageName; private String mPackageSignature; private String mViewName; private String mText; private String mLocale; private int mPackageVersion; private String mScreenshotPath; /** * The time the label was created or last modified, measured in milliseconds * since midnight on January 1, 1970 UTC. */ private long mTimestampMillis; /** * Creates a new label, usually one that exists in the local database. * * @param labelId A unique local identifier for the label. * @param packageName The package name for the labeled application. * @param packageSignature A string that uniquely identifies the package. * @param viewName The fully qualified resource name for the labeled view. * @param text The text that should be displayed as the label. * @param locale The locale of the label text. * @param packageVersion The labeled application's package version code. * @param screenshotPath The local path to a screenshot of the labeled view. * @param timestampMillis The time the label was created or last modified. */ public Label(long labelId, String packageName, String packageSignature, String viewName, String text, String locale, int packageVersion, String screenshotPath, long timestampMillis) { mId = labelId; mPackageName = packageName; mPackageSignature = packageSignature; mViewName = viewName; mText = text; setLocale(locale); mPackageVersion = packageVersion; mScreenshotPath = screenshotPath; mTimestampMillis = timestampMillis; } /** * Creates a new label, usually one that does not yet exist in the local * database. * * @param packageName The package name for the labeled application. * @param packageSignature A string uniquely representing the package. * @param viewName The fully qualified resource name for the labeled view. * @param text The text that should be displayed as the label. * @param locale The locale of the label text. * @param packageVersion The labeled application's package version code. * @param screenshotPath The local path to a screenshot of the labeled view. * @param timestamp The time the label was created or last modified. */ public Label(String packageName, String packageSignature, String viewName, String text, String locale, int packageVersion, String screenshotPath, long timestamp) { this(NO_ID, packageName, packageSignature, viewName, text, locale, packageVersion, screenshotPath, timestamp); } /** * Creates a label object that exists in the local database from a label * object that does not exist in the local database using a deep copy. * <p> * This effectively assigns an ID to an existing label. * * @param labelWithoutId The existing label to copy, without an ID. * @param labelId A unique local identifier for the label. */ public Label(Label labelWithoutId, long labelId) { if (labelWithoutId.getId() != Label.NO_ID) { throw new IllegalArgumentException("Label to copy cannot have an ID already assigned."); } mId = labelId; mPackageName = labelWithoutId.mPackageName; mPackageSignature = labelWithoutId.mPackageSignature; mViewName = labelWithoutId.mViewName; mText = labelWithoutId.mText; setLocale(labelWithoutId.mLocale); mPackageVersion = labelWithoutId.mPackageVersion; mScreenshotPath = labelWithoutId.mScreenshotPath; mTimestampMillis = labelWithoutId.mTimestampMillis; } /** * @return A unique local identifier for the label, * or {@link #NO_ID} if an identifier has not been assigned. */ public long getId() { return mId; } /** * @return The package name for the application containing the label. */ public String getPackageName() { return mPackageName; } /** * @param packageName The package name for the labeled application. */ public void setPackageName(String packageName) { mPackageName = packageName; } /** * @return A hex-encoded SHA-1 hash of the signing certificates for the * package containing the labeled application. */ public String getPackageSignature() { return mPackageSignature; } /** * @param packageSignature A hex-encoded SHA-1 hash of the signing * certificates for the package containing the labeled * application. */ public void setPackageSignature(String packageSignature) { mPackageSignature = packageSignature; } /** * @return The fully qualified resource name for the labeled view. */ public String getViewName() { return mViewName; } /** * @param viewName The fully qualified resource name for the labeled view. */ public void setViewName(String viewName) { mViewName = viewName; } /** * @return The text that should be displayed as the label. */ public String getText() { return mText; } /** * @param text The text that should be displayed as the label. */ public void setText(String text) { mText = text; } /** * @return The locale of the label text. */ public String getLocale() { return mLocale; } /** * @param locale The locale of the label text. */ public void setLocale(String locale) { mLocale = CustomLabelManager.getLanguageLocale(locale); } /** * @return The package version code of the labeled application. */ public int getPackageVersion() { return mPackageVersion; } /** * @param packageVersion The labeled application's package version code. */ public void setPackageVersion(int packageVersion) { mPackageVersion = packageVersion; } /** * @return The local path to a screenshot of the labeled view. */ public String getScreenshotPath() { return mScreenshotPath; } /** * @param screenshotPath The local path to a screenshot of the labeled view. */ public void setScreenshotPath(String screenshotPath) { mScreenshotPath = screenshotPath; } /** * @return The time the label was created or last modified, measured in * milliseconds since midnight on January 1, 1970 UTC. */ public long getTimestamp() { return mTimestampMillis; } /** * @param timestampMillis The time the label was created or last modified, * measured in milliseconds since midnight on Jan. 1, 1970 UTC. */ public void setTimestamp(long timestampMillis) { mTimestampMillis = timestampMillis; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((mLocale == null) ? 0 : mLocale.hashCode()); result = prime * result + ((mPackageName == null) ? 0 : mPackageName.hashCode()); result = prime * result + ((mPackageSignature == null) ? 0 : mPackageSignature.hashCode()); result = prime * result + ((mScreenshotPath == null) ? 0 : mScreenshotPath.hashCode()); result = prime * result + ((mText == null) ? 0 : mText.hashCode()); result = prime * result + (int) (mTimestampMillis ^ (mTimestampMillis >>> 32)); result = prime * result + mPackageVersion; result = prime * result + ((mViewName == null) ? 0 : mViewName.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final Label other = (Label) obj; if (mLocale == null) { if (other.mLocale != null) { return false; } } else if (!mLocale.equals(other.mLocale)) { return false; } if (mPackageName == null) { if (other.mPackageName != null) { return false; } } else if (!mPackageName.equals(other.mPackageName)) { return false; } if (mPackageSignature == null) { if (other.mPackageSignature != null) { return false; } } else if (!mPackageSignature.equals(other.mPackageSignature)) { return false; } if (mScreenshotPath == null) { if (other.mScreenshotPath != null) { return false; } } else if (!mScreenshotPath.equals(other.mScreenshotPath)) { return false; } if (mText == null) { if (other.mText != null) { return false; } } else if (!mText.equals(other.mText)) { return false; } if (mTimestampMillis != other.mTimestampMillis) { return false; } if (mPackageVersion != other.mPackageVersion) { return false; } if (mViewName == null) { if (other.mViewName != null) { return false; } } else if (!mViewName.equals(other.mViewName)) { return false; } return true; } /** * @return A text representation of the object and its fields for debugging. */ @Override public String toString() { return String.format(DEBUG_FORMAT_STRING, getClass().getSimpleName(), mId, mPackageName, mPackageSignature, mViewName, mText, mLocale, mPackageVersion, mScreenshotPath, mTimestampMillis); } }