/*
This file is part of ZAX.
ZAX is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ZAX is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with ZAX. If not, see <http://www.gnu.org/licenses/>.
*/
package com.inovex.zabbixmobile.activities.fragments;
import android.app.Activity;
import android.content.ComponentName;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.inovex.zabbixmobile.R;
import com.inovex.zabbixmobile.adapters.ChecksApplicationsPagerAdapter;
import com.inovex.zabbixmobile.listeners.OnChecksItemSelectedListener;
import com.inovex.zabbixmobile.listeners.OnItemsLoadedListener;
import com.inovex.zabbixmobile.model.Host;
/**
* Fragment showing the applications of a particular host.
*
* In particular, this includes a view pager with one page for each application.
* Each page contains a list of items.
*
*/
public class ChecksApplicationsFragment extends BaseServiceConnectedFragment
implements OnItemsLoadedListener {
public static final String TAG = ChecksApplicationsFragment.class
.getSimpleName();
private Host mHost;
private boolean mApplicationsProgressBarVisible = true;
private boolean mItemsLoadingSpinnerVisible = true;
private static final String ARG_APPLICATIONS_SPINNER_VISIBLE = "arg_applications_spinner_visible";
private static final String ARG_ITEMS_SPINNER_VISIBLE = "arg_items_spinner_visible";
private TextView mTitleView;
protected ViewPager mApplicationsPager;
protected ChecksApplicationsPagerAdapter mApplicationsPagerAdapter;
private OnChecksItemSelectedListener mCallbackMain;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mCallbackMain = (OnChecksItemSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnChecksItemSelectedListener.");
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
mApplicationsProgressBarVisible = savedInstanceState.getBoolean(
ARG_APPLICATIONS_SPINNER_VISIBLE, false);
mItemsLoadingSpinnerVisible = savedInstanceState.getBoolean(
ARG_ITEMS_SPINNER_VISIBLE, false);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_checks_applications, container);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mTitleView = (TextView) view.findViewById(R.id.checks_title);
if (mApplicationsProgressBarVisible)
showApplicationsProgressBar();
// if (mItemsLoadingSpinnerVisible)
// showItemsLoadingSpinner();
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBoolean(ARG_APPLICATIONS_SPINNER_VISIBLE,
mApplicationsProgressBarVisible);
outState.putBoolean(ARG_ITEMS_SPINNER_VISIBLE,
mItemsLoadingSpinnerVisible);
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
super.onServiceConnected(name, service);
setupDetailsViewPager();
if (mHost != null)
mTitleView.setText("Host: " + mHost.getName());
}
/**
* Sets the host whose applications shall be shown.
*
* @param h
* the host
*/
public void setHost(Host h) {
this.mHost = h;
if (mHost != null && getView() != null)
mTitleView.setText("Host: " + mHost.getName());
}
/**
* Performs the setup of the view pager used to swipe between details pages.
*/
protected void setupDetailsViewPager() {
Log.d(TAG, "setupViewPager");
retrievePagerAdapter();
if (mApplicationsPagerAdapter != null) {
mApplicationsPagerAdapter
.setFragmentManager(getChildFragmentManager());
// initialize the view pager
mApplicationsPager = (ViewPager) getView().findViewById(
R.id.checks_view_pager);
mApplicationsPager.setAdapter(mApplicationsPagerAdapter);
mApplicationsPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1,
int arg2) {
}
@Override
public void onPageSelected(int position) {
Log.d(TAG, "detail page selected: " + position);
// selectApplication(position);
// mDetailsPagerAdapter.getCurrentPage().selectItem(0);
mCallbackMain.onApplicationSelected(position);
// showItemsLoadingSpinner();
// mZabbixDataService.loadItemsByApplicationId(
// mApplicationsPagerAdapter
// .getCurrentObject().getId(),
// ChecksApplicationsFragment.this);
}
});
}
}
protected void retrievePagerAdapter() {
mApplicationsPagerAdapter = mZabbixDataService
.getChecksApplicationsPagerAdapter();
}
/**
* Shows a loading spinner instead of this page's list view.
*/
public void showApplicationsProgressBar() {
mApplicationsProgressBarVisible = true;
if (getView() != null) {
LinearLayout progressLayout = (LinearLayout) getView()
.findViewById(R.id.applications_progress_layout);
if (progressLayout != null)
progressLayout.setVisibility(View.VISIBLE);
}
}
/**
* Dismisses the loading spinner view.
*
* If the view has not yet been created, the status is saved and when the
* view is created, the spinner will not be shown at all.
*/
public void dismissApplicationsProgressBar() {
mApplicationsProgressBarVisible = false;
if (getView() != null) {
LinearLayout progressLayout = (LinearLayout) getView()
.findViewById(R.id.applications_progress_layout);
if (progressLayout != null) {
progressLayout.setVisibility(View.GONE);
}
}
}
@Override
public void onDetach() {
super.onDetach();
// This is a fix for the issue with the child fragment manager;
// described here:
// http://stackoverflow.com/questions/15207305/getting-the-error-java-lang-illegalstateexception-activity-has-been-destroyed
// and here: https://code.google.com/p/android/issues/detail?id=42601
// If the fragment manager is not set to null, there will be issues when
// the activity is destroyed and there are pending transactions
mApplicationsPagerAdapter.setFragmentManager(null);
}
/**
* Shows a loading spinner instead of this page's list view.
*/
public void showItemsLoadingSpinner() {
mItemsLoadingSpinnerVisible = true;
if (getView() != null) {
LinearLayout progressLayout = (LinearLayout) getView()
.findViewById(R.id.items_progress_layout);
if (progressLayout != null)
progressLayout.setVisibility(View.VISIBLE);
}
}
/**
* Dismisses the loading spinner view.
*
* If the view has not yet been created, the status is saved and when the
* view is created, the spinner will not be shown at all.
*/
public void dismissItemsLoadingSpinner() {
mItemsLoadingSpinnerVisible = false;
if (getView() != null) {
LinearLayout progressLayout = (LinearLayout) getView()
.findViewById(R.id.items_progress_layout);
if (progressLayout != null) {
progressLayout.setVisibility(View.GONE);
}
ProgressBar listProgress = (ProgressBar) getView().findViewById(
R.id.applications_progress);
listProgress.setProgress(0);
}
}
@Override
public void onItemsLoaded() {
restoreItemSelection();
// dismissItemsLoadingSpinner();
}
/**
* Selects an application in the view pager.
*
* @param position
*/
public void selectApplication(int position) {
if (mApplicationsPagerAdapter != null) {
mApplicationsPagerAdapter.setCurrentPosition(position);
mApplicationsPager.setCurrentItem(position);
}
}
/**
* Selects an item in the currently displayed list.
*
* @param position
* item position
*/
public void selectItem(int position) {
if (mApplicationsPagerAdapter != null
&& mApplicationsPagerAdapter.getCount() != 0){
ChecksApplicationsPage currentPage = (ChecksApplicationsPage) mApplicationsPagerAdapter
.instantiateItem(mApplicationsPager,
mApplicationsPager.getCurrentItem());
Log.d(TAG, "selectItem(" + position + ")");
if (currentPage != null) {
currentPage.selectItem(position);
}
}
}
/**
* Restores the item selection on the current page.
*/
public void restoreItemSelection() {
// selectApplication(mApplicationPosition);
if (mApplicationsPagerAdapter != null) {
ChecksApplicationsPage currentPage = (ChecksApplicationsPage) mApplicationsPagerAdapter
.instantiateItem(mApplicationsPager,
mApplicationsPager.getCurrentItem());
if (currentPage != null) {
// currentPage.selectItem(mItemPosition);
currentPage.restoreItemSelection();
}
}
}
/**
* Updates the progress bar.
*
* @param progress
* current progress
*/
public void updateProgress(int progress) {
if (getView() != null) {
ProgressBar listProgress = (ProgressBar) getView().findViewById(
R.id.applications_progress);
listProgress.setProgress(progress);
}
}
/**
* Unchecks the currently selected list item.
*/
public void uncheckCurrentListItem() {
if (mApplicationsPagerAdapter != null) {
ChecksApplicationsPage currentPage = (ChecksApplicationsPage) mApplicationsPagerAdapter
.instantiateItem(mApplicationsPager,
mApplicationsPager.getCurrentItem());
if (currentPage != null) {
currentPage.uncheckCurrentItem();
}
}
}
}