Display user name and user icon in each post when loading posts in specific subreddits.

This commit is contained in:
Alex Ning
2019-01-01 23:32:03 +08:00
parent f529bba550
commit 49d25314d5
20 changed files with 603 additions and 173 deletions

View File

@@ -0,0 +1,50 @@
package User;
import android.support.annotation.NonNull;
import android.util.Log;
import ml.docilealligator.infinityforreddit.RedditAPI;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Retrofit;
public class FetchUserData {
public interface FetchUserDataListener {
void onFetchUserDataSuccess(User user);
void onFetchUserDataFail();
}
public static void fetchUserData(final Retrofit retrofit, String userName,
final FetchUserDataListener fetchUserDataListener) {
RedditAPI api = retrofit.create(RedditAPI.class);
Call<String> userInfo = api.getUserData(userName);
userInfo.enqueue(new Callback<String>() {
@Override
public void onResponse(@NonNull Call<String> call, @NonNull retrofit2.Response<String> response) {
if(response.isSuccessful()) {
ParseUserData.parseMyInfo(response.body(), new ParseUserData.ParseUserDataListener() {
@Override
public void onParseUserDataSuccess(User user) {
fetchUserDataListener.onFetchUserDataSuccess(user);
}
@Override
public void onParseUserDataFail() {
fetchUserDataListener.onFetchUserDataFail();
}
});
} else {
Log.i("call failed", response.message());
fetchUserDataListener.onFetchUserDataFail();
}
}
@Override
public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) {
Log.i("call failed", t.getMessage());
fetchUserDataListener.onFetchUserDataFail();
}
});
}
}

View File

@@ -0,0 +1,72 @@
package User;
import android.os.AsyncTask;
import android.util.Log;
import org.json.JSONException;
import org.json.JSONObject;
import ml.docilealligator.infinityforreddit.JSONUtils;
public class ParseUserData {
interface ParseUserDataListener {
void onParseUserDataSuccess(User user);
void onParseUserDataFail();
}
static void parseMyInfo(String response, ParseUserDataListener parseUserDataListener) {
new ParseUserDataAsyncTask(response, parseUserDataListener).execute();
}
private static class ParseUserDataAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONObject jsonResponse;
private ParseUserDataListener parseUserDataListener;
private boolean parseFailed;
private User user;
ParseUserDataAsyncTask(String response, ParseUserDataListener parseUserDataListener){
try {
jsonResponse = new JSONObject(response);
this.parseUserDataListener = parseUserDataListener;
parseFailed = false;
} catch (JSONException e) {
Log.i("user data json error", e.getMessage());
parseUserDataListener.onParseUserDataFail();
}
}
@Override
protected Void doInBackground(Void... voids) {
try {
jsonResponse = jsonResponse.getJSONObject(JSONUtils.DATA_KEY);
String userName = jsonResponse.getString(JSONUtils.NAME_KEY);
String iconImageUrl = jsonResponse.getString(JSONUtils.ICON_IMG_KEY);
String bannerImageUrl = "";
if(!jsonResponse.isNull(JSONUtils.SUBREDDIT_KEY)) {
bannerImageUrl = jsonResponse.getJSONObject(JSONUtils.SUBREDDIT_KEY).getString(JSONUtils.BANNER_IMG_KEY);
}
int linkKarma = jsonResponse.getInt(JSONUtils.LINK_KARMA_KEY);
int commentKarma = jsonResponse.getInt(JSONUtils.COMMENT_KARMA_KEY);
int karma = linkKarma + commentKarma;
boolean isGold = jsonResponse.getBoolean(JSONUtils.IS_GOLD_KEY);
boolean isFriend = jsonResponse.getBoolean(JSONUtils.IS_FRIEND_KEY);
user = new User(userName, iconImageUrl, bannerImageUrl, karma, isGold, isFriend);
} catch (JSONException e) {
parseFailed = true;
Log.i("parse user data error", e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
if(!parseFailed) {
parseUserDataListener.onParseUserDataSuccess(user);
} else {
parseUserDataListener.onParseUserDataFail();
}
}
}
}

View File

@@ -0,0 +1,58 @@
package User;
import android.arch.persistence.room.ColumnInfo;
import android.arch.persistence.room.Entity;
import android.arch.persistence.room.PrimaryKey;
import android.support.annotation.NonNull;
@Entity(tableName = "users")
public class User {
@PrimaryKey
@NonNull
@ColumnInfo(name = "user_name")
private String userName;
@ColumnInfo(name = "icon")
private String icon;
@ColumnInfo(name = "banner")
private String banner;
@ColumnInfo(name = "karma")
private int karma;
@ColumnInfo(name = "is_gold")
private boolean isGold;
@ColumnInfo(name = "is_friend")
private boolean isFriend;
User(@NonNull String userName, String icon, String banner, int karma, boolean isGold, boolean isFriend) {
this.userName = userName;
this.icon = icon;
this.banner = banner;
this.karma = karma;
this.isGold = isGold;
this.isFriend = isFriend;
}
@NonNull
public String getUserName() {
return userName;
}
public String getIcon() {
return icon;
}
public String getBanner() {
return banner;
}
public int getKarma() {
return karma;
}
public boolean isGold() {
return isGold;
}
public boolean isFriend() {
return isFriend;
}
}

View File

@@ -0,0 +1,18 @@
package User;
import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.OnConflictStrategy;
import android.arch.persistence.room.Query;
@Dao
public interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(User user);
@Query("DELETE FROM users")
void deleteAllUsers();
@Query("SELECT * FROM users WHERE user_name = :userName LIMIT 1")
User getUserData(String userName);
}

View File

@@ -1,4 +0,0 @@
package User;
public class UserData {
}

View File

@@ -0,0 +1,26 @@
package User;
import android.arch.persistence.room.Database;
import android.arch.persistence.room.Room;
import android.arch.persistence.room.RoomDatabase;
import android.content.Context;
@Database(entities = {User.class}, version = 1)
public abstract class UserRoomDatabase extends RoomDatabase {
private static UserRoomDatabase INSTANCE;
public abstract UserDao userDao();
public static UserRoomDatabase getDatabase(final Context context) {
if(INSTANCE == null) {
synchronized (UserRoomDatabase.class) {
if(INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
UserRoomDatabase.class, "users")
.build();
}
}
}
return INSTANCE;
}
}