182bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert/* 282bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * Copyright (C) 2009 The Android Open Source Project 382bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * 482bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 582bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * you may not use this file except in compliance with the License. 682bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * You may obtain a copy of the License at 782bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * 882bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 982bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * 1082bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * Unless required by applicable law or agreed to in writing, software 1182bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 1282bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1382bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * See the License for the specific language governing permissions and 1482bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * limitations under the License. 1582bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert */ 1682bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert 1782bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringertpackage com.android.quicksearchbox.util; 1882bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert 192353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.content.ContentResolver; 202353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.content.Context; 212353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.content.pm.ApplicationInfo; 222353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.content.pm.PackageManager; 232353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.content.res.Resources; 242353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.net.Uri; 252353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringertimport android.util.Log; 262353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert 2782bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringertimport java.util.HashSet; 28ce4cdcf739b57563ddcdbed6944128b8c1f7522aBjorn Bringertimport java.util.List; 2982bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringertimport java.util.Set; 3082bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert 3182bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert/** 3282bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert * General utilities. 3382bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert */ 3482bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringertpublic class Util { 3582bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert 362353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert private static final String TAG = "QSB.Util"; 372353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert 38ce4cdcf739b57563ddcdbed6944128b8c1f7522aBjorn Bringert public static <A> Set<A> setOfFirstN(List<A> list, int n) { 3982bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert int end = Math.min(list.size(), n); 4082bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert HashSet<A> set = new HashSet<A>(end); 4182bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert for (int i = 0; i < end; i++) { 4282bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert set.add(list.get(i)); 4382bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert } 4482bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert return set; 4582bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert } 4682bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert 472353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert public static Uri getResourceUri(Context packageContext, int res) { 482353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert try { 492353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Resources resources = packageContext.getResources(); 502353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return getResourceUri(resources, packageContext.getPackageName(), res); 512353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } catch (Resources.NotFoundException e) { 522353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Log.e(TAG, "Resource not found: " + res + " in " + packageContext.getPackageName()); 532353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return null; 542353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 552353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 562353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert 572353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert public static Uri getResourceUri(Context context, ApplicationInfo appInfo, int res) { 582353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert try { 592353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Resources resources = context.getPackageManager().getResourcesForApplication(appInfo); 602353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return getResourceUri(resources, appInfo.packageName, res); 612353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } catch (PackageManager.NameNotFoundException e) { 622353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Log.e(TAG, "Resources not found for " + appInfo.packageName); 632353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return null; 642353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } catch (Resources.NotFoundException e) { 652353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Log.e(TAG, "Resource not found: " + res + " in " + appInfo.packageName); 662353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return null; 672353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 682353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 692353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert 702353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert private static Uri getResourceUri(Resources resources, String appPkg, int res) 712353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert throws Resources.NotFoundException { 722353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert String resPkg = resources.getResourcePackageName(res); 732353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert String type = resources.getResourceTypeName(res); 742353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert String name = resources.getResourceEntryName(res); 752353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return makeResourceUri(appPkg, resPkg, type, name); 762353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 772353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert 782353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert private static Uri makeResourceUri(String appPkg, String resPkg, String type, String name) { 792353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert Uri.Builder uriBuilder = new Uri.Builder(); 802353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert uriBuilder.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE); 812353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert uriBuilder.encodedAuthority(appPkg); 822353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert uriBuilder.appendEncodedPath(type); 832353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert if (!appPkg.equals(resPkg)) { 842353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert uriBuilder.appendEncodedPath(resPkg + ":" + name); 852353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } else { 862353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert uriBuilder.appendEncodedPath(name); 872353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 882353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert return uriBuilder.build(); 892353e9c002c45c0adc8a979a49ff317cae5838b8Bjorn Bringert } 9082bcf002f2f736afcd6cb548c19aa4e8ac12b421Bjorn Bringert} 91