OSDN Git Service

Taskbar 3.8.2 (release 3)
[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.app.ActivityManager;
22 import android.content.ActivityNotFoundException;
23 import android.content.BroadcastReceiver;
24 import android.content.ComponentName;
25 import android.content.Context;
26 import android.content.Intent;
27 import android.content.IntentFilter;
28 import android.content.SharedPreferences;
29 import android.content.pm.LauncherActivityInfo;
30 import android.content.pm.LauncherApps;
31 import android.content.pm.PackageManager;
32 import android.content.pm.ResolveInfo;
33 import android.content.pm.ShortcutInfo;
34 import android.media.AudioManager;
35 import android.net.Uri;
36 import android.os.Build;
37 import android.os.Bundle;
38 import android.os.Handler;
39 import android.os.UserManager;
40 import android.preference.Preference;
41 import android.preference.PreferenceActivity;
42 import android.provider.Settings;
43 import android.support.v4.content.LocalBroadcastManager;
44 import android.util.DisplayMetrics;
45 import android.view.Gravity;
46 import android.view.View;
47 import android.view.WindowManager;
48
49 import com.farmerbb.taskbar.BuildConfig;
50 import com.farmerbb.taskbar.MainActivity;
51 import com.farmerbb.taskbar.R;
52 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
53 import com.farmerbb.taskbar.util.AppEntry;
54 import com.farmerbb.taskbar.util.ApplicationType;
55 import com.farmerbb.taskbar.util.FreeformHackHelper;
56 import com.farmerbb.taskbar.util.IconCache;
57 import com.farmerbb.taskbar.util.MenuHelper;
58 import com.farmerbb.taskbar.util.PinnedBlockedApps;
59 import com.farmerbb.taskbar.util.SavedWindowSizes;
60 import com.farmerbb.taskbar.util.U;
61
62 import java.util.List;
63
64 public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener {
65
66     String packageName;
67     String componentName;
68     String appName;
69     long userId = 0;
70
71     boolean showStartMenu = false;
72     boolean shouldHideTaskbar = false;
73     boolean isStartButton = false;
74     boolean isOverflowMenu = false;
75     boolean secondaryMenu = false;
76     boolean dashboardOrStartMenuAppearing = false;
77     boolean contextMenuFix = false;
78     boolean isRunningApp = false;
79
80     List<ShortcutInfo> shortcuts;
81
82     private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
83         @Override
84         public void onReceive(Context context, Intent intent) {
85             dashboardOrStartMenuAppearing = true;
86             finish();
87         }
88     };
89
90     @SuppressLint("RtlHardcoded")
91     @SuppressWarnings("deprecation")
92     @Override
93     protected void onPostCreate(Bundle savedInstanceState) {
94         super.onPostCreate(savedInstanceState);
95
96         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_APPEARING"));
97         MenuHelper.getInstance().setContextMenuOpen(true);
98
99         boolean isNonAppMenu = !getIntent().hasExtra("package_name") && !getIntent().hasExtra("app_name");
100         showStartMenu = getIntent().getBooleanExtra("launched_from_start_menu", false);
101         isStartButton = isNonAppMenu && getIntent().getBooleanExtra("is_start_button", false);
102         isOverflowMenu = isNonAppMenu && getIntent().getBooleanExtra("is_overflow_menu", false);
103         contextMenuFix = getIntent().hasExtra("context_menu_fix");
104         isRunningApp = getIntent().getBooleanExtra("is_running_app", false);
105
106         // Determine where to position the dialog on screen
107         WindowManager.LayoutParams params = getWindow().getAttributes();
108         DisplayMetrics metrics = U.getRealDisplayMetrics(this);
109
110         int statusBarHeight = 0;
111         int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
112         if(resourceId > 0)
113             statusBarHeight = getResources().getDimensionPixelSize(resourceId);
114
115         if(showStartMenu) {
116             int x = getIntent().getIntExtra("x", 0);
117             int y = getIntent().getIntExtra("y", 0);
118             int offset = getResources().getDimensionPixelSize(isOverflowMenu ? R.dimen.context_menu_offset_overflow : R.dimen.context_menu_offset);
119
120             switch(U.getTaskbarPosition(this)) {
121                 case "bottom_left":
122                 case "bottom_vertical_left":
123                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
124                     params.x = x;
125                     params.y = metrics.heightPixels - y - offset;
126                     break;
127                 case "bottom_right":
128                 case "bottom_vertical_right":
129                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
130                     params.x = x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset + offset;
131                     params.y = metrics.heightPixels - y - offset;
132                     break;
133                 case "top_left":
134                 case "top_vertical_left":
135                     params.gravity = Gravity.TOP | Gravity.LEFT;
136                     params.x = x;
137                     params.y = y - offset + statusBarHeight;
138                     break;
139                 case "top_right":
140                 case "top_vertical_right":
141                     params.gravity = Gravity.TOP | Gravity.LEFT;
142                     params.x = x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset + offset;
143                     params.y = y - offset + statusBarHeight;
144                     break;
145             }
146         } else {
147             LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
148
149             int x = getIntent().getIntExtra("x", metrics.widthPixels);
150             int y = getIntent().getIntExtra("y", metrics.heightPixels);
151             int offset = getResources().getDimensionPixelSize(R.dimen.icon_size);
152
153             switch(U.getTaskbarPosition(this)) {
154                 case "bottom_left":
155                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
156                     params.x = isStartButton ? 0 : x;
157                     params.y = offset;
158                     break;
159                 case "bottom_vertical_left":
160                     params.gravity = Gravity.BOTTOM | Gravity.LEFT;
161                     params.x = offset;
162                     params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset);
163                     break;
164                 case "bottom_right":
165                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
166                     params.x = metrics.widthPixels - x;
167                     params.y = offset;
168                     break;
169                 case "bottom_vertical_right":
170                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
171                     params.x = offset;
172                     params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset);
173                     break;
174                 case "top_left":
175                     params.gravity = Gravity.TOP | Gravity.LEFT;
176                     params.x = isStartButton ? 0 : x;
177                     params.y = offset;
178                     break;
179                 case "top_vertical_left":
180                     params.gravity = Gravity.TOP | Gravity.LEFT;
181                     params.x = offset;
182                     params.y = isStartButton ? 0 : y - statusBarHeight;
183                     break;
184                 case "top_right":
185                     params.gravity = Gravity.TOP | Gravity.RIGHT;
186                     params.x = metrics.widthPixels - x;
187                     params.y = offset;
188                     break;
189                 case "top_vertical_right":
190                     params.gravity = Gravity.TOP | Gravity.RIGHT;
191                     params.x = offset;
192                     params.y = isStartButton ? 0 : y - statusBarHeight;
193                     break;
194             }
195
196             if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > metrics.widthPixels / 2))
197                 params.x = params.x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset;
198         }
199
200         params.width = getResources().getDimensionPixelSize(R.dimen.context_menu_width);
201         params.dimAmount = 0;
202
203         getWindow().setAttributes(params);
204
205         if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
206             getWindow().setElevation(0);
207
208         View view = findViewById(android.R.id.list);
209         if(view != null) view.setPadding(0, 0, 0, 0);
210
211         generateMenu();
212
213         IntentFilter intentFilter = new IntentFilter();
214         intentFilter.addAction("com.farmerbb.taskbar.START_MENU_APPEARING");
215         intentFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
216
217         LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, intentFilter);
218     }
219
220     @SuppressWarnings("deprecation")
221     private void generateMenu() {
222         if(isStartButton) {
223             addPreferencesFromResource(R.xml.pref_context_menu_open_settings);
224             findPreference("open_taskbar_settings").setOnPreferenceClickListener(this);
225             findPreference("start_menu_apps").setOnPreferenceClickListener(this);
226
227             if(U.launcherIsDefault(this) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) {
228                 addPreferencesFromResource(R.xml.pref_context_menu_change_wallpaper);
229                 findPreference("change_wallpaper").setOnPreferenceClickListener(this);
230             }
231
232             if(!getIntent().getBooleanExtra("dont_show_quit", false)) {
233                 addPreferencesFromResource(R.xml.pref_context_menu_quit);
234                 findPreference("quit_taskbar").setOnPreferenceClickListener(this);
235             }
236         } else if(isOverflowMenu) {
237             if(getResources().getConfiguration().screenWidthDp >= 600
238                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
239                 setTitle(R.string.tools);
240             else {
241                 addPreferencesFromResource(R.xml.pref_context_menu_header);
242                 findPreference("header").setTitle(R.string.tools);
243             }
244
245             addPreferencesFromResource(R.xml.pref_context_menu_overflow);
246             findPreference("volume").setOnPreferenceClickListener(this);
247             findPreference("system_settings").setOnPreferenceClickListener(this);
248             findPreference("lock_device").setOnPreferenceClickListener(this);
249             findPreference("power_menu").setOnPreferenceClickListener(this);
250
251             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
252                 findPreference("file_manager").setOnPreferenceClickListener(this);
253             else
254                 getPreferenceScreen().removePreference(findPreference("file_manager"));
255         } else {
256             appName = getIntent().getStringExtra("app_name");
257             packageName = getIntent().getStringExtra("package_name");
258             componentName = getIntent().getStringExtra("component_name");
259             userId = getIntent().getLongExtra("user_id", 0);
260
261             if(getResources().getConfiguration().screenWidthDp >= 600
262                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
263                 setTitle(appName);
264             else {
265                 addPreferencesFromResource(R.xml.pref_context_menu_header);
266                 findPreference("header").setTitle(appName);
267             }
268
269             SharedPreferences pref = U.getSharedPreferences(this);
270             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
271                     && pref.getBoolean("freeform_hack", false)
272                     && !U.isGame(this, packageName)) {
273                 addPreferencesFromResource(R.xml.pref_context_menu_show_window_sizes);
274                 findPreference("show_window_sizes").setOnPreferenceClickListener(this);
275             }
276
277             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
278                 int shortcutCount = getLauncherShortcuts();
279
280                 if(shortcutCount > 1) {
281                     addPreferencesFromResource(R.xml.pref_context_menu_shortcuts);
282                     findPreference("app_shortcuts").setOnPreferenceClickListener(this);
283                 } else if(shortcutCount == 1)
284                     generateShortcuts();
285             }
286
287             final PackageManager pm = getPackageManager();
288             Intent homeIntent = new Intent(Intent.ACTION_MAIN);
289             homeIntent.addCategory(Intent.CATEGORY_HOME);
290             ResolveInfo defaultLauncher = pm.resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
291
292             if(!packageName.contains(BuildConfig.BASE_APPLICATION_ID)
293                     && !packageName.equals(defaultLauncher.activityInfo.packageName)) {
294                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
295
296                 if(pba.isPinned(componentName)) {
297                     addPreferencesFromResource(R.xml.pref_context_menu_pin);
298                     findPreference("pin_app").setOnPreferenceClickListener(this);
299                     findPreference("pin_app").setTitle(R.string.unpin_app);
300                 } else if(pba.isBlocked(componentName)) {
301                     addPreferencesFromResource(R.xml.pref_context_menu_block);
302                     findPreference("block_app").setOnPreferenceClickListener(this);
303                     findPreference("block_app").setTitle(R.string.unblock_app);
304                 } else {
305                     final int MAX_NUM_OF_COLUMNS = U.getMaxNumOfEntries(this);
306
307                     if(pba.getPinnedApps().size() < MAX_NUM_OF_COLUMNS) {
308                         addPreferencesFromResource(R.xml.pref_context_menu_pin);
309                         findPreference("pin_app").setOnPreferenceClickListener(this);
310                         findPreference("pin_app").setTitle(R.string.pin_app);
311                     }
312
313                     addPreferencesFromResource(R.xml.pref_context_menu_block);
314                     findPreference("block_app").setOnPreferenceClickListener(this);
315                     findPreference("block_app").setTitle(R.string.block_app);
316                 }
317             }
318
319             addPreferencesFromResource(R.xml.pref_context_menu);
320
321             findPreference("app_info").setOnPreferenceClickListener(this);
322
323             if(isRunningApp) {
324                 findPreference("close").setOnPreferenceClickListener(this);
325                 getPreferenceScreen().removePreference(findPreference("uninstall"));
326             } else {
327                 findPreference("uninstall").setOnPreferenceClickListener(this);
328                 getPreferenceScreen().removePreference(findPreference("close"));
329             }
330         }
331     }
332
333     @SuppressWarnings("deprecation")
334     private void generateShortcuts() {
335         addPreferencesFromResource(R.xml.pref_context_menu_shortcut_list);
336         switch(shortcuts.size()) {
337             case 5:
338                 findPreference("shortcut_5").setTitle(getShortcutTitle(shortcuts.get(4)));
339                 findPreference("shortcut_5").setOnPreferenceClickListener(this);
340             case 4:
341                 findPreference("shortcut_4").setTitle(getShortcutTitle(shortcuts.get(3)));
342                 findPreference("shortcut_4").setOnPreferenceClickListener(this);
343             case 3:
344                 findPreference("shortcut_3").setTitle(getShortcutTitle(shortcuts.get(2)));
345                 findPreference("shortcut_3").setOnPreferenceClickListener(this);
346             case 2:
347                 findPreference("shortcut_2").setTitle(getShortcutTitle(shortcuts.get(1)));
348                 findPreference("shortcut_2").setOnPreferenceClickListener(this);
349             case 1:
350                 findPreference("shortcut_1").setTitle(getShortcutTitle(shortcuts.get(0)));
351                 findPreference("shortcut_1").setOnPreferenceClickListener(this);
352                 break;
353         }
354
355         switch(shortcuts.size()) {
356             case 1:
357                 getPreferenceScreen().removePreference(findPreference("shortcut_2"));
358             case 2:
359                 getPreferenceScreen().removePreference(findPreference("shortcut_3"));
360             case 3:
361                 getPreferenceScreen().removePreference(findPreference("shortcut_4"));
362             case 4:
363                 getPreferenceScreen().removePreference(findPreference("shortcut_5"));
364                 break;
365         }
366     }
367
368     @SuppressWarnings("deprecation")
369     private void generateWindowSizes() {
370         getPreferenceScreen().removeAll();
371
372         addPreferencesFromResource(R.xml.pref_context_menu_window_size_list);
373         findPreference("window_size_standard").setOnPreferenceClickListener(this);
374         findPreference("window_size_large").setOnPreferenceClickListener(this);
375         findPreference("window_size_fullscreen").setOnPreferenceClickListener(this);
376         findPreference("window_size_half_left").setOnPreferenceClickListener(this);
377         findPreference("window_size_half_right").setOnPreferenceClickListener(this);
378         findPreference("window_size_phone_size").setOnPreferenceClickListener(this);
379
380         String windowSizePref = SavedWindowSizes.getInstance(this).getWindowSize(this, packageName);
381         CharSequence title = findPreference("window_size_" + windowSizePref).getTitle();
382         findPreference("window_size_" + windowSizePref).setTitle('\u2713' + " " + title);
383     }
384
385     @SuppressWarnings("deprecation")
386     @TargetApi(Build.VERSION_CODES.N_MR1)
387     @Override
388     public boolean onPreferenceClick(Preference p) {
389         UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
390         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
391         boolean appIsValid = isStartButton || isOverflowMenu ||
392                 !launcherApps.getActivityList(getIntent().getStringExtra("package_name"),
393                         userManager.getUserForSerialNumber(userId)).isEmpty();
394
395         if(appIsValid) switch(p.getKey()) {
396             case "app_info":
397                 U.launchApp(this, () ->
398                         launcherApps.startAppDetailsActivity(
399                                 ComponentName.unflattenFromString(componentName),
400                                 userManager.getUserForSerialNumber(userId),
401                                 null,
402                                 U.getActivityOptionsBundle(ApplicationType.APPLICATION)));
403
404                 showStartMenu = false;
405                 shouldHideTaskbar = true;
406                 contextMenuFix = false;
407                 break;
408             case "uninstall":
409                 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && isInMultiWindowMode() && !U.isChromeOs(this)) {
410                     Intent intent2 = new Intent(ContextMenuActivity.this, DummyActivity.class);
411                     intent2.putExtra("uninstall", packageName);
412                     intent2.putExtra("user_id", userId);
413
414                     startActivity(intent2);
415                 } else {
416                     Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + packageName));
417                     intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(userId));
418
419                     new Handler().post(() -> {
420                         try {
421                             startActivity(intent2);
422                         } catch (ActivityNotFoundException e) { /* Gracefully fail */ }
423                     });
424                 }
425
426                 showStartMenu = false;
427                 shouldHideTaskbar = true;
428                 contextMenuFix = false;
429                 break;
430             case "open_taskbar_settings":
431                 U.launchApp(this, () -> {
432                     Intent intent2 = new Intent(this, MainActivity.class);
433                     intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
434                     startActivity(intent2, U.getActivityOptionsBundle(ApplicationType.APPLICATION));
435                 });
436
437                 showStartMenu = false;
438                 shouldHideTaskbar = true;
439                 contextMenuFix = false;
440                 break;
441             case "quit_taskbar":
442                 Intent quitIntent = new Intent("com.farmerbb.taskbar.QUIT");
443                 quitIntent.setPackage(BuildConfig.APPLICATION_ID);
444                 sendBroadcast(quitIntent);
445
446                 showStartMenu = false;
447                 shouldHideTaskbar = true;
448                 contextMenuFix = false;
449                 break;
450             case "pin_app":
451                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
452                 if(pba.isPinned(componentName))
453                     pba.removePinnedApp(this, componentName);
454                 else {
455                     Intent intent = new Intent();
456                     intent.setComponent(ComponentName.unflattenFromString(componentName));
457
458                     LauncherActivityInfo appInfo = launcherApps.resolveActivity(intent, userManager.getUserForSerialNumber(userId));
459                     if(appInfo != null) {
460                         AppEntry newEntry = new AppEntry(
461                                 packageName,
462                                 componentName,
463                                 appName,
464                                 IconCache.getInstance(this).getIcon(this, getPackageManager(), appInfo),
465                                 true);
466
467                         newEntry.setUserId(userId);
468                         pba.addPinnedApp(this, newEntry);
469                     }
470                 }
471                 break;
472             case "block_app":
473                 PinnedBlockedApps pba2 = PinnedBlockedApps.getInstance(this);
474                 if(pba2.isBlocked(componentName))
475                     pba2.removeBlockedApp(this, componentName);
476                 else {
477                     pba2.addBlockedApp(this, new AppEntry(
478                             packageName,
479                             componentName,
480                             appName,
481                             null,
482                             false));
483                 }
484                 break;
485             case "show_window_sizes":
486                 generateWindowSizes();
487
488                 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
489                     U.showToastLong(this, R.string.window_sizes_not_available);
490                 }
491
492                 getListView().setOnItemLongClickListener((parent, view, position, id) -> {
493                     String[] windowSizes = { "standard", "large", "fullscreen", "half_left", "half_right", "phone_size" };
494
495                     SavedWindowSizes.getInstance(ContextMenuActivity.this).setWindowSize(ContextMenuActivity.this, packageName, windowSizes[position]);
496
497                     generateWindowSizes();
498                     return true;
499                 });
500
501                 secondaryMenu = true;
502                 break;
503             case "window_size_standard":
504             case "window_size_large":
505             case "window_size_fullscreen":
506             case "window_size_half_left":
507             case "window_size_half_right":
508             case "window_size_phone_size":
509                 String windowSize = p.getKey().replace("window_size_", "");
510
511                 SharedPreferences pref2 = U.getSharedPreferences(this);
512                 if(pref2.getBoolean("save_window_sizes", true)) {
513                     SavedWindowSizes.getInstance(this).setWindowSize(this, packageName, windowSize);
514                 }
515
516                 U.launchApp(getApplicationContext(), packageName, componentName, userId, windowSize, false, true);
517
518                 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
519                     U.cancelToast();
520
521                 showStartMenu = false;
522                 shouldHideTaskbar = true;
523                 contextMenuFix = false;
524                 break;
525             case "app_shortcuts":
526                 getPreferenceScreen().removeAll();
527                 generateShortcuts();
528
529                 secondaryMenu = true;
530                 break;
531             case "shortcut_1":
532             case "shortcut_2":
533             case "shortcut_3":
534             case "shortcut_4":
535             case "shortcut_5":
536                 U.startShortcut(getApplicationContext(), packageName, componentName, shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1));
537
538                 showStartMenu = false;
539                 shouldHideTaskbar = true;
540                 contextMenuFix = false;
541                 break;
542             case "start_menu_apps":
543                 Intent intent = null;
544
545                 SharedPreferences pref3 = U.getSharedPreferences(this);
546                 switch(pref3.getString("theme", "light")) {
547                     case "light":
548                         intent = new Intent(this, SelectAppActivity.class);
549                         break;
550                     case "dark":
551                         intent = new Intent(this, SelectAppActivityDark.class);
552                         break;
553                 }
554
555                 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
556                         && pref3.getBoolean("freeform_hack", false)
557                         && intent != null && isInMultiWindowMode()) {
558                     intent.putExtra("no_shadow", true);
559                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
560
561                     U.launchAppMaximized(getApplicationContext(), intent);
562                 } else
563                     startActivity(intent);
564
565                 showStartMenu = false;
566                 shouldHideTaskbar = true;
567                 contextMenuFix = false;
568                 break;
569             case "volume":
570                 AudioManager audio = (AudioManager) getSystemService(AUDIO_SERVICE);
571                 audio.adjustSuggestedStreamVolume(AudioManager.ADJUST_SAME, AudioManager.USE_DEFAULT_STREAM_TYPE, AudioManager.FLAG_SHOW_UI);
572
573                 showStartMenu = false;
574                 shouldHideTaskbar = true;
575                 contextMenuFix = false;
576                 break;
577             case "file_manager":
578                 U.launchApp(this, () -> {
579                     Intent fileManagerIntent;
580
581                     if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
582                         fileManagerIntent = new Intent(Intent.ACTION_VIEW);
583                     else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
584                         fileManagerIntent = new Intent("android.provider.action.BROWSE");
585                     else {
586                         fileManagerIntent = new Intent("android.provider.action.BROWSE_DOCUMENT_ROOT");
587                         fileManagerIntent.setComponent(ComponentName.unflattenFromString("com.android.documentsui/.DocumentsActivity"));
588                     }
589
590                     fileManagerIntent.addCategory(Intent.CATEGORY_DEFAULT);
591                     fileManagerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
592                     fileManagerIntent.setData(Uri.parse("content://com.android.externalstorage.documents/root/primary"));
593
594                     try {
595                         startActivity(fileManagerIntent, U.getActivityOptionsBundle(ApplicationType.APPLICATION));
596                     } catch (ActivityNotFoundException e) {
597                         U.showToast(this, R.string.lock_device_not_supported);
598                     }
599                 });
600
601                 showStartMenu = false;
602                 shouldHideTaskbar = true;
603                 contextMenuFix = false;
604                 break;
605             case "system_settings":
606                 U.launchApp(this, () -> {
607                     Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
608                     settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
609
610                     try {
611                         startActivity(settingsIntent, U.getActivityOptionsBundle(ApplicationType.APPLICATION));
612                     } catch (ActivityNotFoundException e) {
613                         U.showToast(this, R.string.lock_device_not_supported);
614                     }
615                 });
616
617                 showStartMenu = false;
618                 shouldHideTaskbar = true;
619                 contextMenuFix = false;
620                 break;
621             case "lock_device":
622                 U.lockDevice(this);
623
624                 showStartMenu = false;
625                 shouldHideTaskbar = true;
626                 contextMenuFix = false;
627                 break;
628             case "power_menu":
629                 U.sendAccessibilityAction(this, AccessibilityService.GLOBAL_ACTION_POWER_DIALOG);
630
631                 showStartMenu = false;
632                 shouldHideTaskbar = true;
633                 contextMenuFix = false;
634                 break;
635             case "change_wallpaper":
636                 Intent intent3 = Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.set_wallpaper));
637                 intent3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
638                 U.launchAppMaximized(getApplicationContext(), intent3);
639
640                 showStartMenu = false;
641                 shouldHideTaskbar = true;
642                 contextMenuFix = false;
643                 break;
644             case "close":
645                 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
646                 am.killBackgroundProcesses(packageName);
647
648                 showStartMenu = false;
649                 shouldHideTaskbar = true;
650                 contextMenuFix = false;
651                 break;
652         }
653
654         if(!secondaryMenu) finish();
655         return true;
656     }
657
658     @Override
659     protected void onPause() {
660         super.onPause();
661         if(!isFinishing()) finish();
662     }
663
664     @Override
665     public void finish() {
666         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_DISAPPEARING"));
667         MenuHelper.getInstance().setContextMenuOpen(false);
668
669         if(!dashboardOrStartMenuAppearing) {
670             if(showStartMenu)
671                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TOGGLE_START_MENU"));
672             else {
673                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.RESET_START_MENU"));
674
675                 if(shouldHideTaskbar && U.shouldCollapse(this, true))
676                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
677             }
678         }
679
680         super.finish();
681         if(showStartMenu)
682             overridePendingTransition(0, 0);
683     }
684
685     @TargetApi(Build.VERSION_CODES.N_MR1)
686     private int getLauncherShortcuts() {
687         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
688         if(launcherApps.hasShortcutHostPermission()) {
689             UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
690
691             LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
692             query.setActivity(ComponentName.unflattenFromString(componentName));
693             query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC
694                     | LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST
695                     | LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED);
696
697             shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(userId));
698             if(shortcuts != null)
699                 return shortcuts.size();
700         }
701
702         return 0;
703     }
704
705     @TargetApi(Build.VERSION_CODES.N_MR1)
706     private CharSequence getShortcutTitle(ShortcutInfo shortcut) {
707         CharSequence longLabel = shortcut.getLongLabel();
708         if(longLabel != null && longLabel.length() > 0 && longLabel.length() <= 20)
709             return longLabel;
710         else
711             return shortcut.getShortLabel();
712     }
713
714     @SuppressWarnings("deprecation")
715     @Override
716     public void onBackPressed() {
717         if(secondaryMenu) {
718             secondaryMenu = false;
719
720             getPreferenceScreen().removeAll();
721             generateMenu();
722
723             getListView().setOnItemLongClickListener(null);
724
725             if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
726                 U.cancelToast();
727         } else {
728             if(contextMenuFix && !showStartMenu)
729                 U.startFreeformHack(this, false, false);
730
731             super.onBackPressed();
732             if(FreeformHackHelper.getInstance().isInFreeformWorkspace())
733                 overridePendingTransition(0, 0);
734         }
735     }
736
737     @Override
738     protected void onDestroy() {
739         super.onDestroy();
740
741         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
742     }
743 }