diff --git a/OsmAnd/res/drawable-hdpi/ic_action_mode_back.png b/OsmAnd/res/drawable-hdpi/ic_action_mode_back.png deleted file mode 100644 index 6c36eae2f4..0000000000 Binary files a/OsmAnd/res/drawable-hdpi/ic_action_mode_back.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xhdpi/ic_action_mode_back.png b/OsmAnd/res/drawable-xhdpi/ic_action_mode_back.png deleted file mode 100644 index 27bdcb79e3..0000000000 Binary files a/OsmAnd/res/drawable-xhdpi/ic_action_mode_back.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxhdpi/ic_action_mode_back.png b/OsmAnd/res/drawable-xxhdpi/ic_action_mode_back.png deleted file mode 100644 index c2d6a542cd..0000000000 Binary files a/OsmAnd/res/drawable-xxhdpi/ic_action_mode_back.png and /dev/null differ diff --git a/OsmAnd/res/drawable-xxxhdpi/ic_action_mode_back.png b/OsmAnd/res/drawable-xxxhdpi/ic_action_mode_back.png deleted file mode 100644 index 70c2040210..0000000000 Binary files a/OsmAnd/res/drawable-xxxhdpi/ic_action_mode_back.png and /dev/null differ diff --git a/OsmAnd/res/drawable/bg_right_menu_dark.xml b/OsmAnd/res/drawable/bg_right_menu_dark.xml new file mode 100644 index 0000000000..8ee6bc688b --- /dev/null +++ b/OsmAnd/res/drawable/bg_right_menu_dark.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/drawable/bg_right_menu_light.xml b/OsmAnd/res/drawable/bg_right_menu_light.xml new file mode 100644 index 0000000000..d277dde63e --- /dev/null +++ b/OsmAnd/res/drawable/bg_right_menu_light.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml b/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml index 4463a2d1a6..ab5e850dd8 100644 --- a/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml +++ b/OsmAnd/res/layout-land/fragment_direction_indication_dialog.xml @@ -20,7 +20,9 @@ android:layout_height="@dimen/dashboard_map_toolbar" android:minHeight="@dimen/dashboard_map_toolbar" app:contentInsetLeft="54dp" - app:contentInsetStart="54dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="72dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> diff --git a/OsmAnd/res/layout/bottom_sheet_item_toolbar_title.xml b/OsmAnd/res/layout/bottom_sheet_item_toolbar_title.xml index dfc6c95148..c4cc113ff6 100644 --- a/OsmAnd/res/layout/bottom_sheet_item_toolbar_title.xml +++ b/OsmAnd/res/layout/bottom_sheet_item_toolbar_title.xml @@ -7,7 +7,9 @@ android:layout_height="@dimen/bottom_sheet_selected_item_title_height" android:minHeight="@dimen/bottom_sheet_selected_item_title_height" osmand:contentInsetLeft="54dp" - osmand:contentInsetStart="54dp"> + osmand:contentInsetStart="54dp" + osmand:contentInsetRight="0dp" + osmand:contentInsetEnd="0dp"> - @@ -31,7 +31,7 @@ android:textColor="@color/gpx_chart_blue" android:textStyle="bold" android:ellipsize="end" - android:singleLine="true"/> + android:maxLines="1"/> + android:maxLines="1"/> @@ -74,7 +74,7 @@ android:textColor="@color/gpx_chart_orange" android:textStyle="bold" android:ellipsize="end" - android:singleLine="true"/> + android:maxLines="1"/> + android:maxLines="1"/> @@ -109,7 +109,7 @@ android:textColor="@color/gpx_chart_green" android:textStyle="bold" android:ellipsize="end" - android:singleLine="true"/> + android:maxLines="1"/> + android:maxLines="1"/> - \ No newline at end of file + \ No newline at end of file diff --git a/OsmAnd/res/layout/dashboard_toolbar.xml b/OsmAnd/res/layout/dashboard_toolbar.xml index c893d6c493..59317ed639 100644 --- a/OsmAnd/res/layout/dashboard_toolbar.xml +++ b/OsmAnd/res/layout/dashboard_toolbar.xml @@ -8,7 +8,9 @@ android:layout_height="@dimen/dashboard_map_toolbar" android:background="@color/app_bar_color_light" app:contentInsetLeft="4dp" - app:contentInsetStart="4dp"> + app:contentInsetStart="4dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="@dimen/settings_divider_margin_start" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"/> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + android:src="@drawable/ic_arrow_back"/> + osmand:contentInsetStart="54dp" + osmand:contentInsetRight="0dp" + osmand:contentInsetEnd="0dp"> + app:contentInsetStart="0dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + android:src="@drawable/ic_arrow_back" /> + app:contentInsetStart="0dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + android:src="@drawable/ic_arrow_back" /> + app:contentInsetStart="72dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp" /> diff --git a/OsmAnd/res/layout/map_context_menu_fragment.xml b/OsmAnd/res/layout/map_context_menu_fragment.xml index 6089fbc5e2..6c87325935 100644 --- a/OsmAnd/res/layout/map_context_menu_fragment.xml +++ b/OsmAnd/res/layout/map_context_menu_fragment.xml @@ -548,7 +548,9 @@ android:layout_height="@dimen/dashboard_map_toolbar" android:background="@color/app_bar_color_light" app:contentInsetLeft="4dp" - app:contentInsetStart="4dp"> + app:contentInsetStart="4dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + android:src="@drawable/ic_arrow_back"/> + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"/> + android:paddingStart="@dimen/list_content_padding" + android:paddingRight="0dp" + android:paddingEnd="0dp"> + + app:contentInsetStart="72dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> diff --git a/OsmAnd/res/layout/profile_preference_toolbar.xml b/OsmAnd/res/layout/profile_preference_toolbar.xml index 45e7db5c82..0460fca8a2 100644 --- a/OsmAnd/res/layout/profile_preference_toolbar.xml +++ b/OsmAnd/res/layout/profile_preference_toolbar.xml @@ -7,6 +7,8 @@ android:minHeight="@dimen/dashboard_map_toolbar" osmand:contentInsetLeft="0dp" osmand:contentInsetStart="0dp" + osmand:contentInsetRight="0dp" + osmand:contentInsetEnd="0dp" osmand:theme="@style/ThemeOverlay.AppCompat.ActionBar"> + osmand:contentInsetStart="0dp" + osmand:contentInsetRight="0dp" + osmand:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> @@ -40,6 +42,8 @@ android:visibility="gone" app:contentInsetLeft="54dp" app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp" tools:visibility="visible"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> diff --git a/OsmAnd/res/layout/search_history_list_item.xml b/OsmAnd/res/layout/search_history_list_item.xml index 3d639352d7..bf93b9ac4c 100644 --- a/OsmAnd/res/layout/search_history_list_item.xml +++ b/OsmAnd/res/layout/search_history_list_item.xml @@ -21,7 +21,9 @@ android:descendantFocusability="blocksDescendants" android:orientation="horizontal" android:paddingLeft="@dimen/list_content_padding" - android:paddingStart="@dimen/list_content_padding"> + android:paddingStart="@dimen/list_content_padding" + android:paddingRight="0dp" + android:paddingEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + app:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> diff --git a/OsmAnd/res/layout/wikipedia_dialog_fragment.xml b/OsmAnd/res/layout/wikipedia_dialog_fragment.xml index dbc5444ea2..37429ac0eb 100644 --- a/OsmAnd/res/layout/wikipedia_dialog_fragment.xml +++ b/OsmAnd/res/layout/wikipedia_dialog_fragment.xml @@ -17,7 +17,9 @@ android:gravity="center_vertical" android:minHeight="@dimen/toolbar_height" osmand:contentInsetLeft="54dp" - osmand:contentInsetStart="54dp"> + osmand:contentInsetStart="54dp" + osmand:contentInsetRight="0dp" + osmand:contentInsetEnd="0dp"> + osmand:contentInsetStart="54dp" + app:contentInsetRight="0dp" + app:contentInsetEnd="0dp"> + diff --git a/OsmAnd/res/values/styles.xml b/OsmAnd/res/values/styles.xml index 8298bc9957..3c0411b035 100644 --- a/OsmAnd/res/values/styles.xml +++ b/OsmAnd/res/values/styles.xml @@ -20,17 +20,19 @@ @string/font_roboto_medium ?android:textColorSecondary @dimen/subHeaderMarginLeft + @dimen/subHeaderMarginLeft @@ -162,7 +164,7 @@ @drawable/context_menu_controller_text_color_light @color/ctx_menu_buttons_divider_light @color/activity_background_color_dark - @drawable/ic_action_mode_back + @drawable/ic_arrow_back @style/WhiteActionMode @color/color_white @drawable/switch_ex_background_light @@ -194,7 +196,7 @@ @color/app_bar_color_light @style/Widget.Styled.ActionBarLight - @drawable/ic_action_mode_back + @drawable/ic_arrow_back @style/WhiteActionMode @color/color_white @style/OverflowMenuButton @@ -430,6 +432,7 @@ @drawable/bg_map_context_menu_dark @drawable/bg_bottom_menu_dark @drawable/bg_left_menu_dark + @drawable/bg_right_menu_dark @drawable/bg_point_editor_view_dark @color/divider_color_dark @color/divider_color_dark @@ -683,7 +686,9 @@ diff --git a/OsmAnd/src/net/osmand/AndroidUtils.java b/OsmAnd/src/net/osmand/AndroidUtils.java index f16cc52e71..be5aa79e6c 100644 --- a/OsmAnd/src/net/osmand/AndroidUtils.java +++ b/OsmAnd/src/net/osmand/AndroidUtils.java @@ -14,6 +14,7 @@ import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Typeface; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ClipDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; @@ -662,6 +663,13 @@ public class AndroidUtils { } } + public static Drawable[] getCompoundDrawables(@NonNull TextView tv){ + if (isSupportRTL()) { + return tv.getCompoundDrawablesRelative(); + } + return tv.getCompoundDrawables(); + } + public static void setPadding(View view, int start, int top, int end, int bottom) { if (isSupportRTL()) { view.setPaddingRelative(start, top, end, bottom); @@ -684,14 +692,67 @@ public class AndroidUtils { } public static int getNavigationIconResId(@NonNull Context ctx) { - return getLayoutDirection(ctx) == ViewCompat.LAYOUT_DIRECTION_RTL ? - R.drawable.ic_arrow_forward : R.drawable.ic_arrow_back; + return isLayoutRtl(ctx) ? R.drawable.ic_arrow_forward : R.drawable.ic_arrow_back; + } + + public static Drawable getDrawableForDirection(@NonNull Context ctx, + @NonNull Drawable drawable) { + return isLayoutRtl(ctx) ? getMirroredDrawable(ctx, drawable) : drawable; + } + + public static Drawable getMirroredDrawable(@NonNull Context ctx, + @NonNull Drawable drawable) { + Bitmap bitmap = drawableToBitmap(drawable); + return new BitmapDrawable(ctx.getResources(), flipBitmapHorizontally(bitmap)); + } + + public static Bitmap drawableToBitmap(Drawable drawable) { + if (drawable instanceof BitmapDrawable) { + BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; + if(bitmapDrawable.getBitmap() != null) { + return bitmapDrawable.getBitmap(); + } + } + + Bitmap bitmap = null; + if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { + bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); + } else { + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + return bitmap; + } + + public static Bitmap flipBitmapHorizontally(Bitmap source) { + Matrix matrix = new Matrix(); + matrix.preScale(-1.0f, 1.0f, source.getWidth() / 2f, source.getHeight() / 2f); + return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); + } + + public static void setTextHorizontalGravity(@NonNull TextView tv, int hGravity) { + if (tv.getContext() != null) { + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(tv.getContext()); + int gravity = Gravity.LEFT; + if (isLayoutRtl && (hGravity == Gravity.START) + || !isLayoutRtl && hGravity == Gravity.END) { + gravity = Gravity.RIGHT; + } + tv.setGravity(gravity); + } } public static boolean isSupportRTL() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1; } + public static boolean isLayoutRtl(Context ctx) { + return isSupportRTL() && getLayoutDirection(ctx) == ViewCompat.LAYOUT_DIRECTION_RTL; + } + public static ArrayList getChildrenViews(ViewGroup vg) { ArrayList result = new ArrayList<>(); for (int i = 0; i < vg.getChildCount(); i++) { diff --git a/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java b/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java index 527c1f6f60..30fa5381c6 100644 --- a/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java +++ b/OsmAnd/src/net/osmand/SecondSplashScreenFragment.java @@ -145,7 +145,7 @@ public class SecondSplashScreenFragment extends BaseOsmAndFragment { } else { elementsPaddingLeft = getNavigationBarWidth(); } - logoLayoutParams.setMargins(0, logoMarginTop, 0, 0); + AndroidUtils.setMargins(logoLayoutParams, 0, logoMarginTop, 0, 0); logo.setPadding(elementsPaddingLeft, 0, elementsPaddingRight, 0); logo.setLayoutParams(logoLayoutParams); view.addView(logo); diff --git a/OsmAnd/src/net/osmand/plus/UiUtilities.java b/OsmAnd/src/net/osmand/plus/UiUtilities.java index 2c554c51da..30da1c855e 100644 --- a/OsmAnd/src/net/osmand/plus/UiUtilities.java +++ b/OsmAnd/src/net/osmand/plus/UiUtilities.java @@ -23,7 +23,6 @@ import android.view.WindowManager; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; -import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.ColorInt; @@ -620,10 +619,10 @@ public class UiUtilities { return new ContextThemeWrapper(context, nightMode ? darkStyle : lightStyle); } - public static void setMargins(View v, int l, int t, int r, int b) { + public static void setMargins(View v, int s, int t, int e, int b) { if (v.getLayoutParams() instanceof ViewGroup.MarginLayoutParams) { ViewGroup.MarginLayoutParams p = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); - p.setMargins(l, t, r, b); + AndroidUtils.setMargins(p, s, t, e, b); v.requestLayout(); } } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 77a0af2fca..8e343fe5ce 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -1951,11 +1951,13 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven if (settings.DO_NOT_USE_ANIMATIONS.get()) { if (event.getAction() == MotionEvent.ACTION_DOWN) { if (drawerLayout.isDrawerOpen(Gravity.START)) { - int width = AndroidUtils.dpToPx(this, 280); - if (event.getRawX() > width) { + int drawerWidth = AndroidUtils.dpToPx(this, 280); + int screenWidth = AndroidUtils.getScreenWidth(MapActivity.this); + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(app); + if ((!isLayoutRtl && event.getRawX() > drawerWidth) + || (isLayoutRtl && event.getRawX() <= screenWidth - drawerWidth)) { closeDrawer(); } - } } } diff --git a/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java b/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java index 530c769491..0c64258825 100644 --- a/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java +++ b/OsmAnd/src/net/osmand/plus/activities/actions/StartGPSStatus.java @@ -117,7 +117,7 @@ public class StartGPSStatus extends OsmAndAction { final AppCompatCheckBox cb = new AppCompatCheckBox(activity); cb.setText(R.string.shared_string_remember_my_choice); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - lp.setMargins(dp24, dp8, dp8, dp24); + AndroidUtils.setMargins(lp, dp24, dp8, dp8, dp24); cb.setLayoutParams(lp); cb.setPadding(dp8, 0, 0, 0); int textColorPrimary = ContextCompat.getColor(activity, isNightMode() ? R.color.text_color_primary_dark : R.color.text_color_primary_light); diff --git a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java index 1e0b10ee31..343594a990 100644 --- a/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/base/ContextMenuFragment.java @@ -287,7 +287,8 @@ public abstract class ContextMenuFragment extends BaseOsmAndFragment { currentMenuState = MenuState.FULL_SCREEN; if (isSingleFragment()) { final TypedValue typedValueAttr = new TypedValue(); - mapActivity.getTheme().resolveAttribute(R.attr.left_menu_view_bg, typedValueAttr, true); + int bgAttrId = AndroidUtils.isLayoutRtl(app) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + mapActivity.getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); mainView.setBackgroundResource(typedValueAttr.resourceId); mainView.setLayoutParams(new FrameLayout.LayoutParams(getLandscapeWidth(), ViewGroup.LayoutParams.MATCH_PARENT)); } else { diff --git a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java index cba81e6113..c4290f8355 100644 --- a/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/chooseplan/ChoosePlanDialogFragment.java @@ -16,6 +16,7 @@ import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; @@ -187,7 +188,9 @@ public abstract class ChoosePlanDialogFragment extends BaseOsmAndDialogFragment } View view = inflate(R.layout.purchase_dialog_fragment, container); - view.findViewById(R.id.button_back).setOnClickListener(new OnClickListener() { + ImageView buttonBack = view.findViewById(R.id.button_back); + buttonBack.setImageResource(AndroidUtils.getNavigationIconResId(ctx)); + buttonBack.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { dismiss(); diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashSearchFragment.java b/OsmAnd/src/net/osmand/plus/dashboard/DashSearchFragment.java index 71ae75da3b..322521a880 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashSearchFragment.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashSearchFragment.java @@ -29,7 +29,8 @@ public class DashSearchFragment extends DashBaseFragment { View view = getActivity().getLayoutInflater().inflate(R.layout.dash_search_fragment, container, false); TextView searchFor = (TextView) view.findViewById(R.id.search_for); - searchFor.setCompoundDrawablesWithIntrinsicBounds(getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_action_search_dark), null, null, null); + AndroidUtils.setCompoundDrawablesWithIntrinsicBounds(searchFor, + getMyApplication().getUIUtilities().getThemedIcon(R.drawable.ic_action_search_dark), null, null, null); searchFor.setCompoundDrawablePadding(AndroidUtils.dpToPx(getActivity(), 16f)); view.findViewById(R.id.search_card).setOnClickListener(new View.OnClickListener() { diff --git a/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java b/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java index 243750ecd8..fca947ca37 100644 --- a/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java +++ b/OsmAnd/src/net/osmand/plus/dashboard/DashboardOnMap.java @@ -395,9 +395,9 @@ public class DashboardOnMap implements ObservableScrollViewCallbacks, IRouteInfo private FrameLayout.LayoutParams getActionButtonLayoutParams(int btnSizePx) { int topPadPx = mapActivity.getResources().getDimensionPixelSize(R.dimen.dashboard_map_top_padding); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(btnSizePx, btnSizePx); - int marginRight = btnSizePx / 4; - params.setMargins(0, landscape ? 0 : topPadPx - 2 * btnSizePx, marginRight, landscape ? marginRight : 0); - params.gravity = landscape ? Gravity.BOTTOM | Gravity.RIGHT : Gravity.TOP | Gravity.RIGHT; + int marginEnd = btnSizePx / 4; + AndroidUtils.setMargins(params, 0, landscape ? 0 : topPadPx - 2 * btnSizePx, marginEnd, landscape ? marginEnd : 0); + params.gravity = landscape ? Gravity.BOTTOM | Gravity.END : Gravity.TOP | Gravity.END; return params; } diff --git a/OsmAnd/src/net/osmand/plus/dialogs/HelpArticleDialogFragment.java b/OsmAnd/src/net/osmand/plus/dialogs/HelpArticleDialogFragment.java index 996ed1e80f..06a272263d 100644 --- a/OsmAnd/src/net/osmand/plus/dialogs/HelpArticleDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/dialogs/HelpArticleDialogFragment.java @@ -14,6 +14,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.Toolbar; import androidx.fragment.app.DialogFragment; +import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; @@ -58,6 +59,7 @@ public class HelpArticleDialogFragment extends DialogFragment { final View view = inflater.inflate(R.layout.fragment_help_article, container, false); Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar); + toolbar.setNavigationIcon(AndroidUtils.getNavigationIconResId(getContext())); toolbar.setNavigationContentDescription(R.string.access_shared_string_navigate_up); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/liveupdates/SubscriptionFragment.java b/OsmAnd/src/net/osmand/plus/liveupdates/SubscriptionFragment.java index c51e62c988..7f8b0e4abc 100644 --- a/OsmAnd/src/net/osmand/plus/liveupdates/SubscriptionFragment.java +++ b/OsmAnd/src/net/osmand/plus/liveupdates/SubscriptionFragment.java @@ -2,6 +2,7 @@ package net.osmand.plus.liveupdates; import android.app.Activity; import android.app.ProgressDialog; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -98,7 +99,7 @@ public class SubscriptionFragment extends BaseOsmAndDialogFragment implements In @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - + OsmandApplication app = getMyApplication(); String userName = settings.BILLING_USER_NAME.get(); String email = settings.BILLING_USER_EMAIL.get(); String countryDownloadName = settings.BILLING_USER_COUNTRY_DOWNLOAD_NAME.get(); @@ -122,7 +123,8 @@ public class SubscriptionFragment extends BaseOsmAndDialogFragment implements In View view = inflater.inflate(R.layout.subscription_fragment, container, false); ImageButton closeButton = (ImageButton) view.findViewById(R.id.closeButton); - closeButton.setImageDrawable(getMyApplication().getUIUtilities().getIcon(R.drawable.ic_action_mode_back)); + Drawable icBack = app.getUIUtilities().getIcon(AndroidUtils.getNavigationIconResId(app)); + closeButton.setImageDrawable(icBack); closeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java index ab8f716b4f..2ac283d347 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenuFragment.java @@ -320,7 +320,8 @@ public class MapContextMenuFragment extends BaseOsmAndFragment implements Downlo if (menu.isLandscapeLayout()) { final TypedValue typedValueAttr = new TypedValue(); - mapActivity.getTheme().resolveAttribute(R.attr.left_menu_view_bg, typedValueAttr, true); + int bgAttrId = AndroidUtils.isLayoutRtl(app) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + mapActivity.getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); mainView.setBackgroundResource(typedValueAttr.resourceId); mainView.setLayoutParams(new FrameLayout.LayoutParams(menu.getLandscapeWidthPx(), ViewGroup.LayoutParams.MATCH_PARENT)); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java index 12ed950536..aa2d5de59b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuBuilder.java @@ -1112,7 +1112,7 @@ public class MenuBuilder { } else { button.setTextColor(ContextCompat.getColor(context, light ? R.color.text_color_primary_light : R.color.text_color_primary_dark)); } - button.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + button.setGravity(Gravity.START | Gravity.CENTER_VERTICAL); button.setSingleLine(singleLine); button.setEllipsize(TextUtils.TruncateAt.END); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/TransportRouteController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/TransportRouteController.java index 0b08118495..585ba61f62 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/TransportRouteController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/TransportRouteController.java @@ -6,6 +6,7 @@ import android.view.View.OnClickListener; import androidx.annotation.NonNull; +import net.osmand.AndroidUtils; import net.osmand.binary.OsmandOdb.TransportRouteStop; import net.osmand.data.LatLon; import net.osmand.data.PointDescription; @@ -29,8 +30,10 @@ public class TransportRouteController extends MenuController { super(new MenuBuilder(mapActivity), pointDescription, mapActivity); this.transportRoute = transportRoute; builder.setShowOnlinePhotos(false); + int navigationIconResId = AndroidUtils.getNavigationIconResId(mapActivity); toolbarController = new ContextMenuToolbarController(this); toolbarController.setTitle(getNameStr()); + toolbarController.setBackBtnIconIds(navigationIconResId, navigationIconResId); toolbarController.setOnBackButtonClickListener(new OnClickListener() { @Override public void onClick(View v) { @@ -66,7 +69,6 @@ public class TransportRouteController extends MenuController { } }; leftTitleButtonController.caption = mapActivity.getString(R.string.shared_string_previous); - leftTitleButtonController.leftIconId = R.drawable.ic_arrow_back; rightTitleButtonController = new TitleButtonController() { @Override @@ -78,7 +80,14 @@ public class TransportRouteController extends MenuController { } }; rightTitleButtonController.caption = mapActivity.getString(R.string.shared_string_next); - rightTitleButtonController.rightIconId = R.drawable.ic_arrow_forward; + + if (AndroidUtils.isLayoutRtl(mapActivity)) { + leftTitleButtonController.rightIconId = R.drawable.ic_arrow_forward; + rightTitleButtonController.leftIconId = R.drawable.ic_arrow_back; + } else { + leftTitleButtonController.leftIconId = R.drawable.ic_arrow_back; + rightTitleButtonController.rightIconId = R.drawable.ic_arrow_forward; + } } @NonNull diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java index 1ee6d9ee03..fad7483291 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/TrackDetailsMenuFragment.java @@ -3,6 +3,7 @@ package net.osmand.plus.mapcontextmenu.other; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; +import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -195,7 +196,10 @@ public class TrackDetailsMenuFragment extends BaseOsmAndFragment { if (!landscapeLayout) { AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); } else { - AndroidUtils.setBackground(ctx, mainView, nightMode, R.drawable.bg_left_menu_light, R.drawable.bg_left_menu_dark); + final TypedValue typedValueAttr = new TypedValue(); + int bgAttrId = AndroidUtils.isLayoutRtl(ctx) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + ctx.getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); + mainView.setBackgroundResource(typedValueAttr.resourceId); } AndroidUtils.setTextPrimaryColor(ctx, (TextView) mainView.findViewById(R.id.y_axis_title), nightMode); diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java index fd63e7bd3e..993c5c1d93 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/MapMarkerSelectionFragment.java @@ -1,6 +1,7 @@ package net.osmand.plus.mapmarkers; import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -81,7 +82,8 @@ public class MapMarkerSelectionFragment extends BaseOsmAndDialogFragment { View view = inflater.inflate(R.layout.map_marker_selection_fragment, container, false); ImageButton closeButton = (ImageButton) view.findViewById(R.id.closeButton); - closeButton.setImageDrawable(getMyApplication().getUIUtilities().getIcon(R.drawable.ic_action_mode_back)); + Drawable icBack = app.getUIUtilities().getIcon(AndroidUtils.getNavigationIconResId(app)); + closeButton.setImageDrawable(icBack); closeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java index 6c23918c90..6446258faa 100644 --- a/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapmarkers/PlanRouteFragment.java @@ -200,8 +200,9 @@ public class PlanRouteFragment extends BaseOsmAndFragment implements OsmAndLocat } }); + int navigationIconResId = AndroidUtils.getNavigationIconResId(mapActivity); toolbarController = new PlanRouteToolbarController(); - toolbarController.setBackBtnIconIds(R.drawable.ic_action_mode_back, R.drawable.ic_action_mode_back); + toolbarController.setBackBtnIconIds(navigationIconResId, navigationIconResId); toolbarController.setTitle(getString(R.string.plan_route)); toolbarController.setOnBackButtonClickListener(new View.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java index c084448d7d..1299018bda 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/MeasurementToolFragment.java @@ -296,7 +296,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { undoBtn = ((ImageButton) mainView.findViewById(R.id.undo_point_button)); redoBtn = ((ImageButton) mainView.findViewById(R.id.redo_point_button)); - undoBtn.setImageDrawable(getContentIcon(R.drawable.ic_action_undo_dark)); + Drawable undoDrawable = getContentIcon(R.drawable.ic_action_undo_dark); + undoBtn.setImageDrawable(AndroidUtils.getDrawableForDirection(mapActivity, undoDrawable)); undoBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -316,7 +317,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { } }); - redoBtn.setImageDrawable(getContentIcon(R.drawable.ic_action_redo_dark)); + Drawable redoDrawable = getContentIcon(R.drawable.ic_action_redo_dark); + redoBtn.setImageDrawable(AndroidUtils.getDrawableForDirection(mapActivity, redoDrawable)); redoBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -394,7 +396,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { toolBarController = new MeasurementToolBarController(newGpxData); if (editingCtx.getSelectedPointPosition() != -1) { - toolBarController.setBackBtnIconIds(R.drawable.ic_action_mode_back, R.drawable.ic_action_mode_back); + int navigationIconResId = AndroidUtils.getNavigationIconResId(mapActivity); + toolBarController.setBackBtnIconIds(navigationIconResId, navigationIconResId); } else { toolBarController.setBackBtnIconIds(R.drawable.ic_action_remove_dark, R.drawable.ic_action_remove_dark); } @@ -971,7 +974,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { private void switchMovePointMode(boolean enable) { if (enable) { - toolBarController.setBackBtnIconIds(R.drawable.ic_action_mode_back, R.drawable.ic_action_mode_back); + int navigationIconResId = AndroidUtils.getNavigationIconResId(getMapActivity()); + toolBarController.setBackBtnIconIds(navigationIconResId, navigationIconResId); } else { toolBarController.setBackBtnIconIds(R.drawable.ic_action_remove_dark, R.drawable.ic_action_remove_dark); } @@ -990,7 +994,8 @@ public class MeasurementToolFragment extends BaseOsmAndFragment { private void switchAddPointBeforeAfterMode(boolean enable) { if (enable) { - toolBarController.setBackBtnIconIds(R.drawable.ic_action_mode_back, R.drawable.ic_action_mode_back); + int navigationIconResId = AndroidUtils.getNavigationIconResId(getMapActivity()); + toolBarController.setBackBtnIconIds(navigationIconResId, navigationIconResId); } else { toolBarController.setBackBtnIconIds(R.drawable.ic_action_remove_dark, R.drawable.ic_action_remove_dark); } diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/RecyclerViewFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/RecyclerViewFragment.java index 771e641079..fca7c80377 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/RecyclerViewFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/RecyclerViewFragment.java @@ -57,7 +57,8 @@ public class RecyclerViewFragment extends Fragment { final int backgroundColor = ContextCompat.getColor(getActivity(), nightMode ? R.color.activity_background_color_dark : R.color.activity_background_color_light); final TypedValue typedValueAttr = new TypedValue(); - getActivity().getTheme().resolveAttribute(R.attr.left_menu_view_bg, typedValueAttr, true); + int bgAttrId = AndroidUtils.isLayoutRtl(getActivity()) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + getActivity().getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); parent = new FrameLayout(mapActivity); parent.setLayoutParams(new LayoutParams(width + AndroidUtils.dpToPx(getActivity(), 16), height)); diff --git a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java index b2498bda2f..a3a1741192 100644 --- a/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/measurementtool/SaveAsNewTrackBottomSheetDialogFragment.java @@ -1,5 +1,6 @@ package net.osmand.plus.measurementtool; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.view.ContextThemeWrapper; @@ -7,6 +8,8 @@ import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; +import net.osmand.AndroidUtils; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.base.MenuBottomSheetDialogFragment; import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; @@ -26,6 +29,11 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial @Override public void createMenuItems(Bundle savedInstanceState) { + OsmandApplication app = getMyApplication(); + if (app == null) { + return; + } + items.add(new TitleItem(getString(R.string.shared_string_save_as_gpx))); items.add(new ShortDescriptionItem(getString(R.string.measurement_tool_save_as_new_track_descr))); @@ -37,12 +45,16 @@ public class SaveAsNewTrackBottomSheetDialogFragment extends MenuBottomSheetDial final ImageView routePointImage = (ImageView) imagesRow.findViewById(R.id.route_point_image); final ImageView lineImage = (ImageView) imagesRow.findViewById(R.id.line_image); - routePointImage.setImageResource(nightMode + Drawable routePointDrawable = app.getUIUtilities().getIcon(nightMode ? R.drawable.img_help_trip_route_points_night : R.drawable.img_help_trip_route_points_day); - lineImage.setImageResource(nightMode + Drawable lineDrawable = app.getUIUtilities().getIcon(nightMode ? R.drawable.img_help_trip_track_night : R.drawable.img_help_trip_track_day); + if (routePointDrawable != null && lineDrawable != null) { + routePointImage.setImageDrawable(AndroidUtils.getDrawableForDirection(app, routePointDrawable)); + lineImage.setImageDrawable(AndroidUtils.getDrawableForDirection(app, lineDrawable)); + } routePointImage.setOnClickListener(saveAsRoutePointOnClickListener); lineImage.setOnClickListener(saveAsLineOnClickListener); diff --git a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java index cd92b36ab9..8dbd3d3d0f 100644 --- a/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java +++ b/OsmAnd/src/net/osmand/plus/monitoring/OsmandMonitoringPlugin.java @@ -573,9 +573,9 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { cb.setTextColor(textColorPrimary); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - lp.setMargins(dp24, dp8, dp24, 0); + AndroidUtils.setMargins(lp, dp24, dp8, dp24, 0); cb.setLayoutParams(lp); - cb.setPadding(dp8, 0, 0, 0); + AndroidUtils.setPadding(cb, dp8, 0, 0, 0); cb.setChecked(!choice.value); cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override @@ -590,7 +590,7 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { if (showTrackSelection) { View divider = new View(uiCtx); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, AndroidUtils.dpToPx(uiCtx, 1f)); - lp.setMargins(0, dp8 * 2, 0, 0); + AndroidUtils.setMargins(lp, 0, dp8 * 2, 0, 0); divider.setLayoutParams(lp); divider.setBackgroundColor(uiCtx.getResources().getColor(nightMode ? R.color.divider_color_dark : R.color.divider_color_light)); ll.addView(divider); @@ -600,9 +600,9 @@ public class OsmandMonitoringPlugin extends OsmandPlugin { cb.setTextColor(textColorPrimary); lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); - lp.setMargins(dp24, dp8 * 2, dp24, 0); + AndroidUtils.setMargins(lp, dp24, dp8 * 2, dp24, 0); cb.setLayoutParams(lp); - cb.setPadding(dp8, 0, 0, 0); + AndroidUtils.setPadding(cb, dp8, 0, 0, 0); cb.setChecked(app.getSelectedGpxHelper().getSelectedCurrentRecordingTrack() != null); cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { diff --git a/OsmAnd/src/net/osmand/plus/osmedit/AdvancedEditPoiFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/AdvancedEditPoiFragment.java index e640f9da50..541df2c7f6 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/AdvancedEditPoiFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/AdvancedEditPoiFragment.java @@ -7,6 +7,7 @@ import android.text.Editable; import android.text.InputFilter; import android.text.TextWatcher; import android.view.ContextThemeWrapper; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnFocusChangeListener; @@ -21,6 +22,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.osm.AbstractPoiType; import net.osmand.osm.MapPoiTypes; @@ -202,6 +204,7 @@ public class AdvancedEditPoiFragment extends BaseOsmAndFragment .inflate(R.layout.poi_tag_list_item, null, false); final AutoCompleteTextView tagEditText = (AutoCompleteTextView) convertView.findViewById(R.id.tagEditText); + AndroidUtils.setTextHorizontalGravity(tagEditText, Gravity.START); ImageButton deleteItemImageButton = (ImageButton) convertView.findViewById(R.id.deleteItemImageButton); deleteItemImageButton.setImageDrawable(deleteDrawable); @@ -215,6 +218,7 @@ public class AdvancedEditPoiFragment extends BaseOsmAndFragment }); final AutoCompleteTextView valueEditText = (AutoCompleteTextView) convertView.findViewById(R.id.valueEditText); + AndroidUtils.setTextHorizontalGravity(valueEditText, Gravity.START); valueEditText.setFilters(new InputFilter[] { new InputFilter.LengthFilter(AMENITY_TEXT_LENGTH) }); diff --git a/OsmAnd/src/net/osmand/plus/osmedit/BasicEditPoiFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/BasicEditPoiFragment.java index c9455a9c15..dcf4846f7f 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/BasicEditPoiFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/BasicEditPoiFragment.java @@ -10,6 +10,7 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; import android.view.ContextThemeWrapper; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -24,6 +25,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.osm.edit.OSMSettings; import net.osmand.plus.R; @@ -104,6 +106,11 @@ public class BasicEditPoiFragment extends BaseOsmAndFragment phoneEditText.setFilters(lengthLimit); webSiteEditText.setFilters(lengthLimit); descriptionEditText.setFilters(lengthLimit); + AndroidUtils.setTextHorizontalGravity(streetEditText, Gravity.START); + AndroidUtils.setTextHorizontalGravity(houseNumberEditText, Gravity.START); + AndroidUtils.setTextHorizontalGravity(phoneEditText, Gravity.START); + AndroidUtils.setTextHorizontalGravity(webSiteEditText, Gravity.START); + AndroidUtils.setTextHorizontalGravity(descriptionEditText, Gravity.START); Button addOpeningHoursButton = (Button) view.findViewById(R.id.addOpeningHoursButton); addOpeningHoursButton.setOnClickListener(new View.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java index b4c376f0cd..ce527c5ca0 100644 --- a/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/osmedit/EditPoiDialogFragment.java @@ -16,6 +16,7 @@ import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.util.TypedValue; +import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -247,6 +248,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { }); EditText poiNameEditText = (EditText) view.findViewById(R.id.poiNameEditText); + AndroidUtils.setTextHorizontalGravity(poiNameEditText, Gravity.START); poiNameEditText.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -273,6 +275,7 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { AndroidUtils.showSoftKeyboard(poiNameEditText); poiTypeTextInputLayout = (TextInputLayout) view.findViewById(R.id.poiTypeTextInputLayout); poiTypeEditText = (AutoCompleteTextView) view.findViewById(R.id.poiTypeEditText); + AndroidUtils.setTextHorizontalGravity(poiTypeEditText, Gravity.START); poiTypeEditText.setText(editPoiData.getPoiTypeString()); poiTypeEditText.addTextChangedListener(new TextWatcher() { @Override @@ -301,12 +304,26 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { poiTypeEditText.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View v, MotionEvent event) { + Context ctx = getContext(); + if (ctx == null) { + return false; + } + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(getContext()); final EditText editText = (EditText) v; - final int DRAWABLE_RIGHT = 2; if (event.getAction() == MotionEvent.ACTION_UP) { - if (event.getX() >= (editText.getRight() - - editText.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width() - - editText.getPaddingRight())) { + final int DRAWABLE_END = 2; + int expandBtnWidth = AndroidUtils.getCompoundDrawables(editText)[DRAWABLE_END].getBounds().width(); + + boolean expandButtonPressed = false; + if (isLayoutRtl) { + expandButtonPressed = event.getX() <= (editText.getLeft() + expandBtnWidth + + editText.getPaddingLeft()); + } else { + expandButtonPressed = event.getX() >= (editText.getRight() - expandBtnWidth + - editText.getPaddingRight()); + } + + if (expandButtonPressed) { PoiCategory category = editPoiData.getPoiCategory(); if (category != null) { PoiSubTypeDialogFragment dialogFragment = @@ -319,7 +336,6 @@ public class EditPoiDialogFragment extends BaseOsmAndDialogFragment { }); dialogFragment.show(getChildFragmentManager(), "PoiSubTypeDialogFragment"); } - return true; } } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java index 77f4a1d442..4ecc22f17b 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/ChooseRouteFragment.java @@ -147,7 +147,8 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe solidToolbarView.setLayoutParams(new FrameLayout.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT)); solidToolbarView.setVisibility(View.VISIBLE); final TypedValue typedValueAttr = new TypedValue(); - mapActivity.getTheme().resolveAttribute(R.attr.left_menu_view_bg, typedValueAttr, true); + int bgAttrId = AndroidUtils.isLayoutRtl(mapActivity) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + mapActivity.getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); view.findViewById(R.id.pager_container).setBackgroundResource(typedValueAttr.resourceId); view.setLayoutParams(new FrameLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.dashboard_land_width), ViewGroup.LayoutParams.MATCH_PARENT)); } @@ -327,11 +328,11 @@ public class ChooseRouteFragment extends BaseOsmAndFragment implements ContextMe active ? R.drawable.pages_active_light : R.drawable.pages_inactive_light, active ? R.drawable.pages_active_dark : R.drawable.pages_inactive_dark); if (i == 0) { - layoutParams.setMargins(itemMargin, 0, itemPadding, 0); + AndroidUtils.setMargins(layoutParams, itemMargin, 0, itemPadding, 0); } else if (i == routesCount - 1) { - layoutParams.setMargins(0, 0, itemMargin, 0); + AndroidUtils.setMargins(layoutParams, 0, 0, itemMargin, 0); } else { - layoutParams.setMargins(0, 0, itemPadding, 0); + AndroidUtils.setMargins(layoutParams, 0, 0, itemPadding, 0); } itemView.setLayoutParams(layoutParams); pagesView.addView(itemView); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java index e16c872c91..1358390802 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenu.java @@ -1004,7 +1004,7 @@ public class MapRouteInfoMenu implements IRouteInformationListener, CardListener optionsTitle.setVisibility(View.VISIBLE); endPadding += AndroidUtils.getTextWidth(app.getResources().getDimensionPixelSize(R.dimen.text_button_text_size), app.getString(R.string.shared_string_options)); } - if (AndroidUtils.getLayoutDirection(app) == View.LAYOUT_DIRECTION_RTL) { + if (AndroidUtils.isLayoutRtl(app)) { optionsContainer.setPadding(endPadding, optionsContainer.getPaddingTop(), optionsContainer.getPaddingRight(), optionsContainer.getPaddingBottom()); } else { // LTR optionsContainer.setPadding(optionsContainer.getPaddingLeft(), optionsContainer.getPaddingTop(), endPadding, optionsContainer.getPaddingBottom()); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java index b5e610c60b..fb59e8e148 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/MapRouteInfoMenuFragment.java @@ -128,10 +128,10 @@ public class MapRouteInfoMenuFragment extends ContextMenuFragment { int widthNoShadow = getLandscapeNoShadowWidth(); modesLayoutToolbar.setLayoutParams(new FrameLayout.LayoutParams(widthNoShadow, ViewGroup.LayoutParams.WRAP_CONTENT)); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(widthNoShadow, ViewGroup.LayoutParams.WRAP_CONTENT); - params.gravity = Gravity.BOTTOM; + params.gravity = Gravity.BOTTOM|Gravity.START; view.findViewById(R.id.control_buttons).setLayoutParams(params); View appModesView = view.findViewById(R.id.app_modes); - appModesView.setPadding(0, 0, appModesView.getPaddingRight(), 0); + AndroidUtils.setPadding(appModesView, 0, 0, appModesView.getPaddingRight(), 0); } } return view; diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java index a645fa64a5..f0a0550400 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/RouteDetailsFragment.java @@ -186,7 +186,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT view.findViewById(getBottomScrollViewId()).setBackgroundDrawable(null); LinearLayout cardsContainer = getCardsContainer(); FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) cardsContainer.getLayoutParams(); - layoutParams.setMargins(pageMarginPx, 0, pageMarginPx, 0); + AndroidUtils.setMargins(layoutParams, pageMarginPx, 0, pageMarginPx, 0); cardsContainer.setLayoutParams(layoutParams); updateCardsLayout(); } @@ -459,7 +459,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ImageView routeLine = new ImageView(view.getContext()); FrameLayout.LayoutParams routeLineParams = new FrameLayout.LayoutParams(dpToPx(8f), ViewGroup.LayoutParams.MATCH_PARENT); routeLineParams.gravity = Gravity.START; - routeLineParams.setMargins(dpToPx(24), dpToPx(14), dpToPx(22), dpToPx(36)); + AndroidUtils.setMargins(routeLineParams, dpToPx(24), dpToPx(14), dpToPx(22), dpToPx(36)); routeLine.setLayoutParams(routeLineParams); int bgColor = transportStopRoute.getColor(app, isNightMode()); routeLine.setBackgroundColor(bgColor); @@ -595,7 +595,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT private View createImagesContainer(@NonNull Context context) { LinearLayout imagesContainer = new LinearLayout(context); FrameLayout.LayoutParams imagesContainerParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT); - imagesContainer.setPadding(dpToPx(16), dpToPx(12), dpToPx(24), 0); + AndroidUtils.setPadding(imagesContainer, dpToPx(16), dpToPx(12), dpToPx(24), 0); imagesContainer.setOrientation(LinearLayout.VERTICAL); imagesContainer.setLayoutParams(imagesContainerParams); return imagesContainer; @@ -745,7 +745,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ImageView walkLineImage = new ImageView(container.getContext()); walkLineImage.setImageDrawable(app.getUIUtilities().getIcon(R.drawable.walk_route_item_light)); LinearLayout.LayoutParams walkImageLayoutParams = new LinearLayout.LayoutParams(dpToPx(10), dpToPx(14)); - walkImageLayoutParams.setMargins(dpToPx(7), dpToPx(6), 0, dpToPx(6)); + AndroidUtils.setMargins(walkImageLayoutParams, dpToPx(7), dpToPx(6), 0, dpToPx(6)); walkLineImage.setLayoutParams(walkImageLayoutParams); container.addView(walkLineImage); } @@ -862,12 +862,12 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT LinearLayout llIconCollapse = new LinearLayout(view.getContext()); llIconCollapse.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, dpToPx(48f))); llIconCollapse.setOrientation(LinearLayout.HORIZONTAL); - llIconCollapse.setGravity(Gravity.CENTER_VERTICAL); + llIconCollapse.setGravity(Gravity.CENTER_VERTICAL|Gravity.START); ll.addView(llIconCollapse); LinearLayout.LayoutParams llIconCollapseParams = new LinearLayout.LayoutParams(dpToPx(24f), dpToPx(24f)); - llIconCollapseParams.setMargins(0, dpToPx(12f), 0, dpToPx(12f)); - llIconCollapseParams.gravity = Gravity.CENTER_VERTICAL; + AndroidUtils.setMargins(llIconCollapseParams,0, dpToPx(12f), 0, dpToPx(12f)); + llIconCollapseParams.gravity = Gravity.CENTER_VERTICAL|Gravity.START; iconViewCollapse.setLayoutParams(llIconCollapseParams); iconViewCollapse.setScaleType(ImageView.ScaleType.CENTER_INSIDE); iconViewCollapse.setImageDrawable(getCollapseIcon(collapsableView.getContenView().getVisibility() == View.GONE)); @@ -934,13 +934,13 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ImageView iconView = new ImageView(view.getContext()); iconView.setImageDrawable(icon); FrameLayout.LayoutParams imageViewLayoutParams = new FrameLayout.LayoutParams(dpToPx(28), dpToPx(28)); - imageViewLayoutParams.gravity = Gravity.TOP; + imageViewLayoutParams.gravity = Gravity.TOP|Gravity.START; iconView.setLayoutParams(imageViewLayoutParams); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - imageViewLayoutParams.setMargins(dpToPx(14), dpToPx(8), dpToPx(22), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(14), dpToPx(8), dpToPx(22), 0); iconView.setBackgroundResource(R.drawable.border_round_solid_light); - iconView.setPadding(dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); + AndroidUtils.setPadding(iconView, dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); baseItemView.addView(iconView); } @@ -957,9 +957,9 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT TextView timeView = new TextView(view.getContext()); FrameLayout.LayoutParams timeViewParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); timeViewParams.gravity = Gravity.END | Gravity.TOP; - timeViewParams.setMargins(0, dpToPx(8), 0, 0); + AndroidUtils.setMargins(timeViewParams,0, dpToPx(8), 0, 0); timeView.setLayoutParams(timeViewParams); - timeView.setPadding(0, 0, dpToPx(16), 0); + AndroidUtils.setPadding(timeView,0, 0, dpToPx(16), 0); timeView.setTextSize(16); timeView.setTextColor(getMainFontColor()); @@ -1008,7 +1008,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT View routeBadge = createRouteBadge(mapActivity, transportStopRoute); LinearLayout.LayoutParams routeBadgeParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - routeBadgeParams.setMargins(0, dpToPx(6), 0, dpToPx(8)); + AndroidUtils.setMargins(routeBadgeParams, 0, dpToPx(6), 0, dpToPx(8)); routeBadge.setLayoutParams(routeBadgeParams); llText.addView(routeBadge); @@ -1045,13 +1045,13 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ImageView iconView = new ImageView(view.getContext()); iconView.setImageDrawable(icon); FrameLayout.LayoutParams imageViewLayoutParams = new FrameLayout.LayoutParams(dpToPx(28), dpToPx(28)); - imageViewLayoutParams.gravity = Gravity.TOP; + imageViewLayoutParams.gravity = Gravity.TOP|Gravity.START; iconView.setLayoutParams(imageViewLayoutParams); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - imageViewLayoutParams.setMargins(dpToPx(14), dpToPx(8), dpToPx(22), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(14), dpToPx(8), dpToPx(22), 0); iconView.setBackgroundResource(R.drawable.border_round_solid_light); - iconView.setPadding(dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); + AndroidUtils.setPadding(iconView, dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); baseItemView.addView(iconView); } @@ -1068,9 +1068,9 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT TextView timeView = new TextView(view.getContext()); FrameLayout.LayoutParams timeViewParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); timeViewParams.gravity = Gravity.END | Gravity.TOP; - timeViewParams.setMargins(0, dpToPx(8), 0, 0); + AndroidUtils.setMargins(timeViewParams, 0, dpToPx(8), 0, 0); timeView.setLayoutParams(timeViewParams); - timeView.setPadding(0, 0, dpToPx(16), 0); + AndroidUtils.setPadding(timeView, 0, 0, dpToPx(16), 0); timeView.setTextSize(16); timeView.setTextColor(getMainFontColor()); @@ -1127,16 +1127,16 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT Drawable icon = getPaintedContentIcon(R.drawable.ic_action_pedestrian_dark, getActiveColor()); ImageView iconView = new ImageView(view.getContext()); - iconView.setImageDrawable(icon); + iconView.setImageDrawable(AndroidUtils.getDrawableForDirection(view.getContext(), icon)); FrameLayout.LayoutParams imageViewLayoutParams = new FrameLayout.LayoutParams(dpToPx(24), dpToPx(24)); - imageViewLayoutParams.gravity = imagesContainer != null ? Gravity.TOP : Gravity.CENTER_VERTICAL; + imageViewLayoutParams.gravity = Gravity.START| (imagesContainer != null ? Gravity.TOP : Gravity.CENTER_VERTICAL); iconView.setLayoutParams(imageViewLayoutParams); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); if (imagesContainer != null) { imagesContainer.addView(iconView); } else { - imageViewLayoutParams.setMargins(dpToPx(16), 0, dpToPx(24), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(16), 0, dpToPx(24), 0); baseItemView.addView(iconView); } @@ -1183,7 +1183,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT if (imagesContainer != null) { imagesContainer.addView(iconView); } else { - imageViewLayoutParams.setMargins(dpToPx(16), 0, dpToPx(24), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(16), 0, dpToPx(24), 0); baseItemView.addView(iconView); } } @@ -1197,9 +1197,9 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT TextView timeView = new TextView(view.getContext()); FrameLayout.LayoutParams timeViewParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); timeViewParams.gravity = Gravity.END | Gravity.TOP; - timeViewParams.setMargins(0, dpToPx(8), 0, 0); + AndroidUtils.setMargins(timeViewParams, 0, dpToPx(8), 0, 0); timeView.setLayoutParams(timeViewParams); - timeView.setPadding(0, 0, dpToPx(16), 0); + AndroidUtils.setPadding(timeView, 0, 0, dpToPx(16), 0); timeView.setTextSize(16); timeView.setTextColor(getMainFontColor()); @@ -1247,7 +1247,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT if (imagesContainer != null) { imagesContainer.addView(iconView); } else { - imageViewLayoutParams.setMargins(dpToPx(16), 0, dpToPx(24), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(16), 0, dpToPx(24), 0); baseItemView.addView(iconView); } @@ -1271,9 +1271,9 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT TextView timeView = new TextView(view.getContext()); FrameLayout.LayoutParams timeViewParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); timeViewParams.gravity = Gravity.END | Gravity.TOP; - timeViewParams.setMargins(0, dpToPx(8), 0, 0); + AndroidUtils.setMargins(timeViewParams, 0, dpToPx(8), 0, 0); timeView.setLayoutParams(timeViewParams); - timeView.setPadding(0, 0, dpToPx(16), 0); + AndroidUtils.setPadding(timeView, 0, 0, dpToPx(16), 0); timeView.setTextSize(16); timeView.setTextColor(getMainFontColor()); @@ -1315,13 +1315,13 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ImageView iconView = new ImageView(view.getContext()); iconView.setImageDrawable(icon); FrameLayout.LayoutParams imageViewLayoutParams = new FrameLayout.LayoutParams(dpToPx(22), dpToPx(22)); - imageViewLayoutParams.gravity = Gravity.CENTER_VERTICAL; + imageViewLayoutParams.gravity = Gravity.CENTER_VERTICAL | Gravity.START; iconView.setLayoutParams(imageViewLayoutParams); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); - imageViewLayoutParams.setMargins(dpToPx(17), 0, dpToPx(25), 0); + AndroidUtils.setMargins(imageViewLayoutParams, dpToPx(17), 0, dpToPx(25), 0); iconView.setBackgroundResource(R.drawable.border_round_solid_light_small); - iconView.setPadding(dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); + AndroidUtils.setPadding(iconView, dpToPx(2), dpToPx(2), dpToPx(2), dpToPx(2)); baseItemView.addView(iconView); } @@ -1366,7 +1366,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT OsmandApplication app = requireMyApplication(); TextViewEx titleView = new TextViewEx(container.getContext()); FrameLayout.LayoutParams titleParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - titleParams.gravity = Gravity.CENTER_VERTICAL; + titleParams.gravity = Gravity.CENTER_VERTICAL | Gravity.START; titleView.setTypeface(FontCache.getRobotoRegular(container.getContext())); titleView.setLayoutParams(titleParams); titleView.setTextSize(16); @@ -1380,7 +1380,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT OsmandApplication app = requireMyApplication(); TextViewEx textViewDescription = new TextViewEx(container.getContext()); LinearLayout.LayoutParams descriptionParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - descriptionParams.setMargins(0, dpToPx(paddingTop), 0, dpToPx(paddingBottom)); + AndroidUtils.setMargins(descriptionParams, 0, dpToPx(paddingTop), 0, dpToPx(paddingBottom)); textViewDescription.setLayoutParams(descriptionParams); textViewDescription.setTypeface(FontCache.getRobotoRegular(container.getContext())); textViewDescription.setTextSize(14); @@ -1394,7 +1394,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT llText.setOrientation(LinearLayout.VERTICAL); LinearLayout.LayoutParams llTextViewParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT); llTextViewParams.weight = 1f; - llTextViewParams.gravity = Gravity.CENTER_VERTICAL; + llTextViewParams.gravity = Gravity.CENTER_VERTICAL | Gravity.START; llText.setLayoutParams(llTextViewParams); return llText; } @@ -1406,7 +1406,7 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT ll.setMinimumHeight(dpToPx(minHeight)); ll.setLayoutParams(llParams); ll.setBackgroundResource(AndroidUtils.resolveAttribute(context, android.R.attr.selectableItemBackground)); - ll.setPadding(dpToPx(64f), 0, dpToPx(16f), 0); + AndroidUtils.setPadding(ll, dpToPx(64f), 0, dpToPx(16f), 0); ll.setOnLongClickListener(onLongClickListener); return ll; } @@ -1471,9 +1471,9 @@ public class RouteDetailsFragment extends ContextMenuFragment implements PublicT OsmandApplication app = requireMyApplication(); View horizontalLine = new View(view.getContext()); LinearLayout.LayoutParams llHorLineParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(1f)); - llHorLineParams.gravity = Gravity.BOTTOM; + llHorLineParams.gravity = Gravity.BOTTOM | Gravity.START; if (needMargin) { - llHorLineParams.setMargins(dpToPx(64), 0, 0, 0); + AndroidUtils.setMargins(llHorLineParams, dpToPx(64), 0, 0, 0); } horizontalLine.setLayoutParams(llHorLineParams); horizontalLine.setBackgroundColor(ContextCompat.getColor(app, isNightMode() ? R.color.divider_color_dark : R.color.divider_color_light)); diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java index 27918a081e..22ff37b4e7 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/WaypointsFragment.java @@ -162,13 +162,14 @@ public class WaypointsFragment extends BaseOsmAndFragment implements ObservableS if (!portrait) { final TypedValue typedValueAttr = new TypedValue(); - mapActivity.getTheme().resolveAttribute(R.attr.left_menu_view_bg, typedValueAttr, true); + int bgAttrId = AndroidUtils.isLayoutRtl(mapActivity) ? R.attr.right_menu_view_bg : R.attr.left_menu_view_bg; + mapActivity.getTheme().resolveAttribute(bgAttrId, typedValueAttr, true); mainView.setBackgroundResource(typedValueAttr.resourceId); mainView.setLayoutParams(new FrameLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.dashboard_land_width), ViewGroup.LayoutParams.MATCH_PARENT)); int width = getResources().getDimensionPixelSize(R.dimen.dashboard_land_width) - getResources().getDimensionPixelSize(R.dimen.dashboard_land_shadow_width); FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT); - params.gravity = Gravity.BOTTOM; + params.gravity = Gravity.BOTTOM|Gravity.START; view.findViewById(R.id.control_buttons).setLayoutParams(params); } diff --git a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java index c0deef7a6b..c75c522219 100644 --- a/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java +++ b/OsmAnd/src/net/osmand/plus/routepreparationmenu/cards/PublicTransportCard.java @@ -1,6 +1,7 @@ package net.osmand.plus.routepreparationmenu.cards; import android.graphics.Typeface; +import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.os.Build; import android.text.SpannableString; @@ -389,7 +390,8 @@ public class PublicTransportCard extends BaseCard { TextView transportStopRouteTextView = (TextView) bageView.findViewById(R.id.transport_stop_route_text); ImageView transportStopRouteImageView = (ImageView) bageView.findViewById(R.id.transport_stop_route_icon); - transportStopRouteImageView.setImageDrawable(getActiveIcon(R.drawable.ic_action_pedestrian_dark)); + Drawable icPedestrian = getActiveIcon(R.drawable.ic_action_pedestrian_dark); + transportStopRouteImageView.setImageDrawable(AndroidUtils.getDrawableForDirection(app, icPedestrian)); transportStopRouteTextView.setText(OsmAndFormatter.getFormattedDuration((int) walkTime, app)); GradientDrawable gradientDrawableBg = (GradientDrawable) bageView.getBackground(); gradientDrawableBg.setColor(activeColor); @@ -413,7 +415,8 @@ public class PublicTransportCard extends BaseCard { private View createArrow() { LinearLayout container = new LinearLayout(app); ImageView arrow = new ImageView(app); - arrow.setImageDrawable(getContentIcon(R.drawable.ic_action_arrow_forward_16)); + Drawable icArrow = getContentIcon(R.drawable.ic_action_arrow_forward_16); + arrow.setImageDrawable(AndroidUtils.getDrawableForDirection(app, icArrow)); container.addView(arrow, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, AndroidUtils.dpToPx(app, 28))); return container; } diff --git a/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuItemsFragment.java b/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuItemsFragment.java index 2daaeb855d..ab24d4b9cd 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuItemsFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuItemsFragment.java @@ -186,7 +186,9 @@ public class ConfigureMenuItemsFragment extends BaseOsmAndFragment toolbarTitle.setTextColor(nightMode ? getResources().getColor(R.color.text_color_primary_dark) : getResources().getColor(R.color.list_background_color_dark)); - toolbarButton.setImageDrawable(getPaintedContentIcon(R.drawable.ic_arrow_back, getResources().getColor(R.color.text_color_secondary_light))); + toolbarButton.setImageDrawable(getPaintedContentIcon( + AndroidUtils.getNavigationIconResId(app), + getResources().getColor(R.color.text_color_secondary_light))); toolbarTitle.setText(screenType.titleRes); toolbarButton.setOnClickListener(new View.OnClickListener() { @Override diff --git a/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuRootFragment.java b/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuRootFragment.java index a45a72dc11..3588f6af27 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuRootFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ConfigureMenuRootFragment.java @@ -103,7 +103,9 @@ public class ConfigureMenuRootFragment extends BaseOsmAndFragment { ? getResources().getColor(R.color.text_color_primary_dark) : getResources().getColor(R.color.list_background_color_dark)); toolbarSubTitle.setTextColor(getResources().getColor(R.color.text_color_secondary_light)); - toolbarButton.setImageDrawable(getPaintedContentIcon(R.drawable.ic_arrow_back, getResources().getColor(R.color.text_color_secondary_light))); + toolbarButton.setImageDrawable(getPaintedContentIcon( + AndroidUtils.getNavigationIconResId(app), + getResources().getColor(R.color.text_color_secondary_light))); toolbarButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { diff --git a/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java b/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java index 0820b24052..9808881c46 100644 --- a/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java +++ b/OsmAnd/src/net/osmand/plus/settings/ImportDuplicatesFragment.java @@ -283,7 +283,8 @@ public class ImportDuplicatesFragment extends BaseOsmAndFragment implements View private void setupToolbar(Toolbar toolbar) { toolbar.setTitle(R.string.import_duplicates_title); - toolbar.setNavigationIcon(getPaintedContentIcon(R.drawable.ic_arrow_back, + toolbar.setNavigationIcon(getPaintedContentIcon( + AndroidUtils.getNavigationIconResId(app), nightMode ? getResources().getColor(R.color.active_buttons_and_links_text_dark) : getResources().getColor(R.color.active_buttons_and_links_text_light))); diff --git a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java index 1f4f32c4c2..af1e61053f 100644 --- a/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java +++ b/OsmAnd/src/net/osmand/plus/views/OsmandMapTileView.java @@ -28,6 +28,7 @@ import android.view.View; import android.view.WindowManager; import android.widget.Toast; +import net.osmand.AndroidUtils; import net.osmand.PlatformUtil; import net.osmand.access.AccessibilityActionsProvider; import net.osmand.core.android.MapRendererView; @@ -632,7 +633,8 @@ public class OsmandMapTileView implements IMapDownloaderCallback { } else if (mapPosition == OsmandSettings.LANDSCAPE_MIDDLE_RIGHT_CONSTANT) { ratiox = 0.7f; } else { - ratiox = mapPositionX == 0 ? 0.5f : 0.75f; + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(application); + ratiox = mapPositionX == 0 ? 0.5f : (isLayoutRtl ? 0.25f : 0.75f); } final int cy = (int) (ratioy * view.getHeight()); final int cx = (int) (ratiox * view.getWidth()); diff --git a/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java b/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java index c59ebb37fa..63a43e56ad 100644 --- a/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java +++ b/OsmAnd/src/net/osmand/plus/widgets/FlowLayout.java @@ -6,10 +6,11 @@ import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; +import net.osmand.AndroidUtils; + public class FlowLayout extends ViewGroup { private int line_height; - private boolean rtl = false; public static class LayoutParams extends ViewGroup.LayoutParams { @@ -91,12 +92,10 @@ public class FlowLayout extends ViewGroup { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - rtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL; - } final int count = getChildCount(); final int width = r - l; - int xpos = rtl ? width - getPaddingRight() : getPaddingLeft(); + boolean isLayoutRtl = AndroidUtils.isLayoutRtl(getContext()); + int xpos = isLayoutRtl ? width - getPaddingRight() : getPaddingLeft(); int ypos = getPaddingTop(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); @@ -104,13 +103,13 @@ public class FlowLayout extends ViewGroup { final int childw = child.getMeasuredWidth(); final int childh = child.getMeasuredHeight(); final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (rtl) { + if (isLayoutRtl) { if (xpos - childw < l) { xpos = width - getPaddingRight(); ypos += line_height; } child.layout(xpos - childw, ypos, xpos, ypos + childh); - xpos -= childw - lp.horizontal_spacing; + xpos -= childw + lp.horizontal_spacing; } else { if (xpos + childw > width) { xpos = getPaddingLeft();