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