1 /* Copyright 2016 Braden Farmer
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
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package com.farmerbb.taskbar.activity;
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;
30 import com.farmerbb.taskbar.content.TaskbarIntent;
31 import com.google.android.material.tabs.TabLayout;
32 import androidx.fragment.app.Fragment;
33 import androidx.fragment.app.FragmentManager;
34 import androidx.fragment.app.FragmentPagerAdapter;
35 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
36 import androidx.viewpager.widget.ViewPager;
37 import androidx.appcompat.app.AppCompatActivity;
38 import android.view.View;
39 import android.view.WindowManager;
40 import android.widget.ProgressBar;
42 import com.farmerbb.taskbar.R;
43 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
44 import com.farmerbb.taskbar.adapter.AppListAdapter;
45 import com.farmerbb.taskbar.fragment.SelectAppFragment;
46 import com.farmerbb.taskbar.util.Blacklist;
47 import com.farmerbb.taskbar.util.BlacklistEntry;
48 import com.farmerbb.taskbar.util.TopApps;
49 import com.farmerbb.taskbar.util.U;
51 import java.text.Collator;
52 import java.util.ArrayList;
53 import java.util.Collections;
54 import java.util.List;
56 public class SelectAppActivity extends AppCompatActivity {
58 private AppListGenerator appListGenerator;
59 private ProgressBar progressBar;
60 private AppListAdapter hiddenAdapter;
61 private AppListAdapter topAppsAdapter;
63 private boolean isCollapsed;
65 private class SelectAppPagerAdapter extends FragmentPagerAdapter {
67 SelectAppPagerAdapter(FragmentManager fm) {
72 public Fragment getItem(int position) {
73 return SelectAppFragment.newInstance(position);
77 public int getCount() {
82 public CharSequence getPageTitle(int position) {
85 return getString(R.string.tb_blacklist_dialog_title);
87 return getString(R.string.tb_top_apps_dialog_title);
95 protected void onCreate(Bundle savedInstanceState) {
96 super.onCreate(savedInstanceState);
98 boolean noShadow = getIntent().hasExtra("no_shadow");
100 if(savedInstanceState == null) {
101 setContentView(R.layout.tb_configure_start_menu);
102 setFinishOnTouchOutside(false);
103 setTitle(R.string.tb_start_menu_apps);
106 WindowManager.LayoutParams params = getWindow().getAttributes();
107 params.dimAmount = 0;
108 getWindow().setAttributes(params);
110 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
111 getWindow().setElevation(0);
114 SharedPreferences pref = U.getSharedPreferences(this);
115 isCollapsed = !pref.getBoolean("collapsed", false);
118 LocalBroadcastManager
120 .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
123 progressBar = findViewById(R.id.progress_bar);
124 appListGenerator = new AppListGenerator();
125 appListGenerator.execute();
127 // Workaround for ViewPager disappearing on config change
131 new Handler().post(() -> {
132 Intent intent = null;
133 SharedPreferences pref3 = U.getSharedPreferences(this);
135 switch(pref3.getString("theme", "light")) {
137 intent = new Intent(this, SelectAppActivity.class);
140 intent = new Intent(this, SelectAppActivityDark.class);
144 startActivity(intent);
150 public void finish() {
151 if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
152 appListGenerator.cancel(true);
155 LocalBroadcastManager
157 .sendBroadcast(new Intent(TaskbarIntent.ACTION_SHOW_TASKBAR));
162 public AppListAdapter getAppListAdapter(int type) {
165 return hiddenAdapter;
167 return topAppsAdapter;
173 private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
174 @SuppressWarnings("Convert2streamapi")
176 protected AppListAdapter[] doInBackground(Void... params) {
177 UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
178 LauncherApps launcherApps = (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
180 final List<UserHandle> userHandles = userManager.getUserProfiles();
181 final List<LauncherActivityInfo> list = new ArrayList<>();
183 for(UserHandle handle : userHandles) {
184 list.addAll(launcherApps.getActivityList(null, handle));
187 // Remove any uninstalled apps from the blacklist and top apps
188 Blacklist blacklist = Blacklist.getInstance(SelectAppActivity.this);
189 TopApps topApps = TopApps.getInstance(SelectAppActivity.this);
190 List<String> blacklistedApps = new ArrayList<>();
191 List<String> topAppsList = new ArrayList<>();
192 List<String> installedApps = new ArrayList<>();
194 for(BlacklistEntry entry : blacklist.getBlockedApps()) {
195 blacklistedApps.add(entry.getPackageName());
198 for(BlacklistEntry entry : topApps.getTopApps()) {
199 topAppsList.add(entry.getPackageName());
202 for(LauncherActivityInfo appInfo : list) {
203 installedApps.add(appInfo.getApplicationInfo().packageName + "/" + appInfo.getName()
204 + ":" + userManager.getSerialNumberForUser(appInfo.getUser()));
205 installedApps.add(appInfo.getApplicationInfo().packageName + "/" + appInfo.getName());
206 installedApps.add(appInfo.getName());
209 for(String packageName : blacklistedApps) {
210 if(!installedApps.contains(packageName))
211 blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
214 for(String packageName : topAppsList) {
215 if(!installedApps.contains(packageName))
216 topApps.removeTopApp(SelectAppActivity.this, packageName);
219 Collections.sort(list, (ai1, ai2) -> {
224 label1 = ai1.getLabel().toString();
225 label2 = ai2.getLabel().toString();
226 } catch (OutOfMemoryError e) {
229 label1 = ai1.getApplicationInfo().packageName;
230 label2 = ai2.getApplicationInfo().packageName;
233 return Collator.getInstance().compare(label1, label2);
236 final List<BlacklistEntry> entries = new ArrayList<>();
237 for(LauncherActivityInfo appInfo : list) {
241 label = appInfo.getLabel().toString();
242 } catch (OutOfMemoryError e) {
245 label = appInfo.getApplicationInfo().packageName;
248 entries.add(new BlacklistEntry(
249 appInfo.getApplicationInfo().packageName + "/" + appInfo.getName()
250 + ":" + userManager.getSerialNumberForUser(appInfo.getUser()),
254 return new AppListAdapter[] {
255 new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.HIDDEN),
256 new AppListAdapter(SelectAppActivity.this, R.layout.tb_row_blacklist, entries, U.TOP_APPS)
261 protected void onPostExecute(AppListAdapter[] adapters) {
262 hiddenAdapter = adapters[U.HIDDEN];
263 topAppsAdapter = adapters[U.TOP_APPS];
265 SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
266 ViewPager viewPager = findViewById(R.id.pager);
267 viewPager.setAdapter(pagerAdapter);
269 TabLayout tabLayout = findViewById(R.id.sliding_tabs);
270 tabLayout.setupWithViewPager(viewPager);
272 findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
273 progressBar.setVisibility(View.GONE);
274 setFinishOnTouchOutside(true);