package com.progscrape;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import com.progscrape.app.data.Story;
import com.progscrape.data.Data;
import com.progscrape.event.ActivityEvent;
import com.progscrape.event.SearchEvent;
import com.progscrape.event.StoryEvent;
import com.progscrape.modules.Injector;
import com.progscrape.modules.MainActivityModule;
import com.progscrape.ui.ActivityComponent;
import com.progscrape.ui.StoriesFragment;
import com.progscrape.ui.WebViewFragment;
import com.squareup.otto.Bus;
import com.squareup.otto.Subscribe;
import javax.inject.Inject;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
public class MainActivity extends BaseActivity {
@Inject
protected Data data;
@InjectView(R.id.main_drawer_layout)
protected DrawerLayout drawerLayout;
@InjectView(R.id.top_level_view)
protected View topLevel;
@Inject
protected Bus bus;
private ActivityComponent activityGraph;
public MainActivity() {
}
@Override
protected void onCreate(Bundle savedInstanceState) {
AppComponent appGraph = Injector.obtain(getApplicationContext(), AppComponent.class);
activityGraph = appGraph.plus(new MainActivityModule(this));
activityGraph.inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.app);
ButterKnife.inject(this);
if (savedInstanceState == null)
searchTag(null, true);
bus.register(this);
}
@Override
protected void onDestroy() {
bus.unregister(this);
activityGraph = null;
super.onDestroy();
}
@Override
public Object getSystemService(String name) {
if (Injector.matchesService(name))
return activityGraph;
return super.getSystemService(name);
}
@Subscribe
public void onStoryEvent(StoryEvent storyEvent) {
switch (storyEvent.getWhat()) {
case ACTIVATE:
activateStory(storyEvent.getStory());
break;
case MENU:
showStoryMenu(storyEvent.getStory(), storyEvent.getView());
break;
}
}
@Subscribe
public void onActivityEvent(ActivityEvent what) {
switch (what) {
case POP_BACK:
getFragmentManager().popBackStack();
break;
case TOGGLE_DRAWER:
openDrawer();
break;
}
}
@Subscribe
@SuppressWarnings("unused")
public void onSearchEvent(SearchEvent searchEvent) {
searchTag(searchEvent.getTag(), searchEvent.isInitial());
}
protected void activateStory(Story story) {
Fragment f = WebViewFragment.newInstance(story);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction tx = fragmentManager.beginTransaction();
tx.setCustomAnimations(R.animator.slide_in,
0,
0,
R.animator.slide_out);
tx.add(R.id.top_level_view, f, "webView").addToBackStack("open web view");
tx.commit();
}
protected void searchTag(String tag, boolean initial) {
Log.i("main", "Setting search fragment to " + tag);
FragmentTransaction tx = getFragmentManager().beginTransaction();
tx.replace(R.id.main_content, StoriesFragment.create(tag));
if (!initial)
tx.addToBackStack("search");
tx.commit();
drawerLayout.closeDrawers();
}
protected void openDrawer() {
drawerLayout.openDrawer(Gravity.LEFT);
}
protected void showStoryMenu(final Story story, View view) {
PopupMenu popup = new PopupMenu(this, view);
popup.getMenuInflater().inflate(R.menu.popup_menu, popup.getMenu());
if (story.getHackerNewsUrl() == null)
popup.getMenu().findItem(R.id.hn).setVisible(false);
if (story.getRedditUrl() == null)
popup.getMenu().findItem(R.id.reddit).setVisible(false);
if (story.getLobstersUrl() == null)
popup.getMenu().findItem(R.id.lobsters).setVisible(false);
int index = 0;
for (String tag : story.getTags()) {
index++;
popup.getMenu().add(Menu.NONE, -index, index, "\ud83d\udd0d " + tag);
}
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
String url;
if (item.getItemId() < 0) {
int n = -item.getItemId() - 1;
searchTag(story.getTags().get(n), false);
return false;
}
switch (item.getItemId()) {
case R.id.menu_item_share:
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, story.getTitle());
shareIntent.putExtra(Intent.EXTRA_TEXT, story.getHref());
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_post_to)));
return false;
case R.id.hn:
url = story.getHackerNewsUrl();
break;
case R.id.reddit:
url = story.getRedditUrl();
break;
case R.id.lobsters:
url = story.getLobstersUrl();
break;
case R.id.browser:
url = story.getHref();
break;
default:
return false;
}
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
return false;
}
});
popup.show();
}
}