diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..8012805b7ed1ed92f19e29598a97428b67ad0706 --- /dev/null +++ b/.idea/assetWizardSettings.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="WizardSettings"> + <option name="children"> + <map> + <entry key="imageWizard"> + <value> + <PersistentState> + <option name="children"> + <map> + <entry key="imageAssetPanel"> + <value> + <PersistentState> + <option name="children"> + <map> + <entry key="launcher"> + <value> + <PersistentState> + <option name="children"> + <map> + <entry key="foregroundImage"> + <value> + <PersistentState> + <option name="values"> + <map> + <entry key="scalingPercent" value="70" /> + </map> + </option> + </PersistentState> + </value> + </entry> + </map> + </option> + <option name="values"> + <map> + <entry key="backgroundAssetType" value="COLOR" /> + <entry key="backgroundColor" value="ffffff" /> + <entry key="foregroundImage" value="$USER_HOME$/Downloads/512x512bb.jpg" /> + </map> + </option> + </PersistentState> + </value> + </entry> + </map> + </option> + </PersistentState> + </value> + </entry> + </map> + </option> + </PersistentState> + </value> + </entry> + </map> + </option> + </component> +</project> \ No newline at end of file diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index a950c4211b98c5a691c4fbb4a086ebd1a4931f78..d89bb99d65148fc964687815b11160c69ede5121 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/misc.xml b/.idea/misc.xml index 75dac502959ec4f6e5232282499067f85aa716f5..39638799269d0193201b39e5276d8236659f97fe 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ </value> </option> </component> - <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/app/build.gradle b/app/build.gradle index d431fddabd25fe35b37eb39b23d7117ef9c61e21..87c3accf67628aad5f9194b351f1126065191cc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -65,7 +65,8 @@ dependencies { // Dagger implementation 'com.google.dagger:dagger:2.11' - implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries + implementation 'com.google.dagger:dagger-android-support:2.11' + // if you use the support libraries annotationProcessor 'com.google.dagger:dagger-compiler:2.11' annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' implementation 'com.google.dagger:dagger-android:2.11' @@ -82,5 +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/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6e25c8f7263be0a4b1bd2c9281228375ca65b3ce..78e0a39df309957afbe2937c289bece81b4b0b28 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,9 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="me.szaki.xkcd.xkcdbrowser"> + <uses-permission android:name="android.permission.INTERNET" /> + <application android:name=".XKCDBrowserApplication" android:allowBackup="true" @@ -10,15 +12,29 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> - <activity android:name=".ui.main.MainActivity"> + <activity + android:name=".ui.main.MainActivity" + android:label="@string/title_activity_main" + android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> - <activity android:name=".ui.detail.DetailActivity"></activity> - <activity android:name=".ui.favorites.FavoritesActivity"></activity> + <activity + android:name=".ui.favorites.FavoritesActivity" + android:label="@string/title_activity_favorites" + android:theme="@style/AppTheme.NoActionBar" /> + <activity + android:name=".ui.detail.DetailActivity" + android:label="@string/title_activity_detail" + android:parentActivityName=".ui.favorites.FavoritesActivity" + android:theme="@style/AppTheme.NoActionBar"> + <meta-data + android:name="android.support.PARENT_ACTIVITY" + android:value="me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity" /> + </activity> </application> </manifest> \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000000000000000000000000000000000000..8bbcff23f1097696f293a42b180e3f8dcd2a2049 Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ 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..17c082b3a291cba140c523d74a23b9106af80f92 --- /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.%02d.%02d.", comicStrip.getYear(), Integer.parseInt(comicStrip.getMonth()), Integer.parseInt(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/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/detail/DetailActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java index 88053321a0cb1f6a330dc9b9be9bf42b135b5bc6..4a2306aea88270cf908a970f11fae6b56cb6b6bc 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java @@ -1,35 +1,89 @@ package me.szaki.xkcd.xkcdbrowser.ui.detail; - +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; +import android.os.Handler; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; +import android.widget.ImageView; + +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.model.ComicStrip; public class DetailActivity extends AppCompatActivity implements DetailScreen { + @Inject DetailPresenter detailPresenter; + private ImageView detailImageView; + private Long num; + + public DetailActivity() { + XKCDBrowserApplication.injector.inject(this); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); - XKCDBrowserApplication.injector.inject(this); + this.detailImageView = findViewById(R.id.detailImageView); + + Intent i = getIntent(); + num = i.getLongExtra("num", 0l); } @Override protected void onStart() { super.onStart(); - detailPresenter.attachScreen(this); + + this.detailPresenter.attachScreen(this); + detailPresenter.getComicByNum(Long.valueOf(num)); } @Override protected void onStop() { super.onStop(); - detailPresenter.detachScreen(); + + this.detailPresenter.detachScreen(); + } + + @Override + public void dataReceived(final ComicStrip comic) { + Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); + Bitmap mIcon_val = null; + + if (comic != null) { + try { + URL newurl = new URL(comic.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() { + detailImageView.setImageBitmap(finalMIcon_val); + setTitle(comic.getTitle()); + } + }; + mainHandler.post(myRunnable); } } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java index 19377a01936a6cd73755028d31cb615f6d3c8253..d24e48af615ce5dc262a369fbecc92c878d0730e 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java @@ -4,24 +4,25 @@ package me.szaki.xkcd.xkcdbrowser.ui.detail; 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.ui.Presenter; public class DetailPresenter extends Presenter<DetailScreen> { + + @Inject - ComicsInteractor comicsInteractor; + DBInteractor db; public DetailPresenter () { XKCDBrowserApplication.injector.inject(this); } - @Override - public void attachScreen(DetailScreen screen) { - super.attachScreen(screen); - } - - @Override - public void detachScreen() { - super.detachScreen(); + public void getComicByNum(final Long id) { + new Thread() { + @Override + public void run() { + screen.dataReceived(db.getComicByNum(id)); + } + }.start(); } } diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java index 9c33c64924b67d5037eed407a5c7488643467d07..555cc964adee84b2db351d713d7d371030eaf633 100644 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java @@ -1,4 +1,9 @@ package me.szaki.xkcd.xkcdbrowser.ui.detail; +import java.util.List; + +import me.szaki.xkcd.xkcdbrowser.model.ComicStrip; + public interface DetailScreen { + public void dataReceived(ComicStrip comic); } 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 e1c52712267f44ceb24233fade9984c0a5110c69..594478954cef364b48f1f4a26f11b47436735b11 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,35 +1,155 @@ package me.szaki.xkcd.xkcdbrowser.ui.favorites; - +import android.content.Intent; import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.NavigationView; +import android.support.design.widget.Snackbar; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.DividerItemDecoration; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.Toolbar; +import android.view.MenuItem; +import android.view.View; +import android.widget.LinearLayout; + +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, FavoritesScreen, FavoriteListAdapter.ClickListener { -public class FavoritesActivity extends AppCompatActivity implements FavoritesScreen { @Inject FavoritesPresenter favoritesPresenter; + private FavoriteListAdapter mAdapter; + + public FavoritesActivity() { + XKCDBrowserApplication.injector.inject(this); + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_favorites); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); - XKCDBrowserApplication.injector.inject(this); + 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); + drawer.addDrawerListener(toggle); + toggle.syncState(); + + 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 + public void onBackPressed() { + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) { + drawer.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + + @SuppressWarnings("StatementWithEmptyBody") + @Override + public boolean onNavigationItemSelected(MenuItem item) { + // Handle navigation view item clicks here. + int id = item.getItemId(); + + if (id == R.id.nav_main) { + Intent i = new Intent(getApplicationContext(), MainActivity.class); + startActivity(i); + finish(); + } else if (id == R.id.nav_favorites) { + + } + + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + drawer.closeDrawer(GravityCompat.START); + return true; } @Override protected void onStart() { super.onStart(); - favoritesPresenter.attachScreen(this); + + this.favoritesPresenter.attachScreen(this); + favoritesPresenter.getData(); } @Override protected void onStop() { super.onStop(); - favoritesPresenter.detachScreen(); + + this.favoritesPresenter.detachScreen(); + } + + @Override + public void onClick(int position, View v) { + Intent i = new Intent(getApplicationContext(), DetailActivity.class); + i.putExtra("num", mAdapter.getComicStripByNum(position).getNum()); + 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 44ee581f349aff30816f1510d29221521b3821b5..e361178857cbfbf47c866894fe7108f8d3697976 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,34 +1,231 @@ package me.szaki.xkcd.xkcdbrowser.ui.main; -import android.support.v7.app.AppCompatActivity; +import android.content.Intent; +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; +import android.support.design.widget.NavigationView; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.support.v7.app.ActionBarDrawerToggle; +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; +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 { -public class MainActivity extends AppCompatActivity implements MainScreen { @Inject MainPresenter mainPresenter; + private ImageView imageView; + private Comic currentComic; + private MenuItem 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); + setSupportActionBar(toolbar); - XKCDBrowserApplication.injector.inject(this); + 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); + drawer.addDrawerListener(toggle); + toggle.syncState(); + + NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); + navigationView.setNavigationItemSelectedListener(this); + + this.imageView = findViewById(R.id.imageView); + + findViewById(R.id.next_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setCheckable(false); + mainPresenter.getNext(); + } + }); + + findViewById(R.id.previous_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setCheckable(false); + mainPresenter.getPrevious(); + } + }); + + findViewById(R.id.random_button).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + favoriteButton.setCheckable(false); + mainPresenter.getRandom(); + } + }); + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + + getMenuInflater().inflate(R.menu.main_menu, menu); + this.favoriteButton = menu.getItem(0); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.favorite_button) { + favoriteButton.setCheckable(false); + mainPresenter.saveComic(currentComic); + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onBackPressed() { + DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); + if (drawer.isDrawerOpen(GravityCompat.START)) { + drawer.closeDrawer(GravityCompat.START); + } else { + super.onBackPressed(); + } + } + + @SuppressWarnings("StatementWithEmptyBody") + @Override + public boolean onNavigationItemSelected(MenuItem item) { + // Handle navigation view item clicks here. + int id = item.getItemId(); + + 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); + drawer.closeDrawer(GravityCompat.START); + return true; } @Override protected void onStart() { super.onStart(); - mainPresenter.attachScreen(this); + + this.mainPresenter.attachScreen(this); + this.mainPresenter.getCurrent(); } @Override protected void onStop() { super.onStop(); - mainPresenter.detachScreen(); + + 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); + setTitle(c.getTitle()); + } + } + }; + mainHandler.post(myRunnable); + } + + @Override + public void saveComic() { + Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); + + Runnable myRunnable = new Runnable() { + @Override + public void run() { + favoriteButton.setIcon(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(final boolean exists) { + + Handler mainHandler = new Handler(getApplicationContext().getMainLooper()); + + Runnable myRunnable = new Runnable() { + @Override + public void run() { + if (exists) { + favoriteButton.setIcon(getDrawable(R.drawable.ic_star)); + } else { + favoriteButton.setIcon(getDrawable(R.drawable.ic_star_border)); + favoriteButton.setCheckable(true); + } + } + }; + mainHandler.post(myRunnable); + + } } 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/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-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png new file mode 100755 index 0000000000000000000000000000000000000000..7581a659e4e6840a1258a2a73aa42d402c6b9311 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_star.png b/app/src/main/res/drawable-hdpi/ic_star.png new file mode 100755 index 0000000000000000000000000000000000000000..a83395e2534f3b0b0169cc5bb05f8b0fbb88120b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_star_border.png b/app/src/main/res/drawable-hdpi/ic_star_border.png new file mode 100755 index 0000000000000000000000000000000000000000..3decf5877628c9958bfcbe57c4d8f66b092db93b Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_star_border.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-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png new file mode 100755 index 0000000000000000000000000000000000000000..d2f19bcbb5144689b0687eb608f0f454583da0c0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_star.png b/app/src/main/res/drawable-mdpi/ic_star.png new file mode 100755 index 0000000000000000000000000000000000000000..a2ae1c7e7a164a781e3b404c88e383517c860672 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_star_border.png b/app/src/main/res/drawable-mdpi/ic_star_border.png new file mode 100755 index 0000000000000000000000000000000000000000..8f8de37bd7009e4dfaf6b2285b647034f6663461 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_star_border.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-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png new file mode 100755 index 0000000000000000000000000000000000000000..49fc4dc9dbf9c37904e2a6a611dd0e0510331b06 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_star.png b/app/src/main/res/drawable-xhdpi/ic_star.png new file mode 100755 index 0000000000000000000000000000000000000000..a5ad50b8c564695ac10e59d732908b8593b8a1e2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_star_border.png b/app/src/main/res/drawable-xhdpi/ic_star_border.png new file mode 100755 index 0000000000000000000000000000000000000000..04706c8b57523c35ead9352d285a1e0b61db99c8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_star_border.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-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png new file mode 100755 index 0000000000000000000000000000000000000000..711b7bb497fdbe36a058f2b693587aed8d2b5849 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_star.png b/app/src/main/res/drawable-xxhdpi/ic_star.png new file mode 100755 index 0000000000000000000000000000000000000000..c08d3c61396f2756f8989df884ba2c9a038a04a7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_star_border.png b/app/src/main/res/drawable-xxhdpi/ic_star_border.png new file mode 100755 index 0000000000000000000000000000000000000000..b8b5e9d003c9f1d8e4529c2cc6794e868b6418c9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_star_border.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/drawable-xxxhdpi/ic_home.png b/app/src/main/res/drawable-xxxhdpi/ic_home.png new file mode 100755 index 0000000000000000000000000000000000000000..73bfdefa01e07728d513470a87b1d92481a6e1b3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_star.png b/app/src/main/res/drawable-xxxhdpi/ic_star.png new file mode 100755 index 0000000000000000000000000000000000000000..f3ee6bbc2ed7fc89790f6c9836b6e455154d52a3 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_star_border.png b/app/src/main/res/drawable-xxxhdpi/ic_star_border.png new file mode 100755 index 0000000000000000000000000000000000000000..b8c11dfdfc09f73164578ff72364733dfd178cac Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_star_border.png differ diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml new file mode 100644 index 0000000000000000000000000000000000000000..0d9ea104b2f34dbd9d7a0ea545589660fe6c0ef6 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_camera.xml @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M12,12m-3.2,0a3.2,3.2 0,1 1,6.4 0a3.2,3.2 0,1 1,-6.4 0" /> + <path + android:fillColor="#FF000000" + android:pathData="M9,2L7.17,4H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V6c0,-1.1 -0.9,-2 -2,-2h-3.17L15,2H9zm3,15c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5 5,2.24 5,5 -2.24,5 -5,5z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml new file mode 100644 index 0000000000000000000000000000000000000000..f6872c409eb82cabaa9297998d49005b057d8043 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_gallery.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M22,16V4c0,-1.1 -0.9,-2 -2,-2H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2zm-11,-4l2.03,2.71L16,11l4,5H8l3,-4zM2,6v14c0,1.1 0.9,2 2,2h14v-2H4V6H2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_menu_manage.xml b/app/src/main/res/drawable/ic_menu_manage.xml new file mode 100644 index 0000000000000000000000000000000000000000..c1be60b368cee69ed9c866009439b50e4e920230 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_manage.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M22.7,19l-9.1,-9.1c0.9,-2.3 0.4,-5 -1.5,-6.9 -2,-2 -5,-2.4 -7.4,-1.3L9,6 6,9 1.6,4.7C0.4,7.1 0.9,10.1 2.9,12.1c1.9,1.9 4.6,2.4 6.9,1.5l9.1,9.1c0.4,0.4 1,0.4 1.4,0l2.3,-2.3c0.5,-0.4 0.5,-1.1 0.1,-1.4z" /> +</vector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_menu_send.xml b/app/src/main/res/drawable/ic_menu_send.xml new file mode 100644 index 0000000000000000000000000000000000000000..00c668c60b05fd2e0b5c4f8bc43c8114c7dbd7a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_send.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M2.01,21L23,12 2.01,3 2,10l15,2 -15,2z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_menu_share.xml b/app/src/main/res/drawable/ic_menu_share.xml new file mode 100644 index 0000000000000000000000000000000000000000..a28fb9e2897130c7b627049d91c2294679563b05 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_share.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z" /> +</vector> diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml new file mode 100644 index 0000000000000000000000000000000000000000..209aa6430e754b466c4256446446cfce615f3394 --- /dev/null +++ b/app/src/main/res/drawable/ic_menu_slideshow.xml @@ -0,0 +1,9 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportHeight="24.0" + android:viewportWidth="24.0"> + <path + android:fillColor="#FF000000" + android:pathData="M4,6H2v14c0,1.1 0.9,2 2,2h14v-2H4V6zm16,-4H8c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2V4c0,-1.1 -0.9,-2 -2,-2zm-8,12.5v-9l6,4.5 -6,4.5z" /> +</vector> diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml new file mode 100644 index 0000000000000000000000000000000000000000..d36ebc4ed2d02b4062d5d7b02148c4d16e6eb13c --- /dev/null +++ b/app/src/main/res/drawable/side_nav_bar.xml @@ -0,0 +1,5 @@ +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid + android:color="#9E9E9E"/> +</shape> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index 43febafe7eab8c820972e8f95ec0bf959b643d4f..c89fd986c537657c4ecef25cb41fe2f1fa78f8b5 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -1,9 +1,26 @@ <?xml version="1.0" encoding="utf-8"?> -<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<android.support.design.widget.CoordinatorLayout 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="match_parent" - tools:context="me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity"> + tools:context=".ui.detail.DetailActivity" + android:fitsSystemWindows="true"> -</android.support.constraint.ConstraintLayout> \ No newline at end of file + <android.support.design.widget.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:theme="@style/AppTheme.AppBarOverlay"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:popupTheme="@style/AppTheme.PopupOverlay" /> + + </android.support.design.widget.AppBarLayout> + + <include layout="@layout/content_detail" /> + +</android.support.design.widget.CoordinatorLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml index 5596ce04683d3f097b1bd9adca0fe6062b827905..c7b4197f2b2c32b7b1e9c1e5a487ce54c6d95e68 100644 --- a/app/src/main/res/layout/activity_favorites.xml +++ b/app/src/main/res/layout/activity_favorites.xml @@ -1,9 +1,25 @@ <?xml version="1.0" encoding="utf-8"?> -<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity"> + android:fitsSystemWindows="true" + tools:openDrawer="start"> -</android.support.constraint.ConstraintLayout> \ No newline at end of file + <include + layout="@layout/app_bar_favorites" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <android.support.design.widget.NavigationView + android:id="@+id/nav_view" + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:layout_gravity="start" + android:fitsSystemWindows="true" + app:headerLayout="@layout/nav_header_main" + app:menu="@menu/activity_main_drawer" /> + +</android.support.v4.widget.DrawerLayout> diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e25f1fe4f3260a7b5c8fd4cbe6ded0deb8274d70..a61d8a6300f62056e6801f60f572b0e6e3515507 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,25 @@ <?xml version="1.0" encoding="utf-8"?> -<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" +<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity"> + android:fitsSystemWindows="true" + tools:openDrawer="start"> - <TextView + <include + layout="@layout/app_bar_main" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <android.support.design.widget.NavigationView + android:id="@+id/nav_view" android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Hello World!" - app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintRight_toRightOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + android:layout_height="match_parent" + android:layout_gravity="start" + android:fitsSystemWindows="true" + app:headerLayout="@layout/nav_header_main" + app:menu="@menu/activity_main_drawer" /> -</android.support.constraint.ConstraintLayout> +</android.support.v4.widget.DrawerLayout> diff --git a/app/src/main/res/layout/app_bar_favorites.xml b/app/src/main/res/layout/app_bar_favorites.xml new file mode 100644 index 0000000000000000000000000000000000000000..a587c0b3022ead7fb6482d023ccf9507dd8063a3 --- /dev/null +++ b/app/src/main/res/layout/app_bar_favorites.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.design.widget.CoordinatorLayout 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="match_parent" + tools:context=".ui.favorites.FavoritesActivity"> + + <android.support.design.widget.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:theme="@style/AppTheme.AppBarOverlay"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?attr/actionBarSize" + android:background="?attr/colorPrimary" + app:popupTheme="@style/AppTheme.PopupOverlay" /> + + </android.support.design.widget.AppBarLayout> + + <include layout="@layout/content_favorites" /> + + +</android.support.design.widget.CoordinatorLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml new file mode 100644 index 0000000000000000000000000000000000000000..03f12f703b3190ce748d21aad33473415dc03aa3 --- /dev/null +++ b/app/src/main/res/layout/app_bar_main.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.design.widget.CoordinatorLayout 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="match_parent" + tools:context=".ui.main.MainActivity"> + + <android.support.design.widget.AppBarLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:theme="@style/AppTheme.AppBarOverlay"> + + <android.support.v7.widget.Toolbar + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="?attr/colorPrimary" + app:popupTheme="@style/AppTheme.PopupOverlay"> + + </android.support.v7.widget.Toolbar> + + </android.support.design.widget.AppBarLayout> + + <include layout="@layout/content_main" /> + + +</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_detail.xml b/app/src/main/res/layout/content_detail.xml new file mode 100644 index 0000000000000000000000000000000000000000..1141fc8bbfa0f99cec69d93c815e32a29eca83dc --- /dev/null +++ b/app/src/main/res/layout/content_detail.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8"?> +<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="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:context=".ui.detail.DetailActivity" + tools:showIn="@layout/activity_detail"> + + <ImageView + android:id="@+id/detailImageView" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_marginBottom="8dp" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@android:color/background_light" /> + +</android.support.constraint.ConstraintLayout> \ 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 new file mode 100644 index 0000000000000000000000000000000000000000..0171548629eca35882af1016e56dcfa260bfd6d1 --- /dev/null +++ b/app/src/main/res/layout/content_favorites.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<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="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + 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 diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml new file mode 100644 index 0000000000000000000000000000000000000000..f8f8b8cc719983dfcef1c7b0da0adf5a1f0b0db1 --- /dev/null +++ b/app/src/main/res/layout/content_main.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<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="match_parent" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:context=".ui.main.MainActivity" + tools:showIn="@layout/app_bar_main"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="0dp" + android:layout_height="0dp" + android:layout_marginBottom="8dp" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + app:layout_constraintBottom_toTopOf="@+id/random_button" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:srcCompat="@android:color/background_light" /> + + <Button + android:id="@+id/previous_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:layout_marginStart="16dp" + android:text="Previous" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintStart_toStartOf="parent" /> + + <Button + android:id="@+id/random_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:layout_marginEnd="8dp" + android:layout_marginStart="8dp" + android:text="Random" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toStartOf="@+id/next_button" + app:layout_constraintStart_toEndOf="@+id/previous_button" /> + + <Button + android:id="@+id/next_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginBottom="8dp" + android:layout_marginEnd="16dp" + android:text="Next" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" /> +</android.support.constraint.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml new file mode 100644 index 0000000000000000000000000000000000000000..211e10a8035204912e49b7bd507891c5bd386da0 --- /dev/null +++ b/app/src/main/res/layout/nav_header_main.xml @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="@dimen/nav_header_height" + android:background="@drawable/side_nav_bar" + android:gravity="bottom" + android:orientation="vertical" + android:paddingBottom="@dimen/activity_vertical_margin" + android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:theme="@style/ThemeOverlay.AppCompat.Dark"> + + <ImageView + android:id="@+id/imageView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:contentDescription="@string/nav_header_desc" + android:paddingTop="@dimen/nav_header_vertical_spacing" + app:srcCompat="@mipmap/ic_launcher_round" /> + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingTop="@dimen/nav_header_vertical_spacing" + android:text="@string/nav_header_title" + android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/nav_header_subtitle" /> + +</LinearLayout> diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml new file mode 100644 index 0000000000000000000000000000000000000000..15cabce67d48513ea242c9e406e16e9593cecbaa --- /dev/null +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + tools:showIn="navigation_view"> + + <group android:checkableBehavior="single"> + <item + android:id="@+id/nav_main" + android:icon="@drawable/ic_home" + android:title="Main" /> + <item + android:id="@+id/nav_favorites" + android:icon="@drawable/ic_star" + android:title="Favorites" /> + + </group> + +</menu> diff --git a/app/src/main/res/menu/main_menu.xml b/app/src/main/res/menu/main_menu.xml new file mode 100644 index 0000000000000000000000000000000000000000..2bdd84166ddd9eb9567dc8ff80662b9d6736932a --- /dev/null +++ b/app/src/main/res/menu/main_menu.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + <item + android:id="@+id/favorite_button" + android:orderInCategory="100" + android:title="@string/action_settings" + android:icon="@drawable/ic_star_border" + app:showAsAction="ifRoom" /> +</menu> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index eca70cfe52eac1ba66ba280a68ca7be8fcf88a16..036d09bc5fd523323794379703c4a111d1e28a04 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@drawable/ic_launcher_background" /> - <foreground android:drawable="@drawable/ic_launcher_foreground" /> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@mipmap/ic_launcher_foreground"/> </adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cfe52eac1ba66ba280a68ca7be8fcf88a16..036d09bc5fd523323794379703c4a111d1e28a04 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> - <background android:drawable="@drawable/ic_launcher_background" /> - <foreground android:drawable="@drawable/ic_launcher_foreground" /> + <background android:drawable="@color/ic_launcher_background"/> + <foreground android:drawable="@mipmap/ic_launcher_foreground"/> </adaptive-icon> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png index a2f5908281d070150700378b64a84c7db1f97aa1..eb2e812000616f54d995c8c0459a8dc8378537b1 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..e2f75cae9c1401d94c120b9842027230e42c1a8b Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png index 1b523998081149a985cef0cdf89045b9ed29964a..4e9913635bd2d03dd3fd7ddaf1ef55fbed29ca8d 100644 Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png index ff10afd6e182edb2b1a63c8f984e9070d9f950ba..b3a8326a80444b31c03ba78955953c104b748309 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..1979eb0a38af14d29e37d5153a854d7b2d560416 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png index 115a4c768a20c9e13185c17043f4c4d12dd4632a..58f90d12c73ef1784d3d22f0494d2aa3655c1832 100644 Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png index dcd3cd8083358269d6ed7894726283bb9bcbbfea..6d29ae3a6b914af33cc76b6776669be0971e0287 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..476959a151f8af786665839440e656991e4ee367 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png index 459ca609d3ae0d3943ab44cdc27feef9256dc6d7..b86d2cba1aaae2506c0237cf37a186e060c34f46 100644 Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index 8ca12fe024be86e868d14e91120a6902f8e88ac6..c3080dfe526ec32d7d7be5b9a0f6f3539836cf0f 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..5d8c84c83ab31f36861c0c4b66717e7cfa6399c8 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png index 8e19b410a1b15ff180f3dacac19395fe3046cdec..9a3d2e8ba79ca6d8d7dfdb94c4ef4d2bccb0aef7 100644 Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index b824ebdd48db917eea2e67a82260a100371f8a24..a49fe49f82e87ded95a73e2c946c2e090f9063a6 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..8d867a7756a624361909c37c1e29373b57945888 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png index 4c19a13c239cb67b8a2134ddd5f325db1d2d5bee..926f2725c7d9f3d45b4e357df0f1f2175fb89038 100644 Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd7a058433df8e82194e88d4192fb6fcb9a20908 --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,8 @@ +<resources> + + <style name="AppTheme.NoActionBar"> + <item name="windowActionBar">false</item> + <item name="windowNoTitle">true</item> + <item name="android:statusBarColor">@android:color/transparent</item> + </style> +</resources> diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 3ab3e9cbce07f7cdc941fc8ba424c05e83ed80f0..2063f94c8b5ed91fdb4c9680ce3700d9d89af263 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <color name="colorPrimary">#3F51B5</color> - <color name="colorPrimaryDark">#303F9F</color> - <color name="colorAccent">#FF4081</color> + <color name="colorPrimary">#9E9E9E</color> + <color name="colorPrimaryDark">#616161</color> + <color name="colorAccent">#BDBDBD</color> </resources> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000000000000000000000000000000000000..4ab4520ffa990a8cd9759d59f22dce30cf158528 --- /dev/null +++ b/app/src/main/res/values/dimens.xml @@ -0,0 +1,8 @@ +<resources> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">16dp</dimen> + <dimen name="activity_vertical_margin">16dp</dimen> + <dimen name="nav_header_vertical_spacing">8dp</dimen> + <dimen name="nav_header_height">176dp</dimen> + <dimen name="fab_margin">16dp</dimen> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000000000000000000000000000000000000..c5d5899fdf0a1b144bf341b29e0c66ba50bbcedd --- /dev/null +++ b/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <color name="ic_launcher_background">#FFFFFF</color> +</resources> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f819e4f8b4d66a0e8cb55edb63d929de40d013b8..a462b0725c4a9e76bc7fad9006544174a132d446 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,12 @@ <resources> <string name="app_name">XKCD browser</string> + <string name="title_activity_main">XKCD Browser</string> + <string name="navigation_drawer_open">Open navigation drawer</string> + <string name="navigation_drawer_close">Close navigation drawer</string> + <string name="nav_header_title">XKCD</string> + <string name="nav_header_subtitle">A webcomic of romance, sarcasm, math, and language.</string> + <string name="nav_header_desc">Navigation header</string> + <string name="action_settings">Favorite</string> + <string name="title_activity_favorites">Favorites</string> + <string name="title_activity_detail">Detail</string> </resources> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5885930df6d10edf3d6df40d6556297d11f953da..5e399fa2ef03d01365e9c9dff7940aec2c4ba97b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,11 +1,20 @@ <resources> <!-- Base application theme. --> - <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> + <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style> + <style name="AppTheme.NoActionBar"> + <item name="windowActionBar">false</item> + <item name="windowNoTitle">true</item> + </style> + + <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> + + <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> + </resources> diff --git a/build.gradle b/build.gradle index eccff49eab7c57365178b7fda17863645a2efbc7..1a3d812308d49457ea04cd40dacb56edffcd19a5 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.1' + classpath 'com.android.tools.build:gradle:3.1.2' // NOTE: Do not place your application dependencies here; they belong