org.kevoree.platform.android.boot.view.ManagerUI.java Source code

Java tutorial

Introduction

Here is the source code for org.kevoree.platform.android.boot.view.ManagerUI.java

Source

/**
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.gnu.org/licenses/lgpl-3.0.txt
 *
 * 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.
 */
/**
 * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE, Version 3, 29 June 2007;
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.gnu.org/licenses/lgpl-3.0.txt
 *
 * 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.kevoree.platform.android.boot.view;

import android.support.v4.app.ActionBar;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import org.kevoree.android.framework.service.events.IntentListener;
import org.kevoree.platform.android.boot.utils.KObservable;

import org.kevoree.platform.android.ui.KevoreeAndroidUIScreen;
import java.util.LinkedList;

/**
 * Created by jed
 * User: jedartois@gmail.com
 * Date: 08/03/12
 * Time: 15:10
 */
public class ManagerUI extends KObservable<ManagerUI> implements KevoreeAndroidUIScreen, ActionBar.TabListener {

    private static final String TAG = ManagerUI.class.getSimpleName();
    private LinkedList<ActionBar.Tab> tabs = new LinkedList<ActionBar.Tab>();
    private FragmentActivity ctx = null;
    private int selectedTab = 0;
    private int ktab = -1;

    public ManagerUI(FragmentActivity context) {
        this.ctx = context;
        ctx.getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    }

    /**
     * this method is charge of restoring views during a rotation of the screen
     */
    public void restoreViews(FragmentActivity newctx) {
        if (ctx.getSupportActionBar().getTabAt(selectedTab) == null) {
            selectedTab = ktab;
        }
        ctx.getSupportActionBar().removeAllTabs();
        newctx.getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ctx = newctx;
        LinkedList<ActionBar.Tab> backup = new LinkedList<ActionBar.Tab>();
        backup.addAll(tabs);
        tabs.clear();
        for (ActionBar.Tab tab : backup) {
            Log.i(TAG, "Restore " + tab.getText());
            // if exist remove parent
            View contentView = (View) tab.getTag();
            if (contentView.getParent() != null) {
                ((ViewGroup) contentView.getParent()).removeView(contentView);
            }
            LinearLayout tabLayout = (LinearLayout) contentView;
            int childcount = tabLayout.getChildCount();
            for (int i = 0; i < childcount; i++) {
                View v = tabLayout.getChildAt(i);
                if (v != null) {
                    // remove link to linearlayout
                    if (v.getParent() != null) {
                        ((ViewGroup) v.getParent()).removeView(v);
                    }
                    addToGroup(tab.getText().toString(), v);
                }
            }
        }
        try {
            ctx.getSupportActionBar().setSelectedNavigationItem(selectedTab);
        } catch (Exception e) {
            // ignore
        }
    }

    @Override
    public void addToGroup(String groupKey, View view) {

        if (groupKey == null || view == null) {
            return;
        }

        ActionBar.Tab idTab = getTabById(groupKey);
        Log.i("KevoreeBoot", "Add" + groupKey + "-" + idTab + "-" + view);
        if (idTab == null) {
            idTab = ctx.getSupportActionBar().newTab();
            idTab.setText(groupKey);
            idTab.setTabListener(this);
            ctx.getSupportActionBar().addTab(idTab);
            LinearLayout tabLayout = new LinearLayout(ctx);
            idTab.setTag(tabLayout);
            tabs.add(idTab);
        }
        ((LinearLayout) idTab.getTag()).addView(view);

        if (selectedTab == idTab.getPosition()) {
            ctx.setContentView((View) idTab.getTag());
            ktab = selectedTab;
        }
        /// Set the screen content to an the groupkey
        notifyObservers(this);
    }

    @Override
    public void removeView(View view) {

        if (view == null) {
            return;
        }

        Log.i("Request remove view", "");
        LinkedList<ActionBar.Tab> newtabs = new LinkedList<ActionBar.Tab>();
        for (ActionBar.Tab tab : tabs) {
            LinearLayout tabLayout = (LinearLayout) tab.getTag();
            int childcount = tabLayout.getChildCount();
            for (int i = 0; i < childcount; i++) {
                View v = tabLayout.getChildAt(i);
                if (v != null) {
                    if (v.equals(view)) {
                        tabLayout.removeView(view);
                    }
                }
            }
            Log.i("Remove view " + tab.getText(), " " + ((LinearLayout) tab.getTag()).getChildCount());
            if (((LinearLayout) tab.getTag()).getChildCount() == 0) {
                if (tab.getPosition() == selectedTab) {
                    selectedTab = ktab;
                }
                ctx.getSupportActionBar().removeTab(tab);
            } else {
                newtabs.add(tab);
            }
        }
        tabs.clear();
        tabs.addAll(newtabs);
        notifyObservers(this);
    }

    @Override
    public void addIntentListener(IntentListener listener) {
        // empty we don't care here
    }

    @Override
    public void removeIntentListener(IntentListener listener) {

    }

    @Override
    public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {

    }

    public ActionBar.Tab getTabById(String id) {
        for (ActionBar.Tab t : tabs) {
            if (t.getText().equals(id)) {
                return t;
            }
        }
        return null;
    }

    @Override
    public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        View contentView = (View) tab.getTag();
        if (tab.getTag() != null) {

            if (contentView.getParent() != null) {
                ((ViewGroup) contentView.getParent()).removeView(contentView);
            }
            ctx.setContentView(contentView);
            // if you don't call this method some views can behave
            // weirdly after setContentView(View)
            doRequestLayout(contentView);
            selectedTab = tab.getPosition();
        }
    }

    @Override
    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
    }

    public FragmentActivity getCtx() {
        return ctx;
    }

    /**
     * Call requestLayout() recursively on each child view
     * contained into this view if it has any. Otherwise
     * the call will only be made on the given view
     *
     * @param view a View object
     */
    private void doRequestLayout(View view) {
        ViewGroup vg = null;
        if (view instanceof ViewGroup) {
            vg = (ViewGroup) view;
            for (int i = 0; i < vg.getChildCount(); i++) {
                doRequestLayout(vg.getChildAt(i));
            }

        } else {
            view.requestLayout();
        }
    }
}