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;
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;
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;
48 import java.text.Collator;
49 import java.util.ArrayList;
50 import java.util.Collections;
51 import java.util.List;
53 public class SelectAppActivity extends AppCompatActivity {
55 private AppListGenerator appListGenerator;
56 private ProgressBar progressBar;
57 private AppListAdapter hiddenAdapter;
58 private AppListAdapter topAppsAdapter;
60 private class SelectAppPagerAdapter extends FragmentPagerAdapter {
62 SelectAppPagerAdapter(FragmentManager fm) {
67 public Fragment getItem(int position) {
68 return SelectAppFragment.newInstance(position);
72 public int getCount() {
77 public CharSequence getPageTitle(int position) {
80 return getString(R.string.blacklist_dialog_title);
82 return getString(R.string.top_apps_dialog_title);
90 protected void onCreate(Bundle savedInstanceState) {
91 super.onCreate(savedInstanceState);
93 boolean noShadow = getIntent().hasExtra("no_shadow");
95 if(savedInstanceState == null) {
96 setContentView(R.layout.configure_start_menu);
97 setFinishOnTouchOutside(false);
98 setTitle(R.string.start_menu_apps);
101 WindowManager.LayoutParams params = getWindow().getAttributes();
102 params.dimAmount = 0;
103 getWindow().setAttributes(params);
105 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
106 getWindow().setElevation(0);
109 progressBar = findViewById(R.id.progress_bar);
110 appListGenerator = new AppListGenerator();
111 appListGenerator.execute();
113 // Workaround for ViewPager disappearing on config change
117 new Handler().post(() -> {
118 Intent intent = null;
119 SharedPreferences pref3 = U.getSharedPreferences(this);
121 switch(pref3.getString("theme", "light")) {
123 intent = new Intent(this, SelectAppActivity.class);
126 intent = new Intent(this, SelectAppActivityDark.class);
130 startActivity(intent);
136 public void finish() {
137 if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
138 appListGenerator.cancel(true);
143 public AppListAdapter getAppListAdapter(int type) {
146 return hiddenAdapter;
148 return topAppsAdapter;
154 private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
155 @SuppressWarnings("Convert2streamapi")
157 protected AppListAdapter[] doInBackground(Void... params) {
158 UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
159 LauncherApps launcherApps = (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
161 final List<UserHandle> userHandles = userManager.getUserProfiles();
162 final List<LauncherActivityInfo> list = new ArrayList<>();
164 for(UserHandle handle : userHandles) {
165 list.addAll(launcherApps.getActivityList(null, handle));
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<>();
175 for(BlacklistEntry entry : blacklist.getBlockedApps()) {
176 blacklistedApps.add(entry.getPackageName());
179 for(BlacklistEntry entry : topApps.getTopApps()) {
180 topAppsList.add(entry.getPackageName());
183 for(LauncherActivityInfo appInfo : list) {
184 installedApps.add(appInfo.getApplicationInfo().packageName + "/" + appInfo.getName());
185 installedApps.add(appInfo.getName());
188 for(String packageName : blacklistedApps) {
189 if(!installedApps.contains(packageName))
190 blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
193 for(String packageName : topAppsList) {
194 if(!installedApps.contains(packageName))
195 topApps.removeTopApp(SelectAppActivity.this, packageName);
198 Collections.sort(list, (ai1, ai2) -> {
203 label1 = ai1.getLabel().toString();
204 label2 = ai2.getLabel().toString();
205 } catch (OutOfMemoryError e) {
208 label1 = ai1.getApplicationInfo().packageName;
209 label2 = ai2.getApplicationInfo().packageName;
212 return Collator.getInstance().compare(label1, label2);
215 final List<BlacklistEntry> entries = new ArrayList<>();
216 for(LauncherActivityInfo appInfo : list) {
220 label = appInfo.getLabel().toString();
221 } catch (OutOfMemoryError e) {
224 label = appInfo.getApplicationInfo().packageName;
227 entries.add(new BlacklistEntry(
228 appInfo.getApplicationInfo().packageName + "/" + appInfo.getName(),
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)
239 protected void onPostExecute(AppListAdapter[] adapters) {
240 hiddenAdapter = adapters[U.HIDDEN];
241 topAppsAdapter = adapters[U.TOP_APPS];
243 SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
244 ViewPager viewPager = findViewById(R.id.pager);
245 viewPager.setAdapter(pagerAdapter);
247 TabLayout tabLayout = findViewById(R.id.sliding_tabs);
248 tabLayout.setupWithViewPager(viewPager);
250 findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
251 progressBar.setVisibility(View.GONE);
252 setFinishOnTouchOutside(true);