diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
index 659fe5c..308b123 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
@@ -243,14 +243,8 @@
                 // Fall through
             case DICTIONARY_V1_DICT_INFO:
                 final String locale = uri.getLastPathSegment();
-                // If LatinIME does not have a dictionary for this locale at all, it will
-                // send us true for this value. In this case, we may prompt the user for
-                // a decision about downloading a dictionary even over a metered connection.
-                final String mayPromptValue =
-                        uri.getQueryParameter(QUERY_PARAMETER_MAY_PROMPT_USER);
-                final boolean mayPrompt = QUERY_PARAMETER_TRUE.equals(mayPromptValue);
                 final Collection<WordListInfo> dictFiles =
-                        getDictionaryWordListsForLocale(clientId, locale, mayPrompt);
+                        getDictionaryWordListsForLocale(clientId, locale);
                 // TODO: pass clientId to the following function
                 DictionaryService.updateNowIfNotUpdatedInAVeryLongTime(getContext());
                 if (null != dictFiles && dictFiles.size() > 0) {
@@ -343,11 +337,10 @@
      *
      * @param clientId the ID of the client requesting the list
      * @param locale the locale for which we want the list, as a String
-     * @param mayPrompt true if we are allowed to prompt the user for arbitration via notification
      * @return a collection of ids. It is guaranteed to be non-null, but may be empty.
      */
     private Collection<WordListInfo> getDictionaryWordListsForLocale(final String clientId,
-            final String locale, final boolean mayPrompt) {
+            final String locale) {
         final Context context = getContext();
         final Cursor results =
                 MetadataDbHelper.queryInstalledOrDeletingOrAvailableDictionaryMetadata(context,
@@ -412,8 +405,7 @@
                         }
                     } else if (MetadataDbHelper.STATUS_AVAILABLE == wordListStatus) {
                         // The locale is the id for the main dictionary.
-                        UpdateHandler.installIfNeverRequested(context, clientId, wordListId,
-                                mayPrompt);
+                        UpdateHandler.installIfNeverRequested(context, clientId, wordListId);
                         continue;
                     }
                     final WordListInfo currentBestMatch = dicts.get(wordListCategory);
diff --git a/java/src/com/android/inputmethod/dictionarypack/DownloadOverMeteredDialog.java b/java/src/com/android/inputmethod/dictionarypack/DownloadOverMeteredDialog.java
index 91ed673..908d931 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DownloadOverMeteredDialog.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DownloadOverMeteredDialog.java
@@ -80,8 +80,7 @@
     @SuppressWarnings("unused")
     public void onClickAllow(final View v) {
         UpdateHandler.setDownloadOverMeteredSetting(this, true);
-        UpdateHandler.installIfNeverRequested(this, mClientId, mWordListToDownload,
-                false /* mayPrompt */);
+        UpdateHandler.installIfNeverRequested(this, mClientId, mWordListToDownload);
         finish();
     }
 }
diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
index df3fd40..a02203d 100644
--- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
@@ -907,9 +907,9 @@
     // list because it may only install the latest version we know about for this specific
     // word list ID / client ID combination.
     public static void installIfNeverRequested(final Context context, final String clientId,
-            final String wordlistId, final boolean mayPrompt) {
+            final String wordlistId) {
         Log.i(TAG, "installIfNeverRequested() : ClientId = " + clientId
-                + " : WordListId = " + wordlistId + " : MayPrompt = " + mayPrompt);
+                + " : WordListId = " + wordlistId);
         final String[] idArray = wordlistId.split(DictionaryProvider.ID_CATEGORY_SEPARATOR);
         // If we have a new-format dictionary id (category:manual_id), then use the
         // specified category. Otherwise, it is a main dictionary, so force the
@@ -942,17 +942,6 @@
             return;
         }
 
-        if (mayPrompt
-                && DOWNLOAD_OVER_METERED_SETTING_UNKNOWN
-                        == getDownloadOverMeteredSetting(context)) {
-            final ConnectivityManager cm =
-                    (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-            if (ConnectivityManagerCompatUtils.isActiveNetworkMetered(cm)) {
-                showDictionaryAvailableNotification(context, clientId, installCandidate);
-                return;
-            }
-        }
-
         // We decided against prompting the user for a decision. This may be because we were
         // explicitly asked not to, or because we are currently on wi-fi anyway, or because we
         // already know the answer to the question. We'll enqueue a request ; StartDownloadAction
@@ -969,14 +958,12 @@
         final String localeString = installCandidate.getAsString(MetadataDbHelper.LOCALE_COLUMN);
         // We are in a content provider: we can't do any UI at all. We have to defer the displaying
         // itself to the service. Also, we only display this when the user does not have a
-        // dictionary for this language already: we know that from the mayPrompt argument.
-        if (mayPrompt) {
-            final Intent intent = new Intent();
-            intent.setClass(context, DictionaryService.class);
-            intent.setAction(DictionaryService.SHOW_DOWNLOAD_TOAST_INTENT_ACTION);
-            intent.putExtra(DictionaryService.LOCALE_INTENT_ARGUMENT, localeString);
-            context.startService(intent);
-        }
+        // dictionary for this language already.
+        final Intent intent = new Intent();
+        intent.setClass(context, DictionaryService.class);
+        intent.setAction(DictionaryService.SHOW_DOWNLOAD_TOAST_INTENT_ACTION);
+        intent.putExtra(DictionaryService.LOCALE_INTENT_ARGUMENT, localeString);
+        context.startService(intent);
         Log.i(TAG, "installIfNeverRequested() : StartDownloadAction for " + metadata);
         actions.execute(context, new LogProblemReporter(TAG));
     }
