package com.manuelmaly.hn.util;
import android.os.AsyncTask;
import android.util.Log;
import com.manuelmaly.hn.App;
import com.manuelmaly.hn.model.HNCommentTreeNode;
import com.manuelmaly.hn.model.HNFeed;
import com.manuelmaly.hn.model.HNPostComments;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.List;
public class FileUtil {
private static final String LAST_HNFEED_FILENAME = "lastHNFeed";
private static final String LAST_HNPOSTCOMMENTS_FILENAME_PREFIX = "lastHNPostComments";
private static final String TAG = "FileUtil";
public abstract static class GetLastHNFeedTask extends AsyncTask<Void, Void, HNFeed> {
@Override
protected HNFeed doInBackground(Void... params) {
return getLastHNFeed();
}
}
/*
* Returns null if no last feed was found or could not be parsed.
*/
private static HNFeed getLastHNFeed() {
ObjectInputStream obj = null;
try {
obj = new ObjectInputStream(new FileInputStream(getLastHNFeedFilePath()));
Object rawHNFeed = obj.readObject();
if (rawHNFeed instanceof HNFeed)
return (HNFeed) rawHNFeed;
} catch (Exception e) {
Log.e(TAG, "Could not get last HNFeed from file :(", e);
} finally {
if (obj != null) {
try {
obj.close();
} catch (IOException e) {
Log.e(TAG, "Couldn't close last NH feed file :(", e);
}
}
}
return null;
}
public static void setLastHNFeed(final HNFeed hnFeed) {
Run.inBackground(new Runnable() {
public void run() {
ObjectOutputStream os = null;
try {
os = new ObjectOutputStream(new FileOutputStream(getLastHNFeedFilePath()));
os.writeObject(hnFeed);
} catch (Exception e) {
Log.e(TAG, "Could not save last HNFeed to file :(", e);
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
Log.e(TAG, "Couldn't close last NH feed file :(", e);
}
}
}
}
});
}
private static String getLastHNFeedFilePath() {
File dataDir = App.getInstance().getFilesDir();
return dataDir.getAbsolutePath() + File.pathSeparator + LAST_HNFEED_FILENAME;
}
public abstract static class GetLastHNPostCommentsTask extends AsyncTask<String, Void, HNPostComments> {
@Override
protected HNPostComments doInBackground(String... postIDs) {
if (postIDs != null && postIDs.length > 0)
return getLastHNPostComments(postIDs[0]);
return null;
}
}
/*
* Returns null if no last comments file was found or could not be parsed.
*/
private static HNPostComments getLastHNPostComments(String postID) {
ObjectInputStream obj = null;
try {
obj = new ObjectInputStream(new FileInputStream(getLastHNPostCommentsPath(postID)));
Object rawHNComments = obj.readObject();
if (rawHNComments instanceof HNPostComments)
return (HNPostComments) rawHNComments;
} catch (Exception e) {
Log.e(TAG, "Could not get last HNPostComments from file :(", e);
} finally {
if (obj != null) {
try {
obj.close();
} catch (IOException e) {
Log.e(TAG, "Couldn't close last NH comments file :(", e);
}
}
}
return null;
}
public static void setLastHNPostComments(final HNPostComments comments, final String postID) {
Run.inBackground(new Runnable() {
public void run() {
ObjectOutputStream os = null;
try {
int nodesCount = countNodes(comments.getTreeNodes());
if (nodesCount > 150) {
return;
}
os = new ObjectOutputStream(new FileOutputStream(getLastHNPostCommentsPath(postID)));
os.writeObject(comments);
} catch (Exception e) {
Log.e(TAG, "Could not save last HNPostComments to file :(", e);
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
Log.e(TAG, "Couldn't close last NH comments file :(", e);
}
}
}
}
});
}
private static String getLastHNPostCommentsPath(String postID) {
File dataDir = App.getInstance().getFilesDir();
return dataDir.getAbsolutePath() + "/" + LAST_HNPOSTCOMMENTS_FILENAME_PREFIX + "_" + postID;
}
private static int countNodes(List<HNCommentTreeNode> nodes) {
int sum = 0;
if (nodes != null) {
sum += nodes.size();
for (HNCommentTreeNode n : nodes) {
sum += countNodes(n.getChildren());
}
}
return sum;
}
}