diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 8d8f6686a49d2b8ab802f0688ece582bb0079619..8a943cfe099d025c03643a051f15eaa3488d2e6a 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index d8973c9bba3fccac7e5d27e297004dc2f51997dc..87c3accf67628aad5f9194b351f1126065191cc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -83,4 +83,7 @@ dependencies { // Room implementation 'android.arch.persistence.room:runtime:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' + + // AndroidSwipeLayout + implementation 'com.daimajia.swipelayout:library:1.2.0@aar' } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/adapter/FavoriteListAdapter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/adapter/FavoriteListAdapter.java new file mode 100644 index 0000000000000000000000000000000000000000..8ba418703ccb23d0ecf94ca9022b741dfd0c43b9 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/adapter/FavoriteListAdapter.java @@ -0,0 +1,96 @@ +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); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java index 83bf35aa6e276b74a5700cb9a39e979720d76d7c..9c96cbd59e7eba6b42aac709106225236ff6f1bc 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java @@ -1,8 +1,13 @@ package me.szaki.xkcd.xkcdbrowser.ui.favorites; +import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.support.design.widget.FloatingActionButton; 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.support.design.widget.NavigationView; import android.support.v4.view.GravityCompat; @@ -12,11 +17,31 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; 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.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 - implements NavigationView.OnNavigationItemSelectedListener { + implements NavigationView.OnNavigationItemSelectedListener, FavoritesScreen, FavoriteListAdapter.ClickListener { + + @Inject + FavoritesPresenter favoritesPresenter; + private FavoriteListAdapter mAdapter; + + public FavoritesActivity() { + XKCDBrowserApplication.injector.inject(this); + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -25,15 +50,6 @@ public class FavoritesActivity extends AppCompatActivity Toolbar toolbar = (Toolbar) findViewById(R.id.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); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); @@ -42,6 +58,24 @@ public class FavoritesActivity extends AppCompatActivity NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 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 @@ -61,7 +95,9 @@ public class FavoritesActivity extends AppCompatActivity int id = item.getItemId(); 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) { } @@ -70,4 +106,53 @@ public class FavoritesActivity extends AppCompatActivity drawer.closeDrawer(GravityCompat.START); 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(); + } + + } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java index 33adfe57b14a069aaf6ddb326e5496df5b5603f1..8fbbd0ee9cf08303c41eab8924bc11914d314da4 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java @@ -1,16 +1,17 @@ package me.szaki.xkcd.xkcdbrowser.ui.favorites; +import java.io.IOException; + import javax.inject.Inject; import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; import me.szaki.xkcd.xkcdbrowser.interactor.comics.DBInteractor; +import me.szaki.xkcd.xkcdbrowser.model.ComicStrip; import me.szaki.xkcd.xkcdbrowser.ui.Presenter; public class FavoritesPresenter extends Presenter<FavoritesScreen> { - @Inject - ComicsInteractor comicsInteractor; @Inject DBInteractor db; @@ -19,13 +20,23 @@ public class FavoritesPresenter extends Presenter<FavoritesScreen> { XKCDBrowserApplication.injector.inject(this); } - @Override - public void attachScreen(FavoritesScreen screen) { - super.attachScreen(screen); + public void getData () { + new Thread() { + @Override + public void run() { + screen.dataReceived(db.getComics()); + } + }.start(); } - @Override - public void detachScreen() { - super.detachScreen(); + public void deleteData(final ComicStrip c) { + new Thread() { + @Override + public void run() { + db.deleteComic(c); + screen.deleteSucess(); + } + }.start(); } + } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java index 691e7d763c80a741a754df0c94a572bfc915a4cb..6862dcbd73fc8e44090259fc93ffbfcaeeb2793b 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java @@ -1,5 +1,12 @@ package me.szaki.xkcd.xkcdbrowser.ui.favorites; +import java.util.List; + +import me.szaki.xkcd.xkcdbrowser.model.ComicStrip; + public interface FavoritesScreen { + public void dataReceived(List<ComicStrip> strips); + + public void deleteSucess(); } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java index 98944f2249b5f9431e5ef761228db58426922d0c..5c3871290f4675c8f88ec0edf1a9d5598e9c68bc 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java @@ -1,5 +1,6 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; @@ -30,6 +31,8 @@ import javax.inject.Inject; import me.szaki.xkcd.xkcdbrowser.R; import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; 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 implements NavigationView.OnNavigationItemSelectedListener, MainScreen { @@ -114,7 +117,9 @@ public class MainActivity extends AppCompatActivity if (id == R.id.nav_main) { // Handle the camera action } 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); diff --git a/app/src/main/res/drawable-hdpi/ic_delete.png b/app/src/main/res/drawable-hdpi/ic_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..decc2a54df03b3d60fa3b9722582b958bc26ed02 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_delete.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_delete.png b/app/src/main/res/drawable-mdpi/ic_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..d64b5ef82c5707418971f728f2c66ed50a159aff Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_delete.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delete.png b/app/src/main/res/drawable-xhdpi/ic_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..8175fb04eef74713b8698dc42c82aefc96c5871d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_delete.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delete.png b/app/src/main/res/drawable-xxhdpi/ic_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..bac7eb9469a4c41e59ae23abe3e745e469848f8f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_delete.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delete.png b/app/src/main/res/drawable-xxxhdpi/ic_delete.png new file mode 100755 index 0000000000000000000000000000000000000000..fad9e8d99311f9e5d3c388b035723a06ed0eb517 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_delete.png differ diff --git a/app/src/main/res/layout/app_bar_favorites.xml b/app/src/main/res/layout/app_bar_favorites.xml index fb118bec6ec2699132da838e645f969c642c816e..a587c0b3022ead7fb6482d023ccf9507dd8063a3 100644 --- a/app/src/main/res/layout/app_bar_favorites.xml +++ b/app/src/main/res/layout/app_bar_favorites.xml @@ -22,12 +22,5 @@ <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> \ No newline at end of file diff --git a/app/src/main/res/layout/comic_strip.xml b/app/src/main/res/layout/comic_strip.xml new file mode 100644 index 0000000000000000000000000000000000000000..bbea280e75ff6681fb17f7ef36d3a1380525a643 --- /dev/null +++ b/app/src/main/res/layout/comic_strip.xml @@ -0,0 +1,56 @@ +<?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 diff --git a/app/src/main/res/layout/content_favorites.xml b/app/src/main/res/layout/content_favorites.xml index ed576e624d202c6e5e2fb5d63fa24bc7cfd359c3..0171548629eca35882af1016e56dcfa260bfd6d1 100644 --- a/app/src/main/res/layout/content_favorites.xml +++ b/app/src/main/res/layout/content_favorites.xml @@ -8,4 +8,13 @@ tools:context=".ui.favorites.FavoritesActivity" 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> \ No newline at end of file