Add board and catalog link to drawer

filtering
Floens 10 years ago
parent ce989cb4ed
commit e3519915b2
  1. 130
      Clover/app/src/main/java/org/floens/chan/ui/adapter/PinAdapter.java
  2. 24
      Clover/app/src/main/java/org/floens/chan/ui/cell/PinCell.java
  3. 2
      Clover/app/src/main/java/org/floens/chan/ui/controller/RootNavigationController.java
  4. 8
      Clover/app/src/main/java/org/floens/chan/ui/helper/SwipeListener.java
  5. BIN
      Clover/app/src/main/res/drawable-hdpi/ic_view_list_24dp.png
  6. BIN
      Clover/app/src/main/res/drawable-hdpi/ic_view_module_24dp.png
  7. BIN
      Clover/app/src/main/res/drawable-mdpi/ic_view_list_24dp.png
  8. BIN
      Clover/app/src/main/res/drawable-mdpi/ic_view_module_24dp.png
  9. BIN
      Clover/app/src/main/res/drawable-xhdpi/ic_view_list_24dp.png
  10. BIN
      Clover/app/src/main/res/drawable-xhdpi/ic_view_module_24dp.png
  11. BIN
      Clover/app/src/main/res/drawable-xxhdpi/ic_view_list_24dp.png
  12. BIN
      Clover/app/src/main/res/drawable-xxhdpi/ic_view_module_24dp.png
  13. BIN
      Clover/app/src/main/res/drawable-xxxhdpi/ic_view_list_24dp.png
  14. BIN
      Clover/app/src/main/res/drawable-xxxhdpi/ic_view_module_24dp.png
  15. 19
      Clover/app/src/main/res/layout/cell_header.xml
  16. 30
      Clover/app/src/main/res/layout/cell_link.xml
  17. 63
      Clover/app/src/main/res/layout/cell_pin.xml
  18. 1
      Clover/app/src/main/res/layout/controller_navigation_drawer.xml
  19. 8
      Clover/app/src/main/res/values/strings.xml

@ -4,45 +4,101 @@ import android.support.v7.widget.RecyclerView;
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.ImageView;
import android.widget.TextView; import android.widget.TextView;
import org.floens.chan.ChanApplication; import org.floens.chan.ChanApplication;
import org.floens.chan.R; import org.floens.chan.R;
import org.floens.chan.core.model.Pin; 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.helper.SwipeListener;
import org.floens.chan.ui.view.ThumbnailView; import org.floens.chan.ui.view.ThumbnailView;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.floens.chan.utils.AndroidUtils.ROBOTO_MEDIUM;
import static org.floens.chan.utils.AndroidUtils.dp; import static org.floens.chan.utils.AndroidUtils.dp;
public class PinAdapter extends RecyclerView.Adapter<PinAdapter.PinViewHolder> implements SwipeListener.Callback { public class PinAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 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 final Callback callback;
private List<Pin> pins = new ArrayList<>(); private List<Pin> pins = new ArrayList<>();
public PinAdapter(Callback callback) { public PinAdapter(Callback callback) {
this.callback = callback; this.callback = callback;
setHasStableIds(true);
} }
@Override @Override
public PinViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
PinCell pinCell = (PinCell) LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_pin, parent, false); switch (viewType) {
return new PinViewHolder(pinCell); 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 @Override
public void onBindViewHolder(PinViewHolder holder, int position) { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final Pin pin = pins.get(position); switch (holder.getItemViewType()) {
case TYPE_HEADER:
holder.textView.setText(pin.loadable.title); ((PinHeaderHolder) holder).text.setText(R.string.drawer_pinned);
holder.image.setUrl(pin.thumbnailUrl, dp(40), dp(40)); 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 @Override
public int getItemCount() { 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<Pin> pins) { public void onPinsChanged(List<Pin> pins) {
@ -53,7 +109,7 @@ public class PinAdapter extends RecyclerView.Adapter<PinAdapter.PinViewHolder> i
public void onPinAdded(Pin pin) { public void onPinAdded(Pin pin) {
pins.add(pin); pins.add(pin);
notifyItemInserted(pins.size() - 1); notifyItemInserted(pins.size() - 1 + 3);
} }
public void onPinRemoved(Pin pin) { public void onPinRemoved(Pin pin) {
@ -64,33 +120,33 @@ public class PinAdapter extends RecyclerView.Adapter<PinAdapter.PinViewHolder> i
} else { } else {
int location = pins.indexOf(pin); int location = pins.indexOf(pin);
pins.remove(pin); pins.remove(pin);
notifyItemRemoved(location); notifyItemRemoved(location + 3);
} }
} }
public void onPinChanged(Pin pin) { public void onPinChanged(Pin pin) {
notifyItemChanged(pins.indexOf(pin)); notifyItemChanged(pins.indexOf(pin) + 3);
} }
@Override @Override
public SwipeListener.Swipeable getSwipeable(int position) { public SwipeListener.Swipeable getSwipeable(int position) {
return SwipeListener.Swipeable.RIGHT; return getItemViewType(position) == TYPE_PIN ? SwipeListener.Swipeable.RIGHT : SwipeListener.Swipeable.NO;
} }
@Override @Override
public void removeItem(int position) { public void removeItem(int position) {
ChanApplication.getWatchManager().removePin(pins.get(position)); ChanApplication.getWatchManager().removePin(pins.get(position - 3));
} }
@Override @Override
public boolean isMoveable(int position) { public boolean isMoveable(int position) {
return true; return getItemViewType(position) == TYPE_PIN;
} }
@Override @Override
public void moveItem(int from, int to) { public void moveItem(int from, int to) {
Pin item = pins.remove(from); Pin item = pins.remove(from - 3);
pins.add(to, item); pins.add(to - 3, item);
notifyItemMoved(from, to); notifyItemMoved(from, to);
} }
@ -99,21 +155,49 @@ public class PinAdapter extends RecyclerView.Adapter<PinAdapter.PinViewHolder> i
} }
public class PinViewHolder extends RecyclerView.ViewHolder { public class PinViewHolder extends RecyclerView.ViewHolder {
private PinCell pinCell;
private ThumbnailView image; private ThumbnailView image;
private TextView textView; private TextView textView;
public PinViewHolder(PinCell pinCell) { public PinViewHolder(View pinCell) {
super(pinCell); super(pinCell);
this.pinCell = pinCell;
image = (ThumbnailView) pinCell.findViewById(R.id.thumb); image = (ThumbnailView) pinCell.findViewById(R.id.thumb);
image.setCircular(true); image.setCircular(true);
textView = (TextView) pinCell.findViewById(R.id.text); textView = (TextView) pinCell.findViewById(R.id.text);
textView.setTypeface(ROBOTO_MEDIUM);
pinCell.setOnClickListener(new View.OnClickListener() { pinCell.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { 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) {
} }
}); });
} }

@ -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();
}
}

@ -61,6 +61,7 @@ public class RootNavigationController extends NavigationController implements Pi
toolbar = (Toolbar) view.findViewById(R.id.toolbar); toolbar = (Toolbar) view.findViewById(R.id.toolbar);
container = (FrameLayout) view.findViewById(R.id.container); container = (FrameLayout) view.findViewById(R.id.container);
drawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout); drawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout);
drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.LEFT);
drawer = (FrameLayout) view.findViewById(R.id.drawer); drawer = (FrameLayout) view.findViewById(R.id.drawer);
recyclerView = (RecyclerView) view.findViewById(R.id.drawer_recycler_view); recyclerView = (RecyclerView) view.findViewById(R.id.drawer_recycler_view);
recyclerView.setHasFixedSize(true); recyclerView.setHasFixedSize(true);
@ -127,6 +128,7 @@ public class RootNavigationController extends NavigationController implements Pi
public void onEvent(WatchManager.PinAddedMessage message) { public void onEvent(WatchManager.PinAddedMessage message) {
pinAdapter.onPinAdded(message.pin); pinAdapter.onPinAdded(message.pin);
drawerLayout.openDrawer(drawer);
} }
public void onEvent(WatchManager.PinRemovedMessage message) { public void onEvent(WatchManager.PinRemovedMessage message) {

@ -307,9 +307,11 @@ public class SwipeListener extends RecyclerView.ItemDecoration implements Recycl
if ((touchAdapterPos > dragPosition && floatingViewPos > viewAtPosition.getTop() + viewAtPosition.getHeight() / 5f) || if ((touchAdapterPos > dragPosition && floatingViewPos > viewAtPosition.getTop() + viewAtPosition.getHeight() / 5f) ||
(touchAdapterPos < dragPosition && floatingViewPos < viewAtPosition.getTop() + viewAtPosition.getHeight() * 4f / 5f)) { (touchAdapterPos < dragPosition && floatingViewPos < viewAtPosition.getTop() + viewAtPosition.getHeight() * 4f / 5f)) {
callback.moveItem(dragPosition, touchAdapterPos); if (callback.isMoveable(touchAdapterPos)) {
dragPosition = touchAdapterPos; callback.moveItem(dragPosition, touchAdapterPos);
somePositionChanged = true; dragPosition = touchAdapterPos;
somePositionChanged = true;
}
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 B

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="48dp">
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="48dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="#ff757575"
android:textSize="14sp" />
</LinearLayout>

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="?attr/selectableItemBackground">
<ImageView
android:id="@+id/image"
android:layout_width="56dp"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:scaleType="center"
android:layout_gravity="center_vertical" />
<TextView
android:id="@+id/text"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:ellipsize="end"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="#ff212121"
android:textSize="14sp" />
</LinearLayout>

@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.floens.chan.ui.cell.PinCell xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp"> android:layout_height="48dp"
android:background="?attr/selectableItemBackground">
<org.floens.chan.ui.view.ThumbnailView <org.floens.chan.ui.view.ThumbnailView
android:id="@+id/thumb" android:id="@+id/thumb"
android:layout_width="60dp" android:layout_width="56dp"
android:layout_height="48dp" android:layout_height="48dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:paddingTop="4dp" android:paddingTop="4dp"
android:paddingRight="4dp" android:paddingRight="0dp"
android:paddingBottom="4dp" android:paddingBottom="4dp" />
android:scaleType="centerCrop" />
<TextView <TextView
android:id="@+id/text" android:id="@+id/text"
@ -21,51 +21,10 @@
android:layout_weight="1" android:layout_weight="1"
android:ellipsize="end" android:ellipsize="end"
android:gravity="center_vertical" android:gravity="center_vertical"
android:paddingBottom="12dp" android:paddingLeft="16dp"
android:paddingLeft="8dp" android:paddingRight="16dp"
android:paddingRight="8dp"
android:paddingTop="8dp"
android:singleLine="true" android:singleLine="true"
android:textColor="#ff757575" android:textColor="#ff212121"
android:textSize="19sp" /> android:textSize="14sp" />
<!--<FrameLayout
android:id="@+id/time_container"
android:layout_width="48dp"
android:layout_height="48dp"
android:paddingLeft="4dp">
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center"
android:lines="1"
android:minWidth="36dp"
android:textColor="#fff"
android:textSize="16dp" />
</FrameLayout>
<FrameLayout
android:id="@+id/count_container"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/pin_icon_blue">
<TextView
android:id="@+id/count"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textColor="#fff"
android:textSize="16dp" />
<ProgressBar
android:id="@+id/load"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>-->
</org.floens.chan.ui.cell.PinCell> </LinearLayout>

@ -52,7 +52,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/drawer_recycler_view" android:id="@+id/drawer_recycler_view"
android:scrollbars="vertical" android:scrollbars="vertical"
android:paddingTop="16dp"
android:paddingBottom="16dp" android:paddingBottom="16dp"
android:clipToPadding="false" android:clipToPadding="false"
android:scrollbarStyle="outsideOverlay" android:scrollbarStyle="outsideOverlay"

@ -96,11 +96,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="board_edit_enable_filler">Show filler</string> <string name="board_edit_enable_filler">Show filler</string>
<string name="board_delete">Remove board?</string> <string name="board_delete">Remove board?</string>
<string name="drawer_open">Open drawer</string> <string name="drawer_board">Board</string>
<string name="drawer_close">Close drawer</string> <string name="drawer_catalog">Catalog</string>
<string name="drawer_pinned">Pinned threads</string> <string name="drawer_pinned">Watching threads</string>
<string name="drawer_pinned_delete">Delete pin</string> <string name="drawer_pinned_delete">Delete pin</string>
<string name="drawer_pinned_change_title">Edit title</string> <string name="drawer_pinned_change_title">Edit title</string>
<string name="drawer_open">Open drawer</string>
<string name="drawer_close">Close drawer</string>
<string name="one_reply">reply</string> <string name="one_reply">reply</string>
<string name="multiple_replies">replies</string> <string name="multiple_replies">replies</string>

Loading…
Cancel
Save