package net.ggelardi.flucso; import net.ggelardi.flucso.BaseFragment.OnFFReqsListener; import net.ggelardi.flucso.data.DrawerAdapter; import net.ggelardi.flucso.serv.Commons; import net.ggelardi.flucso.serv.FFAPI; import net.ggelardi.flucso.serv.FFService; import net.ggelardi.flucso.serv.Commons.PK; import net.ggelardi.flucso.serv.FFAPI.Entry; import net.ggelardi.flucso.serv.FFAPI.FeedInfo; import net.ggelardi.flucso.serv.FFAPI.FeedList; import net.ggelardi.flucso.serv.FFAPI.FeedList.SectionItem; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; import android.app.AlertDialog; import android.app.Fragment; import android.app.FragmentManager; import android.app.NotificationManager; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.res.Configuration; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends BaseActivity implements OnFFReqsListener { private static final int REQ_SEARCH = 100; private static final int REQ_NEWPOST = 110; private String lastFeed; private DrawerAdapter adapter; private CharSequence mTitle; private CharSequence mDrawerTitle; private DrawerLayout mDrawerLayout; private View mDrawerView; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private LinearLayout mUserBox; private ImageView mUserIcon; private TextView mUserName; private TextView mUserLogin; private MenuItem miDrwUpd; private MenuItem miDrwCfg; private MenuItem miDrwAbo; private MenuItem miSearch; private MenuItem miConfig; private MenuItem miAboutD; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (session.cachedFeed != null) lastFeed = session.cachedFeed.id; else { lastFeed = session.getPrefs().getString(PK.STARTUP, "home"); lastFeed = savedInstanceState != null ? savedInstanceState.getString("lastFeed", lastFeed) : lastFeed; } adapter = new DrawerAdapter(this); mTitle = mDrawerTitle = getTitle(); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mDrawerView = findViewById(R.id.drawer_view); mDrawerList = (ListView) findViewById(R.id.lv_feed); mDrawerList.setAdapter(adapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { @Override public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } }; mDrawerLayout.setDrawerListener(mDrawerToggle); mUserBox = (LinearLayout) findViewById(R.id.user_box); mUserIcon = (ImageView) findViewById(R.id.user_icon); mUserName = (TextView) findViewById(R.id.user_name); mUserLogin = (TextView) findViewById(R.id.user_login); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); // Commons.picasso(getApplicationContext()).setIndicatorsEnabled(true); Intent intent = getIntent(); if (!intent.getAction().equals(Intent.ACTION_MAIN)) onNewIntent(intent); } @Override protected void onResume() { super.onResume(); if (!session.hasAccount()) { mUserIcon.setImageResource(R.drawable.nomugshot); mUserName.setText(R.string.noaccount_name); mUserLogin.setText(R.string.noaccount_login); mUserBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { v.getContext().startActivity(new Intent(MainActivity.this, SettingsActivity.class)); } }); } else if (!session.hasProfile()) { mUserLogin.setText(session.getUsername()); mUserName.setText(R.string.waiting_profile); mUserBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SectionItem me = new SectionItem(); me.id = "me"; selectDrawerItem(me); mDrawerLayout.closeDrawer(mDrawerView); } }); } } @Override protected void onPause() { super.onPause(); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); lastFeed = savedInstanceState.getString("lastFeed", session.getPrefs().getString(PK.STARTUP, "home")); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("lastFeed", lastFeed); } @Override public void setTitle(CharSequence title) { mTitle = title; getActionBar().setTitle(mTitle); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerVisible(mDrawerView)) mDrawerLayout.closeDrawer(mDrawerView); else super.onBackPressed(); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles mDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); miDrwUpd = menu.findItem(R.id.drawer_refresh); miDrwCfg = menu.findItem(R.id.drawer_settings); miDrwAbo = menu.findItem(R.id.drawer_about); miSearch = menu.findItem(R.id.action_search); miConfig = menu.findItem(R.id.action_settings); miAboutD = menu.findItem(R.id.action_about); miDrwUpd.setVisible(false); miDrwCfg.setVisible(false); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { miDrwUpd.setVisible(mDrawerLayout.isDrawerVisible(mDrawerView) && session.hasProfile()); miDrwCfg.setVisible(mDrawerLayout.isDrawerVisible(mDrawerView)); miDrwAbo.setVisible(mDrawerLayout.isDrawerVisible(mDrawerView)); miSearch.setVisible(session.hasProfile()); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this. if (mDrawerToggle.onOptionsItemSelected(item)) return true; if (item.equals(miDrwUpd)) { updateProfile(); updateNavigation(); return true; } if (item.equals(miDrwCfg) || item.equals(miConfig)) { startActivity(new Intent(this, SettingsActivity.class)); return true; } if (item.equals(miDrwAbo) || item.equals(miAboutD)) { AboutBox.Show(MainActivity.this); return true; } if (item.equals(miSearch)) { startActivityForResult(new Intent(this, SearchActivity.class), REQ_SEARCH); return true; } return super.onOptionsItemSelected(item); } @Override protected void onNewIntent(Intent intent) { String act = intent.getAction(); Log.v(logTag(), "onNewIntent(): " + act); if (act.equals(FFService.DM_BASE_NOTIF)) { String fid = "filter/direct"; SectionItem si = session.hasProfile() ? session.getNavigation().getSectionByFeed(fid) : null; if (si == null) { si = new SectionItem(); si.id = fid; si.type = "special"; si.name = "Direct Messages"; } if (getFragmentManager().findFragmentByTag(FeedFragment.FRAGMENT_TAG) == null) selectDrawerItem(si); else openFeed(si.name, fid, null); NotificationManager nmg = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); nmg.cancel(FFService.NOTIFICATION_ID); // remove from notification bar } else if (act.equals(Intent.ACTION_VIEW)) { Uri data = intent.getData(); if (data.getHost().equals("ff.im")) { reverseShort(data.getPath().substring(1)); return; } if (data.getHost().equals("friendfeed.com") && data.getPath().startsWith("/search")) { openFeed("search", "search", data.getQuery().substring(2)); return; } Toast.makeText(this, "Unhandled intent (data: \"" + data.toString() + "\")", Toast.LENGTH_LONG).show(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQ_SEARCH && resultCode == RESULT_OK) { if (data.hasExtra("query")) openFeed("search", "search", data.getStringExtra("query")); else if (data.hasExtra("feed")) openFeed(data.getStringExtra("name"), data.getStringExtra("feed"), null); } else if (requestCode == REQ_NEWPOST && resultCode == RESULT_OK) openEntry(data.getStringExtra("eid")); } @Override public void openInfo(String feed_id) { Toast.makeText(this, "openInfo: " + feed_id, Toast.LENGTH_LONG).show(); } @Override public void openFeed(String name, String feed_id, String query) { lastFeed = feed_id; FragmentManager fm = getFragmentManager(); fm.beginTransaction().replace(R.id.content_frame, FeedFragment.newInstance(name, feed_id, query), FeedFragment.FRAGMENT_TAG).addToBackStack(null).commit(); } @Override public void openEntry(String entry_id) { getFragmentManager().beginTransaction().replace(R.id.content_frame, EntryFragment.newInstance(entry_id), EntryFragment.FRAGMENT_TAG).addToBackStack(null).commit(); } @Override public void openGallery(String entry_id, int position) { getFragmentManager().beginTransaction().replace(R.id.content_frame, GalleryFragment.newInstance(entry_id, position), GalleryFragment.FRAGMENT_TAG).addToBackStack(null).commit(); } @Override public void openPostNew(String[] dsts, String body, String link, String[] tmbs) { Intent intent = new Intent(this, PostActivity.class); intent.setAction(Intent.ACTION_INSERT); Bundle prms = new Bundle(); prms.putStringArray("dsts", dsts); if (!TextUtils.isEmpty(body)) prms.putString("body", body); prms.putString("link", link); prms.putStringArray("tmbs", tmbs); intent.putExtras(prms); startActivityForResult(intent, REQ_NEWPOST); } @Override public void openPostEdit(String entry_id, String body) { Intent intent = new Intent(this, PostActivity.class); intent.setAction(Intent.ACTION_EDIT); Bundle prms = new Bundle(); prms.putString("eid", entry_id); prms.putString("body", body); intent.putExtras(prms); startActivity(intent); } @Override protected void profileReady() { Commons.picasso(getApplicationContext()).load(session.getProfile().getAvatarUrl()).placeholder( R.drawable.nomugshot).into(mUserIcon); mUserLogin.setText(session.getUsername()); mUserName.setText(session.getProfile().name); mUserBox.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SectionItem me = new SectionItem(); me.id = "me"; me.name = session.getProfile().name; selectDrawerItem(me); mDrawerLayout.closeDrawer(mDrawerView); } }); if (getFragmentManager().findFragmentByTag(FeedFragment.FRAGMENT_TAG) == null) { // Open the startup feed. SectionItem si = session.getNavigation().getSectionByFeed(lastFeed); selectDrawerItem(si != null ? si : session.getNavigation().sections[0].feeds[0]); } } private void updateProfile() { setProgressBarIndeterminateVisibility(true); Callback<FeedInfo> callback = new Callback<FeedInfo>() { @Override public void success(FeedInfo result, Response response) { setProgressBarIndeterminateVisibility(false); session.setProfile(result); profileReady(); } @Override public void failure(RetrofitError error) { setProgressBarIndeterminateVisibility(false); new AlertDialog.Builder(MainActivity.this).setTitle(R.string.res_rfcall_failed).setMessage( Commons.retrofitErrorText(error)).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton( R.string.dlg_btn_retry, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { updateProfile(); } }).setCancelable(true).create().show(); } }; FFAPI.client_profile(session).get_profile("me", callback); } private void updateNavigation() { setProgressBarIndeterminateVisibility(true); Callback<FeedList> callback = new Callback<FeedList>() { @Override public void success(FeedList result, Response response) { setProgressBarIndeterminateVisibility(false); session.setNavigation(result); adapter.notifyDataSetChanged(); } @Override public void failure(RetrofitError error) { setProgressBarIndeterminateVisibility(false); new AlertDialog.Builder(MainActivity.this).setTitle(R.string.res_rfcall_failed).setMessage( Commons.retrofitErrorText(error)).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton( R.string.dlg_btn_retry, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { updateNavigation(); } }).setCancelable(true).create().show(); } }; FFAPI.client_profile(session).get_navigation(callback); } private void reverseShort(String shcode) { setProgressBarIndeterminateVisibility(true); Callback<Entry> callback = new Callback<Entry>() { @Override public void success(Entry result, Response response) { setProgressBarIndeterminateVisibility(false); session.cachedEntry = result; openEntry(result.id); } @Override public void failure(RetrofitError error) { setProgressBarIndeterminateVisibility(false); new AlertDialog.Builder(MainActivity.this).setTitle(R.string.res_rfcall_failed).setMessage( Commons.retrofitErrorText(error)).setIcon(android.R.drawable.ic_dialog_alert).show(); } }; FFAPI.client_entry(session).rev_short(shcode, callback); } private void selectDrawerItem(SectionItem selection) { FragmentManager fm = getFragmentManager(); // Always clear the fragments stack when we open a feed from the menu. if (fm.getBackStackEntryCount() > 0) fm.popBackStack(fm.getBackStackEntryAt(0).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); // Check if the current fragment (if any) is on the same feed we want to open. Fragment chk = fm.findFragmentByTag(FeedFragment.FRAGMENT_TAG); if (chk != null && ((FeedFragment) chk).fid.equals(selection.id)) return; // Open new feed fragment. lastFeed = selection.id; fm.beginTransaction().replace(R.id.content_frame, FeedFragment.newInstance(selection.name, lastFeed, selection.query), FeedFragment.FRAGMENT_TAG).commit(); // no backstack } /* public void subscribe(final String feed_id, final String list_id) { setProgressBarIndeterminateVisibility(true); Callback<SimpleResponse> callback = new Callback<SimpleResponse>() { @Override public void success(SimpleResponse result, Response response) { setProgressBarIndeterminateVisibility(false); Toast.makeText(MainActivity.this, result.status, Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { setProgressBarIndeterminateVisibility(false); new AlertDialog.Builder(MainActivity.this).setTitle(R.string.res_rfcall_failed).setMessage( Commons.retrofitErrorText(error)).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton( R.string.dlg_btn_retry, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { subscribe(feed_id, list_id); } }).setCancelable(true).create().show(); } }; FFAPI.client_write(session).subscribe(feed_id, list_id, callback); } public void unsubscribe(final String feed_id, final String list_id) { setProgressBarIndeterminateVisibility(true); Callback<SimpleResponse> callback = new Callback<SimpleResponse>() { @Override public void success(SimpleResponse result, Response response) { setProgressBarIndeterminateVisibility(false); Toast.makeText(MainActivity.this, !TextUtils.isEmpty(result.status) ? result.status : result.success ? "ok" : "wtf?", Toast.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { setProgressBarIndeterminateVisibility(false); new AlertDialog.Builder(MainActivity.this).setTitle(R.string.res_rfcall_failed).setMessage( Commons.retrofitErrorText(error)).setIcon(android.R.drawable.ic_dialog_alert).setPositiveButton( R.string.dlg_btn_retry, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { unsubscribe(feed_id, list_id); } }).setCancelable(true).create().show(); } }; FFAPI.client_write(session).unsubscribe(feed_id, list_id, callback); } */ private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectDrawerItem((SectionItem) adapter.getItem(position)); mDrawerList.setItemChecked(position, true); mDrawerLayout.closeDrawer(mDrawerView); } } }