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.Intent;
19 import android.content.SharedPreferences;
20 import android.content.pm.PackageManager;
21 import android.content.pm.ResolveInfo;
22 import android.os.AsyncTask;
23 import android.os.Build;
24 import android.os.Bundle;
25 import android.os.Handler;
26 import android.support.design.widget.TabLayout;
27 import android.support.v4.app.Fragment;
28 import android.support.v4.app.FragmentManager;
29 import android.support.v4.app.FragmentPagerAdapter;
30 import android.support.v4.view.ViewPager;
31 import android.support.v7.app.AppCompatActivity;
32 import android.view.View;
33 import android.view.WindowManager;
34 import android.widget.ProgressBar;
36 import com.farmerbb.taskbar.R;
37 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
38 import com.farmerbb.taskbar.adapter.AppListAdapter;
39 import com.farmerbb.taskbar.fragment.SelectAppFragment;
40 import com.farmerbb.taskbar.util.Blacklist;
41 import com.farmerbb.taskbar.util.BlacklistEntry;
42 import com.farmerbb.taskbar.util.TopApps;
43 import com.farmerbb.taskbar.util.U;
45 import java.text.Collator;
46 import java.util.ArrayList;
47 import java.util.Collections;
48 import java.util.List;
50 public class SelectAppActivity extends AppCompatActivity {
52 private AppListGenerator appListGenerator;
53 private ProgressBar progressBar;
54 private AppListAdapter hiddenAdapter;
55 private AppListAdapter topAppsAdapter;
57 private class SelectAppPagerAdapter extends FragmentPagerAdapter {
59 SelectAppPagerAdapter(FragmentManager fm) {
64 public Fragment getItem(int position) {
65 return SelectAppFragment.newInstance(position);
69 public int getCount() {
74 public CharSequence getPageTitle(int position) {
77 return getString(R.string.blacklist_dialog_title);
79 return getString(R.string.top_apps_dialog_title);
87 protected void onCreate(Bundle savedInstanceState) {
88 super.onCreate(savedInstanceState);
90 boolean noShadow = getIntent().hasExtra("no_shadow");
92 if(savedInstanceState == null) {
93 setContentView(R.layout.configure_start_menu);
94 setFinishOnTouchOutside(false);
95 setTitle(R.string.start_menu_apps);
98 WindowManager.LayoutParams params = getWindow().getAttributes();
100 getWindow().setAttributes(params);
102 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
103 getWindow().setElevation(0);
106 progressBar = U.findViewById(this, R.id.progress_bar);
107 appListGenerator = new AppListGenerator();
108 appListGenerator.execute();
110 // Workaround for ViewPager disappearing on config change
114 new Handler().post(() -> {
115 Intent intent = null;
116 SharedPreferences pref3 = U.getSharedPreferences(SelectAppActivity.this);
118 switch(pref3.getString("theme", "light")) {
120 intent = new Intent(SelectAppActivity.this, SelectAppActivity.class);
123 intent = new Intent(SelectAppActivity.this, SelectAppActivityDark.class);
127 startActivity(intent);
133 public void finish() {
134 if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
135 appListGenerator.cancel(true);
140 public AppListAdapter getAppListAdapter(int type) {
143 return hiddenAdapter;
145 return topAppsAdapter;
151 private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
152 @SuppressWarnings("Convert2streamapi")
154 protected AppListAdapter[] doInBackground(Void... params) {
155 final PackageManager pm = getPackageManager();
157 Intent intent = new Intent(Intent.ACTION_MAIN);
158 intent.addCategory(Intent.CATEGORY_LAUNCHER);
160 List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
162 // Remove any uninstalled apps from the blacklist and top apps
163 Blacklist blacklist = Blacklist.getInstance(SelectAppActivity.this);
164 TopApps topApps = TopApps.getInstance(SelectAppActivity.this);
165 List<String> blacklistedApps = new ArrayList<>();
166 List<String> topAppsList = new ArrayList<>();
167 List<String> installedApps = new ArrayList<>();
169 for(BlacklistEntry entry : blacklist.getBlockedApps()) {
170 blacklistedApps.add(entry.getPackageName());
173 for(BlacklistEntry entry : topApps.getTopApps()) {
174 topAppsList.add(entry.getPackageName());
177 for(ResolveInfo appInfo : list) {
178 installedApps.add(appInfo.activityInfo.packageName + "/" + appInfo.activityInfo.name);
179 installedApps.add(appInfo.activityInfo.name);
182 for(String packageName : blacklistedApps) {
183 if(!installedApps.contains(packageName))
184 blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
187 for(String packageName : topAppsList) {
188 if(!installedApps.contains(packageName))
189 topApps.removeTopApp(SelectAppActivity.this, packageName);
192 Collections.sort(list, (ai1, ai2) -> {
197 label1 = ai1.activityInfo.loadLabel(pm).toString();
198 label2 = ai2.activityInfo.loadLabel(pm).toString();
199 } catch (OutOfMemoryError e) {
202 label1 = ai1.activityInfo.packageName;
203 label2 = ai2.activityInfo.packageName;
206 return Collator.getInstance().compare(label1, label2);
209 final List<BlacklistEntry> entries = new ArrayList<>();
210 for(ResolveInfo appInfo : list) {
214 label = appInfo.loadLabel(pm).toString();
215 } catch (OutOfMemoryError e) {
218 label = appInfo.activityInfo.packageName;
221 entries.add(new BlacklistEntry(
222 appInfo.activityInfo.packageName + "/" + appInfo.activityInfo.name,
226 return new AppListAdapter[] {
227 new AppListAdapter(SelectAppActivity.this, R.layout.row_blacklist, entries, U.HIDDEN),
228 new AppListAdapter(SelectAppActivity.this, R.layout.row_blacklist, entries, U.TOP_APPS)
233 protected void onPostExecute(AppListAdapter[] adapters) {
234 hiddenAdapter = adapters[U.HIDDEN];
235 topAppsAdapter = adapters[U.TOP_APPS];
237 SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
238 ViewPager viewPager = U.findViewById(SelectAppActivity.this, R.id.pager);
239 viewPager.setAdapter(pagerAdapter);
241 TabLayout tabLayout = U.findViewById(SelectAppActivity.this, R.id.sliding_tabs);
242 tabLayout.setupWithViewPager(viewPager);
244 findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
245 progressBar.setVisibility(View.GONE);
246 setFinishOnTouchOutside(true);