OSDN Git Service

Add Android for Work support for desktop icons (and start menu blacklist/top apps...
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / SelectAppActivity.java
1 /* Copyright 2016 Braden Farmer
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 package com.farmerbb.taskbar.activity;
17
18 import android.content.Context;
19 import android.content.Intent;
20 import android.content.SharedPreferences;
21 import android.content.pm.LauncherActivityInfo;
22 import android.content.pm.LauncherApps;
23 import android.os.AsyncTask;
24 import android.os.Build;
25 import android.os.Bundle;
26 import android.os.Handler;
27 import android.os.UserHandle;
28 import android.os.UserManager;
29 import android.support.design.widget.TabLayout;
30 import android.support.v4.app.Fragment;
31 import android.support.v4.app.FragmentManager;
32 import android.support.v4.app.FragmentPagerAdapter;
33 import android.support.v4.view.ViewPager;
34 import android.support.v7.app.AppCompatActivity;
35 import android.view.View;
36 import android.view.WindowManager;
37 import android.widget.ProgressBar;
38
39 import com.farmerbb.taskbar.R;
40 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
41 import com.farmerbb.taskbar.adapter.AppListAdapter;
42 import com.farmerbb.taskbar.fragment.SelectAppFragment;
43 import com.farmerbb.taskbar.util.Blacklist;
44 import com.farmerbb.taskbar.util.BlacklistEntry;
45 import com.farmerbb.taskbar.util.TopApps;
46 import com.farmerbb.taskbar.util.U;
47
48 import java.text.Collator;
49 import java.util.ArrayList;
50 import java.util.Collections;
51 import java.util.List;
52
53 public class SelectAppActivity extends AppCompatActivity {
54
55     private AppListGenerator appListGenerator;
56     private ProgressBar progressBar;
57     private AppListAdapter hiddenAdapter;
58     private AppListAdapter topAppsAdapter;
59
60     private class SelectAppPagerAdapter extends FragmentPagerAdapter {
61
62         SelectAppPagerAdapter(FragmentManager fm) {
63             super(fm);
64         }
65
66         @Override
67         public Fragment getItem(int position) {
68             return SelectAppFragment.newInstance(position);
69         }
70
71         @Override
72         public int getCount() {
73             return 2;
74         }
75
76         @Override
77         public CharSequence getPageTitle(int position) {
78             switch(position) {
79                 case U.HIDDEN:
80                     return getString(R.string.blacklist_dialog_title);
81                 case U.TOP_APPS:
82                     return getString(R.string.top_apps_dialog_title);
83             }
84
85             return null;
86         }
87     }
88
89     @Override
90     protected void onCreate(Bundle savedInstanceState) {
91         super.onCreate(savedInstanceState);
92
93         boolean noShadow = getIntent().hasExtra("no_shadow");
94
95         if(savedInstanceState == null) {
96             setContentView(R.layout.configure_start_menu);
97             setFinishOnTouchOutside(false);
98             setTitle(R.string.start_menu_apps);
99
100             if(noShadow) {
101                 WindowManager.LayoutParams params = getWindow().getAttributes();
102                 params.dimAmount = 0;
103                 getWindow().setAttributes(params);
104
105                 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
106                     getWindow().setElevation(0);
107             }
108
109             progressBar = findViewById(R.id.progress_bar);
110             appListGenerator = new AppListGenerator();
111             appListGenerator.execute();
112         } else {
113             // Workaround for ViewPager disappearing on config change
114             finish();
115
116             if(!noShadow)
117                 new Handler().post(() -> {
118                     Intent intent = null;
119                     SharedPreferences pref3 = U.getSharedPreferences(this);
120
121                     switch(pref3.getString("theme", "light")) {
122                         case "light":
123                             intent = new Intent(this, SelectAppActivity.class);
124                             break;
125                         case "dark":
126                             intent = new Intent(this, SelectAppActivityDark.class);
127                             break;
128                     }
129
130                     startActivity(intent);
131                 });
132         }
133     }
134
135     @Override
136     public void finish() {
137         if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
138             appListGenerator.cancel(true);
139
140         super.finish();
141     }
142
143     public AppListAdapter getAppListAdapter(int type) {
144         switch(type) {
145             case U.HIDDEN:
146                 return hiddenAdapter;
147             case U.TOP_APPS:
148                 return topAppsAdapter;
149         }
150
151         return null;
152     }
153
154     private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
155         @SuppressWarnings("Convert2streamapi")
156         @Override
157         protected AppListAdapter[] doInBackground(Void... params) {
158             UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
159             LauncherApps launcherApps = (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
160
161             final List<UserHandle> userHandles = userManager.getUserProfiles();
162             final List<LauncherActivityInfo> list = new ArrayList<>();
163
164             for(UserHandle handle : userHandles) {
165                 list.addAll(launcherApps.getActivityList(null, handle));
166             }
167
168             // Remove any uninstalled apps from the blacklist and top apps
169             Blacklist blacklist = Blacklist.getInstance(SelectAppActivity.this);
170             TopApps topApps = TopApps.getInstance(SelectAppActivity.this);
171             List<String> blacklistedApps = new ArrayList<>();
172             List<String> topAppsList = new ArrayList<>();
173             List<String> installedApps = new ArrayList<>();
174
175             for(BlacklistEntry entry : blacklist.getBlockedApps()) {
176                 blacklistedApps.add(entry.getPackageName());
177             }
178
179             for(BlacklistEntry entry : topApps.getTopApps()) {
180                 topAppsList.add(entry.getPackageName());
181             }
182
183             for(LauncherActivityInfo appInfo : list) {
184                 installedApps.add(appInfo.getApplicationInfo().packageName + "/" + appInfo.getName());
185                 installedApps.add(appInfo.getName());
186             }
187
188             for(String packageName : blacklistedApps) {
189                 if(!installedApps.contains(packageName))
190                     blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
191             }
192
193             for(String packageName : topAppsList) {
194                 if(!installedApps.contains(packageName))
195                     topApps.removeTopApp(SelectAppActivity.this, packageName);
196             }
197
198             Collections.sort(list, (ai1, ai2) -> {
199                 String label1;
200                 String label2;
201
202                 try {
203                     label1 = ai1.getLabel().toString();
204                     label2 = ai2.getLabel().toString();
205                 } catch (OutOfMemoryError e) {
206                     System.gc();
207
208                     label1 = ai1.getApplicationInfo().packageName;
209                     label2 = ai2.getApplicationInfo().packageName;
210                 }
211
212                 return Collator.getInstance().compare(label1, label2);
213             });
214
215             final List<BlacklistEntry> entries = new ArrayList<>();
216             for(LauncherActivityInfo appInfo : list) {
217                 String label;
218
219                 try {
220                     label = appInfo.getLabel().toString();
221                 } catch (OutOfMemoryError e) {
222                     System.gc();
223
224                     label = appInfo.getApplicationInfo().packageName;
225                 }
226
227                 entries.add(new BlacklistEntry(
228                         appInfo.getApplicationInfo().packageName + "/" + appInfo.getName(),
229                         label));
230             }
231
232             return new AppListAdapter[] {
233                     new AppListAdapter(SelectAppActivity.this, R.layout.row_blacklist, entries, U.HIDDEN),
234                     new AppListAdapter(SelectAppActivity.this, R.layout.row_blacklist, entries, U.TOP_APPS)
235             };
236         }
237
238         @Override
239         protected void onPostExecute(AppListAdapter[] adapters) {
240             hiddenAdapter = adapters[U.HIDDEN];
241             topAppsAdapter = adapters[U.TOP_APPS];
242
243             SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
244             ViewPager viewPager = findViewById(R.id.pager);
245             viewPager.setAdapter(pagerAdapter);
246
247             TabLayout tabLayout = findViewById(R.id.sliding_tabs);
248             tabLayout.setupWithViewPager(viewPager);
249
250             findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
251             progressBar.setVisibility(View.GONE);
252             setFinishOnTouchOutside(true);
253         }
254     }
255 }