OSDN Git Service

Extract SHOW_TASKBAR to TaskbarIntent constant
[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
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;
41
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;
50
51 import java.text.Collator;
52 import java.util.ArrayList;
53 import java.util.Collections;
54 import java.util.List;
55
56 public class SelectAppActivity extends AppCompatActivity {
57
58     private AppListGenerator appListGenerator;
59     private ProgressBar progressBar;
60     private AppListAdapter hiddenAdapter;
61     private AppListAdapter topAppsAdapter;
62
63     private boolean isCollapsed;
64
65     private class SelectAppPagerAdapter extends FragmentPagerAdapter {
66
67         SelectAppPagerAdapter(FragmentManager fm) {
68             super(fm);
69         }
70
71         @Override
72         public Fragment getItem(int position) {
73             return SelectAppFragment.newInstance(position);
74         }
75
76         @Override
77         public int getCount() {
78             return 2;
79         }
80
81         @Override
82         public CharSequence getPageTitle(int position) {
83             switch(position) {
84                 case U.HIDDEN:
85                     return getString(R.string.tb_blacklist_dialog_title);
86                 case U.TOP_APPS:
87                     return getString(R.string.tb_top_apps_dialog_title);
88             }
89
90             return null;
91         }
92     }
93
94     @Override
95     protected void onCreate(Bundle savedInstanceState) {
96         super.onCreate(savedInstanceState);
97
98         boolean noShadow = getIntent().hasExtra("no_shadow");
99
100         if(savedInstanceState == null) {
101             setContentView(R.layout.tb_configure_start_menu);
102             setFinishOnTouchOutside(false);
103             setTitle(R.string.tb_start_menu_apps);
104
105             if(noShadow) {
106                 WindowManager.LayoutParams params = getWindow().getAttributes();
107                 params.dimAmount = 0;
108                 getWindow().setAttributes(params);
109
110                 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
111                     getWindow().setElevation(0);
112             }
113
114             SharedPreferences pref = U.getSharedPreferences(this);
115             isCollapsed = !pref.getBoolean("collapsed", false);
116
117             if(!isCollapsed) {
118                 LocalBroadcastManager
119                         .getInstance(this)
120                         .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
121             }
122
123             progressBar = findViewById(R.id.progress_bar);
124             appListGenerator = new AppListGenerator();
125             appListGenerator.execute();
126         } else {
127             // Workaround for ViewPager disappearing on config change
128             finish();
129
130             if(!noShadow)
131                 new Handler().post(() -> {
132                     Intent intent = null;
133                     SharedPreferences pref3 = U.getSharedPreferences(this);
134
135                     switch(pref3.getString("theme", "light")) {
136                         case "light":
137                             intent = new Intent(this, SelectAppActivity.class);
138                             break;
139                         case "dark":
140                             intent = new Intent(this, SelectAppActivityDark.class);
141                             break;
142                     }
143
144                     startActivity(intent);
145                 });
146         }
147     }
148
149     @Override
150     public void finish() {
151         if(appListGenerator != null && appListGenerator.getStatus() == AsyncTask.Status.RUNNING)
152             appListGenerator.cancel(true);
153
154         if (!isCollapsed) {
155             LocalBroadcastManager
156                     .getInstance(this)
157                     .sendBroadcast(new Intent(TaskbarIntent.ACTION_SHOW_TASKBAR));
158         }
159         super.finish();
160     }
161
162     public AppListAdapter getAppListAdapter(int type) {
163         switch(type) {
164             case U.HIDDEN:
165                 return hiddenAdapter;
166             case U.TOP_APPS:
167                 return topAppsAdapter;
168         }
169
170         return null;
171     }
172
173     private final class AppListGenerator extends AsyncTask<Void, Void, AppListAdapter[]> {
174         @SuppressWarnings("Convert2streamapi")
175         @Override
176         protected AppListAdapter[] doInBackground(Void... params) {
177             UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE);
178             LauncherApps launcherApps = (LauncherApps) getSystemService(Context.LAUNCHER_APPS_SERVICE);
179
180             final List<UserHandle> userHandles = userManager.getUserProfiles();
181             final List<LauncherActivityInfo> list = new ArrayList<>();
182
183             for(UserHandle handle : userHandles) {
184                 list.addAll(launcherApps.getActivityList(null, handle));
185             }
186
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<>();
193
194             for(BlacklistEntry entry : blacklist.getBlockedApps()) {
195                 blacklistedApps.add(entry.getPackageName());
196             }
197
198             for(BlacklistEntry entry : topApps.getTopApps()) {
199                 topAppsList.add(entry.getPackageName());
200             }
201
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());
207             }
208
209             for(String packageName : blacklistedApps) {
210                 if(!installedApps.contains(packageName))
211                     blacklist.removeBlockedApp(SelectAppActivity.this, packageName);
212             }
213
214             for(String packageName : topAppsList) {
215                 if(!installedApps.contains(packageName))
216                     topApps.removeTopApp(SelectAppActivity.this, packageName);
217             }
218
219             Collections.sort(list, (ai1, ai2) -> {
220                 String label1;
221                 String label2;
222
223                 try {
224                     label1 = ai1.getLabel().toString();
225                     label2 = ai2.getLabel().toString();
226                 } catch (OutOfMemoryError e) {
227                     System.gc();
228
229                     label1 = ai1.getApplicationInfo().packageName;
230                     label2 = ai2.getApplicationInfo().packageName;
231                 }
232
233                 return Collator.getInstance().compare(label1, label2);
234             });
235
236             final List<BlacklistEntry> entries = new ArrayList<>();
237             for(LauncherActivityInfo appInfo : list) {
238                 String label;
239
240                 try {
241                     label = appInfo.getLabel().toString();
242                 } catch (OutOfMemoryError e) {
243                     System.gc();
244
245                     label = appInfo.getApplicationInfo().packageName;
246                 }
247
248                 entries.add(new BlacklistEntry(
249                         appInfo.getApplicationInfo().packageName + "/" + appInfo.getName()
250                                 + ":" + userManager.getSerialNumberForUser(appInfo.getUser()),
251                         label));
252             }
253
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)
257             };
258         }
259
260         @Override
261         protected void onPostExecute(AppListAdapter[] adapters) {
262             hiddenAdapter = adapters[U.HIDDEN];
263             topAppsAdapter = adapters[U.TOP_APPS];
264
265             SelectAppPagerAdapter pagerAdapter = new SelectAppPagerAdapter(getSupportFragmentManager());
266             ViewPager viewPager = findViewById(R.id.pager);
267             viewPager.setAdapter(pagerAdapter);
268
269             TabLayout tabLayout = findViewById(R.id.sliding_tabs);
270             tabLayout.setupWithViewPager(viewPager);
271
272             findViewById(R.id.configure_start_menu_layout).setVisibility(View.VISIBLE);
273             progressBar.setVisibility(View.GONE);
274             setFinishOnTouchOutside(true);
275         }
276     }
277 }