[android] Migrate editor screens to Material components

Signed-off-by: Jean-Baptiste Charron <jeanbaptiste.charron@outlook.fr>
This commit is contained in:
Jean-Baptiste
2025-06-30 18:39:45 +02:00
committed by Konstantin Pastbin
parent a3e1666ede
commit 9a759229f9
33 changed files with 180 additions and 171 deletions

View File

@@ -7,8 +7,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
@@ -20,7 +18,10 @@ import app.organicmaps.util.Constants;
import app.organicmaps.util.Graphics;
import app.organicmaps.util.InputUtils;
import app.organicmaps.util.UiUtils;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;
public class AdvancedTimetableFragment extends BaseMwmFragment
implements View.OnClickListener, TimetableProvider
@@ -28,8 +29,8 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
private boolean mIsExampleShown;
private TextInputEditText mInput;
private WebView mExample;
private TextView mExamplesTitle;
private static ImageView mSaveButton;
private MaterialTextView mExamplesTitle;
private static ShapeableImageView mSaveButton;
@Nullable
private String mInitTimetables;
@Nullable

View File

@@ -3,13 +3,14 @@ package app.organicmaps.editor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import java.util.ArrayList;
@@ -100,8 +101,8 @@ public class CuisineAdapter extends RecyclerView.Adapter<CuisineAdapter.ViewHold
protected class ViewHolder extends RecyclerView.ViewHolder implements CompoundButton.OnCheckedChangeListener
{
final TextView cuisine;
final CheckBox selected;
final MaterialTextView cuisine;
final MaterialCheckBox selected;
public ViewHolder(View itemView)
{

View File

@@ -8,8 +8,6 @@ import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.CallSuper;
import androidx.annotation.DrawableRes;
@@ -22,8 +20,11 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputLayout;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.Framework;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment;
@@ -46,7 +47,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
{
final static String LAST_INDEX_OF_NAMES_ARRAY = "LastIndexOfNamesArray";
private TextView mCategory;
private MaterialTextView mCategory;
private View mCardName;
private View mCardAddress;
private View mCardDetails;
@@ -89,20 +90,20 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
};
private MultilanguageAdapter mNamesAdapter;
private TextView mNamesCaption;
private TextView mAddLanguage;
private TextView mMoreLanguages;
private MaterialTextView mNamesCaption;
private MaterialTextView mAddLanguage;
private MaterialTextView mMoreLanguages;
private TextView mStreet;
private MaterialTextView mStreet;
private TextInputEditText mHouseNumber;
private TextInputEditText mBuildingLevels;
// Define Metadata entries, that have more tricky logic, separately.
private TextView mPhone;
private TextView mEditPhoneLink;
private TextView mCuisine;
private MaterialTextView mPhone;
private MaterialTextView mEditPhoneLink;
private MaterialTextView mCuisine;
private SwitchCompat mWifi;
private TextView mSelfService;
private MaterialTextView mSelfService;
private SwitchCompat mOutdoorSeating;
// Default Metadata entries.
@@ -132,12 +133,12 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private TextInputLayout mInputBuildingLevels;
private View mEmptyOpeningHours;
private TextView mOpeningHours;
private MaterialTextView mOpeningHours;
private View mEditOpeningHours;
private TextInputEditText mDescription;
private final Map<Metadata.MetadataType, View> mDetailsBlocks = new HashMap<>();
private final Map<Metadata.MetadataType, View> mSocialMediaBlocks = new HashMap<>();
private TextView mReset;
private MaterialTextView mReset;
private EditorHostFragment mParent;
@@ -489,7 +490,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
mOpeningHours.setOnClickListener(this);
final View cardMore = view.findViewById(R.id.cv__more);
mDescription = findInput(cardMore);
TextView osmInfo = view.findViewById(R.id.osm_info);
MaterialTextView osmInfo = view.findViewById(R.id.osm_info);
osmInfo.setMovementMethod(LinkMovementMethod.getInstance());
mReset = view.findViewById(R.id.reset);
mReset.setOnClickListener(this);
@@ -529,7 +530,7 @@ public class EditorFragment extends BaseMwmFragment implements View.OnClickListe
private static TextInputEditText findInputAndInitBlock(View blockWithInput, @DrawableRes int icon, String hint)
{
((ImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
((ShapeableImageView) blockWithInput.findViewById(R.id.icon)).setImageResource(icon);
final TextInputLayout input = blockWithInput.findViewById(R.id.custom_input);
input.setHint(hint);
return input.findViewById(R.id.input);

View File

@@ -4,12 +4,13 @@ import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.editor.data.FeatureCategory;
import app.organicmaps.util.UiUtils;
@@ -78,7 +79,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
protected class FeatureViewHolder extends RecyclerView.ViewHolder
{
@NonNull
private final TextView mName;
private final MaterialTextView mName;
@NonNull
private final View mSelected;
@@ -106,7 +107,7 @@ public class FeatureCategoryAdapter extends RecyclerView.Adapter<RecyclerView.Vi
FooterViewHolder(@NonNull View itemView)
{
super(itemView);
TextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
MaterialTextView categoryUnsuitableText = itemView.findViewById(R.id.editor_category_unsuitable_text);
categoryUnsuitableText.setMovementMethod(LinkMovementMethod.getInstance());
}
}

View File

@@ -8,8 +8,6 @@ import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import androidx.annotation.IntRange;
@@ -19,8 +17,11 @@ import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.content.res.AppCompatResources;
import androidx.fragment.app.FragmentManager;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.tabs.TabLayout;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.base.BaseMwmDialogFragment;
import app.organicmaps.editor.data.HoursMinutes;
@@ -48,7 +49,7 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
private TabLayout mTabs;
private int mId;
private Button mOkButton;
private MaterialButton mOkButton;
public interface OnPickListener
{
@@ -90,7 +91,7 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
.create();
dialog.setOnShowListener(dialogInterface -> {
mOkButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
mOkButton = (MaterialButton) dialog.getButton(AlertDialog.BUTTON_POSITIVE);
mOkButton.setOnClickListener(v -> {
if (mSelectedTab == TAB_FROM)
{
@@ -134,19 +135,19 @@ public class HoursMinutesPickerFragment extends BaseMwmDialogFragment
if (id != 0)
{
mPickerHoursLabel = mPicker.findViewById(id);
if (!(mPickerHoursLabel instanceof TextView))
if (!(mPickerHoursLabel instanceof MaterialTextView))
mPickerHoursLabel = null;
}
mTabs = root.findViewById(R.id.tabs);
TextView tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
MaterialTextView tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView.setText(getResources().getString(R.string.editor_time_from));
final ColorStateList textColor = AppCompatResources.getColorStateList(requireContext(),
ThemeUtils.isNightTheme(requireContext()) ? R.color.accent_color_selector_night
: R.color.accent_color_selector);
tabView.setTextColor(textColor);
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);
tabView = (TextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView = (MaterialTextView) inflater.inflate(R.layout.tab_timepicker, mTabs, false);
tabView.setText(getResources().getString(R.string.editor_time_to));
tabView.setTextColor(textColor);
mTabs.addTab(mTabs.newTab().setCustomView(tabView), true);

View File

@@ -3,11 +3,12 @@ package app.organicmaps.editor;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.editor.data.Language;
@@ -42,12 +43,12 @@ public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.Hold
protected class Holder extends RecyclerView.ViewHolder
{
TextView name;
MaterialTextView name;
public Holder(View itemView)
{
super(itemView);
name = (TextView) itemView;
name = (MaterialTextView) itemView;
itemView.setOnClickListener(v -> mFragment.onLanguageSelected(mLanguages[getBindingAdapterPosition()]));
}

View File

@@ -4,11 +4,11 @@ import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.imageview.ShapeableImageView;
import com.google.android.material.textfield.TextInputLayout;
import com.google.android.material.textfield.TextInputEditText;
import app.organicmaps.R;
@@ -94,7 +94,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
{
private int mPosition = -1;
private final TextInputEditText mInput;
private final ImageView deleteButton;
private final ShapeableImageView deleteButton;
public ViewHolder(@NonNull View itemView)
{
@@ -116,7 +116,7 @@ public class PhoneListAdapter extends RecyclerView.Adapter<PhoneListAdapter.View
deleteButton.setOnClickListener(this);
// TODO: setting icons from code because icons defined in layout XML are white.
deleteButton.setImageResource(R.drawable.ic_delete);
((ImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
((ShapeableImageView) itemView.findViewById(R.id.phone_icon)).setImageResource(R.drawable.ic_phone);
}
public void setPosition(int position)

View File

@@ -4,12 +4,13 @@ import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.radiobutton.MaterialRadioButton;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.util.Utils;
@@ -51,8 +52,8 @@ public class SelfServiceAdapter extends RecyclerView.Adapter<SelfServiceAdapter.
protected class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
final TextView selfServiceDef;
final CompoundButton selected;
final MaterialTextView selfServiceDef;
final MaterialRadioButton selected;
public ViewHolder(View itemView)
{

View File

@@ -4,11 +4,8 @@ import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.IdRes;
import androidx.annotation.IntRange;
@@ -17,6 +14,10 @@ import androidx.appcompat.widget.SwitchCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.checkbox.MaterialCheckBox;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.R;
import app.organicmaps.editor.data.HoursMinutes;
import app.organicmaps.editor.data.TimeFormatUtils;
@@ -185,15 +186,15 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
// Limit closed spans to avoid dynamic inflation of views in recycler's children. Yeah, its a hack.
static final int MAX_CLOSED_SPANS = 10;
SparseArray<CheckBox> days = new SparseArray<>(7);
SparseArray<MaterialCheckBox> days = new SparseArray<>(7);
View allday;
SwitchCompat swAllday;
View schedule;
View openClose;
View open;
View close;
TextView tvOpen;
TextView tvClose;
MaterialTextView tvOpen;
MaterialTextView tvClose;
View[] closedHours = new View[MAX_CLOSED_SPANS];
View addClosed;
View deleteTimetable;
@@ -316,7 +317,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
else
{
UiUtils.show(closedHours[i]);
((TextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
((MaterialTextView) closedHours[i].findViewById(R.id.tv__closed)).setText(timespan.toString());
}
i++;
@@ -333,18 +334,18 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private void addDay(@IntRange(from = 1, to = 7) final int dayIndex, @IdRes int id)
{
final View day = itemView.findViewById(id);
final CheckBox checkBox = day.findViewById(R.id.chb__day);
final MaterialCheckBox checkBox = day.findViewById(R.id.chb__day);
// Save index of the day to get it back when checkbox will be toggled.
checkBox.setTag(dayIndex);
days.put(dayIndex, checkBox);
day.setOnClickListener(v -> checkBox.toggle());
((TextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
((MaterialTextView) day.findViewById(R.id.tv__day)).setText(TimeFormatUtils.formatShortWeekday(dayIndex));
}
private void switchWorkingDay(@IntRange(from = 1, to = 7) int dayIndex)
{
final CheckBox checkBox = days.get(dayIndex);
final MaterialCheckBox checkBox = days.get(dayIndex);
if (checkBox.isChecked())
addWorkingDay(dayIndex, getBindingAdapterPosition());
else
@@ -361,7 +362,7 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
private class AddTimetableViewHolder extends BaseTimetableViewHolder
{
private final Button mAdd;
private final MaterialButton mAdd;
AddTimetableViewHolder(View itemView)
{

View File

@@ -4,12 +4,13 @@ import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.radiobutton.MaterialRadioButton;
import com.google.android.material.textview.MaterialTextView;
import app.organicmaps.MwmApplication;
import app.organicmaps.R;
import app.organicmaps.dialog.EditTextDialogFragment;
@@ -86,9 +87,9 @@ public class StreetAdapter extends RecyclerView.Adapter<StreetAdapter.BaseViewHo
protected class StreetViewHolder extends BaseViewHolder implements View.OnClickListener
{
final TextView streetDef;
final TextView streetLoc;
final CompoundButton selected;
final MaterialTextView streetDef;
final MaterialTextView streetLoc;
final MaterialRadioButton selected;
public StreetViewHolder(View itemView)
{

View File

@@ -7,7 +7,6 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -19,6 +18,7 @@ import app.organicmaps.R;
import app.organicmaps.base.BaseMwmFragment;
import app.organicmaps.util.UiUtils;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.textview.MaterialTextView;
public class TimetableContainerFragment extends BaseMwmFragment implements TimetableChangedListener
{
@@ -71,7 +71,7 @@ public class TimetableContainerFragment extends BaseMwmFragment implements Timet
@SuppressWarnings("NullableProblems")
@NonNull
private TextView mSwitchMode;
private MaterialTextView mSwitchMode;
@SuppressWarnings("NullableProblems")
@NonNull