OSDN Git Service

Dirty hack to work around context menu positioning issues on Chrome OS
[android-x86/packages-apps-Taskbar.git] / app / src / main / java / com / farmerbb / taskbar / activity / ContextMenuActivity.java
1 /* Copyright 2016 Braden Farmer
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 package com.farmerbb.taskbar.activity;
17
18 import android.accessibilityservice.AccessibilityService;
19 import android.annotation.SuppressLint;
20 import android.annotation.TargetApi;
21 import android.content.ActivityNotFoundException;
22 import android.content.BroadcastReceiver;
23 import android.content.ComponentName;
24 import android.content.Context;
25 import android.content.Intent;
26 import android.content.IntentFilter;
27 import android.content.SharedPreferences;
28 import android.content.pm.LauncherActivityInfo;
29 import android.content.pm.LauncherApps;
30 import android.content.pm.PackageManager;
31 import android.content.pm.ResolveInfo;
32 import android.content.pm.ShortcutInfo;
33 import android.media.AudioManager;
34 import android.net.Uri;
35 import android.os.Build;
36 import android.os.Bundle;
37 import android.os.UserManager;
38 import android.preference.Preference;
39 import android.preference.PreferenceActivity;
40 import android.provider.Settings;
41 import android.support.v4.content.LocalBroadcastManager;
42 import android.view.Gravity;
43 import android.view.View;
44 import android.view.WindowManager;
45
46 import com.farmerbb.taskbar.BuildConfig;
47 import com.farmerbb.taskbar.R;
48 import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark;
49 import com.farmerbb.taskbar.util.AppEntry;
50 import com.farmerbb.taskbar.util.ApplicationType;
51 import com.farmerbb.taskbar.util.DisplayInfo;
52 import com.farmerbb.taskbar.util.FreeformHackHelper;
53 import com.farmerbb.taskbar.util.IconCache;
54 import com.farmerbb.taskbar.util.LauncherHelper;
55 import com.farmerbb.taskbar.util.MenuHelper;
56 import com.farmerbb.taskbar.util.PinnedBlockedApps;
57 import com.farmerbb.taskbar.util.SavedWindowSizes;
58 import com.farmerbb.taskbar.util.U;
59
60 import java.util.List;
61
62 public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener {
63
64     private Bundle args;
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
79     List<ShortcutInfo> shortcuts;
80
81     private BroadcastReceiver finishReceiver = new BroadcastReceiver() {
82         @Override
83         public void onReceive(Context context, Intent intent) {
84             dashboardOrStartMenuAppearing = true;
85             finish();
86         }
87     };
88
89     @SuppressLint("RtlHardcoded")
90     @SuppressWarnings("deprecation")
91     @Override
92     protected void onPostCreate(Bundle savedInstanceState) {
93         super.onPostCreate(savedInstanceState);
94
95         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_APPEARING"));
96         MenuHelper.getInstance().setContextMenuOpen(true);
97
98         args = getIntent().getBundleExtra("args");
99         
100         boolean isNonAppMenu = !args.containsKey("package_name") && !args.containsKey("app_name");
101         showStartMenu = args.getBoolean("launched_from_start_menu", false);
102         isStartButton = isNonAppMenu && args.getBoolean("is_start_button", false);
103         isOverflowMenu = isNonAppMenu && args.getBoolean("is_overflow_menu", false);
104         contextMenuFix = args.containsKey("context_menu_fix");
105
106         // Determine where to position the dialog on screen
107         WindowManager.LayoutParams params = getWindow().getAttributes();
108         DisplayInfo display = U.getDisplayInfo(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 = args.getInt("x", 0);
117             int y = args.getInt("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 = display.height - 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 = display.height - 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 = args.getInt("x", display.width);
150             int y = args.getInt("y", display.height);
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 = display.height - y - (isStartButton ? 0 : offset);
163                     break;
164                 case "bottom_right":
165                     params.gravity = Gravity.BOTTOM | Gravity.RIGHT;
166                     params.x = display.width - 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 = display.height - 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 = display.width - 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 > display.width / 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         if(U.isChromeOs(this) && U.getTaskbarPosition(this).contains("bottom")) {
204             SharedPreferences pref = U.getSharedPreferences(this);
205
206             if(pref.getBoolean("chrome_os_context_menu_fix", true)
207                     && !pref.getBoolean("has_caption", false))
208                 params.y = params.y - getResources().getDimensionPixelSize(R.dimen.caption_offset);
209         }
210
211         getWindow().setAttributes(params);
212
213         if(U.isChromeOs(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1)
214             getWindow().setElevation(0);
215
216         View view = findViewById(android.R.id.list);
217         if(view != null) view.setPadding(0, 0, 0, 0);
218
219         generateMenu();
220
221         IntentFilter intentFilter = new IntentFilter();
222         intentFilter.addAction("com.farmerbb.taskbar.START_MENU_APPEARING");
223         intentFilter.addAction("com.farmerbb.taskbar.DASHBOARD_APPEARING");
224
225         LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, intentFilter);
226     }
227
228     @SuppressWarnings("deprecation")
229     private void generateMenu() {
230         if(isStartButton) {
231             addPreferencesFromResource(R.xml.pref_context_menu_open_settings);
232             findPreference("open_taskbar_settings").setOnPreferenceClickListener(this);
233             findPreference("start_menu_apps").setOnPreferenceClickListener(this);
234
235             if((U.launcherIsDefault(this)
236                     && FreeformHackHelper.getInstance().isInFreeformWorkspace())
237                     || (U.isOverridingFreeformHack(this)
238                     && LauncherHelper.getInstance().isOnHomeScreen())) {
239                 addPreferencesFromResource(R.xml.pref_context_menu_change_wallpaper);
240                 findPreference("change_wallpaper").setOnPreferenceClickListener(this);
241             }
242
243             if(!args.getBoolean("dont_show_quit", false)) {
244                 addPreferencesFromResource(R.xml.pref_context_menu_quit);
245                 findPreference("quit_taskbar").setOnPreferenceClickListener(this);
246             }
247         } else if(isOverflowMenu) {
248             if(getResources().getConfiguration().screenWidthDp >= 600
249                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
250                 setTitle(R.string.tools);
251             else {
252                 addPreferencesFromResource(R.xml.pref_context_menu_header);
253                 findPreference("header").setTitle(R.string.tools);
254             }
255
256             addPreferencesFromResource(R.xml.pref_context_menu_overflow);
257             findPreference("volume").setOnPreferenceClickListener(this);
258             findPreference("system_settings").setOnPreferenceClickListener(this);
259             findPreference("lock_device").setOnPreferenceClickListener(this);
260             findPreference("power_menu").setOnPreferenceClickListener(this);
261
262             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
263                 findPreference("file_manager").setOnPreferenceClickListener(this);
264             else
265                 getPreferenceScreen().removePreference(findPreference("file_manager"));
266         } else {
267             appName = args.getString("app_name");
268             packageName = args.getString("package_name");
269             componentName = args.getString("component_name");
270             userId = args.getLong("user_id", 0);
271
272             if(getResources().getConfiguration().screenWidthDp >= 600
273                     && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M)
274                 setTitle(appName);
275             else {
276                 addPreferencesFromResource(R.xml.pref_context_menu_header);
277                 findPreference("header").setTitle(appName);
278             }
279
280             SharedPreferences pref = U.getSharedPreferences(this);
281             if(U.hasFreeformSupport(this)
282                     && pref.getBoolean("freeform_hack", false)
283                     && !U.isGame(this, packageName)) {
284                 addPreferencesFromResource(R.xml.pref_context_menu_show_window_sizes);
285                 findPreference("show_window_sizes").setOnPreferenceClickListener(this);
286             }
287
288             if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
289                 int shortcutCount = getLauncherShortcuts();
290
291                 if(shortcutCount > 1) {
292                     addPreferencesFromResource(R.xml.pref_context_menu_shortcuts);
293                     findPreference("app_shortcuts").setOnPreferenceClickListener(this);
294                 } else if(shortcutCount == 1)
295                     generateShortcuts();
296             }
297
298             final PackageManager pm = getPackageManager();
299             Intent homeIntent = new Intent(Intent.ACTION_MAIN);
300             homeIntent.addCategory(Intent.CATEGORY_HOME);
301             ResolveInfo defaultLauncher = pm.resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
302
303             if(!packageName.contains(BuildConfig.BASE_APPLICATION_ID)
304                     && !packageName.equals(defaultLauncher.activityInfo.packageName)) {
305                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
306
307                 if(pba.isPinned(componentName)) {
308                     addPreferencesFromResource(R.xml.pref_context_menu_pin);
309                     findPreference("pin_app").setOnPreferenceClickListener(this);
310                     findPreference("pin_app").setTitle(R.string.unpin_app);
311                 } else if(pba.isBlocked(componentName)) {
312                     addPreferencesFromResource(R.xml.pref_context_menu_block);
313                     findPreference("block_app").setOnPreferenceClickListener(this);
314                     findPreference("block_app").setTitle(R.string.unblock_app);
315                 } else {
316                     final int MAX_NUM_OF_COLUMNS = U.getMaxNumOfEntries(this);
317
318                     if(pba.getPinnedApps().size() < MAX_NUM_OF_COLUMNS) {
319                         addPreferencesFromResource(R.xml.pref_context_menu_pin);
320                         findPreference("pin_app").setOnPreferenceClickListener(this);
321                         findPreference("pin_app").setTitle(R.string.pin_app);
322                     }
323
324                     addPreferencesFromResource(R.xml.pref_context_menu_block);
325                     findPreference("block_app").setOnPreferenceClickListener(this);
326                     findPreference("block_app").setTitle(R.string.block_app);
327                 }
328             }
329
330             addPreferencesFromResource(R.xml.pref_context_menu);
331
332             findPreference("app_info").setOnPreferenceClickListener(this);
333             findPreference("uninstall").setOnPreferenceClickListener(this);
334         }
335     }
336
337     @SuppressWarnings("deprecation")
338     private void generateShortcuts() {
339         addPreferencesFromResource(R.xml.pref_context_menu_shortcut_list);
340         switch(shortcuts.size()) {
341             case 5:
342                 findPreference("shortcut_5").setTitle(getShortcutTitle(shortcuts.get(4)));
343                 findPreference("shortcut_5").setOnPreferenceClickListener(this);
344             case 4:
345                 findPreference("shortcut_4").setTitle(getShortcutTitle(shortcuts.get(3)));
346                 findPreference("shortcut_4").setOnPreferenceClickListener(this);
347             case 3:
348                 findPreference("shortcut_3").setTitle(getShortcutTitle(shortcuts.get(2)));
349                 findPreference("shortcut_3").setOnPreferenceClickListener(this);
350             case 2:
351                 findPreference("shortcut_2").setTitle(getShortcutTitle(shortcuts.get(1)));
352                 findPreference("shortcut_2").setOnPreferenceClickListener(this);
353             case 1:
354                 findPreference("shortcut_1").setTitle(getShortcutTitle(shortcuts.get(0)));
355                 findPreference("shortcut_1").setOnPreferenceClickListener(this);
356                 break;
357         }
358
359         switch(shortcuts.size()) {
360             case 1:
361                 getPreferenceScreen().removePreference(findPreference("shortcut_2"));
362             case 2:
363                 getPreferenceScreen().removePreference(findPreference("shortcut_3"));
364             case 3:
365                 getPreferenceScreen().removePreference(findPreference("shortcut_4"));
366             case 4:
367                 getPreferenceScreen().removePreference(findPreference("shortcut_5"));
368                 break;
369         }
370     }
371
372     @SuppressWarnings("deprecation")
373     private void generateWindowSizes() {
374         getPreferenceScreen().removeAll();
375
376         addPreferencesFromResource(R.xml.pref_context_menu_window_size_list);
377         findPreference("window_size_standard").setOnPreferenceClickListener(this);
378         findPreference("window_size_large").setOnPreferenceClickListener(this);
379         findPreference("window_size_fullscreen").setOnPreferenceClickListener(this);
380         findPreference("window_size_half_left").setOnPreferenceClickListener(this);
381         findPreference("window_size_half_right").setOnPreferenceClickListener(this);
382         findPreference("window_size_phone_size").setOnPreferenceClickListener(this);
383
384         String windowSizePref = SavedWindowSizes.getInstance(this).getWindowSize(this, packageName);
385         CharSequence title = findPreference("window_size_" + windowSizePref).getTitle();
386         findPreference("window_size_" + windowSizePref).setTitle('\u2713' + " " + title);
387     }
388
389     @SuppressWarnings("deprecation")
390     @TargetApi(Build.VERSION_CODES.N_MR1)
391     @Override
392     public boolean onPreferenceClick(Preference p) {
393         UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
394         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
395         boolean appIsValid = isStartButton || isOverflowMenu ||
396                 !launcherApps.getActivityList(args.getString("package_name"),
397                         userManager.getUserForSerialNumber(userId)).isEmpty();
398
399         if(appIsValid) switch(p.getKey()) {
400             case "app_info":
401                 U.launchApp(this, () ->
402                         launcherApps.startAppDetailsActivity(
403                                 ComponentName.unflattenFromString(componentName),
404                                 userManager.getUserForSerialNumber(userId),
405                                 null,
406                                 U.getActivityOptionsBundle(this, ApplicationType.APPLICATION)));
407
408                 showStartMenu = false;
409                 shouldHideTaskbar = true;
410                 contextMenuFix = false;
411                 break;
412             case "uninstall":
413                 if(U.hasFreeformSupport(this) && isInMultiWindowMode() && !U.isChromeOs(this)) {
414                     Intent intent2 = new Intent(this, DummyActivity.class);
415                     intent2.putExtra("uninstall", packageName);
416                     intent2.putExtra("user_id", userId);
417
418                     try {
419                         startActivity(intent2);
420                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
421                 } else {
422                     Intent intent2 = new Intent(Intent.ACTION_DELETE, Uri.parse("package:" + packageName));
423                     intent2.putExtra(Intent.EXTRA_USER, userManager.getUserForSerialNumber(userId));
424
425                     try {
426                         startActivity(intent2);
427                     } catch (ActivityNotFoundException | IllegalArgumentException e) { /* Gracefully fail */ }
428                 }
429
430                 showStartMenu = false;
431                 shouldHideTaskbar = true;
432                 contextMenuFix = false;
433                 break;
434             case "open_taskbar_settings":
435                 U.launchApp(this, () -> {
436                     Intent intent2 = new Intent(this, MainActivity.class);
437                     intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
438
439                     try {
440                         startActivity(intent2, U.getActivityOptionsBundle(this, ApplicationType.APPLICATION));
441                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
442                 });
443
444                 showStartMenu = false;
445                 shouldHideTaskbar = true;
446                 contextMenuFix = false;
447                 break;
448             case "quit_taskbar":
449                 Intent quitIntent = new Intent("com.farmerbb.taskbar.QUIT");
450                 quitIntent.setPackage(BuildConfig.APPLICATION_ID);
451                 sendBroadcast(quitIntent);
452
453                 showStartMenu = false;
454                 shouldHideTaskbar = true;
455                 contextMenuFix = false;
456                 break;
457             case "pin_app":
458                 PinnedBlockedApps pba = PinnedBlockedApps.getInstance(this);
459                 if(pba.isPinned(componentName))
460                     pba.removePinnedApp(this, componentName);
461                 else {
462                     Intent intent = new Intent();
463                     intent.setComponent(ComponentName.unflattenFromString(componentName));
464
465                     LauncherActivityInfo appInfo = launcherApps.resolveActivity(intent, userManager.getUserForSerialNumber(userId));
466                     if(appInfo != null) {
467                         AppEntry newEntry = new AppEntry(
468                                 packageName,
469                                 componentName,
470                                 appName,
471                                 IconCache.getInstance(this).getIcon(this, getPackageManager(), appInfo),
472                                 true);
473
474                         newEntry.setUserId(userId);
475                         pba.addPinnedApp(this, newEntry);
476                     }
477                 }
478                 break;
479             case "block_app":
480                 PinnedBlockedApps pba2 = PinnedBlockedApps.getInstance(this);
481                 if(pba2.isBlocked(componentName))
482                     pba2.removeBlockedApp(this, componentName);
483                 else {
484                     pba2.addBlockedApp(this, new AppEntry(
485                             packageName,
486                             componentName,
487                             appName,
488                             null,
489                             false));
490                 }
491                 break;
492             case "show_window_sizes":
493                 generateWindowSizes();
494
495                 if(U.hasBrokenSetLaunchBoundsApi())
496                     U.showToastLong(this, R.string.window_sizes_not_available);
497
498                 getListView().setOnItemLongClickListener((parent, view, position, id) -> {
499                     String[] windowSizes = { "standard", "large", "fullscreen", "half_left", "half_right", "phone_size" };
500
501                     SavedWindowSizes.getInstance(this).setWindowSize(this, packageName, windowSizes[position]);
502
503                     generateWindowSizes();
504                     return true;
505                 });
506
507                 secondaryMenu = true;
508                 break;
509             case "window_size_standard":
510             case "window_size_large":
511             case "window_size_fullscreen":
512             case "window_size_half_left":
513             case "window_size_half_right":
514             case "window_size_phone_size":
515                 String windowSize = p.getKey().replace("window_size_", "");
516
517                 SharedPreferences pref2 = U.getSharedPreferences(this);
518                 if(pref2.getBoolean("save_window_sizes", true)) {
519                     SavedWindowSizes.getInstance(this).setWindowSize(this, packageName, windowSize);
520                 }
521
522                 U.launchApp(getApplicationContext(), packageName, componentName, userId, windowSize, false, true);
523
524                 if(U.hasBrokenSetLaunchBoundsApi())
525                     U.cancelToast();
526
527                 showStartMenu = false;
528                 shouldHideTaskbar = true;
529                 contextMenuFix = false;
530                 break;
531             case "app_shortcuts":
532                 getPreferenceScreen().removeAll();
533                 generateShortcuts();
534
535                 secondaryMenu = true;
536                 break;
537             case "shortcut_1":
538             case "shortcut_2":
539             case "shortcut_3":
540             case "shortcut_4":
541             case "shortcut_5":
542                 U.startShortcut(getApplicationContext(), packageName, componentName, shortcuts.get(Integer.parseInt(p.getKey().replace("shortcut_", "")) - 1));
543
544                 showStartMenu = false;
545                 shouldHideTaskbar = true;
546                 contextMenuFix = false;
547                 break;
548             case "start_menu_apps":
549                 Intent intent = null;
550
551                 SharedPreferences pref3 = U.getSharedPreferences(this);
552                 switch(pref3.getString("theme", "light")) {
553                     case "light":
554                         intent = new Intent(this, SelectAppActivity.class);
555                         break;
556                     case "dark":
557                         intent = new Intent(this, SelectAppActivityDark.class);
558                         break;
559                 }
560
561                 if(U.hasFreeformSupport(this)
562                         && pref3.getBoolean("freeform_hack", false)
563                         && intent != null && isInMultiWindowMode()) {
564                     intent.putExtra("no_shadow", true);
565                     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT);
566
567                     U.startActivityMaximized(getApplicationContext(), intent);
568                 } else {
569                     try {
570                         startActivity(intent);
571                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
572                 }
573
574                 showStartMenu = false;
575                 shouldHideTaskbar = true;
576                 contextMenuFix = false;
577                 break;
578             case "volume":
579                 AudioManager audio = (AudioManager) getSystemService(AUDIO_SERVICE);
580                 audio.adjustSuggestedStreamVolume(AudioManager.ADJUST_SAME, AudioManager.USE_DEFAULT_STREAM_TYPE, AudioManager.FLAG_SHOW_UI);
581
582                 showStartMenu = false;
583                 shouldHideTaskbar = true;
584                 contextMenuFix = false;
585                 break;
586             case "file_manager":
587                 U.launchApp(this, () -> {
588                     Intent fileManagerIntent;
589
590                     if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1)
591                         fileManagerIntent = new Intent(Intent.ACTION_VIEW);
592                     else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
593                         fileManagerIntent = new Intent("android.provider.action.BROWSE");
594                     else {
595                         fileManagerIntent = new Intent("android.provider.action.BROWSE_DOCUMENT_ROOT");
596                         fileManagerIntent.setComponent(ComponentName.unflattenFromString("com.android.documentsui/.DocumentsActivity"));
597                     }
598
599                     fileManagerIntent.addCategory(Intent.CATEGORY_DEFAULT);
600                     fileManagerIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
601                     fileManagerIntent.setData(Uri.parse("content://com.android.externalstorage.documents/root/primary"));
602
603                     try {
604                         startActivity(fileManagerIntent, U.getActivityOptionsBundle(this, ApplicationType.APPLICATION));
605                     } catch (ActivityNotFoundException e) {
606                         U.showToast(this, R.string.lock_device_not_supported);
607                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
608                 });
609
610                 showStartMenu = false;
611                 shouldHideTaskbar = true;
612                 contextMenuFix = false;
613                 break;
614             case "system_settings":
615                 U.launchApp(this, () -> {
616                     Intent settingsIntent = new Intent(Settings.ACTION_SETTINGS);
617                     settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
618
619                     try {
620                         startActivity(settingsIntent, U.getActivityOptionsBundle(this, ApplicationType.APPLICATION));
621                     } catch (ActivityNotFoundException e) {
622                         U.showToast(this, R.string.lock_device_not_supported);
623                     } catch (IllegalArgumentException e) { /* Gracefully fail */ }
624                 });
625
626                 showStartMenu = false;
627                 shouldHideTaskbar = true;
628                 contextMenuFix = false;
629                 break;
630             case "lock_device":
631                 U.lockDevice(this);
632
633                 showStartMenu = false;
634                 shouldHideTaskbar = true;
635                 contextMenuFix = false;
636                 break;
637             case "power_menu":
638                 U.sendAccessibilityAction(this, AccessibilityService.GLOBAL_ACTION_POWER_DIALOG);
639
640                 showStartMenu = false;
641                 shouldHideTaskbar = true;
642                 contextMenuFix = false;
643                 break;
644             case "change_wallpaper":
645                 Intent intent3 = Intent.createChooser(new Intent(Intent.ACTION_SET_WALLPAPER), getString(R.string.set_wallpaper));
646                 intent3.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
647                 U.startActivityMaximized(getApplicationContext(), intent3);
648
649                 showStartMenu = false;
650                 shouldHideTaskbar = true;
651                 contextMenuFix = false;
652                 break;
653         }
654
655         if(!secondaryMenu) finish();
656         return true;
657     }
658
659     @Override
660     protected void onPause() {
661         super.onPause();
662         if(!isFinishing()) finish();
663     }
664
665     @Override
666     public void finish() {
667         LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_DISAPPEARING"));
668         MenuHelper.getInstance().setContextMenuOpen(false);
669
670         if(!dashboardOrStartMenuAppearing) {
671             if(showStartMenu)
672                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.TOGGLE_START_MENU"));
673             else {
674                 LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.RESET_START_MENU"));
675
676                 if(shouldHideTaskbar && U.shouldCollapse(this, true))
677                     LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
678             }
679         }
680
681         SharedPreferences pref = U.getSharedPreferences(this);
682
683         super.finish();
684         if(showStartMenu || pref.getBoolean("disable_animations", false))
685             overridePendingTransition(0, 0);
686     }
687
688     @TargetApi(Build.VERSION_CODES.N_MR1)
689     private int getLauncherShortcuts() {
690         LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE);
691         if(launcherApps.hasShortcutHostPermission()) {
692             UserManager userManager = (UserManager) getSystemService(USER_SERVICE);
693
694             LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery();
695             query.setActivity(ComponentName.unflattenFromString(componentName));
696             query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC
697                     | LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST
698                     | LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED);
699
700             shortcuts = launcherApps.getShortcuts(query, userManager.getUserForSerialNumber(userId));
701             if(shortcuts != null)
702                 return shortcuts.size();
703         }
704
705         return 0;
706     }
707
708     @TargetApi(Build.VERSION_CODES.N_MR1)
709     private CharSequence getShortcutTitle(ShortcutInfo shortcut) {
710         CharSequence longLabel = shortcut.getLongLabel();
711         if(longLabel != null && longLabel.length() > 0 && longLabel.length() <= 20)
712             return longLabel;
713         else
714             return shortcut.getShortLabel();
715     }
716
717     @SuppressWarnings("deprecation")
718     @Override
719     public void onBackPressed() {
720         if(secondaryMenu) {
721             secondaryMenu = false;
722
723             getPreferenceScreen().removeAll();
724             generateMenu();
725
726             getListView().setOnItemLongClickListener(null);
727
728             if(U.hasBrokenSetLaunchBoundsApi())
729                 U.cancelToast();
730         } else {
731             if(contextMenuFix && !showStartMenu)
732                 U.startFreeformHack(this);
733
734             super.onBackPressed();
735             if(FreeformHackHelper.getInstance().isInFreeformWorkspace())
736                 overridePendingTransition(0, 0);
737         }
738     }
739
740     @Override
741     protected void onDestroy() {
742         super.onDestroy();
743
744         LocalBroadcastManager.getInstance(this).unregisterReceiver(finishReceiver);
745     }
746 }