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