From 4db0bfcf8cdd18ef8cf8e77e83f640122f0b17e5 Mon Sep 17 00:00:00 2001 From: bg45 Date: Tue, 4 Apr 2017 16:51:07 -0400 Subject: [PATCH] Workaround for nasty requestFeature bug in Android versions < 23: dialogs will open fullscreen in this case Layout size is recalculated after rotation Some code cleanup --- .../donext/activities/MainActivity.java | 3 +- .../donext/activities/TodayActivity.java | 10 ++--- .../fragments/DynamicDialogFragment.java | 43 +++++++++++-------- .../fragments/TaskFormContentFragment.java | 1 + .../fragments/TaskFormDialogFragment.java | 3 +- .../donext/fragments/TasksFragment.java | 8 ++-- .../fragments/TodayFormDialogFragment.java | 6 +-- .../res/layout/fragment_dynamic_dialog.xml | 8 +++- DoNExt/app/src/main/res/values-fr/strings.xml | 1 + DoNExt/app/src/main/res/values/strings.xml | 1 + 10 files changed, 45 insertions(+), 39 deletions(-) diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java index 98ae853..51fa2ce 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/MainActivity.java @@ -176,7 +176,6 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this); Bundle args = new Bundle(); args.putInt("list", currentTabPosition); - args.putBoolean("layout", mIsLargeLayout); args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false)); args.putBoolean("neutral", false); args.putString("button_positive", getString(R.string.new_task_save)); @@ -186,7 +185,7 @@ public class MainActivity extends AppCompatActivity implements TasksFragment.Tas String title = getString(R.string.action_new_task); FragmentManager fragmentManager = getSupportFragmentManager(); - if (mIsLargeLayout) + if (mIsLargeLayout && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) taskDialogFragment.show(fragmentManager, title); else { // The device is smaller, so show the fragment fullscreen diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java index a67e651..980fb88 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/activities/TodayActivity.java @@ -1,6 +1,7 @@ package com.wismna.geoffroy.donext.activities; import android.content.SharedPreferences; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; @@ -22,8 +23,6 @@ import com.wismna.geoffroy.donext.fragments.TodayFormDialogFragment; public class TodayActivity extends AppCompatActivity implements TodayFormDialogFragment.TodayTaskListener { - private boolean mIsLargeLayout; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -39,8 +38,6 @@ public class TodayActivity extends AppCompatActivity ab.setDisplayHomeAsUpEnabled(true); ab.setHomeButtonEnabled(true); } - - mIsLargeLayout = getResources().getBoolean(R.bool.large_layout); } @Override @@ -68,16 +65,17 @@ public class TodayActivity extends AppCompatActivity TodayFormDialogFragment taskDialogFragment = TodayFormDialogFragment.newInstance(TodayActivity.this); + boolean isLargeLayout = getResources().getBoolean(R.bool.large_layout); // Set some configuration values for the dialog Bundle args = new Bundle(); - args.putBoolean("layout", mIsLargeLayout); + args.putBoolean("layout", isLargeLayout); args.putString("button_positive", getString(R.string.new_task_save)); args.putString("button_negative", getString(R.string.new_task_cancel)); taskDialogFragment.setArguments(args); String title = getString(R.string.action_today_select); FragmentManager fragmentManager = getSupportFragmentManager(); - if (mIsLargeLayout) + if (isLargeLayout && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) taskDialogFragment.show(fragmentManager, title); else { // The device is smaller, so show the fragment fullscreen diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java index 46f44b1..cdbe583 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/DynamicDialogFragment.java @@ -5,6 +5,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; +import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -33,14 +34,13 @@ import com.wismna.geoffroy.donext.R; public abstract class DynamicDialogFragment extends DialogFragment { private View mDialogView = null; boolean mHasNeutralButton = false; - boolean mIsLargeLayout = false; Fragment mContentFragment = new Fragment(); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // This part is only needed on small layouts (large layouts use onCreateDialog) - if (!mIsLargeLayout) { + if (!getShowsDialog()) { View view = inflater.inflate(R.layout.fragment_dynamic_dialog, container, false); AppCompatActivity activity = (AppCompatActivity) getActivity(); activity.setSupportActionBar(setToolbarTitle(view)); @@ -52,12 +52,29 @@ public abstract class DynamicDialogFragment extends DialogFragment { actionBar.setHomeAsUpIndicator(android.R.drawable.ic_menu_close_clear_cancel); } setHasOptionsMenu(true); - setContentFragment(); return view; } - //return super.onCreateView(inflater, container, savedInstanceState); - // Returns the saved view from Dialog Builder on large screens - return mDialogView; + // TODO: find a way to correct this + // Handle nasty bug: requestFeature() must be called before adding content + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { + // This returns null. No content will be loaded in dialog mode, but no errors either. + return super.onCreateView(inflater, container, savedInstanceState); + } + else { + // Returns the saved view from Dialog Builder on large screens + return mDialogView; + } + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + // Get the child fragment manager (and not the "main" one) + FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); + // Set the actual content of the fragment + transaction.replace(R.id.dynamic_fragment_content, mContentFragment); + // Commit the transaction instantly + transaction.commitNow(); } @Override @@ -67,7 +84,6 @@ public abstract class DynamicDialogFragment extends DialogFragment { LayoutInflater inflater = getActivity().getLayoutInflater(); // As it is a Dialog, the root ViewGroup can be null without issues @SuppressLint("InflateParams") final View view = inflater.inflate(R.layout.fragment_dynamic_dialog, null); - setToolbarTitle(view); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); Bundle args = getArguments(); // Pass null as the parent view because its going in the dialog layout @@ -94,7 +110,7 @@ public abstract class DynamicDialogFragment extends DialogFragment { } }); } - setContentFragment(); + setToolbarTitle(view); // Save the View so that it can returned by onCreateView // (otherwise it is null and it poses problems when committing child fragment transactions) mDialogView = view; @@ -163,17 +179,6 @@ public abstract class DynamicDialogFragment extends DialogFragment { super.onDestroyView(); } - private void setContentFragment() { - // Get the child fragment manager (and not the "normal" one) - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - - // Set the actual content of the fragment - transaction.replace(R.id.dynamic_fragment_content, mContentFragment); - - // Commit the transaction instantly - transaction.commitNow(); - } - /** Sets the title of the Fragment from the Tag */ private Toolbar setToolbarTitle(View view) { Toolbar toolbar = (Toolbar) view.findViewById(R.id.dialog_toolbar); diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormContentFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormContentFragment.java index f004884..d4d8d17 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormContentFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormContentFragment.java @@ -15,6 +15,7 @@ import com.wismna.geoffroy.donext.R; */ public class TaskFormContentFragment extends Fragment { + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormDialogFragment.java index d04f475..4120737 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TaskFormDialogFragment.java @@ -58,7 +58,6 @@ public class TaskFormDialogFragment extends DynamicDialogFragment { mContentFragment = new TaskFormContentFragment(); Bundle args = getArguments(); if (args != null) { - mIsLargeLayout = args.getBoolean("layout"); mHasNeutralButton = args.getBoolean("neutral"); } } @@ -96,7 +95,7 @@ public class TaskFormDialogFragment extends DynamicDialogFragment { } private void setTaskValues(View view) { - + if (view == null) return; // Populate spinner with task lists Spinner spinner = (Spinner) view.findViewById(R.id.new_task_list); // Create an ArrayAdapter using the string array and a default spinner layout diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java index fbfb7bb..6b6a6a4 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TasksFragment.java @@ -3,6 +3,7 @@ package com.wismna.geoffroy.donext.fragments; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.design.widget.Snackbar; @@ -54,7 +55,6 @@ public class TasksFragment extends Fragment implements private static final String TASK_LIST_ID = "task_list_id"; private long taskListId = -1; - private boolean mIsLargeLayout; private boolean isTodayView = true; private TaskRecyclerViewAdapter taskRecyclerViewAdapter; private View view; @@ -84,7 +84,6 @@ public class TasksFragment extends Fragment implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mIsLargeLayout = getResources().getBoolean(R.bool.large_layout); if (getArguments() != null) { taskListId = getArguments().getLong(TASK_LIST_ID); } @@ -121,10 +120,10 @@ public class TasksFragment extends Fragment implements new RecyclerItemClickListener(context, new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) { + boolean isLargeLayout = getResources().getBoolean(R.bool.large_layout); SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); Bundle args = new Bundle(); args.putInt("position", position); - args.putBoolean("layout", mIsLargeLayout); args.putBoolean("today", sharedPref.getBoolean("pref_conf_today_enable", false)); args.putBoolean("neutral", true); args.putString("button_positive", getString(R.string.new_task_save)); @@ -159,8 +158,9 @@ public class TasksFragment extends Fragment implements // Open the fragment as a dialog or as full-screen depending on screen size String title = getString(R.string.action_edit_task); - if (mIsLargeLayout) + if (isLargeLayout && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { taskDialogFragment.show(manager, title); + } else { // The device is smaller, so show the fragment fullscreen FragmentTransaction transaction = manager.beginTransaction(); diff --git a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java index 0de9cda..3d6c09b 100644 --- a/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java +++ b/DoNExt/app/src/main/java/com/wismna/geoffroy/donext/fragments/TodayFormDialogFragment.java @@ -45,20 +45,16 @@ public class TodayFormDialogFragment extends DynamicDialogFragment { return fragment; } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContentFragment = new TodayFormContentFragment(); // Load the tasks asynchronously new LoadTasks().execute(getActivity()); - Bundle args = getArguments(); - if (args != null) { - mIsLargeLayout = args.getBoolean("layout"); - } } private void setLayoutValues(View view, List tasks) { + if (view == null) return; EditText editText = (EditText) view.findViewById(R.id.today_search); final ListView listView = (ListView) view.findViewById(R.id.today_tasks); final TodayArrayAdapter adapter = new TodayArrayAdapter(getActivity(), tasks); diff --git a/DoNExt/app/src/main/res/layout/fragment_dynamic_dialog.xml b/DoNExt/app/src/main/res/layout/fragment_dynamic_dialog.xml index 740c212..c0a5da2 100644 --- a/DoNExt/app/src/main/res/layout/fragment_dynamic_dialog.xml +++ b/DoNExt/app/src/main/res/layout/fragment_dynamic_dialog.xml @@ -14,6 +14,12 @@ + android:layout_height="match_parent" > + + \ No newline at end of file diff --git a/DoNExt/app/src/main/res/values-fr/strings.xml b/DoNExt/app/src/main/res/values-fr/strings.xml index 0264681..b2eb8db 100644 --- a/DoNExt/app/src/main/res/values-fr/strings.xml +++ b/DoNExt/app/src/main/res/values-fr/strings.xml @@ -57,4 +57,5 @@ Rechercher… Choisissez des tâches Nom de la liste + Sorry, your Android version is not supported. \ No newline at end of file diff --git a/DoNExt/app/src/main/res/values/strings.xml b/DoNExt/app/src/main/res/values/strings.xml index dd5c9e0..74b8ec1 100644 --- a/DoNExt/app/src/main/res/values/strings.xml +++ b/DoNExt/app/src/main/res/values/strings.xml @@ -76,4 +76,5 @@ Search… Select tasks List name + Sorry, your Android version is not supported.