Settings: Added preference fragment to the last tab in the main view.
This is a little bit flakey at this point, because the weird asynchronous nature of adding fragments. If swiping to the second-to-last entry on the bottom navigation view, it will populate the settings fragment in the UI and then it will dissapear. Need to fix this.
This commit is contained in:
		
							parent
							
								
									fff7999aac
								
							
						
					
					
						commit
						55824a491b
					
				@ -1,6 +1,7 @@
 | 
				
			|||||||
package org.fdroid.fdroid.views.main;
 | 
					package org.fdroid.fdroid.views.main;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import android.content.Intent;
 | 
					import android.content.Intent;
 | 
				
			||||||
 | 
					import android.support.v4.app.Fragment;
 | 
				
			||||||
import android.support.v7.app.AppCompatActivity;
 | 
					import android.support.v7.app.AppCompatActivity;
 | 
				
			||||||
import android.support.v7.widget.RecyclerView;
 | 
					import android.support.v7.widget.RecyclerView;
 | 
				
			||||||
import android.view.View;
 | 
					import android.view.View;
 | 
				
			||||||
@ -8,6 +9,7 @@ import android.widget.Button;
 | 
				
			|||||||
import android.widget.FrameLayout;
 | 
					import android.widget.FrameLayout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.fdroid.fdroid.R;
 | 
					import org.fdroid.fdroid.R;
 | 
				
			||||||
 | 
					import org.fdroid.fdroid.views.fragments.PreferencesFragment;
 | 
				
			||||||
import org.fdroid.fdroid.views.myapps.MyAppsViewBinder;
 | 
					import org.fdroid.fdroid.views.myapps.MyAppsViewBinder;
 | 
				
			||||||
import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
 | 
					import org.fdroid.fdroid.views.swap.SwapWorkflowActivity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -72,6 +74,20 @@ class MainViewController extends RecyclerView.ViewHolder {
 | 
				
			|||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Attaches a {@link PreferencesFragment} to the view. Everything else is managed by the
 | 
				
			||||||
 | 
					     * fragment itself, so no further work needs to be done by this view binder.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * Note: It is tricky to attach a {@link Fragment} to a view from this view holder. This is due
 | 
				
			||||||
 | 
					     * to the way in which the {@link RecyclerView} will reuse existing views and ask us to
 | 
				
			||||||
 | 
					     * put a settings fragment in there at arbitrary times. Usually it wont be the same view we
 | 
				
			||||||
 | 
					     * attached the fragment to last time, which causes weirdness. The solution is to use code from
 | 
				
			||||||
 | 
					     * the com.lsjwzh.widget.recyclerviewpager.FragmentStatePagerAdapter which manages this.
 | 
				
			||||||
 | 
					     * The code has been ported to {@link SettingsView}.
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @see SettingsView
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public void bindSettingsView() {
 | 
					    public void bindSettingsView() {
 | 
				
			||||||
 | 
					        activity.getLayoutInflater().inflate(R.layout.main_tab_settings, frame, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,89 @@
 | 
				
			|||||||
 | 
					package org.fdroid.fdroid.views.main;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import android.annotation.TargetApi;
 | 
				
			||||||
 | 
					import android.content.Context;
 | 
				
			||||||
 | 
					import android.support.v4.app.Fragment;
 | 
				
			||||||
 | 
					import android.support.v4.app.FragmentTransaction;
 | 
				
			||||||
 | 
					import android.support.v7.app.AppCompatActivity;
 | 
				
			||||||
 | 
					import android.util.AttributeSet;
 | 
				
			||||||
 | 
					import android.widget.FrameLayout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.fdroid.fdroid.R;
 | 
				
			||||||
 | 
					import org.fdroid.fdroid.views.fragments.PreferencesFragment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * When attached to the window, the {@link PreferencesFragment} will be added. When detached from
 | 
				
			||||||
 | 
					 * the window, the fragment will be removed.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Based on code from https://github.com/lsjwzh/RecyclerViewPager/blob/master/lib/src/main/java/com/lsjwzh/widget/recyclerviewpager/FragmentStatePagerAdapter.java
 | 
				
			||||||
 | 
					 * licensed under the Apache 2.0 license (https://github.com/lsjwzh/RecyclerViewPager/blob/master/LICENSE).
 | 
				
			||||||
 | 
					 * @see android.support.v4.app.FragmentStatePagerAdapter Much of the code here was ported from this class.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class SettingsView extends FrameLayout {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private FragmentTransaction currentTransaction;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SettingsView(Context context) {
 | 
				
			||||||
 | 
					        super(context);
 | 
				
			||||||
 | 
					        setId(R.id.preference_fragment_parent);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SettingsView(Context context, AttributeSet attrs) {
 | 
				
			||||||
 | 
					        super(context, attrs);
 | 
				
			||||||
 | 
					        setId(R.id.preference_fragment_parent);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SettingsView(Context context, AttributeSet attrs, int defStyleAttr) {
 | 
				
			||||||
 | 
					        super(context, attrs, defStyleAttr);
 | 
				
			||||||
 | 
					        setId(R.id.preference_fragment_parent);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @TargetApi(21)
 | 
				
			||||||
 | 
					    public SettingsView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
 | 
				
			||||||
 | 
					        super(context, attrs, defStyleAttr, defStyleRes);
 | 
				
			||||||
 | 
					        setId(R.id.preference_fragment_parent);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void onAttachedToWindow() {
 | 
				
			||||||
 | 
					        super.onAttachedToWindow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AppCompatActivity activity = (AppCompatActivity) getContext();
 | 
				
			||||||
 | 
					        if (activity == null) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("Cannot add a SettingsView to activities which are not an AppCompatActivity");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (currentTransaction == null) {
 | 
				
			||||||
 | 
					            currentTransaction = activity.getSupportFragmentManager().beginTransaction();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        currentTransaction.replace(getId(), new PreferencesFragment(), "preferences-fragment");
 | 
				
			||||||
 | 
					        currentTransaction.commitAllowingStateLoss();
 | 
				
			||||||
 | 
					        currentTransaction = null;
 | 
				
			||||||
 | 
					        activity.getSupportFragmentManager().executePendingTransactions();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    protected void onDetachedFromWindow() {
 | 
				
			||||||
 | 
					        super.onDetachedFromWindow();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        AppCompatActivity activity = (AppCompatActivity) getContext();
 | 
				
			||||||
 | 
					        if (activity == null) {
 | 
				
			||||||
 | 
					            throw new IllegalArgumentException("Cannot add a SettingsView to activities which are not an AppCompatActivity");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Fragment existingFragment = activity.getSupportFragmentManager().findFragmentByTag("preferences-fragment");
 | 
				
			||||||
 | 
					        if (existingFragment == null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (currentTransaction == null) {
 | 
				
			||||||
 | 
					            currentTransaction = activity.getSupportFragmentManager().beginTransaction();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        currentTransaction.remove(existingFragment);
 | 
				
			||||||
 | 
					        currentTransaction.commitAllowingStateLoss();
 | 
				
			||||||
 | 
					        currentTransaction = null;
 | 
				
			||||||
 | 
					        activity.getSupportFragmentManager().executePendingTransactions();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								app/src/main/res/layout/main_tab_settings.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								app/src/main/res/layout/main_tab_settings.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,7 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
 | 
					<org.fdroid.fdroid.views.main.SettingsView
 | 
				
			||||||
 | 
					    xmlns:android="http://schemas.android.com/apk/res/android"
 | 
				
			||||||
 | 
					    android:layout_width="match_parent"
 | 
				
			||||||
 | 
					    android:layout_height="match_parent">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</org.fdroid.fdroid.views.main.SettingsView>
 | 
				
			||||||
@ -2,6 +2,7 @@
 | 
				
			|||||||
<resources>
 | 
					<resources>
 | 
				
			||||||
  <item type="id" name="category_spinner" />
 | 
					  <item type="id" name="category_spinner" />
 | 
				
			||||||
  <item type="id" name="appDetailsSummaryHeader" />
 | 
					  <item type="id" name="appDetailsSummaryHeader" />
 | 
				
			||||||
 | 
					  <item type="id" name="preference_fragment_parent" />
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  <item type="id" name="whats_new_feature" />
 | 
					  <item type="id" name="whats_new_feature" />
 | 
				
			||||||
  <item type="id" name="whats_new_large_tile" />
 | 
					  <item type="id" name="whats_new_large_tile" />
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user