/*
* Copyright 2013-2015 The GDG Frisbee Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gdg.frisbee.android.chapter;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AndroidAppUri;
import org.gdg.frisbee.android.BuildConfig;
import org.gdg.frisbee.android.Const;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.Callback;
import org.gdg.frisbee.android.api.model.Chapter;
import org.gdg.frisbee.android.api.model.Directory;
import org.gdg.frisbee.android.app.App;
import org.gdg.frisbee.android.app.OrganizerChecker;
import org.gdg.frisbee.android.cache.ModelCache;
import org.gdg.frisbee.android.common.GdgNavDrawerActivity;
import org.gdg.frisbee.android.onboarding.FirstStartActivity;
import org.gdg.frisbee.android.utils.PrefUtils;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.Collections;
import butterknife.BindView;
import timber.log.Timber;
public class MainActivity extends GdgNavDrawerActivity implements ChapterSelectDialog.Listener {
public static final String TITLE_GOOGLE_DEVELOPER_GROUPS = "Google Developer Groups";
private static final String SECTION_EVENTS = "events";
private static final String ARG_SELECTED_CHAPTER = "selected_chapter";
private static final String ARG_CHAPTERS = "chapters";
private static final int REQUEST_FIRST_START_WIZARD = 100;
private static final Uri APP_URI =
AndroidAppUri.newAndroidAppUri(BuildConfig.APPLICATION_ID, Uri.parse(Const.URL_GDGROUPS_ORG)).toUri();
@BindView(R.id.pager)
ViewPager viewPager;
@BindView(R.id.tabs)
TabLayout tabLayout;
@BindView(R.id.toolbar_actionbar)
Toolbar toolbar;
private TextView chapterSwitcher;
private ChapterComparator locationComparator;
@Nullable ChapterFragmentPagerAdapter viewPagerAdapter;
@Nullable private Chapter selectedChapter;
private Chapter homeChapter;
private ArrayList<Chapter> chapters = new ArrayList<>();
@Nullable
private OrganizerChecker.Callbacks organizerCheckCallback;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
homeChapter = PrefUtils.getHomeChapter(this);
locationComparator = new ChapterComparator(homeChapter, App.from(this).getLastLocation());
setupChapterSwitcher();
String selectedChapterId = getSelectedChapterId(savedInstanceState);
ArrayList<Chapter> chapters = getSavedChapters(savedInstanceState);
if (chapters != null && !chapters.isEmpty()) {
initUI(chapters, selectedChapterId);
} else {
loadChaptersFromCache(selectedChapterId);
}
if (PrefUtils.shouldShowSeasonsGreetings(this)) {
SeasonsGreetingsFragment seasonsGreetings = new SeasonsGreetingsFragment();
seasonsGreetings.show(getSupportFragmentManager(), "dialog");
}
}
private static ArrayList<Chapter> getSavedChapters(Bundle savedInstanceState) {
return savedInstanceState != null
? savedInstanceState.<Chapter>getParcelableArrayList(ARG_CHAPTERS)
: null;
}
@Nullable
private String getSelectedChapterId(Bundle savedInstanceState) {
String selectedChapterId;
if (savedInstanceState != null) {
selectedChapterId = savedInstanceState.getString(ARG_SELECTED_CHAPTER);
} else {
selectedChapterId = getChapterIdFromIntent(getIntent());
}
if (selectedChapterId == null && homeChapter != null) {
selectedChapterId = homeChapter.getGplusId();
}
return selectedChapterId;
}
@Nullable
private static String getChapterIdFromIntent(final Intent intent) {
if (intent.hasExtra(Const.EXTRA_CHAPTER_ID)) {
return intent.getStringExtra(Const.EXTRA_CHAPTER_ID);
} else if (intent.getData() != null
&& intent.getData().getScheme() != null
&& intent.getData().getScheme().equals("https")) {
return intent.getData().getLastPathSegment();
}
return null;
}
private void loadChaptersFromCache(final String selectedChapterId) {
App.from(this).getModelCache().getAsync(
ModelCache.KEY_CHAPTER_LIST_HUB,
new ModelCache.CacheListener() {
@Override
public void onGet(Object item) {
onDirectoryLoaded((Directory) item, selectedChapterId);
}
@Override
public void onNotFound(String key) {
fetchChapters(selectedChapterId);
}
}
);
}
void fetchChapters(final String selectedChapterId) {
App.from(this).getGdgXHub().getDirectory().enqueue(new Callback<Directory>() {
@Override
public void onSuccess(final Directory directory) {
if (isContextValid()) {
onDirectoryLoaded(directory, selectedChapterId);
}
App.from(MainActivity.this).getModelCache().putAsync(
ModelCache.KEY_CHAPTER_LIST_HUB,
directory,
DateTime.now().plusDays(1));
}
@Override
public void onError() {
showError(R.string.fetch_chapters_failed);
}
@Override
public void onNetworkFailure(Throwable error) {
showError(R.string.offline_alert);
}
});
}
private void onDirectoryLoaded(Directory directory, String selectedChapterId) {
ArrayList<Chapter> chapters = directory.getGroups();
Collections.sort(chapters, locationComparator);
initUI(chapters, selectedChapterId);
}
void initUI(ArrayList<Chapter> chapters, String selectedChapterId) {
this.chapters = chapters;
Chapter selectedChapter = findChapterById(selectedChapterId);
if (selectedChapter == null) {
selectedChapter = chapters.get(0);
}
updateSelectionFor(selectedChapter);
viewPager.setOffscreenPageLimit(3);
tabLayout.setupWithViewPager(viewPager);
if (SECTION_EVENTS.equals(getIntent().getStringExtra(Const.EXTRA_SECTION))) {
viewPager.postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(2);
}
}, 500);
}
recordStartPageView();
}
@Nullable
private Chapter findChapterById(String selectedChapterId) {
Chapter temp = new Chapter(selectedChapterId);
int position = chapters.indexOf(temp);
if (position != -1) {
return chapters.get(position);
}
return null;
}
private void updateSelectionFor(Chapter newChapter) {
chapterSwitcher.setText(newChapter.getName());
if (!newChapter.equals(selectedChapter)) {
Timber.d("Switching newChapterId!");
selectedChapter = newChapter;
updatePagerWith(newChapter, App.from(this).isOrganizer());
}
}
private void updatePagerWith(Chapter selectedChapter, boolean isOrganizer) {
viewPagerAdapter = new ChapterFragmentPagerAdapter(this, selectedChapter, isOrganizer);
viewPager.setAdapter(viewPagerAdapter);
}
@Override
protected void onResume() {
super.onResume();
checkHomeChapterValid();
checkOrganizer();
}
@Override
protected void onPause() {
if (organizerCheckCallback != null) {
organizerCheckCallback = null;
}
super.onPause();
}
private void checkHomeChapterValid() {
Chapter newHomeChapter = PrefUtils.getHomeChapter(this);
if (newHomeChapter == null) {
return;
}
if (hasTheSameHomeChapter(newHomeChapter)) {
return;
}
if (isShowingStoredHomeChapter()) {
updateSelectionFor(newHomeChapter);
}
homeChapter = newHomeChapter;
}
private boolean hasTheSameHomeChapter(Chapter newHomeChapter) {
return newHomeChapter.equals(homeChapter);
}
private boolean isShowingStoredHomeChapter() {
return homeChapter.equals(selectedChapter);
}
private void checkOrganizer() {
organizerCheckCallback = new OrganizerChecker.Callbacks() {
@Override
public void onOrganizerResponse(boolean isOrganizer) {
if (viewPagerAdapter == null) {
return;
}
if (isOrganizer == viewPagerAdapter.isOrganizerFragmentShown()) {
return;
}
viewPagerAdapter.setOrganizer(isOrganizer);
}
@Override
public void onErrorResponse() {
}
};
App.from(this).checkOrganizer(organizerCheckCallback);
}
private void recordStartPageView() {
Action viewAction = Action.newAction(Action.TYPE_VIEW, TITLE_GOOGLE_DEVELOPER_GROUPS, APP_URI);
recordStartPageView(viewAction);
}
private void recordEndPageView() {
Action viewAction = Action.newAction(Action.TYPE_VIEW, TITLE_GOOGLE_DEVELOPER_GROUPS, APP_URI);
recordEndPageView(viewAction);
}
protected String getTrackedViewName() {
if (viewPager == null || viewPagerAdapter == null) {
return "Main";
}
final String[] pagesNames = {"News", "Info", "Events"};
String pageName;
try {
pageName = pagesNames[getCurrentPage()];
} catch (IndexOutOfBoundsException e) {
pageName = "";
}
return "Main/" + (selectedChapter != null ? selectedChapter.getName().replaceAll(" ", "-") : "")
+ "/" + pageName;
}
@Override
protected void onStart() {
super.onStart();
if (PrefUtils.isFirstStart(this)) {
startActivityForResult(new Intent(this, FirstStartActivity.class), REQUEST_FIRST_START_WIZARD);
}
}
@Override
protected void onStop() {
recordEndPageView();
super.onStop();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(ARG_CHAPTERS, chapters);
if (selectedChapter != null) {
outState.putString(ARG_SELECTED_CHAPTER, selectedChapter.getGplusId());
}
}
private void setupChapterSwitcher() {
getSupportActionBar().setDisplayShowTitleEnabled(false);
View container = LayoutInflater.from(this).inflate(R.layout.actionbar_chapter_selector, toolbar);
chapterSwitcher = (TextView) container.findViewById(android.R.id.text1);
chapterSwitcher.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ChapterSelectDialog.newInstance(selectedChapter)
.show(getSupportFragmentManager(), ChapterSelectDialog.class.getSimpleName());
}
});
}
@Override
public void onChapterSelected(Chapter selectedChapter) {
updateSelectionFor(selectedChapter);
}
}