OSDN Git Service

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