From 8ec36026c93d13c1118eda936ac12325e0085561 Mon Sep 17 00:00:00 2001
From: Chieu Nguyen <cvnguyen@google.com>
Date: Wed, 18 Mar 2015 13:43:55 -0700
Subject: [PATCH] Disable message if personalization is disabled.

Bug: 19087415.
Change-Id: I3974f1b676aa4a9bb04ab7f609b6daf1860c64f1
---
 .../android/inputmethod/latin/LatinIME.java   |  2 +-
 .../latin/settings/SettingsValues.java        |  4 ++
 .../suggestions/SuggestionStripView.java      |  3 +-
 .../latin/utils/ImportantNoticeUtils.java     |  8 +++-
 .../utils/ImportantNoticeUtilsTests.java      | 42 +++++++++++++++----
 5 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 4ddde1926..a8aeb8795 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -1450,7 +1450,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
         }
 
         final boolean shouldShowImportantNotice =
-                ImportantNoticeUtils.shouldShowImportantNotice(this);
+                ImportantNoticeUtils.shouldShowImportantNotice(this, currentSettingsValues);
         final boolean shouldShowSuggestionCandidates =
                 currentSettingsValues.mInputAttributes.mShouldShowSuggestions
                 && currentSettingsValues.isSuggestionsEnabledPerUserSettings();
diff --git a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
index e21b9ffca..d112e7200 100644
--- a/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
+++ b/java/src/com/android/inputmethod/latin/settings/SettingsValues.java
@@ -237,6 +237,10 @@ public class SettingsValues {
         return mSuggestionsEnabledPerUserSettings;
     }
 
+    public boolean isPersonalizationEnabled() {
+        return mUsePersonalizedDicts;
+    }
+
     public boolean isWordSeparator(final int code) {
         return mSpacingAndPunctuations.isWordSeparator(code);
     }
diff --git a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
index 17525f650..7dd0f03df 100644
--- a/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
+++ b/java/src/com/android/inputmethod/latin/suggestions/SuggestionStripView.java
@@ -213,7 +213,8 @@ public final class SuggestionStripView extends RelativeLayout implements OnClick
     // it has been shown once already or not, and if in the setup wizard). If applicable, it shows
     // the notice. In all cases, it returns true if it was shown, false otherwise.
     public boolean maybeShowImportantNoticeTitle() {
-        if (!ImportantNoticeUtils.shouldShowImportantNotice(getContext())) {
+        final SettingsValues currentSettingsValues = Settings.getInstance().getCurrent();
+        if (!ImportantNoticeUtils.shouldShowImportantNotice(getContext(), currentSettingsValues)) {
             return false;
         }
         if (getWidth() <= 0) {
diff --git a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
index 142548b25..df0cd8437 100644
--- a/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
+++ b/java/src/com/android/inputmethod/latin/utils/ImportantNoticeUtils.java
@@ -25,6 +25,7 @@ import android.util.Log;
 
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.latin.R;
+import com.android.inputmethod.latin.settings.SettingsValues;
 
 import java.util.concurrent.TimeUnit;
 
@@ -105,7 +106,12 @@ public final class ImportantNoticeUtils {
         return elapsedTime >= TIMEOUT_OF_IMPORTANT_NOTICE;
     }
 
-    public static boolean shouldShowImportantNotice(final Context context) {
+    public static boolean shouldShowImportantNotice(final Context context,
+            final SettingsValues settingsValues) {
+        // Check to see whether personalization is enabled by the user.
+        if (!settingsValues.isPersonalizationEnabled()) {
+            return false;
+        }
         if (!hasNewImportantNotice(context)) {
             return false;
         }
diff --git a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
index cbabf7e8d..e361c7704 100644
--- a/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
+++ b/tests/src/com/android/inputmethod/latin/utils/ImportantNoticeUtilsTests.java
@@ -18,6 +18,7 @@ package com.android.inputmethod.latin.utils;
 
 import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_IMPORTANT_NOTICE_VERSION;
 import static com.android.inputmethod.latin.utils.ImportantNoticeUtils.KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE;
+import static org.mockito.Mockito.when;
 
 import android.content.Context;
 import android.content.SharedPreferences;
@@ -25,6 +26,11 @@ import android.test.AndroidTestCase;
 import android.test.suitebuilder.annotation.MediumTest;
 import android.text.TextUtils;
 
+import com.android.inputmethod.latin.settings.SettingsValues;
+
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
 import java.util.concurrent.TimeUnit;
 
 @MediumTest
@@ -34,6 +40,8 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
 
     private ImportantNoticePreferences mImportantNoticePreferences;
 
+    @Mock private SettingsValues mMockSettingsValues;
+
     private static class ImportantNoticePreferences {
         private final SharedPreferences mPref;
 
@@ -97,8 +105,10 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
+        MockitoAnnotations.initMocks(this);
         mImportantNoticePreferences = new ImportantNoticePreferences(getContext());
         mImportantNoticePreferences.save();
+        when(mMockSettingsValues.isPersonalizationEnabled()).thenReturn(true);
     }
 
     @Override
@@ -117,9 +127,9 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
 
         // Check internal state of {@link ImportantNoticeUtils.shouldShowImportantNotice(Context)}
         // after fresh install.
-        assertEquals("Has new imortant notice after fresh install", true,
+        assertEquals("Has new important notice after fresh install", true,
                 ImportantNoticeUtils.hasNewImportantNotice(getContext()));
-        assertEquals("Next important norice title after fresh install", false, TextUtils.isEmpty(
+        assertEquals("Next important notice title after fresh install", false, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeTitle(getContext())));
         assertEquals("Is in system setup wizard after fresh install", false,
                 ImportantNoticeUtils.isInSystemSetupWizard(getContext()));
@@ -131,14 +141,14 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
                 mImportantNoticePreferences.getLong(KEY_TIMESTAMP_OF_FIRST_IMPORTANT_NOTICE));
 
         assertEquals("Current boolean before update", true,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
     }
 
     public void testUpdateVersion() {
         mImportantNoticePreferences.clear();
 
         assertEquals("Current boolean before update", true,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version before update", 0,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version before update ", 1,
@@ -151,7 +161,7 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
         ImportantNoticeUtils.updateLastImportantNoticeVersion(getContext());
 
         assertEquals("Current boolean after update", false,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version after update", 1,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version after update", 2,
@@ -180,7 +190,7 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
 
         // Call {@link ImportantNoticeUtils#shouldShowImportantNotice(Context)} before timeout.
         assertEquals("Current boolean before timeout 1", true,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version before timeout 1", 0,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version before timeout 1", 1,
@@ -197,7 +207,7 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
         // Call {@link ImportantNoticeUtils#shouldShowImportantNotice(Context)} before timeout
         // again.
         assertEquals("Current boolean before timeout 2", true,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version before timeout 2", 0,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version before timeout 2", 1,
@@ -213,7 +223,7 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
 
         // Call {@link ImportantNoticeUtils#shouldShowImportantNotice(Context)} after timeout.
         assertEquals("Current boolean after timeout 1", false,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version after timeout 1", 1,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version after timeout 1", 2,
@@ -229,7 +239,7 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
 
         // Call {@link ImportantNoticeUtils#shouldShowImportantNotice(Context)} after timeout again.
         assertEquals("Current boolean after timeout 2", false,
-                ImportantNoticeUtils.shouldShowImportantNotice(getContext()));
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
         assertEquals("Last version after timeout 2", 1,
                 ImportantNoticeUtils.getLastImportantNoticeVersion(getContext()));
         assertEquals("Next version after timeout 2", 2,
@@ -241,4 +251,18 @@ public class ImportantNoticeUtilsTests extends AndroidTestCase {
         assertEquals("Current contents after timeout 2", true, TextUtils.isEmpty(
                 ImportantNoticeUtils.getNextImportantNoticeContents(getContext())));
     }
+
+    public void testPersonalizationSetting() {
+        mImportantNoticePreferences.clear();
+
+        // Personalization enabled.
+        when(mMockSettingsValues.isPersonalizationEnabled()).thenReturn(true);
+        assertEquals("Current boolean with personalization enabled", true,
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
+
+        // Personalization disabled.
+        when(mMockSettingsValues.isPersonalizationEnabled()).thenReturn(false);
+        assertEquals("Current boolean with personalization disabled", false,
+                ImportantNoticeUtils.shouldShowImportantNotice(getContext(), mMockSettingsValues));
+    }
 }