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 package com.example.android.pm.shortcutlauncherdemo;
17 
18 import android.app.ListFragment;
19 import android.content.BroadcastReceiver;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.content.IntentFilter;
23 import android.content.pm.ApplicationInfo;
24 import android.content.pm.LauncherApps;
25 import android.content.pm.LauncherApps.ShortcutQuery;
26 import android.content.pm.PackageManager;
27 import android.content.pm.PackageManager.NameNotFoundException;
28 import android.content.pm.ShortcutInfo;
29 import android.os.Bundle;
30 import android.os.UserHandle;
31 import android.os.UserManager;
32 import android.util.ArrayMap;
33 import android.util.Log;
34 import android.widget.Toast;
35 
36 import java.util.Arrays;
37 import java.util.List;
38 
39 public abstract class MyBaseListFragment extends ListFragment {
40     protected UserManager mUserManager;
41     protected LauncherApps mLauncherApps;
42 
43     private ArrayMap<String, String> mAppNames = new ArrayMap<>();
44 
45     protected final ShortcutQuery mQuery = new ShortcutQuery();
46 
47     public final static IntentFilter sProfileFilter = new IntentFilter();
48 
49     static {
50         sProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_ADDED);
51         sProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_AVAILABLE);
52         sProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_REMOVED);
53         sProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE);
54         sProfileFilter.addAction(Intent.ACTION_MANAGED_PROFILE_UNLOCKED);
55     }
56 
57     private final BroadcastReceiver mProfileReceiver = new BroadcastReceiver() {
58         @Override
59         public void onReceive(Context context, Intent intent) {
60             refreshList();
61         }
62     };
63 
64     @Override
onCreate(Bundle savedInstanceState)65     public void onCreate(Bundle savedInstanceState) {
66         super.onCreate(savedInstanceState);
67 
68         mUserManager = getActivity().getSystemService(UserManager.class);
69         mLauncherApps = getActivity().getSystemService(LauncherApps.class);
70         mLauncherApps.registerCallback(mLauncherCallback);
71     }
72 
73     @Override
onResume()74     public void onResume() {
75         super.onResume();
76 
77         Log.d(Global.TAG, "Resumed");
78 
79         showPermissionWarningToastWhenNeeded();
80 
81         refreshList();
82 
83         getActivity().registerReceiver(mProfileReceiver, sProfileFilter);
84     }
85 
86     @Override
onPause()87     public void onPause() {
88         getActivity().unregisterReceiver(mProfileReceiver);
89 
90         super.onPause();
91     }
92 
93     @Override
onDestroy()94     public void onDestroy() {
95         mLauncherApps.unregisterCallback(mLauncherCallback);
96 
97         super.onDestroy();
98     }
99 
showPermissionWarningToastWhenNeeded()100     protected void showPermissionWarningToastWhenNeeded() {
101         if (!mLauncherApps.hasShortcutHostPermission()) {
102             Toast.makeText(getActivity(), "App doesn't have the shortcut permissions",
103                     Toast.LENGTH_SHORT).show();
104         }
105     }
106 
getAppLabel(String packageName)107     protected final String getAppLabel(String packageName) {
108         String name = mAppNames.get(packageName);
109         if (name != null) {
110             return name;
111         }
112         PackageManager pm = getActivity().getPackageManager();
113         try {
114             final ApplicationInfo ai = pm.getApplicationInfo(packageName, 0);
115             return pm.getApplicationLabel(ai).toString();
116         } catch (NameNotFoundException e) {
117             return packageName;
118         }
119     }
120 
refreshList()121     protected abstract void refreshList();
122 
123     private final LauncherApps.Callback mLauncherCallback = new LauncherApps.Callback() {
124         @Override
125         public void onPackageRemoved(String packageName, UserHandle user) {
126             Log.i(Global.TAG, "onPackageRemoved: package=" + packageName + " on " + user);
127             refreshList();
128         }
129 
130         @Override
131         public void onPackageAdded(String packageName, UserHandle user) {
132             Log.i(Global.TAG, "onPackageAdded: package=" + packageName + " on " + user);
133             refreshList();
134         }
135 
136         @Override
137         public void onPackageChanged(String packageName, UserHandle user) {
138             Log.i(Global.TAG, "onPackageChanged: package=" + packageName + " on " + user);
139             refreshList();
140         }
141 
142         @Override
143         public void onPackagesAvailable(String[] packageNames, UserHandle user, boolean replacing) {
144             Log.i(Global.TAG, "onPackagesAvailable: package=" + Arrays.asList(packageNames)
145                     + " on " + user);
146             refreshList();
147         }
148 
149         @Override
150         public void onPackagesUnavailable(String[] packageNames, UserHandle user,
151                 boolean replacing) {
152             Log.i(Global.TAG, "onPackagesUnavailable: package=" + Arrays.asList(packageNames)
153                     + " on " + user);
154             refreshList();
155         }
156 
157         @Override
158         public void onShortcutsChanged(String packageName,
159                 List<ShortcutInfo> shortcuts, UserHandle user) {
160             Log.i(Global.TAG, "onShortcutsChanged: package=" + packageName + " on " + user);
161             refreshList();
162         }
163     };
164 
165 }
166