diff --git a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinAdapter.java b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinAdapter.java index 9390ce21..ebc101fa 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinAdapter.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/adapter/PinAdapter.java @@ -4,45 +4,101 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.core.model.Pin; -import org.floens.chan.ui.cell.PinCell; import org.floens.chan.ui.helper.SwipeListener; import org.floens.chan.ui.view.ThumbnailView; import java.util.ArrayList; import java.util.List; +import static org.floens.chan.utils.AndroidUtils.ROBOTO_MEDIUM; import static org.floens.chan.utils.AndroidUtils.dp; -public class PinAdapter extends RecyclerView.Adapter implements SwipeListener.Callback { +public class PinAdapter extends RecyclerView.Adapter implements SwipeListener.Callback { + private static final int TYPE_HEADER = 0; + private static final int TYPE_PIN = 1; + private static final int TYPE_LINK = 2; + private final Callback callback; private List pins = new ArrayList<>(); public PinAdapter(Callback callback) { this.callback = callback; + setHasStableIds(true); } @Override - public PinViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - PinCell pinCell = (PinCell) LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_pin, parent, false); - return new PinViewHolder(pinCell); + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + switch (viewType) { + case TYPE_HEADER: + return new PinHeaderHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_header, parent, false)); + case TYPE_PIN: + return new PinViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_pin, parent, false)); + case TYPE_LINK: + return new LinkHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_link, parent, false)); + } + return null; } @Override - public void onBindViewHolder(PinViewHolder holder, int position) { - final Pin pin = pins.get(position); - - holder.textView.setText(pin.loadable.title); - holder.image.setUrl(pin.thumbnailUrl, dp(40), dp(40)); + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (holder.getItemViewType()) { + case TYPE_HEADER: + ((PinHeaderHolder) holder).text.setText(R.string.drawer_pinned); + break; + case TYPE_PIN: + final Pin pin = pins.get(position - 3); + PinViewHolder pinHolder = (PinViewHolder) holder; + pinHolder.textView.setText(pin.loadable.title); + pinHolder.image.setUrl(pin.thumbnailUrl, dp(40), dp(40)); + break; + case TYPE_LINK: + LinkHolder linkHolder = (LinkHolder) holder; + switch (position) { + case 0: + linkHolder.text.setText(R.string.drawer_board); + linkHolder.image.setImageResource(R.drawable.ic_view_list_24dp); + break; + case 1: + linkHolder.text.setText(R.string.drawer_catalog); + linkHolder.image.setImageResource(R.drawable.ic_view_module_24dp); + break; + } + break; + } } @Override public int getItemCount() { - return pins.size(); + return pins.size() + 3; + } + + @Override + public long getItemId(int position) { + position -= 3; + if (position >= 0 && position < pins.size()) { + return pins.get(position).id + 10; + } else { + return position; + } + } + + @Override + public int getItemViewType(int position) { + switch (position) { + case 0: + case 1: + return TYPE_LINK; + case 2: + return TYPE_HEADER; + default: + return TYPE_PIN; + } } public void onPinsChanged(List pins) { @@ -53,7 +109,7 @@ public class PinAdapter extends RecyclerView.Adapter i public void onPinAdded(Pin pin) { pins.add(pin); - notifyItemInserted(pins.size() - 1); + notifyItemInserted(pins.size() - 1 + 3); } public void onPinRemoved(Pin pin) { @@ -64,33 +120,33 @@ public class PinAdapter extends RecyclerView.Adapter i } else { int location = pins.indexOf(pin); pins.remove(pin); - notifyItemRemoved(location); + notifyItemRemoved(location + 3); } } public void onPinChanged(Pin pin) { - notifyItemChanged(pins.indexOf(pin)); + notifyItemChanged(pins.indexOf(pin) + 3); } @Override public SwipeListener.Swipeable getSwipeable(int position) { - return SwipeListener.Swipeable.RIGHT; + return getItemViewType(position) == TYPE_PIN ? SwipeListener.Swipeable.RIGHT : SwipeListener.Swipeable.NO; } @Override public void removeItem(int position) { - ChanApplication.getWatchManager().removePin(pins.get(position)); + ChanApplication.getWatchManager().removePin(pins.get(position - 3)); } @Override public boolean isMoveable(int position) { - return true; + return getItemViewType(position) == TYPE_PIN; } @Override public void moveItem(int from, int to) { - Pin item = pins.remove(from); - pins.add(to, item); + Pin item = pins.remove(from - 3); + pins.add(to - 3, item); notifyItemMoved(from, to); } @@ -99,21 +155,49 @@ public class PinAdapter extends RecyclerView.Adapter i } public class PinViewHolder extends RecyclerView.ViewHolder { - private PinCell pinCell; private ThumbnailView image; private TextView textView; - public PinViewHolder(PinCell pinCell) { + public PinViewHolder(View pinCell) { super(pinCell); - this.pinCell = pinCell; image = (ThumbnailView) pinCell.findViewById(R.id.thumb); image.setCircular(true); textView = (TextView) pinCell.findViewById(R.id.text); + textView.setTypeface(ROBOTO_MEDIUM); pinCell.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - callback.onPinClicked(pins.get(getAdapterPosition())); + callback.onPinClicked(pins.get(getAdapterPosition() - 3)); + } + }); + } + } + + public class PinHeaderHolder extends RecyclerView.ViewHolder { + private TextView text; + + public PinHeaderHolder(View itemView) { + super(itemView); + text = (TextView) itemView.findViewById(R.id.text); + text.setTypeface(ROBOTO_MEDIUM); + } + } + + public class LinkHolder extends RecyclerView.ViewHolder { + private ImageView image; + private TextView text; + + public LinkHolder(View itemView) { + super(itemView); + image = (ImageView) itemView.findViewById(R.id.image); + text = (TextView) itemView.findViewById(R.id.text); + text.setTypeface(ROBOTO_MEDIUM); + + itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + } }); } diff --git a/Clover/app/src/main/java/org/floens/chan/ui/cell/PinCell.java b/Clover/app/src/main/java/org/floens/chan/ui/cell/PinCell.java deleted file mode 100644 index 2e1bd5d3..00000000 --- a/Clover/app/src/main/java/org/floens/chan/ui/cell/PinCell.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.floens.chan.ui.cell; - -import android.content.Context; -import android.util.AttributeSet; -import android.widget.LinearLayout; - -public class PinCell extends LinearLayout { - public PinCell(Context context) { - super(context); - } - - public PinCell(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public PinCell(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - } -} diff --git a/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java b/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java index 7942bf73..e209ca2d 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java @@ -61,6 +61,7 @@ public class RootNavigationController extends NavigationController implements Pi toolbar = (Toolbar) view.findViewById(R.id.toolbar); container = (FrameLayout) view.findViewById(R.id.container); drawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout); + drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.LEFT); drawer = (FrameLayout) view.findViewById(R.id.drawer); recyclerView = (RecyclerView) view.findViewById(R.id.drawer_recycler_view); recyclerView.setHasFixedSize(true); @@ -127,6 +128,7 @@ public class RootNavigationController extends NavigationController implements Pi public void onEvent(WatchManager.PinAddedMessage message) { pinAdapter.onPinAdded(message.pin); + drawerLayout.openDrawer(drawer); } public void onEvent(WatchManager.PinRemovedMessage message) { diff --git a/Clover/app/src/main/java/org/floens/chan/ui/helper/SwipeListener.java b/Clover/app/src/main/java/org/floens/chan/ui/helper/SwipeListener.java index 9851b392..ef7c7f28 100644 --- a/Clover/app/src/main/java/org/floens/chan/ui/helper/SwipeListener.java +++ b/Clover/app/src/main/java/org/floens/chan/ui/helper/SwipeListener.java @@ -307,9 +307,11 @@ public class SwipeListener extends RecyclerView.ItemDecoration implements Recycl if ((touchAdapterPos > dragPosition && floatingViewPos > viewAtPosition.getTop() + viewAtPosition.getHeight() / 5f) || (touchAdapterPos < dragPosition && floatingViewPos < viewAtPosition.getTop() + viewAtPosition.getHeight() * 4f / 5f)) { - callback.moveItem(dragPosition, touchAdapterPos); - dragPosition = touchAdapterPos; - somePositionChanged = true; + if (callback.isMoveable(touchAdapterPos)) { + callback.moveItem(dragPosition, touchAdapterPos); + dragPosition = touchAdapterPos; + somePositionChanged = true; + } } } diff --git a/Clover/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png b/Clover/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png new file mode 100644 index 00000000..c031adcc Binary files /dev/null and b/Clover/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png b/Clover/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png new file mode 100644 index 00000000..dd64ea98 Binary files /dev/null and b/Clover/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png b/Clover/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png new file mode 100644 index 00000000..b90d335f Binary files /dev/null and b/Clover/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png b/Clover/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png new file mode 100644 index 00000000..538b8f23 Binary files /dev/null and b/Clover/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png b/Clover/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png new file mode 100644 index 00000000..0e7f15a4 Binary files /dev/null and b/Clover/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png b/Clover/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png new file mode 100644 index 00000000..3732eefa Binary files /dev/null and b/Clover/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png b/Clover/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png new file mode 100644 index 00000000..ccedde14 Binary files /dev/null and b/Clover/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png b/Clover/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png new file mode 100644 index 00000000..8d3af602 Binary files /dev/null and b/Clover/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png b/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png new file mode 100644 index 00000000..f2c9d42d Binary files /dev/null and b/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png differ diff --git a/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png b/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png new file mode 100644 index 00000000..41e1a793 Binary files /dev/null and b/Clover/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png differ diff --git a/Clover/app/src/main/res/layout/cell_header.xml b/Clover/app/src/main/res/layout/cell_header.xml new file mode 100644 index 00000000..856e6338 --- /dev/null +++ b/Clover/app/src/main/res/layout/cell_header.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/Clover/app/src/main/res/layout/cell_link.xml b/Clover/app/src/main/res/layout/cell_link.xml new file mode 100644 index 00000000..5aede947 --- /dev/null +++ b/Clover/app/src/main/res/layout/cell_link.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/Clover/app/src/main/res/layout/cell_pin.xml b/Clover/app/src/main/res/layout/cell_pin.xml index 833625cb..d13567ea 100644 --- a/Clover/app/src/main/res/layout/cell_pin.xml +++ b/Clover/app/src/main/res/layout/cell_pin.xml @@ -1,18 +1,18 @@ - + android:layout_height="48dp" + android:background="?attr/selectableItemBackground"> + android:paddingRight="0dp" + android:paddingBottom="4dp" /> - - + android:textColor="#ff212121" + android:textSize="14sp" /> - + diff --git a/Clover/app/src/main/res/layout/controller_navigation_drawer.xml b/Clover/app/src/main/res/layout/controller_navigation_drawer.xml index b2796cb7..8d6d73b0 100644 --- a/Clover/app/src/main/res/layout/controller_navigation_drawer.xml +++ b/Clover/app/src/main/res/layout/controller_navigation_drawer.xml @@ -52,7 +52,6 @@ along with this program. If not, see . . Show filler Remove board? - Open drawer - Close drawer - Pinned threads + Board + Catalog + Watching threads Delete pin Edit title + Open drawer + Close drawer reply replies