diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c8b466a4f7edb8275c0376b175575cfa0ad2bbb
--- /dev/null
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryPackConstants.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * 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.inputmethod.dictionarypack;
+
+/**
+ * A class to group constants for dictionary pack usage.
+ *
+ * This class only defines constants. It should not make any references to outside code as far as
+ * possible, as it's used to separate cleanly the keyboard code from the dictionary pack code; this
+ * is needed in particular to cleanly compile regression tests.
+ */
+public class DictionaryPackConstants {
+    /**
+     * Authority for the ContentProvider protocol.
+     */
+    // TODO: find some way to factorize this string with the one in the resources
+    public static final String AUTHORITY = "com.android.inputmethod.dictionarypack.aosp";
+
+    /**
+     * The action of the intent for publishing that new dictionary data is available.
+     */
+    // TODO: make this different across different packages. A suggested course of action is
+    // to use the package name inside this string.
+    public static final String NEW_DICTIONARY_INTENT_ACTION =
+            "com.android.inputmethod.dictionarypack.newdict";
+}
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
index 2da8713058b58ab93b72e4406d9441620dd2e900..77b3b8e2e453a9b311a044a7b3c52d16a14919b7 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionaryProvider.java
@@ -48,11 +48,8 @@ public final class DictionaryProvider extends ContentProvider {
     private static final String TAG = DictionaryProvider.class.getSimpleName();
     public static final boolean DEBUG = false;
 
-    // Authority and URI matching for the ContentProvider protocol.
-    // TODO: find some way to factorize this string with the one in the resources
-    public static final String AUTHORITY = "com.android.inputmethod.dictionarypack.aosp";
     public static final Uri CONTENT_URI =
-            Uri.parse(ContentResolver.SCHEME_CONTENT + "://" + AUTHORITY);
+            Uri.parse(ContentResolver.SCHEME_CONTENT + "://" + DictionaryPackConstants.AUTHORITY);
     private static final String QUERY_PARAMETER_MAY_PROMPT_USER = "mayPrompt";
     private static final String QUERY_PARAMETER_TRUE = "true";
     private static final String QUERY_PARAMETER_DELETE_RESULT = "result";
@@ -70,12 +67,15 @@ public final class DictionaryProvider extends ContentProvider {
     private static final UriMatcher sUriMatcherV2 = new UriMatcher(NO_MATCH);
     static
     {
-        sUriMatcherV1.addURI(AUTHORITY, "list", DICTIONARY_V1_WHOLE_LIST);
-        sUriMatcherV1.addURI(AUTHORITY, "*", DICTIONARY_V1_DICT_INFO);
-        sUriMatcherV2.addURI(AUTHORITY, "*/metadata", DICTIONARY_V2_METADATA);
-        sUriMatcherV2.addURI(AUTHORITY, "*/list", DICTIONARY_V2_WHOLE_LIST);
-        sUriMatcherV2.addURI(AUTHORITY, "*/dict/*", DICTIONARY_V2_DICT_INFO);
-        sUriMatcherV2.addURI(AUTHORITY, "*/datafile/*", DICTIONARY_V2_DATAFILE);
+        sUriMatcherV1.addURI(DictionaryPackConstants.AUTHORITY, "list", DICTIONARY_V1_WHOLE_LIST);
+        sUriMatcherV1.addURI(DictionaryPackConstants.AUTHORITY, "*", DICTIONARY_V1_DICT_INFO);
+        sUriMatcherV2.addURI(DictionaryPackConstants.AUTHORITY, "*/metadata",
+                DICTIONARY_V2_METADATA);
+        sUriMatcherV2.addURI(DictionaryPackConstants.AUTHORITY, "*/list", DICTIONARY_V2_WHOLE_LIST);
+        sUriMatcherV2.addURI(DictionaryPackConstants.AUTHORITY, "*/dict/*",
+                DICTIONARY_V2_DICT_INFO);
+        sUriMatcherV2.addURI(DictionaryPackConstants.AUTHORITY, "*/datafile/*",
+                DICTIONARY_V2_DATAFILE);
     }
 
     // MIME types for dictionary and dictionary list, as required by ContentProvider contract.
diff --git a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
index f5526ddd7cfba8bb5e04854c80bd873b3db1915f..7e2a6bb1e3bc3980e5861394e72c40ec2ae87d63 100644
--- a/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
+++ b/java/src/com/android/inputmethod/dictionarypack/DictionarySettingsFragment.java
@@ -123,7 +123,8 @@ public final class DictionarySettingsFragment extends PreferenceFragment
         UpdateHandler.unregisterUpdateEventListener(this);
         activity.unregisterReceiver(mConnectivityChangedReceiver);
         if (mChangedSettings) {
-            final Intent newDictBroadcast = new Intent(UpdateHandler.NEW_DICTIONARY_INTENT_ACTION);
+            final Intent newDictBroadcast =
+                    new Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION);
             activity.sendBroadcast(newDictBroadcast);
             mChangedSettings = false;
         }
diff --git a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
index 89cf6ed88fba93f3a7d2d3238152aac102ae4f2c..b4727509c4eb3e9a8505f7bad6af0bb103dd9c87 100644
--- a/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
+++ b/java/src/com/android/inputmethod/dictionarypack/UpdateHandler.java
@@ -88,14 +88,6 @@ public final class UpdateHandler {
     // Name of the category for the main dictionary
     public static final String MAIN_DICTIONARY_CATEGORY = "main";
 
-    /**
-     * The action of the intent for publishing that new dictionary data is available.
-     */
-    // TODO: make this different across different packages. A suggested course of action is
-    // to use the package name inside this string.
-    public static final String NEW_DICTIONARY_INTENT_ACTION =
-            "com.android.inputmethod.dictionarypack.newdict";
-
     // The id for the "dictionary available" notification.
     static final int DICT_AVAILABLE_NOTIFICATION_ID = 1;
 
@@ -552,7 +544,8 @@ public final class UpdateHandler {
      * Warn Android Keyboard that the state of dictionaries changed and it should refresh its data.
      */
     private static void signalNewDictionaryState(final Context context) {
-        final Intent newDictBroadcast = new Intent(NEW_DICTIONARY_INTENT_ACTION);
+        final Intent newDictBroadcast =
+                new Intent(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION);
         context.sendBroadcast(newDictBroadcast);
     }
 
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionary.java b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
index 7383862b192ad5bbce390baff61242399f47fe43..18e71221225299db2889cbb8338a0c8df1117185 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionary.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionary.java
@@ -19,7 +19,6 @@ package com.android.inputmethod.latin;
 import android.text.TextUtils;
 import android.util.SparseArray;
 
-import com.android.inputmethod.dictionarypack.DictionaryProvider;
 import com.android.inputmethod.keyboard.ProximityInfo;
 import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
 
@@ -32,7 +31,6 @@ import java.util.Locale;
  */
 public final class BinaryDictionary extends Dictionary {
     private static final String TAG = BinaryDictionary.class.getSimpleName();
-    public static final String DICTIONARY_PACK_AUTHORITY = DictionaryProvider.AUTHORITY;
 
     // Must be equal to MAX_WORD_LENGTH in native/jni/src/defines.h
     private static final int MAX_WORD_LENGTH = Constants.Dictionary.MAX_WORD_LENGTH;
diff --git a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
index 0d0ce5756c2c2d8440e27ba680f0ece785a3cca2..4bec99c0411677d4555e848f462a8c1832e88d7f 100644
--- a/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
+++ b/java/src/com/android/inputmethod/latin/BinaryDictionaryFileDumper.java
@@ -27,6 +27,7 @@ import android.os.RemoteException;
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 import com.android.inputmethod.latin.DictionaryInfoUtils.DictionaryInfo;
 
 import java.io.BufferedInputStream;
@@ -93,8 +94,7 @@ public final class BinaryDictionaryFileDumper {
      */
     private static Uri.Builder getProviderUriBuilder(final String path) {
         return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
-                .authority(BinaryDictionary.DICTIONARY_PACK_AUTHORITY).appendPath(
-                        path);
+                .authority(DictionaryPackConstants.AUTHORITY).appendPath(path);
     }
 
     /**
diff --git a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java
index d6c88910f7a60060964395fd8befe5eaf07bd4b8..35f3119ea3dad9525f56090467fe5f06e0f3fa7c 100644
--- a/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java
+++ b/java/src/com/android/inputmethod/latin/DictionaryPackInstallBroadcastReceiver.java
@@ -16,7 +16,7 @@
 
 package com.android.inputmethod.latin;
 
-import com.android.inputmethod.dictionarypack.UpdateHandler;
+import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -32,11 +32,6 @@ import android.net.Uri;
 public final class DictionaryPackInstallBroadcastReceiver extends BroadcastReceiver {
 
     final LatinIME mService;
-    /**
-     * The action of the intent for publishing that new dictionary data is available.
-     */
-    /* package */ static final String NEW_DICTIONARY_INTENT_ACTION =
-            UpdateHandler.NEW_DICTIONARY_INTENT_ACTION;
 
     public DictionaryPackInstallBroadcastReceiver(final LatinIME service) {
         mService = service;
@@ -66,7 +61,7 @@ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastRecei
 
             // Search for some dictionary pack in the just-installed package. If found, reread.
             for (ProviderInfo info : providers) {
-                if (BinaryDictionary.DICTIONARY_PACK_AUTHORITY.equals(info.authority)) {
+                if (DictionaryPackConstants.AUTHORITY.equals(info.authority)) {
                     mService.resetSuggestMainDict();
                     return;
                 }
@@ -86,7 +81,7 @@ public final class DictionaryPackInstallBroadcastReceiver extends BroadcastRecei
             // TODO: Only reload dictionary on REMOVED when the removed package is the one we
             // read dictionary from?
             mService.resetSuggestMainDict();
-        } else if (action.equals(NEW_DICTIONARY_INTENT_ACTION)) {
+        } else if (action.equals(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION)) {
             mService.resetSuggestMainDict();
         }
     }
diff --git a/java/src/com/android/inputmethod/latin/LatinIME.java b/java/src/com/android/inputmethod/latin/LatinIME.java
index 8d4dd3c32da7277970c0af1ebb93de035fdf8d53..e3650d9ccb84b7ae0fc5d49a275841cc42497fc2 100644
--- a/java/src/com/android/inputmethod/latin/LatinIME.java
+++ b/java/src/com/android/inputmethod/latin/LatinIME.java
@@ -64,6 +64,7 @@ import com.android.inputmethod.accessibility.AccessibleKeyboardViewProxy;
 import com.android.inputmethod.annotations.UsedForTesting;
 import com.android.inputmethod.compat.InputMethodServiceCompatUtils;
 import com.android.inputmethod.compat.SuggestionSpanUtils;
+import com.android.inputmethod.dictionarypack.DictionaryPackConstants;
 import com.android.inputmethod.event.EventInterpreter;
 import com.android.inputmethod.keyboard.KeyDetector;
 import com.android.inputmethod.keyboard.Keyboard;
@@ -450,8 +451,7 @@ public final class LatinIME extends InputMethodService implements KeyboardAction
             registerReceiver(mDictionaryPackInstallReceiver, packageFilter);
 
             final IntentFilter newDictFilter = new IntentFilter();
-            newDictFilter.addAction(
-                    DictionaryPackInstallBroadcastReceiver.NEW_DICTIONARY_INTENT_ACTION);
+            newDictFilter.addAction(DictionaryPackConstants.NEW_DICTIONARY_INTENT_ACTION);
             registerReceiver(mDictionaryPackInstallReceiver, newDictFilter);
         }
     }