/*
* 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.pulse;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import org.gdg.frisbee.android.R;
import org.gdg.frisbee.android.api.Callback;
import org.gdg.frisbee.android.api.model.Pulse;
import org.gdg.frisbee.android.app.App;
import org.gdg.frisbee.android.cache.ModelCache;
import org.gdg.frisbee.android.common.GdgNavDrawerActivity;
import org.joda.time.DateTime;
import java.util.ArrayList;
import java.util.Collections;
import butterknife.BindView;
public class PulseActivity extends GdgNavDrawerActivity implements PulseFragment.Callbacks {
private static final String INSTANCE_STATE_SELECTED_PULSE = "INSTANCE_STATE_SELECTED_PULSE";
@BindView(R.id.pager)
ViewPager mViewPager;
@BindView(R.id.tabs)
TabLayout mTabLayout;
@BindView(R.id.toolbar_actionbar)
Toolbar toolbar;
ArrayAdapter<String> mSpinnerAdapter;
PulsePagerAdapter mViewPagerAdapter;
ArrayList<String> mPulseTargets = new ArrayList<>();
Spinner mSpinner;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pulse);
final String selectedPulse;
if (savedInstanceState != null) {
selectedPulse = savedInstanceState.getString(INSTANCE_STATE_SELECTED_PULSE);
} else {
selectedPulse = PulseFragment.GLOBAL;
}
App.from(this).getModelCache().getAsync(ModelCache.KEY_PULSE_GLOBAL, true, new ModelCache.CacheListener() {
@Override
public void onGet(Object item) {
Pulse pulse = (Pulse) item;
setupPulseScreen(pulse, selectedPulse);
}
@Override
public void onNotFound(String key) {
fetchPulse(selectedPulse);
}
});
}
void fetchPulse(final String selectedPulse) {
App.from(this).getGroupDirectory().getPulse().enqueue(new Callback<Pulse>() {
@Override
public void onSuccess(final Pulse pulse) {
if (isContextValid()) {
setupPulseScreen(pulse, selectedPulse);
}
App.from(PulseActivity.this).getModelCache().putAsync(ModelCache.KEY_PULSE_GLOBAL, pulse,
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);
}
});
}
void setupPulseScreen(Pulse pulse, String selectedPulse) {
mPulseTargets.addAll(pulse.keySet());
Collections.sort(mPulseTargets);
mPulseTargets.add(0, PulseFragment.GLOBAL);
initSpinner();
openPulse(selectedPulse);
}
private void initSpinner() {
setupCountrySwitcher();
mSpinnerAdapter = new ArrayAdapter<>(this, R.layout.spinner_item_actionbar, mPulseTargets);
mSpinnerAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
mSpinner.setAdapter(mSpinnerAdapter);
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(final AdapterView<?> parent, final View view,
final int position, final long id) {
String previous = getSelectedPulseTarget();
String selected = mSpinnerAdapter.getItem(position);
if (previous == null || !previous.equals(selected)) {
onPulseItemSelected(selected);
}
}
@Override
public void onNothingSelected(final AdapterView<?> parent) {
// Nothing to do.
}
});
}
private void setupCountrySwitcher() {
getSupportActionBar().setDisplayShowTitleEnabled(false);
View spinnerContainer = LayoutInflater.from(this).inflate(R.layout.actionbar_spinner, toolbar);
mSpinner = (Spinner) spinnerContainer.findViewById(R.id.actionbar_spinner);
}
void onPulseItemSelected(String selectedPulse) {
mViewPagerAdapter = new PulsePagerAdapter(getResources(), getSupportFragmentManager(), selectedPulse);
mViewPager.setAdapter(mViewPagerAdapter);
mTabLayout.setupWithViewPager(mViewPager);
}
@Override
public void openPulse(final String key) {
mSpinner.setSelection(mPulseTargets.indexOf(key));
}
@Override
protected String getTrackedViewName() {
if (mViewPager == null || getSelectedPulseTarget() == null) {
return "Pulse";
}
final String[] pagesNames = {"EventStats", "AtendeeStats", "CircleStats"};
String pageName;
try {
pageName = pagesNames[getCurrentPage()];
} catch (IndexOutOfBoundsException e) {
pageName = "";
}
return "Pulse/" + getSelectedPulseTarget().replaceAll(" ", "-")
+ "/" + pageName;
}
@Override
public void onBackPressed() {
if (mSpinner != null && !PulseFragment.GLOBAL.equals(mSpinner.getSelectedItem())) {
openPulse(PulseFragment.GLOBAL);
return;
}
super.onBackPressed();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mSpinner != null) {
outState.putString(INSTANCE_STATE_SELECTED_PULSE, (String) mSpinner.getSelectedItem());
}
}
@Nullable
String getSelectedPulseTarget() {
return mViewPagerAdapter != null
? mViewPagerAdapter.getSelectedPulseTarget() : null;
}
public static class PulsePagerAdapter extends FragmentPagerAdapter {
private final Resources resources;
private final String selectedPulseTarget;
PulsePagerAdapter(Resources resources, FragmentManager fm, String selectedPulseTarget) {
super(fm);
this.resources = resources;
this.selectedPulseTarget = selectedPulseTarget;
}
@Override
public int getCount() {
return 3;
}
@Override
public Fragment getItem(int position) {
return PulseFragment.newInstance(position, selectedPulseTarget);
}
@Override
public long getItemId(int position) {
return selectedPulseTarget.hashCode() * 10 + position;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return resources.getText(R.string.pulse_events);
case 1:
return resources.getText(R.string.pulse_attendees);
case 2:
return resources.getText(R.string.pulse_circlers);
default:
throw new IllegalStateException("The size of the adapter should be 3");
}
}
public String getSelectedPulseTarget() {
return selectedPulseTarget;
}
}
}