Close file descriptor after SmartSelection is initialized.
Test: bit FrameworksCoreTests:android.view.textclassifier.TextClassificationManagerTest
Bug: 37446398
Change-Id: I6f6d927f447d3cc1dffaee2406ff240d0600eb19
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index 108107e..ebf1c01 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -183,7 +183,9 @@
}
if (mSmartSelection == null || !Objects.equals(mLocale, locale)) {
destroySmartSelectionIfExistsLocked();
- mSmartSelection = new SmartSelection(getFdLocked(locale));
+ final ParcelFileDescriptor fd = getFdLocked(locale);
+ mSmartSelection = new SmartSelection(fd.getFd());
+ closeAndLogError(fd);
mLocale = locale;
}
return mSmartSelection;
@@ -191,7 +193,7 @@
}
@GuardedBy("mSmartSelectionLock") // Do not call outside this lock.
- private int getFdLocked(Locale locale) throws FileNotFoundException {
+ private ParcelFileDescriptor getFdLocked(Locale locale) throws FileNotFoundException {
ParcelFileDescriptor updateFd;
try {
updateFd = ParcelFileDescriptor.open(
@@ -214,7 +216,7 @@
if (updateFd == null) {
if (factoryFd != null) {
- return factoryFd.getFd();
+ return factoryFd;
} else {
throw new FileNotFoundException(
String.format("No model file found for %s", locale));
@@ -227,7 +229,7 @@
SmartSelection.getLanguage(updateFdInt).trim().toLowerCase());
if (factoryFd == null) {
if (localeMatches) {
- return updateFdInt;
+ return updateFd;
} else {
closeAndLogError(updateFd);
throw new FileNotFoundException(
@@ -237,18 +239,17 @@
if (!localeMatches) {
closeAndLogError(updateFd);
- return factoryFd.getFd();
+ return factoryFd;
}
final int updateVersion = SmartSelection.getVersion(updateFdInt);
- final int factoryFdInt = factoryFd.getFd();
- final int factoryVersion = SmartSelection.getVersion(factoryFdInt);
+ final int factoryVersion = SmartSelection.getVersion(factoryFd.getFd());
if (updateVersion > factoryVersion) {
closeAndLogError(factoryFd);
- return updateFdInt;
+ return updateFd;
} else {
closeAndLogError(updateFd);
- return factoryFdInt;
+ return factoryFd;
}
}