OSDN Git Service

Taskbar 4.0 (release 2)
authorBraden Farmer <farmerbb@gmail.com>
Tue, 14 Aug 2018 01:23:29 +0000 (19:23 -0600)
committerBraden Farmer <farmerbb@gmail.com>
Tue, 14 Aug 2018 01:23:29 +0000 (19:23 -0600)
* Fix getting display size on devices with notches (i.e. Essential Phone)
* Code cleanup

12 files changed:
app/build.gradle
app/src/androidx86/AndroidManifest.xml
app/src/main/java/com/farmerbb/taskbar/activity/ContextMenuActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/DashboardActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/HomeActivity.java
app/src/main/java/com/farmerbb/taskbar/activity/InvisibleActivityAlt.java
app/src/main/java/com/farmerbb/taskbar/activity/TouchAbsorberActivity.java
app/src/main/java/com/farmerbb/taskbar/adapter/StartMenuAdapter.java
app/src/main/java/com/farmerbb/taskbar/service/StartMenuService.java
app/src/main/java/com/farmerbb/taskbar/service/TaskbarService.java
app/src/main/java/com/farmerbb/taskbar/util/DisplayInfo.java [new file with mode: 0644]
app/src/main/java/com/farmerbb/taskbar/util/U.java

index 8fd392e..a37c858 100644 (file)
@@ -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"
index 2947ca7..74c50e9 100644 (file)
@@ -19,7 +19,7 @@
      * HomeActivity is enabled by default
      * Certain activities and receivers are not exposed
 -->
-<manifest android:versionCode="186"
+<manifest android:versionCode="187"
           android:versionName="4.0"
           xmlns:android="http://schemas.android.com/apk/res/android"
           package="com.farmerbb.taskbar" >
index 01b5b94..cae1baa 100644 (file)
@@ -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()) {
index 39131d8..6096e14 100644 (file)
@@ -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"));
index 6b1f9fe..db6b1c2 100644 (file)
@@ -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;
index 8788494..82fc859 100644 (file)
@@ -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();
 
index 1a868b9..a6992a5 100644 (file)
@@ -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);
index 9365768..02e8a66 100644 (file)
@@ -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<AppEntry> 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() {
index 477e7ea..a954bfd 100644 (file)
@@ -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() {
index 57e662d..e81e6cc 100644 (file)
@@ -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<AppEntry> 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 (file)
index 0000000..56d4b1d
--- /dev/null
@@ -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;
+    }
+}
index 7a5576f..6cadef1 100644 (file)
@@ -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) {