mirror of
https://github.com/mediathekview/zapp.git
synced 2024-09-19 20:02:17 +02:00
Refactor pillow buttons into their own fragment
This commit is contained in:
parent
3b4f1c8304
commit
2e6a040465
@ -0,0 +1,12 @@
|
|||||||
|
package de.christinecoenen.code.zapp.app.mediathek.api.request;
|
||||||
|
|
||||||
|
public class Interval {
|
||||||
|
|
||||||
|
private int start;
|
||||||
|
private int end;
|
||||||
|
|
||||||
|
public Interval(int start, int end) {
|
||||||
|
this.start = start;
|
||||||
|
this.end = end;
|
||||||
|
}
|
||||||
|
}
|
@ -27,10 +27,13 @@ public class QueryRequest implements Serializable {
|
|||||||
private final transient TextQuery searchQuery = new TextQuery()
|
private final transient TextQuery searchQuery = new TextQuery()
|
||||||
.addField(Field.TITLE)
|
.addField(Field.TITLE)
|
||||||
.addField(Field.TOPIC);
|
.addField(Field.TOPIC);
|
||||||
|
private final transient RangeQuery lengthQuery = new RangeQuery()
|
||||||
|
.setField(Field.DURATION)
|
||||||
|
.setGte("0");
|
||||||
|
|
||||||
private final BoolQuery body = new BoolQuery()
|
private final BoolQuery body = new BoolQuery()
|
||||||
.setNotQueries(EXCLUDE_CHANNELS_QUERY)
|
.setNotQueries(EXCLUDE_CHANNELS_QUERY)
|
||||||
.setMustQueries(noSearchQuery)
|
.setMustQueries(noSearchQuery, lengthQuery)
|
||||||
.setFilterQueries(EXCLUDE_FUTURE_QUERY);
|
.setFilterQueries(EXCLUDE_FUTURE_QUERY);
|
||||||
|
|
||||||
private List<Sort> sort;
|
private List<Sort> sort;
|
||||||
@ -39,14 +42,19 @@ public class QueryRequest implements Serializable {
|
|||||||
|
|
||||||
public QueryRequest setSimpleSearch(String queryString) {
|
public QueryRequest setSimpleSearch(String queryString) {
|
||||||
if (TextUtils.isEmpty(queryString)) {
|
if (TextUtils.isEmpty(queryString)) {
|
||||||
body.setMustQueries(noSearchQuery);
|
body.setMustQueries(noSearchQuery, lengthQuery);
|
||||||
} else {
|
} else {
|
||||||
searchQuery.setText(queryString);
|
searchQuery.setText(queryString);
|
||||||
body.setMustQueries(searchQuery);
|
body.setMustQueries(searchQuery, lengthQuery);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public QueryRequest setMinLength(int minLengthSeconds) {
|
||||||
|
lengthQuery.setGte(String.valueOf(minLengthSeconds));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public QueryRequest excludeChannels(String... channels) {
|
public QueryRequest excludeChannels(String... channels) {
|
||||||
TextQuery[] dynamicExcludeChannelQueries = new TextQuery[channels.length + 1];
|
TextQuery[] dynamicExcludeChannelQueries = new TextQuery[channels.length + 1];
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
package de.christinecoenen.code.zapp.app.mediathek.api.request.query;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import de.christinecoenen.code.zapp.app.mediathek.api.request.Interval;
|
||||||
|
|
||||||
|
public class IntervalList {
|
||||||
|
|
||||||
|
private List<Interval> intervals = new ArrayList<>();
|
||||||
|
|
||||||
|
//public
|
||||||
|
|
||||||
|
}
|
@ -9,31 +9,23 @@ import android.support.v4.app.Fragment;
|
|||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.LinearLayout;
|
|
||||||
import android.widget.ToggleButton;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import butterknife.BindArray;
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import de.christinecoenen.code.zapp.R;
|
import de.christinecoenen.code.zapp.R;
|
||||||
|
import de.christinecoenen.code.zapp.utils.view.PillowButtonScrollerFragment;
|
||||||
|
|
||||||
public class MediathekListFilterFragment extends Fragment {
|
public class MediathekListFilterFragment extends Fragment {
|
||||||
|
|
||||||
private static final String SHARED_PREFS_KEY_FILTER_OPEN = "SHARED_PREFS_FRILTER_OPEN";
|
private static final String SHARED_PREFS_KEY_FILTER_OPEN = "SHARED_PREFS_FRILTER_OPEN";
|
||||||
private static final String SHARED_PREFS_KEY_FILTER_CHANNEL_SELECTED_ = "SHARED_PREFS_KEY_FILTER_CHANNEL_SELECTED_";
|
|
||||||
|
|
||||||
@BindArray(R.array.mediathek_channels)
|
|
||||||
protected String[] channelNames;
|
|
||||||
|
|
||||||
@BindView(R.id.container_channel_buttons)
|
|
||||||
protected LinearLayout channelButtonContainer;
|
|
||||||
|
|
||||||
|
|
||||||
private Listener listener;
|
private Listener listener;
|
||||||
private SharedPreferences sharedPreferences;
|
private SharedPreferences sharedPreferences;
|
||||||
|
private PillowButtonScrollerFragment channelFilter;
|
||||||
|
private PillowButtonScrollerFragment lengthFilter;
|
||||||
|
|
||||||
public MediathekListFilterFragment() {
|
public MediathekListFilterFragment() {
|
||||||
// Required empty public constructor
|
// Required empty public constructor
|
||||||
@ -52,16 +44,12 @@ public class MediathekListFilterFragment extends Fragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String[] getExcludedChannels() {
|
public String[] getExcludedChannels() {
|
||||||
ArrayList<String> excludedChannels = new ArrayList<>();
|
return channelFilter.getExcludedKeys();
|
||||||
|
|
||||||
for (int i = 0; i < channelButtonContainer.getChildCount(); i++) {
|
|
||||||
ToggleButton channelButton = (ToggleButton) channelButtonContainer.getChildAt(i);
|
|
||||||
if (!channelButton.isChecked()) {
|
|
||||||
excludedChannels.add(channelButton.getText().toString());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return excludedChannels.toArray(new String[excludedChannels.size()]);
|
public int getMinLength() {
|
||||||
|
// TODO: expose length intervals
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -75,9 +63,13 @@ public class MediathekListFilterFragment extends Fragment {
|
|||||||
View view = inflater.inflate(R.layout.fragment_mediathek_list_filter, container, false);
|
View view = inflater.inflate(R.layout.fragment_mediathek_list_filter, container, false);
|
||||||
ButterKnife.bind(this, view);
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
for (String channelName : channelNames) {
|
channelFilter = (PillowButtonScrollerFragment) getChildFragmentManager()
|
||||||
addChannelButton(inflater, channelName);
|
.findFragmentById(R.id.fragment_channel_filter);
|
||||||
}
|
channelFilter.setListener(() -> listener.onChannelsChanged());
|
||||||
|
|
||||||
|
lengthFilter = (PillowButtonScrollerFragment) getChildFragmentManager()
|
||||||
|
.findFragmentById(R.id.fragment_length_filter);
|
||||||
|
lengthFilter.setListener(() -> listener.onLengthChanged());
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
@ -131,57 +123,9 @@ public class MediathekListFilterFragment extends Fragment {
|
|||||||
sharedPreferences.edit().putBoolean(SHARED_PREFS_KEY_FILTER_OPEN, false).apply();
|
sharedPreferences.edit().putBoolean(SHARED_PREFS_KEY_FILTER_OPEN, false).apply();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addChannelButton(LayoutInflater inflater, String channelName) {
|
|
||||||
ToggleButton channelButton = (ToggleButton) inflater.inflate(
|
|
||||||
R.layout.fragment_mediathek_list_filter_toggle_button,
|
|
||||||
channelButtonContainer, false);
|
|
||||||
channelButton.setTextOff(channelName);
|
|
||||||
channelButton.setTextOn(channelName);
|
|
||||||
|
|
||||||
boolean isChecked = sharedPreferences.getBoolean(SHARED_PREFS_KEY_FILTER_CHANNEL_SELECTED_ + channelName, true);
|
|
||||||
channelButton.setChecked(isChecked);
|
|
||||||
|
|
||||||
channelButton.setOnClickListener(v -> onChannelButtonClicked((ToggleButton) v, channelName));
|
|
||||||
channelButton.setOnLongClickListener(v -> onChannelButtonLongClicked((ToggleButton) v, channelName));
|
|
||||||
channelButtonContainer.addView(channelButton);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void onChannelButtonClicked(ToggleButton button, String channelName) {
|
|
||||||
setChannelButton(button, channelName, button.isChecked());
|
|
||||||
|
|
||||||
if (listener != null) {
|
|
||||||
listener.onChannelsChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean onChannelButtonLongClicked(ToggleButton button, String channelName) {
|
|
||||||
boolean isOnlyOneChecked = getExcludedChannels().length >= channelButtonContainer.getChildCount() - 1;
|
|
||||||
boolean doOthersCheck = button.isChecked() && isOnlyOneChecked;
|
|
||||||
|
|
||||||
for (int i = 0; i < channelButtonContainer.getChildCount(); i++) {
|
|
||||||
ToggleButton channelButton = (ToggleButton) channelButtonContainer.getChildAt(i);
|
|
||||||
if (channelButton != button) {
|
|
||||||
setChannelButton(channelButton, channelButton.getTextOn().toString(), doOthersCheck);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setChannelButton(button, channelName, true);
|
|
||||||
|
|
||||||
if (listener != null) {
|
|
||||||
listener.onChannelsChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setChannelButton(ToggleButton button, String channelName, boolean checked) {
|
|
||||||
sharedPreferences
|
|
||||||
.edit()
|
|
||||||
.putBoolean(SHARED_PREFS_KEY_FILTER_CHANNEL_SELECTED_ + channelName, checked)
|
|
||||||
.apply();
|
|
||||||
button.setChecked(checked);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface Listener {
|
public interface Listener {
|
||||||
|
void onLengthChanged();
|
||||||
|
|
||||||
void onChannelsChanged();
|
void onChannelsChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -212,6 +212,16 @@ public class MediathekListFragment extends Fragment implements
|
|||||||
loadItems(0, true);
|
loadItems(0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLengthChanged() {
|
||||||
|
setMinLengthFilter();
|
||||||
|
loadItems(0, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMinLengthFilter() {
|
||||||
|
queryRequest.setMinLength(filter.getMinLength() * 60);
|
||||||
|
}
|
||||||
|
|
||||||
private void setChannelFilter() {
|
private void setChannelFilter() {
|
||||||
queryRequest.excludeChannels(filter.getExcludedChannels());
|
queryRequest.excludeChannels(filter.getExcludedChannels());
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,195 @@
|
|||||||
|
package de.christinecoenen.code.zapp.utils.view;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.TypedArray;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.ToggleButton;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import butterknife.BindView;
|
||||||
|
import butterknife.ButterKnife;
|
||||||
|
import de.christinecoenen.code.zapp.R;
|
||||||
|
|
||||||
|
public class PillowButtonScrollerFragment extends Fragment {
|
||||||
|
private static final String ARG_SHARED_PREFS_PREFIX = "ARG_SHARED_PREFS_PREFIX";
|
||||||
|
private static final String ARG_KEY_LIST = "ARG_KEY_LIST";
|
||||||
|
private static final String ARG_LABEL_LIST = "ARG_LABEL_LIST";
|
||||||
|
|
||||||
|
|
||||||
|
@BindView(R.id.container_toggle_buttons)
|
||||||
|
protected LinearLayout buttonContainer;
|
||||||
|
|
||||||
|
|
||||||
|
private String sharedPrefsPrefix;
|
||||||
|
private String[] keyList;
|
||||||
|
private String[] labelList;
|
||||||
|
|
||||||
|
private Listener listener;
|
||||||
|
private SharedPreferences sharedPreferences;
|
||||||
|
|
||||||
|
public PillowButtonScrollerFragment() {
|
||||||
|
// Required empty public constructor
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PillowButtonScrollerFragment newInstance(String sharedPrefsPrefix, String[] keyList, String[] labelList) {
|
||||||
|
PillowButtonScrollerFragment fragment = new PillowButtonScrollerFragment();
|
||||||
|
Bundle args = new Bundle();
|
||||||
|
args.putString(ARG_SHARED_PREFS_PREFIX, sharedPrefsPrefix);
|
||||||
|
args.putStringArray(ARG_KEY_LIST, keyList);
|
||||||
|
args.putStringArray(ARG_LABEL_LIST, labelList);
|
||||||
|
fragment.setArguments(args);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getExcludedKeys() {
|
||||||
|
ArrayList<String> excludedKeys = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < buttonContainer.getChildCount(); i++) {
|
||||||
|
ToggleButton button = (ToggleButton) buttonContainer.getChildAt(i);
|
||||||
|
if (!button.isChecked()) {
|
||||||
|
excludedKeys.add(keyList[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return excludedKeys.toArray(new String[excludedKeys.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getIncludedKeys() {
|
||||||
|
ArrayList<String> includedKeys = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < buttonContainer.getChildCount(); i++) {
|
||||||
|
ToggleButton button = (ToggleButton) buttonContainer.getChildAt(i);
|
||||||
|
if (button.isChecked()) {
|
||||||
|
includedKeys.add(keyList[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return includedKeys.toArray(new String[includedKeys.size()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setListener(Listener listener) {
|
||||||
|
this.listener = listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) {
|
||||||
|
super.onInflate(context, attrs, savedInstanceState);
|
||||||
|
|
||||||
|
TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.PillowButtonScrollerFragment);
|
||||||
|
|
||||||
|
int keyListResId = attributes.getResourceId(R.styleable.PillowButtonScrollerFragment_key_list_res_id, 0);
|
||||||
|
int labelListResId = attributes.getResourceId(R.styleable.PillowButtonScrollerFragment_label_list_res_id, 0);
|
||||||
|
sharedPrefsPrefix = attributes.getString(R.styleable.PillowButtonScrollerFragment_shared_prefs_prefix);
|
||||||
|
|
||||||
|
if (keyListResId == 0 || labelListResId == 0 || sharedPrefsPrefix == null) {
|
||||||
|
throw new IllegalArgumentException("shared_prefs_prefix, key_list_res_id and label_list_res_id habe to set in xml layout");
|
||||||
|
}
|
||||||
|
|
||||||
|
keyList = getResources().getStringArray(keyListResId);
|
||||||
|
labelList = getResources().getStringArray(labelListResId);
|
||||||
|
|
||||||
|
attributes.recycle();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
if (getArguments() != null) {
|
||||||
|
sharedPrefsPrefix = getArguments().getString(ARG_SHARED_PREFS_PREFIX);
|
||||||
|
keyList = getArguments().getStringArray(ARG_KEY_LIST);
|
||||||
|
labelList = getArguments().getStringArray(ARG_LABEL_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
|
sharedPreferences = Objects.requireNonNull(getActivity()).getPreferences(Context.MODE_PRIVATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_pillow_button_scroller, container, false);
|
||||||
|
ButterKnife.bind(this, view);
|
||||||
|
|
||||||
|
for (int i = 0; i< labelList.length; i++) {
|
||||||
|
addButton(inflater, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetach() {
|
||||||
|
super.onDetach();
|
||||||
|
listener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addButton(LayoutInflater inflater, int index) {
|
||||||
|
String label = labelList[index];
|
||||||
|
String key = labelList[index];
|
||||||
|
|
||||||
|
ToggleButton channelButton = (ToggleButton) inflater.inflate(
|
||||||
|
R.layout.fragment_pillow_button_scroller_toggle_button,
|
||||||
|
buttonContainer, false);
|
||||||
|
channelButton.setTextOff(label);
|
||||||
|
channelButton.setTextOn(label);
|
||||||
|
channelButton.setTag(index);
|
||||||
|
|
||||||
|
boolean isChecked = sharedPreferences.getBoolean(sharedPrefsPrefix + "_" + key, true);
|
||||||
|
channelButton.setChecked(isChecked);
|
||||||
|
|
||||||
|
channelButton.setOnClickListener(this::onButtonClicked);
|
||||||
|
channelButton.setOnLongClickListener(this::onButtonLongClicked);
|
||||||
|
buttonContainer.addView(channelButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void onButtonClicked(View view) {
|
||||||
|
ToggleButton button = (ToggleButton) view;
|
||||||
|
setChannelButton(button, button.isChecked());
|
||||||
|
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onValuesChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean onButtonLongClicked(View view) {
|
||||||
|
ToggleButton button = (ToggleButton) view;
|
||||||
|
boolean isOnlyOneChecked = getIncludedKeys().length <= 1;
|
||||||
|
boolean doOthersCheck = button.isChecked() && isOnlyOneChecked;
|
||||||
|
|
||||||
|
for (int i = 0; i < buttonContainer.getChildCount(); i++) {
|
||||||
|
ToggleButton channelButton = (ToggleButton) buttonContainer.getChildAt(i);
|
||||||
|
if (channelButton != button) {
|
||||||
|
setChannelButton(channelButton, doOthersCheck);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setChannelButton(button, true);
|
||||||
|
|
||||||
|
if (listener != null) {
|
||||||
|
listener.onValuesChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setChannelButton(ToggleButton button, boolean checked) {
|
||||||
|
int index = (int) button.getTag();
|
||||||
|
|
||||||
|
sharedPreferences
|
||||||
|
.edit()
|
||||||
|
.putBoolean(sharedPrefsPrefix + "_" + keyList[index], checked)
|
||||||
|
.apply();
|
||||||
|
|
||||||
|
button.setChecked(checked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface Listener {
|
||||||
|
void onValuesChanged();
|
||||||
|
}
|
||||||
|
}
|
@ -28,54 +28,52 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/fragment_mediathek_filter_duration"
|
android:text="@string/fragment_mediathek_filter_duration"
|
||||||
android:visibility="gone"
|
app:layout_constraintBottom_toBottomOf="@+id/fragment_length_filter"
|
||||||
app:layout_constraintStart_toStartOf="parent" />
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/fragment_length_filter" />
|
||||||
|
|
||||||
<SeekBar
|
<fragment
|
||||||
android:id="@+id/seekbar_duration"
|
android:id="@+id/fragment_length_filter"
|
||||||
|
android:name="de.christinecoenen.code.zapp.utils.view.PillowButtonScrollerFragment"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
||||||
android:max="300"
|
android:layout_marginTop="8dp"
|
||||||
android:visibility="gone"
|
app:key_list_res_id="@array/mediathek_length_keys"
|
||||||
app:layout_constraintBottom_toBottomOf="@+id/label_duration"
|
app:label_list_res_id="@array/mediathek_length_labels"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/barrier_labels_end"
|
app:layout_constraintStart_toEndOf="@id/barrier_labels_end"
|
||||||
app:layout_constraintTop_toTopOf="@+id/label_duration" />
|
app:layout_constraintTop_toBottomOf="@+id/fragment_channel_filter"
|
||||||
|
app:shared_prefs_prefix="SHARED_PREFS_KEY_FILTER_LENGTH_SELECTED" />
|
||||||
|
|
||||||
<android.support.constraint.Barrier
|
<android.support.constraint.Barrier
|
||||||
android:id="@+id/barrier_duration_bottom"
|
android:id="@+id/barrier_duration_bottom"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:barrierDirection="bottom"
|
app:barrierDirection="bottom"
|
||||||
app:constraint_referenced_ids="label_duration,seekbar_duration" />
|
app:constraint_referenced_ids="label_duration,fragment_length_filter" />
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/label_channels"
|
android:id="@+id/label_channels"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="@string/fragment_mediathek_filter_channel"
|
android:text="@string/fragment_mediathek_filter_channel"
|
||||||
app:layout_constraintBottom_toBottomOf="@id/channel_scroller"
|
app:layout_constraintBottom_toBottomOf="@id/fragment_channel_filter"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toTopOf="@id/channel_scroller" />
|
app:layout_constraintTop_toTopOf="@id/fragment_channel_filter" />
|
||||||
|
|
||||||
<HorizontalScrollView
|
<fragment
|
||||||
android:id="@+id/channel_scroller"
|
android:id="@+id/fragment_channel_filter"
|
||||||
|
android:name="de.christinecoenen.code.zapp.utils.view.PillowButtonScrollerFragment"
|
||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
||||||
android:scrollbars="none"
|
app:key_list_res_id="@array/mediathek_channel_keys"
|
||||||
|
app:label_list_res_id="@array/mediathek_channel_keys"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
app:layout_constraintStart_toEndOf="@id/barrier_labels_end"
|
app:layout_constraintStart_toEndOf="@id/barrier_labels_end"
|
||||||
app:layout_constraintTop_toBottomOf="@id/barrier_duration_bottom">
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:shared_prefs_prefix="SHARED_PREFS_KEY_FILTER_CHANNEL_SELECTED" />
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container_channel_buttons"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="horizontal" />
|
|
||||||
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
</android.support.constraint.ConstraintLayout>
|
</android.support.constraint.ConstraintLayout>
|
||||||
|
|
||||||
|
17
app/src/main/res/layout/fragment_pillow_button_scroller.xml
Normal file
17
app/src/main/res/layout/fragment_pillow_button_scroller.xml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/channel_scroller"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:scrollbars="none"
|
||||||
|
tools:context=".utils.view.PillowButtonScrollerFragment">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/container_toggle_buttons"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="horizontal" />
|
||||||
|
|
||||||
|
</HorizontalScrollView>
|
@ -2,7 +2,7 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<array name="empty" />
|
<array name="empty" />
|
||||||
|
|
||||||
<string-array name="mediathek_channels">
|
<string-array name="mediathek_channel_keys">
|
||||||
<item>ARD</item>
|
<item>ARD</item>
|
||||||
<item>ZDF</item>
|
<item>ZDF</item>
|
||||||
<item>BR</item>
|
<item>BR</item>
|
||||||
@ -24,4 +24,20 @@
|
|||||||
<item>SRF.Podcast</item>
|
<item>SRF.Podcast</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="mediathek_length_keys">
|
||||||
|
<item>0_6</item>
|
||||||
|
<item>6_15</item>
|
||||||
|
<item>15_35</item>
|
||||||
|
<item>35_65</item>
|
||||||
|
<item>65_1000</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<string-array name="mediathek_length_labels">
|
||||||
|
<item>@string/fragment_mediathek_length_label_0</item>
|
||||||
|
<item>@string/fragment_mediathek_length_label_1</item>
|
||||||
|
<item>@string/fragment_mediathek_length_label_2</item>
|
||||||
|
<item>@string/fragment_mediathek_length_label_3</item>
|
||||||
|
<item>@string/fragment_mediathek_length_label_4</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -9,4 +9,10 @@
|
|||||||
<attr name="metaButtonBarButtonStyle" format="reference" />
|
<attr name="metaButtonBarButtonStyle" format="reference" />
|
||||||
</declare-styleable>
|
</declare-styleable>
|
||||||
|
|
||||||
|
<declare-styleable name="PillowButtonScrollerFragment">
|
||||||
|
<attr name="shared_prefs_prefix" format="string"/>
|
||||||
|
<attr name="key_list_res_id" format="reference"/>
|
||||||
|
<attr name="label_list_res_id" format="reference"/>
|
||||||
|
</declare-styleable>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -38,6 +38,11 @@
|
|||||||
|
|
||||||
<string name="fragment_mediathek_filter_duration">Dauer</string>
|
<string name="fragment_mediathek_filter_duration">Dauer</string>
|
||||||
<string name="fragment_mediathek_filter_channel">Sender</string>
|
<string name="fragment_mediathek_filter_channel">Sender</string>
|
||||||
|
<string name="fragment_mediathek_length_label_0">0–6m</string>
|
||||||
|
<string name="fragment_mediathek_length_label_1">6–15m</string>
|
||||||
|
<string name="fragment_mediathek_length_label_2">15–35m</string>
|
||||||
|
<string name="fragment_mediathek_length_label_3">35–65m</string>
|
||||||
|
<string name="fragment_mediathek_length_label_4">65+</string>
|
||||||
|
|
||||||
<string name="fragment_mediathek_download_started">Download von \'%s\' gestartet…</string>
|
<string name="fragment_mediathek_download_started">Download von \'%s\' gestartet…</string>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user