From f67072802714069d0232d348471a21c73e000fe2 Mon Sep 17 00:00:00 2001 From: Braden Farmer Date: Mon, 13 Aug 2018 19:23:29 -0600 Subject: [PATCH] Taskbar 4.0 (release 2) * Fix getting display size on devices with notches (i.e. Essential Phone) * Code cleanup --- app/build.gradle | 2 +- app/src/androidx86/AndroidManifest.xml | 2 +- .../taskbar/activity/ContextMenuActivity.java | 52 ++++---- .../taskbar/activity/DashboardActivity.java | 6 +- .../farmerbb/taskbar/activity/HomeActivity.java | 6 +- .../taskbar/activity/InvisibleActivityAlt.java | 6 +- .../taskbar/activity/TouchAbsorberActivity.java | 6 +- .../farmerbb/taskbar/adapter/StartMenuAdapter.java | 51 ++------ .../farmerbb/taskbar/service/StartMenuService.java | 46 ++----- .../farmerbb/taskbar/service/TaskbarService.java | 92 +++----------- .../com/farmerbb/taskbar/util/DisplayInfo.java | 28 +++++ app/src/main/java/com/farmerbb/taskbar/util/U.java | 140 +++++++++++++++------ 12 files changed, 211 insertions(+), 226 deletions(-) create mode 100644 app/src/main/java/com/farmerbb/taskbar/util/DisplayInfo.java diff --git a/app/build.gradle b/app/build.gradle index 8fd392ee..a37c8587 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -22,7 +22,7 @@ android { targetSdkVersion 27 // TODO keep versionName and versionCode in sync with Android-x86 manifest - versionCode 186 + versionCode 187 versionName "4.0" resConfigs "en", "ja", "ru", "de", "zh-rCN", "tr" diff --git a/app/src/androidx86/AndroidManifest.xml b/app/src/androidx86/AndroidManifest.xml index 2947ca79..74c50e94 100644 --- a/app/src/androidx86/AndroidManifest.xml +++ b/app/src/androidx86/AndroidManifest.xml @@ -19,7 +19,7 @@ * HomeActivity is enabled by default * Certain activities and receivers are not exposed --> - diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/ContextMenuActivity.java b/app/src/main/java/com/farmerbb/taskbar/activity/ContextMenuActivity.java index 01b5b945..cae1baa9 100644 --- a/app/src/main/java/com/farmerbb/taskbar/activity/ContextMenuActivity.java +++ b/app/src/main/java/com/farmerbb/taskbar/activity/ContextMenuActivity.java @@ -39,7 +39,6 @@ import android.preference.Preference; import android.preference.PreferenceActivity; import android.provider.Settings; import android.support.v4.content.LocalBroadcastManager; -import android.util.DisplayMetrics; import android.view.Gravity; import android.view.View; import android.view.WindowManager; @@ -49,6 +48,7 @@ import com.farmerbb.taskbar.R; import com.farmerbb.taskbar.activity.dark.SelectAppActivityDark; import com.farmerbb.taskbar.util.AppEntry; import com.farmerbb.taskbar.util.ApplicationType; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.IconCache; import com.farmerbb.taskbar.util.LauncherHelper; @@ -61,6 +61,8 @@ import java.util.List; public class ContextMenuActivity extends PreferenceActivity implements Preference.OnPreferenceClickListener { + private Bundle args; + String packageName; String componentName; String appName; @@ -93,15 +95,17 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.CONTEXT_MENU_APPEARING")); MenuHelper.getInstance().setContextMenuOpen(true); - boolean isNonAppMenu = !getIntent().hasExtra("package_name") && !getIntent().hasExtra("app_name"); - showStartMenu = getIntent().getBooleanExtra("launched_from_start_menu", false); - isStartButton = isNonAppMenu && getIntent().getBooleanExtra("is_start_button", false); - isOverflowMenu = isNonAppMenu && getIntent().getBooleanExtra("is_overflow_menu", false); - contextMenuFix = getIntent().hasExtra("context_menu_fix"); + args = getIntent().getBundleExtra("args"); + + boolean isNonAppMenu = !args.containsKey("package_name") && !args.containsKey("app_name"); + showStartMenu = args.getBoolean("launched_from_start_menu", false); + isStartButton = isNonAppMenu && args.getBoolean("is_start_button", false); + isOverflowMenu = isNonAppMenu && args.getBoolean("is_overflow_menu", false); + contextMenuFix = args.containsKey("context_menu_fix"); // Determine where to position the dialog on screen WindowManager.LayoutParams params = getWindow().getAttributes(); - DisplayMetrics metrics = U.getRealDisplayMetrics(this); + DisplayInfo display = U.getDisplayInfo(this); int statusBarHeight = 0; int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); @@ -109,8 +113,8 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc statusBarHeight = getResources().getDimensionPixelSize(resourceId); if(showStartMenu) { - int x = getIntent().getIntExtra("x", 0); - int y = getIntent().getIntExtra("y", 0); + int x = args.getInt("x", 0); + int y = args.getInt("y", 0); int offset = getResources().getDimensionPixelSize(isOverflowMenu ? R.dimen.context_menu_offset_overflow : R.dimen.context_menu_offset); switch(U.getTaskbarPosition(this)) { @@ -118,13 +122,13 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc case "bottom_vertical_left": params.gravity = Gravity.BOTTOM | Gravity.LEFT; params.x = x; - params.y = metrics.heightPixels - y - offset; + params.y = display.height - y - offset; break; case "bottom_right": case "bottom_vertical_right": params.gravity = Gravity.BOTTOM | Gravity.LEFT; params.x = x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset + offset; - params.y = metrics.heightPixels - y - offset; + params.y = display.height - y - offset; break; case "top_left": case "top_vertical_left": @@ -142,8 +146,8 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc } else { LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU")); - int x = getIntent().getIntExtra("x", metrics.widthPixels); - int y = getIntent().getIntExtra("y", metrics.heightPixels); + int x = args.getInt("x", display.width); + int y = args.getInt("y", display.height); int offset = getResources().getDimensionPixelSize(R.dimen.icon_size); switch(U.getTaskbarPosition(this)) { @@ -155,17 +159,17 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc case "bottom_vertical_left": params.gravity = Gravity.BOTTOM | Gravity.LEFT; params.x = offset; - params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset); + params.y = display.height - y - (isStartButton ? 0 : offset); break; case "bottom_right": params.gravity = Gravity.BOTTOM | Gravity.RIGHT; - params.x = metrics.widthPixels - x; + params.x = display.width - x; params.y = offset; break; case "bottom_vertical_right": params.gravity = Gravity.BOTTOM | Gravity.RIGHT; params.x = offset; - params.y = metrics.heightPixels - y - (isStartButton ? 0 : offset); + params.y = display.height - y - (isStartButton ? 0 : offset); break; case "top_left": params.gravity = Gravity.TOP | Gravity.LEFT; @@ -179,7 +183,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc break; case "top_right": params.gravity = Gravity.TOP | Gravity.RIGHT; - params.x = metrics.widthPixels - x; + params.x = display.width - x; params.y = offset; break; case "top_vertical_right": @@ -189,7 +193,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc break; } - if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > metrics.widthPixels / 2)) + if(!U.getTaskbarPosition(this).contains("vertical") && (params.x > display.width / 2)) params.x = params.x - getResources().getDimensionPixelSize(R.dimen.context_menu_width) + offset; } @@ -228,7 +232,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc findPreference("change_wallpaper").setOnPreferenceClickListener(this); } - if(!getIntent().getBooleanExtra("dont_show_quit", false)) { + if(!args.getBoolean("dont_show_quit", false)) { addPreferencesFromResource(R.xml.pref_context_menu_quit); findPreference("quit_taskbar").setOnPreferenceClickListener(this); } @@ -252,10 +256,10 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc else getPreferenceScreen().removePreference(findPreference("file_manager")); } else { - appName = getIntent().getStringExtra("app_name"); - packageName = getIntent().getStringExtra("package_name"); - componentName = getIntent().getStringExtra("component_name"); - userId = getIntent().getLongExtra("user_id", 0); + appName = args.getString("app_name"); + packageName = args.getString("package_name"); + componentName = args.getString("component_name"); + userId = args.getLong("user_id", 0); if(getResources().getConfiguration().screenWidthDp >= 600 && Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) @@ -381,7 +385,7 @@ public class ContextMenuActivity extends PreferenceActivity implements Preferenc UserManager userManager = (UserManager) getSystemService(USER_SERVICE); LauncherApps launcherApps = (LauncherApps) getSystemService(LAUNCHER_APPS_SERVICE); boolean appIsValid = isStartButton || isOverflowMenu || - !launcherApps.getActivityList(getIntent().getStringExtra("package_name"), + !launcherApps.getActivityList(args.getString("package_name"), userManager.getUserForSerialNumber(userId)).isEmpty(); if(appIsValid) switch(p.getKey()) { diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/DashboardActivity.java b/app/src/main/java/com/farmerbb/taskbar/activity/DashboardActivity.java index 39131d81..6096e144 100644 --- a/app/src/main/java/com/farmerbb/taskbar/activity/DashboardActivity.java +++ b/app/src/main/java/com/farmerbb/taskbar/activity/DashboardActivity.java @@ -30,7 +30,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; -import android.util.DisplayMetrics; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.WindowManager; @@ -39,6 +38,7 @@ import android.widget.LinearLayout; import com.farmerbb.taskbar.R; import com.farmerbb.taskbar.util.DashboardHelper; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.U; public class DashboardActivity extends Activity { @@ -128,12 +128,12 @@ public class DashboardActivity extends Activity { getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); getWindow().setFlags(WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); - DisplayMetrics metrics = U.getRealDisplayMetrics(this); + DisplayInfo display = U.getDisplayInfo(this); setContentView(R.layout.incognito); LinearLayout layout = U.findViewById(this, R.id.incognitoLayout); - layout.setLayoutParams(new FrameLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels)); + layout.setLayoutParams(new FrameLayout.LayoutParams(display.width, display.height)); LocalBroadcastManager.getInstance(this).registerReceiver(addWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.ADD_WIDGET_REQUESTED")); LocalBroadcastManager.getInstance(this).registerReceiver(removeWidgetReceiver, new IntentFilter("com.farmerbb.taskbar.REMOVE_WIDGET_REQUESTED")); diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/HomeActivity.java b/app/src/main/java/com/farmerbb/taskbar/activity/HomeActivity.java index 6b1f9fea..db6b1c25 100644 --- a/app/src/main/java/com/farmerbb/taskbar/activity/HomeActivity.java +++ b/app/src/main/java/com/farmerbb/taskbar/activity/HomeActivity.java @@ -30,7 +30,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.v4.content.LocalBroadcastManager; -import android.util.DisplayMetrics; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; @@ -42,6 +41,7 @@ import com.farmerbb.taskbar.service.NotificationService; import com.farmerbb.taskbar.service.StartMenuService; import com.farmerbb.taskbar.service.TaskbarService; import com.farmerbb.taskbar.util.CompatUtils; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.IconCache; import com.farmerbb.taskbar.util.LauncherHelper; import com.farmerbb.taskbar.util.U; @@ -98,8 +98,8 @@ public class HomeActivity extends Activity { wallpaperManager.setWallpaperOffsets(getWindowToken(), 0.5f, 0.5f); if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - DisplayMetrics metrics = U.getRealDisplayMetrics(HomeActivity.this); - wallpaperManager.suggestDesiredDimensions(metrics.widthPixels, metrics.heightPixels); + DisplayInfo display = U.getDisplayInfo(HomeActivity.this); + wallpaperManager.suggestDesiredDimensions(display.width, display.height); } boolean shouldStartFreeformHack = shouldDelayFreeformHack && hits > 0; diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/InvisibleActivityAlt.java b/app/src/main/java/com/farmerbb/taskbar/activity/InvisibleActivityAlt.java index 87884944..82fc859f 100644 --- a/app/src/main/java/com/farmerbb/taskbar/activity/InvisibleActivityAlt.java +++ b/app/src/main/java/com/farmerbb/taskbar/activity/InvisibleActivityAlt.java @@ -21,11 +21,11 @@ import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.provider.Settings; -import android.util.DisplayMetrics; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.farmerbb.taskbar.R; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.MenuHelper; import com.farmerbb.taskbar.util.U; @@ -40,12 +40,12 @@ public class InvisibleActivityAlt extends InvisibleActivity { boolean powerButtonWarning = getIntent().hasExtra("power_button_warning"); - DisplayMetrics metrics = U.getRealDisplayMetrics(this); + DisplayInfo display = U.getDisplayInfo(this); setContentView(R.layout.incognito); LinearLayout layout = U.findViewById(this, R.id.incognitoLayout); - layout.setLayoutParams(new FrameLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels)); + layout.setLayoutParams(new FrameLayout.LayoutParams(display.width, display.height)); if(!MenuHelper.getInstance().isStartMenuOpen() && !powerButtonWarning) finish(); diff --git a/app/src/main/java/com/farmerbb/taskbar/activity/TouchAbsorberActivity.java b/app/src/main/java/com/farmerbb/taskbar/activity/TouchAbsorberActivity.java index 1a868b98..a6992a5f 100644 --- a/app/src/main/java/com/farmerbb/taskbar/activity/TouchAbsorberActivity.java +++ b/app/src/main/java/com/farmerbb/taskbar/activity/TouchAbsorberActivity.java @@ -23,11 +23,11 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; -import android.util.DisplayMetrics; import android.widget.FrameLayout; import android.widget.LinearLayout; import com.farmerbb.taskbar.R; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.U; @@ -47,9 +47,9 @@ public class TouchAbsorberActivity extends Activity { super.onCreate(savedInstanceState); setContentView(R.layout.incognito); - DisplayMetrics metrics = U.getRealDisplayMetrics(this); + DisplayInfo display = U.getDisplayInfo(this); LinearLayout layout = U.findViewById(this, R.id.incognitoLayout); - layout.setLayoutParams(new FrameLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels)); + layout.setLayoutParams(new FrameLayout.LayoutParams(display.width, display.height)); LocalBroadcastManager.getInstance(this).registerReceiver(finishReceiver, new IntentFilter("com.farmerbb.taskbar.FINISH_FREEFORM_ACTIVITY")); FreeformHackHelper.getInstance().setTouchAbsorberActive(true); diff --git a/app/src/main/java/com/farmerbb/taskbar/adapter/StartMenuAdapter.java b/app/src/main/java/com/farmerbb/taskbar/adapter/StartMenuAdapter.java index 93657680..02e8a661 100644 --- a/app/src/main/java/com/farmerbb/taskbar/adapter/StartMenuAdapter.java +++ b/app/src/main/java/com/farmerbb/taskbar/adapter/StartMenuAdapter.java @@ -21,15 +21,14 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.graphics.Color; -import android.graphics.Rect; import android.graphics.Typeface; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v4.content.LocalBroadcastManager; import android.support.v4.graphics.ColorUtils; -import android.util.DisplayMetrics; import android.util.SparseIntArray; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -43,10 +42,7 @@ import android.widget.SectionIndexer; import android.widget.TextView; import com.farmerbb.taskbar.R; -import com.farmerbb.taskbar.activity.ContextMenuActivity; -import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark; import com.farmerbb.taskbar.util.AppEntry; -import com.farmerbb.taskbar.util.ApplicationType; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.TopApps; import com.farmerbb.taskbar.util.U; @@ -196,43 +192,16 @@ public class StartMenuAdapter extends ArrayAdapter implements SectionI private void openContextMenu(final AppEntry entry, final int[] location) { LocalBroadcastManager.getInstance(getContext()).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU_NO_RESET")); - new Handler().postDelayed(() -> { - SharedPreferences pref = U.getSharedPreferences(getContext()); - Intent intent = null; - - switch(pref.getString("theme", "light")) { - case "light": - intent = new Intent(getContext(), ContextMenuActivity.class); - break; - case "dark": - intent = new Intent(getContext(), ContextMenuActivityDark.class); - break; - } - - if(intent != null) { - intent.putExtra("package_name", entry.getPackageName()); - intent.putExtra("app_name", entry.getLabel()); - intent.putExtra("component_name", entry.getComponentName()); - intent.putExtra("user_id", entry.getUserId(getContext())); - intent.putExtra("launched_from_start_menu", true); - intent.putExtra("x", location[0]); - intent.putExtra("y", location[1]); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - - if(U.hasFreeformSupport(getContext()) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) { - DisplayMetrics metrics = U.getRealDisplayMetrics(getContext()); - - if(intent != null && U.hasBrokenSetLaunchBoundsApi()) - intent.putExtra("context_menu_fix", true); + Bundle args = new Bundle(); + args.putString("package_name", entry.getPackageName()); + args.putString("app_name", entry.getLabel()); + args.putString("component_name", entry.getComponentName()); + args.putLong("user_id", entry.getUserId(getContext())); + args.putBoolean("launched_from_start_menu", true); + args.putInt("x", location[0]); + args.putInt("y", location[1]); - getContext().startActivity(intent, - U.getActivityOptions(getContext(), ApplicationType.CONTEXT_MENU) - .setLaunchBounds(new Rect(0, 0, metrics.widthPixels, metrics.heightPixels)) - .toBundle()); - } else - getContext().startActivity(intent); - }, shouldDelay() ? 100 : 0); + new Handler().postDelayed(() -> U.startContextMenuActivity(getContext(), args), shouldDelay() ? 100 : 0); } private boolean shouldDelay() { diff --git a/app/src/main/java/com/farmerbb/taskbar/service/StartMenuService.java b/app/src/main/java/com/farmerbb/taskbar/service/StartMenuService.java index 477e7eae..a954bfda 100644 --- a/app/src/main/java/com/farmerbb/taskbar/service/StartMenuService.java +++ b/app/src/main/java/com/farmerbb/taskbar/service/StartMenuService.java @@ -31,10 +31,10 @@ import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.PixelFormat; -import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.UserHandle; @@ -42,7 +42,6 @@ import android.os.UserManager; import android.provider.Settings; import android.support.v4.content.LocalBroadcastManager; import android.support.v7.widget.SearchView; -import android.util.DisplayMetrics; import android.util.Patterns; import android.view.Gravity; import android.view.LayoutInflater; @@ -61,13 +60,10 @@ import android.widget.ListAdapter; import android.widget.TextView; import com.farmerbb.taskbar.R; -import com.farmerbb.taskbar.activity.ContextMenuActivity; -import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark; import com.farmerbb.taskbar.activity.InvisibleActivity; import com.farmerbb.taskbar.activity.InvisibleActivityAlt; import com.farmerbb.taskbar.adapter.StartMenuAdapter; import com.farmerbb.taskbar.util.AppEntry; -import com.farmerbb.taskbar.util.ApplicationType; import com.farmerbb.taskbar.util.Blacklist; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.IconCache; @@ -723,41 +719,13 @@ public class StartMenuService extends Service { private void openContextMenu(final int[] location) { LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("com.farmerbb.taskbar.HIDE_START_MENU_NO_RESET")); - new Handler().postDelayed(() -> { - SharedPreferences pref = U.getSharedPreferences(this); - Intent intent = null; - - switch(pref.getString("theme", "light")) { - case "light": - intent = new Intent(this, ContextMenuActivity.class); - break; - case "dark": - intent = new Intent(this, ContextMenuActivityDark.class); - break; - } - - if(intent != null) { - intent.putExtra("launched_from_start_menu", true); - intent.putExtra("is_overflow_menu", true); - intent.putExtra("x", location[0]); - intent.putExtra("y", location[1]); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - - if(U.hasFreeformSupport(this) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) { - DisplayMetrics metrics = U.getRealDisplayMetrics(this); - - if(intent != null && U.hasBrokenSetLaunchBoundsApi()) - intent.putExtra("context_menu_fix", true); + Bundle args = new Bundle(); + args.putBoolean("launched_from_start_menu", true); + args.putBoolean("is_overflow_menu", true); + args.putInt("x", location[0]); + args.putInt("y", location[1]); - startActivity(intent, - U.getActivityOptions(this, ApplicationType.CONTEXT_MENU) - .setLaunchBounds( - new Rect(0, 0, metrics.widthPixels, metrics.heightPixels) - ).toBundle()); - } else - startActivity(intent); - }, shouldDelay() ? 100 : 0); + new Handler().postDelayed(() -> U.startContextMenuActivity(this, args), shouldDelay() ? 100 : 0); } private boolean shouldDelay() { diff --git a/app/src/main/java/com/farmerbb/taskbar/service/TaskbarService.java b/app/src/main/java/com/farmerbb/taskbar/service/TaskbarService.java index 57e662d5..e81e6cc7 100644 --- a/app/src/main/java/com/farmerbb/taskbar/service/TaskbarService.java +++ b/app/src/main/java/com/farmerbb/taskbar/service/TaskbarService.java @@ -38,10 +38,10 @@ import android.content.res.Configuration; import android.graphics.Color; import android.graphics.PixelFormat; import android.graphics.Point; -import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.Drawable; import android.os.Build; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.PowerManager; @@ -51,7 +51,6 @@ import android.os.UserManager; import android.speech.RecognizerIntent; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.ColorUtils; -import android.util.DisplayMetrics; import android.view.Display; import android.view.Gravity; import android.view.LayoutInflater; @@ -77,12 +76,10 @@ import android.widget.Space; import com.farmerbb.taskbar.BuildConfig; import com.farmerbb.taskbar.activity.MainActivity; import com.farmerbb.taskbar.R; -import com.farmerbb.taskbar.activity.ContextMenuActivity; -import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark; import com.farmerbb.taskbar.activity.HomeActivity; import com.farmerbb.taskbar.activity.InvisibleActivityFreeform; import com.farmerbb.taskbar.util.AppEntry; -import com.farmerbb.taskbar.util.ApplicationType; +import com.farmerbb.taskbar.util.DisplayInfo; import com.farmerbb.taskbar.util.FreeformHackHelper; import com.farmerbb.taskbar.util.IconCache; import com.farmerbb.taskbar.util.LauncherHelper; @@ -846,12 +843,12 @@ public class TaskbarService extends Service { handler.post(() -> { if(numOfEntries > 0 || fullLength) { ViewGroup.LayoutParams params = scrollView.getLayoutParams(); - DisplayMetrics metrics = U.getRealDisplayMetrics(this); + DisplayInfo display = U.getDisplayInfo(this); int recentsSize = getResources().getDimensionPixelSize(R.dimen.icon_size) * numOfEntries; float maxRecentsSize = fullLength ? Float.MAX_VALUE : recentsSize; if(U.getTaskbarPosition(this).contains("vertical")) { - int maxScreenSize = metrics.heightPixels + int maxScreenSize = display.height - U.getStatusBarHeight(this) - U.getBaseTaskbarSize(this); @@ -867,8 +864,7 @@ public class TaskbarService extends Service { } catch (NullPointerException e) { /* Gracefully fail */ } } } else { - int maxScreenSize = metrics.widthPixels - - U.getBaseTaskbarSize(this); + int maxScreenSize = display.width - U.getBaseTaskbarSize(this); params.width = (int) Math.min(maxRecentsSize, maxScreenSize) + getResources().getDimensionPixelSize(R.dimen.divider_size); @@ -1134,36 +1130,14 @@ public class TaskbarService extends Service { @SuppressWarnings("deprecation") private void openContextMenu() { SharedPreferences pref = U.getSharedPreferences(this); - Intent intent = null; - - switch(pref.getString("theme", "light")) { - case "light": - intent = new Intent(this, ContextMenuActivity.class); - break; - case "dark": - intent = new Intent(this, ContextMenuActivityDark.class); - break; - } - if(intent != null) { - intent.putExtra("dont_show_quit", LauncherHelper.getInstance().isOnHomeScreen() && !pref.getBoolean("taskbar_active", false)); - intent.putExtra("is_start_button", true); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - - if(U.hasFreeformSupport(this) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) { - DisplayMetrics metrics = U.getRealDisplayMetrics(this); - - if(intent != null && U.hasBrokenSetLaunchBoundsApi()) - intent.putExtra("context_menu_fix", true); + Bundle args = new Bundle(); + args.putBoolean("dont_show_quit", + LauncherHelper.getInstance().isOnHomeScreen() + && !pref.getBoolean("taskbar_active", false)); + args.putBoolean("is_start_button", true); - startActivity(intent, - U.getActivityOptions(this, ApplicationType.CONTEXT_MENU) - .setLaunchBounds( - new Rect(0, 0, metrics.widthPixels, metrics.heightPixels) - ).toBundle()); - } else - startActivity(intent); + U.startContextMenuActivity(this, args); } private void updateButton(boolean isCollapsed) { @@ -1278,41 +1252,15 @@ public class TaskbarService extends Service { @SuppressWarnings("deprecation") private void openContextMenu(AppEntry entry, int[] location) { - SharedPreferences pref = U.getSharedPreferences(this); - Intent intent = null; - - switch(pref.getString("theme", "light")) { - case "light": - intent = new Intent(this, ContextMenuActivity.class); - break; - case "dark": - intent = new Intent(this, ContextMenuActivityDark.class); - break; - } - - if(intent != null) { - intent.putExtra("package_name", entry.getPackageName()); - intent.putExtra("app_name", entry.getLabel()); - intent.putExtra("component_name", entry.getComponentName()); - intent.putExtra("user_id", entry.getUserId(this)); - intent.putExtra("x", location[0]); - intent.putExtra("y", location[1]); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - } - - if(U.hasFreeformSupport(this) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) { - DisplayMetrics metrics = U.getRealDisplayMetrics(this); - - if(intent != null && U.hasBrokenSetLaunchBoundsApi()) - intent.putExtra("context_menu_fix", true); - - startActivity(intent, - U.getActivityOptions(this, ApplicationType.CONTEXT_MENU) - .setLaunchBounds( - new Rect(0, 0, metrics.widthPixels, metrics.heightPixels) - ).toBundle()); - } else - startActivity(intent); + Bundle args = new Bundle(); + args.putString("package_name", entry.getPackageName()); + args.putString("app_name", entry.getLabel()); + args.putString("component_name", entry.getComponentName()); + args.putLong("user_id", entry.getUserId(this)); + args.putInt("x", location[0]); + args.putInt("y", location[1]); + + U.startContextMenuActivity(this, args); } private List getAppEntries() { diff --git a/app/src/main/java/com/farmerbb/taskbar/util/DisplayInfo.java b/app/src/main/java/com/farmerbb/taskbar/util/DisplayInfo.java new file mode 100644 index 00000000..56d4b1dc --- /dev/null +++ b/app/src/main/java/com/farmerbb/taskbar/util/DisplayInfo.java @@ -0,0 +1,28 @@ +/* Copyright 2018 Braden Farmer + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.farmerbb.taskbar.util; + +public class DisplayInfo { + public int width; + public int height; + public int density; + + DisplayInfo(int width, int height, int density) { + this.width = width; + this.height = height; + this.density = density; + } +} diff --git a/app/src/main/java/com/farmerbb/taskbar/util/U.java b/app/src/main/java/com/farmerbb/taskbar/util/U.java index 7a5576fe..6cadef17 100644 --- a/app/src/main/java/com/farmerbb/taskbar/util/U.java +++ b/app/src/main/java/com/farmerbb/taskbar/util/U.java @@ -61,11 +61,13 @@ import android.widget.Toast; import com.farmerbb.taskbar.BuildConfig; import com.farmerbb.taskbar.R; +import com.farmerbb.taskbar.activity.ContextMenuActivity; import com.farmerbb.taskbar.activity.DummyActivity; import com.farmerbb.taskbar.activity.InvisibleActivityFreeform; import com.farmerbb.taskbar.activity.ShortcutActivity; import com.farmerbb.taskbar.activity.StartTaskbarActivity; import com.farmerbb.taskbar.activity.TouchAbsorberActivity; +import com.farmerbb.taskbar.activity.dark.ContextMenuActivityDark; import com.farmerbb.taskbar.receiver.LockDeviceReceiver; import com.farmerbb.taskbar.service.DashboardService; import com.farmerbb.taskbar.service.NotificationService; @@ -391,12 +393,12 @@ public class U { @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.N) private static Bundle launchMode1(Context context, ApplicationType type) { - DisplayMetrics metrics = getRealDisplayMetrics(context); + DisplayInfo display = getDisplayInfo(context); - int width1 = metrics.widthPixels / 8; - int width2 = metrics.widthPixels - width1; - int height1 = metrics.heightPixels / 8; - int height2 = metrics.heightPixels - height1; + int width1 = display.width / 8; + int width2 = display.width - width1; + int height1 = display.height / 8; + int height2 = display.height - height1; return getActivityOptions(context, type).setLaunchBounds(new Rect( width1, @@ -409,7 +411,7 @@ public class U { @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.N) private static Bundle launchMode2(Context context, int launchType, ApplicationType type) { - DisplayMetrics metrics = getRealDisplayMetrics(context); + DisplayInfo display = getDisplayInfo(context); int statusBarHeight = getStatusBarHeight(context); String position = getTaskbarPosition(context); @@ -419,8 +421,8 @@ public class U { int left = 0; int top = statusBarHeight; - int right = metrics.widthPixels; - int bottom = metrics.heightPixels; + int right = display.width; + int bottom = display.height; int iconSize = isOverridingFreeformHack(context) && !LauncherHelper.getInstance().isOnHomeScreen() ? 0 @@ -453,11 +455,11 @@ public class U { @SuppressWarnings("deprecation") @TargetApi(Build.VERSION_CODES.N) private static Bundle launchMode3(Context context, ApplicationType type) { - DisplayMetrics metrics = getRealDisplayMetrics(context); + DisplayInfo display = getDisplayInfo(context); - int width1 = metrics.widthPixels / 2; + int width1 = display.width / 2; int width2 = context.getResources().getDimensionPixelSize(R.dimen.phone_size_width) / 2; - int height1 = metrics.heightPixels / 2; + int height1 = display.height / 2; int height2 = context.getResources().getDimensionPixelSize(R.dimen.phone_size_height) / 2; return getActivityOptions(context, type).setLaunchBounds(new Rect( @@ -510,15 +512,15 @@ public class U { @TargetApi(Build.VERSION_CODES.N) public static void startActivityLowerRight(Context context, Intent intent) { - DisplayMetrics metrics = getRealDisplayMetrics(context); + DisplayInfo display = getDisplayInfo(context); try { context.startActivity(intent, getActivityOptions(context, ApplicationType.FREEFORM_HACK) .setLaunchBounds(new Rect( - metrics.widthPixels, - metrics.heightPixels, - metrics.widthPixels + 1, - metrics.heightPixels + 1 + display.width, + display.height, + display.width + 1, + display.height + 1 )).toBundle()); } catch (IllegalArgumentException | SecurityException e) { /* Gracefully fail */ } } @@ -526,12 +528,12 @@ public class U { @TargetApi(Build.VERSION_CODES.N) public static void startTouchAbsorberActivity(Context context) { String position = getTaskbarPosition(context); - DisplayMetrics metrics = getRealDisplayMetrics(context); + DisplayInfo display = getDisplayInfo(context); int left = 0; int top = 0; - int right = metrics.widthPixels; - int bottom = metrics.heightPixels; + int right = display.width; + int bottom = display.height; int iconSize = context.getResources().getDimensionPixelSize(R.dimen.icon_size); @@ -555,6 +557,39 @@ public class U { } catch (IllegalArgumentException | SecurityException e) { /* Gracefully fail */ } } + public static void startContextMenuActivity(Context context, Bundle args) { + SharedPreferences pref = getSharedPreferences(context); + Intent intent = null; + + switch(pref.getString("theme", "light")) { + case "light": + intent = new Intent(context, ContextMenuActivity.class); + break; + case "dark": + intent = new Intent(context, ContextMenuActivityDark.class); + break; + } + + if(intent != null) { + intent.putExtra("args", args); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + } + + if(hasFreeformSupport(context) && FreeformHackHelper.getInstance().isInFreeformWorkspace()) { + DisplayInfo display = getDisplayInfo(context); + + if(intent != null && hasBrokenSetLaunchBoundsApi()) + intent.putExtra("context_menu_fix", true); + + context.startActivity(intent, + getActivityOptions(context, ApplicationType.CONTEXT_MENU) + .setLaunchBounds( + new Rect(0, 0, display.width, display.height) + ).toBundle()); + } else + context.startActivity(intent); + } + public static void checkForUpdates(Context context) { String url; if(isPlayStoreRelease(context)) @@ -696,15 +731,16 @@ public class U { private static int getMaxNumOfColumns(Context context) { SharedPreferences pref = getSharedPreferences(context); - DisplayMetrics metrics = getRealDisplayMetrics(context); - float baseTaskbarSize = getBaseTaskbarSizeFloat(context) / metrics.density; + DisplayInfo display = getDisplayInfo(context); + float density = display.density / 160; + float baseTaskbarSize = getBaseTaskbarSizeFloat(context) / density; int numOfColumns = 0; float maxScreenSize = getTaskbarPosition(context).contains("vertical") - ? (metrics.heightPixels - getStatusBarHeight(context)) / metrics.density - : metrics.widthPixels / metrics.density; + ? (display.height - getStatusBarHeight(context)) / density + : display.width / density; - float iconSize = context.getResources().getDimension(R.dimen.icon_size) / metrics.density; + float iconSize = context.getResources().getDimension(R.dimen.icon_size) / density; int userMaxNumOfColumns = Integer.valueOf(pref.getString("max_num_of_recents", "10")); @@ -725,12 +761,20 @@ public class U { } public static int getStatusBarHeight(Context context) { - int statusBarHeight = 0; - int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + return getSystemDimen(context, "status_bar_height"); + } + + private static int getNavbarHeight(Context context) { + return getSystemDimen(context, "navigation_bar_height"); + } + + private static int getSystemDimen(Context context, String id) { + int value = 0; + int resourceId = context.getResources().getIdentifier(id, "dimen", "android"); if(resourceId > 0) - statusBarHeight = context.getResources().getDimensionPixelSize(resourceId); + value = context.getResources().getDimensionPixelSize(resourceId); - return statusBarHeight; + return value; } public static void refreshPinnedIcons(Context context) { @@ -1183,18 +1227,42 @@ public class U { } } - public static DisplayMetrics getRealDisplayMetrics(Context context) { - DisplayMetrics metrics = new DisplayMetrics(); + public static DisplayInfo getDisplayInfo(Context context) { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display disp = wm.getDefaultDisplay(); - SharedPreferences pref = getSharedPreferences(context); - if(isChromeOs(context) && !pref.getBoolean("chrome_os_context_menu_fix", true)) - disp.getRealMetrics(metrics); - else - disp.getMetrics(metrics); + DisplayMetrics metrics = new DisplayMetrics(); + disp.getMetrics(metrics); + + DisplayMetrics realMetrics = new DisplayMetrics(); + disp.getRealMetrics(realMetrics); + + DisplayInfo display = new DisplayInfo(metrics.widthPixels, metrics.heightPixels, metrics.densityDpi); + + if(isChromeOs(context)) { + SharedPreferences pref = getSharedPreferences(context); + if(!pref.getBoolean("chrome_os_context_menu_fix", true)) { + display.width = realMetrics.widthPixels; + display.height = realMetrics.heightPixels; + } + + return display; + } + + boolean sameWidth = metrics.widthPixels == realMetrics.widthPixels; + boolean sameHeight = metrics.heightPixels == realMetrics.heightPixels; + + if(sameWidth && !sameHeight) { + display.width = realMetrics.widthPixels; + display.height = realMetrics.heightPixels - getNavbarHeight(context); + } + + if(!sameWidth && sameHeight) { + display.width = realMetrics.widthPixels - getNavbarHeight(context); + display.height = realMetrics.heightPixels; + } - return metrics; + return display; } public static void pinAppShortcut(Context context) { -- 2.11.0