Przeglądaj źródła

Merge pull request #10128 from nextcloud/fix/calendar-picker-rotation

Fix expiration date picker layout when rotating screen
Álvaro Brey 3 lat temu
rodzic
commit
e33e801bd8

+ 32 - 10
app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java

@@ -76,6 +76,19 @@ public class ExpirationDatePickerDialogFragment
         this.onExpiryDateListener = onExpiryDateListener;
     }
 
+
+    @Override
+    public void onStart() {
+        super.onStart();
+        final Dialog currentDialog = getDialog();
+        if (currentDialog != null) {
+            final DatePickerDialog dialog = (DatePickerDialog) currentDialog;
+            dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+            dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+            dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+        }
+    }
+
     /**
      * {@inheritDoc}
      *
@@ -113,11 +126,6 @@ public class ExpirationDatePickerDialogFragment
                 });
         }
 
-        dialog.show();
-        dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL).setTextColor(themeColorUtils.primaryColor(getContext(), true));
-        dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
-        dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
-
         // Prevent days in the past may be chosen
         DatePicker picker = dialog.getDatePicker();
         picker.setMinDate(tomorrowInMillis - 1000);
@@ -130,6 +138,16 @@ public class ExpirationDatePickerDialogFragment
         return dialog;
     }
 
+    public long getCurrentSelectionMillis() {
+        final Dialog dialog = getDialog();
+        if (dialog != null) {
+            final DatePickerDialog datePickerDialog = (DatePickerDialog) dialog;
+            final DatePicker picker = datePickerDialog.getDatePicker();
+            return yearMonthDayToMillis(picker.getYear(), picker.getMonth(), picker.getDayOfMonth());
+        }
+        return 0;
+    }
+
     /**
      * Called when the user chooses an expiration date.
      *
@@ -141,17 +159,21 @@ public class ExpirationDatePickerDialogFragment
     @Override
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
 
-        Calendar chosenDate = Calendar.getInstance();
-        chosenDate.set(Calendar.YEAR, year);
-        chosenDate.set(Calendar.MONTH, monthOfYear);
-        chosenDate.set(Calendar.DAY_OF_MONTH, dayOfMonth);
-        long chosenDateInMillis = chosenDate.getTimeInMillis();
+        long chosenDateInMillis = yearMonthDayToMillis(year, monthOfYear, dayOfMonth);
 
         if (onExpiryDateListener != null) {
             onExpiryDateListener.onDateSet(year, monthOfYear, dayOfMonth, chosenDateInMillis);
         }
     }
 
+    private long yearMonthDayToMillis(int year, int monthOfYear, int dayOfMonth) {
+        Calendar date = Calendar.getInstance();
+        date.set(Calendar.YEAR, year);
+        date.set(Calendar.MONTH, monthOfYear);
+        date.set(Calendar.DAY_OF_MONTH, dayOfMonth);
+        return date.getTimeInMillis();
+    }
+
     public interface OnExpiryDateListener {
         void onDateSet(int year, int monthOfYear, int dayOfMonth, long chosenDateInMillis);
 

+ 21 - 4
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt

@@ -22,6 +22,7 @@
 package com.owncloud.android.ui.fragment
 
 import android.content.Context
+import android.content.res.Configuration
 import android.os.Bundle
 import android.text.TextUtils
 import android.view.LayoutInflater
@@ -116,6 +117,8 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
     private var isReshareShown: Boolean = true // show or hide reshare option
     private var isExpDateShown: Boolean = true // show or hide expiry date option
 
+    private var expirationDatePickerFragment: ExpirationDatePickerDialogFragment? = null
+
     override fun onAttach(context: Context) {
         super.onAttach(context)
         try {
@@ -160,6 +163,19 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
         implementClickEvents()
     }
 
+    override fun onConfigurationChanged(newConfig: Configuration) {
+        super.onConfigurationChanged(newConfig)
+        // Force recreation of dialog fragment when screen rotates
+        // This is needed because the calendar layout should be different in portrait and landscape,
+        // but as FDA persists through config changes, the dialog is not recreated automatically
+        val datePicker = expirationDatePickerFragment
+        if (datePicker?.dialog?.isShowing == true) {
+            val currentSelectionMillis = datePicker.currentSelectionMillis
+            datePicker.dismiss()
+            showExpirationDateDialog(currentSelectionMillis)
+        }
+    }
+
     private fun showShareProcessFirst() {
         binding.shareProcessGroupOne.visibility = View.VISIBLE
         binding.shareProcessEditShareLink.visibility = View.VISIBLE
@@ -347,12 +363,13 @@ class FileDetailsSharingProcessFragment : Fragment(), ExpirationDatePickerDialog
         }
     }
 
-    private fun showExpirationDateDialog() {
-        val dialog = ExpirationDatePickerDialogFragment.newInstance(chosenExpDateInMills)
+    private fun showExpirationDateDialog(chosenDateInMillis: Long = chosenExpDateInMills) {
+        val dialog = ExpirationDatePickerDialogFragment.newInstance(chosenDateInMillis)
         dialog.setOnExpiryDateListener(this)
-        fileActivity?.let { it1 ->
+        expirationDatePickerFragment = dialog
+        fileActivity?.let {
             dialog.show(
-                it1.supportFragmentManager,
+                it.supportFragmentManager,
                 ExpirationDatePickerDialogFragment.DATE_PICKER_DIALOG
             )
         }