Skip to content
Snippets Groups Projects
Commit 18d99a30 authored by Tamás Szabó's avatar Tamás Szabó
Browse files

favorites list implement

parent ce65a1c8
Branches
Tags
2 merge requests!12finished labor 6,!10implement ui and functionality
Showing
with 292 additions and 27 deletions
No preview for this file type
...@@ -83,4 +83,7 @@ dependencies { ...@@ -83,4 +83,7 @@ dependencies {
// Room // Room
implementation 'android.arch.persistence.room:runtime:1.0.0' implementation 'android.arch.persistence.room:runtime:1.0.0'
annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0'
// AndroidSwipeLayout
implementation 'com.daimajia.swipelayout:library:1.2.0@aar'
} }
package me.szaki.xkcd.xkcdbrowser.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import me.szaki.xkcd.xkcdbrowser.R;
import me.szaki.xkcd.xkcdbrowser.model.ComicStrip;
public class FavoriteListAdapter extends RecyclerView.Adapter<FavoriteListAdapter.ViewHolder> {
private List<ComicStrip> comicStrips;
private static ClickListener clickListener;
public FavoriteListAdapter() {
super();
this.comicStrips = new ArrayList<>();
}
static class ViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public TextView date;
public ViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title_text);
date = itemView.findViewById(R.id.date_text);
itemView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (FavoriteListAdapter.clickListener != null)
FavoriteListAdapter.clickListener.onDeleteClick(getAdapterPosition(), view);
}
});
itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if (FavoriteListAdapter.clickListener != null)
FavoriteListAdapter.clickListener.onClick(getAdapterPosition(), view);
return false;
}
});
}
}
public interface ClickListener {
void onClick(int position, View v);
void onDeleteClick(int position, View v);
}
@Override
public FavoriteListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.comic_strip, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(FavoriteListAdapter.ViewHolder holder, int position) {
ComicStrip comicStrip = this.comicStrips.get(position);
holder.title.setText(comicStrip.getTitle());
holder.date.setText(String.format("%s.%s.%s.", comicStrip.getYear(), comicStrip.getMonth(), comicStrip.getDay()));
}
@Override
public int getItemCount() {
return this.comicStrips.size();
}
public void updateList(List<ComicStrip> cList) {
this.comicStrips = cList;
this.notifyDataSetChanged();
}
public void setListener(ClickListener clickListener) {
this.clickListener = clickListener;
}
public ComicStrip getComicStripByNum(int position) {
return this.comicStrips.get(position);
}
}
package me.szaki.xkcd.xkcdbrowser.ui.favorites; package me.szaki.xkcd.xkcdbrowser.ui.favorites;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.FloatingActionButton; import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View; import android.view.View;
import android.support.design.widget.NavigationView; import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat; import android.support.v4.view.GravityCompat;
...@@ -12,11 +17,31 @@ import android.support.v7.app.AppCompatActivity; ...@@ -12,11 +17,31 @@ import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.LinearLayout;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import me.szaki.xkcd.xkcdbrowser.R; import me.szaki.xkcd.xkcdbrowser.R;
import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
import me.szaki.xkcd.xkcdbrowser.adapter.FavoriteListAdapter;
import me.szaki.xkcd.xkcdbrowser.model.ComicStrip;
import me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity;
import me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity;
public class FavoritesActivity extends AppCompatActivity public class FavoritesActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener { implements NavigationView.OnNavigationItemSelectedListener, FavoritesScreen, FavoriteListAdapter.ClickListener {
@Inject
FavoritesPresenter favoritesPresenter;
private FavoriteListAdapter mAdapter;
public FavoritesActivity() {
XKCDBrowserApplication.injector.inject(this);
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -25,15 +50,6 @@ public class FavoritesActivity extends AppCompatActivity ...@@ -25,15 +50,6 @@ public class FavoritesActivity extends AppCompatActivity
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
...@@ -42,6 +58,24 @@ public class FavoritesActivity extends AppCompatActivity ...@@ -42,6 +58,24 @@ public class FavoritesActivity extends AppCompatActivity
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(this);
RecyclerView recyclerView = findViewById(R.id.strips);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
recyclerView.setHasFixedSize(true);
// use a linear layout manager
LinearLayoutManager mLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
// specify an adapter (see also next example)
mAdapter = new FavoriteListAdapter();
recyclerView.setAdapter(mAdapter);
mAdapter.setListener(this);
} }
@Override @Override
...@@ -61,7 +95,9 @@ public class FavoritesActivity extends AppCompatActivity ...@@ -61,7 +95,9 @@ public class FavoritesActivity extends AppCompatActivity
int id = item.getItemId(); int id = item.getItemId();
if (id == R.id.nav_main) { if (id == R.id.nav_main) {
// Handle the camera action Intent i = new Intent(getApplicationContext(), MainActivity.class);
startActivity(i);
finish();
} else if (id == R.id.nav_favorites) { } else if (id == R.id.nav_favorites) {
} }
...@@ -70,4 +106,53 @@ public class FavoritesActivity extends AppCompatActivity ...@@ -70,4 +106,53 @@ public class FavoritesActivity extends AppCompatActivity
drawer.closeDrawer(GravityCompat.START); drawer.closeDrawer(GravityCompat.START);
return true; return true;
} }
@Override
protected void onStart() {
super.onStart();
this.favoritesPresenter.attachScreen(this);
favoritesPresenter.getData();
}
@Override
protected void onStop() {
super.onStop();
this.favoritesPresenter.detachScreen();
}
@Override
public void onClick(int position, View v) {
Intent i = new Intent(getApplicationContext(), DetailActivity.class);
startActivity(i);
}
@Override
public void onDeleteClick(int position, View v) {
favoritesPresenter.deleteData(mAdapter.getComicStripByNum(position));
}
@Override
public void dataReceived(final List<ComicStrip> strips) {
Handler mainHandler = new Handler(getApplicationContext().getMainLooper());
Runnable myRunnable = new Runnable() {
@Override
public void run() {
mAdapter.updateList(strips);
}
};
mainHandler.post(myRunnable);
}
@Override
public void deleteSucess() {
Snackbar.make(findViewById(android.R.id.content), "Deleted", Snackbar.LENGTH_SHORT)
.setAction("Action", null).show();
favoritesPresenter.getData();
}
} }
package me.szaki.xkcd.xkcdbrowser.ui.favorites; package me.szaki.xkcd.xkcdbrowser.ui.favorites;
import java.io.IOException;
import javax.inject.Inject; import javax.inject.Inject;
import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor;
import me.szaki.xkcd.xkcdbrowser.interactor.comics.DBInteractor; import me.szaki.xkcd.xkcdbrowser.interactor.comics.DBInteractor;
import me.szaki.xkcd.xkcdbrowser.model.ComicStrip;
import me.szaki.xkcd.xkcdbrowser.ui.Presenter; import me.szaki.xkcd.xkcdbrowser.ui.Presenter;
public class FavoritesPresenter extends Presenter<FavoritesScreen> { public class FavoritesPresenter extends Presenter<FavoritesScreen> {
@Inject
ComicsInteractor comicsInteractor;
@Inject @Inject
DBInteractor db; DBInteractor db;
...@@ -19,13 +20,23 @@ public class FavoritesPresenter extends Presenter<FavoritesScreen> { ...@@ -19,13 +20,23 @@ public class FavoritesPresenter extends Presenter<FavoritesScreen> {
XKCDBrowserApplication.injector.inject(this); XKCDBrowserApplication.injector.inject(this);
} }
public void getData () {
new Thread() {
@Override @Override
public void attachScreen(FavoritesScreen screen) { public void run() {
super.attachScreen(screen); screen.dataReceived(db.getComics());
}
}.start();
} }
public void deleteData(final ComicStrip c) {
new Thread() {
@Override @Override
public void detachScreen() { public void run() {
super.detachScreen(); db.deleteComic(c);
screen.deleteSucess();
} }
}.start();
}
} }
package me.szaki.xkcd.xkcdbrowser.ui.favorites; package me.szaki.xkcd.xkcdbrowser.ui.favorites;
import java.util.List;
import me.szaki.xkcd.xkcdbrowser.model.ComicStrip;
public interface FavoritesScreen { public interface FavoritesScreen {
public void dataReceived(List<ComicStrip> strips);
public void deleteSucess();
} }
package me.szaki.xkcd.xkcdbrowser.ui.main; package me.szaki.xkcd.xkcdbrowser.ui.main;
import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.net.Uri; import android.net.Uri;
...@@ -30,6 +31,8 @@ import javax.inject.Inject; ...@@ -30,6 +31,8 @@ import javax.inject.Inject;
import me.szaki.xkcd.xkcdbrowser.R; import me.szaki.xkcd.xkcdbrowser.R;
import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication;
import me.szaki.xkcd.xkcdbrowser.network.model.Comic; import me.szaki.xkcd.xkcdbrowser.network.model.Comic;
import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity;
import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesPresenter;
public class MainActivity extends AppCompatActivity public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, MainScreen { implements NavigationView.OnNavigationItemSelectedListener, MainScreen {
...@@ -114,7 +117,9 @@ public class MainActivity extends AppCompatActivity ...@@ -114,7 +117,9 @@ public class MainActivity extends AppCompatActivity
if (id == R.id.nav_main) { if (id == R.id.nav_main) {
// Handle the camera action // Handle the camera action
} else if (id == R.id.nav_favorites) { } else if (id == R.id.nav_favorites) {
Intent i = new Intent(getApplicationContext(), FavoritesActivity.class);
startActivity(i);
finish();
} }
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
......
app/src/main/res/drawable-hdpi/ic_delete.png

656 B

app/src/main/res/drawable-mdpi/ic_delete.png

410 B

app/src/main/res/drawable-xhdpi/ic_delete.png

590 B

app/src/main/res/drawable-xxhdpi/ic_delete.png

1.08 KiB

app/src/main/res/drawable-xxxhdpi/ic_delete.png

1.23 KiB

...@@ -22,12 +22,5 @@ ...@@ -22,12 +22,5 @@
<include layout="@layout/content_favorites" /> <include layout="@layout/content_favorites" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@android:drawable/ic_dialog_email" />
</android.support.design.widget.CoordinatorLayout> </android.support.design.widget.CoordinatorLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.daimajia.swipe.SwipeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:swipe="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
swipe:drag_edge="right"
swipe:show_mode="pull_out">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="40dp"
android:layout_height="match_parent" >
<Button
android:id="@+id/delete_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@null"
android:drawableStart="@drawable/ic_delete"
android:gravity="center"
android:maxHeight="60dp"
android:maxWidth="60dp"
android:textColor="@android:color/white" />
</FrameLayout>
</LinearLayout>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginTop="0dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/date_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="0dp"
android:layout_marginTop="0dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</com.daimajia.swipe.SwipeLayout>
\ No newline at end of file
...@@ -8,4 +8,13 @@ ...@@ -8,4 +8,13 @@
tools:context=".ui.favorites.FavoritesActivity" tools:context=".ui.favorites.FavoritesActivity"
tools:showIn="@layout/app_bar_favorites"> tools:showIn="@layout/app_bar_favorites">
<android.support.v7.widget.RecyclerView
android:id="@+id/strips"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout> </android.support.constraint.ConstraintLayout>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment