411 lines
16 KiB
Java
Executable File
411 lines
16 KiB
Java
Executable File
package code.name.monkey.retromusic.util;
|
|
|
|
import android.annotation.TargetApi;
|
|
import android.app.Activity;
|
|
import android.content.ContentUris;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.res.Configuration;
|
|
import android.content.res.Resources;
|
|
import android.database.Cursor;
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Color;
|
|
import android.graphics.Point;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.net.ConnectivityManager;
|
|
import android.net.NetworkInfo;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.os.ResultReceiver;
|
|
import android.provider.BaseColumns;
|
|
import android.provider.MediaStore;
|
|
import android.util.DisplayMetrics;
|
|
import android.view.Display;
|
|
import android.view.KeyCharacterMap;
|
|
import android.view.KeyEvent;
|
|
import android.view.View;
|
|
import android.view.ViewConfiguration;
|
|
import android.view.ViewGroup;
|
|
import android.view.Window;
|
|
import android.view.WindowManager;
|
|
import android.view.inputmethod.InputMethodManager;
|
|
import android.widget.FrameLayout;
|
|
|
|
import java.lang.reflect.Method;
|
|
import java.net.InetAddress;
|
|
import java.net.NetworkInterface;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import androidx.annotation.ColorInt;
|
|
import androidx.annotation.DrawableRes;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.core.content.ContextCompat;
|
|
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
|
|
import code.name.monkey.appthemehelper.ThemeStore;
|
|
import code.name.monkey.appthemehelper.util.TintHelper;
|
|
import code.name.monkey.retromusic.App;
|
|
|
|
public class RetroUtil {
|
|
|
|
private static final int[] TEMP_ARRAY = new int[1];
|
|
private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";
|
|
|
|
public static int calculateNoOfColumns(Context context) {
|
|
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
|
|
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
|
|
return (int) (dpWidth / 180);
|
|
}
|
|
|
|
public static Uri getAlbumArtUri(long paramInt) {
|
|
return ContentUris.withAppendedId(Uri.parse("content://media/external/audio/albumart"), paramInt);
|
|
}
|
|
|
|
public static boolean isTablet() {
|
|
return App.Companion.getContext().getResources().getConfiguration().smallestScreenWidthDp >= 600;
|
|
}
|
|
|
|
public static boolean isLandscape() {
|
|
return App.Companion.getContext().getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
|
|
}
|
|
|
|
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
|
|
public static boolean isRTL(@NonNull Context context) {
|
|
Configuration config = context.getResources().getConfiguration();
|
|
return config.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
|
|
}
|
|
|
|
@TargetApi(19)
|
|
public static void setStatusBarTranslucent(@NonNull Window window) {
|
|
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
|
|
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
|
|
}
|
|
|
|
public static boolean isMarshMellow() {
|
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
|
|
}
|
|
|
|
public static boolean isNougat() {
|
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
|
|
}
|
|
|
|
public static boolean isOreo() {
|
|
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
|
|
}
|
|
|
|
public static float getDistance(float x1, float y1, float x2, float y2) {
|
|
return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
|
|
}
|
|
|
|
public static float convertDpToPixel(float dp, Context context) {
|
|
Resources resources = context.getResources();
|
|
DisplayMetrics metrics = resources.getDisplayMetrics();
|
|
return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
|
|
}
|
|
|
|
public static float convertPixelsToDp(float px, Context context) {
|
|
Resources resources = context.getResources();
|
|
DisplayMetrics metrics = resources.getDisplayMetrics();
|
|
return px / ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
|
|
}
|
|
|
|
public static void openUrl(Activity context, String str) {
|
|
Intent intent = new Intent("android.intent.action.VIEW");
|
|
intent.setData(Uri.parse(str));
|
|
intent.setFlags(268435456);
|
|
context.startActivity(intent);
|
|
}
|
|
|
|
public static Point getScreenSize(@NonNull Context c) {
|
|
Display display = null;
|
|
if (c.getSystemService(Context.WINDOW_SERVICE) != null) {
|
|
display = ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
|
|
}
|
|
Point size = new Point();
|
|
if (display != null) {
|
|
display.getSize(size);
|
|
}
|
|
return size;
|
|
}
|
|
|
|
public static void hideSoftKeyboard(@Nullable Activity activity) {
|
|
if (activity != null) {
|
|
View currentFocus = activity.getCurrentFocus();
|
|
if (currentFocus != null) {
|
|
InputMethodManager inputMethodManager = (InputMethodManager) activity
|
|
.getSystemService(Activity.INPUT_METHOD_SERVICE);
|
|
if (inputMethodManager != null) {
|
|
inputMethodManager.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void showIme(@NonNull View view) {
|
|
InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService
|
|
(Context.INPUT_METHOD_SERVICE);
|
|
// the public methods don't seem to work for me, so… reflection.
|
|
try {
|
|
Method showSoftInputUnchecked = InputMethodManager.class.getMethod(
|
|
"showSoftInputUnchecked", int.class, ResultReceiver.class);
|
|
showSoftInputUnchecked.setAccessible(true);
|
|
showSoftInputUnchecked.invoke(imm, 0, null);
|
|
} catch (Exception e) {
|
|
// ho hum
|
|
}
|
|
}
|
|
|
|
public static Drawable getVectorDrawable(@NonNull Resources res, @DrawableRes int resId,
|
|
@Nullable Resources.Theme theme) {
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
return res.getDrawable(resId, theme);
|
|
}
|
|
return VectorDrawableCompat.create(res, resId, theme);
|
|
}
|
|
|
|
public static Drawable getTintedVectorDrawable(@NonNull Context context, @DrawableRes int id,
|
|
@ColorInt int color) {
|
|
return TintHelper
|
|
.createTintedDrawable(getVectorDrawable(context.getResources(), id, context.getTheme()),
|
|
color);
|
|
}
|
|
|
|
public static Drawable getTintedDrawable(@NonNull Context context, @DrawableRes int id,
|
|
@ColorInt int color) {
|
|
return TintHelper.createTintedDrawable(ContextCompat.getDrawable(context, id), color);
|
|
}
|
|
|
|
public static Drawable getTintedDrawable(@DrawableRes int id) {
|
|
return TintHelper
|
|
.createTintedDrawable(ContextCompat.getDrawable(App.Companion.getInstance(), id),
|
|
ThemeStore.Companion.accentColor(App.Companion.getInstance()));
|
|
}
|
|
|
|
public static Bitmap createBitmap(Drawable drawable, float sizeMultiplier) {
|
|
Bitmap bitmap = Bitmap.createBitmap((int) (drawable.getIntrinsicWidth() * sizeMultiplier),
|
|
(int) (drawable.getIntrinsicHeight() * sizeMultiplier), Bitmap.Config.ARGB_8888);
|
|
Canvas c = new Canvas(bitmap);
|
|
drawable.setBounds(0, 0, c.getWidth(), c.getHeight());
|
|
drawable.draw(c);
|
|
return bitmap;
|
|
}
|
|
|
|
public static Drawable getTintedVectorDrawable(@NonNull Resources res, @DrawableRes int resId,
|
|
@Nullable Resources.Theme theme, @ColorInt int color) {
|
|
return TintHelper.createTintedDrawable(getVectorDrawable(res, resId, theme), color);
|
|
}
|
|
|
|
public static boolean isAllowedToDownloadMetadata(final Context context) {
|
|
switch (PreferenceUtil.getInstance().autoDownloadImagesPolicy()) {
|
|
case "always":
|
|
return true;
|
|
case "only_wifi":
|
|
final ConnectivityManager connectivityManager = (ConnectivityManager) context
|
|
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
|
NetworkInfo netInfo = connectivityManager.getActiveNetworkInfo();
|
|
return netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI && netInfo
|
|
.isConnectedOrConnecting();
|
|
case "never":
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static String getIPAddress(boolean useIPv4) {
|
|
try {
|
|
List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
|
|
for (NetworkInterface intf : interfaces) {
|
|
List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
|
|
for (InetAddress addr : addrs) {
|
|
if (!addr.isLoopbackAddress()) {
|
|
String sAddr = addr.getHostAddress();
|
|
//boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
|
|
boolean isIPv4 = sAddr.indexOf(':') < 0;
|
|
|
|
if (useIPv4) {
|
|
if (isIPv4)
|
|
return sAddr;
|
|
} else {
|
|
if (!isIPv4) {
|
|
int delim = sAddr.indexOf('%'); // drop ip6 zone suffix
|
|
return delim < 0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception ex) {
|
|
}
|
|
return "";
|
|
}
|
|
|
|
public static Uri getSongUri(Context context, long id) {
|
|
final String[] projection = new String[]{
|
|
BaseColumns._ID, MediaStore.MediaColumns.DATA, MediaStore.Audio.AudioColumns.ALBUM_ID
|
|
};
|
|
final StringBuilder selection = new StringBuilder();
|
|
selection.append(BaseColumns._ID + " IN (");
|
|
selection.append(id);
|
|
selection.append(")");
|
|
final Cursor c = context.getContentResolver().query(
|
|
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection.toString(),
|
|
null, null);
|
|
|
|
if (c == null) {
|
|
return null;
|
|
}
|
|
c.moveToFirst();
|
|
|
|
|
|
try {
|
|
|
|
Uri uri = Uri.parse(c.getString(1));
|
|
c.close();
|
|
|
|
return uri;
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static void statusBarHeight(View statusBar) {
|
|
statusBar.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()));
|
|
}
|
|
|
|
public static int getStatusBarHeight() {
|
|
int result = 0;
|
|
int resourceId = App.Companion.getContext().getResources().getIdentifier("status_bar_height", "dimen", "android");
|
|
if (resourceId > 0) {
|
|
result = App.Companion.getContext().getResources().getDimensionPixelSize(resourceId);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static void setAllowDrawUnderNavigationBar(Window window) {
|
|
window.setNavigationBarColor(Color.TRANSPARENT);
|
|
window.getDecorView().setSystemUiVisibility(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ?
|
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
| View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
|
|
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION :
|
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
|
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
|
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
|
);
|
|
}
|
|
|
|
public static void setAllowDrawUnderStatusBar(@NonNull Window window) {
|
|
window.getDecorView().setSystemUiVisibility(
|
|
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
|
|
}
|
|
|
|
public static int getSoftButtonsBarSizePort(Activity activity) {
|
|
// getRealMetrics is only available with API 17 and +
|
|
DisplayMetrics metrics = new DisplayMetrics();
|
|
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
|
int usableHeight = metrics.heightPixels;
|
|
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
|
|
int realHeight = metrics.heightPixels;
|
|
if (realHeight > usableHeight)
|
|
return realHeight - usableHeight;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
public static int getNavigationBarHeight(Activity activity) {
|
|
/* int result = 0;
|
|
int resourceId = App.getContext().getResources().getIdentifier("navigation_bar_height", "dimen", "android");
|
|
if (resourceId > 0) {
|
|
result = App.getContext().getResources().getDimensionPixelSize(resourceId);
|
|
}
|
|
return result;*/
|
|
DisplayMetrics metrics = new DisplayMetrics();
|
|
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
|
int usableHeight = metrics.heightPixels;
|
|
activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
|
|
int realHeight = metrics.heightPixels;
|
|
if (realHeight > usableHeight)
|
|
if (PreferenceUtil.getInstance().getFullScreenMode()) {
|
|
return 0;
|
|
} else
|
|
return realHeight - usableHeight;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
public static int getNavBarHeight(Context c) {
|
|
int result = 0;
|
|
boolean hasMenuKey = ViewConfiguration.get(c).hasPermanentMenuKey();
|
|
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
|
|
|
|
if (!hasMenuKey && !hasBackKey) {
|
|
//The device has a navigation bar
|
|
Resources resources = c.getResources();
|
|
|
|
int orientation = resources.getConfiguration().orientation;
|
|
int resourceId;
|
|
if (isTablet(c)) {
|
|
resourceId = resources.getIdentifier(orientation == Configuration.ORIENTATION_PORTRAIT ? "navigation_bar_height" : "navigation_bar_height_landscape", "dimen", "android");
|
|
} else {
|
|
resourceId = resources.getIdentifier(orientation == Configuration.ORIENTATION_PORTRAIT ? "navigation_bar_height" : "navigation_bar_width", "dimen", "android");
|
|
}
|
|
|
|
if (resourceId > 0) {
|
|
return resources.getDimensionPixelSize(resourceId);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
|
|
private static boolean isTablet(Context c) {
|
|
return (c.getResources().getConfiguration().screenLayout
|
|
& Configuration.SCREENLAYOUT_SIZE_MASK)
|
|
>= Configuration.SCREENLAYOUT_SIZE_LARGE;
|
|
}
|
|
|
|
private static boolean hasNavBar(Resources resources) {
|
|
int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
|
|
if (id > 0)
|
|
return resources.getBoolean(id);
|
|
else
|
|
return false;
|
|
}
|
|
|
|
public static int getNavigationBarHeight(Resources resources) {
|
|
if (!hasNavBar(resources))
|
|
return 0;
|
|
|
|
int orientation = resources.getConfiguration().orientation;
|
|
|
|
//Only phone between 0-599 has navigationbar can move
|
|
boolean isSmartphone = resources.getConfiguration().smallestScreenWidthDp < 600;
|
|
if (isSmartphone && Configuration.ORIENTATION_LANDSCAPE == orientation)
|
|
return 0;
|
|
|
|
int id = resources
|
|
.getIdentifier(orientation == Configuration.ORIENTATION_PORTRAIT ? "navigation_bar_height" : "navigation_bar_height_landscape", "dimen", "android");
|
|
if (id > 0)
|
|
return resources.getDimensionPixelSize(id);
|
|
|
|
return 0;
|
|
}
|
|
|
|
public static boolean checkNavigationBarHeight() {
|
|
Resources resources = App.Companion.getContext().getResources();
|
|
int orientation = resources.getConfiguration().orientation;
|
|
if (!hasNavBar(resources)) {
|
|
return false;
|
|
}
|
|
boolean isSmartPhone = resources.getConfiguration().smallestScreenWidthDp < 600;
|
|
if (isSmartPhone && Configuration.ORIENTATION_LANDSCAPE == orientation)
|
|
return false;
|
|
int id = resources
|
|
.getIdentifier(orientation == Configuration.ORIENTATION_PORTRAIT ? "navigation_bar_height" : "navigation_bar_height_landscape", "dimen", "android");
|
|
return id > 0;
|
|
}
|
|
}
|