Skip to content

Commit

Permalink
fixed removeTab, TIMOB-17016, and Google Maps V2 inside tab
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Mokryn committed Aug 29, 2014
1 parent f89b90c commit b608241
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ public TabProxy[] getTabs()
return tps;
}

public int getTabIndex(TabProxy tabProxy)
{
return tabs.indexOf(tabProxy);
}

public ArrayList<TabProxy> getTabList()
{
Expand Down
10 changes: 10 additions & 0 deletions android/modules/ui/src/java/ti/modules/titanium/ui/TabProxy.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
*/
package ti.modules.titanium.ui;

import java.util.concurrent.atomic.AtomicLong;

import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;
Expand Down Expand Up @@ -35,17 +37,25 @@ public class TabProxy extends TiViewProxy
private TiWindowProxy window;
private boolean windowOpened = false;
private int windowId;
private String tabTag;
private static final String TAB_TAG_NAME = "tabTag";
private static final AtomicLong nextTabTagIndex = new AtomicLong();

public TabProxy()
{
super();
tabTag = TAB_TAG_NAME + nextTabTagIndex.getAndIncrement();
}

public TabProxy(TiContext tiContext)
{
this();
}

public String getTabTag() {
return tabTag;
}

@Override
protected KrollDict getLangConversionTable()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,26 @@
public class TiUIActionBarTab extends TiUIAbstractTab {

private static final String TAG = "TiUIActionBarTab";

public static class TabFragment extends Fragment {
private TiUIActionBarTab tab;

public TabFragment(TiUIActionBarTab tab) {
public TabFragment() {
}

public void setTab(TiUIActionBarTab tab) {
this.tab = tab;
}

public TiUIActionBarTab getTab() {
return this.tab;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

if (tab == null) {
return null;
}
return tab.getContentView();
}
}
Expand Down Expand Up @@ -68,6 +78,10 @@ public TiUIActionBarTab(TabProxy proxy, ActionBar.Tab tab) {

}

public String getTabTag() {
return ((TabProxy)proxy).getTabTag();
}

@Override
public void propertyChanged(String key, Object oldValue, Object newValue, KrollProxy proxy) {
if (key.equals(TiC.PROPERTY_TITLE)) {
Expand All @@ -88,7 +102,8 @@ public void propertyChanged(String key, Object oldValue, Object newValue, KrollP
* will display the tab's content view.
*/
void initializeFragment() {
fragment = new TabFragment(this);
fragment = new TabFragment();
fragment.setTab(this);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,33 @@
*/
package ti.modules.titanium.ui.widget.tabgroup;

import java.lang.ref.WeakReference;
import java.util.ArrayList;

import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.titanium.TiBaseActivity;
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.TiLifecycle.OnLifecycleEvent;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.view.TiCompositeLayout;
import org.appcelerator.kroll.common.Log;

import ti.modules.titanium.ui.TabGroupProxy;
import ti.modules.titanium.ui.TabProxy;
import ti.modules.titanium.ui.widget.tabgroup.TiUIActionBarTab.TabFragment;

import android.app.Activity;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar.Tab;
import android.support.v7.app.ActionBar.TabListener;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import org.appcelerator.kroll.common.Log;
import android.support.v4.view.ViewPager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.ActionBarActivity;
import android.view.ViewGroup;
import android.view.MotionEvent;

/**
Expand All @@ -55,6 +59,7 @@ public class TiUIActionBarTabGroup extends TiUIAbstractTabGroup implements TabLi

// The tab to be selected once the activity resumes.
private Tab selectedTabOnResume;
private WeakReference<TiBaseActivity> tabActivity;

private TabGroupPagerAdapter tabGroupPagerAdapter;
private ViewPager tabGroupViewPager;
Expand All @@ -63,6 +68,8 @@ public class TiUIActionBarTabGroup extends TiUIAbstractTabGroup implements TabLi
public TiUIActionBarTabGroup(TabGroupProxy proxy, TiBaseActivity activity) {
super(proxy, activity);

tabActivity = new WeakReference<TiBaseActivity>(activity);

activity.addOnLifecycleEventListener(this);

// Setup the action bar for navigation tabs.
Expand All @@ -83,6 +90,7 @@ public boolean onInterceptTouchEvent(MotionEvent event) {
return swipeable ? super.onInterceptTouchEvent(event) : false;
}
});

tabGroupViewPager.setAdapter(tabGroupPagerAdapter);

tabGroupViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
Expand All @@ -106,37 +114,75 @@ public void onPageScrollStateChanged(int arg0) {}
params.autoFillsWidth = true;
((ViewGroup) activity.getLayout()).addView(tabGroupViewPager, params);
setNativeView(tabGroupViewPager);
}

private class TabGroupPagerAdapter extends FragmentPagerAdapter {
public TabGroupPagerAdapter(FragmentManager fm) {
super(fm);
}

@Override
public Fragment getItem(int i) {
if (tabsDisabled) {
return savedFragment;
} else {
ActionBar.Tab tab = actionBar.getTabAt(i);
TiUIActionBarTab tabView = (TiUIActionBarTab) tab.getTag();
if (tabView.fragment == null) {
tabView.initializeFragment();
private class TabGroupPagerAdapter extends FragmentPagerAdapter {
ArrayList<WeakReference<Fragment>> registeredFragments = new ArrayList<WeakReference<Fragment>>();

public TabGroupPagerAdapter(FragmentManager fm) {
super(fm);
}

public Fragment getRegisteredFragment(int position) {
if (position >= registeredFragments.size()) {
return null;
}
return tabView.fragment;
return registeredFragments.get(position).get();
}
}

@Override
public int getCount() {
if (tabsDisabled) {
return 1;
} else {
return actionBar.getNavigationItemCount();
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
WeakReference<Fragment> weakReferenceFragment = new WeakReference<Fragment>(fragment);
registeredFragments.add(position, weakReferenceFragment);
return fragment;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}

@Override
public Fragment getItem(int i) {
if (tabsDisabled) {
return savedFragment;
} else {
ActionBar.Tab tab = actionBar.getTabAt(i);
TiUIActionBarTab tabView = (TiUIActionBarTab) tab.getTag();
if (tabView.fragment == null) {
tabView.initializeFragment();
}
return tabView.fragment;
}
}

@Override
public int getCount() {
if (tabsDisabled) {
return 1;
} else {
return actionBar.getNavigationItemCount();
}
}

@Override
public int getItemPosition(Object object) {
TabFragment fragment = (TabFragment) object;
if (fragment.getTab() == null){
return POSITION_NONE;
}
String fragmentTag = fragment.getTag();
for (int i=0; i < registeredFragments.size(); i++){
if (fragmentTag.equals(getRegisteredFragment(i).getTag())){
return i;
}
}
return POSITION_UNCHANGED;
}
}
}


@Override
public void processProperties(KrollDict d)
{
Expand Down Expand Up @@ -165,7 +211,8 @@ public void addTab(TabProxy tabProxy) {
tab.setTabListener(this);

// Create a view for this tab proxy.
tabProxy.setView(new TiUIActionBarTab(tabProxy, tab));
TiUIActionBarTab actionBarTab = new TiUIActionBarTab(tabProxy, tab);
tabProxy.setView(actionBarTab);

// Add the new tab, but don't select it just yet.
// The selected tab is set once the group is done opening.
Expand All @@ -178,8 +225,14 @@ public void addTab(TabProxy tabProxy) {

@Override
public void removeTab(TabProxy tabProxy) {
int tabIndex = ((TabGroupProxy) proxy).getTabIndex(tabProxy);
TabFragment fragment = (TabFragment) tabGroupPagerAdapter.getRegisteredFragment(tabIndex);
TiUIActionBarTab tabView = (TiUIActionBarTab) tabProxy.peekView();
actionBar.removeTab(tabView.tab);
if (fragment != null){
fragment.setTab(null);
}
tabGroupPagerAdapter.notifyDataSetChanged();
}

@Override
Expand Down Expand Up @@ -227,6 +280,12 @@ public TabProxy getSelectedTab() {
public void onTabSelected(Tab tab, FragmentTransaction ft) {
TiUIActionBarTab tabView = (TiUIActionBarTab) tab.getTag();

if (tabView.fragment == null) {
// If not we will create it here then attach it
// to the tab group activity inside the "content" container.
tabView.initializeFragment();
}

tabGroupViewPager.setCurrentItem(tab.getPosition());
TabProxy tabProxy = (TabProxy) tabView.getProxy();
((TabGroupProxy) proxy).onTabSelected(tabProxy);
Expand Down

0 comments on commit b608241

Please sign in to comment.