From b89cf026cf731108daa293f076ffcb32bbd2c8d7 Mon Sep 17 00:00:00 2001 From: Abodunrinwa Toki Date: Mon, 6 Feb 2017 19:53:22 +0000 Subject: [PATCH] TextClassificationManager: Avoid exposing lock. Test: CtsViewTestCases passes Bug: 35040457 Change-Id: Ia27730816f8aa4832a16aa9ebcafac68acb79e27 --- api/current.txt | 2 +- api/system-current.txt | 2 +- api/test-current.txt | 2 +- .../TextClassificationManager.java | 41 +++++++++++-------- .../textclassifier/TextClassifierImpl.java | 12 ++++-- 5 files changed, 35 insertions(+), 24 deletions(-) diff --git a/api/current.txt b/api/current.txt index 56a69d678e6af..794ebe26267e6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -47302,7 +47302,7 @@ package android.view.textclassifier { public final class TextClassificationManager { method public java.util.List detectLanguages(java.lang.CharSequence); - method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier(); + method public android.view.textclassifier.TextClassifier getDefaultTextClassifier(); } public final class TextClassificationResult { diff --git a/api/system-current.txt b/api/system-current.txt index fedae780a3b2e..3a713b574f784 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -50712,7 +50712,7 @@ package android.view.textclassifier { public final class TextClassificationManager { method public java.util.List detectLanguages(java.lang.CharSequence); - method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier(); + method public android.view.textclassifier.TextClassifier getDefaultTextClassifier(); } public final class TextClassificationResult { diff --git a/api/test-current.txt b/api/test-current.txt index 4c487e1bf8196..1da917caa4cca 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -47615,7 +47615,7 @@ package android.view.textclassifier { public final class TextClassificationManager { method public java.util.List detectLanguages(java.lang.CharSequence); - method public synchronized android.view.textclassifier.TextClassifier getDefaultTextClassifier(); + method public android.view.textclassifier.TextClassifier getDefaultTextClassifier(); } public final class TextClassificationResult { diff --git a/core/java/android/view/textclassifier/TextClassificationManager.java b/core/java/android/view/textclassifier/TextClassificationManager.java index a85dea9e96bc8..a4e524f9882b3 100644 --- a/core/java/android/view/textclassifier/TextClassificationManager.java +++ b/core/java/android/view/textclassifier/TextClassificationManager.java @@ -41,6 +41,9 @@ public final class TextClassificationManager { private static final String LOG_TAG = "TextClassificationManager"; + private final Object mTextClassifierLock = new Object(); + private final Object mLangIdLock = new Object(); + private final Context mContext; // TODO: Implement a way to close the file descriptor. private ParcelFileDescriptor mFd; @@ -55,19 +58,21 @@ public final class TextClassificationManager { /** * Returns the default text classifier. */ - public synchronized TextClassifier getDefaultTextClassifier() { - if (mDefault == null) { - try { - mFd = ParcelFileDescriptor.open( - new File("/etc/assistant/smart-selection.model"), - ParcelFileDescriptor.MODE_READ_ONLY); - mDefault = new TextClassifierImpl(mContext, mFd); - } catch (FileNotFoundException e) { - Log.e(LOG_TAG, "Error accessing 'text classifier selection' model file.", e); - mDefault = TextClassifier.NO_OP; + public TextClassifier getDefaultTextClassifier() { + synchronized (mTextClassifierLock) { + if (mDefault == null) { + try { + mFd = ParcelFileDescriptor.open( + new File("/etc/assistant/smart-selection.model"), + ParcelFileDescriptor.MODE_READ_ONLY); + mDefault = new TextClassifierImpl(mContext, mFd); + } catch (FileNotFoundException e) { + Log.e(LOG_TAG, "Error accessing 'text classifier selection' model file.", e); + mDefault = TextClassifier.NO_OP; + } } + return mDefault; } - return mDefault; } /** @@ -95,12 +100,14 @@ public final class TextClassificationManager { return Collections.emptyList(); } - private synchronized LangId getLanguageDetector() { - if (mLangId == null) { - // TODO: Use a file descriptor as soon as we start to depend on a model file - // for language detection. - mLangId = new LangId(0); + private LangId getLanguageDetector() { + synchronized (mLangIdLock) { + if (mLangId == null) { + // TODO: Use a file descriptor as soon as we start to depend on a model file + // for language detection. + mLangId = new LangId(0); + } + return mLangId; } - return mLangId; } } diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 783891838fe09..e2ff44cb37937 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -60,6 +60,8 @@ final class TextClassifierImpl implements TextClassifier { private static final String LOG_TAG = "TextClassifierImpl"; + private final Object mSmartSelectionLock = new Object(); + private final Context mContext; private final ParcelFileDescriptor mFd; private SmartSelection mSmartSelection; @@ -140,11 +142,13 @@ final class TextClassifierImpl implements TextClassifier { return TextClassifier.NO_OP.getLinks(text, linkMask); } - private synchronized SmartSelection getSmartSelection() throws FileNotFoundException { - if (mSmartSelection == null) { - mSmartSelection = new SmartSelection(mFd.getFd()); + private SmartSelection getSmartSelection() throws FileNotFoundException { + synchronized (mSmartSelectionLock) { + if (mSmartSelection == null) { + mSmartSelection = new SmartSelection(mFd.getFd()); + } + return mSmartSelection; } - return mSmartSelection; } private TextClassificationResult createClassificationResult(String type, CharSequence text) {