Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd17a9eb authored by Fan Zhang's avatar Fan Zhang
Browse files

Remove PreL/PostL implementation of AlarmClockFragment.

Bug: 17425204

Created a TimePickerCompat that displays either post-L version
TimePickerFragment or pre-L version, and always retains callback via
setTargetFragment in order to survive screen rotation.

This makes the inheritance chain shorter for alarm related fragments,
and encapsulates the display logic for timer picker.

Change-Id: I6951305854f61221cca72805922a427c01d7320d
parent 366be583
Loading
Loading
Loading
Loading
+17 −10
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.text.format.DateFormat;
import android.transition.AutoTransition;
import android.transition.Fade;
import android.transition.Transition;
@@ -67,6 +68,8 @@ import android.widget.TextView;
import android.widget.Toast;

import com.android.deskclock.alarms.AlarmStateManager;
import com.android.deskclock.alarms.TimePickerCompat;
import com.android.deskclock.alarms.TimePickerCompat.OnTimeSetListener;
import com.android.deskclock.events.Events;
import com.android.deskclock.provider.Alarm;
import com.android.deskclock.provider.AlarmInstance;
@@ -80,8 +83,8 @@ import java.util.HashSet;
/**
 * AlarmClock application.
 */
public abstract class AlarmClockFragment extends DeskClockFragment implements
        LoaderManager.LoaderCallbacks<Cursor>, View.OnTouchListener {
public final class AlarmClockFragment extends DeskClockFragment implements
        LoaderManager.LoaderCallbacks<Cursor>, View.OnTouchListener, OnTimeSetListener {
    private static final float EXPAND_DECELERATION = 1f;
    private static final float COLLAPSE_DECELERATION = 0.7f;

@@ -143,12 +146,8 @@ public abstract class AlarmClockFragment extends DeskClockFragment implements
    private Transition mRepeatTransition;
    private Transition mEmptyViewTransition;

    // Abstract methods to to be overridden by for post- and pre-L implementations as necessary
    protected abstract void setTimePickerListener();
    protected abstract void showTimeEditDialog(Alarm alarm);
    protected abstract void startCreatingAlarm();

    protected void processTimeSet(int hourOfDay, int minute) {
    @Override
    public void processTimeSet(int hourOfDay, int minute) {
        if (mSelectedAlarm == null) {
            // If mSelectedAlarm is null then we're creating a new alarm.
            Alarm a = new Alarm();
@@ -320,8 +319,6 @@ public abstract class AlarmClockFragment extends DeskClockFragment implements
            // Remove the SCROLL_TO_ALARM extra now that we've processed it.
            intent.removeExtra(SCROLL_TO_ALARM_INTENT_EXTRA);
        }

        setTimePickerListener();
    }

    private void hideUndoBar(boolean animate, MotionEvent event) {
@@ -1634,4 +1631,14 @@ public abstract class AlarmClockFragment extends DeskClockFragment implements
        mLeftButton.setVisibility(View.INVISIBLE);
        mRightButton.setVisibility(View.INVISIBLE);
    }

    private void showTimeEditDialog(Alarm alarm) {
        TimePickerCompat.showTimeEditDialog(this, alarm, DateFormat.is24HourFormat(getActivity()));
    }

    private void startCreatingAlarm() {
        mSelectedAlarm = null;
        TimePickerCompat.showTimeEditDialog(this, null /* alarm */,
                DateFormat.is24HourFormat(getActivity()));
    }
}
+0 −37
Original line number Diff line number Diff line
package com.android.deskclock;

import android.app.TimePickerDialog;
import android.widget.TimePicker;

import com.android.deskclock.provider.Alarm;

/**
 * AlarmClockFragment for L+ devices
 */
public class AlarmClockFragmentPostL extends AlarmClockFragment implements
        TimePickerDialog.OnTimeSetListener {

    // Callback used by TimePickerDialog
    @Override
    public void onTimeSet(TimePicker timePicker, int hourOfDay, int minute) {
        processTimeSet(hourOfDay, minute);
    }

    @Override
    protected void setTimePickerListener() {
        // Do nothing
    }

    @Override
    protected void startCreatingAlarm() {
        // Set the "selected" alarm as null, and we'll create the new one when the timepicker
        // comes back.
        mSelectedAlarm = null;
        AlarmUtils.showTimeEditDialog(this, null);
    }

    @Override
    protected void showTimeEditDialog(Alarm alarm) {
        AlarmUtils.showTimeEditDialog(AlarmClockFragmentPostL.this, alarm);
    }
}
+0 −48
Original line number Diff line number Diff line
package com.android.deskclock;

import android.text.format.DateFormat;

import com.android.datetimepicker.time.RadialPickerLayout;
import com.android.datetimepicker.time.TimePickerDialog;
import com.android.deskclock.provider.Alarm;

/**
 * AlarmClockFragment for pre-L devices
 */
public class AlarmClockFragmentPreL extends AlarmClockFragment implements
        TimePickerDialog.OnTimeSetListener {

    @Override
    public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
        processTimeSet(hourOfDay, minute);
    }

    @Override
    protected void setTimePickerListener() {
        // Make sure to use the child FragmentManager. We have to use that one for the
        // case where an intent comes in telling the activity to load the timepicker,
        // which means we have to use that one everywhere so that the fragment can get
        // correctly picked up here if it's open.
        final TimePickerDialog tpd = (TimePickerDialog) getChildFragmentManager()
                .findFragmentByTag(AlarmUtils.FRAG_TAG_TIME_PICKER);
        if (tpd != null) {
            // The dialog is already open so we need to set the listener again.
            tpd.setOnTimeSetListener(this);
        }
    }

    @Override
    protected void startCreatingAlarm() {
        // Set the "selected" alarm as null, and we'll create the new one when the timepicker
        // comes back.
        mSelectedAlarm = null;
        AlarmUtils.showTimeEditDialog(getChildFragmentManager(),
                null, AlarmClockFragmentPreL.this, DateFormat.is24HourFormat(getActivity()));
    }

    @Override
    public void showTimeEditDialog(Alarm alarm) {
        AlarmUtils.showTimeEditDialog(getChildFragmentManager(),
            alarm, AlarmClockFragmentPreL.this, DateFormat.is24HourFormat(getActivity()));
    }
}
+0 −65
Original line number Diff line number Diff line
@@ -16,19 +16,12 @@

package com.android.deskclock;

import android.annotation.TargetApi;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.app.TimePickerDialog;
import android.content.Context;
import android.os.Build;
import android.support.annotation.VisibleForTesting;
import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.widget.Toast;

import com.android.deskclock.provider.Alarm;
import com.android.deskclock.provider.AlarmInstance;

import java.util.Calendar;
@@ -38,7 +31,6 @@ import java.util.Locale;
 * Static utility methods for Alarms.
 */
public class AlarmUtils {
    public static final String FRAG_TAG_TIME_PICKER = "time_dialog";

    public static String getFormattedTime(Context context, Calendar time) {
        final String skeleton = DateFormat.is24HourFormat(context) ? "EHm" : "Ehma";
@@ -54,63 +46,6 @@ public class AlarmUtils {
                : alarmTimeStr + " - " + instance.mLabel;
    }

    // show time picker dialog for pre-L devices
    public static void showTimeEditDialog(FragmentManager manager, final Alarm alarm,
          com.android.datetimepicker.time.TimePickerDialog.OnTimeSetListener listener,
          boolean is24HourMode) {

        final int hour, minutes;
        if (alarm == null) {
            hour = 0;
            minutes = 0;
        } else {
            hour = alarm.hour;
            minutes = alarm.minutes;
        }
        com.android.datetimepicker.time.TimePickerDialog dialog =
                com.android.datetimepicker.time.TimePickerDialog.newInstance(listener,
                    hour, minutes, is24HourMode);
        dialog.setThemeDark(true);

        // Make sure the dialog isn't already added.
        manager.executePendingTransactions();
        final FragmentTransaction ft = manager.beginTransaction();
        final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER);
        if (prev != null) {
            ft.remove(prev);
        }
        ft.commit();

        if (!dialog.isAdded()) {
            dialog.show(manager, FRAG_TAG_TIME_PICKER);
        }
    }

    /**
     * Show the time picker dialog for post-L devices.
     * This is called from AlarmClockFragment to set alarm.
     * @param fragment The calling fragment (which is also a onTimeSetListener),
     *                 we use it as the target fragment of the TimePickerFragment, so later the
     *                 latter can retrieve it and set it as its onTimeSetListener when the fragment
     *                 is recreated.
     * @param alarm The clicked alarm, it can be null if user was clicking the fab instead.
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public static void showTimeEditDialog(Fragment fragment, final Alarm alarm) {
        final FragmentManager manager = fragment.getFragmentManager();
        final FragmentTransaction ft = manager.beginTransaction();
        final Fragment prev = manager.findFragmentByTag(FRAG_TAG_TIME_PICKER);
        if (prev != null) {
            ft.remove(prev);
        }
        ft.commit();
        final TimePickerFragment timePickerFragment = new TimePickerFragment();
        timePickerFragment.setTargetFragment(fragment, 0);
        timePickerFragment.setOnTimeSetListener((TimePickerDialog.OnTimeSetListener) fragment);
        timePickerFragment.setAlarm(alarm);
        timePickerFragment.show(manager, FRAG_TAG_TIME_PICKER);
    }

    /**
     * format "Alarm set for 2 days, 7 hours, and 53 minutes from now."
     */
+1 −5
Original line number Diff line number Diff line
@@ -168,11 +168,7 @@ public class DeskClock extends BaseActivity

            alarmTab.setIcon(R.drawable.ic_tab_alarm);
            alarmTab.setContentDescription(R.string.menu_alarm);
            mTabsAdapter.addTab(alarmTab,
                    Utils.isLOrLater()
                            ? AlarmClockFragmentPostL.class
                            : AlarmClockFragmentPreL.class,
                    ALARM_TAB_INDEX);
            mTabsAdapter.addTab(alarmTab, AlarmClockFragment.class, ALARM_TAB_INDEX);

            final Tab clockTab = mActionBar.newTab();
            clockTab.setIcon(R.drawable.ic_tab_clock);
Loading