diff --git a/app/build.gradle b/app/build.gradle
index e6c6380b..0cf9686f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -33,8 +33,8 @@ dependencies {
compile 'com.android.support:cardview-v7:25.0.1'
compile 'com.android.support:recyclerview-v7:25.0.1'
compile 'com.squareup.okhttp3:okhttp:3.5.0'
+ compile 'com.squareup.picasso:picasso:2.5.2'
compile 'org.jsoup:jsoup:1.10.1'
- compile 'com.android.volley:volley:1.0.0'
compile 'com.github.franmontiel:PersistentCookieJar:v1.0.0'
compile('com.mikepenz:materialdrawer:5.8.0@aar') {
transitive = true
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8e49bf42..45de250a 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,7 +6,6 @@
{
private static final String TAG = "TopicAdapter";
- private static final int THUMBNAIL_SIZE = 80;
- private ImageLoader imageLoader = ImageController.getInstance().getImageLoader();
- private Context context;
- private List postsList;
+ private static int THUMBNAIL_SIZE;
+ private final Context context;
+ private final List postsList;
class MyViewHolder extends RecyclerView.ViewHolder {
- CardView cardView;
- FrameLayout postDateAndNumberExp;
- TextView postDate, postNum, username, subject;
- CircularNetworkImageView thumbnail;
- public WebView post;
- ImageButton quoteToggle;
- RelativeLayout header;
- LinearLayout userExtraInfo;
-
- TextView specialRank, rank, gender, numberOfPosts, personalText;
- LinearLayout stars_holder;
+ final CardView cardView;
+ final FrameLayout postDateAndNumberExp;
+ final TextView postDate, postNum, username, subject;
+ final ImageView thumbnail;
+ final public WebView post;
+ final ImageButton quoteToggle;
+ final RelativeLayout header;
+ final LinearLayout userExtraInfo;
+
+ final TextView specialRank, rank, gender, numberOfPosts, personalText;
+ final LinearLayout stars_holder;
MyViewHolder(View view) {
super(view);
@@ -68,7 +67,7 @@ class TopicAdapter extends RecyclerView.Adapter {
postDateAndNumberExp = (FrameLayout) view.findViewById(R.id.post_date_and_number_exp);
postDate = (TextView) view.findViewById(R.id.post_date);
postNum = (TextView) view.findViewById(R.id.post_number);
- thumbnail = (CircularNetworkImageView) view.findViewById(R.id.thumbnail);
+ thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
username = (TextView) view.findViewById(R.id.username);
subject = (TextView) view.findViewById(R.id.subject);
post = (WebView) view.findViewById(R.id.post);
@@ -83,14 +82,21 @@ class TopicAdapter extends RecyclerView.Adapter {
numberOfPosts = (TextView) view.findViewById(R.id.number_of_posts);
personalText = (TextView) view.findViewById(R.id.personal_text);
stars_holder = (LinearLayout) view.findViewById(R.id.stars);
-
}
+
+ /**
+ * Possible cleanup needed (like so:)
+ * https://stackoverflow.com/questions/24897441/picasso-how-to-cancel-all-image-requests-made-in-an-adapter
+ * TODO
+ */
}
TopicAdapter(Context context, List postsList) {
this.context = context;
this.postsList = postsList;
+
+ THUMBNAIL_SIZE = (int) context.getResources().getDimension(R.dimen.thumbnail_size);
}
@Override
@@ -109,7 +115,6 @@ class TopicAdapter extends RecyclerView.Adapter {
holder.post.setClickable(true);
holder.post.setWebViewClient(new LinkLauncher());
holder.post.getSettings().setJavaScriptEnabled(true);
- holder.post.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);
//Avoiding errors about layout having 0 width/height
holder.thumbnail.setMinimumWidth(1);
@@ -118,11 +123,17 @@ class TopicAdapter extends RecyclerView.Adapter {
holder.thumbnail.setMaxWidth(THUMBNAIL_SIZE);
holder.thumbnail.setMaxHeight(THUMBNAIL_SIZE);
- //Thumbnail image set
- if (currentPost.getThumbnailUrl() != null
- && !Objects.equals(currentPost.getThumbnailUrl(), "")) {
- holder.thumbnail.setImageUrl(currentPost.getThumbnailUrl(), imageLoader);
- }
+ //noinspection ConstantConditions
+ Picasso.with(context)
+ .load(currentPost.getThumbnailUrl())
+ .resize(THUMBNAIL_SIZE,THUMBNAIL_SIZE)
+ .centerCrop()
+ .error(ResourcesCompat.getDrawable(context.getResources()
+ , R.drawable.ic_default_user_thumbnail, null))
+ .placeholder(ResourcesCompat.getDrawable(context.getResources()
+ , R.drawable.ic_default_user_thumbnail, null))
+ .transform(new CircleTransform())
+ .into(holder.thumbnail);
//Username set
holder.username.setText(currentPost.getAuthor());
@@ -163,12 +174,7 @@ class TopicAdapter extends RecyclerView.Adapter {
//If user is not deleted then we have more to do
if (!currentPost.isDeleted()) { //Set extra info
//Variables for content
- String c_specialRank = currentPost.getSpecialRank()
- , c_rank = currentPost.getRank()
- , c_gender = currentPost.getGender()
- , c_numberOfPosts = currentPost.getNumberOfPosts()
- , c_personalText = currentPost.getPersonalText()
- , c_urlOfStars = currentPost.getUrlOfStars();
+ String c_specialRank = currentPost.getSpecialRank(), c_rank = currentPost.getRank(), c_gender = currentPost.getGender(), c_numberOfPosts = currentPost.getNumberOfPosts(), c_personalText = currentPost.getPersonalText(), c_urlOfStars = currentPost.getUrlOfStars();
int c_numberOfStars = currentPost.getNumberOfStars();
if (!Objects.equals(c_specialRank, "") && c_specialRank != null) {
@@ -193,11 +199,15 @@ class TopicAdapter extends RecyclerView.Adapter {
}
for (int i = 0; i < c_numberOfStars; ++i) {
- CircularNetworkImageView star = new CircularNetworkImageView(context);
- star.setImageUrl(c_urlOfStars, imageLoader);
+ ImageView star = new ImageView(context);
+
+ Picasso.with(context)
+ .load(c_urlOfStars)
+ .into(star);
//Remove spacing between stars...
//Don't know why this is happening in the first place
+ //TODO change layout? other solution?
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT
@@ -373,7 +383,7 @@ class TopicAdapter extends RecyclerView.Adapter {
private boolean handleUri(final Uri uri) {
//Method always returns true as we don't want any url to be loaded in WebViews
- Log.i(TAG, "Uri = " + uri);
+ Log.i(TAG, "Uri clicked = " + uri);
final String host = uri.getHost(); //Get requested url's host
final String uriString = uri.toString();
diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java
index e27c80f8..5b49cf65 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicParser.java
@@ -26,6 +26,7 @@ class TopicParser {
private static String genderAltMale;
private static String genderAltFemale;
+ @SuppressWarnings("unused")
private static final String TAG = "TopicParser";
static int parseCurrentPageIndex(Document doc) {
@@ -224,14 +225,14 @@ class TopicParser {
}
//Add new post in postsList, extended information needed
returnList.add(new Post(p_thumbnailUrl, p_userName, p_subject, p_post
- , p_postIndex, p_postNum, p_postDate, false, p_rank
+ , p_postIndex, p_postNum, p_postDate, p_rank
, p_specialRank, p_gender, p_numberOfPosts, p_personalText
, p_urlOfStars, p_numberOfStars));
} else { //Deleted user
//Add new post in postsList, only standard information needed
returnList.add(new Post(p_thumbnailUrl, p_userName, p_subject
- , p_post, p_postIndex, p_postNum, p_postDate, true));
+ , p_post, p_postIndex, p_postNum, p_postDate));
}
}
return returnList;
diff --git a/app/src/main/java/gr/thmmy/mthmmy/data/Post.java b/app/src/main/java/gr/thmmy/mthmmy/data/Post.java
index 2352d711..ef9aab49 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/data/Post.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/data/Post.java
@@ -21,8 +21,8 @@ public class Post {
private int numberOfStars;
public Post(String thumbnailUrl, String author, String subject, String content
- , int postIndex, int postNumber, String postDate, boolean isDeleted
- , String rank, String special_rank, String gender, String numberOfPosts
+ , int postIndex, int postNumber, String postDate, String rank
+ , String special_rank, String gender, String numberOfPosts
, String personalText, String urlOfStars, int numberOfStars) {
this.thumbnailUrl = thumbnailUrl;
this.author = author;
@@ -31,7 +31,7 @@ public class Post {
this.postIndex = postIndex;
this.postNumber = postNumber;
this.postDate = postDate;
- this.isDeleted = isDeleted;
+ this.isDeleted = false;
this.rank = rank;
this.specialRank = special_rank;
this.gender = gender;
@@ -42,7 +42,7 @@ public class Post {
}
public Post(String thumbnailUrl, String author, String subject, String content
- , int postIndex, int postNumber, String postDate, boolean isDeleted) {
+ , int postIndex, int postNumber, String postDate) {
this.thumbnailUrl = thumbnailUrl;
this.author = author;
this.subject = subject;
@@ -50,7 +50,7 @@ public class Post {
this.postIndex = postIndex;
this.postNumber = postNumber;
this.postDate = postDate;
- this.isDeleted = isDeleted;
+ this.isDeleted = true;
rank = "Rank";
specialRank = "Special rank";
gender = "Gender";
diff --git a/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java b/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java
index ddc4a42f..4e3175bc 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/session/SessionManager.java
@@ -5,8 +5,6 @@ import android.graphics.Bitmap;
import android.os.Environment;
import android.util.Log;
-import com.android.volley.VolleyError;
-import com.android.volley.toolbox.ImageLoader;
import com.franmontiel.persistentcookiejar.PersistentCookieJar;
import com.franmontiel.persistentcookiejar.persistence.SharedPrefsCookiePersistor;
@@ -23,7 +21,6 @@ import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import gr.thmmy.mthmmy.utils.ImageController;
import okhttp3.Cookie;
import okhttp3.FormBody;
import okhttp3.HttpUrl;
@@ -302,7 +299,7 @@ public class SessionManager
return null;
}
- private File getUserAvatar(String image_url, final String package_name, final String image_name) {
+ /*private File getUserAvatar(String image_url, final String package_name, final String image_name) {
final File[] returnImage = {null};
ImageController.getInstance().getImageLoader().get(image_url, new ImageLoader.ImageListener() {
@@ -336,7 +333,7 @@ public class SessionManager
}
});
return returnImage[0];
- }
+ }*/
/** Create a File for saving an image or video */
private File getOutputMediaFile(String packageName, String imageName){
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/CircleTransform.java b/app/src/main/java/gr/thmmy/mthmmy/utils/CircleTransform.java
new file mode 100644
index 00000000..874e07d4
--- /dev/null
+++ b/app/src/main/java/gr/thmmy/mthmmy/utils/CircleTransform.java
@@ -0,0 +1,57 @@
+package gr.thmmy.mthmmy.utils;
+/*
+ * Copyright 2014 Julian Shen
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import android.graphics.Bitmap;
+import android.graphics.BitmapShader;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import com.squareup.picasso.Transformation;
+
+public class CircleTransform implements Transformation {
+ @Override
+ public Bitmap transform(Bitmap source) {
+ int size = Math.min(source.getWidth(), source.getHeight());
+
+ int x = (source.getWidth() - size) / 2;
+ int y = (source.getHeight() - size) / 2;
+
+ Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
+ if (squaredBitmap != source) {
+ source.recycle();
+ }
+
+ Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
+
+ Canvas canvas = new Canvas(bitmap);
+ Paint paint = new Paint();
+ BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
+ paint.setShader(shader);
+ paint.setAntiAlias(true);
+
+ float r = size / 2f;
+ canvas.drawCircle(r, r, r, paint);
+
+ squaredBitmap.recycle();
+ return bitmap;
+ }
+
+ @Override
+ public String key() {
+ return "circle";
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/CircularNetworkImageView.java b/app/src/main/java/gr/thmmy/mthmmy/utils/CircularNetworkImageView.java
deleted file mode 100644
index 78a68a8a..00000000
--- a/app/src/main/java/gr/thmmy/mthmmy/utils/CircularNetworkImageView.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package gr.thmmy.mthmmy.utils;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Bitmap.Config;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff.Mode;
-import android.graphics.PorterDuffXfermode;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.BitmapDrawable;
-import android.util.AttributeSet;
-
-import com.android.volley.toolbox.NetworkImageView;
-
-public class CircularNetworkImageView extends NetworkImageView {
- private static final int THUMBNAIL_SIZE = 80;
- private Context mContext;
-
- public CircularNetworkImageView(Context context) {
- super(context);
- mContext = context;
- }
-
- public CircularNetworkImageView(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- mContext = context;
- }
-
- public CircularNetworkImageView(Context context, AttributeSet attrs,
- int defStyle) {
- super(context, attrs, defStyle);
- mContext = context;
- }
-
- @Override
- public void setImageBitmap(Bitmap bm) {
- if (bm == null) return;
- setImageDrawable(new BitmapDrawable(mContext.getResources(),
- getCircularBitmap(bm)));
- }
-
- /**
- * Creates a circular bitmap and uses whichever dimension is smaller to determine the width
- *
Also constrains the circle to the leftmost part of the image
- */
- private Bitmap getCircularBitmap(Bitmap bitmap) {
- bitmap = Bitmap.createScaledBitmap(bitmap, THUMBNAIL_SIZE, THUMBNAIL_SIZE, false);
- Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
- bitmap.getHeight(), Config.ARGB_8888);
- Canvas canvas = new Canvas(output);
- int size = bitmap.getWidth();
- if (bitmap.getWidth() > bitmap.getHeight())
- size = bitmap.getHeight();
- final int color = 0xff424242;
- final Paint paint = new Paint();
- final Rect rect = new Rect(0, 0, size, size);
- final RectF rectF = new RectF(rect);
- final float roundPx = size / 2;
-
- paint.setAntiAlias(true);
- canvas.drawARGB(0, 0, 0, 0);
- paint.setColor(color);
- canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
-
- paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
- canvas.drawBitmap(bitmap, rect, rect, paint);
-
- return output;
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/ImageController.java b/app/src/main/java/gr/thmmy/mthmmy/utils/ImageController.java
deleted file mode 100644
index e88350a6..00000000
--- a/app/src/main/java/gr/thmmy/mthmmy/utils/ImageController.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package gr.thmmy.mthmmy.utils;
-
-import android.app.Application;
-import android.text.TextUtils;
-
-import com.android.volley.Request;
-import com.android.volley.RequestQueue;
-import com.android.volley.toolbox.ImageLoader;
-import com.android.volley.toolbox.Volley;
-
-public class ImageController extends Application {
-
- private static final String TAG = ImageController.class.getSimpleName();
- private static ImageController mInstance;
- private RequestQueue mRequestQueue;
- private ImageLoader mImageLoader;
-
- public static synchronized ImageController getInstance() {
- return mInstance;
- }
-
- @Override
- public void onCreate() {
- super.onCreate();
- mInstance = this;
- }
-
- private RequestQueue getRequestQueue() {
- if (mRequestQueue == null) {
- mRequestQueue = Volley.newRequestQueue(getApplicationContext());
- }
-
- return mRequestQueue;
- }
-
- public ImageLoader getImageLoader() {
- getRequestQueue();
- if (mImageLoader == null) {
- mImageLoader = new ImageLoader(this.mRequestQueue,
- new LruBitmapCache());
- }
- return this.mImageLoader;
- }
-
- public void addToRequestQueue(Request req, String tag) {
- // set the default tag if tag is empty
- req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
- getRequestQueue().add(req);
- }
-
- public void addToRequestQueue(Request req) {
- req.setTag(TAG);
- getRequestQueue().add(req);
- }
-
- public void cancelPendingRequests() {
- mRequestQueue.cancelAll(new RequestQueue.RequestFilter() {
- @Override
- public boolean apply(Request> request) {
- return true;
- }
- });
- }
-}
-
-
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/LruBitmapCache.java b/app/src/main/java/gr/thmmy/mthmmy/utils/LruBitmapCache.java
deleted file mode 100644
index 32ae5971..00000000
--- a/app/src/main/java/gr/thmmy/mthmmy/utils/LruBitmapCache.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package gr.thmmy.mthmmy.utils;
-
-import android.graphics.Bitmap;
-import android.support.v4.util.LruCache;
-
-import com.android.volley.toolbox.ImageLoader.ImageCache;
-
-class LruBitmapCache extends LruCache implements
- ImageCache {
- private static final int CACHE_SIZE_DIVIDER = 8;
-
- LruBitmapCache() {
- this(getDefaultLruCacheSize());
- }
-
- private LruBitmapCache(int sizeInKiloBytes) {
- super(sizeInKiloBytes);
- }
-
- private static int getDefaultLruCacheSize() {
- final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
- final int cacheSize = maxMemory / CACHE_SIZE_DIVIDER;
-
- return cacheSize;
- }
-
- @Override
- protected int sizeOf(String key, Bitmap value) {
- return value.getRowBytes() * value.getHeight() / 1024;
- }
-
- @Override
- public Bitmap getBitmap(String url) {
- return get(url);
- }
-
- @Override
- public void putBitmap(String url, Bitmap bitmap) {
- put(url, bitmap);
- }
-}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_topic_post_row.xml b/app/src/main/res/layout/activity_topic_post_row.xml
index b95fcb6c..e9e069b1 100644
--- a/app/src/main/res/layout/activity_topic_post_row.xml
+++ b/app/src/main/res/layout/activity_topic_post_row.xml
@@ -81,15 +81,16 @@
android:layout_centerVertical="true"
android:layout_marginEnd="16dp">
-
+ android:maxWidth="@dimen/thumbnail_size"
+ android:src="@drawable/ic_default_user_thumbnail"/>
+ android:background="@drawable/ic_toggle_quote_bg"
+ android:contentDescription="@string/quote"/>
16dp
16dp
8dp
- 80dp
- 16dp
+ 44dp
-15dp
36dp
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 68e1c88a..2c5904f0 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -17,6 +17,8 @@
Username should be here…
Subject should be here…
Post should be here…
+ Thumbnail should be here…
+ Quote button should be here…
first
previous
Page
diff --git a/build.gradle b/build.gradle
index 01b0b9a0..b0aa0b0a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -6,7 +6,7 @@ buildscript {
maven { url "https://jitpack.io" }
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.2'
+ classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files