OSDN Git Service

Extract REFRESH_DESKTOP_ICONS to TaskbarIntent constant
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / ContextMenuActivity.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.accessibilityservice.AccessibilityService;
19 import android.annotation.SuppressLint;
20 import android.annotation.TargetApi;
21 import android.content.ActivityNotFoundException;
22 import android.content.BroadcastReceiver;
23 import android.content.ComponentName;
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.IntentFilter;
27 import android.content.SharedPreferences;
28 import android.content.pm.LauncherActivityInfo;
29 import android.content.pm.LauncherApps;
30 import android.content.pm.PackageManager;
31 import android.content.pm.ResolveInfo;
32 import android.content.pm.ShortcutInfo;
33 import android.media.AudioManager;
34 import android.net.Uri;
35 import android.os.Build;
36 import android.os.Bundle;
37 import android.os.UserManager;
38 import android.preference.Preference;
39 import android.preference.PreferenceActivity;
40 import android.provider.Settings;
41 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
42 import android.view.Gravity;
43 import android.view.View;
44 import android.view.WindowManager;
45
46 import com.farmerbb.taskbar.BuildConfig;
47 import com.farmerbb.taskbar.R;
48 import com.farmerbb.taskbar.activity.dark.DesktopIconSelectAppActivityDark;
49 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
50 import com.farmerbb.taskbar.content.TaskbarIntent;
51 import com.farmerbb.taskbar.util.AppEntry;
52 import com.farmerbb.taskbar.util.ApplicationType;
53 import com.farmerbb.taskbar.util.DesktopIconInfo;
54 import com.farmerbb.taskbar.util.DisplayInfo;
55 import com.farmerbb.taskbar.util.FreeformHackHelper;
56 import com.farmerbb.taskbar.util.IconCache;
57 import com.farmerbb.taskbar.util.LauncherHelper;
58 import com.farmerbb.taskbar.util.MenuHelper;
59 import com.farmerbb.taskbar.util.PinnedBlockedApps;
60 import com.farmerbb.taskbar.util.SavedWindowSizes;
61 import com.farmerbb.taskbar.util.U;
62
63 import org.json.JSONArray;
64 import org.json.JSONException;
65
66 import java.util.List;
67
68 public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener {
69
70     private AppEntry entry;
71     private DesktopIconInfo desktopIcon;
72
73     boolean showStartMenu = false;
74     boolean shouldHideTaskbar = false;
75     boolean isStartButton = false;
76     boolean isOverflowMenu = false;
77     boolean secondaryMenu = false;
78     boolean dashboardOrStartMenuAppearing = false;
79     boolean contextMenuFix = false;
80     boolean showQuitOption = false;
81
82     List<ShortcutInfo> shortcuts;
83
84     private BroadcastReceiver dashboardOrStartMenuAppearingReceiver = new BroadcastReceiver() {
85         @Override
86         public void onReceive(Context context, Intent intent) {
87             dashboardOrStartMenuAppearing = true;
88             finish();
89         }
90     };
91
92     private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
93         @Override
94         public void onReceive(Context context, Intent intent) {
95             finish();
96         }
97     };
98
99
100     @SuppressLint("RtlHardcoded")
101     @Override
102     protected void onPostCreate(Bundle savedInstanceState) {
103         super.onPostCreate(savedInstanceState);
104
105         LocalBroadcastManager
106                 .getInstance(this)
107                 .sendBroadcast(new Intent(TaskbarIntent.ACTION_CONTEXT_MENU_APPEARING));
108         MenuHelper.getInstance().setContextMenuOpen(true);
109
110         Bundle args = getIntent().getBundleExtra("args");
111         entry = (AppEntry) args.getSerializable("app_entry");
112         desktopIcon = (DesktopIconInfo) args.getSerializable("desktop_icon");
113
114         showStartMenu = args.getBoolean("launched_from_start_menu", false);
115         isStartButton = entry == null && args.getBoolean("is_start_button", false);
116         isOverflowMenu = entry == null && args.getBoolean("is_overflow_menu", false);
117         contextMenuFix = args.containsKey("context_menu_fix");
118         showQuitOption = !args.getBoolean("dont_show_quit", false);
119
120         // Determine where to position the dialog on screen
121         WindowManager.LayoutParams params = getWindow().getAttributes();
122         
123         if(args.containsKey("x") && args.containsKey("y"))
124             U.applyDisplayCutoutModeTo(params);
125
126         DisplayInfo display = U.getDisplayInfo(this);
127
128         int statusBarHeight = 0;
129         int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
130         if(resourceId > 0)
131             statusBarHeight = getResources().getDimensionPixelSize(resourceId);
132
133         if(showStartMenu || desktopIcon != null) {
134             int x = args.getInt("x", 0);
135             int y = args.getInt("y", 0);
136             int offset = getResources().getDimensionPixelSize(isOverflowMenu ? R.dimen.tb_context_menu_offset_overflow : R.dimen.tb_context_menu_offset);
137
138             switch(U.getTaskbarPosition(this)) {
139                 case "bottom_left":
140                 case "bottom_vertical_left":
141                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
142                     params.x = x;
143                     params.y = display.height - y - offset;
144                     break;
145                 case "bottom_right":
146                 case "bottom_vertical_right":
147                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
148                     params.x = x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset + offset;
149                     params.y = display.height - y - offset;
150                     break;
151                 case "top_left":
152                 case "top_vertical_left":
153                     params.gravity = Gravity.TOP | Gravity.LEFT;
154                     params.x = x;
155                     params.y = y - offset + statusBarHeight;
156                     break;
157                 case "top_right":
158                 case "top_vertical_right":
159                     params.gravity = Gravity.TOP | Gravity.LEFT;
160                     params.x = x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset + offset;
161                     params.y = y - offset + statusBarHeight;
162                     break;
163             }
164         } else {
165             LocalBroadcastManager
166                     .getInstance(this)
167                     .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_START_MENU));
168
169             int x = args.getInt("x", display.width);
170             int y = args.getInt("y", display.height);
171             int offset = getResources().getDimensionPixelSize(R.dimen.tb_icon_size);
172
173             switch(U.getTaskbarPosition(this)) {
174                 case "bottom_left":
175                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
176                     params.x = isStartButton ? 0 : x;
177                     params.y = offset;
178                     break;
179                 case "bottom_vertical_left":
180                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
181                     params.x = offset;
182                     params.y = display.height - y - (isStartButton ? 0 : offset);
183                     break;
184                 case "bottom_right":
185                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
186                     params.x = display.width - x;
187                     params.y = offset;
188                     break;
189                 case "bottom_vertical_right":
190                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
191                     params.x = offset;
192                     params.y = display.height - y - (isStartButton ? 0 : offset);
193                     break;
194                 case "top_left":
195                     params.gravity = Gravity.TOP | Gravity.LEFT;
196                     params.x = isStartButton ? 0 : x;
197                     params.y = offset;
198                     break;
199                 case "top_vertical_left":
200                     params.gravity = Gravity.TOP | Gravity.LEFT;
201                     params.x = offset;
202                     params.y = isStartButton ? 0 : y - statusBarHeight;
203                     break;
204                 case "top_right":
205                     params.gravity = Gravity.TOP | Gravity.RIGHT;
206                     params.x = display.width - x;
207                     params.y = offset;
208                     break;
209                 case "top_vertical_right":
210                     params.gravity = Gravity.TOP | Gravity.RIGHT;
211                     params.x = offset;
212                     params.y = isStartButton ? 0 : y - statusBarHeight;
213                     break;
214             }
215
216             if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > display.width / 2))
217                 params.x = params.x - getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width) + offset;
218         }
219
220         params.width = getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width);
221         params.dimAmount = 0;
222
223         if(U.isChromeOs(this) && U.getTaskbarPosition(this).contains("bottom")) {
224             SharedPreferences pref = U.getSharedPreferences(this);
225
226             if(pref.getBoolean("chrome_os_context_menu_fix", true)
227                     && !pref.getBoolean("has_caption", false))
228                 params.y = params.y - getResources().getDimensionPixelSize(R.dimen.tb_caption_offset);
229         }
230
231         getWindow().setAttributes(params);
232
233         if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
234             getWindow().setElevation(0);
235
236         View view = findViewById(android.R.id.list);
237         if(view != null) view.setPadding(0, 0, 0, 0);
238
239         generateMenu();
240
241         IntentFilter intentFilter = new IntentFilter();
242         intentFilter.addAction(TaskbarIntent.ACTION_START_MENU_APPEARING);
243         intentFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
244
245         LocalBroadcastManager
246                 .getInstance(this)
247                 .registerReceiver(dashboardOrStartMenuAppearingReceiver, intentFilter);
248         LocalBroadcastManager
249                 .getInstance(this)
250                 .registerReceiver(
251                         finishReceiver,
252                         new IntentFilter(TaskbarIntent.ACTION_HIDE_CONTEXT_MENU)
253                 );
254     }
255
256     @SuppressWarnings("deprecation")
257     private void generateMenu() {
258         SharedPreferences pref = U.getSharedPreferences(this);
259
260         if(isStartButton) {
261             addPreferencesFromResource(R.xml.tb_pref_context_menu_open_settings);
262             findPreference("open_taskbar_settings").setOnPreferenceClickListener(this);
263             findPreference("start_menu_apps").setOnPreferenceClickListener(this);
264
265             if(pref.getBoolean("freeform_hack", false)
266                     && !U.isDesktopIconsEnabled(this)
267                     && ((U.launcherIsDefault(this)
268                     && !U.isOverridingFreeformHack(this, false)
269                     && FreeformHackHelper.getInstance().isInFreeformWorkspace())
270                     || (U.isOverridingFreeformHack(this, false)
271                     && LauncherHelper.getInstance().isOnHomeScreen()))) {
272                 addPreferencesFromResource(R.xml.tb_pref_context_menu_change_wallpaper);
273                 findPreference("change_wallpaper").setOnPreferenceClickListener(this);
274             }
275
276             if(showQuitOption) {
277                 addPreferencesFromResource(R.xml.tb_pref_context_menu_quit);
278                 findPreference("quit_taskbar").setOnPreferenceClickListener(this);
279             }
280         } else if(isOverflowMenu) {
281             if(getResources().getConfiguration().screenWidthDp >= 600
282                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
283                 setTitle(R.string.tb_tools);
284             else {
285                 addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
286                 findPreference("header").setTitle(R.string.tb_tools);
287             }
288
289             addPreferencesFromResource(R.xml.tb_pref_context_menu_overflow);
290             findPreference("volume").setOnPreferenceClickListener(this);
291             findPreference("system_settings").setOnPreferenceClickListener(this);
292
293             if(!U.isLibrary(this))
294                 findPreference("power_menu").setOnPreferenceClickListener(this);
295             else
296                 getPreferenceScreen().removePreference(findPreference("power_menu"));
297
298             if(!U.isLibrary(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
299                 findPreference("lock_device").setOnPreferenceClickListener(this);
300             else
301                 getPreferenceScreen().removePreference(findPreference("lock_device"));
302
303             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
304                 findPreference("file_manager").setOnPreferenceClickListener(this);
305             else
306                 getPreferenceScreen().removePreference(findPreference("file_manager"));
307         } else if(desktopIcon != null && entry == null) {
308             addPreferencesFromResource(R.xml.tb_pref_context_menu_desktop_icons);
309             findPreference("add_icon_to_desktop").setOnPreferenceClickListener(this);
310             findPreference("arrange_icons").setOnPreferenceClickListener(this);
311             findPreference("sort_by_name").setOnPreferenceClickListener(this);
312             findPreference("change_wallpaper").setOnPreferenceClickListener(this);
313         } else {
314             if(getResources().getConfiguration().screenWidthDp >= 600
315                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
316                 setTitle(entry.getLabel());
317             else {
318                 addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
319                 findPreference("header").setTitle(entry.getLabel());
320             }
321
322             if(U.hasFreeformSupport(this)
323                     && pref.getBoolean("freeform_hack", false)
324                     && !U.isGame(this, entry.getPackageName())) {
325                 addPreferencesFromResource(R.xml.tb_pref_context_menu_show_window_sizes);
326                 findPreference("show_window_sizes").setOnPreferenceClickListener(this);
327             }
328
329             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
330                 int shortcutCount = getLauncherShortcuts();
331
332                 if(shortcutCount > 1) {
333                     addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcuts);
334                     findPreference("app_shortcuts").setOnPreferenceClickListener(this);
335                 } else if(shortcutCount == 1)
336                     generateShortcuts();
337             }
338
339             final PackageManager pm = getPackageManager();
340             Intent homeIntent = new Intent(Intent.ACTION_MAIN);
341             homeIntent.addCategory(Intent.CATEGORY_HOME);
342             ResolveInfo defaultLauncher = pm.resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
343
344             if(desktopIcon != null) {
345                 addPreferencesFromResource(R.xml.tb_pref_context_menu_remove_desktop_icon);
346                 findPreference("arrange_icons").setOnPreferenceClickListener(this);
347                 findPreference("remove_desktop_icon").setOnPreferenceClickListener(this);
348             } else if(!entry.getPackageName().contains(BuildConfig.BASE_APPLICATION_ID)
349                     && !entry.getPackageName().equals(defaultLauncher.activityInfo.packageName)) {
350                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
351
352                 if(pba.isPinned(entry.getComponentName())) {
353                     addPreferencesFromResource(R.xml.tb_pref_context_menu_pin);
354                     findPreference("pin_app").setOnPreferenceClickListener(this);
355                     findPreference("pin_app").setTitle(R.string.tb_unpin_app);
356                 } else if(pba.isBlocked(entry.getComponentName())) {
357                     addPreferencesFromResource(R.xml.tb_pref_context_menu_block);
358                     findPreference("block_app").setOnPreferenceClickListener(this);
359                     findPreference("block_app").setTitle(R.string.tb_unblock_app);
360                 } else {
361                     final int MAX_NUM_OF_COLUMNS = U.getMaxNumOfEntries(this);
362
363                     if(pba.getPinnedApps().size() < MAX_NUM_OF_COLUMNS) {
364                         addPreferencesFromResource(R.xml.tb_pref_context_menu_pin);
365                         findPreference("pin_app").setOnPreferenceClickListener(this);
366                         findPreference("pin_app").setTitle(R.string.tb_pin_app);
367                     }
368
369                     addPreferencesFromResource(R.xml.tb_pref_context_menu_block);
370                     findPreference("block_app").setOnPreferenceClickListener(this);
371                     findPreference("block_app").setTitle(R.string.tb_block_app);
372                 }
373             }
374
375             addPreferencesFromResource(R.xml.tb_pref_context_menu);
376
377             findPreference("app_info").setOnPreferenceClickListener(this);
378             findPreference("uninstall").setOnPreferenceClickListener(this);
379         }
380     }
381
382     @SuppressWarnings("deprecation")
383     private void generateShortcuts() {
384         addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcut_list);
385         switch(shortcuts.size()) {
386             case 5:
387                 findPreference("shortcut_5").setTitle(getShortcutTitle(shortcuts.get(4)));
388                 findPreference("shortcut_5").setOnPreferenceClickListener(this);
389             case 4:
390                 findPreference("shortcut_4").setTitle(getShortcutTitle(shortcuts.get(3)));
391                 findPreference("shortcut_4").setOnPreferenceClickListener(this);
392             case 3:
393                 findPreference("shortcut_3").setTitle(getShortcutTitle(shortcuts.get(2)));
394                 findPreference("shortcut_3").setOnPreferenceClickListener(this);
395             case 2:
396                 findPreference("shortcut_2").setTitle(getShortcutTitle(shortcuts.get(1)));
397                 findPreference("shortcut_2").setOnPreferenceClickListener(this);
398             case 1:
399                 findPreference("shortcut_1").setTitle(getShortcutTitle(shortcuts.get(0)));
400                 findPreference("shortcut_1").setOnPreferenceClickListener(this);
401                 break;
402         }
403
404         switch(shortcuts.size()) {
405             case 1:
406                 getPreferenceScreen().removePreference(findPreference("shortcut_2"));
407             case 2:
408                 getPreferenceScreen().removePreference(findPreference("shortcut_3"));
409             case 3:
410                 getPreferenceScreen().removePreference(findPreference("shortcut_4"));
411             case 4:
412                 getPreferenceScreen().removePreference(findPreference("shortcut_5"));
413                 break;
414         }
415     }
416
417     @SuppressWarnings("deprecation")
418     private void generateWindowSizes() {
419         getPreferenceScreen().removeAll();
420
421         addPreferencesFromResource(R.xml.tb_pref_context_menu_window_size_list);
422         findPreference("window_size_standard").setOnPreferenceClickListener(this);
423         findPreference("window_size_large").setOnPreferenceClickListener(this);
424         findPreference("window_size_fullscreen").setOnPreferenceClickListener(this);
425         findPreference("window_size_half_left").setOnPreferenceClickListener(this);
426         findPreference("window_size_half_right").setOnPreferenceClickListener(this);
427         findPreference("window_size_phone_size").setOnPreferenceClickListener(this);
428
429         String windowSizePref = SavedWindowSizes.getInstance(this).getWindowSize(this, entry.getPackageName());
430         CharSequence title = findPreference("window_size_" + windowSizePref).getTitle();
431         findPreference("window_size_" + windowSizePref).setTitle('\u2713' + " " + title);
432     }
433
434     @SuppressWarnings("deprecation")
435     @TargetApi(Build.VERSION_CODES.N_MR1)
436     @Override
437     public boolean onPreferenceClick(Preference p) {
438         UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
439         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
440         boolean appIsValid = isStartButton || isOverflowMenu || desktopIcon != null ||
441                 (entry != null && !launcherApps.getActivityList(entry.getPackageName(),
442                         userManager.getUserForSerialNumber(entry.getUserId(this))).isEmpty());
443         secondaryMenu = false;
444
445         if(appIsValid) switch(p.getKey()) {
446             case "app_info":
447                 U.launchApp(this, () ->
448                         launcherApps.startAppDetailsActivity(
449                                 ComponentName.unflattenFromString(entry.getComponentName()),
450                                 userManager.getUserForSerialNumber(entry.getUserId(this)),
451                                 null,
452                                 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder()))));
453
454                 showStartMenu = false;
455                 shouldHideTaskbar = true;
456                 contextMenuFix = false;
457                 break;
458             case "uninstall":
459                 if(U.hasFreeformSupport(this) && isInMultiWindowMode()) {
460                     Intent intent2 = new Intent(this, DummyActivity.class);
461                     intent2.putExtra("uninstall", entry.getPackageName());
462                     intent2.putExtra("user_id", entry.getUserId(this));
463
464                     try {
465                         startActivity(intent2);
466                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
467                 } else {
468                     Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + entry.getPackageName()));
469                     intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(entry.getUserId(this)));
470
471                     try {
472                         startActivity(intent2);
473                     } catch (ActivityNotFoundException | IllegalArgumentException e) { /* Gracefully fail */ }
474                 }
475
476                 showStartMenu = false;
477                 shouldHideTaskbar = true;
478                 contextMenuFix = false;
479                 break;
480             case "open_taskbar_settings":
481                 U.launchApp(this, () -> {
482                     Intent intent2 = new Intent(this, MainActivity.class);
483                     intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
484
485                     try {
486                         startActivity(intent2,
487                                 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
488                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
489                 });
490
491                 showStartMenu = false;
492                 shouldHideTaskbar = true;
493                 contextMenuFix = false;
494                 break;
495             case "quit_taskbar":
496                 Intent quitIntent = new Intent("com.farmerbb.taskbar.QUIT");
497                 quitIntent.setPackage(getPackageName());
498                 sendBroadcast(quitIntent);
499
500                 showStartMenu = false;
501                 shouldHideTaskbar = true;
502                 contextMenuFix = false;
503                 break;
504             case "pin_app":
505                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
506                 if(pba.isPinned(entry.getComponentName()))
507                     pba.removePinnedApp(this, entry.getComponentName());
508                 else {
509                     Intent intent = new Intent();
510                     intent.setComponent(ComponentName.unflattenFromString(entry.getComponentName()));
511
512                     LauncherActivityInfo appInfo = launcherApps.resolveActivity(intent, userManager.getUserForSerialNumber(entry.getUserId(this)));
513                     if(appInfo != null) {
514                         AppEntry newEntry = new AppEntry(
515                                 entry.getPackageName(),
516                                 entry.getComponentName(),
517                                 entry.getLabel(),
518                                 IconCache.getInstance(this).getIcon(this, appInfo),
519                                 true);
520
521                         newEntry.setUserId(entry.getUserId(this));
522                         pba.addPinnedApp(this, newEntry);
523                     }
524                 }
525                 break;
526             case "block_app":
527                 PinnedBlockedApps pba2 = PinnedBlockedApps.getInstance(this);
528                 if(pba2.isBlocked(entry.getComponentName()))
529                     pba2.removeBlockedApp(this, entry.getComponentName());
530                 else
531                     pba2.addBlockedApp(this, entry);
532                 break;
533             case "show_window_sizes":
534                 generateWindowSizes();
535
536                 if(U.hasBrokenSetLaunchBoundsApi())
537                     U.showToastLong(this, R.string.tb_window_sizes_not_available);
538
539                 getListView().setOnItemLongClickListener((parent, view, position, id) -> {
540                     String[] windowSizes = { "standard", "large", "fullscreen", "half_left", "half_right", "phone_size" };
541
542                     SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSizes[position]);
543
544                     generateWindowSizes();
545                     return true;
546                 });
547
548                 secondaryMenu = true;
549                 break;
550             case "window_size_standard":
551             case "window_size_large":
552             case "window_size_fullscreen":
553             case "window_size_half_left":
554             case "window_size_half_right":
555             case "window_size_phone_size":
556                 String windowSize = p.getKey().replace("window_size_", "");
557
558                 SharedPreferences pref2 = U.getSharedPreferences(this);
559                 if(pref2.getBoolean("save_window_sizes", true)) {
560                     SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSize);
561                 }
562
563                 U.launchApp(
564                         getApplicationContext(),
565                         entry,
566                         windowSize,
567                         false,
568                         true,
569                         getListView().getChildAt(p.getOrder()));
570
571                 if(U.hasBrokenSetLaunchBoundsApi())
572                     U.cancelToast();
573
574                 showStartMenu = false;
575                 shouldHideTaskbar = true;
576                 contextMenuFix = false;
577                 break;
578             case "app_shortcuts":
579                 getPreferenceScreen().removeAll();
580                 generateShortcuts();
581
582                 secondaryMenu = true;
583                 break;
584             case "shortcut_1":
585             case "shortcut_2":
586             case "shortcut_3":
587             case "shortcut_4":
588             case "shortcut_5":
589                 U.startShortcut(
590                         getApplicationContext(),
591                         entry,
592                         shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1),
593                         getListView().getChildAt(p.getOrder()));
594
595                 showStartMenu = false;
596                 shouldHideTaskbar = true;
597                 contextMenuFix = false;
598                 break;
599             case "start_menu_apps":
600                 Intent intent = null;
601
602                 SharedPreferences pref3 = U.getSharedPreferences(this);
603                 switch(pref3.getString("theme", "light")) {
604                     case "light":
605                         intent = new Intent(this, SelectAppActivity.class);
606                         break;
607                     case "dark":
608                         intent = new Intent(this, SelectAppActivityDark.class);
609                         break;
610                 }
611
612                 if(U.hasFreeformSupport(this)
613                         && pref3.getBoolean("freeform_hack", false)
614                         && intent != null && isInMultiWindowMode()) {
615                     intent.putExtra("no_shadow", true);
616                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
617
618                     U.startActivityMaximized(getApplicationContext(), intent);
619                 } else {
620                     try {
621                         startActivity(intent);
622                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
623                 }
624
625                 showStartMenu = false;
626                 shouldHideTaskbar = true;
627                 contextMenuFix = false;
628                 break;
629             case "volume":
630                 AudioManager audio = (AudioManager) getSystemService(AUDIO_SERVICE);
631                 audio.adjustSuggestedStreamVolume(AudioManager.ADJUST_SAME, AudioManager.USE_DEFAULT_STREAM_TYPE, AudioManager.FLAG_SHOW_UI);
632
633                 showStartMenu = false;
634                 shouldHideTaskbar = true;
635                 contextMenuFix = false;
636                 break;
637             case "file_manager":
638                 U.launchApp(this, () -> {
639                     Intent fileManagerIntent;
640
641                     if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
642                         fileManagerIntent = new Intent(Intent.ACTION_VIEW);
643                     else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
644                         fileManagerIntent = new Intent("android.provider.action.BROWSE");
645                     else {
646                         fileManagerIntent = new Intent("android.provider.action.BROWSE_DOCUMENT_ROOT");
647                         fileManagerIntent.setComponent(ComponentName.unflattenFromString("com.android.documentsui/.DocumentsActivity"));
648                     }
649
650                     fileManagerIntent.addCategory(Intent.CATEGORY_DEFAULT);
651                     fileManagerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
652                     fileManagerIntent.setData(Uri.parse("content://com.android.externalstorage.documents/root/primary"));
653
654                     try {
655                         startActivity(fileManagerIntent,
656                                 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
657                     } catch (ActivityNotFoundException e) {
658                         U.showToast(this, R.string.tb_lock_device_not_supported);
659                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
660                 });
661
662                 showStartMenu = false;
663                 shouldHideTaskbar = true;
664                 contextMenuFix = false;
665                 break;
666             case "system_settings":
667                 U.launchApp(this, () -> {
668                     Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
669                     settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
670
671                     try {
672                         startActivity(settingsIntent,
673                                 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
674                     } catch (ActivityNotFoundException e) {
675                         U.showToast(this, R.string.tb_lock_device_not_supported);
676                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
677                 });
678
679                 showStartMenu = false;
680                 shouldHideTaskbar = true;
681                 contextMenuFix = false;
682                 break;
683             case "lock_device":
684                 U.lockDevice(this);
685
686                 showStartMenu = false;
687                 shouldHideTaskbar = true;
688                 contextMenuFix = false;
689                 break;
690             case "power_menu":
691                 U.sendAccessibilityAction(this, AccessibilityService.GLOBAL_ACTION_POWER_DIALOG);
692
693                 showStartMenu = false;
694                 shouldHideTaskbar = true;
695                 contextMenuFix = false;
696                 break;
697             case "add_icon_to_desktop":
698                 Intent intent2 = null;
699
700                 SharedPreferences pref4 = U.getSharedPreferences(this);
701                 switch(pref4.getString("theme", "light")) {
702                     case "light":
703                         intent2 = new Intent(this, DesktopIconSelectAppActivity.class);
704                         break;
705                     case "dark":
706                         intent2 = new Intent(this, DesktopIconSelectAppActivityDark.class);
707                         break;
708                 }
709
710                 if(intent2 != null)
711                     intent2.putExtra("desktop_icon", desktopIcon);
712
713                 if(U.hasFreeformSupport(this)
714                         && pref4.getBoolean("freeform_hack", false)
715                         && intent2 != null && isInMultiWindowMode()) {
716                     intent2.putExtra("no_shadow", true);
717                     intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
718
719                     U.startActivityMaximized(getApplicationContext(), intent2);
720                 } else {
721                     try {
722                         startActivity(intent2);
723                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
724                 }
725
726                 showStartMenu = false;
727                 shouldHideTaskbar = true;
728                 contextMenuFix = false;
729                 break;
730             case "arrange_icons":
731                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.ENTER_ICON_ARRANGE_MODE"));
732                 break;
733             case "sort_by_name":
734                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SORT_DESKTOP_ICONS"));
735                 break;
736             case "change_wallpaper":
737                 if(LauncherHelper.getInstance().isOnHomeScreen()) {
738                     LocalBroadcastManager
739                             .getInstance(this)
740                             .sendBroadcast(new Intent(TaskbarIntent.ACTION_TEMP_HIDE_TASKBAR));
741                 }
742
743                 Intent intent3 = Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.tb_set_wallpaper));
744                 intent3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
745                 U.startActivityMaximized(getApplicationContext(), intent3);
746
747                 showStartMenu = false;
748                 shouldHideTaskbar = true;
749                 contextMenuFix = false;
750                 break;
751             case "remove_desktop_icon":
752                 try {
753                     SharedPreferences pref5 = U.getSharedPreferences(this);
754                     JSONArray jsonIcons = new JSONArray(pref5.getString("desktop_icons", "[]"));
755                     int iconToRemove = -1;
756
757                     for(int i = 0; i < jsonIcons.length(); i++) {
758                         DesktopIconInfo info = DesktopIconInfo.fromJson(jsonIcons.getJSONObject(i));
759                         if(info != null && info.column == desktopIcon.column && info.row == desktopIcon.row) {
760                             iconToRemove = i;
761                             break;
762                         }
763                     }
764
765                     if(iconToRemove > -1) {
766                         jsonIcons.remove(iconToRemove);
767
768                         pref5.edit().putString("desktop_icons", jsonIcons.toString()).apply();
769                         LocalBroadcastManager
770                                 .getInstance(this)
771                                 .sendBroadcast(
772                                         new Intent(TaskbarIntent.ACTION_REFRESH_DESKTOP_ICONS)
773                                 );
774                     }
775                 } catch (JSONException e) { /* Gracefully fail */ }
776                 break;
777         }
778
779         if(!secondaryMenu) finish();
780         return true;
781     }
782
783     @Override
784     protected void onPause() {
785         super.onPause();
786         if(!isFinishing()) finish();
787     }
788
789     @Override
790     public void finish() {
791         LocalBroadcastManager
792                 .getInstance(this)
793                 .sendBroadcast(new Intent(TaskbarIntent.ACTION_CONTEXT_MENU_DISAPPEARING));
794         MenuHelper.getInstance().setContextMenuOpen(false);
795
796         if(!dashboardOrStartMenuAppearing) {
797             if (showStartMenu) {
798                 LocalBroadcastManager
799                         .getInstance(this)
800                         .sendBroadcast(new Intent(TaskbarIntent.ACTION_TOGGLE_START_MENU));
801             } else {
802                 LocalBroadcastManager
803                         .getInstance(this)
804                         .sendBroadcast(new Intent(TaskbarIntent.ACTION_RESET_START_MENU));
805
806                 if(shouldHideTaskbar && U.shouldCollapse(this, true)) {
807                     LocalBroadcastManager
808                             .getInstance(this)
809                             .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
810                 }
811             }
812         }
813
814         SharedPreferences pref = U.getSharedPreferences(this);
815
816         super.finish();
817         if(showStartMenu || pref.getBoolean("disable_animations", false))
818             overridePendingTransition(0, 0);
819     }
820
821     @TargetApi(Build.VERSION_CODES.N_MR1)
822     private int getLauncherShortcuts() {
823         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
824         if(launcherApps.hasShortcutHostPermission()) {
825             UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
826
827             LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
828             query.setActivity(ComponentName.unflattenFromString(entry.getComponentName()));
829             query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC
830                     | LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST
831                     | LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED);
832
833             shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(entry.getUserId(this)));
834             if(shortcuts != null)
835                 return shortcuts.size();
836         }
837
838         return 0;
839     }
840
841     @TargetApi(Build.VERSION_CODES.N_MR1)
842     private CharSequence getShortcutTitle(ShortcutInfo shortcut) {
843         CharSequence longLabel = shortcut.getLongLabel();
844         if(longLabel != null && longLabel.length() > 0 && longLabel.length() <= 20)
845             return longLabel;
846         else
847             return shortcut.getShortLabel();
848     }
849
850     @SuppressWarnings("deprecation")
851     @Override
852     public void onBackPressed() {
853         if(secondaryMenu) {
854             secondaryMenu = false;
855
856             getPreferenceScreen().removeAll();
857             generateMenu();
858
859             getListView().setOnItemLongClickListener(null);
860
861             if(U.hasBrokenSetLaunchBoundsApi())
862                 U.cancelToast();
863         } else {
864             if(contextMenuFix && !showStartMenu)
865                 U.startFreeformHack(this);
866
867             super.onBackPressed();
868             if(FreeformHackHelper.getInstance().isInFreeformWorkspace())
869                 overridePendingTransition(0, 0);
870         }
871     }
872
873     @Override
874     protected void onDestroy() {
875         super.onDestroy();
876
877         LocalBroadcastManager.getInstance(this).unregisterReceiver(dashboardOrStartMenuAppearingReceiver);
878         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
879     }
880 }