DictionaryPackInstallBroadcastReceiver.java revision cba93f50c3d46ada773ec49435689dc3e2094385
1cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard/* 2cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * Copyright (C) 2011 The Android Open Source Project 3cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * 4cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * use this file except in compliance with the License. You may obtain a copy of 6cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * the License at 7cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * 8cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * http://www.apache.org/licenses/LICENSE-2.0 9cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * 10cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * Unless required by applicable law or agreed to in writing, software 11cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * License for the specific language governing permissions and limitations under 14cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * the License. 15cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard */ 16cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 17cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardpackage com.android.inputmethod.latin; 18cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 19cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.BroadcastReceiver; 20cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.Context; 21cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.Intent; 22cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.pm.PackageInfo; 23cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.pm.PackageManager; 24cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.content.pm.ProviderInfo; 25cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardimport android.net.Uri; 26cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 27cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard/** 28cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard * Takes action to reload the necessary data when a dictionary pack was added/removed. 29cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard */ 30cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalardpublic class DictionaryPackInstallBroadcastReceiver extends BroadcastReceiver { 31cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 32cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final LatinIME mService; 33cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 34cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard public DictionaryPackInstallBroadcastReceiver(final LatinIME service) { 35cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard mService = service; 36cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 37cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 38cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard @Override 39cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard public void onReceive(Context context, Intent intent) { 40cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final String action = intent.getAction(); 41cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final PackageManager manager = context.getPackageManager(); 42cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 43cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // We need to reread the dictionary if a new dictionary package is installed. 44cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard if (action.equals(Intent.ACTION_PACKAGE_ADDED)) { 45cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final Uri packageUri = intent.getData(); 46cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard if (null == packageUri) return; // No package name : we can't do anything 47cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final String packageName = packageUri.getSchemeSpecificPart(); 48cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard if (null == packageName) return; 49cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final PackageInfo packageInfo; 50cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard try { 51cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard packageInfo = manager.getPackageInfo(packageName, PackageManager.GET_PROVIDERS); 52cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } catch (android.content.pm.PackageManager.NameNotFoundException e) { 53cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard return; // No package info : we can't do anything 54cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 55cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard final ProviderInfo[] providers = packageInfo.providers; 56cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard if (null == providers) return; // No providers : it is not a dictionary. 57cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 58cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // Search for some dictionary pack in the just-installed package. If found, reread. 59cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard boolean found = false; 60cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard for (ProviderInfo info : providers) { 61cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard if (BinaryDictionary.DICTIONARY_PACK_AUTHORITY.equals(info.authority)) { 62cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard mService.resetSuggestMainDict(); 63cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard return; 64cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 65cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 66cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // If we come here none of the authorities matched the one we searched for. 67cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // We can exit safely. 68cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard return; 69cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } else if (action.equals(Intent.ACTION_PACKAGE_REMOVED) 70cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) { 71cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // When the dictionary package is removed, we need to reread dictionary (to use the 72cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // next-priority one, or stop using a dictionary at all if this was the only one, 73cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // since this is the user request). 74cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // If we are replacing the package, we will receive ADDED right away so no need to 75cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // remove the dictionary at the moment, since we will do it when we receive the 76cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // ADDED broadcast. 77cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard 78cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // TODO: Only reload dictionary on REMOVED when the removed package is the one we 79cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard // read dictionary from? 80cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard mService.resetSuggestMainDict(); 81cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 82cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard } 83cba93f50c3d46ada773ec49435689dc3e2094385Jean Chalard} 84