OSDN Git Service

529c95d278b31dfa3cb085afe27f24d9a7155463
[android-x86/external-koush-Widgets.git] / Widgets / src / com / koushikdutta / widgets / ListContentFragmentInternal.java
1 package com.koushikdutta.widgets;
2
3 import junit.framework.Assert;
4 import android.annotation.SuppressLint;
5 import android.app.Activity;
6 import android.content.res.Configuration;
7 import android.os.Bundle;
8 import android.support.v4.app.Fragment;
9 import android.support.v4.app.FragmentActivity;
10 import android.support.v4.app.FragmentManager;
11 import android.support.v4.app.FragmentManager.OnBackStackChangedListener;
12 import android.support.v4.app.FragmentTransaction;
13 import android.view.View;
14 import android.view.ViewGroup;
15 import android.widget.ListView;
16
17 public class ListContentFragmentInternal extends BetterListFragmentInternal {
18     ViewGroup mContent;
19     ViewGroup mContainer;
20
21     public ViewGroup getContainer() {
22         return mContainer;
23     }
24     
25     public ListContentFragmentInternal(FragmentInterfaceWrapper fragment) {
26         super(fragment);
27     }
28
29     @Override
30     protected int getListHeaderResource() {
31         return R.layout.list_content_header;
32     }
33     
34     @Override
35     protected void setPadding() {
36         super.setPadding();
37         float hor = getResources().getDimension(R.dimen.list_horizontal_margin);
38         float ver = getResources().getDimension(R.dimen.list_vertical_margin);
39         getListView().setPadding(0, 0, 0, 0);
40         ver = 0;
41         mContainer.setPadding((int)hor, (int)ver, (int)hor, (int)ver);
42     }
43     
44     FragmentInterfaceWrapper mCurrentContent;
45     
46     @Override
47     protected void onCreate(Bundle savedInstanceState, View ret) {
48         mContent = (ViewGroup)ret.findViewById(R.id.content);
49         mContainer = (ViewGroup)ret.findViewById(R.id.list_content_container);
50
51         getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
52         
53         super.onCreate(savedInstanceState, ret);
54     }
55     
56     public boolean isPaged() {
57         return mContent == null;
58     }
59     
60     int getContentId() {
61         if (isPaged())
62             return R.id.list_content_container;
63         return R.id.content;
64     }
65     
66     static Object backstackListener;
67     static Object pendingFragment;
68
69     
70     @SuppressLint("InlinedApi")
71     private void onDetachNative() {
72         Activity fa = getActivity();
73         fa.getFragmentManager().popBackStack("content", android.app.FragmentManager.POP_BACK_STACK_INCLUSIVE);
74     }
75     
76     @Override
77     public void onDetach() {
78         super.onDetach();
79         
80         if (getActivity() == null || getActivity().isFinishing() || getActivity().isChangingConfigurations())
81             return;
82         
83         if (!isPaged())
84             return;
85         
86         if (getActivity() instanceof FragmentActivity) {
87             FragmentActivity fa = (FragmentActivity)getActivity();
88             fa.getSupportFragmentManager().popBackStack("content", FragmentManager.POP_BACK_STACK_INCLUSIVE);
89         }
90         else {
91             onDetachNative();
92         }
93     }
94     
95     Object listener;
96     @SuppressLint("InlinedApi")
97     void setContentNative(final String breadcrumb) {
98         android.app.Fragment f = (android.app.Fragment)mCurrentContent;
99         Activity fa = getActivity();
100         final android.app.FragmentManager fm = fa.getFragmentManager();
101
102         android.app.FragmentTransaction ft = fm.beginTransaction();
103         if (isPaged()) {
104             if (listener == null) {
105                 fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() {
106                     {
107                         listener = this;
108                     }
109                     @Override
110                     public void onBackStackChanged() {
111                         android.app.Fragment f = (android.app.Fragment)getFragment();
112                         if (f.isDetached() || f.isRemoving()) {
113                             fm.removeOnBackStackChangedListener(this);
114                             return;
115                         }
116                         View v = getFragment().getView();
117                         if (v == null)
118                             return;
119                         final View l = v.findViewById(R.id.list_fragment);
120                         if (l == null)
121                             return;
122                         if (fm.getBackStackEntryCount() > 0 && "content".equals(fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName())) {
123                             l.setVisibility(View.GONE);
124                         }
125                         else {
126                             l.setVisibility(View.VISIBLE);
127                         }
128                     }
129                 });
130             }
131             
132             fm.popBackStack("content", android.app.FragmentManager.POP_BACK_STACK_INCLUSIVE);
133             ft.setBreadCrumbTitle(breadcrumb);
134             ft.setBreadCrumbShortTitle(breadcrumb);
135             ft.addToBackStack("content");
136         }
137         ft.replace(getContentId(), f, "content");
138         ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
139         ft.commit();
140     }
141     
142     public void setContent(FragmentInterfaceWrapper content, boolean clearChoices, String breadcrumb) {
143         mCurrentContent = content;
144         if (getActivity() instanceof FragmentActivity) {
145             Fragment f = (Fragment)mCurrentContent;
146             FragmentActivity fa = (FragmentActivity)getActivity();
147             final FragmentManager fm = fa.getSupportFragmentManager();
148             FragmentTransaction ft = fa.getSupportFragmentManager().beginTransaction();
149             if (isPaged()) {
150                 final int curSize = fm.getBackStackEntryCount();
151                 View v = getFragment().getView();
152                 Assert.assertNotNull(v);
153                 final View l = v.findViewById(R.id.list_fragment);
154                 Assert.assertNotNull(l);
155                 l.setVisibility(View.GONE);
156                 fm.addOnBackStackChangedListener(new OnBackStackChangedListener() {
157                     @Override
158                     public void onBackStackChanged() {
159                         if (curSize != fm.getBackStackEntryCount())
160                             return;
161                         l.setVisibility(View.VISIBLE);
162                         fm.removeOnBackStackChangedListener(this);
163                     }
164                 });
165                 ft.addToBackStack("content");
166             }
167             ft.replace(getContentId(), f, "content");
168             ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
169             ft.commit();
170         }
171         else {
172             setContentNative(breadcrumb);
173         }
174
175         if (clearChoices)
176             getListView().clearChoices();
177     }
178
179     @Override
180     protected int getListItemResource() {
181         return R.layout.list_item_selectable;
182     }
183
184     @Override
185     protected int getListFragmentResource() {
186         return R.layout.list_content;
187     }
188     
189     @Override
190     public void onConfigurationChanged(Configuration newConfig) {
191         super.onConfigurationChanged(newConfig);
192         setPadding();
193     }
194 }