13b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount/*
23b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * Copyright (C) 2015 The Android Open Source Project
33b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount *
43b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
53b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * you may not use this file except in compliance with the License.
63b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * You may obtain a copy of the License at
73b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount *
83b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
93b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount *
103b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * Unless required by applicable law or agreed to in writing, software
113b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
123b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * See the License for the specific language governing permissions and
143b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount * limitations under the License.
153b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount */
163b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountpackage android.databinding.adapters;
173b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount
183b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.databinding.BindingAdapter;
193b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.databinding.InverseBindingListener;
203b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.databinding.InverseBindingMethod;
213b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.databinding.InverseBindingMethods;
223b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.widget.DatePicker;
233b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport android.widget.DatePicker.OnDateChangedListener;
243b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountimport com.android.databinding.library.baseAdapters.R;
253b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount
263b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount@InverseBindingMethods({
273b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        @InverseBindingMethod(type = DatePicker.class, attribute = "android:year"),
283b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        @InverseBindingMethod(type = DatePicker.class, attribute = "android:month"),
293b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        @InverseBindingMethod(type = DatePicker.class, attribute = "android:day", method = "getDayOfMonth"),
303b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount})
313b920788e90bb0abe615a5d5c899915f0014444bGeorge Mountpublic class DatePickerBindingAdapter {
323b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount    @BindingAdapter(value = {"android:year", "android:month", "android:day",
333b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            "android:onDateChanged", "android:yearAttrChanged",
343b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            "android:monthAttrChanged", "android:dayAttrChanged"}, requireAll = false)
353b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount    public static void setListeners(DatePicker view, int year, int month, int day,
363b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            final OnDateChangedListener listener, final InverseBindingListener yearChanged,
373b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            final InverseBindingListener monthChanged, final InverseBindingListener dayChanged) {
383b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        if (year == 0) {
393b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            year = view.getYear();
403b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        }
413b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        if (day == 0) {
423b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            day = view.getDayOfMonth();
433b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        }
443b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        if (yearChanged == null && monthChanged == null && dayChanged == null) {
453b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            view.init(year, month, day, listener);
463b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        } else {
473b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            DateChangedListener oldListener = ListenerUtil.getListener(view, R.id.onDateChanged);
483b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            if (oldListener == null) {
493b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                oldListener = new DateChangedListener();
503b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                ListenerUtil.trackListener(view, oldListener, R.id.onDateChanged);
513b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            }
523b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            oldListener.setListeners(listener, yearChanged, monthChanged, dayChanged);
533b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            view.init(year, month, day, oldListener);
543b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        }
553b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount    }
563b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount
573b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount    private static class DateChangedListener implements OnDateChangedListener {
583b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        OnDateChangedListener mListener;
593b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        InverseBindingListener mYearChanged;
603b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        InverseBindingListener mMonthChanged;
613b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        InverseBindingListener mDayChanged;
623b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount
633b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        public void setListeners(OnDateChangedListener listener, InverseBindingListener yearChanged,
643b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                InverseBindingListener monthChanged, InverseBindingListener dayChanged) {
653b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            mListener = listener;
663b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            mYearChanged = yearChanged;
673b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            mMonthChanged = monthChanged;
683b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            mDayChanged = dayChanged;
693b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        }
703b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount
713b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        @Override
723b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
733b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            if (mListener != null) {
743b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                mListener.onDateChanged(view, year, monthOfYear, dayOfMonth);
753b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            }
763b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            if (mYearChanged != null) {
773b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                mYearChanged.onChange();
783b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            }
793b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            if (mMonthChanged != null) {
803b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                mMonthChanged.onChange();
813b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            }
823b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            if (mDayChanged != null) {
833b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount                mDayChanged.onChange();
843b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount            }
853b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount        }
863b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount    }
873b920788e90bb0abe615a5d5c899915f0014444bGeorge Mount}
88