• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.display;
18 
19 import android.content.Context;
20 import android.content.Intent;
21 import android.content.pm.PackageManager;
22 import android.content.pm.ResolveInfo;
23 import android.graphics.drawable.Drawable;
24 import android.os.UserHandle;
25 import android.support.annotation.VisibleForTesting;
26 import android.util.AttributeSet;
27 import android.util.IconDrawableFactory;
28 import android.view.View;
29 import android.view.ViewGroup;
30 import android.widget.ArrayAdapter;
31 import android.widget.GridView;
32 import android.widget.ImageView;
33 
34 import com.android.settings.R;
35 
36 import java.util.ArrayList;
37 import java.util.Collections;
38 import java.util.List;
39 
40 public class AppGridView extends GridView {
AppGridView(Context context)41     public AppGridView(Context context) {
42         this(context, null);
43     }
44 
AppGridView(Context context, AttributeSet attrs)45     public AppGridView(Context context, AttributeSet attrs) {
46         this(context, attrs, 0);
47     }
48 
AppGridView(Context context, AttributeSet attrs, int defStyleAttr)49     public AppGridView(Context context, AttributeSet attrs, int defStyleAttr) {
50         this(context, attrs, defStyleAttr, 0);
51     }
52 
AppGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleResId)53     public AppGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleResId) {
54         super(context, attrs, defStyleAttr, defStyleResId);
55 
56         setNumColumns(AUTO_FIT);
57 
58         final int columnWidth = getResources().getDimensionPixelSize(
59                 R.dimen.screen_zoom_preview_app_icon_width);
60         setColumnWidth(columnWidth);
61 
62         setAdapter(new AppsAdapter(context, R.layout.screen_zoom_preview_app_icon,
63                 android.R.id.text1, android.R.id.icon1));
64     }
65 
66     /**
67      * Loads application labels and icons.
68      */
69     @VisibleForTesting
70     public static class AppsAdapter extends ArrayAdapter<ActivityEntry> {
71         private final PackageManager mPackageManager;
72         private final int mIconResId;
73 
AppsAdapter(Context context, int layout, int textResId, int iconResId)74         public AppsAdapter(Context context, int layout, int textResId, int iconResId) {
75             super(context, layout, textResId);
76 
77             mIconResId = iconResId;
78             mPackageManager = context.getPackageManager();
79 
80             loadAllApps();
81         }
82 
83         @Override
getView(int position, View convertView, ViewGroup parent)84         public View getView(int position, View convertView, ViewGroup parent) {
85             final View view = super.getView(position, convertView, parent);
86             final ActivityEntry entry = getItem(position);
87             final ImageView iconView = view.findViewById(mIconResId);
88             iconView.setImageDrawable(entry.getIcon());
89             return view;
90         }
91 
92         @Override
hasStableIds()93         public boolean hasStableIds() {
94             return true;
95         }
96 
97         @Override
getItemId(int position)98         public long getItemId(int position) {
99             return position;
100         }
101 
102         @Override
isEnabled(int position)103         public boolean isEnabled(int position) {
104             return false;
105         }
106 
loadAllApps()107         private void loadAllApps() {
108             final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
109             mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
110 
111             final PackageManager pm = mPackageManager;
112             final ArrayList<ActivityEntry> results = new ArrayList<>();
113             final List<ResolveInfo> infos = pm.queryIntentActivities(mainIntent, 0);
114             final IconDrawableFactory iconFactory = IconDrawableFactory.newInstance(getContext());
115             for (ResolveInfo info : infos) {
116                 final CharSequence label = info.loadLabel(pm);
117                 if (label != null) {
118                     results.add(new ActivityEntry(info, label.toString(), iconFactory));
119                 }
120             }
121 
122             Collections.sort(results);
123 
124             addAll(results);
125         }
126     }
127 
128     /**
129      * Class used for caching the activity label and icon.
130      */
131     @VisibleForTesting
132     public static class ActivityEntry implements Comparable<ActivityEntry> {
133 
134         public final ResolveInfo info;
135         public final String label;
136         private final IconDrawableFactory mIconFactory;
137         private final int mUserId;
138 
ActivityEntry(ResolveInfo info, String label, IconDrawableFactory iconFactory)139         public ActivityEntry(ResolveInfo info, String label, IconDrawableFactory iconFactory) {
140             this.info = info;
141             this.label = label;
142             mIconFactory = iconFactory;
143             mUserId = UserHandle.myUserId();
144         }
145 
146         @Override
compareTo(ActivityEntry entry)147         public int compareTo(ActivityEntry entry) {
148             return label.compareToIgnoreCase(entry.label);
149         }
150 
151         @Override
toString()152         public String toString() {
153             return label;
154         }
155 
getIcon()156         public Drawable getIcon() {
157             return mIconFactory.getBadgedIcon(
158                     info.activityInfo, info.activityInfo.applicationInfo, mUserId);
159         }
160     }
161 }
162