import android.app.AppOpsManager;
import android.app.Service;
import android.content.ActivityNotFoundException;
+import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import com.farmerbb.taskbar.activity.MainActivity;
import com.farmerbb.taskbar.activity.TouchAbsorberActivity;
import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark;
+import com.farmerbb.taskbar.content.TaskbarIntent;
import com.farmerbb.taskbar.service.DashboardService;
import com.farmerbb.taskbar.service.NotificationService;
import com.farmerbb.taskbar.service.PowerMenuService;
}
public static void sendAccessibilityAction(Context context, int action, Runnable onComplete) {
- ComponentName component = new ComponentName(context, PowerMenuService.class);
- context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
- PackageManager.DONT_KILL_APP);
+ setComponentEnabled(context, PowerMenuService.class, true);
boolean isAccessibilityServiceEnabled = isAccessibilityServiceEnabled(context);
}
new Handler().postDelayed(() -> {
- Intent intent = new Intent("com.farmerbb.taskbar.ACCESSIBILITY_ACTION");
+ Intent intent = new Intent(TaskbarIntent.ACTION_ACCESSIBILITY_ACTION);
intent.putExtra("action", action);
- LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ sendBroadcast(context, intent);
try {
Settings.Secure.putString(context.getContentResolver(),
if(onComplete != null) onComplete.run();
}, 100);
} else if(isAccessibilityServiceEnabled) {
- Intent intent = new Intent("com.farmerbb.taskbar.ACCESSIBILITY_ACTION");
+ Intent intent = new Intent(TaskbarIntent.ACTION_ACCESSIBILITY_ACTION);
intent.putExtra("action", action);
- LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ sendBroadcast(context, intent);
if(onComplete != null) onComplete.run();
} else {
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION);
try {
- startActivityMaximized(context, intent);
+ context.startActivity(intent, getActivityOptionsBundle(context, ApplicationType.APP_PORTRAIT, null));
} catch (IllegalArgumentException | SecurityException e) { /* Gracefully fail */ }
});
}
}
public static void stopFreeformHack(Context context) {
- LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.FINISH_FREEFORM_ACTIVITY"));
+ sendBroadcast(context, TaskbarIntent.ACTION_FINISH_FREEFORM_ACTIVITY);
if(isOverridingFreeformHack(context, false)) {
FreeformHackHelper helper = FreeformHackHelper.getInstance();
launchShortcut(context, shortcut, bundle, onError);
});
- if(shouldCollapse(context, true))
- LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_TASKBAR"));
- else
- LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU"));
+ if(shouldCollapse(context, true)) {
+ sendBroadcast(context, TaskbarIntent.ACTION_HIDE_TASKBAR);
+ } else {
+ sendBroadcast(context, TaskbarIntent.ACTION_HIDE_START_MENU);
+ }
}
private static Bundle launchMode1(Context context, ApplicationType type, View view, int factor) {
}
private static void prepareToStartActivity(Context context, boolean openInNewWindow, Runnable runnable) {
- LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_CONTEXT_MENU"));
+ sendBroadcast(context, TaskbarIntent.ACTION_HIDE_CONTEXT_MENU);
if(!FreeformHackHelper.getInstance().isTouchAbsorberActive()
&& shouldLaunchTouchAbsorber(context)) {
else
stackId = getFullscreenWindowModeId();
break;
- case GAME:
+ case APP_FULLSCREEN:
stackId = getFullscreenWindowModeId();
break;
case FREEFORM_HACK:
@SuppressLint("SwitchIntDef")
private static ApplicationType getApplicationType(Context context, AppEntry entry) {
if(isGame(context, entry.getPackageName()))
- return ApplicationType.GAME;
+ return ApplicationType.APP_FULLSCREEN;
try {
ActivityInfo info = context.getPackageManager().getActivityInfo(
if(context.getPackageName().equals(BuildConfig.ANDROIDX86_APPLICATION_ID))
return true;
- PackageManager pm = context.getPackageManager();
- try {
- pm.getPackageInfo(BuildConfig.SUPPORT_APPLICATION_ID, 0);
- return pm.checkSignatures(BuildConfig.SUPPORT_APPLICATION_ID, context.getPackageName()) == PackageManager.SIGNATURE_MATCH
- && context.getPackageName().equals(BuildConfig.BASE_APPLICATION_ID)
- && isSystemApp(context);
- } catch (PackageManager.NameNotFoundException e) {
- return false;
- }
+ return hasSupportLibrary(context, 0);
}
public static boolean hasSupportLibrary(Context context, int minVersion) {
startTaskbarService(context, false);
}
- LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("com.farmerbb.taskbar.RESTART"));
+ sendBroadcast(context, TaskbarIntent.ACTION_RESTART);
}
public static void restartNotificationService(Context context) {
}
public static void showHideNavigationBar(Context context, boolean show) {
+ if(!isDesktopModeActive(context)
+ && !isBlissOs(context)
+ && !hasSupportLibrary(context, 7)) {
+ return;
+ }
+
+ int displayID = getDisplayID();
+ int value = show ? 0 : getNavbarHeight(context) * -1;
+
+ if(hasWriteSecureSettingsPermission(context)) {
+ try {
+ setOverscan(displayID, value);
+ return;
+ } catch (Exception e) {
+ // Fallback to next method
+ }
+ }
+
if(hasSupportLibrary(context, 7)) {
Intent intent = new Intent(BuildConfig.SUPPORT_APPLICATION_ID + ".CHANGE_OVERSCAN");
intent.setPackage(BuildConfig.SUPPORT_APPLICATION_ID);
- intent.putExtra("display_id", getDisplayID());
- intent.putExtra("value", show ? 0 : getNavbarHeight(context) * -1);
+ intent.putExtra("display_id", displayID);
+ intent.putExtra("value", value);
context.sendBroadcast(intent);
return;
}
// Show or hide the system navigation bar on Bliss-x86
+ if(!isBlissOs(context)) return;
+
try {
if(getCurrentApiVersion() >= 28.0f)
Settings.Secure.putInt(context.getContentResolver(), "navigation_bar_visible", show ? 1 : 0);
}
public static boolean isDesktopModeSupported(Context context) {
- if(isLauncherPermanentlyEnabled(context)) return false;
+ if(isLauncherPermanentlyEnabled(context)
+ || isLibrary(context)
+ || !BuildConfig.DEBUG // TODO remove this line
+ || isChromeOs(context))
+ return false;
return Build.VERSION.SDK_INT > Build.VERSION_CODES.P
&& context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
&& !pref.getBoolean("launcher", false);
}
+ // TODO remove this in favor of the existing getDisplayID method?
public static int getExternalDisplayID(Context context) {
DisplayManager dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = dm.getDisplays();
return displays[displays.length - 1].getDisplayId();
}
+
+ @SuppressLint("PrivateApi")
+ private static Object getWindowManagerService() throws Exception {
+ return Class.forName("android.view.WindowManagerGlobal")
+ .getMethod("getWindowManagerService")
+ .invoke(null);
+ }
+
+ @SuppressLint("PrivateApi")
+ private static void setDensity(int displayID, String value) throws Exception {
+ // From android.os.UserHandle
+ final int USER_CURRENT_OR_SELF = -3;
+
+ if(value.equals("reset")) {
+ Class.forName("android.view.IWindowManager")
+ .getMethod("clearForcedDisplayDensityForUser", int.class, int.class)
+ .invoke(getWindowManagerService(), displayID, USER_CURRENT_OR_SELF);
+ } else {
+ int density = Integer.parseInt(value);
+
+ Class.forName("android.view.IWindowManager")
+ .getMethod("setForcedDisplayDensityForUser", int.class, int.class, int.class)
+ .invoke(getWindowManagerService(), displayID, density, USER_CURRENT_OR_SELF);
+ }
+ }
+
+ @SuppressLint("PrivateApi")
+ private static void setOverscan(int displayID, int value) throws Exception {
+ Class.forName("android.view.IWindowManager")
+ .getMethod("setOverscan", int.class, int.class, int.class, int.class, int.class)
+ .invoke(getWindowManagerService(), displayID, 0, 0, 0, value);
+ }
+
+ public static void registerReceiver(Context context, BroadcastReceiver receiver, String... actions) {
+ unregisterReceiver(context, receiver);
+
+ IntentFilter intentFilter = new IntentFilter();
+ for(String action : actions) {
+ intentFilter.addAction(action);
+ }
+
+ LocalBroadcastManager.getInstance(context).registerReceiver(receiver, intentFilter);
+ }
+
+ public static void unregisterReceiver(Context context, BroadcastReceiver receiver) {
+ LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
+ }
+
+ public static void sendBroadcast(Context context, String action) {
+ sendBroadcast(context, new Intent(action));
+ }
+
+ public static void sendBroadcast(Context context, Intent intent) {
+ LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
+ }
+
+ @SuppressWarnings("rawtypes")
+ public static void setComponentEnabled(Context context, Class clazz, boolean enabled) {
+ ComponentName component = new ComponentName(context, clazz);
+ context.getPackageManager().setComponentEnabledSetting(component,
+ enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
+ : PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }
}