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