package course.labs.notificationslab;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public class MainActivity extends Activity implements SelectionListener,
DownloadFinishedListener {
private static final String TAG_NAME = "name";
private static final String TAG_USER = "user";
private static final String TAG_TEXT = "text";
private static final String TAG_FRIENDS_FRAGMENT = "friends_fragment";
private static final String TAG_FEED_FRAGMENT = "feed_fragment";
private static final String TAG_DOWNLOADER_FRAGMENT = "downloader_fragment";
private static final String TAG_IS_DATA_AVAILABLE = "is_data_available";
private static final String TAG_PROCESSED_FEEDS = "processed_feeds";
static final String TAG_TWEET_DATA = "data";
static final String TAG_FRIEND_RES_IDS = "friends";
public static final String TWEET_FILENAME = "tweets.txt";
public final static String[] FRIENDS_NAMES = { "taylorswift13",
"msrebeccablack", "ladygaga" };
public static final int IS_ALIVE = Activity.RESULT_FIRST_USER;
public static final String DATA_REFRESHED_ACTION = "course.labs.notificationslabnew.DATA_REFRESHED";
private static final String TAG = "Lab-Notifications";
// Raw feed file IDs used to reference stored tweet data
public static final ArrayList<Integer> sRawTextFeedIds = new ArrayList<Integer>(
Arrays.asList(R.raw.tswift, R.raw.rblack, R.raw.lgaga));
private FragmentManager mFragmentManager;
private FriendsFragment mFriendsFragment;
private FeedFragment mFeedFragment;
private DownloaderTaskFragment mDownloaderFragment;
private boolean mIsInteractionEnabled;
private String[] mFormattedFeeds = new String[sRawTextFeedIds.size()];;
private boolean mIsFresh;
private BroadcastReceiver mRefreshReceiver;
private static final long TWO_MIN = 2 * 60 * 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragmentManager = getFragmentManager();
// Reset instance state on reconfiguration
if (null != savedInstanceState) {
restoreState(savedInstanceState);
} else {
setupFragments();
}
}
// One time setup of UI and retained (headless) Fragment
private void setupFragments() {
installFriendsFragment();
// The feed is fresh if it was downloaded less than 2 minutes ago
mIsFresh = (System.currentTimeMillis() - getFileStreamPath(
TWEET_FILENAME).lastModified()) < TWO_MIN;
if (!mIsFresh) {
installDownloaderTaskFragment();
// TODO: Show a Toast message displaying
// R.string.download_in_progress string
// Set up a BroadcastReceiver to receive an Intent when download
// finishes.
mRefreshReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO:
// Check to make sure this is an ordered broadcast
// Let sender know that the Intent was received
// by setting result code to MainActivity.IS_ALIVE
}
};
} else {
// Process Twitter data taken from stored file
parseJSON(loadTweetsFromFile());
// Enable user interaction
mIsInteractionEnabled = true;
}
}
// Add Friends Fragment to Activity
private void installFriendsFragment() {
// Make new Fragment
mFriendsFragment = new FriendsFragment();
// Give Fragment to the FragmentManager
FragmentTransaction transaction = mFragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, mFriendsFragment,
TAG_FRIENDS_FRAGMENT);
transaction.commit();
}
// Add DownloaderTaskFragment to Activity
private void installDownloaderTaskFragment() {
// Make new Fragment
mDownloaderFragment = new DownloaderTaskFragment();
// Set DownloaderTaskFragment arguments
Bundle args = new Bundle();
args.putIntegerArrayList(TAG_FRIEND_RES_IDS, sRawTextFeedIds);
mDownloaderFragment.setArguments(args);
// Give Fragment to the FragmentManager
mFragmentManager.beginTransaction()
.add(mDownloaderFragment, TAG_DOWNLOADER_FRAGMENT).commit();
}
// Register the BroadcastReceiver
@Override
protected void onResume() {
super.onResume();
// TODO:
// Register the BroadcastReceiver to receive a
// DATA_REFRESHED_ACTION broadcast
}
@Override
protected void onPause() {
// TODO:
// Unregister the BroadcastReceiver if it has been registered
// Note: check that mRefreshReceiver is not null before attempting to
// unregister in order to work around an Instrumentation issue
super.onPause();
}
/*
* DownloadFinishedListener method
*/
// Called back by DownloaderTask after data has been loaded
public void notifyDataRefreshed(String[] feeds) {
// Process downloaded data
parseJSON(feeds);
// Enable user interaction
mIsInteractionEnabled = true;
allowUserClicks();
};
// Enable user interaction with FriendFragment
private void allowUserClicks() {
mFriendsFragment.setAllowUserClicks(true);
}
/*
* SelectionListener methods
*/
// Report whether users interaction is enabled
public boolean canAllowUserClicks() {
return mIsInteractionEnabled;
}
// Installs the FeedFragment when a Friend name is
// selected in the FriendsFragment
@Override
public void onItemSelected(int position) {
installFeedFragment(mFormattedFeeds[position]);
}
// Add FeedFragment to Activity
private void installFeedFragment(String tweetData) {
// Make new Fragment
mFeedFragment = new FeedFragment();
// Set Fragment arguments
Bundle args = new Bundle();
args.putString(TAG_TWEET_DATA, tweetData);
mFeedFragment.setArguments(args);
// Give Fragment to the FragmentManager
FragmentTransaction transaction = mFragmentManager.beginTransaction();
transaction.replace(R.id.fragment_container, mFeedFragment,
TAG_FEED_FRAGMENT);
transaction.addToBackStack(null);
transaction.commit();
}
@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
if (null != mFriendsFragment) {
savedInstanceState.putString(TAG_FRIENDS_FRAGMENT,
mFriendsFragment.getTag());
}
if (null != mFeedFragment) {
savedInstanceState.putString(TAG_FEED_FRAGMENT,
mFeedFragment.getTag());
}
if (null != mDownloaderFragment) {
savedInstanceState.putString(TAG_DOWNLOADER_FRAGMENT,
mDownloaderFragment.getTag());
}
savedInstanceState.putBoolean(TAG_IS_DATA_AVAILABLE,
mIsInteractionEnabled);
savedInstanceState.putStringArray(TAG_PROCESSED_FEEDS, mFormattedFeeds);
super.onSaveInstanceState(savedInstanceState);
}
// Restore saved instance state
private void restoreState(Bundle savedInstanceState) {
// Fragments tags were saved in onSavedInstanceState
mFriendsFragment = (FriendsFragment) mFragmentManager
.findFragmentByTag(savedInstanceState
.getString(TAG_FRIENDS_FRAGMENT));
mFeedFragment = (FeedFragment) mFragmentManager
.findFragmentByTag(savedInstanceState
.getString(TAG_FEED_FRAGMENT));
mDownloaderFragment = (DownloaderTaskFragment) mFragmentManager
.findFragmentByTag(savedInstanceState
.getString(TAG_DOWNLOADER_FRAGMENT));
mIsInteractionEnabled = savedInstanceState
.getBoolean(TAG_IS_DATA_AVAILABLE);
if (mIsInteractionEnabled) {
mFormattedFeeds = savedInstanceState
.getStringArray(TAG_PROCESSED_FEEDS);
}
}
// Convert raw data (in JSON format) into text for display
private void parseJSON(String[] feeds) {
JSONArray[] JSONFeeds = new JSONArray[feeds.length];
for (int i = 0; i < JSONFeeds.length; i++) {
try {
JSONFeeds[i] = new JSONArray(feeds[i]);
} catch (JSONException e) {
e.printStackTrace();
}
String name = "";
String tweet = "";
JSONArray tmp = JSONFeeds[i];
// string buffer for feeds
StringBuffer tweetRec = new StringBuffer("");
for (int j = 0; j < tmp.length(); j++) {
try {
tweet = tmp.getJSONObject(j).getString(TAG_TEXT);
JSONObject user = (JSONObject) tmp.getJSONObject(j).get(
TAG_USER);
name = user.getString(TAG_NAME);
} catch (JSONException e) {
e.printStackTrace();
}
tweetRec.append(name + " - " + tweet + "\n\n");
}
mFormattedFeeds[i] = tweetRec.toString();
}
}
// Retrieve feeds text from a file
// Store them in mRawTextFeed[]
private String[] loadTweetsFromFile() {
BufferedReader reader = null;
ArrayList<String> rawFeeds = new ArrayList<String>();
try {
FileInputStream fis = openFileInput(TWEET_FILENAME);
reader = new BufferedReader(new InputStreamReader(fis));
String s = null;
int i = 0;
while (null != (s = reader.readLine())) {
rawFeeds.add(i, s);
i++;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != reader) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return rawFeeds.toArray(new String[rawFeeds.size()]);
}
}