[android] TimetableFragment is refactored

This commit is contained in:
Arsentiy Milchakov 2019-06-28 11:36:27 +03:00 committed by Aleksandr Zatsepin
parent a3712427de
commit 70846ae6d9
7 changed files with 183 additions and 161 deletions

View file

@ -2,6 +2,7 @@ package com.mapswithme.maps.editor;
import android.os.Bundle;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
@ -19,23 +20,24 @@ import com.mapswithme.util.UiUtils;
public class AdvancedTimetableFragment extends BaseMwmFragment
implements View.OnClickListener,
TimetableFragment.TimetableProvider
TimetableProvider
{
private boolean mIsExampleShown;
private EditText mInput;
private WebView mExample;
private Timetable[] mInitTimetables;
@Nullable
private String mInitTimetables;
private TextView mExamplesTitle;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_timetable_advanced, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
initViews(view);
@ -97,15 +99,16 @@ public class AdvancedTimetableFragment extends BaseMwmFragment
return mInput.getText().toString();
}
public void setTimetables(String timetables)
@Override
public void setTimetables(@Nullable String timetables)
{
mInitTimetables = OpeningHours.nativeTimetablesFromString(timetables);
mInitTimetables = timetables;
refreshTimetables();
}
private void refreshTimetables()
{
if (mInput != null && mInitTimetables != null)
mInput.setText(OpeningHours.nativeTimetablesToString(mInitTimetables));
mInput.setText(mInitTimetables);
}
}

View file

@ -207,8 +207,8 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
protected void editTimetable()
{
final Bundle args = new Bundle();
args.putString(TimetableFragment.EXTRA_TIME, Editor.nativeGetOpeningHours());
editWithFragment(Mode.OPENING_HOURS, R.string.editor_time_title, args, TimetableFragment.class, false);
args.putString(TimetableContainerFragment.EXTRA_TIME, Editor.nativeGetOpeningHours());
editWithFragment(Mode.OPENING_HOURS, R.string.editor_time_title, args, TimetableContainerFragment.class, false);
}
protected void editStreet()
@ -268,7 +268,7 @@ public class EditorHostFragment extends BaseMwmToolbarFragment
switch (mMode)
{
case OPENING_HOURS:
final String timetables = ((TimetableFragment) getChildFragmentManager().findFragmentByTag(TimetableFragment.class.getName())).getTimetable();
final String timetables = ((TimetableContainerFragment) getChildFragmentManager().findFragmentByTag(TimetableContainerFragment.class.getName())).getTimetable();
if (OpeningHours.nativeIsTimetableStringValid(timetables))
{
Editor.nativeSetOpeningHours(timetables);

View file

@ -2,6 +2,7 @@ package com.mapswithme.maps.editor;
import android.support.annotation.IdRes;
import android.support.annotation.IntRange;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SwitchCompat;
@ -29,7 +30,7 @@ import java.util.List;
class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter.BaseTimetableViewHolder>
implements HoursMinutesPickerFragment.OnPickListener,
TimetableFragment.TimetableProvider
TimetableProvider
{
private static final int TYPE_TIMETABLE = 0;
private static final int TYPE_ADD_TIMETABLE = 1;
@ -52,9 +53,15 @@ class SimpleTimetableAdapter extends RecyclerView.Adapter<SimpleTimetableAdapter
refreshComplement();
}
void setTimetables(Timetable[] tts)
@Override
public void setTimetables(@Nullable String timetables)
{
mItems = new ArrayList<>(Arrays.asList(tts));
if (timetables == null)
return;
Timetable[] items = OpeningHours.nativeTimetablesFromString(timetables);
if (items == null)
return;
mItems = new ArrayList<>(Arrays.asList(items));
refreshComplement();
notifyDataSetChanged();
}

View file

@ -3,7 +3,6 @@ package com.mapswithme.maps.editor;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@ -11,14 +10,14 @@ import android.view.ViewGroup;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmRecyclerFragment;
import com.mapswithme.maps.editor.data.HoursMinutes;
import com.mapswithme.maps.editor.data.Timetable;
public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimetableAdapter>
implements TimetableFragment.TimetableProvider,
implements TimetableProvider,
HoursMinutesPickerFragment.OnPickListener
{
private SimpleTimetableAdapter mAdapter;
private Timetable[] mInitTts;
@Nullable
private String mInitTimetables;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
@ -31,8 +30,7 @@ public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimet
protected SimpleTimetableAdapter createAdapter()
{
mAdapter = new SimpleTimetableAdapter(this);
if (mInitTts != null)
mAdapter.setTimetables(mInitTts);
mAdapter.setTimetables(mInitTimetables);
return mAdapter;
}
@ -55,16 +53,15 @@ public class SimpleTimetableFragment extends BaseMwmRecyclerFragment<SimpleTimet
return mAdapter.getTimetables();
}
@Override
public void setTimetables(String timetables)
{
mInitTimetables = timetables;
}
@Override
public void onHoursMinutesPicked(HoursMinutes from, HoursMinutes to, int id)
{
mAdapter.onHoursMinutesPicked(from, to, id);
}
public void setTimetables(String ttsString)
{
if (ttsString == null)
return;
mInitTts = OpeningHours.nativeTimetablesFromString(ttsString);
}
}

View file

@ -0,0 +1,141 @@
package com.mapswithme.maps.editor;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmFragment;
import com.mapswithme.maps.base.OnBackPressListener;
public class TimetableContainerFragment extends BaseMwmFragment implements OnBackPressListener
{
public static final String EXTRA_TIME = "Time";
private enum Mode
{
SIMPLE
{
@NonNull
String getFragmentClassname() { return SimpleTimetableFragment.class.getName(); }
@StringRes
int getSwitchButtonLabel() { return R.string.editor_time_advanced; }
},
ADVANCED
{
@NonNull
String getFragmentClassname() { return AdvancedTimetableFragment.class.getName(); }
@StringRes
int getSwitchButtonLabel() { return R.string.editor_time_simple; }
};
@NonNull
abstract String getFragmentClassname();
@StringRes
abstract int getSwitchButtonLabel();
}
@NonNull
private Mode mMode = Mode.ADVANCED;
@NonNull
private Fragment[] mFragments = new Fragment[Mode.values().length];
@Nullable
private TimetableProvider mTimetableProvider;
@SuppressWarnings("NullableProblems")
@NonNull
private TextView mSwitchMode;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_timetable, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
initViews(view);
mMode = Mode.ADVANCED;
switchMode();
final Bundle args = getArguments();
if (args != null && mTimetableProvider != null && !TextUtils.isEmpty(args.getString(EXTRA_TIME)))
mTimetableProvider.setTimetables(args.getString(EXTRA_TIME));
}
@Nullable
public String getTimetable()
{
if (mTimetableProvider == null)
return null;
return mTimetableProvider.getTimetables();
}
private void initViews(View root)
{
mSwitchMode = root.findViewById(R.id.tv__mode_switch);
mSwitchMode.setOnClickListener(v -> switchMode());
}
@Override
public boolean onBackPressed()
{
return false;
}
private void switchMode()
{
switch (mMode)
{
case SIMPLE:
setMode(Mode.ADVANCED);
break;
case ADVANCED:
setMode(Mode.SIMPLE);
break;
}
}
private void setMode(Mode mode)
{
final String filledTimetables = mTimetableProvider != null ? mTimetableProvider.getTimetables()
: OpeningHours.nativeTimetablesToString(OpeningHours.nativeGetDefaultTimetables());
if (!OpeningHours.nativeIsTimetableStringValid(filledTimetables))
{
FragmentActivity activity = getActivity();
if (activity == null)
return;
new AlertDialog.Builder(activity)
.setMessage(R.string.editor_correct_mistake)
.setPositiveButton(android.R.string.ok, null)
.show();
return;
}
mMode = mode;
mSwitchMode.setText(mMode.getSwitchButtonLabel());
if (mFragments[mMode.ordinal()] == null)
mFragments[mMode.ordinal()] = Fragment.instantiate(getActivity(), mMode.getFragmentClassname());
Fragment fragment = mFragments[mMode.ordinal()];
getChildFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
mTimetableProvider = (TimetableProvider) fragment;
mTimetableProvider.setTimetables(filledTimetables);
}
}

View file

@ -1,135 +0,0 @@
package com.mapswithme.maps.editor;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.mapswithme.maps.R;
import com.mapswithme.maps.base.BaseMwmFragment;
import com.mapswithme.maps.base.OnBackPressListener;
public class TimetableFragment extends BaseMwmFragment
implements View.OnClickListener,
OnBackPressListener
{
interface TimetableProvider
{
String getTimetables();
}
public static final String EXTRA_TIME = "Time";
private boolean mIsAdvancedMode;
private TextView mSwitchMode;
// TODO @yunikkk simplify, extract interface
private SimpleTimetableFragment mSimpleModeFragment;
private AdvancedTimetableFragment mAdvancedModeFragment;
protected EditorHostFragment mParent;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
return inflater.inflate(R.layout.fragment_timetable, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
{
super.onViewCreated(view, savedInstanceState);
mParent = (EditorHostFragment) getParentFragment();
initViews(view);
mIsAdvancedMode = true;
switchMode();
final Bundle args = getArguments();
if (args != null && !TextUtils.isEmpty(args.getString(EXTRA_TIME)))
mSimpleModeFragment.setTimetables(args.getString(EXTRA_TIME));
}
public String getTimetable()
{
return mIsAdvancedMode ? mAdvancedModeFragment.getTimetables()
: mSimpleModeFragment.getTimetables();
}
private void initViews(View root)
{
mSwitchMode = (TextView) root.findViewById(R.id.tv__mode_switch);
mSwitchMode.setOnClickListener(this);
}
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.tv__mode_switch:
switchMode();
break;
}
}
@Override
public boolean onBackPressed()
{
return false;
}
private void switchMode()
{
if (!mIsAdvancedMode)
{
final String filledTimetables = mSimpleModeFragment != null ? mSimpleModeFragment.getTimetables()
: OpeningHours.nativeTimetablesToString(OpeningHours.nativeGetDefaultTimetables());
if (!OpeningHours.nativeIsTimetableStringValid(filledTimetables))
{
new AlertDialog.Builder(getActivity())
.setMessage(R.string.editor_correct_mistake)
.setPositiveButton(android.R.string.ok, null)
.show();
return;
}
mIsAdvancedMode = true;
mSwitchMode.setText(R.string.editor_time_simple);
mAdvancedModeFragment = (AdvancedTimetableFragment) attachFragment(mAdvancedModeFragment, AdvancedTimetableFragment.class.getName());
mAdvancedModeFragment.setTimetables(filledTimetables);
}
else
{
final String filledTimetables = mAdvancedModeFragment != null ? mAdvancedModeFragment.getTimetables()
: OpeningHours.nativeTimetablesToString(OpeningHours.nativeGetDefaultTimetables());
if (!OpeningHours.nativeIsTimetableStringValid(filledTimetables))
{
new AlertDialog.Builder(getActivity())
.setMessage(R.string.editor_correct_mistake)
.setPositiveButton(android.R.string.ok, null)
.show();
return;
}
mIsAdvancedMode = false;
mSwitchMode.setText(R.string.editor_time_advanced);
mSimpleModeFragment = (SimpleTimetableFragment) attachFragment(mSimpleModeFragment, SimpleTimetableFragment.class.getName());
mSimpleModeFragment.setTimetables(filledTimetables);
}
}
private Fragment attachFragment(Fragment current, String className)
{
Fragment fragment = current == null ? Fragment.instantiate(getActivity(), className)
: current;
getChildFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
return fragment;
}
}

View file

@ -0,0 +1,9 @@
package com.mapswithme.maps.editor;
import android.support.annotation.Nullable;
interface TimetableProvider
{
@Nullable String getTimetables();
void setTimetables(@Nullable String timetables);
}