diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java index dae5aa329d509c06f169a1e0f9b649b99afc0157..8abcfc6b72f96d81bcf491c67e42e34e8ed0d632 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/database/ComicsDAO.java @@ -18,6 +18,9 @@ public interface ComicsDAO { @Query("SELECT * FROM ComicStrip WHERE id = :id") public ComicStrip getComic(Long id); + @Query("SELECT * FROM ComicStrip WHERE num = :num") + public ComicStrip getComicByNum(Long num); + @Insert public void insertAll(ComicStrip... comic); diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java index f333e97456b37c3624d2453b44f40cd416199f66..5e7ffe22fcf48414972764730f11e5a678e3e738 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java @@ -2,8 +2,6 @@ package me.szaki.xkcd.xkcdbrowser.interactor.comics; import java.io.IOException; -import java.util.Date; -import java.util.Random; import javax.inject.Inject; @@ -23,12 +21,8 @@ public class ComicsInteractor { return this.comicApi.getComic(id).execute().body(); } - public Comic getRandomComic() throws IOException { - Random r = new Random(new Date().getTime()); - return this.comicApi.getComic(r.nextLong()).execute().body(); - } - public Comic getLatestComic() throws IOException { return this.comicApi.getCurrentComic().execute().body(); } + } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java index 47a7a0f4c8fe684ec6d2dcbe28fe6b5a1af958c9..733be6773cd3284f40b98b1d7f7164d5643dabe4 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/DBInteractor.java @@ -34,5 +34,6 @@ public class DBInteractor { db.getDAO().insertAll(c); } + public ComicStrip getComicByNum(Long id) { return db.getDAO().getComicByNum(id); } } 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 5904221b9041219216fa821ade86863e24a950a1..98944f2249b5f9431e5ef761228db58426922d0c 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,6 +1,10 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; import android.os.Bundle; +import android.os.Handler; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.view.View; @@ -12,14 +16,35 @@ import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuItem; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.Toast; + + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; + +import javax.inject.Inject; import me.szaki.xkcd.xkcdbrowser.R; +import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; +import me.szaki.xkcd.xkcdbrowser.network.model.Comic; public class MainActivity extends AppCompatActivity - implements NavigationView.OnNavigationItemSelectedListener { + implements NavigationView.OnNavigationItemSelectedListener, MainScreen { + + @Inject + MainPresenter mainPresenter; + + private ImageView imageView; + private Comic currentComic; + private ImageButton favoriteButton; @Override protected void onCreate(Bundle savedInstanceState) { + XKCDBrowserApplication.injector.inject(this); + super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); @@ -33,6 +58,41 @@ public class MainActivity extends AppCompatActivity NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); + + findViewById(R.id.favorite_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setClickable(false); + mainPresenter.saveComic(currentComic); + } + }); + + this.imageView = findViewById(R.id.imageView); + this.favoriteButton = findViewById(R.id.favorite_button); + + findViewById(R.id.next_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setClickable(false); + mainPresenter.getNext(); + } + }); + + findViewById(R.id.previous_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setClickable(false); + mainPresenter.getPrevious(); + } + }); + + findViewById(R.id.random_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setClickable(false); + mainPresenter.getRandom(); + } + }); } @Override @@ -61,4 +121,77 @@ public class MainActivity extends AppCompatActivity drawer.closeDrawer(GravityCompat.START); return true; } + + @Override + protected void onStart() { + super.onStart(); + + this.mainPresenter.attachScreen(this); + this.mainPresenter.getCurrent(); + } + + @Override + protected void onStop() { + super.onStop(); + + this.mainPresenter.detachScreen(); + } + + @Override + public void getImage(final Comic c) { + Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); + Bitmap mIcon_val = null; + + if (c != null) { + currentComic = c; + try { + URL newurl = new URL(c.getImg()); + mIcon_val = BitmapFactory.decodeStream(newurl.openConnection().getInputStream()); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + final Bitmap finalMIcon_val = mIcon_val; + Runnable myRunnable = new Runnable() { + @Override + public void run() { + if (finalMIcon_val == null) { + Snackbar.make(findViewById(android.R.id.content), "Already on newest!", Snackbar.LENGTH_SHORT) + .setAction("Action", null).show(); + } else { + imageView.setImageBitmap(finalMIcon_val); + } + } + }; + mainHandler.post(myRunnable); + } + + @Override + public void saveComic() { + Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); + + Runnable myRunnable = new Runnable() { + @Override + public void run() { + favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star)); + Snackbar.make(findViewById(android.R.id.content), "Saved!", Snackbar.LENGTH_SHORT) + .setAction("Action", null).show(); + } + }; + mainHandler.post(myRunnable); + } + + @Override + public void setFavorite(boolean exists) { + + if (exists) { + favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star)); + } else { + favoriteButton.setImageDrawable(getDrawable(R.drawable.ic_star_border)); + favoriteButton.setClickable(true); + } + } } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java index 23edcd5a9ff9f604b53a42e7816256d8f7056c6e..8532aabd3d936e2aa15bd5f17305e46a7a9f3425 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java @@ -1,11 +1,18 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; +import android.support.annotation.Nullable; + +import java.io.IOException; +import java.util.Random; + 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.network.model.Comic; import me.szaki.xkcd.xkcdbrowser.ui.Presenter; public class MainPresenter extends Presenter<MainScreen> { @@ -15,17 +22,112 @@ public class MainPresenter extends Presenter<MainScreen> { @Inject DBInteractor db; - public MainPresenter () { + private int currentId; + private int maxId; + + private Random r; + + public MainPresenter() { XKCDBrowserApplication.injector.inject(this); + r = new Random(); } - @Override - public void attachScreen(MainScreen screen) { - super.attachScreen(screen); + public void getCurrent() { + new Thread() { + @Override + public void run() { + try { + Comic c = comicsInteractor.getLatestComic(); + currentId = c.getNum(); + maxId = c.getNum(); + screen.getImage(c); + checkFavorite(c); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.start(); } - @Override - public void detachScreen() { - super.detachScreen(); + public void getPrevious() { + new Thread() { + @Override + public void run() { + Comic c = getComic(--currentId); + screen.getImage(c); + checkFavorite(c); + } + }.start(); } + + public void getRandom() { + new Thread() { + @Override + public void run() { + Comic c = getComic(r.nextInt(maxId)); + currentId = c.getNum(); + screen.getImage(c); + checkFavorite(c); + } + }.start(); + } + + public void getNext() { + new Thread() { + @Override + public void run() { + Comic c = getComic(++currentId); + if (c != null && c.getNum() > maxId) { + maxId = c.getNum(); + } + screen.getImage(c); + checkFavorite(c); + } + }.start(); + } + + public void saveComic(final Comic currentComic) { + new Thread() { + @Override + public void run() { + ComicStrip comic = new ComicStrip() {{ + setAlt(currentComic.getAlt()); + setDay(currentComic.getDay()); + setMonth(currentComic.getMonth()); + setNum(Long.valueOf(currentComic.getNum())); + setLink(currentComic.getLink()); + setYear(currentComic.getYear()); + setNews(currentComic.getNews()); + setSafe_title(currentComic.getSafeTitle()); + setTranscript(currentComic.getTranscript()); + setImg(currentComic.getImg()); + setTitle(currentComic.getTitle()); + }}; + + db.saveComic(comic); + screen.saveComic(); + } + }.start(); + } + + @Nullable + private Comic getComic(int id) { + try { + Comic c = comicsInteractor.getComic(id); + return c; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + private void checkFavorite(Comic c) { + if (c == null) { + return; + } + ComicStrip comicByNum = db.getComicByNum(c.getNum().longValue()); + screen.setFavorite(comicByNum != null); + } + } + diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java index 4990c7658b6fd903d6092c3cddb60f120bf652ee..e77fdf9d3e92d112e36ca8f551e4482eb04b0cf5 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java @@ -1,4 +1,11 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; +import me.szaki.xkcd.xkcdbrowser.network.model.Comic; + public interface MainScreen { + public void getImage(Comic c); + + public void saveComic(); + + public void setFavorite(boolean exists); } diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index b10e6c4aa7db489813b2340c3dac0254ca118425..54bfacb0d575db66b22e5ad95a050aeec405c7e4 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -25,7 +25,7 @@ android:orientation="vertical"> <ImageButton - android:id="@+id/imageButton" + android:id="@+id/favorite_button" android:layout_width="50dp" android:layout_height="wrap_content" android:adjustViewBounds="false" @@ -33,7 +33,8 @@ android:cropToPadding="false" android:padding="10dp" android:scaleType="centerInside" - app:srcCompat="@drawable/ic_star" /> + app:srcCompat="@drawable/ic_star_border" + android:clickable="false"/> </LinearLayout>