package com.masterofcode.android.magreader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import org.kroz.activerecord.ActiveRecordBase;
import org.kroz.activerecord.ActiveRecordException;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.SearchView;
import android.widget.Toast;
import com.facebook.android.AsyncFacebookRunner;
import com.facebook.android.Facebook;
import com.facebook.android.FacebookError;
import com.facebook.android.Util;
import com.masterofcode.android.magreader.application.JtjApplication;
import com.masterofcode.android.magreader.bookmarks.BookmarksManager;
import com.masterofcode.android.magreader.db.entity.FeedItem;
import com.masterofcode.android.magreader.fragments.FeedsListForViewFragment;
import com.masterofcode.android.magreader.fragments.FeedsViewFragment;
import com.masterofcode.android.magreader.share.fb.BaseDialogListener;
import com.masterofcode.android.magreader.share.fb.BaseRequestListener;
import com.masterofcode.android.magreader.share.fb.SampleAuthListener;
import com.masterofcode.android.magreader.share.fb.SampleLogoutListener;
import com.masterofcode.android.magreader.share.fb.SessionEvents;
import com.masterofcode.android.magreader.share.fb.SessionStore;
import com.masterofcode.android.magreader.utils.ActionBarView;
import com.masterofcode.android.magreader.utils.constants.Constants;
import com.sandsmedia.apps.mobile.android.epub.lib.R;
public class FeedsActivity extends Activity {
private Context mContext;
private int mCurrentPosition = -1;
private int mCurrentCategory = 0;
private String mCurrentGuid;
private String mSearchKeywords = null;
private boolean isLoadData = false;
private Facebook mFacebook;
private Dialog fbDialog;
private AsyncFacebookRunner mAsyncRunner;
List<FeedItem> items;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.feed_view);
this.mContext = this;
ActionBar actionBar = getActionBar();
setCurrentCategory(getIntent().getIntExtra("category_id", 0));
setCurrentGid(getIntent().getStringExtra("item_guid"));
setmKeywords(getIntent().getStringExtra("search_keyword"));
initFacebook();
if (savedInstanceState != null) {
if (savedInstanceState.containsKey("curPosition")) {
setCurrentPosition(savedInstanceState.getInt("curPosition"));
} else {
setCurrentPosition(0);
}
setCurrentGid(savedInstanceState.getString("curGuid"));
setCurrentCategory(savedInstanceState.getInt("curCategory"));
if (savedInstanceState.getBoolean("fbShare")){
try {
facebookShare(savedInstanceState.getString("feedTitle") + " " + savedInstanceState.getString("feedUrl"));
} catch (Exception e) {
}
}
}
ActionBarView.setActionBarStandartView(actionBar, mContext);
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
protected void onResume() {
super.onResume();
new getItemsAsyncTask().execute(getCurrentCategory());
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curPosition", getCurrentPosition());
outState.putInt("curCategory", getCurrentCategory());
outState.putString("curGuid", getCurrentGuid());
if (fbDialog != null && fbDialog.isShowing()){
fbDialog.dismiss();
FeedItem curFeed = items.get(mCurrentPosition);
outState.putBoolean("fbShare", true);
outState.putString("feedTitle", curFeed.title);
outState.putString("feedUrl", curFeed.link);
}
}
public int getCurrentPosition() {
return mCurrentPosition;
}
public void setCurrentPosition(int mCurrentPosition) {
this.mCurrentPosition = mCurrentPosition;
if(isLoadData)this.invalidateOptionsMenu();
}
public List<FeedItem> getItems() {
return items;
}
private String getmKeywords() {
return mSearchKeywords;
}
private void setmKeywords(String mKeywords) {
this.mSearchKeywords = mKeywords;
}
public int getCurrentCategory() {
return mCurrentCategory;
}
public void setCurrentCategory(int mCurrentCategory) {
this.mCurrentCategory = mCurrentCategory;
}
public String getCurrentGuid() {
return mCurrentGuid;
}
public void setCurrentGid(String mCurrentGuid) {
this.mCurrentGuid = mCurrentGuid;
}
private class getItemsAsyncTask extends AsyncTask<Integer, Void, List<FeedItem>> {
@Override
protected List<FeedItem> doInBackground(Integer... params) {
List<FeedItem> listFeeds = null;
if (!isLoadData) {
try {
Integer curCategory = params[0];
ActiveRecordBase _db = ((JtjApplication) ((FeedsActivity) mContext).getApplication()).getDatabase();
if (!_db.isOpen()) _db.open();
listFeeds = _db.find(FeedItem.class, false, "CHANNELID=?", new String[] { String.valueOf(curCategory) }, null, null, "PUBLICATIONDATE DESC", null);
//_db.close();
int curPos = findPositionByGid(listFeeds, getCurrentGuid());
if (curPos != -1) setCurrentPosition(curPos);
isLoadData = true;
//_db.close();
return listFeeds;
} catch (ActiveRecordException e) {
e.printStackTrace();
}
} else {
return items;
}
return items;
}
@Override
protected void onPostExecute(List<FeedItem> listFeeds) {
super.onPostExecute(listFeeds);
items = listFeeds;
FrameLayout frl = (FrameLayout) findViewById(R.id.frameForListView);
if (frl.getVisibility() != View.GONE) {
FeedsListForViewFragment fl = (FeedsListForViewFragment) getFragmentManager().findFragmentById(R.id.feed_list_for_view);
fl.setItemsToList(items, getCurrentPosition(), getmKeywords());
updateBookmarkingMenuItem(items.get(getCurrentPosition()).isBookmarked);
} else {
FeedsViewFragment fv = (FeedsViewFragment) getFragmentManager().findFragmentById(R.id.feed_view_fragment);
fv.setViewItem(items.get(getCurrentPosition()), getmKeywords());
updateBookmarkingMenuItem(items.get(getCurrentPosition()).isBookmarked);
}
updateBookmarkingMenuItem(true);
}
}
private int findPositionByGid(List<FeedItem> listFeeds, String gid){
for(FeedItem item : listFeeds){
if (gid.equals(item.guid))
return listFeeds.indexOf(item);
}
return -1;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.feed_view_menu, menu);
// search settings
final SearchView searchView = (SearchView) menu.findItem(R.id.menu_feed_search).getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchView.setIconified(true);
Intent intent = new Intent(FeedsActivity.this, SearchActivity.class);
intent.putExtra(Constants.BUNDLE_KEY_SEARCH_KEYWORD, query);
intent.putExtra(Constants.BUNDLE_KEY_SEARCH_TYPE, Constants.SEARCH_TYPE_FEEDS);
startActivity(intent);
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
super.onPrepareOptionsMenu(menu);
MenuItem item = menu.findItem(R.id.twitter_menu);
if(findTwitterClient() == null){
item.setVisible(false);
item.setEnabled(false);
} else {
item.setVisible(true);
item.setEnabled(true);
}
MenuItem bookmrarkItem = menu.findItem(R.id.menu_feed_bookmark);
if(bookmrarkItem!=null)
{
if(items!=null)
{
FeedItem currentFeed = items.get(getCurrentPosition());
if(currentFeed != null)
{
bookmrarkItem.setVisible(!currentFeed.isBookmarked);
bookmrarkItem.setEnabled(!currentFeed.isBookmarked);
}
}
}
return true;
}
public void updateBookmarkingMenuItem(boolean isBookmarked)
{
this.invalidateOptionsMenu();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
FeedItem curFeed;
String url;
curFeed = items.get(mCurrentPosition);
url = curFeed.link;
int itemId = item.getItemId();
if (itemId == R.id.menu_feed_browser) {
curFeed = items.get(mCurrentPosition);
url = curFeed.link;
startActivityForResult(new Intent(Intent.ACTION_VIEW, Uri.parse(url)),Constants.REQUEST_CODE_VIEW_IN_BROWSER);
return true;
}
else if (itemId == android.R.id.home) {
finish();
return true;
}
else if (itemId == R.id.menu_feed_bookmark) {
FeedItem currentFeed = items.get(mCurrentPosition);
BookmarksManager.GetInstance().BoomarkFeed(this, currentFeed);
Toast.makeText(this, R.string.bookmarks_feed_added, Toast.LENGTH_SHORT).show();
this.invalidateOptionsMenu();
return true;
}
else if (itemId == R.id.fb_menu) {
facebookShare(curFeed.title + " " + url);
return true;
}
else if (itemId == R.id.twitter_menu) {
twitterShare(curFeed.title + " " + url);
return true;
}
else if (itemId == R.id.mail_menu) {
mailShare(curFeed.title, curFeed.title + " " + url);
return true;
}
else if (itemId == R.id.menu_feed_share) {
return true;
}
else {
return super.onOptionsItemSelected(item);
}
}
public ResolveInfo findTwitterClient() {
final String[] twitterApps = {
// package // name - nb installs (thousands)
"com.twitter.android", // official - 10 000
"com.twidroid", // twidroyd - 5 000
"com.handmark.tweetcaster", // Tweecaster - 5 000
"com.thedeck.android"}; // TweetDeck - 5 000 };
Intent tweetIntent = new Intent();
tweetIntent.setType("text/plain");
final PackageManager packageManager = getPackageManager();
List<ResolveInfo> list = packageManager.queryIntentActivities(
tweetIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (int i = 0; i <twitterApps.length; i++) {
for (ResolveInfo resolveInfo : list) {
String p = resolveInfo.activityInfo.packageName;
if (p != null && p.startsWith(twitterApps[i])) {
tweetIntent.setPackage(p);
return resolveInfo;
}
}
}
return null;
}
private void initFacebook(){
// mFacebook = new Facebook(Constants.APP_ID);
//Eddie Li id from string file
mFacebook = new Facebook(getApplication().getString(R.string.app_id));
mAsyncRunner = new AsyncFacebookRunner(mFacebook);
SessionStore.restore(mFacebook, this);
SessionEvents.addAuthListener(new SampleAuthListener());
SessionEvents.addLogoutListener(new SampleLogoutListener());
}
private void facebookShare(String data){
try {
Bundle parameters = new Bundle();
Configuration config = getBaseContext().getResources().getConfiguration();
parameters.putString("locale", config.locale.toString());
parameters.putString("message", data);
parameters.putString("picture", "http://entwickler.com/magazin/eclipse/android-ecm-app-icon.png");
parameters.putString("name", "Eclipse Magazin für Android");
parameters.putString("link", "http://www.eclipse-magazin.de");
parameters.putString("description", "Eclipse Magazin: Alle Ausgaben auf Ihrem Android-Tablet lesen!");
fbDialog = mFacebook.dialog(FeedsActivity.this, "stream.publish", parameters, new SampleDialogListener());// "stream.publish" is an API call
fbDialog.show();
} catch (Exception e) {
if (Constants.Debug) Log.d("Facebook", "Error:" + e.getMessage());
}
}
private void twitterShare(String data){
ResolveInfo twDefaultCl = findTwitterClient();
if (twDefaultCl != null){
try{
Intent intent;
final ActivityInfo activity=twDefaultCl.activityInfo;
final ComponentName name=new ComponentName(activity.applicationInfo.packageName, activity.name);
intent=new Intent(Intent.ACTION_SEND);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
intent.setComponent(name);
intent.putExtra(Intent.EXTRA_TEXT, data);
mContext.startActivity(intent);
}
catch(final ActivityNotFoundException e) {
Log.i("jtj", "no twitter native",e );
}
}
}
private void mailShare(String subject ,String data){
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
emailIntent.setType("plain/text");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, data);
startActivity(Intent.createChooser(emailIntent, "Send your email in:"));
}
public class SampleDialogListener extends BaseDialogListener{
public void onComplete(Bundle values) {
final String message = values.getString("post_id");
if (!TextUtils.isEmpty(message)) {
if (Constants.Debug) Log.d("Facebook-Example", "Dialog Success! post_id=" + message);
mAsyncRunner.request(message, new WallPostRequestListener());
} else {
if (Constants.Debug) Log.d("Facebook-Example", "No wall post made");
}
}
}
public class WallPostRequestListener extends BaseRequestListener {
public void onComplete(final String response) {
if (Constants.Debug) Log.d("Facebook-Example", "Got response: " + response);
String message = "<empty>";
try {
JSONObject json = Util.parseJson(response);
message = json.getString("message");
} catch (JSONException e) {
Log.w("Facebook-Example", "JSON Error in response");
} catch (FacebookError e) {
Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());
}
final String text = "Your Wall Post: " + message;
FeedsActivity.this.runOnUiThread(new Runnable() {
public void run() {
Log.w("Facebook", text);
}
});
}
@Override
public void onComplete(String response, Object state) {
}
@Override
public void onFacebookError(FacebookError e, Object state) {
}
@Override
public void onFileNotFoundException(FileNotFoundException e,
Object state) {
}
@Override
public void onIOException(IOException e, Object state) {
}
@Override
public void onMalformedURLException(MalformedURLException e,
Object state) {
}
}
}