diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt index 5d97c7c1c5a9..c97d5be30587 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt @@ -20,85 +20,57 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -package com.owncloud.android.ui.dialog; - - -import android.app.DatePickerDialog; -import android.app.Dialog; -import android.os.Bundle; -import android.text.format.DateUtils; -import android.widget.DatePicker; - -import com.google.android.material.button.MaterialButton; -import com.nextcloud.client.di.Injectable; -import com.owncloud.android.R; -import com.owncloud.android.utils.theme.ViewThemeUtils; - -import java.util.Calendar; - -import javax.inject.Inject; - -import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; +package com.owncloud.android.ui.dialog + +import android.app.DatePickerDialog +import android.app.DatePickerDialog.OnDateSetListener +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import android.text.format.DateUtils +import android.widget.DatePicker +import androidx.fragment.app.DialogFragment +import com.google.android.material.button.MaterialButton +import com.nextcloud.client.di.Injectable +import com.owncloud.android.R +import com.owncloud.android.utils.theme.ViewThemeUtils +import java.util.Calendar +import javax.inject.Inject /** * Dialog requesting a date after today. */ -public class ExpirationDatePickerDialogFragment - extends DialogFragment - implements DatePickerDialog.OnDateSetListener, Injectable { +class ExpirationDatePickerDialogFragment : DialogFragment(), OnDateSetListener, Injectable { - /** Tag for FragmentsManager */ - public static final String DATE_PICKER_DIALOG = "DATE_PICKER_DIALOG"; + @JvmField + @Inject + var viewThemeUtils: ViewThemeUtils? = null - /** Parameter constant for date chosen initially */ - private static final String ARG_CHOSEN_DATE_IN_MILLIS = "CHOSEN_DATE_IN_MILLIS"; + private var onExpiryDateListener: OnExpiryDateListener? = null - @Inject ViewThemeUtils viewThemeUtils; - private OnExpiryDateListener onExpiryDateListener; - - /** - * Factory method to create new instances - * - * @param chosenDateInMillis Date chosen when the dialog appears - * @return New dialog instance - */ - public static ExpirationDatePickerDialogFragment newInstance(long chosenDateInMillis) { - Bundle arguments = new Bundle(); - arguments.putLong(ARG_CHOSEN_DATE_IN_MILLIS, chosenDateInMillis); - - ExpirationDatePickerDialogFragment dialog = new ExpirationDatePickerDialogFragment(); - dialog.setArguments(arguments); - return dialog; + fun setOnExpiryDateListener(onExpiryDateListener: OnExpiryDateListener?) { + this.onExpiryDateListener = onExpiryDateListener } - public void setOnExpiryDateListener(OnExpiryDateListener onExpiryDateListener) { - this.onExpiryDateListener = onExpiryDateListener; - } + override fun onStart() { + super.onStart() - - @Override - public void onStart() { - super.onStart(); - final Dialog currentDialog = getDialog(); + val currentDialog = dialog if (currentDialog != null) { - final DatePickerDialog dialog = (DatePickerDialog) currentDialog; + val dialog = currentDialog as DatePickerDialog - MaterialButton positiveButton = (MaterialButton) dialog.getButton(DatePickerDialog.BUTTON_POSITIVE); + val positiveButton = dialog.getButton(DatePickerDialog.BUTTON_POSITIVE) as MaterialButton? if (positiveButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryTonal(positiveButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryTonal(positiveButton) } - - MaterialButton negativeButton = (MaterialButton) dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE); + val negativeButton = dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE) as MaterialButton? if (negativeButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(negativeButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(negativeButton) } - - MaterialButton neutralButton = (MaterialButton) dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL); + val neutralButton = dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL) as MaterialButton? if (neutralButton != null) { - viewThemeUtils.material.colorMaterialButtonPrimaryBorderless(neutralButton); + viewThemeUtils?.material?.colorMaterialButtonPrimaryBorderless(neutralButton) } } } @@ -108,59 +80,55 @@ public class ExpirationDatePickerDialogFragment * * @return A new dialog to let the user choose an expiration date that will be bound to a share link. */ - @Override - @NonNull - public Dialog onCreateDialog(Bundle savedInstanceState) { - + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { // Chosen date received as an argument must be later than tomorrow ; default to tomorrow in other case - final Calendar chosenDate = Calendar.getInstance(); - long tomorrowInMillis = chosenDate.getTimeInMillis() + DateUtils.DAY_IN_MILLIS; - long chosenDateInMillis = requireArguments().getLong(ARG_CHOSEN_DATE_IN_MILLIS); - chosenDate.setTimeInMillis(Math.max(chosenDateInMillis, tomorrowInMillis)); + val chosenDate = Calendar.getInstance() + val tomorrowInMillis = chosenDate.timeInMillis + DateUtils.DAY_IN_MILLIS + val chosenDateInMillis = requireArguments().getLong(ARG_CHOSEN_DATE_IN_MILLIS) + chosenDate.timeInMillis = chosenDateInMillis.coerceAtLeast(tomorrowInMillis) // Create a new instance of DatePickerDialog - DatePickerDialog dialog = new DatePickerDialog( + val dialog = DatePickerDialog( requireActivity(), R.style.FallbackDatePickerDialogTheme, this, - chosenDate.get(Calendar.YEAR), - chosenDate.get(Calendar.MONTH), - chosenDate.get(Calendar.DAY_OF_MONTH) - ); + chosenDate[Calendar.YEAR], + chosenDate[Calendar.MONTH], + chosenDate[Calendar.DAY_OF_MONTH] + ) - //show unset button only when date is already selected + // show unset button only when date is already selected if (chosenDateInMillis > 0) { dialog.setButton( Dialog.BUTTON_NEGATIVE, - getText(R.string.share_via_link_unset_password), - (dialog1, which) -> { - if (onExpiryDateListener != null) { - onExpiryDateListener.onDateUnSet(); - } - }); + getText(R.string.share_via_link_unset_password) + ) { _: DialogInterface?, _: Int -> + onExpiryDateListener?.onDateUnSet() + } } // Prevent days in the past may be chosen - DatePicker picker = dialog.getDatePicker(); - picker.setMinDate(tomorrowInMillis - 1000); + val picker = dialog.datePicker + picker.minDate = tomorrowInMillis - 1000 // Enforce spinners view; ignored by MD-based theme in Android >=5, but calendar is REALLY buggy // in Android < 5, so let's be sure it never appears (in tablets both spinners and calendar are // shown by default) - picker.setCalendarViewShown(false); - - return dialog; + @Suppress("DEPRECATION") + picker.calendarViewShown = false + 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()); + val currentSelectionMillis: Long + get() { + val dialog = dialog + if (dialog != null) { + val datePickerDialog = dialog as DatePickerDialog + val picker = datePickerDialog.datePicker + return yearMonthDayToMillis(picker.year, picker.month, picker.dayOfMonth) + } + return 0 } - return 0; - } /** * Called when the user chooses an expiration date. @@ -170,27 +138,45 @@ public class ExpirationDatePickerDialogFragment * @param monthOfYear Month of the date chosen [0, 11] * @param dayOfMonth Day of the date chosen */ - @Override - public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { - - long chosenDateInMillis = yearMonthDayToMillis(year, monthOfYear, dayOfMonth); - + override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int, dayOfMonth: Int) { + val chosenDateInMillis = yearMonthDayToMillis(year, monthOfYear, dayOfMonth) if (onExpiryDateListener != null) { - onExpiryDateListener.onDateSet(year, monthOfYear, dayOfMonth, chosenDateInMillis); + 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(); + private fun yearMonthDayToMillis(year: Int, monthOfYear: Int, dayOfMonth: Int): Long { + val date = Calendar.getInstance() + date[Calendar.YEAR] = year + date[Calendar.MONTH] = monthOfYear + date[Calendar.DAY_OF_MONTH] = dayOfMonth + return date.timeInMillis } - public interface OnExpiryDateListener { - void onDateSet(int year, int monthOfYear, int dayOfMonth, long chosenDateInMillis); + interface OnExpiryDateListener { + fun onDateSet(year: Int, monthOfYear: Int, dayOfMonth: Int, chosenDateInMillis: Long) + fun onDateUnSet() + } - void onDateUnSet(); + companion object { + /** Tag for FragmentsManager */ + const val DATE_PICKER_DIALOG = "DATE_PICKER_DIALOG" + + /** Parameter constant for date chosen initially */ + private const val ARG_CHOSEN_DATE_IN_MILLIS = "CHOSEN_DATE_IN_MILLIS" + + /** + * Factory method to create new instances + * + * @param chosenDateInMillis Date chosen when the dialog appears + * @return New dialog instance + */ + fun newInstance(chosenDateInMillis: Long): ExpirationDatePickerDialogFragment { + val arguments = Bundle() + arguments.putLong(ARG_CHOSEN_DATE_IN_MILLIS, chosenDateInMillis) + val dialog = ExpirationDatePickerDialogFragment() + dialog.arguments = arguments + return dialog + } } }