OSDN Git Service

fragment revamp to support both native and support fragments (blerg)
authorKoushik Dutta <koushd@gmail.com>
Wed, 27 Feb 2013 11:54:14 +0000 (03:54 -0800)
committerKoushik Dutta <koushd@gmail.com>
Wed, 27 Feb 2013 11:54:14 +0000 (03:54 -0800)
Widgets/src/com/koushikdutta/widgets/BetterListActivity.java
Widgets/src/com/koushikdutta/widgets/BetterListFragment.java
Widgets/src/com/koushikdutta/widgets/BetterListFragmentInternal.java [new file with mode: 0644]
Widgets/src/com/koushikdutta/widgets/FragmentInterface.java [new file with mode: 0644]
Widgets/src/com/koushikdutta/widgets/FragmentInterfaceWrapper.java [new file with mode: 0644]
Widgets/src/com/koushikdutta/widgets/ListContentFragment.java
Widgets/src/com/koushikdutta/widgets/ListContentFragmentInternal.java [new file with mode: 0644]
Widgets/src/com/koushikdutta/widgets/ListItem.java
Widgets/src/com/koushikdutta/widgets/NativeFragment.java [new file with mode: 0644]
Widgets/src/com/koushikdutta/widgets/SupportFragment.java [new file with mode: 0644]
WidgetsSample/src/com/koushikdutta/widgets/sample/ListContentTest.java

index 29420e7..5c1d8b8 100644 (file)
@@ -1,11 +1,11 @@
 package com.koushikdutta.widgets;
 
-import com.koushikdutta.widgets.BetterListFragment.ActivityBaseFragmentListener;
-
 import android.os.Bundle;
 import android.support.v4.app.FragmentActivity;
 import android.view.View;
 
+import com.koushikdutta.widgets.BetterListFragmentInternal.ActivityBaseFragmentListener;
+
 
 
 public class BetterListActivity extends FragmentActivity implements ActivityBaseFragmentListener {
@@ -20,8 +20,8 @@ public class BetterListActivity extends FragmentActivity implements ActivityBase
         this.clazz = BetterListFragment.class;
     }
     
-    public BetterListFragment getFragment() {
-        return fragment;        
+    public BetterListFragmentInternal getFragment() {
+        return fragment.getInternal();        
     }
     
     public View getView() {
@@ -47,7 +47,7 @@ public class BetterListActivity extends FragmentActivity implements ActivityBase
         try {
             fragment = (BetterListFragment)clazz.getConstructors()[0].newInstance();
             fragment.setArguments(getIntent().getExtras());
-            fragment.setListener(this);
+            fragment.getInternal().setListener(this);
             getSupportFragmentManager().beginTransaction().add(getListContainerId(), fragment).commit();
         }
         catch (Exception e) {
index 6771b7a..418c439 100644 (file)
 package com.koushikdutta.widgets;
 
-import java.util.Comparator;
-
-import android.content.Context;
-import android.content.res.Configuration;
 import android.os.Bundle;
-import android.os.Handler;
-import android.support.v4.app.Fragment;
-import android.view.LayoutInflater;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
-import android.widget.AdapterView.OnItemLongClickListener;
-import android.widget.ArrayAdapter;
-import android.widget.ListView;
-import android.widget.TextView;
 
-public class BetterListFragment extends Fragment {
-    boolean mDestroyed = false;
-    
-    ListView mListView;
-    MyAdapter mAdapter;
-    
+public class BetterListFragment extends SupportFragment<BetterListFragmentInternal> {
     @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        float hor = getResources().getDimension(R.dimen.list_horizontal_margin);
-        float ver = getResources().getDimension(R.dimen.list_vertical_margin);
-        mListView.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
-    }
-    
-    public class MyAdapter extends SeparatedListAdapter<ListItemAdapter> {
-        public MyAdapter(Context context) {
-            super(context);
-        }
-        
-        @Override
-        protected int getListHeaderResource() {
-            return BetterListFragment.this.getListHeaderResource();
-        }
-        
-        @Override
-        public boolean areAllItemsEnabled() {
-            return false;
-        }
-        
-        @Override
-        public boolean isEnabled(int position) {
-            if (!super.isEnabled(position))
-                return false;
-            ListItem item = (ListItem) getItem(position);
-            if (item == null)
-                return false;
-            return item.getEnabled();
-        }
-    }
-    
-    public class ListItemAdapter extends ArrayAdapter<ListItem> {
-        public ListItemAdapter(Context context) {
-            super(context, 0);
-        }
-        
-        @Override
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ListItem item = getItem(position);
-            return item.getView(getContext(), convertView);
-        }
-        
-        @Override
-        public boolean areAllItemsEnabled() {
-            return false;
-        }
-        
-        @Override
-        public boolean isEnabled(int position) {
-            ListItem item = getItem(position);
-            return item.getEnabled();
-        }
-        
-        boolean sorting;
-        @Override
-        public void notifyDataSetChanged() {
-            if (sorter != null && !sorting) {
-                sorting = true;
-                super.sort(sorter);
-                sorting = false;
-            }
-            else {
-                super.notifyDataSetChanged();
-            }
-        }
-        
-        private Comparator<ListItem> sorter;
-        public void setSort(Comparator<ListItem> sorter) {
-            this.sorter = sorter;
-            notifyDataSetChanged();
-            mAdapter.notifyDataSetChanged();
-        }
-        
-        public Comparator<ListItem> getSort() {
-            return sorter;
-        }
-        
-        public Comparator<ListItem> ALPHA = new Comparator<ListItem>() {
-            @Override
-            public int compare(ListItem lhs, ListItem rhs) {
-                return lhs.getTitle().compareTo(rhs.getTitle());
-            }
-        };
-        
-        public Comparator<ListItem> ALPHAIGNORECASE = new Comparator<ListItem>() {
+    public BetterListFragmentInternal createFragmentInterface() {
+        return new BetterListFragmentInternal(this) {
             @Override
-            public int compare(ListItem lhs, ListItem rhs) {
-                return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
+            protected int getListFragmentResource() {
+                int ret = BetterListFragment.this.getListFragmentResource();
+                if (ret == -1)
+                    return super.getListFragmentResource();
+                return ret;
             }
-        };
-
-        public Comparator<ListItem> NONE = new Comparator<ListItem>() {
+            
             @Override
-            public int compare(ListItem lhs, ListItem rhs) {
-                return ((Integer)getPosition(lhs)).compareTo(getPosition(rhs));
+            protected void onCreate(Bundle savedInstanceState, View view) {
+                super.onCreate(savedInstanceState, view);
+                BetterListFragment.this.onCreate(savedInstanceState, view);
             }
         };
     }
     
-//    HashMap<String, MyListAdapter> mAdapters = new HashMap<String, ActivityBaseFragment.MyListAdapter>();
-    
-    public ListItemAdapter ensureHeader(int sectionName) {
-        return ensureHeader(mAdapter.getSectionCount(), getString(sectionName));
-    }
-    
-    public ListItemAdapter ensureHeader(String sectionName) {
-        return ensureHeader(mAdapter.getSectionCount(), sectionName);
-    }
-
-    public ListItemAdapter ensureHeader(int index, int sectionName) {
-        return ensureHeader(index, getString(sectionName));
-    }
-    public ListItemAdapter ensureHeader(int index, String sectionName) {
-        ListItemAdapter adapter = mAdapter.getSection(sectionName);
-        if (adapter == null) {
-            adapter = new ListItemAdapter(getActivity());
-            mAdapter.addSection(index, sectionName, adapter);
-            mListView.setAdapter(null);
-            mListView.setAdapter(mAdapter);
-        }
-        return adapter;
-    }
-    
-    public ListItemAdapter getSection(int section) {
-        return getSection(getString(section));
-    }
-    
-    public ListItemAdapter getSection(String section) {
-        return mAdapter.getSection(section);
-    }
-
-    public ListItem addItem(int sectionName, ListItem item) {
-        return addItem(getString(sectionName), item);
-    }
-
-    public ListItem addItem(int sectionName, ListItem item, int index) {
-        return addItem(getString(sectionName), item, index);
-    }
-    
-    public ListItem addItem(String sectionName, ListItem item) {
-        return addItem(sectionName, item, -1);
-    }
-    
-    public int getSectionItemCount(int section) {
-        return getSectionItemCount(getString(section));
-    }
-    
-    public int getSectionItemCount(String section) {
-        ListItemAdapter adapter = mAdapter.getSection(section);
-        if (adapter == null)
-            return 0;
-        return adapter.getCount();
-    }
-
-    public ListItem addItem(String sectionName, ListItem item, int index) {
-        ListItemAdapter adapter = mAdapter.getSection(sectionName);
-        if (adapter == null) {
-            adapter = new ListItemAdapter(getActivity());
-            mAdapter.addSection(sectionName, adapter);
-            if (mListView != null) {
-                mListView.setAdapter(null);
-                mListView.setAdapter(mAdapter);
-            }
-//            mAdapter.notifyDataSetChanged();
-        }
-        
-        if (index != -1)
-            adapter.insert(item, index);
-        else
-            adapter.add(item);
-
-        mAdapter.notifyDataSetChanged();
-        return item;
-    }
-    
-    public ListItem findItem(int item) {
-        String text = getString(item);
-        
-        for (ListItemAdapter adapter: mAdapter.getSections())
-        {
-            for (int i = 0; i < adapter.getCount(); i++) {
-                ListItem li = adapter.getItem(i);
-                if (text.equals(li.getTitle()))
-                    return li;
-            }
-        }
-        
-        return null;
-    }
-    
-    private ActivityBaseFragmentListener mListener;
-    public ActivityBaseFragmentListener getListener() {
-        return mListener;
-    }
-    
-    public void setListener(ActivityBaseFragmentListener listener) {
-        mListener = listener;
-    }
-    
-    public static interface ActivityBaseFragmentListener {
-        void onCreate(Bundle savedInstanceState, View view);
-    }
-    
-    protected void onCreate(Bundle savedInstanceState, View view) {
-        if (mListener != null)
-            mListener.onCreate(savedInstanceState, view);
-    }
-    
     protected int getListFragmentResource() {
-        return R.layout.list_fragment;
-    }
-    
-    void onListItemClick(ListItem li) {
-        
-    }
-
-    ViewGroup mTitleContainer;
-    TextView mEmpty;
-    @Override
-    public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View ret = inflater.inflate(getListFragmentResource(), container, false);
-
-        mTitleContainer = (ViewGroup)ret.findViewById(R.id.title_container);
-
-        mListView = (ListView)ret.findViewById(R.id.listview);
-        mListView.setOnItemClickListener(new OnItemClickListener() {
-            @Override
-            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
-                Object item = mAdapter.getItem(arg2);
-                if (item instanceof ListItem) {
-                    ListItem li = (ListItem)item;
-                    onListItemClick(li);
-                    li.onClickInternal(arg1);
-                }
-            }
-        });
-        
-        mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
-
-            @Override
-            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
-                Object item = mAdapter.getItem(arg2);
-                if (item instanceof ListItem) {
-                    ListItem li = (ListItem)item;
-                    return li.onLongClick();
-                }
-                return false;
-            }
-        });
-        
-        mListView.setAdapter(mAdapter);
-        mEmpty = (TextView)ret.findViewById(R.id.empty);
-        
-        onCreate(savedInstanceState, ret);
-        return ret;
-    }
-
-    @Override
-    public final void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mAdapter = new MyAdapter(getActivity());
-    }
-
-    Handler handler = new Handler();
-    
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        
-        mDestroyed = true;
+        return -1;
     }
     
-    protected int getListHeaderResource() {
-        return R.layout.list_header;
-    }
-    
-    protected int getListItemResource() {
-        return R.layout.list_item;
-    }
-
-    public void clear() {
-        mAdapter.clear();
-    }
-    
-    public void clearSection(int section) {
-        clearSection(mListView.getContext().getString(section));
-    }
-    
-    public void clearSection(String section) {
-        ListItemAdapter adapter = mAdapter.getSection(section);
-        if (adapter == null)
-            return;
-        adapter.clear();
-        mAdapter.notifyDataSetChanged();
-    }
-    
-    public void removeSection(int section) {
-        removeSection(mListView.getContext().getString(section));
-    }
-    
-    public void removeSection(String section) {
-        mAdapter.removeSection(section);
-    }
-    
-    public void removeItem(ListItem item) {
-        for (ListItemAdapter adapter: mAdapter.getSections()) {
-            adapter.remove(item);
-        }
-        mAdapter.notifyDataSetChanged();
-    }
-    
-    public void setEmpty(int res) {
-        mListView.setEmptyView(mEmpty);
-        mEmpty.setText(res);
-    }
-    
-    public ListView getListView() {
-        return mListView;
-    }
-    
-    public MyAdapter getAdapter() {
-        return mAdapter;
-    }
-    
-    public ViewGroup getTitleContainer() {
-        return mTitleContainer;
+    protected void onCreate(Bundle savedInstanceState, View view) {
     }
 }
diff --git a/Widgets/src/com/koushikdutta/widgets/BetterListFragmentInternal.java b/Widgets/src/com/koushikdutta/widgets/BetterListFragmentInternal.java
new file mode 100644 (file)
index 0000000..68c9693
--- /dev/null
@@ -0,0 +1,354 @@
+package com.koushikdutta.widgets;
+
+import java.util.Comparator;
+
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.AdapterView.OnItemLongClickListener;
+import android.widget.ArrayAdapter;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public class BetterListFragmentInternal extends FragmentInterface {
+    ListView mListView;
+    MyAdapter mAdapter;
+    
+    public BetterListFragmentInternal(FragmentInterfaceWrapper fragment) {
+        super(fragment);
+    }
+    
+    public class MyAdapter extends SeparatedListAdapter<ListItemAdapter> {
+        public MyAdapter(Context context) {
+            super(context);
+        }
+        
+        @Override
+        protected int getListHeaderResource() {
+            return BetterListFragmentInternal.this.getListHeaderResource();
+        }
+        
+        @Override
+        public boolean areAllItemsEnabled() {
+            return false;
+        }
+        
+        @Override
+        public boolean isEnabled(int position) {
+            if (!super.isEnabled(position))
+                return false;
+            ListItem item = (ListItem) getItem(position);
+            if (item == null)
+                return false;
+            return item.getEnabled();
+        }
+    }
+    
+    public class ListItemAdapter extends ArrayAdapter<ListItem> {
+        public ListItemAdapter(Context context) {
+            super(context, 0);
+        }
+        
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            ListItem item = getItem(position);
+            return item.getView(getContext(), convertView);
+        }
+        
+        @Override
+        public boolean areAllItemsEnabled() {
+            return false;
+        }
+        
+        @Override
+        public boolean isEnabled(int position) {
+            ListItem item = getItem(position);
+            return item.getEnabled();
+        }
+        
+        boolean sorting;
+        @Override
+        public void notifyDataSetChanged() {
+            if (sorter != null && !sorting) {
+                sorting = true;
+                super.sort(sorter);
+                sorting = false;
+            }
+            else {
+                super.notifyDataSetChanged();
+            }
+        }
+        
+        private Comparator<ListItem> sorter;
+        public void setSort(Comparator<ListItem> sorter) {
+            this.sorter = sorter;
+            notifyDataSetChanged();
+            mAdapter.notifyDataSetChanged();
+        }
+        
+        public Comparator<ListItem> getSort() {
+            return sorter;
+        }
+        
+        public Comparator<ListItem> ALPHA = new Comparator<ListItem>() {
+            @Override
+            public int compare(ListItem lhs, ListItem rhs) {
+                return lhs.getTitle().compareTo(rhs.getTitle());
+            }
+        };
+        
+        public Comparator<ListItem> ALPHAIGNORECASE = new Comparator<ListItem>() {
+            @Override
+            public int compare(ListItem lhs, ListItem rhs) {
+                return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
+            }
+        };
+
+        public Comparator<ListItem> NONE = new Comparator<ListItem>() {
+            @Override
+            public int compare(ListItem lhs, ListItem rhs) {
+                return ((Integer)getPosition(lhs)).compareTo(getPosition(rhs));
+            }
+        };
+    }
+    
+//    HashMap<String, MyListAdapter> mAdapters = new HashMap<String, ActivityBaseFragment.MyListAdapter>();
+    
+    public ListItemAdapter ensureHeader(int sectionName) {
+        return ensureHeader(mAdapter.getSectionCount(), getActivity().getString(sectionName));
+    }
+    
+    public ListItemAdapter ensureHeader(String sectionName) {
+        return ensureHeader(mAdapter.getSectionCount(), sectionName);
+    }
+
+    public ListItemAdapter ensureHeader(int index, int sectionName) {
+        return ensureHeader(index, getActivity().getString(sectionName));
+    }
+    public ListItemAdapter ensureHeader(int index, String sectionName) {
+        ListItemAdapter adapter = mAdapter.getSection(sectionName);
+        if (adapter == null) {
+            adapter = new ListItemAdapter(getContext());
+            mAdapter.addSection(index, sectionName, adapter);
+            mListView.setAdapter(null);
+            mListView.setAdapter(mAdapter);
+        }
+        return adapter;
+    }
+    
+    public ListItemAdapter getSection(int section) {
+        return getSection(getActivity().getString(section));
+    }
+    
+    public ListItemAdapter getSection(String section) {
+        return mAdapter.getSection(section);
+    }
+
+    public ListItem addItem(int sectionName, ListItem item) {
+        return addItem(getActivity().getString(sectionName), item);
+    }
+
+    public ListItem addItem(int sectionName, ListItem item, int index) {
+        return addItem(getActivity().getString(sectionName), item, index);
+    }
+    
+    public ListItem addItem(String sectionName, ListItem item) {
+        return addItem(sectionName, item, -1);
+    }
+    
+    public int getSectionItemCount(int section) {
+        return getSectionItemCount(getActivity().getString(section));
+    }
+    
+    public int getSectionItemCount(String section) {
+        ListItemAdapter adapter = mAdapter.getSection(section);
+        if (adapter == null)
+            return 0;
+        return adapter.getCount();
+    }
+
+    public ListItem addItem(String sectionName, ListItem item, int index) {
+        ListItemAdapter adapter = mAdapter.getSection(sectionName);
+        if (adapter == null) {
+            adapter = new ListItemAdapter(getContext());
+            mAdapter.addSection(sectionName, adapter);
+            if (mListView != null) {
+                mListView.setAdapter(null);
+                mListView.setAdapter(mAdapter);
+            }
+//            mAdapter.notifyDataSetChanged();
+        }
+        
+        if (index != -1)
+            adapter.insert(item, index);
+        else
+            adapter.add(item);
+
+        mAdapter.notifyDataSetChanged();
+        return item;
+    }
+    
+    public ListItem findItem(int item) {
+        String text = getActivity().getString(item);
+        
+        for (ListItemAdapter adapter: mAdapter.getSections())
+        {
+            for (int i = 0; i < adapter.getCount(); i++) {
+                ListItem li = adapter.getItem(i);
+                if (text.equals(li.getTitle()))
+                    return li;
+            }
+        }
+        
+        return null;
+    }
+
+    private ActivityBaseFragmentListener mListener;
+    public ActivityBaseFragmentListener getListener() {
+        return mListener;
+    }
+    
+    public void setListener(ActivityBaseFragmentListener listener) {
+        mListener = listener;
+    }
+    
+    public static interface ActivityBaseFragmentListener {
+        void onCreate(Bundle savedInstanceState, View view);
+    }
+    
+    protected void onCreate(Bundle savedInstanceState, View view) {
+        if (mListener != null)
+            mListener.onCreate(savedInstanceState, view);
+    }
+    
+    protected int getListFragmentResource() {
+        return R.layout.list_fragment;
+    }
+    
+    void onListItemClick(ListItem li) {
+        
+    }
+
+    ViewGroup mTitleContainer;
+    TextView mEmpty;
+    
+    
+    protected int getListHeaderResource() {
+        return R.layout.list_header;
+    }
+    
+    protected int getListItemResource() {
+        return R.layout.list_item;
+    }
+
+    public void clear() {
+        mAdapter.clear();
+    }
+    
+    public void clearSection(int section) {
+        clearSection(mListView.getContext().getString(section));
+    }
+    
+    public void clearSection(String section) {
+        ListItemAdapter adapter = mAdapter.getSection(section);
+        if (adapter == null)
+            return;
+        adapter.clear();
+        mAdapter.notifyDataSetChanged();
+    }
+    
+    public void removeSection(int section) {
+        removeSection(mListView.getContext().getString(section));
+    }
+    
+    public void removeSection(String section) {
+        mAdapter.removeSection(section);
+    }
+    
+    public void removeItem(ListItem item) {
+        for (ListItemAdapter adapter: mAdapter.getSections()) {
+            adapter.remove(item);
+        }
+        mAdapter.notifyDataSetChanged();
+    }
+    
+    public void setEmpty(int res) {
+        mListView.setEmptyView(mEmpty);
+        mEmpty.setText(res);
+    }
+    
+    public ListView getListView() {
+        return mListView;
+    }
+    
+    public MyAdapter getAdapter() {
+        return mAdapter;
+    }
+    
+    public ViewGroup getTitleContainer() {
+        return mTitleContainer;
+    }
+
+    
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        float hor = getActivity().getResources().getDimension(R.dimen.list_horizontal_margin);
+        float ver = getActivity().getResources().getDimension(R.dimen.list_vertical_margin);
+        mListView.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
+    }
+
+    @Override
+    public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        View ret = inflater.inflate(getListFragmentResource(), container, false);
+
+        mTitleContainer = (ViewGroup)ret.findViewById(R.id.title_container);
+
+        mListView = (ListView)ret.findViewById(R.id.listview);
+        mListView.setOnItemClickListener(new OnItemClickListener() {
+            @Override
+            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
+                Object item = mAdapter.getItem(arg2);
+                if (item instanceof ListItem) {
+                    ListItem li = (ListItem)item;
+                    onListItemClick(li);
+                    li.onClickInternal(arg1);
+                }
+            }
+        });
+        
+        mListView.setOnItemLongClickListener(new OnItemLongClickListener() {
+
+            @Override
+            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
+                Object item = mAdapter.getItem(arg2);
+                if (item instanceof ListItem) {
+                    ListItem li = (ListItem)item;
+                    return li.onLongClick();
+                }
+                return false;
+            }
+        });
+        
+        mListView.setAdapter(mAdapter);
+        mEmpty = (TextView)ret.findViewById(R.id.empty);
+        
+        onCreate(savedInstanceState, ret);
+        return ret;
+    }
+
+    @Override
+    public final void onCreate(Bundle savedInstanceState) {
+        mAdapter = new MyAdapter(getContext());
+    }
+
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+    }
+}
diff --git a/Widgets/src/com/koushikdutta/widgets/FragmentInterface.java b/Widgets/src/com/koushikdutta/widgets/FragmentInterface.java
new file mode 100644 (file)
index 0000000..f3d3457
--- /dev/null
@@ -0,0 +1,52 @@
+package com.koushikdutta.widgets;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+public abstract class FragmentInterface {
+    protected FragmentInterfaceWrapper mFragment;
+    
+    public Activity getActivity() {
+        return getFragment().getActivity();
+    }
+    
+    public Context getContext() {
+        return getFragment().getActivity();
+    }
+    
+    public FragmentInterfaceWrapper getFragment() {
+        return mFragment;
+    }
+    
+    public FragmentInterface(FragmentInterfaceWrapper fragment) {
+        mFragment = fragment;
+    }
+    
+    public String getString(int res) {
+        return getActivity().getString(res);
+    }    
+    public String getString(int res, Object... formatArgs) {
+        return getActivity().getString(res, formatArgs);
+    }
+    
+    public Resources getResources() {
+        return getActivity().getResources();
+    }
+    
+    abstract public void onConfigurationChanged(Configuration newConfig);
+
+    abstract public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
+    
+    abstract public void onCreate(Bundle savedInstanceState);
+
+    abstract public void onCreateOptionsMenu(Menu menu, MenuInflater inflater);
+
+}
diff --git a/Widgets/src/com/koushikdutta/widgets/FragmentInterfaceWrapper.java b/Widgets/src/com/koushikdutta/widgets/FragmentInterfaceWrapper.java
new file mode 100644 (file)
index 0000000..32d9813
--- /dev/null
@@ -0,0 +1,9 @@
+package com.koushikdutta.widgets;
+
+import android.app.Activity;
+
+public interface FragmentInterfaceWrapper {
+    public Activity getActivity();
+    public FragmentInterface getInternal();
+    public void setHasOptionsMenu(boolean options);
+}
index 8c88ac9..844eba4 100644 (file)
@@ -1,98 +1,11 @@
 package com.koushikdutta.widgets;
 
-import android.content.res.Configuration;
-import android.os.Bundle;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
-import android.widget.ViewSwitcher;
 
-public class ListContentFragment extends BetterListFragment {
-    ViewGroup mContent;
-    ViewGroup mContainer;
-    
-    @Override
-    protected int getListHeaderResource() {
-        return R.layout.list_content_header;
-    }
-    
-    private void setPadding() {
-        float hor = getResources().getDimension(R.dimen.list_horizontal_margin);
-        float ver = getResources().getDimension(R.dimen.list_vertical_margin);
-        getListView().setPadding(0, 0, 0, 0);
-        ver = 0;
-        mContainer.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
-    }
-    
-    Fragment mCurrentContent;
-    
-    @Override
-    protected void onCreate(Bundle savedInstanceState, View ret) {
-        mContent = (ViewGroup)ret.findViewById(R.id.content);
-        mContainer = (ViewGroup)ret.findViewById(R.id.list_content_container);
-
-        setPadding();
-        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
-        
-        super.onCreate(savedInstanceState, ret);
-    }
-    
-    public boolean isPaged() {
-        return mContainer instanceof ViewSwitcher;
-    }
-    
-    public void setContent(Fragment content, boolean clearChoices) {
-        Fragment last = mCurrentContent;
-        mCurrentContent = content;
-        FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
-        if (last != null)
-            ft.replace(R.id.content, mCurrentContent);
-        else
-            ft.add(R.id.content, mCurrentContent);
-        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
-        if (mContainer instanceof ViewSwitcher) {
-            ViewSwitcher switcher = (ViewSwitcher)mContainer;
-            if (mContent != switcher.getCurrentView())
-                switcher.showNext();
-        }
-        ft.commit();
-        if (clearChoices)
-            getListView().clearChoices();
-    }
-
-    public boolean onBackPressed() {
-        if (mCurrentContent == null)
-            return false;
-        if (mContainer instanceof ViewSwitcher) {
-            ((ViewSwitcher)mContainer).showPrevious();
-            FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
-            ft.remove(mCurrentContent);
-            ft.commit();
-            mCurrentContent = null;
-            return true;
-        }
-        return false;
-    }
 
+public class ListContentFragment extends BetterListFragment {
     @Override
-    protected int getListItemResource() {
-        return R.layout.list_item_selectable;
+    public ListContentFragmentInternal createFragmentInterface() {
+        return new ListContentFragmentInternal(this);
     }
 
-    @Override
-    protected int getListFragmentResource() {
-        return R.layout.list_content;
-    }
-    
-    public ViewGroup getContent() {
-        return mContent;
-    }
-    
-    @Override
-    public void onConfigurationChanged(Configuration newConfig) {
-        super.onConfigurationChanged(newConfig);
-        setPadding();
-    }
 }
diff --git a/Widgets/src/com/koushikdutta/widgets/ListContentFragmentInternal.java b/Widgets/src/com/koushikdutta/widgets/ListContentFragmentInternal.java
new file mode 100644 (file)
index 0000000..e7e0678
--- /dev/null
@@ -0,0 +1,147 @@
+package com.koushikdutta.widgets;
+
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.support.v4.app.FragmentTransaction;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+import android.widget.ViewSwitcher;
+
+public class ListContentFragmentInternal extends BetterListFragmentInternal {
+    ViewGroup mContent;
+    ViewGroup mContainer;
+
+    public ListContentFragmentInternal(FragmentInterfaceWrapper fragment) {
+        super(fragment);
+    }
+
+    @Override
+    protected int getListHeaderResource() {
+        return R.layout.list_content_header;
+    }
+    
+    private void setPadding() {
+        float hor = getResources().getDimension(R.dimen.list_horizontal_margin);
+        float ver = getResources().getDimension(R.dimen.list_vertical_margin);
+        getListView().setPadding(0, 0, 0, 0);
+        ver = 0;
+        mContainer.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
+    }
+    
+    FragmentInterfaceWrapper mCurrentContent;
+    
+    @Override
+    protected void onCreate(Bundle savedInstanceState, View ret) {
+        mContent = (ViewGroup)ret.findViewById(R.id.content);
+        mContainer = (ViewGroup)ret.findViewById(R.id.list_content_container);
+
+        setPadding();
+        getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
+        
+        super.onCreate(savedInstanceState, ret);
+    }
+    
+    public boolean isPaged() {
+        return mContainer instanceof ViewSwitcher;
+    }
+    
+    void setContentNative(FragmentInterfaceWrapper last) {
+        android.app.Fragment f = (android.app.Fragment)mCurrentContent;
+        Activity fa = getActivity();
+        android.app.FragmentTransaction ft = fa.getFragmentManager().beginTransaction();
+        if (last != null)
+            ft.replace(R.id.content, f);
+        else
+            ft.add(R.id.content, f);
+        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
+        if (mContainer instanceof ViewSwitcher) {
+            ViewSwitcher switcher = (ViewSwitcher)mContainer;
+            if (mContent != switcher.getCurrentView())
+                switcher.showNext();
+        }
+        ft.commit();
+    }
+    
+    public void setContent(FragmentInterfaceWrapper content, boolean clearChoices) {
+        FragmentInterfaceWrapper last = mCurrentContent;
+        mCurrentContent = content;
+        if (getActivity() instanceof FragmentActivity) {
+            Fragment f = (Fragment)mCurrentContent;
+            FragmentActivity fa = (FragmentActivity)getActivity();
+            FragmentTransaction ft = fa.getSupportFragmentManager().beginTransaction();
+            if (last != null)
+                ft.replace(R.id.content, f);
+            else
+                ft.add(R.id.content, f);
+            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
+            if (mContainer instanceof ViewSwitcher) {
+                ViewSwitcher switcher = (ViewSwitcher)mContainer;
+                if (mContent != switcher.getCurrentView())
+                    switcher.showNext();
+            }
+            ft.commit();
+        }
+        else {
+            setContentNative(last);
+        }
+
+        if (clearChoices)
+            getListView().clearChoices();
+    }
+
+    public void goBackNative() {
+        android.app.Fragment f = (android.app.Fragment)mCurrentContent;
+        Activity fa = getActivity();
+        ((ViewSwitcher)mContainer).showPrevious();
+        fa.getFragmentManager().beginTransaction()
+        .remove(f)
+        .commit();
+        mCurrentContent = null;
+    }
+    
+    public boolean onBackPressed() {
+        if (mCurrentContent == null)
+            return false;
+        if (mContainer instanceof ViewSwitcher) {
+            if (getActivity() instanceof FragmentActivity) {
+                Fragment f = (Fragment)mCurrentContent;
+                FragmentActivity fa = (FragmentActivity)getActivity();
+                ((ViewSwitcher)mContainer).showPrevious();
+                fa.getSupportFragmentManager().beginTransaction()
+                .remove(f)
+                .commit();
+                mCurrentContent = null;
+                return true;
+            }
+            else {
+                goBackNative();
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    protected int getListItemResource() {
+        return R.layout.list_item_selectable;
+    }
+
+    @Override
+    protected int getListFragmentResource() {
+        return R.layout.list_content;
+    }
+    
+    public ViewGroup getContent() {
+        return mContent;
+    }
+    
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        setPadding();
+    }
+}
index 33f8890..5c082ef 100644 (file)
@@ -14,7 +14,7 @@ import android.widget.TextView;
 public class ListItem {
     private String Title;
     private String Summary;
-    private BetterListFragment mFragment;
+    private BetterListFragmentInternal mFragment;
     private boolean Enabled = true;
 
     private int Icon;
@@ -33,11 +33,11 @@ public class ListItem {
         return this;
     }
     
+    int mAttr = 0;
     public ListItem setAttrDrawable(int attr) {
-        Context ctx = mFragment.getActivity();
-        TypedValue value = new TypedValue();
-        ctx.getTheme().resolveAttribute(attr, value, true);
-        setIcon(value.resourceId);
+        mAttr = attr;
+        mDrawable = null;
+        Icon = 0;
         return this;
     }
     
@@ -81,7 +81,7 @@ public class ListItem {
         return this;
     }
     
-    public ListItem(BetterListFragment context, int title, int summary) {
+    public ListItem(BetterListFragmentInternal context, int title, int summary) {
         if (title != 0)
             Title = context.getString(title);
         if (summary != 0)
@@ -89,24 +89,24 @@ public class ListItem {
         mFragment = context;
     }
     
-    public ListItem(BetterListFragment context, String title, String summary) {
+    public ListItem(BetterListFragmentInternal context, String title, String summary) {
         Title = title;
         Summary = summary;
         mFragment = context;
     }
     
-    public ListItem(BetterListFragment context, int title, int summary, int icon) {
+    public ListItem(BetterListFragmentInternal context, int title, int summary, int icon) {
         this(context, title, summary);
         Icon = icon;
     }
     
-    public ListItem(BetterListFragment context, String title, String summary, int icon) {
+    public ListItem(BetterListFragmentInternal context, String title, String summary, int icon) {
         this(context, title, summary);
         Icon = icon;
     }
     
     Drawable mDrawable;
-    public ListItem(BetterListFragment context, String title, String summary, Drawable drawable) {
+    public ListItem(BetterListFragmentInternal context, String title, String summary, Drawable drawable) {
         this(context, title, summary);
         mDrawable = drawable;
     }
@@ -158,19 +158,18 @@ public class ListItem {
     }
     
     public View getView(Context context, View convertView) {
+        LayoutInflater inflater;
+        int theme = getTheme();
+        if (theme != 0) {
+            inflater = (LayoutInflater) new ContextThemeWrapper(context, theme).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        }
+        else {
+            inflater = LayoutInflater.from(context);
+        }
         if (convertView == null || convertView.getTag() != null) {
-            LayoutInflater inflater;
-            int theme = getTheme();
-            if (theme != 0) {
-                inflater = (LayoutInflater)new ContextThemeWrapper(context, theme).getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-            }
-            else {
-                inflater = LayoutInflater.from(context);
-            }
             convertView = inflater.inflate(mFragment.getListItemResource(), null);
         }
         
-        
         TextView title = (TextView)convertView.findViewById(R.id.title);
         TextView summary = (TextView)convertView.findViewById(R.id.summary);
         CompoundButton cb = (CompoundButton)convertView.findViewById(R.id.checkbox);
@@ -209,6 +208,14 @@ public class ListItem {
 
         ImageView iv = (ImageView)convertView.findViewById(R.id.image);
         if (iv != null) {
+            if (mAttr != 0) {
+                Context ctx = inflater.getContext();
+                TypedValue value = new TypedValue();
+                ctx.getTheme().resolveAttribute(mAttr, value, true);
+                mAttr = 0;
+                Icon = value.resourceId;
+            }
+            
             if (Icon != 0) {
                 iv.setVisibility(View.VISIBLE);
                 iv.setImageResource(Icon);
diff --git a/Widgets/src/com/koushikdutta/widgets/NativeFragment.java b/Widgets/src/com/koushikdutta/widgets/NativeFragment.java
new file mode 100644 (file)
index 0000000..d0a42d1
--- /dev/null
@@ -0,0 +1,49 @@
+package com.koushikdutta.widgets;
+
+import android.app.Fragment;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+public abstract class NativeFragment<T extends FragmentInterface> extends Fragment implements FragmentInterfaceWrapper {
+    public abstract T createFragmentInterface();
+    
+    T internal;
+    public NativeFragment() {
+        internal = createFragmentInterface();
+    }
+
+    @Override
+    public T getInternal() {
+        return internal;
+    }
+    
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        internal.onCreate(savedInstanceState);
+    }
+    
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        internal.onConfigurationChanged(newConfig);
+    }
+    
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return internal.onCreateView(inflater, container, savedInstanceState);
+    }
+    
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        super.onCreateOptionsMenu(menu, inflater);
+        
+        internal.onCreateOptionsMenu(menu, inflater);
+    }
+}
diff --git a/Widgets/src/com/koushikdutta/widgets/SupportFragment.java b/Widgets/src/com/koushikdutta/widgets/SupportFragment.java
new file mode 100644 (file)
index 0000000..1f31eda
--- /dev/null
@@ -0,0 +1,49 @@
+package com.koushikdutta.widgets;
+
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+
+public abstract class SupportFragment<T extends FragmentInterface> extends Fragment implements FragmentInterfaceWrapper {
+    public abstract T createFragmentInterface();
+    
+    T internal;
+    public SupportFragment() {
+        internal = createFragmentInterface();
+    }
+
+    @Override
+    public T getInternal() {
+        return internal;
+    }
+    
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        internal.onCreate(savedInstanceState);
+    }
+    
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+        internal.onConfigurationChanged(newConfig);
+    }
+    
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        return internal.onCreateView(inflater, container, savedInstanceState);
+    }
+    
+    @Override
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        super.onCreateOptionsMenu(menu, inflater);
+        
+        internal.onCreateOptionsMenu(menu, inflater);
+    }
+}
index fe493c4..e28f147 100644 (file)
@@ -11,6 +11,7 @@ import android.view.View;
 
 import com.koushikdutta.widgets.BetterListActivity;
 import com.koushikdutta.widgets.ListContentFragment;
+import com.koushikdutta.widgets.ListContentFragmentInternal;
 import com.koushikdutta.widgets.ListItem;
 
 public class ListContentTest extends BetterListActivity {
@@ -18,8 +19,8 @@ public class ListContentTest extends BetterListActivity {
         super(ListContentFragment.class);
     }
     
-    public ListContentFragment getFragment() {
-        return (ListContentFragment)super.getFragment();
+    public ListContentFragmentInternal getFragment() {
+        return (ListContentFragmentInternal)super.getFragment();
     }
     
     protected void onResume() {