com.drisoftie.frags.comp.FragManagedPaging.java Source code

Java tutorial

Introduction

Here is the source code for com.drisoftie.frags.comp.FragManagedPaging.java

Source

/*
 * Copyright [2015] [Alexander Dridiger - drisoftie@gmail.com]
 *
 *      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 com.drisoftie.frags.comp;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.drisoftie.frags.IAdaptManagedPager;
import com.drisoftie.frags.IFragManagedPager;
import com.drisoftie.frags.INotificationForwarder;
import com.drisoftie.frags.NotifyState;
import com.drisoftie.frags.R;

import java.util.List;

/**
 * A {@link FragManaged} used as a pager with a {@link ViewPager}.
 *
 * @author Alexander Dridiger
 */
public abstract class FragManagedPaging extends FragManaged
        implements INotificationForwarder, IFragManagedPager<Fragment, FragmentManager> {

    /*-###########
     * UI elements
     * ###########*/
    private ViewPager pager;
    private IAdaptManagedPager<FragManaged, FragmentPagerAdapter, Fragment> pagerAdapter;

    /*-#######
     * Actions
     * #######*/
    private DelegationHandler actionDelegateActivityResult;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View result = inflater.inflate(getPagerLayoutId(), container, false);
        pager = (ViewPager) result.findViewById(getViewPagerId());
        pagerAdapter = getPagerAdapter(getChildFragmentManager());
        pager.setAdapter(pagerAdapter.getFragmentPagerAdapter());
        pager.setCurrentItem(getStartPage());

        if (getPageMargin() != null) {
            pager.setPageMargin(getPageMargin());
        }
        if (getPageMarginDrawable() != null) {
            pager.setPageMarginDrawable(getPageMarginDrawable());
        }

        List<Fragment> children = getChildFragmentManager().getFragments();
        if (children != null) {
            pagerAdapter.restoreFragments(children);
        }

        actionDelegateActivityResult = new DelegationHandler();

        onCreating(result, inflater, container, savedInstanceState);

        return result;
    }

    @Override
    public <AdaptT extends IAdaptManagedPager> void switchPagerAdapter(AdaptT adaptPager) {
        PagerAdapter ad = (PagerAdapter) adaptPager.getFragmentPagerAdapter();
        pager.setAdapter(ad);
        ad.notifyDataSetChanged();
    }

    @Override
    public void forwardChanges(NotifyState state, Object... args) {
        pagerAdapter.processNotifications(state, args);
    }

    /**
     * Returns the currently displayed {@link Fragment}.
     *
     * @return
     */
    @Override
    public Fragment getCurrentFragment() {
        int index = pager.getCurrentItem();
        return pagerAdapter.getFragment(index);
    }

    /**
     * @return
     */
    @Override
    public int getCurrentFragmentPage() {
        return pager.getCurrentItem();
    }

    /**
     * @param position
     */
    public void setPage(int position) {
        pager.setCurrentItem(position);
    }

    @Override
    public int getPagesAmount() {
        return pagerAdapter.getFragmentPagerAdapter().getCount();
    }

    @Override
    public void onChangeOccurred(Object... args) {
        // do nothing
    }

    /**
     * @param delegation
     * @param intent
     */
    public void sendActivityForResult(Fragment delegation, Intent intent) {
        actionDelegateActivityResult.setDelegation(delegation);
        startActivityForResult(intent, getResources().getInteger(R.integer.intent_start_activity_for_result));
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) {
        case Activity.RESULT_OK:
            if (getResources().getInteger(R.integer.intent_start_activity_for_result) == requestCode) {
                actionDelegateActivityResult.delegate(data);
            }
            break;
        }
    }

    /**
     * @author Alexander Dridiger
     */
    private static class DelegationHandler {

        private Fragment delegation;

        protected void setDelegation(Fragment delegation) {
            this.delegation = delegation;
        }

        protected void delegate(Intent intent) {
            if (delegation != null) {
                delegation.onActivityResult(-1, -1, intent);
                delegation = null;
            }
        }
    }
}