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.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;
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;
63 import org.json.JSONArray;
64 import org.json.JSONException;
66 import java.util.List;
68 public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener {
70 private AppEntry entry;
71 private DesktopIconInfo desktopIcon;
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;
82 List<ShortcutInfo> shortcuts;
84 private BroadcastReceiver dashboardOrStartMenuAppearingReceiver = new BroadcastReceiver() {
86 public void onReceive(Context context, Intent intent) {
87 dashboardOrStartMenuAppearing = true;
92 private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
94 public void onReceive(Context context, Intent intent) {
100 @SuppressLint("RtlHardcoded")
102 protected void onPostCreate(Bundle savedInstanceState) {
103 super.onPostCreate(savedInstanceState);
105 LocalBroadcastManager
107 .sendBroadcast(new Intent(TaskbarIntent.ACTION_CONTEXT_MENU_APPEARING));
108 MenuHelper.getInstance().setContextMenuOpen(true);
110 Bundle args = getIntent().getBundleExtra("args");
111 entry = (AppEntry) args.getSerializable("app_entry");
112 desktopIcon = (DesktopIconInfo) args.getSerializable("desktop_icon");
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);
120 // Determine where to position the dialog on screen
121 WindowManager.LayoutParams params = getWindow().getAttributes();
123 if(args.containsKey("x") && args.containsKey("y"))
124 U.applyDisplayCutoutModeTo(params);
126 DisplayInfo display = U.getDisplayInfo(this);
128 int statusBarHeight = 0;
129 int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
131 statusBarHeight = getResources().getDimensionPixelSize(resourceId);
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);
138 switch(U.getTaskbarPosition(this)) {
140 case "bottom_vertical_left":
141 params.gravity = Gravity.BOTTOM | Gravity.LEFT;
143 params.y = display.height - y - offset;
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;
152 case "top_vertical_left":
153 params.gravity = Gravity.TOP | Gravity.LEFT;
155 params.y = y - offset + statusBarHeight;
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;
165 LocalBroadcastManager
167 .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_START_MENU));
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);
173 switch(U.getTaskbarPosition(this)) {
175 params.gravity = Gravity.BOTTOM | Gravity.LEFT;
176 params.x = isStartButton ? 0 : x;
179 case "bottom_vertical_left":
180 params.gravity = Gravity.BOTTOM | Gravity.LEFT;
182 params.y = display.height - y - (isStartButton ? 0 : offset);
185 params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
186 params.x = display.width - x;
189 case "bottom_vertical_right":
190 params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
192 params.y = display.height - y - (isStartButton ? 0 : offset);
195 params.gravity = Gravity.TOP | Gravity.LEFT;
196 params.x = isStartButton ? 0 : x;
199 case "top_vertical_left":
200 params.gravity = Gravity.TOP | Gravity.LEFT;
202 params.y = isStartButton ? 0 : y - statusBarHeight;
205 params.gravity = Gravity.TOP | Gravity.RIGHT;
206 params.x = display.width - x;
209 case "top_vertical_right":
210 params.gravity = Gravity.TOP | Gravity.RIGHT;
212 params.y = isStartButton ? 0 : y - statusBarHeight;
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;
220 params.width = getResources().getDimensionPixelSize(R.dimen.tb_context_menu_width);
221 params.dimAmount = 0;
223 if(U.isChromeOs(this) && U.getTaskbarPosition(this).contains("bottom")) {
224 SharedPreferences pref = U.getSharedPreferences(this);
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);
231 getWindow().setAttributes(params);
233 if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
234 getWindow().setElevation(0);
236 View view = findViewById(android.R.id.list);
237 if(view != null) view.setPadding(0, 0, 0, 0);
241 IntentFilter intentFilter = new IntentFilter();
242 intentFilter.addAction(TaskbarIntent.ACTION_START_MENU_APPEARING);
243 intentFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
245 LocalBroadcastManager
247 .registerReceiver(dashboardOrStartMenuAppearingReceiver, intentFilter);
248 LocalBroadcastManager
252 new IntentFilter(TaskbarIntent.ACTION_HIDE_CONTEXT_MENU)
256 @SuppressWarnings("deprecation")
257 private void generateMenu() {
258 SharedPreferences pref = U.getSharedPreferences(this);
261 addPreferencesFromResource(R.xml.tb_pref_context_menu_open_settings);
262 findPreference("open_taskbar_settings").setOnPreferenceClickListener(this);
263 findPreference("start_menu_apps").setOnPreferenceClickListener(this);
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);
277 addPreferencesFromResource(R.xml.tb_pref_context_menu_quit);
278 findPreference("quit_taskbar").setOnPreferenceClickListener(this);
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);
285 addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
286 findPreference("header").setTitle(R.string.tb_tools);
289 addPreferencesFromResource(R.xml.tb_pref_context_menu_overflow);
290 findPreference("volume").setOnPreferenceClickListener(this);
291 findPreference("system_settings").setOnPreferenceClickListener(this);
293 if(!U.isLibrary(this))
294 findPreference("power_menu").setOnPreferenceClickListener(this);
296 getPreferenceScreen().removePreference(findPreference("power_menu"));
298 if(!U.isLibrary(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)
299 findPreference("lock_device").setOnPreferenceClickListener(this);
301 getPreferenceScreen().removePreference(findPreference("lock_device"));
303 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
304 findPreference("file_manager").setOnPreferenceClickListener(this);
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);
314 if(getResources().getConfiguration().screenWidthDp >= 600
315 && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
316 setTitle(entry.getLabel());
318 addPreferencesFromResource(R.xml.tb_pref_context_menu_header);
319 findPreference("header").setTitle(entry.getLabel());
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);
329 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
330 int shortcutCount = getLauncherShortcuts();
332 if(shortcutCount > 1) {
333 addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcuts);
334 findPreference("app_shortcuts").setOnPreferenceClickListener(this);
335 } else if(shortcutCount == 1)
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);
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);
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);
361 final int MAX_NUM_OF_COLUMNS = U.getMaxNumOfEntries(this);
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);
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);
375 addPreferencesFromResource(R.xml.tb_pref_context_menu);
377 findPreference("app_info").setOnPreferenceClickListener(this);
378 findPreference("uninstall").setOnPreferenceClickListener(this);
382 @SuppressWarnings("deprecation")
383 private void generateShortcuts() {
384 addPreferencesFromResource(R.xml.tb_pref_context_menu_shortcut_list);
385 switch(shortcuts.size()) {
387 findPreference("shortcut_5").setTitle(getShortcutTitle(shortcuts.get(4)));
388 findPreference("shortcut_5").setOnPreferenceClickListener(this);
390 findPreference("shortcut_4").setTitle(getShortcutTitle(shortcuts.get(3)));
391 findPreference("shortcut_4").setOnPreferenceClickListener(this);
393 findPreference("shortcut_3").setTitle(getShortcutTitle(shortcuts.get(2)));
394 findPreference("shortcut_3").setOnPreferenceClickListener(this);
396 findPreference("shortcut_2").setTitle(getShortcutTitle(shortcuts.get(1)));
397 findPreference("shortcut_2").setOnPreferenceClickListener(this);
399 findPreference("shortcut_1").setTitle(getShortcutTitle(shortcuts.get(0)));
400 findPreference("shortcut_1").setOnPreferenceClickListener(this);
404 switch(shortcuts.size()) {
406 getPreferenceScreen().removePreference(findPreference("shortcut_2"));
408 getPreferenceScreen().removePreference(findPreference("shortcut_3"));
410 getPreferenceScreen().removePreference(findPreference("shortcut_4"));
412 getPreferenceScreen().removePreference(findPreference("shortcut_5"));
417 @SuppressWarnings("deprecation")
418 private void generateWindowSizes() {
419 getPreferenceScreen().removeAll();
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);
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);
434 @SuppressWarnings("deprecation")
435 @TargetApi(Build.VERSION_CODES.N_MR1)
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;
445 if(appIsValid) switch(p.getKey()) {
447 U.launchApp(this, () ->
448 launcherApps.startAppDetailsActivity(
449 ComponentName.unflattenFromString(entry.getComponentName()),
450 userManager.getUserForSerialNumber(entry.getUserId(this)),
452 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder()))));
454 showStartMenu = false;
455 shouldHideTaskbar = true;
456 contextMenuFix = false;
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));
465 startActivity(intent2);
466 } catch (IllegalArgumentException e) { /* Gracefully fail */ }
468 Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + entry.getPackageName()));
469 intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(entry.getUserId(this)));
472 startActivity(intent2);
473 } catch (ActivityNotFoundException | IllegalArgumentException e) { /* Gracefully fail */ }
476 showStartMenu = false;
477 shouldHideTaskbar = true;
478 contextMenuFix = false;
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);
486 startActivity(intent2,
487 U.getActivityOptionsBundle(this, ApplicationType.APP_PORTRAIT, getListView().getChildAt(p.getOrder())));
488 } catch (IllegalArgumentException e) { /* Gracefully fail */ }
491 showStartMenu = false;
492 shouldHideTaskbar = true;
493 contextMenuFix = false;
496 Intent quitIntent = new Intent("com.farmerbb.taskbar.QUIT");
497 quitIntent.setPackage(getPackageName());
498 sendBroadcast(quitIntent);
500 showStartMenu = false;
501 shouldHideTaskbar = true;
502 contextMenuFix = false;
505 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
506 if(pba.isPinned(entry.getComponentName()))
507 pba.removePinnedApp(this, entry.getComponentName());
509 Intent intent = new Intent();
510 intent.setComponent(ComponentName.unflattenFromString(entry.getComponentName()));
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(),
518 IconCache.getInstance(this).getIcon(this, appInfo),
521 newEntry.setUserId(entry.getUserId(this));
522 pba.addPinnedApp(this, newEntry);
527 PinnedBlockedApps pba2 = PinnedBlockedApps.getInstance(this);
528 if(pba2.isBlocked(entry.getComponentName()))
529 pba2.removeBlockedApp(this, entry.getComponentName());
531 pba2.addBlockedApp(this, entry);
533 case "show_window_sizes":
534 generateWindowSizes();
536 if(U.hasBrokenSetLaunchBoundsApi())
537 U.showToastLong(this, R.string.tb_window_sizes_not_available);
539 getListView().setOnItemLongClickListener((parent, view, position, id) -> {
540 String[] windowSizes = { "standard", "large", "fullscreen", "half_left", "half_right", "phone_size" };
542 SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSizes[position]);
544 generateWindowSizes();
548 secondaryMenu = true;
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_", "");
558 SharedPreferences pref2 = U.getSharedPreferences(this);
559 if(pref2.getBoolean("save_window_sizes", true)) {
560 SavedWindowSizes.getInstance(this).setWindowSize(this, entry.getPackageName(), windowSize);
564 getApplicationContext(),
569 getListView().getChildAt(p.getOrder()));
571 if(U.hasBrokenSetLaunchBoundsApi())
574 showStartMenu = false;
575 shouldHideTaskbar = true;
576 contextMenuFix = false;
578 case "app_shortcuts":
579 getPreferenceScreen().removeAll();
582 secondaryMenu = true;
590 getApplicationContext(),
592 shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1),
593 getListView().getChildAt(p.getOrder()));
595 showStartMenu = false;
596 shouldHideTaskbar = true;
597 contextMenuFix = false;
599 case "start_menu_apps":
600 Intent intent = null;
602 SharedPreferences pref3 = U.getSharedPreferences(this);
603 switch(pref3.getString("theme", "light")) {
605 intent = new Intent(this, SelectAppActivity.class);
608 intent = new Intent(this, SelectAppActivityDark.class);
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);
618 U.startActivityMaximized(getApplicationContext(), intent);
621 startActivity(intent);
622 } catch (IllegalArgumentException e) { /* Gracefully fail */ }
625 showStartMenu = false;
626 shouldHideTaskbar = true;
627 contextMenuFix = false;
630 AudioManager audio = (AudioManager) getSystemService(AUDIO_SERVICE);
631 audio.adjustSuggestedStreamVolume(AudioManager.ADJUST_SAME, AudioManager.USE_DEFAULT_STREAM_TYPE, AudioManager.FLAG_SHOW_UI);
633 showStartMenu = false;
634 shouldHideTaskbar = true;
635 contextMenuFix = false;
638 U.launchApp(this, () -> {
639 Intent fileManagerIntent;
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");
646 fileManagerIntent = new Intent("android.provider.action.BROWSE_DOCUMENT_ROOT");
647 fileManagerIntent.setComponent(ComponentName.unflattenFromString("com.android.documentsui/.DocumentsActivity"));
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"));
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 */ }
662 showStartMenu = false;
663 shouldHideTaskbar = true;
664 contextMenuFix = false;
666 case "system_settings":
667 U.launchApp(this, () -> {
668 Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
669 settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
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 */ }
679 showStartMenu = false;
680 shouldHideTaskbar = true;
681 contextMenuFix = false;
686 showStartMenu = false;
687 shouldHideTaskbar = true;
688 contextMenuFix = false;
691 U.sendAccessibilityAction(this, AccessibilityService.GLOBAL_ACTION_POWER_DIALOG);
693 showStartMenu = false;
694 shouldHideTaskbar = true;
695 contextMenuFix = false;
697 case "add_icon_to_desktop":
698 Intent intent2 = null;
700 SharedPreferences pref4 = U.getSharedPreferences(this);
701 switch(pref4.getString("theme", "light")) {
703 intent2 = new Intent(this, DesktopIconSelectAppActivity.class);
706 intent2 = new Intent(this, DesktopIconSelectAppActivityDark.class);
711 intent2.putExtra("desktop_icon", desktopIcon);
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);
719 U.startActivityMaximized(getApplicationContext(), intent2);
722 startActivity(intent2);
723 } catch (IllegalArgumentException e) { /* Gracefully fail */ }
726 showStartMenu = false;
727 shouldHideTaskbar = true;
728 contextMenuFix = false;
730 case "arrange_icons":
731 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.ENTER_ICON_ARRANGE_MODE"));
734 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.SORT_DESKTOP_ICONS"));
736 case "change_wallpaper":
737 if(LauncherHelper.getInstance().isOnHomeScreen()) {
738 LocalBroadcastManager
740 .sendBroadcast(new Intent(TaskbarIntent.ACTION_TEMP_HIDE_TASKBAR));
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);
747 showStartMenu = false;
748 shouldHideTaskbar = true;
749 contextMenuFix = false;
751 case "remove_desktop_icon":
753 SharedPreferences pref5 = U.getSharedPreferences(this);
754 JSONArray jsonIcons = new JSONArray(pref5.getString("desktop_icons", "[]"));
755 int iconToRemove = -1;
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) {
765 if(iconToRemove > -1) {
766 jsonIcons.remove(iconToRemove);
768 pref5.edit().putString("desktop_icons", jsonIcons.toString()).apply();
769 LocalBroadcastManager
772 new Intent(TaskbarIntent.ACTION_REFRESH_DESKTOP_ICONS)
775 } catch (JSONException e) { /* Gracefully fail */ }
779 if(!secondaryMenu) finish();
784 protected void onPause() {
786 if(!isFinishing()) finish();
790 public void finish() {
791 LocalBroadcastManager
793 .sendBroadcast(new Intent(TaskbarIntent.ACTION_CONTEXT_MENU_DISAPPEARING));
794 MenuHelper.getInstance().setContextMenuOpen(false);
796 if(!dashboardOrStartMenuAppearing) {
798 LocalBroadcastManager
800 .sendBroadcast(new Intent(TaskbarIntent.ACTION_TOGGLE_START_MENU));
802 LocalBroadcastManager
804 .sendBroadcast(new Intent(TaskbarIntent.ACTION_RESET_START_MENU));
806 if(shouldHideTaskbar && U.shouldCollapse(this, true)) {
807 LocalBroadcastManager
809 .sendBroadcast(new Intent(TaskbarIntent.ACTION_HIDE_TASKBAR));
814 SharedPreferences pref = U.getSharedPreferences(this);
817 if(showStartMenu || pref.getBoolean("disable_animations", false))
818 overridePendingTransition(0, 0);
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);
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);
833 shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(entry.getUserId(this)));
834 if(shortcuts != null)
835 return shortcuts.size();
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)
847 return shortcut.getShortLabel();
850 @SuppressWarnings("deprecation")
852 public void onBackPressed() {
854 secondaryMenu = false;
856 getPreferenceScreen().removeAll();
859 getListView().setOnItemLongClickListener(null);
861 if(U.hasBrokenSetLaunchBoundsApi())
864 if(contextMenuFix && !showStartMenu)
865 U.startFreeformHack(this);
867 super.onBackPressed();
868 if(FreeformHackHelper.getInstance().isInFreeformWorkspace())
869 overridePendingTransition(0, 0);
874 protected void onDestroy() {
877 LocalBroadcastManager.getInstance(this).unregisterReceiver(dashboardOrStartMenuAppearingReceiver);
878 LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);