diff --git a/build.gradle b/build.gradle index e26cdee..2f2b9ca 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { - jcenter() + google() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:4.2.2' } } allprojects { repositories { - jcenter() + google() + mavenCentral() } } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..2521752 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,19 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0c71e76..c74df1e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/slideDateTimePicker/build.gradle b/slideDateTimePicker/build.gradle index f4b9504..ec2bedb 100644 --- a/slideDateTimePicker/build.gradle +++ b/slideDateTimePicker/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 30 + buildToolsVersion "23.0.3" defaultConfig { minSdkVersion 14 - targetSdkVersion 23 + targetSdkVersion 30 } buildTypes { @@ -15,8 +15,13 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - compile 'com.android.support:support-v4:23.1.1' + implementation 'androidx.appcompat:appcompat:1.3.0' } diff --git a/slideDateTimePicker/src/main/AndroidManifest.xml b/slideDateTimePicker/src/main/AndroidManifest.xml index 5500a7d..257b9d2 100644 --- a/slideDateTimePicker/src/main/AndroidManifest.xml +++ b/slideDateTimePicker/src/main/AndroidManifest.xml @@ -1,11 +1,3 @@ - - - - - + diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/CustomViewPager.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/CustomViewPager.java index b22af9a..ac935d8 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/CustomViewPager.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/CustomViewPager.java @@ -1,7 +1,6 @@ package com.github.jjobes.slidedatetimepicker; import android.content.Context; -import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; @@ -9,8 +8,10 @@ import android.widget.DatePicker; import android.widget.TimePicker; +import androidx.viewpager.widget.ViewPager; + /** - * A custom {@link android.support.v4.view.ViewPager} implementation that corrects + * A custom {@link ViewPager} implementation that corrects * the height of the ViewPager and also dispatches touch events to either the ViewPager * or the date or time picker depending on the direction of the swipe. * diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/DateFragment.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/DateFragment.java index a27140b..7c994d4 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/DateFragment.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/DateFragment.java @@ -4,13 +4,13 @@ import android.content.Context; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.DatePicker; -import android.widget.DatePicker.OnDateChangedListener; + +import androidx.fragment.app.Fragment; /** * The fragment for the first page in the ViewPager that holds @@ -21,17 +21,8 @@ */ public class DateFragment extends Fragment { - /** - * Used to communicate back to the parent fragment as the user - * is changing the date spinners so we can dynamically update - * the tab text. - */ - public interface DateChangedListener - { - void onDateChanged(int year, int month, int day); - } + public static final String DATE_FRAGMENT_KEY = "100"; - private DateChangedListener mCallback; private CustomDatePicker mDatePicker; public DateFragment() @@ -39,42 +30,19 @@ public DateFragment() // Required empty public constructor for fragment. } - /** - * Cast the reference to {@link SlideDateTimeDialogFragment} - * to a {@link DateChangedListener}. - */ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - try - { - mCallback = (DateChangedListener) getTargetFragment(); - } - catch (ClassCastException e) - { - throw new ClassCastException("Calling fragment must implement " + - "DateFragment.DateChangedListener interface"); - } - } - /** * Return an instance of DateFragment with its bundle filled with the * constructor arguments. The values in the bundle are retrieved in - * {@link #onCreateView()} below to properly initialize the DatePicker. - * - * @param theme - * @param year - * @param month - * @param day - * @param minDate - * @param maxDate - * @return an instance of DateFragment + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} below to properly initialize the DatePicker. */ - public static final DateFragment newInstance(int theme, int year, int month, - int day, Date minDate, Date maxDate) - { + public static DateFragment newInstance( + int theme, + int year, + int month, + int day, + Date minDate, + Date maxDate + ) { DateFragment f = new DateFragment(); Bundle b = new Bundle(); @@ -93,9 +61,12 @@ public static final DateFragment newInstance(int theme, int year, int month, * Create and return the user interface view for this fragment. */ @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) - { + public View onCreateView( + LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState + ) { + assert getArguments() != null; int theme = getArguments().getInt("theme"); int initialYear = getArguments().getInt("year"); int initialMonth = getArguments().getInt("month"); @@ -112,8 +83,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Context contextThemeWrapper = new ContextThemeWrapper( getActivity(), theme == SlideDateTimePicker.HOLO_DARK ? - android.R.style.Theme_Holo : - android.R.style.Theme_Holo_Light); + android.R.style.Theme_Holo : + android.R.style.Theme_Holo_Light); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); @@ -123,18 +94,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, // block keyboard popping up on touch mDatePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); mDatePicker.init( - initialYear, - initialMonth, - initialDay, - new OnDateChangedListener() { - - @Override - public void onDateChanged(DatePicker view, int year, - int monthOfYear, int dayOfMonth) - { - mCallback.onDateChanged(year, monthOfYear, dayOfMonth); - } - }); + initialYear, + initialMonth, + initialDay, + (view, year, monthOfYear, dayOfMonth) -> { + Bundle result = new Bundle(); + result.putInt("year", year); + result.putInt("monthOfYear", monthOfYear); + result.putInt("dayOfMonth", dayOfMonth); + getParentFragmentManager().setFragmentResult(DATE_FRAGMENT_KEY, result); + }); if (minDate != null) mDatePicker.setMinDate(minDate.getTime()); @@ -144,4 +113,4 @@ public void onDateChanged(DatePicker view, int year, return v; } -} +} \ No newline at end of file diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeDialogFragment.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeDialogFragment.java index 23a6f0c..13fddfd 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeDialogFragment.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeDialogFragment.java @@ -1,26 +1,26 @@ package com.github.jjobes.slidedatetimepicker; -import java.text.SimpleDateFormat; -import java.util.Calendar; -import java.util.Date; - import android.annotation.SuppressLint; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; -import android.support.v4.app.DialogFragment; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentPagerAdapter; import android.text.format.DateFormat; import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.Button; +import androidx.annotation.NonNull; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentPagerAdapter; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + /** *

The {@code DialogFragment} that contains the {@link SlidingTabLayout} * and {@link CustomViewPager}.

@@ -32,9 +32,7 @@ * @author jjobes * */ -public class SlideDateTimeDialogFragment extends DialogFragment implements DateFragment.DateChangedListener, - TimeFragment.TimeChangedListener -{ +public class SlideDateTimeDialogFragment extends DialogFragment { public static final String TAG_SLIDE_DATE_TIME_DIALOG_FRAGMENT = "tagSlideDateTimeDialogFragment"; private static SlideDateTimeListener mListener; @@ -55,13 +53,12 @@ public class SlideDateTimeDialogFragment extends DialogFragment implements DateF private boolean mIsClientSpecified24HourTime; private boolean mIs24HourTime; private Calendar mCalendar; - private int mDateFlags = + private final int mDateFlags = DateUtils.FORMAT_SHOW_WEEKDAY | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL; - public SlideDateTimeDialogFragment() - { + public SlideDateTimeDialogFragment() { // Required empty public constructor } @@ -70,21 +67,17 @@ public SlideDateTimeDialogFragment() * filled with the incoming arguments.

* *

Called by {@link SlideDateTimePicker#show()}.

- * - * @param listener - * @param initialDate - * @param minDate - * @param maxDate - * @param isClientSpecified24HourTime - * @param is24HourTime - * @param theme - * @param indicatorColor - * @return */ - public static SlideDateTimeDialogFragment newInstance(SlideDateTimeListener listener, - Date initialDate, Date minDate, Date maxDate, boolean isClientSpecified24HourTime, - boolean is24HourTime, int theme, int indicatorColor) - { + public static SlideDateTimeDialogFragment newInstance( + SlideDateTimeListener listener, + Date initialDate, + Date minDate, + Date maxDate, + boolean isClientSpecified24HourTime, + boolean is24HourTime, + int theme, + int indicatorColor + ) { mListener = listener; // Create a new instance of SlideDateTimeDialogFragment @@ -106,11 +99,10 @@ public static SlideDateTimeDialogFragment newInstance(SlideDateTimeListener list } @Override - public void onAttach(Activity activity) - { - super.onAttach(activity); + public void onAttach(@NonNull Context context) { + super.onAttach(context); - mContext = activity; + mContext = context; } @Override @@ -125,15 +117,10 @@ public void onCreate(Bundle savedInstanceState) mCalendar = Calendar.getInstance(); mCalendar.setTime(mInitialDate); - switch (mTheme) - { - case SlideDateTimePicker.HOLO_DARK: + if (mTheme == SlideDateTimePicker.HOLO_DARK) { setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Dialog_NoActionBar); - break; - case SlideDateTimePicker.HOLO_LIGHT: - setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog_NoActionBar); - break; - default: // if no theme was specified, default to holo light + } else { + // if HOLO_LIGHT or no theme was specified, default to holo light setStyle(DialogFragment.STYLE_NO_TITLE, android.R.style.Theme_Holo_Light_Dialog_NoActionBar); } } @@ -163,6 +150,9 @@ public void onDestroyView() getDialog().setDismissMessage(null); } + getChildFragmentManager().clearFragmentResult("111"); + getChildFragmentManager().clearFragmentResult("222"); + super.onDestroyView(); } @@ -170,6 +160,7 @@ private void unpackBundle() { Bundle args = getArguments(); + assert args != null; mInitialDate = (Date) args.getSerializable("initialDate"); mMinDate = (Date) args.getSerializable("minDate"); mMaxDate = (Date) args.getSerializable("maxDate"); @@ -217,6 +208,37 @@ private void customizeViews() private void initViewPager() { + /** + *

The callback used by the DatePicker to update {@code mCalendar} as + * the user changes the date. Each time this is called, we also update + * the text on the date tab to reflect the date the user has currenly + * selected.

+ */ + getChildFragmentManager() + .setFragmentResultListener(DateFragment.DATE_FRAGMENT_KEY, getViewLifecycleOwner(), (requestKey, result) -> { + mCalendar.set( + result.getInt("year"), + result.getInt("monthOfYear"), + result.getInt("dayOfMonth") + ); + + updateDateTab(); + }); + + /** + *

The callback used by the TimePicker to update {@code mCalendar} as + * the user changes the time. Each time this is called, we also update + * the text on the time tab to reflect the time the user has currenly + * selected.

+ */ + getChildFragmentManager() + .setFragmentResultListener(TimeFragment.TIME_FRAGMENT_KEY, getViewLifecycleOwner(), (requestKey, result) -> { + mCalendar.set(Calendar.HOUR_OF_DAY, result.getInt("hourOfDay")); + mCalendar.set(Calendar.MINUTE, result.getInt("minute")); + + updateTimeTab(); + }); + mViewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager()); mViewPager.setAdapter(mViewPagerAdapter); @@ -237,74 +259,29 @@ private void initTabs() private void initButtons() { - mOkButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) + mOkButton.setOnClickListener(v -> { + if (mListener == null) { - if (mListener == null) - { - throw new NullPointerException( - "Listener no longer exists for mOkButton"); - } + throw new NullPointerException( + "Listener no longer exists for mOkButton"); + } - mListener.onDateTimeSet(new Date(mCalendar.getTimeInMillis())); + mListener.onDateTimeSet(new Date(mCalendar.getTimeInMillis())); - dismiss(); - } + dismiss(); }); - mCancelButton.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) + mCancelButton.setOnClickListener(v -> { + if (mListener == null) { - if (mListener == null) - { - throw new NullPointerException( - "Listener no longer exists for mCancelButton"); - } - - mListener.onDateTimeCancel(); - - dismiss(); + throw new NullPointerException( + "Listener no longer exists for mCancelButton"); } - }); - } - - /** - *

The callback used by the DatePicker to update {@code mCalendar} as - * the user changes the date. Each time this is called, we also update - * the text on the date tab to reflect the date the user has currenly - * selected.

- * - *

Implements the {@link DateFragment.DateChangedListener} - * interface.

- */ - @Override - public void onDateChanged(int year, int month, int day) - { - mCalendar.set(year, month, day); - updateDateTab(); - } - - /** - *

The callback used by the TimePicker to update {@code mCalendar} as - * the user changes the time. Each time this is called, we also update - * the text on the time tab to reflect the time the user has currenly - * selected.

- * - *

Implements the {@link TimeFragment.TimeChangedListener} - * interface.

- */ - @Override - public void onTimeChanged(int hour, int minute) - { - mCalendar.set(Calendar.HOUR_OF_DAY, hour); - mCalendar.set(Calendar.MINUTE, minute); + mListener.onDateTimeCancel(); - updateTimeTab(); + dismiss(); + }); } private void updateDateTab() @@ -346,7 +323,7 @@ private void updateTimeTab() * event handler.

*/ @Override - public void onCancel(DialogInterface dialog) + public void onCancel(@NonNull DialogInterface dialog) { super.onCancel(dialog); @@ -366,32 +343,24 @@ public ViewPagerAdapter(FragmentManager fm) super(fm); } + @NonNull @Override - public Fragment getItem(int position) - { - switch (position) - { - case 0: - DateFragment dateFragment = DateFragment.newInstance( - mTheme, - mCalendar.get(Calendar.YEAR), - mCalendar.get(Calendar.MONTH), - mCalendar.get(Calendar.DAY_OF_MONTH), - mMinDate, - mMaxDate); - dateFragment.setTargetFragment(SlideDateTimeDialogFragment.this, 100); - return dateFragment; - case 1: - TimeFragment timeFragment = TimeFragment.newInstance( - mTheme, - mCalendar.get(Calendar.HOUR_OF_DAY), - mCalendar.get(Calendar.MINUTE), - mIsClientSpecified24HourTime, - mIs24HourTime); - timeFragment.setTargetFragment(SlideDateTimeDialogFragment.this, 200); - return timeFragment; - default: - return null; + public Fragment getItem(int position) { + if (position == 0) { + return DateFragment.newInstance( + mTheme, + mCalendar.get(Calendar.YEAR), + mCalendar.get(Calendar.MONTH), + mCalendar.get(Calendar.DAY_OF_MONTH), + mMinDate, + mMaxDate); + } else { + return TimeFragment.newInstance( + mTheme, + mCalendar.get(Calendar.HOUR_OF_DAY), + mCalendar.get(Calendar.MINUTE), + mIsClientSpecified24HourTime, + mIs24HourTime); } } diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeListener.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeListener.java index d9d675c..ffcd241 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeListener.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimeListener.java @@ -31,8 +31,5 @@ public abstract class SlideDateTimeListener * the dialog or pressing the Back button. * This override is optional. */ - public void onDateTimeCancel() - { - - } + public void onDateTimeCancel() {} } diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimePicker.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimePicker.java index 2803835..763a220 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimePicker.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlideDateTimePicker.java @@ -1,10 +1,10 @@ package com.github.jjobes.slidedatetimepicker; -import java.util.Date; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentTransaction; +import java.util.Date; /** *

This class contains methods for the library client to create @@ -155,7 +155,7 @@ public void setIndicatorColor(int indicatorColor) /** * Shows the dialog to the user. Make sure to call - * {@link #setListener()} before calling this. + * {@link #setListener(SlideDateTimeListener)} before calling this. */ public void show() { diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabLayout.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabLayout.java index 14e102d..97d2ab5 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabLayout.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabLayout.java @@ -21,8 +21,6 @@ import android.content.Context; import android.graphics.Typeface; import android.os.Build; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.util.SparseArray; import android.util.TypedValue; @@ -32,12 +30,15 @@ import android.widget.HorizontalScrollView; import android.widget.TextView; +import androidx.viewpager.widget.PagerAdapter; +import androidx.viewpager.widget.ViewPager; + /** * To be used with ViewPager to provide a tab indicator component which give constant feedback as to * the user's scroll progress. *

* To use the component, simply add it to your view hierarchy. Then in your - * {@link android.app.Activity} or {@link android.support.v4.app.Fragment} call + * {@link android.app.Activity} or {@link androidx.fragment.app.Fragment} call * {@link #setViewPager(ViewPager)} providing it the ViewPager this layout is being used for. *

* The colors can be customized in two ways. The first and simplest is to provide an array of colors diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabStrip.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabStrip.java index 7975d81..ef7f78c 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabStrip.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/SlidingTabStrip.java @@ -18,7 +18,6 @@ //package com.example.android.common.view; -import android.R; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; @@ -67,7 +66,7 @@ class SlidingTabStrip extends LinearLayout { final float density = getResources().getDisplayMetrics().density; TypedValue outValue = new TypedValue(); - context.getTheme().resolveAttribute(R.attr.colorForeground, outValue, true); + context.getTheme().resolveAttribute(android.R.attr.colorForeground, outValue, true); final int themeForegroundColor = outValue.data; mDefaultBottomBorderColor = setColorAlpha(themeForegroundColor, diff --git a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/TimeFragment.java b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/TimeFragment.java index 89a38a2..c612e99 100644 --- a/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/TimeFragment.java +++ b/slideDateTimePicker/src/main/java/com/github/jjobes/slidedatetimepicker/TimeFragment.java @@ -3,7 +3,6 @@ import android.content.Context; import android.os.Build; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.text.format.DateFormat; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -11,9 +10,10 @@ import android.view.ViewGroup; import android.widget.DatePicker; import android.widget.NumberPicker; -import android.widget.NumberPicker.OnValueChangeListener; import android.widget.TimePicker; +import androidx.fragment.app.Fragment; + /** * The fragment for the second page in the ViewPager that holds * the TimePicker. @@ -23,59 +23,26 @@ */ public class TimeFragment extends Fragment { - /** - * Used to communicate back to the parent fragment as the user - * is changing the time spinners so we can dynamically update - * the tab text. - */ - public interface TimeChangedListener - { - void onTimeChanged(int hour, int minute); - } + public static final String TIME_FRAGMENT_KEY = "200"; - private TimeChangedListener mCallback; private TimePicker mTimePicker; - public TimeFragment() - { + public TimeFragment() { // Required empty public constructor for fragment. } - /** - * Cast the reference to {@link SlideDateTimeDialogFragment} to a - * {@link TimeChangedListener}. - */ - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - try - { - mCallback = (TimeChangedListener) getTargetFragment(); - } - catch (ClassCastException e) - { - throw new ClassCastException("Calling fragment must implement " + - "TimeFragment.TimeChangedListener interface"); - } - } - /** * Return an instance of TimeFragment with its bundle filled with the * constructor arguments. The values in the bundle are retrieved in - * {@link #onCreateView()} below to properly initialize the TimePicker. - * - * @param theme - * @param hour - * @param minute - * @param isClientSpecified24HourTime - * @param is24HourTime - * @return + * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)} below to properly initialize the TimePicker. */ - public static final TimeFragment newInstance(int theme, int hour, int minute, - boolean isClientSpecified24HourTime, boolean is24HourTime) - { + public static TimeFragment newInstance( + int theme, + int hour, + int minute, + boolean isClientSpecified24HourTime, + boolean is24HourTime + ) { TimeFragment f = new TimeFragment(); Bundle b = new Bundle(); @@ -93,9 +60,12 @@ public static final TimeFragment newInstance(int theme, int hour, int minute, * Create and return the user interface view for this fragment. */ @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) - { + public View onCreateView( + LayoutInflater inflater, + ViewGroup container, + Bundle savedInstanceState + ) { + assert getArguments() != null; int theme = getArguments().getInt("theme"); int initialHour = getArguments().getInt("hour"); int initialMinute = getArguments().getInt("minute"); @@ -111,8 +81,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Context contextThemeWrapper = new ContextThemeWrapper( getActivity(), theme == SlideDateTimePicker.HOLO_DARK ? - android.R.style.Theme_Holo : - android.R.style.Theme_Holo_Light); + android.R.style.Theme_Holo : + android.R.style.Theme_Holo_Light); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); @@ -121,13 +91,11 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, mTimePicker = (TimePicker) v.findViewById(R.id.timePicker); // block keyboard popping up on touch mTimePicker.setDescendantFocusability(DatePicker.FOCUS_BLOCK_DESCENDANTS); - mTimePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() { - - @Override - public void onTimeChanged(TimePicker view, int hourOfDay, int minute) - { - mCallback.onTimeChanged(hourOfDay, minute); - } + mTimePicker.setOnTimeChangedListener((view, hourOfDay, minute) -> { + Bundle result = new Bundle(); + result.putInt("hourOfDay", hourOfDay); + result.putInt("minute", minute); + getParentFragmentManager().setFragmentResult(TIME_FRAGMENT_KEY, result); }); // If the client specifies a 24-hour time format, set it on @@ -140,8 +108,7 @@ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // If the client does not specify a 24-hour time format, use the // device default. - mTimePicker.setIs24HourView(DateFormat.is24HourFormat( - getTargetFragment().getActivity())); + mTimePicker.setIs24HourView(DateFormat.is24HourFormat(requireActivity())); } mTimePicker.setCurrentHour(initialHour); @@ -150,7 +117,7 @@ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) // Fix for the bug where a TimePicker's onTimeChanged() is not called when // the user toggles the AM/PM button. Only applies to 4.0.0 and 4.0.3. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && - Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) + Build.VERSION.SDK_INT <= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { fixTimePickerBug18982(); } @@ -174,27 +141,23 @@ private void fixTimePickerBug18982() if (amPmView instanceof NumberPicker) { - ((NumberPicker) amPmView).setOnValueChangedListener(new OnValueChangeListener() { - - @Override - public void onValueChange(NumberPicker picker, int oldVal, int newVal) + ((NumberPicker) amPmView).setOnValueChangedListener((picker, oldVal, newVal) -> { + if (picker.getValue() == 1) // PM { - if (picker.getValue() == 1) // PM - { - if (mTimePicker.getCurrentHour() < 12) - mTimePicker.setCurrentHour(mTimePicker.getCurrentHour() + 12); - } - else // AM - { - if (mTimePicker.getCurrentHour() >= 12) - mTimePicker.setCurrentHour(mTimePicker.getCurrentHour() - 12); - } - - mCallback.onTimeChanged( - mTimePicker.getCurrentHour(), - mTimePicker.getCurrentMinute()); + if (mTimePicker.getCurrentHour() < 12) + mTimePicker.setCurrentHour(mTimePicker.getCurrentHour() + 12); } + else // AM + { + if (mTimePicker.getCurrentHour() >= 12) + mTimePicker.setCurrentHour(mTimePicker.getCurrentHour() - 12); + } + + Bundle result = new Bundle(); + result.putInt("hourOfDay", mTimePicker.getCurrentHour()); + result.putInt("minute", mTimePicker.getCurrentMinute()); + getParentFragmentManager().setFragmentResult("222", result); }); } } -} +} \ No newline at end of file diff --git a/slideDateTimePickerSample/build.gradle b/slideDateTimePickerSample/build.gradle index dcb6e3d..01b4b39 100644 --- a/slideDateTimePickerSample/build.gradle +++ b/slideDateTimePickerSample/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "23.0.2" + compileSdkVersion 30 + buildToolsVersion "23.0.3" defaultConfig { applicationId "com.github.jjobes.slidedatetimepicker.sample" minSdkVersion 14 - targetSdkVersion 23 + targetSdkVersion 30 } buildTypes { @@ -19,6 +19,6 @@ android { } dependencies { - compile project(':slideDateTimePicker') - compile 'com.android.support:support-v4:23.1.1' + implementation project(':slideDateTimePicker') + implementation 'androidx.appcompat:appcompat:1.3.0' } diff --git a/slideDateTimePickerSample/src/main/AndroidManifest.xml b/slideDateTimePickerSample/src/main/AndroidManifest.xml index f2082cf..9eccde7 100644 --- a/slideDateTimePickerSample/src/main/AndroidManifest.xml +++ b/slideDateTimePickerSample/src/main/AndroidManifest.xml @@ -6,10 +6,6 @@ android:versionCode="1" android:versionName="1.0" > - -