OSDN Git Service

Allow Taskbar to be built from Android 7.1 source
[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.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;
35
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;
44
45 import java.text.Collator;
46 import java.util.ArrayList;
47 import java.util.Collections;
48 import java.util.List;
49
50 public class SelectAppActivity extends AppCompatActivity {
51
52     private AppListGenerator appListGenerator;
53     private ProgressBar progressBar;
54     private AppListAdapter hiddenAdapter;
55     private AppListAdapter topAppsAdapter;
56
57     private class SelectAppPagerAdapter extends FragmentPagerAdapter {
58
59         SelectAppPagerAdapter(FragmentManager fm) {
60             super(fm);
61         }
62
63         @Override
64         public Fragment getItem(int position) {
65             return SelectAppFragment.newInstance(position);
66         }
67
68         @Override
69         public int getCount() {
70             return 2;
71         }
72
73         @Override
74         public CharSequence getPageTitle(int position) {
75             switch(position) {
76                 case U.HIDDEN:
77                     return getString(R.string.blacklist_dialog_title);
78                 case U.TOP_APPS:
79                     return getString(R.string.top_apps_dialog_title);
80             }
81
82             return null;
83         }
84     }
85
86     @Override
87     protected void onCreate(Bundle savedInstanceState) {
88         super.onCreate(savedInstanceState);
89
90         boolean noShadow = getIntent().hasExtra("no_shadow");
91
92         if(savedInstanceState == null) {
93             setContentView(R.layout.configure_start_menu);
94             setFinishOnTouchOutside(false);
95             setTitle(R.string.start_menu_apps);
96
97             if(noShadow) {
98                 WindowManager.LayoutParams params = getWindow().getAttributes();
99                 params.dimAmount = 0;
100                 getWindow().setAttributes(params);
101
102                 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
103                     getWindow().setElevation(0);
104             }
105
106             progressBar = U.findViewById(this, R.id.progress_bar);
107             appListGenerator = new AppListGenerator();
108             appListGenerator.execute();
109         } else {
110             // Workaround for ViewPager disappearing on config change
111             finish();
112
113             if(!noShadow)
114                 new Handler().post(() -> {
115                     Intent intent = null;
116                     SharedPreferences pref3 = U.getSharedPreferences(SelectAppActivity.this);
117
118                     switch(pref3.getString("theme", "light")) {
119                         case "light":
120                             intent = new Intent(SelectAppActivity.this, SelectAppActivity.class);
121                             break;
122                         case "dark":
123                             intent = new Intent(SelectAppActivity.this, SelectAppActivityDark.class);
124                             break;
125                     }
126
127                     startActivity(intent);
128                 });
129         }
130     }
131
132     @Override
133     public void finish() {
134         if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
135             appListGenerator.cancel(true);
136
137         super.finish();
138     }
139
140     public AppListAdapter getAppListAdapter(int type) {
141         switch(type) {
142             case U.HIDDEN:
143                 return hiddenAdapter;
144             case U.TOP_APPS:
145                 return topAppsAdapter;
146         }
147
148         return null;
149     }
150
151     private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
152         @SuppressWarnings("Convert2streamapi")
153         @Override
154         protected AppListAdapter[] doInBackground(Void... params) {
155             final PackageManager pm = getPackageManager();
156
157             Intent intent = new Intent(Intent.ACTION_MAIN);
158             intent.addCategory(Intent.CATEGORY_LAUNCHER);
159
160             List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
161
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<>();
168
169             for(BlacklistEntry entry : blacklist.getBlockedApps()) {
170                blacklistedApps.add(entry.getPackageName());
171             }
172
173             for(BlacklistEntry entry : topApps.getTopApps()) {
174                 topAppsList.add(entry.getPackageName());
175             }
176
177             for(ResolveInfo appInfo : list) {
178                 installedApps.add(appInfo.activityInfo.packageName + "/" + appInfo.activityInfo.name);
179                 installedApps.add(appInfo.activityInfo.name);
180             }
181
182             for(String packageName : blacklistedApps) {
183                 if(!installedApps.contains(packageName))
184                     blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
185             }
186
187             for(String packageName : topAppsList) {
188                 if(!installedApps.contains(packageName))
189                     topApps.removeTopApp(SelectAppActivity.this, packageName);
190             }
191
192             Collections.sort(list, (ai1, ai2) -> {
193                 String label1;
194                 String label2;
195
196                 try {
197                     label1 = ai1.activityInfo.loadLabel(pm).toString();
198                     label2 = ai2.activityInfo.loadLabel(pm).toString();
199                 } catch (OutOfMemoryError e) {
200                     System.gc();
201
202                     label1 = ai1.activityInfo.packageName;
203                     label2 = ai2.activityInfo.packageName;
204                 }
205
206                 return Collator.getInstance().compare(label1, label2);
207             });
208
209             final List<BlacklistEntry> entries = new ArrayList<>();
210             for(ResolveInfo appInfo : list) {
211                 String label;
212
213                 try {
214                     label = appInfo.loadLabel(pm).toString();
215                 } catch (OutOfMemoryError e) {
216                     System.gc();
217
218                     label = appInfo.activityInfo.packageName;
219                 }
220
221                 entries.add(new BlacklistEntry(
222                         appInfo.activityInfo.packageName + "/" + appInfo.activityInfo.name,
223                         label));
224             }
225
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)
229             };
230         }
231
232         @Override
233         protected void onPostExecute(AppListAdapter[] adapters) {
234             hiddenAdapter = adapters[U.HIDDEN];
235             topAppsAdapter = adapters[U.TOP_APPS];
236
237             SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
238             ViewPager viewPager = U.findViewById(SelectAppActivity.this, R.id.pager);
239             viewPager.setAdapter(pagerAdapter);
240
241             TabLayout tabLayout = U.findViewById(SelectAppActivity.this, R.id.sliding_tabs);
242             tabLayout.setupWithViewPager(viewPager);
243
244             findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
245             progressBar.setVisibility(View.GONE);
246             setFinishOnTouchOutside(true);
247         }
248     }
249 }